2012-05-06 109 views
1

由於擴展無法訪問unsafeWindow,如Firefox可以掛接到DOM腳本,我在尋找其他的想法,所以我來到SO求助!擴展:如何攔截AJAX響應?

如何使用一些代碼注入到DOM和發送到後臺頁面,調用內容腳本進行最後的處理之前,然後做一些初步的處理截取的響應。完成後,它會迴應具有修改後響應的背景或原始(取決於),並且後臺頁面將響應發送回DOM,以便將其處理到DOM腳本響應函數。
沒有與此正好一個問題,後臺頁面不能與DOM通信。

我做了一個小測試與注射一些代碼,在那裏我的東西輸出到控制檯和警報。結果並不好,因爲警報解僱了,但控制檯是空的 - 甚至沒有一個錯誤,這讓我想知道 - 什麼控制檯接收輸出?

function injectCode(fn){ // Executing an anonymous script 
    var script = document.createElement('script'); 
    script.type = 'application/javascript'; 
    script.textContent = '(' + fn + ')();'; 
    document.documentElement.appendChild(script); // run the script 
    document.documentElement.removeChild(script); // clean up 
    } 
var code = function(){ 
    console.log('dom',window); 
    alert('code injected'); 
} 
injectCode(code); 

我也試過addEventListener,與DOMAttrModifiedDOMSubtreeModifiedDOMNodeInserted,在不改變當DOM Ajax響應完全解析,但都以失敗告終火DOM元素。

上午我試圖做不可能的事,以任何方式?

回答

0

繼續之前,請確保您知道script contexts in an extension之間的差異。

注入從後臺頁面的腳本,你必須執行內容腳本,它在自己的回合內噴射在你的問題/ here提到的腳本。

實例(使用chrome.tabs.executeScript):

// null = current active tab 
// Simple code, background: 
chrome.tabs.executeScript(null, { 
    code: [ 
    'var s = document.createElement("script");', 
    's.textContent = "console.log(window);";', 
    '(document.head||document.documentElement).appendChild(s);', 
    's.parentNode.removeChild(s);' 
    ].join('\n') 
}); 

我可以想像,這種方法是不可行的對代碼的一個大的卡盤。對於一組預先定義的腳本,然後你可以使用兩個腳本:代碼本身,和一個腳本工具:

// config.js 
var fn_code = function() { 
    console.log(window); .... 
}; 
// helper.js 
var s = document.createElement('script'); 
s.textContent = '(' + fn_code + ')();'; 
(document.head||document.documentElement).appendChild(s); 
s.parentNode.removeChild(s); 

// Background: 
chrome.tabs.executeScript(null, {file: 'config.js'}, function() { 
    chrome.tabs.executeScript(null, {file: 'helper.js'}); 
}); 

注:我沒有直接鏈接到「config.js」,因爲複雜的使用時請使用manifest version 2,請參閱"web_accessible_resources"


上一個方法只顯示瞭如何在一個方向上執行代碼(背景 - >頁面)。如果需要從注入的腳本激活背景功能,則必須定義並監聽自定義事件處理程序。見this answer + demo


因爲代碼注入,從而運行在頁面的範圍,你必須在頁面確認控制檯。

chrome.tabs.executeScript未能執行內容腳本(例如,因爲該擴展沒有訪問某個頁面的權限),在後臺頁面的控制檯中會記錄一個錯誤。該控制檯可通過以下these steps進行訪問。

+0

我通過內容腳本注入代碼,並且確實有打開DOM頁面的控制檯。你能解釋這對我有什麼幫助嗎?如果我注入DOM腳本ajax響應函數的重寫函數,那麼它將從擴展中斷,我將不得不使用類似於http://code.google.com/chrome/extensions/content_scripts.html#host這種類型的頁面通信打破了攔截Ajax響應的目的。解析DOM似乎是更好的解決方案。 – Kim

+0

@Kim該帖子回答了有關控制檯的突出問題。你的問題使用了一個注入腳本(順便說一下,你沒有提及**腳本)。如果此答案與您的期望不符,請編輯該問題以更清楚。目前,您的問題的帖子甚至不符合標題。 –

+0

我認爲標題匹配得很好。您的答案更關注如何將代碼注入DOM,我知道您可以從我的問題中包含的代碼中看到代碼。我需要'hook'到DOM腳本ajax響應處理程序,同時仍然與我的擴展進行通信。你的答案不包括這一點。 – Kim