【问题标题】:xpcom/jetpack observe all document loadsxpcom/jetpack 观察所有文件加载
【发布时间】:2010-07-04 16:15:58
【问题描述】:

我编写了一个基于 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

【问题讨论】:

  • Mozilla 和 XPCOM 通常是非常小众的话题。通过访问 IRC 频道,您可能会更快地获得更多有用的答案(根据我的经验,这些人非常友好和乐于助人)
  • @kizzx2 你有那个 IRC 频道的地址吗?
  • irc.mozilla.org 上的#developers

标签: firefox-addon document observer-pattern xpcom firefox-addon-sdk


【解决方案1】:

@kizzx2 #jetpack 为您提供更好的服务

对于最初的问题:为什么不使用标签浏览器模块。像这样的:

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 模块)支持的方式如何做到这一点。

【讨论】:

  • 我没有尝试过,但我想我没有得到不是我以这种方式启动的页面加载。例如。大量的框架和弹出窗口。我需要观察所有负载。
  • 是的,这仅适用于新标签。
【解决方案2】:

从 Addon SDK 1.0 开始,正确的做法是使用 page-mod 模块。

(在后台它是使用document-element-inserted 观察者服务通知实现的,您可以在常规扩展中使用它,或者如果 page-mod 不适合您。)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-01-26
    • 1970-01-01
    • 2022-01-13
    • 2013-03-23
    • 1970-01-01
    • 1970-01-01
    • 2019-06-15
    相关资源
    最近更新 更多