簡體   English   中英

動態加載內容腳本(chrome擴展名)

[英]Dynamic loading of content script (chrome extension)

我有一個chrome擴展,有一個由manifest和一個后台腳本注入的內容腳本。

{
    "manifest_version": 2,
    "name": "Test",
    "permissions": [
        "tabs", "<all_urls>", "activeTab", "storage" 
    ],

    "content_scripts": [
        {
            "matches": ["http://*/*", "https://*/*"],
            "js": [
                   "content/autofill/lib_generic.js",
                   "content/autofill/lib.js"],
            "run_at": "document_end"
        }
    ],

  "web_accessible_resources": [
        "content/specific_scripts/*"
    ],

    "background": {
        "scripts": ["background.js"],
        "persistent": false
    }

}

lib_generic.js包含一個名為apply_forms(...)函數(其描述並不重要)。 該函數從lib.js文件中調用。 但是這個過程不適用於幾個頁面,所以對於每個這樣的頁面,我有一個特殊的腳本 - 也只有一個名為apply_forms(...)函數。

我有一個函數,它將當前域作為輸入並返回所需特定腳本的名稱,如果應該使用泛型,則返回false

文件太多而且它的邏輯更復雜,所以我不能只在"content_scripts"指令中列出所有(url, script)對(我也不想將所有特定文件作為內容腳本注入)。

我在背景中嘗試過類似的東西(請注意,它僅用於演示):

var url = ""; //url of current tab

chrome.tabs.onUpdated.addListener(function(tabId, changeInfo, tab) {
    if(changeInfo.status == "complete") {
        var filename = getSpecificFilename(url);
        chrome.tabs.executeScript(tabId, {file: filename}, function() {
            //script injected
        });
    }
});

注意:getSpecificFilename(...)將始終返回一個名稱

但是Unchecked runtime.lastError while running tabs.executeScript: Cannot access a chrome:// URL我得到Unchecked runtime.lastError while running tabs.executeScript: Cannot access a chrome:// URL第5行Unchecked runtime.lastError while running tabs.executeScript: Cannot access a chrome:// URL

誰能幫我這個? 它是動態“覆蓋”函數定義的好方法,還是應該采用不同的方式(然后是哪一種)。

謝謝。

這可能意味着您在擴展/內部頁面上獲得了onUpdated事件(彈出窗口?選項頁面?分離開發工具?)。

一種選擇是按URL過濾:

chrome.tabs.onUpdated.addListener(function(tabId, changeInfo, tab) {
    if(changeInfo.status == "complete") {
        if(!tab.url.match(/^http/)) { return; } // Wrong scheme
        var filename = getSpecificFilename(url);
        chrome.tabs.executeScript(tabId, {file: filename}, function() {
            //script injected
        });
    }
});

另一個(可能更好)選項是讓您的內容腳本請求此注入:

// content script
chrome.runtime.sendMessage({injectSpecific : true}, function(response) {
  // Script injected, we can proceed
  if(response.done) { apply_forms(/*...*/); }
  else { /* error handling */ }
});

// background script
chrome.runtime.onMessage.addListener(function(message, sender, sendResponse) {
  if(message.injectSpecific){
    var filename = getSpecificFilename(sender.url);
    chrome.tabs.executeScript(sender.tab.id, {file: filename}, function() {
      sendResponse({ done: true });
    });
    return true; // Required for async sendResponse()
  }
});

這樣您就知道注入並啟動了內容腳本。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM