xpcom / jetpack наблюдает за всеми документами - PullRequest
1 голос
/ 04 июля 2010

Я пишу дополнение на основе Mozilla Jetpack, которое должно запускаться при загрузке документа. Для «верхнего уровня документов» это в основном работает с использованием этого кода (OserverService = require('observer-service')):

    this.endDocumentLoadCallback = function (subject, data) {
        console.log('loaded: '+subject.location);
        try {
            server.onEndDocumentLoad(subject);
        }
        catch (e) {
            console.error(formatTraceback(e));
        }
    };
    ObserverService.add("EndDocumentLoad", this.endDocumentLoadCallback);

Но обратный вызов не вызывается, когда пользователь открывает новую вкладку, используя средний щелчок или (что более важно!) Для фреймов. И даже эту тему я получил только через чтение источника другого расширения, а не через документацию.

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

Редактировать: Кажется, это делает то, что я хочу:

function callback (event) {
    // this is the content document of the loaded page.
    var doc = event.originalTarget;

    if (doc instanceof Ci.nsIDOMNSHTMLDocument) {
        // is this an inner frame?
        if (doc.defaultView.frameElement) {
            // Frame within a tab was loaded.
            console.log('!!! loaded frame:',doc.location.href);
        }
        else {
            console.log('!!! loaded top level document:',doc.location.href);
        }
    }
}

var wm = Cc["@mozilla.org/appshell/window-mediator;1"].getService(Ci.nsIWindowMediator);
var mainWindow = wm.getMostRecentWindow("navigator:browser");
mainWindow.gBrowser.addEventListener("load", callback, true);

Получил частично отсюда: https://developer.mozilla.org/en/XUL_School/Intercepting_Page_Loads

Ответы [ 2 ]

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

Начиная с Addon SDK 1.0, правильный способ сделать это - использовать модуль page-mod .

(Под капотом это реализовано с помощью уведомления о вставке элемента документа , вы можете использовать его в обычном расширении или, если page-mod вам не подходит.)

0 голосов
/ 23 июля 2010

@ kizzx2 вам лучше обслужить # jetpack

На первоначальный вопрос: почему бы вам не использовать модуль tab-browser.Примерно так:

var browser = require("tab-browser");

exports.main = function main(options, callbacks) {
initialize(function (config) {
    browser.whenContentLoaded(
        function(window) {
           // something to do with the window
           // e.g., if (window.locations.href === "something")
        }
    );
});

Намного чище, чем то, что вы делаете, ИМХО и (пока у нас не будет официального модуля pageMods) поддерживаемый способ, как это сделать.

...