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.
-- Андрей
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.