Firefox 扩展:在加载之前访问 DOM
Firefox Extension: Access the DOM Before It's Loaded
我正在尝试创建一个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
- 从popup.js|Chrome扩展访问DOM
- React:是否可以访问DOM元素's道具
- Meteor - 从另一个模板事件处理程序访问 DOM 元素
- react-在不破坏封装的情况下访问DOM
- 通过访问DOM添加功能
- 如何通过知道节点的值来访问dom&&只要知道价值就可以得到手风琴的索引
- 动态加载页面后无法访问 dom 树
- 无法访问 DOM 元素
- 访问 DOM 树中的特定字段
- 为什么通过缓存变量访问 DOM 更快
- 如何在上一次 JQuery 调用后访问 DOM
- 如何在 React 应用程序中不可用的函数中访问 DOM 元素
- 通过jQuery访问DOM元素
- 浏览器化:从脚本访问 dom 元素
- 斯宾纳 - 访问 DOM
- 我们可以在不将其加载到无限可滚动网页中的情况下访问 DOM 元素吗?
- 从 JavaScript 访问 DOM 元素并向其发送事件
- Firefox 扩展:在加载之前访问 DOM
- d3.js 在就绪文档上访问 DOM
- 通过 ID 访问 DOM 元素