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,另一種方法是讓文檔繼續加載,但是寫一個開放式的'