Xpoint
   [напомнить пароль]

nsIURIContentListener - только через XPCOM?

Метки: [без меток]
2008-05-11 16:11:05 [обр] Дмитрий[досье]

Здравствуйте,

написал extension к FireFox, хочу перехватывать начало загрузки страницы - пишу (внутри extension'а) имплементацию nsIURIContentListener:

var custom_uri_listener = {

   QueryInterface: function(aIID)
   {
      if(aIID.equals(Components.interfaces.nsISupports) ||
         aIID.equals(Components.interfaces.nsISupportsWeakReference) ||
         aIID.equals(Components.interfaces.nsIURIContentListener))
      {
         var aConsoleService = Components.classes["@mozilla.org/consoleservice;1"].getService(Components.interfaces.nsIConsoleService);
         aConsoleService.logStringMessage("QueryInterface");

         return this;
      }

      throw Components.results.NS_NOINTERFACE;
   },

   GetWeakReference: function()
   {
        throw Components.results.NS_ERROR_NOT_IMPLEMENTED;
   },

   canHandleContent: function(/*char* */ contentType, /*function*/ isContentPreferred, /*out char* */ desiredContentType)
   {
      //return false;//(contentType.indexOf("html") != -1);
      throw Components.results.NS_ERROR_NOT_IMPLEMENTED;
   },

   doContent: function(/*char* */ contentType, /*function*/ isContentPreferred, /*nsIRequest*/ request, /*out nsIStreamListener*/ contentHandler)
   {
      //return false;
      throw Components.results.NS_ERROR_NOT_IMPLEMENTED;
   },

   isPreferred: function(/*char* */ contentType, /*out char* */ desiredContentType)
   {
      var aConsoleService = Components.classes["@mozilla.org/consoleservice;1"].getService(Components.interfaces.nsIConsoleService);
      aConsoleService.logStringMessage(contentType);
      
      return true;//(contentType.indexOf("html") != -1);
   },

   onStartURIOpen: function(/*nsIURI*/ URI)
   {
      var aConsoleService = Components.classes["@mozilla.org/consoleservice;1"].getService(Components.interfaces.nsIConsoleService);
      aConsoleService.logStringMessage("onStartURIOpen");

      return false;
   }
};

Пытаюсь присобачить:

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 = custom_tab_uri_listener;

Итог (по сообщениям консоли): QueryInterface вызывается дважды, onStartURIOpen - ни разу.

Я что-то не так делаю? Или nsIURIContentListener будет работать только из XPCOM'а?

Заранее спасибо.

спустя 2 дня 23 часа [обр] Владимир Палант(434/4445)[досье]

Вообще-то для этой цели используют nsIWebProgressListener. Пример есть тут: http://brianary.blogspot.com/2......ng-nsiwebprogresslistener.html

Еще примечание: реализовывать функцию GetWeakReference не нужно. Достаточно разрешить QueryInterface(nsISupportsWeakReference), все остальное XPCOM сделает сам.

спустя 9 часов [обр] Дмитрий[досье]

Про nsIWebProgressListener я знаю, но мне так и не удалось настроить его так, как мне надо. А надо вот как: допустим у меня есть некая true/false переменная, установленная в false. Как только я её "включаю" - все текущие закачки страниц продолжаются (заканчиваются), а новые документы - нет. Я так понимаю, мне нужна некая комбинация ключей из:

Components.interfaces.nsIWebProgress.NOTIFY_STATE_DOCUMENT,
Components.interfaces.nsIWebProgressListener.STATE_START,

и т.д., верно?

К тому же, с помощью nsIURIContentListener я хотел перехватывать поступающие из сети данные. Ну бог с ним.

Powered by POEM™ Engine Copyright © 2002-2005