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

时间:2012-04-18 22:20:52

标签: javascript firefox dom firefox-addon

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

我首先尝试关注this answer,但我无法弄清楚如何让它工作并意识到我依赖于onDOMContentLoaded,它在Javascript之后加载已经执行了。

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

我最近一直试图制作extension through Firebug,但我似乎遇到了同样的问题......只有在解析/执行后才能访问Javascript。这是我写的resulting code。我想如果我可以在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代码?此外,如果有人有任何有用的见解,我很乐意听到它。哦,如果你们需要更多代码,请告诉我,我会发布它。

2 个答案:

答案 0 :(得分:2)

您可以在运行任何JavaScript代码之前通过收听content-document-global-created observer notification来访问新文档。但是,此时文档将为空,并且只要解析器添加<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 interface并在content-policy类别中注册(通过nsICategoryManager)。您的shouldLoad()函数将能够有选择地阻止脚本 - 但它只会调用外部脚本(意味着<script src="...">),而不是页面上的内联脚本。

3)使用JavaScript debugger service拦截脚本执行。您可以使用jsdIDebuggerService.interruptHook逐步执行JavaScript并随时中止脚本。但这当然会非常显着地减慢JavaScript的执行速度。至少应该使用jsdIDebuggerService.addFilter()将其限制为特定文档,否则会降低整个浏览器的速度(包括浏览器UI)。

答案 1 :(得分:2)

  

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

首先完全阻止文档被完全解析然后在侧面,获取相同的文档,对此文档执行任何处理,然后在页面中注入生成的文档。以下是我目前只做https://stackoverflow.com/a/36097573/6085033

的方法