Страницы: 1
Всем привет!
В очередной раз при переносе кода из IE в Firefox возникают вопросы
На данный момент не понятно, как получить статус документа (не событие, а так, как делается в IE - window.document.readyState ).
Нашел вот это - https://developer.mozilla.org/en/nsISessionStore
Но не очень понятно, где найти этот интерфейс (в XUL-Runner 1.9 такого header-файла нет). И сработает ли?..
В общем, прошу помощи
СУВ, Kuvaldis
Отсутствует
Но не очень понятно, где найти этот интерфейс (в XUL-Runner 1.9 такого header-файла нет).
nsISessionStore Этот интерфейс является не окончательным (unfrozen - не замороженный). Поэтому в SDK не создан *.h (nsISessionStore.h ) фаил. Его можно собрать из фаила *.idl (nsISessionStore.idl).
Для создания nsISessionStore.h используется програмка (sdk/bin/XPIDL.exe).
Что то вроде этого:
<путь до sdk/bin>/XPIDL.exe -m header -L"<путь до sdk/idl>" "<путь до nsISessionStore.idl>/nsISessionStore.idl"
В результате будет создан В ТЕКУЩЕЙ ДИРЕКТОРИИ header фаил (nsISessionStore.h)
Но есть вероятность, что этот интерфейс изменится в следующих версиях, и тогда ...
Отсутствует
lemax, попробовал я выкрутиться, но все равно остались проблемы.
Т.к. я скачал Gecko 1.9, то по ссылке http://mxr.mozilla.org/mozilla1.9.1/source/browser/components/sessionstore/src/nsSessionStore.js взял idl-файл нужного мне интерфейса. Сгенерил хедер, в коде использовал следующую конструкцию
nsCOMPtr<nsISessionStore> sessionStore = do_GetService("@mozilla.org/browser/sessionstore;1");
Т.е. обычное создание объекта сервиса.
Но в sessionStore возвращался ноль. Поэтому попробовал следующее
bool CToolBandObj::IsDocumentLoaded(nsIDOMWindow *domWindow) { static const nsEmbedString WindowStateLoaded(L""); bool result = false; nsCOMPtr<nsISupports> rawSessionStore = do_GetService("@mozilla.org/browser/sessionstore;1"); if (rawSessionStore != NULL) { nsresult retval; nsCOMPtr<nsISessionStore> sessionStore = do_QueryInterface(rawSessionStore, &retval); if (sessionStore != NULL) { nsEmbedString windowStateStr; retval = sessionStore->GetWindowState(domWindow, windowStateStr); std::wstring temp = nsEmbedStringToWstring(windowStateStr); result = ((windowStateStr == WindowStateLoaded) == PR_TRUE); } } return result; }
в retval возвращался код ошибки - No_INTERFACE. Это поставило меня в тупик. Полез разбираться. При помощи XPCOM Viewer убедился, что данный сервис вообще присутствует в Firefox. НО!!! Guid в Firefox и в сгенерированном файле оказались РАЗНЫЕ!!!
Заменил сгенерированный GUID на тот, который показал XPCOM Viewer.
///* starting interface: nsISessionStore */ //#define NS_ISESSIONSTORE_IID_STR "91f6d650-898d-11dd-ad8b-0800200c9a66" // //#define NS_ISESSIONSTORE_IID \ // {0x91f6d650, 0x898d, 0x11dd, \ // { 0xad, 0x8b, 0x08, 0x00, 0x20, 0x0c, 0x9a, 0x66 }} /* starting interface: nsISessionStore */ #define NS_ISESSIONSTORE_IID_STR "58d17e12-a80f-11dc-8314-0800200c9a66" #define NS_ISESSIONSTORE_IID \ {0x58d17e12, 0xa80f, 0x11dc, \ { 0x83, 0x14, 0x08, 0x00, 0x20, 0x0c, 0x9a, 0x66 }}
Теперь запрос интерфейса nsISessionStore проходит, но идет свал на вызове GetWindowState с кодом ошибки 80570021...
В общем, я в шоке. Где я не прав? Столько проблем из-за статуса...
СУВ, Kuvaldis
Отредактировано Kuvaldis (10-03-2009 14:28:02)
Отсутствует
Страницы: 1