0

我想创建铬扩展到开发工具,我想拦截当前网页的JS代码,然后编译或由浏览器执行, 其实我想仪器JS代码在浏览器中运行之前。我如何拦截JS代码之前执行铬

任何人都可以帮助我们,这有可能吗?

很多预先感谢。

+1

在Chrome浏览器开发工具扩展我怎么可以拦截脚本,它们是由浏览器加载之前。 因此,我可以运行仪器化的代码而不是原始的 –

+0

这是一个非常广泛的话题,问题的形式是“我想要X,帮助我们完成整个事情”。你应该展示你已经研究/尝试过的东西,并试图缩小这个问题的范围。请参阅[如何提问](https://stackoverflow.com/help/how-to-ask)指南。 – Xan

+0

是的,你是对的,实际上我并没有要求解决我的问题,只是需要一些建议,我应该研究哪个方向来实现我的目标。谢谢 –

回答

0

没有办法挂载到加载进程本身,但是具有未知类型的脚本不会作为脚本处理,这与具有自定义类型的脚本不执行的事实相结合是以下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>" 
    ] 
} 

Example

+0

这是一个可行的想法,但请注意,XHR会丢失原始请求的某些属性,可能会破坏某些网站(例如Referrer)。 – Xan

+0

@Xan true,另一种方法是让文档继续加载,但是写一个开放式的'