我想创建铬扩展到开发工具,我想拦截当前网页的JS代码,然后编译或由浏览器执行, 其实我想仪器JS代码在浏览器中运行之前。我如何拦截JS代码之前执行铬
任何人都可以帮助我们,这有可能吗?
很多预先感谢。
我想创建铬扩展到开发工具,我想拦截当前网页的JS代码,然后编译或由浏览器执行, 其实我想仪器JS代码在浏览器中运行之前。我如何拦截JS代码之前执行铬
任何人都可以帮助我们,这有可能吗?
很多预先感谢。
没有办法挂载到加载进程本身,但是具有未知类型的脚本不会作为脚本处理,这与具有自定义类型的脚本不执行的事实相结合是以下hack依赖的。
调用将停止加载文档,如果我们在文档的最顶端调用它,我们可以假设文档没有加载。
然后,我们可以创建一个XHR请求来获取文档的内容,并且执行一点搜索和替换,以便在将该修改写入文件。
window.stop();
var request = new XMLHttpRequest();
request.open('GET', location.href);
request.onload = function(event) {
var html = request.responseText
.replace(/type=\"text\/javascript\"/g, '')
.replace(/<script/g, '<script type="x-instrument/javascript"');
document.open();
document.write(html);
document.close();
};
request.send(null);
在这一点上,所有的脚本已经呈现惰性,基本顺序加载程序可能类似于以下内容:
setTimeout(function next(index) {
var script = document.scripts[index];
if (script == null) {
return setTimeout(callback, 0);
}
if (script.hasAttribute('src')) {
var request = new XMLHttpRequest();
request.open('GET', script.getAttribute('src'));
request.onload = function() {
var code = instrument(request.responseText);
eval(code);
setTimeout(next, 0, ++index);
};
request.send(null);
} else {
var code = instrument(script.textContent);
eval(code);
setTimeout(next, 0, ++index);
}
}, 0, 0);
有了这个,任何页面可以通过插入这个脚本到被仪器文档的开始。
您也可以将其作为内容脚本加载到Chrome扩展中,但请确保run_at
设置为document_start
。
{
"manifest_version": 2,
"name": "instrument",
"version": "0.0.0",
"content_scripts": [
{
"matches": ["<all_urls>"],
"js": ["instrument.js"],
"run_at": "document_start"
}
],
"web_accessible_resources": [
"instrument.js"
],
"permissions": [
"tabs", "<all_urls>"
]
}
这是一个可行的想法,但请注意,XHR会丢失原始请求的某些属性,可能会破坏某些网站(例如Referrer)。 – Xan
@Xan true,另一种方法是让文档继续加载,但是写一个开放式的''标签,而不是调用'window.stop',从而删除额外的XHR请求,但仍然呈现可以被操纵的惰性文档。 –
@CasperBeyer我是Chrome扩展的新手,你可以请我建议我应该在哪里放置库来测试代码,它是内容脚本还是背景的一部分? –
在Chrome浏览器开发工具扩展我怎么可以拦截脚本,它们是由浏览器加载之前。 因此,我可以运行仪器化的代码而不是原始的 –
这是一个非常广泛的话题,问题的形式是“我想要X,帮助我们完成整个事情”。你应该展示你已经研究/尝试过的东西,并试图缩小这个问题的范围。请参阅[如何提问](https://stackoverflow.com/help/how-to-ask)指南。 – Xan
是的,你是对的,实际上我并没有要求解决我的问题,只是需要一些建议,我应该研究哪个方向来实现我的目标。谢谢 –