我尝试创建一个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代码?此外,如果有人有任何有用的见解,我很乐意听到它。哦,如果你们需要更多代码,请告诉我,我会发布它。
答案 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
的方法