2015-01-13 23 views
1

我在某些http://www.imdb.com/list ...特定網址上執行內容腳本。 大部分時間都可以正常工作,但有時並非如此。然後我用F5重新加載頁面,並且大多數情況下它運行良好。 在活動頁面我聽onDOMContentLoadedexecuteScript的錯誤行爲:http://www.imdb.com/list上的「無法訪問chrome:// URL」

chrome.webNavigation.onDOMContentLoaded.addListener(listener, {'url': urlFilter}); 

監聽器掛好。

function listener(tab){ 
    t=tab; 
    chrome.tabs.executeScript(tab.id, {file: 'elementoWeb 2.1.js'}, function(resultado){ 
     if(chrome.runtime.lastError) 
      console.log('Ejecutando elementoWeb.js, chrome.runtime.lasterror: ', chrome.runtime.lastError, '\nTab: ', t); 
    }); 
    chrome.tabs.executeScript(tab.id, {file: 'imdbListaCs.js'} , function(resultado){ 
     if(chrome.runtime.lastError) 
      console.log('Ejecutando imdbListaCs.js, chrome.runtime.lasterror: ', chrome.runtime.lastError, '\nTab: ', t); 
    }); 
} 

當出現故障時,有兩個控制檯的日誌這樣的,每一個執行嘗試:

Ejecutando elementoWeb.js, chrome.runtime.lasterror: Object {message: "Cannot access a chrome:// URL"} 
Tab: Object {frameId: 0, processId: 320, tabId: 405, timeStamp: 1421159075402.253, url: "http://www.imdb.com/list/......"} 
frameId: 0 
processId: 320 
tabId: 405 
timeStamp: 1421159075402.253 
url: "http://www.imdb.com/list/......" 
__proto__: Object 

(我縮短IMDB的網址)

突出部405是一個與IMDB .com頁面。不是Chrome://網址。

有時,錯誤消息不同:

Cannot access contents of url "chrome-devtools://devtools/bundled/devtools.html?&dockSide=undocked&toolbarColor=rgba(223,223,223,1)&textColor=rgba(0,0,0,1)". Extension manifest must request permission to access this host. 

我沒有做任何devtools'實驗激活。

任何人有相同的奇怪問題?

+0

有什麼'urlFilter'? – Xan

+0

您是否檢查過後臺頁面控制檯中的任何錯誤? – ganesh

回答

3

chrome.webNavigation.onDOMContentLoaded事件沒有得到Tab object,而是一個包含有關導航信息的對象。查看documentation of the event listener's callback function(或查看打印到控制檯的對象!),它顯示標籤的ID在tabId屬性中提供。

在您的代碼中,您讀取參數的一個不存在的屬性(因此undefined)並將其傳遞給chrome.tabs.executeScript。由於選項卡ID缺失,executeScript默認爲當前窗口的活動選項卡。當您在不同的窗口或選項卡上觸發導航時,內容腳本會插入到錯誤的選項卡中。如果您無權訪問該標籤(例如,因爲它是chrome://newtab),Chrome會拒絕執行該腳本。如果你正在查看一個devtools窗口,那麼你會得到一個有關該窗口的錯誤(儘管不再是starting Chrome 41)。

解決您的問題,改變你的函數

function listener(details) { // changed "tab" to "details" 
    chrome.tabs.executeScript(details.tabId, // (was "tab.id") 
+0

非常感謝!我不知道爲什麼它會發生這種錯誤,但現在我不在乎。實際上,繼續應用你的建議問題,但是這次我可以檢測到,有時用一個空參數調用監聽器,我不知道爲什麼,並且導致了錯誤。現在我從一開始就檢查它。 –