Доступ к каждому документу, который пользователь просматривает в данный момент из расширения - PullRequest
0 голосов
/ 04 июля 2011

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

Load: function()
{
var Listener = function(){ Fabogore.Start();};
var ListenerTab = window.gBrowser.selectedTab;
ListenerTab.addEventListener("load",Listener,true);
}
(...)
ListenerTab.removeEventListener("load", Listener, true);
Fabogore.Load();

Функция Fabogore.Load сначала инициализируется при открытии браузера. Это работает только после того, как я получу эти структуры данных, но не после. Но теоретически скрипт должен инициализировать нового слушателя, так что, возможно, это выбранная вкладка. Я также пытался слушать фокус событий.

Если у кого-то есть альтернативное решение, как получить доступ к странице, которую просматривает пользователь, я бы тоже чувствовал себя комфортно.

Ответы [ 2 ]

0 голосов
/ 07 июля 2011

Хорошо, я нашел способ, который работает из документации MDN, и добивается, чтобы каждый документ, открытый пользователем, мог быть доступен для вашего расширения. Доступ к каждому документу, на который фокусируется пользователь, слишком велик, я хочу, чтобы код выполнялся только один раз. Итак, я начинаю с инициализации Exentsion и слушаю DOMcontentloaded Event

window.addEventListener("load", function() { Fabogore.init(); }, false);


var Fabogore = {
init: function() {
var appcontent = document.getElementById("appcontent");   // browser
if(appcontent)
  appcontent.addEventListener("DOMContentLoaded", Fabogore.onPageLoad, true);
},

Этот код выполняется каждый раз при загрузке страницы. Теперь важно, чтобы вы выполняли свой код с новой загруженной страницы, а не со старой. Вы можете получить доступ к этому с переменной aEvent:

onPageLoad: function(aEvent)
{
var doc = aEvent.originalTarget;//Document which initiated the event

С помощью переменной "doc" вы можете проверять структуры данных с помощью XPCNativeWrapper и т. Д. Спасибо Владимиру за то, что он направил меня в правильном направлении, я полагаю, если вам нужно более сложное прослушивание событий, выберите его способ с обработчиками прогресса.

0 голосов
/ 05 июля 2011

Обычный подход - использование обработчика прогресса . Если я правильно понимаю, вы хотите получать уведомления всякий раз, когда вкладка браузера завершает загрузку. Таким образом, важным методом в вашем слушателе прогресса будет onStateChange (однако он должен иметь и все остальные методы):

onStateChange: function(aWebProgress, aRequest, aFlag, aStatus)
{
  if ((aFlag & Components.interfaces.nsIWebProgressListener.STATE_STOP) &&
      (aFlag & Components.interfaces.nsIWebProgressListener.STATE_IS_WINDOW) &&
      aWebProgress.DOMWindow == aWebProgress.DOMWindow.top)
  {
    // A window finished loading and it is the top-level frame in its tab
    Fabogore.Start(aWebProgress.DOMWindow);
  }
},
...