2

我正在尝试创建一个 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 代码?另外,如果有人有任何有用的见解,我很想听听。哦,如果你们都需要我提供更多代码,请告诉我,我会发布它。

4

2 回答 2

2

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

1) 使用以下命令禁用窗口的所有 JavaScript nsIDocShell.allowJavascript

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)。

于 2012-04-19T07:19:29.437 回答
2

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

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

于 2016-03-19T04:47:07.577 回答