2012-04-18 63 views
2

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

我刚开始尝试遵循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

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

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

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)的速度。

+0

嗯,不是我希望的答案,但仍然是一个坚实的答案。我现在正在尝试的路线是制作一个代理服务器,而且这似乎是在做伎俩,但我真的希望有一个更简单的方法来做到这一点。好吧。 – incutonez 2012-04-19 23:42:03

+0

@incutonez:好吧,如果你想拦截HTTP流量,[nsITraceableChannel](http://www.softwareishard.com/blog/firebug/nsitraceablechannel-intercept-http-traffic/)可能是一个更简单的解决方案。但是,您应该了解[bug 653533](https://bugzilla.mozilla.org/show_bug.cgi?id=653533)。 – 2012-04-20 05:26:36

2

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

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

+0

虽然这个链接可能回答这个问题,但[在这里包含答案的基本部分更好](http://meta.stackexchange.com/questions/8231/are-answers-that-just-contain-links-其他 - 真正的好答案/ 8259#8259),并提供参考链接。如果链接页面更改,则仅链接答案可能会失效。如果目标网站无法访问或永久离线,请始终引用重要链接中最相关的部分。 – Makyen 2016-03-19 06:03:32