Re[3]: Как сделать XPCOM расширение для FireFox?
От: Андрей Коростелев Голландия http://www.korostelev.net/
Дата: 03.02.07 19:34
Оценка: 3 (1)
Здравствуйте, semav1, Вы писали:

S>А как реализовывать методы nsIURIContentListener? И ещё надо как-то FireFox'у, чтобы он вызывал методы nsIURIContentListener?


S>Здесь написано: Implement the nsIURIContentListener interface(как?), and register(где?) it with the appropriate web browser object via the nsIWebBrowser::parentURIContentListener attribute.


Например, так
1. Создаешь файлы, необходимые для Firefox расширения структурированные как в xpi-инсталляторе.
К примеру, у тебя будет такая структура:
chrome.manifest
install.rdf
.\chrome\content\my_extension_overlay.js
 .\chrome\content\my_extension_overlay.xul

2. В my_extension_overlay.js реализуешь nsIURIContentListener
var myListener = 
{
    QueryInterface: function(iid)
    {
        if (iid.equals(Components.interfaces.nsIURIContentListener) ||
        iid.equals(Components.interfaces.nsISupportsWeakReference) ||
            iid.equals(Components.interfaces.nsISupports))
            return this;
        throw Components.results.NS_NOINTERFACE;
    },
    onStartURIOpen: function(aUri)
    {
       // тут ловишь URL
    },
    doContent: function(aContentType, aIsContentPreferred, aRequest, aContentHandler ) 
    {
           throw Components.results.NS_ERROR_NOT_IMPLEMENTED;
    },
    canHandleContent: function(aContentType, aIsContentPreferred, aDesiredContentType) 
    { 
           throw Components.results.NS_ERROR_NOT_IMPLEMENTED;
    },
    isPreferred: function(aContentType, aDesiredContentType) 
    {
         return true;
     },
     GetWeakReference : function() 
     {
        throw Components.results.NS_ERROR_NOT_IMPLEMENTED;
     }
}

var wnd = window.QueryInterface(Components.interfaces.nsIInterfaceRequestor)
                        .getInterface(Components.interfaces.nsIWebNavigation)
                        .QueryInterface(Components.interfaces.nsIDocShell)
                        .QueryInterface(Components.interfaces.nsIInterfaceRequestor)
            getInterface(Components.interfaces.nsIURIContentListener);
wnd.parentContentListener = myListener;

3. Регистрируешь свое расширение.
Для этого в папке %APPDATA%\Mozilla\Firefox\Profiles\extensions создаешь файл с таким же названием, как и id твоего расширения (id расширения хранится между тегами <em:id></em:id> файла install.rdf, например myextension@mycompany.com). Содержимым этого файла будет путь к твоему расширению.
После этого удаляешь файл extensions.cache из %APPDATA%\Mozilla\Firefox\Profiles\ и перезапускаешь Firefox.

Это — самый простой способ. Для более продвинутого и/или скрытого от посторонних глаз анализа введенного URL, придется делать XPCOM-объект и звать его из onStartURIOpen твоего ява-скрипта.

S>Сейчас у меня есть такой класс (делал как в примере WebLock):

[...]

Полагаю, что тебе надо реализовать интерфейс nsIObserver и зарегистрировать observer через сервис nsICategoryManager.
-- Андрей
Re: Как сделать XPCOM расширение для FireFox?
От: Константин Л.  
Дата: 01.02.07 17:47
Оценка: -1
Здравствуйте, Alexander111, Вы писали:

можно. см. Mozilla.org
Как сделать XPCOM расширение для FireFox?
От: Alexander111  
Дата: 01.02.07 17:05
Оценка:
Здравствуйте, друзья!

Объясните в двух словах, как сделать XPCOM расширение для FireFox, которое бы перехватывало навигацию браузера (есть там что-нибудь типа BeforeNavigate как в IE?). И ещё надо чтобы, при возникновении этого события, вылезал тулбар, на ктором бы отображалась разная информация.
Re: Как сделать XPCOM расширение для FireFox?
От: Андрей Коростелев Голландия http://www.korostelev.net/
Дата: 02.02.07 08:56
Оценка:
Здравствуйте, Alexander111, Вы писали:

A>Здравствуйте, друзья!


A>Объясните в двух словах, как сделать XPCOM расширение для FireFox, которое бы перехватывало навигацию браузера (есть там что-нибудь типа BeforeNavigate как в IE?). И ещё надо чтобы, при возникновении этого события, вылезал тулбар, на ктором бы отображалась разная информация.


На пальцах — тебе надо сделать XUL-extension и реализовать в нем интерфейс nsIURIContentListener и в частности его метод onStartURIOpen (смотри http://www.xulplanet.com/references/xpcomref/ifaces/nsIURIContentListener.html)
В простом случае можешь анализировать URL страницы в самом скрипте extension-а, для более солжного анализа придется делать свой XPCOM и звать его.
Про XPCOM почитай неплохой туториал Creating a C++ XPCOM component.
Также посмотри форумы Extension Development и mozilla.dev.embedding
-- Андрей
Re[2]: Как сделать XPCOM расширение для FireFox?
От: Аноним  
Дата: 02.02.07 09:26
Оценка:
Спасибо. А можно ли из другой программы как-нибудь проверить, установлено ли моё расширение в FireFox'е и включено ли оно?
Re[3]: Как сделать XPCOM расширение для FireFox?
От: Андрей Коростелев Голландия http://www.korostelev.net/
Дата: 02.02.07 09:42
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Спасибо. А можно ли из другой программы как-нибудь проверить, установлено ли моё расширение в FireFox'е и включено ли оно?


Да. В WinXP, например, смотри %APPDATA%\Mozilla\Firefox\Profiles\<Profile name>. Файл extensions.ini и папка extensions.
<Profile name> берется из %APPDATA%\Mozilla\profiles.ini
Подробнее смотри здесь здесь
-- Андрей
Re[2]: Как сделать XPCOM расширение для FireFox?
От: semav1 Россия  
Дата: 02.02.07 11:06
Оценка:
А как реализовывать методы nsIURIContentListener? И ещё надо как-то FireFox'у, чтобы он вызывал методы nsIURIContentListener?

Здесь написано: Implement the nsIURIContentListener interface(как?), and register(где?) it with the appropriate web browser object via the nsIWebBrowser::parentURIContentListener attribute.


Сейчас у меня есть такой класс (делал как в примере WebLock):


class CNSffext : public nsIURIContentListener
{
public:
    CNSffext();
    virtual ~CNSffext();
    NS_DECL_ISUPPORTS
    NS_DECL_NSIURICONTENTLISTENER
};


Все методы nsIURIContentListener и функции CNSffextRegistration\CNSffextUnregistration просто возвращают NS_ERROR_NOT_IMPLEMENTED.
Re[4]: Как сделать XPCOM расширение для FireFox?
От: semav1 Россия  
Дата: 05.02.07 16:21
Оценка:
Вообще-то, я бы хотел обойтись без JavaScript — только XPCOM. Мой компонет уже почти заработал, но я не знаю как получить интефейс nsIWebBrowser. Наверное, до него надо добираться через несколько интерфейсов.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.