4

У меня есть расширение chrome, с 2 сценариями контента, введенными манифестом и одним фоновым скриптом.Динамическая загрузка скрипта содержимого (расширение chrome)

{ 
    "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, если используется общий.

Существует слишком много файлов, и логика сложнее, поэтому я не могу просто перечислить все пары (url, script) в директиве "content_scripts" (я также не хочу вводить все конкретные файлы в качестве сценария контента).

Я пытался что-то вроде этого в фоновом режиме (обратите внимание, что это только для демонстрации):

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 на 5-й строчке.

Может ли кто-нибудь помочь мне с этим? Это хороший способ «override` определение функции динамически, или я должен идти другим путем (какой из них, в то время).

Спасибо.

+0

«Непроверенный runtime.lastError во время работы tabs.executeScript: невозможно получить доступ к хром: // URL» => http://stackoverflow.com/questions/19042857/can-you-access-chrome-pages-from-an -extension – kol

ответ

4

Это означает, что, вероятно, что вы получаете в onUpdated событие на . страница с удлинителями/Внутренностей (?? всплывающее окно страницы параметров отдельных Dev инструментов)

Одним из вариантов является фильтрация по 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() 
    } 
}); 

Таким образом, вы знаете, что сценарий содержимого вводится и инициируется.

+1

в вызове 'chrome.tabs.executeScript', передайте' sender.tab.id' вместо 'tabId'. Я думаю, вы могли бы уйти и ничего не пропускать. – benmccallum

+0

@Xan, является ли 'chrome.tabs.executeScript' единственной функцией для добавления сценариев контента? Есть ли другое решение (ы)? – Pacerier

Смежные вопросы