Всем привет!
В очередной раз при переносе кода из 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)

Но есть вероятность, что этот интерфейс изменится в следующих версиях, и тогда ... :sick:

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

Вопрос решен, много есть несколько вариантов Gecko 1.9.:)