2

我正在使用基於Chrome的Firefox的新webExtensions框架編寫webextension。所有示例擴展都在Nightly構建中工作,所以這就是我正在測試的地方。我想要做的是在加載時在內容頁面上運行腳本。這裏是我的background.js頁:爲什麼Firefox不允許您在主框架中執行腳本?

background.js

"use strict"; 

function onCompletedFunc(details) { 
    var script = 'console.log("ok");'; 
    console.log("Details are %o", details); 
    chrome.tabs.executeScript(details['tabId'], { 
     code: script, 
     runAt: 'document_end' 
    }); 
}; 
chrome.webRequest.onCompleted.addListener(onCompletedFunc, 
            {'urls': ['<all_urls>']}, 
            ['responseHeaders']); 
//Does not work: 
/* 
chrome.webRequest.onCompleted.addListener(onCompletedFunc, 
            {'urls': ['<all_urls>'], 'types':["main_frame"]}, 
            ['responseHeaders']); 
*/ 

這個工作在夜間。我在內容頁面的控制檯上獲取了背景頁面的詳細信息列表(「詳細信息是...」),以及幾行「ok」,其中每個資源都加載了它。它在Chrome中運行相同(清單文件略有不同)。

我想要的是第二種變體,它只在頁面上運行一次。這在Chrome中正常工作。在Nightly中,它會顯示主框架中的一條「詳細信息」消息,但內容頁面上的控制檯不顯示任何內容。

我確定這是一個計時問題,但是這裏有什麼問題?


manifest.json的(刪除 「應用程序」:{...}對於Chrome的使用)

{ 

    "description": "", 
    "manifest_version": 2, 
    "name": "execute_script", 
    "version": "1.0", 

    "applications": { 
    "gecko": { 
     "id": "[email protected]", 
     "strict_min_version": "45.0" 
    } 
    }, 

    "permissions": [ 
    "webRequest", "webRequestBlocking", "<all_urls>" 
    ], 

    "background": { 
    "scripts": ["background.js"] 
    } 

} 
+0

也許現在還不支持。嘗試詢問Firefox WebExtensions論壇。 – wOxxOm

+0

@wOxxOm看起來像一個錯誤,我已經在https://bugzilla.mozilla.org/show_bug.cgi?id=1290016 –

回答

1

你的第一個片段(不types)只適用,因爲你不剛剛獲得main_frame的請求,但也是另一個子資源。如果你想注入一個腳本,webRequest.onCompleted不是正確的事件。不能保證選項卡中的頁面與您收到請求的頁面相匹配。

如果您想無條件地運行代碼,只需在manifest文件中聲明內容腳本即可。欲瞭解更多信息,請參閱content script documentation

如果編程注入是必須的,請使用chrome.webNavigation.onCommitted事件而不是webRequest事件。通過此事件,您知道該選項卡現在顯示對給定URL的響應。例如:

如果使用 webNavigation.onCommitted
chrome.webNavigation.onCommitted.addListener(function(details) { 
    // Example: Only run in main frame and URLs containing "example" 
    if (details.frameId === 0 && details.url.includes('example')) { 
     chrome.tabs.executeScript(details.tabId, { 
      code: 'console.log("Injected at " + document.URL);', 
      runAt: 'document_end' 
     }); 
    } 
}); 
// filter (the second parameter, not used above) is supported as of Firefox 50. 

事件,你必須考慮到的API是非阻塞的。有可能(但概率較低)發生以下情況:

  1. 用戶啓動請求。
  2. webNavigation.onCompleted火災。
  3. 您調用tabs.executeScript
  4. 同時該標籤導航到其他網站。
  5. tabs.executeScript請求到達選項卡,同時切換到另一個URL。
  6. 糟糕,您剛剛在與您打算的頁面不同的頁面中注入了腳本。

如果網址不匹配是不可取的,然後檢查document.URLlocation與內容腳本邏輯繼續之前的預期值。

+0

報告它感謝您的解釋。實際上,如果腳本在重定向後在頁面上執行,我認爲它很好,所以我沒有把它當作一個問題。我仍然不確定我是否明白爲什麼會導致腳本根本不執行,如果我將過濾器設置爲all_urls。 –

+0

@CaitlinRainone這是一個錯誤,請參閱我的問題鏈接(https://bugzilla.mozilla.org/show_bug.cgi?id=1290016)。 –

相關問題