Firefox 扩展:在加载之前访问 DOM

Firefox Extension: Access the DOM Before It's Loaded

本文关键字:访问 DOM 加载 扩展 Firefox      更新时间:2023-09-26

我正在尝试创建一个Firefox扩展,该扩展在触发任何当前页面的Javascript之前触发我的Javascript代码。 我的Javascript代码基本上将控制页面的Javascript代码是否可以执行或拒绝。

首先尝试遵循这个答案,但我无法真正弄清楚如何让它工作,并意识到我依赖于 onDOMContentLoaded,它在 Javascript 已经执行后加载。

然后我把注意力转向XPCOM,但再次没有真正理解Firefox教程告诉我的内容。

我最近一直在尝试通过Firebug进行扩展,但我似乎遇到了同样的问题......只有在解析/执行Javascript之后才能访问它。 这是我编写的结果代码。 我想如果我可以在onExamineResponse事件中访问文件的对象,我的问题就可以解决,但我不知道该怎么做......我说的是这段代码:

BeepbopListener.prototype = {
    onRequest: function(context, file) {
       ...
    },
    onExamineResponse: function(context, file) {
        FBTrace.sysout("onexamineresponse " + file);  // this returns something like
        // '[xpconnect wrapped (nsISupports, nsIHttpChannel, nsIRequest, nsIUploadChannel, nsITraceableChannel, nsIHttpChannelInternal)]'
        // but I don't know how to access those elements...
        var pattern = /'.js$/;
        if (pattern.test(file.href) && FBTrace.DBG_BEEPBOP) {
          FBTrace.sysout("ONEXAMINE DOESN'T EVEN GET IN THIS IF SO YOU WON'T SEE THIS");
        }
    },
    ...
};

所以我的问题是...有没有教程告诉我如何在执行之前访问页面上的所有 Javascript 代码? 另外,如果有人有任何有用的见解,我很想听听。 哦,如果你们需要我提供更多代码,请告诉我,我会发布它。

您可以在任何 JavaScript 代码运行之前通过侦听content-document-global-created观察者通知来访问新文档。但是,此时文档将为空,一旦解析器添加<script>标签,JavaScript 代码就会运行 - 您无法真正阻止它。以下是我知道的控制脚本执行的选项。

1) 使用 nsIDocShell.allowJavascript 禁用窗口的所有 JavaScript

wnd.QueryInterface(Components.interfaces.nsIInterfaceRequestor)
   .getInterface(Components.interfaces.nsIWebNavigation)
   .QueryInterface(Components.interfaces.nsIDocShell)
   .allowJavascript = false;

这是一种全有或全无的方法。请注意,即使新文档加载到同一框架中,JavaScript 也会保持禁用状态。

2) 在 XPCOM 组件中实现 nsIContentPolicy 接口,并将其注册到content-policy类别中(通过 nsICategoryManager )。您的shouldLoad()函数将能够有选择地阻止脚本 - 但它只会调用外部脚本(意思是<script src="...">),而不是页面上的内联脚本。

3) 使用 JavaScript 调试器服务拦截脚本执行。您可以使用jsdIDebuggerService.interruptHook逐步执行 JavaScript 并随时中止脚本。但这当然会大大减慢 JavaScript 的执行速度。至少你应该使用jsdIDebuggerService.addFilter()来限制它的特定文档,否则你会减慢整个浏览器(包括浏览器UI)的速度。

我正在尝试创建一个Firefox扩展,在触发任何当前页面的Javascript之前触发我的Javascript代码。我的Javascript代码基本上将控制页面的Javascript代码是否可以执行或拒绝。

首先完全防止文档被完全解析,然后在旁边,获取同一文档,对此文档进行任何处理,然后将生成的文档注入页面。以下是我目前的做法 https://stackoverflow.com/a/36097573/6085033