2014-04-13 34 views
1

我想寫,做以下的擴展:如何通過擴展爲JavaScript代碼提供額外的功能?

  • 定義自定義函數
  • 允許JavaScript代碼加載從互聯網上運行

功能應該採取這樣的功能作爲事件監聽器的參數。基本上,像:

newApiFunctionDefinedInExtension(function(responseHeaders){ 
    console.log("Headers arrived!", responseHeaders); 
} ; 

然後使用chrome.webRequest,我的分機(這使得newApiFunctionDefinedInExtension首先可用)將調用監聽器(在本地加載頁面)每個響應頭從網絡接收時間。

我是Chrome擴展的新手,無法找到實現此目的的方法。這將是巨大知道:

  • 如何使一個模塊中定義可供加載頁面的範圍
  • 如何做出這樣的EventEmitter功能 - 有一個構造函數I類可以擴展?

我的目標很簡單:加載的頁面應該定義一個函數,而函數應該被稱爲每次有網絡連接的時間。

+0

鉻。webRequest文檔表明您可以聽取onHeadersReceived事件。這不是你要求的嗎? – adrichman

+0

請仔細閱讀我的問題。我想要一個可用於* general javascript世界的函數* – Merc

+0

__general javascript world__是什麼?它甚至不是一個可以谷歌的短語。你能否提供你描述的真實世界的用例?許多關於你的問題的解釋都沒有提供明確的說明 – adrichman

回答

2

每個webRequest事件都會接收有關請求的信息,包括始發選項卡的ID。

因此,假設標籤存在注1,您可以使用以下流程:

// background.js 
chrome.webRequest.onHeadersReceived.addListener(function(details) { 
    if (details.tabId == -1) 
     return; // Not related to any tab 
    chrome.tabs.sendMessage(details.tabId, { 
     responseHeaders: details.responseHeaders 
    }); 
}, { 
    urls: ['*://*/*'], // e.g. all http(s) URLs. See match patterns docs 
    // types: ['image'] // for example, defaults to **all** request types 
}, ['responseHeaders']); 

然後,在content scriptdeclared in the manifest file),你把郵件,並將其傳遞給網頁:

// contentscript.js 
chrome.runtime.onMessage.addListener(function(message) { 
    // Assuming that all messages from the background are meant for the page: 
    document.dispatchEvent(new CustomEvent('my-extension-event', { 
     detail: message 
    })); 
}); 

這樣做之後,你的網頁可以只接收這些事件如下:

document.addEventListener('my-extension-event', function(event) { 
    var message = event.detail; 
    if (message.responseHeaders) { 
     // Do something with response headers 
    } 
}); 

如果您想在上面放置抽象(例如,實現自定義EventEmitter),那麼你需要inject a script in the main execution environment,並在那裏聲明你的自定義API。

note 1。爲了簡單起見,我認爲該選項卡存在。實際上,對於type「main_frame」(和「sub_frame」),從來沒有這樣做,因爲該頁面尚未呈現。如果您想獲得頂級/框架文檔的響應標題,那麼您需要將響應標頭臨時存儲在背景頁面中的某些數據結構(例如隊列/字典)中,並且每當將數據發送到內容腳本時該腳本已準備就緒。
這可以通過在內容腳本中使用chrome.runtime.sendMessage到背景頁面使用send a message來實現。然後,無論何時加載頁面並且內容腳本準備就緒,後臺頁面都可以使用sendResponse來傳遞任何排隊的消息。

+0

這是我收到的最奇妙的答案之一。非常感謝。 – Merc

相關問題