我想創建鉻擴展到開發工具,我想攔截當前網頁的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
是的,你是對的,實際上我並沒有要求解決我的問題,只是需要一些建議,我應該研究哪個方向來實現我的目標。謝謝 –