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

Изменение нового вхождения в History

Метки: [без меток]
2006-02-23 22:10:05 [обр] alc[досье]

Ткните, пожалуйста, куда смотреть. Получаю событие при создании нового вхождения в журнал

var hist = {
  sHistory:'',
  onLoad: function(event) {
    alert(gBrowser.webNavigation.sessionHistory);
    this.sHistory = gBrowser.webNavigation.sessionHistory;
    this.sHistory.addSHistoryListener(this);
  },

  QueryInterface: function(aIID)
  {
   if (aIID.equals(Components.interfaces.nsISHistoryListener) ||
       aIID.equals(Components.interfaces.nsISupports) || 
       aIID.equals(Components.interfaces.nsISupportsWeakReference))
     return this;
   throw Components.results.NS_NOINTERFACE;
  },

  OnHistoryNewEntry: function(newURI) {
    alert(newURI.spec);
  },
....
};

имею только что внесенный uri, а как в его изменить?

спустя 32 минуты [обр] Владимир Палант(434/4445)[досье]
Посмотрел http://lxr.mozilla.org/mozilla......ll/shistory/src/nsSHistory.cpp — вроде бы OnHistoryNewEntry вызывается до того, как добавляется новая запись. Соответственно, если присвоить новое значение newURI.spec, то этого должно быть достаточно. Или нет?
спустя 1 день [обр] alc[досье]
Действительно. Проглядел, спасибо.
спустя 1 день 17 часов [обр] alc[досье]
Что-то слушатель иногда не хочет нормально присоединяться (gBrowser.webNavigation.sessionHistory не определен)..
Тут обсуждали, но у меня не получается.
спустя 1 день 4 часа [обр] Данил Иванов(5/30)[досье]

Цитата с ссылки, приведённой вами:

If you are getting null or undefined then you need to set your timeout to greater than 50ms to give the tab a little more time to initialize.

Т.е. таб ещё не успел инициализироваться полностью, скорее всего; таймаут подойдёт?

спустя 15 часов [обр] alc[досье]
Метод таймаутов не работает для локальных файлов (при клике на файл из того же Проводника) при открытом Firefoxе. Неужели нет более надежного способа?
спустя 1 день 10 часов [обр] Данил Иванов(5/30)[досье]

Немного непонятен смысл "Метод таймаутов не работает для локальных файлов". Создание sessionHistory таба и срабатывание HistoryNewEntry "проскакивает" через эти 50ms или что?

Ну, да ладно. Я сейчас попробую ткнуть пальцем в небо:

/**
//~ Подсмотрено в fxsrc\toolkit\content\help\help.js:
  // Initialize history.
  getWebNavigation().sessionHistory = 
    Components.classes["@mozilla.org/browser/shistory;1"]
              .createInstance(Components.interfaces.nsISHistory);
**/

//~ Т.о.,
var webNav = gBrowser.webNavigation;
try {
  var sh = webNav.sessionHistory;
  if (!sh)
    webNav.sessionHistory = Components.classes["@mozilla.org/browser/shistory;1"]
                                      .createInstance(Components.interfaces.nsISHistory);
} catch (e) {}
спустя 20 часов [обр] alc[досье]
Сделал очень дубовый (перебором), но надежный способ:
const STATE_START = Components.interfaces.nsIWebProgressListener.STATE_START;
const STATE_STOP = Components.interfaces.nsIWebProgressListener.STATE_STOP;
var myLogger;
//History listener
function myHist() {
} 

myHist.prototype = {
  onLoad: function(event) {
  },

  onUnload: function(event) {
    this.sHistory.removeSHistoryListener(this);
  },

  QueryInterface: function(aIID)
  {
   if (aIID.equals(Components.interfaces.nsISHistoryListener) ||
       aIID.equals(Components.interfaces.nsISupports) || 
       aIID.equals(Components.interfaces.nsISupportsWeakReference))
     return this;
   throw Components.results.NS_NOINTERFACE;
  },

  OnHistoryNewEntry: function(newURI) {
      myLogger.logStringMessage('history: '+newURI.spec);
  },
  ...
};
//Progress Listener
var myListener =
{
  QueryInterface: function(aIID)
  {
   if (aIID.equals(Components.interfaces.nsIWebProgressListener) ||
       aIID.equals(Components.interfaces.nsISupportsWeakReference) ||
       aIID.equals(Components.interfaces.nsISupports))
     return this;
   throw Components.results.NS_NOINTERFACE;
  },


  onStateChange: function(aProgress, aRequest, aFlag, aStatus) {

   if(aFlag & STATE_START)
   {
      myLogger.logStringMessage('<--begin-->');
      if(gBrowser.selectedBrowser.contentWindow == aProgress.DOMWindow)
        browser = gBrowser.selectedBrowser;
      else {
        var browser = '';
        for (var i=0;i<gBrowser.browsers.length;i++){
          if(aProgress.DOMWindow == gBrowser.browsers[i].contentWindow){
            browser = gBrowser.browsers[i];
            break;
          }             
        }
      }
      if(browser && !browser.myHist) {
        browser.myHist = new myHist();
        browser.sessionHistory.addSHistoryListener( browser.myHist ); 
        myLogger.logStringMessage('Listener added!');
      }
   }

   if(aFlag & STATE_STOP) {
      myLogger.logStringMessage('<--end-->');
   }
    return 0;
  },
  ...
}

function init() {
  myLogger = Components.classes['@mozilla.org/consoleservice;1']
        .getService(Components.interfaces.nsIConsoleService);

  gBrowser.addProgressListener(myListener,
    Components.interfaces.nsIWebProgress.NOTIFY_STATE_DOCUMENT);
}

window.addEventListener("load", init, false);
спустя 22 часа [обр] Данил Иванов(5/30)[досье]
Просто из интереса вопрос: вариант с if (!sh) не подошёл по каким-то причинам или не пробовали?
спустя 5 часов [обр] alc[досье]
Попробовал, надеялся (по логике), что заработает, но что-то не захотел.
спустя 1 день 16 часов [обр] Данил Иванов(5/30)[досье]
Ясно, спасибо.
Powered by POEM™ Engine Copyright © 2002-2005