4

Chrome 확장 프로그램이 있으며 매니페스트와 배경 스크립트로 삽입 된 2 개의 콘텐츠 스크립트가 있습니다.콘텐츠 스크립트 동적로드 (크롬 확장)

{ 
    "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.jsapply_forms(...)가 명명 한 함수를 포함하는 (그 설명은 중요하지 않다). 이 함수는 lib.js 파일에서 호출됩니다. 그러나이 절차는 여러 페이지에서 작동하지 않으므로 각각의 해당 페이지에 대해 특수 스크립트가 있습니다. apply_forms(...)이라는 단 하나의 함수도 있습니다.

나는 현재 도메인을 입력으로 사용하고 원하는 특정 스크립트의 이름을 반환하거나 generic을 사용해야하는 경우 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 5 라인에.

아무도 도와 줄 수 있습니까? 그것은이 "override` 함수 정의 동적으로 좋은 방법인가, 아니면 (다음 어느 하나) 다른 길을 가야한다. 당신이 onUpdated 이벤트에를 받고 있다는 것을

감사합니다.

+0

"tabs.executeScript를 실행하는 동안 unchecked runtime.lastError : chrome : // URL에 액세스 할 수 없습니다."=> http://stackoverflow.com/questions/19042857/can-you-access-chrome-pages-from-an 'chrome.tabs.executeScript' 호출에서 -extension – kol

답변

4

이것은 아마 의미 .

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 
     }); 
    } 
}); 

또 다른 (그리고 아마도 더 나은) 옵션은 콘텐츠 스크립트 요청을하는 것입니다 확장/내부 페이지 (??? 팝업 옵션 페이지 분리 된 개발 도구)

하나의 옵션은 URL을 기준으로 필터링하는 것입니다 이 주사 :

// 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

은'tabId' 대신에'sender.tab.id'를 전달합니다. 당신은 아마도 아무것도 지나치지 않을 수도 있다고 생각합니다. – benmccallum

+0

@Xan, 'chrome.tabs.executeScript'는 콘텐츠 스크립트를 추가하는 유일한 기능입니까? 다른 솔루션이 있습니까? – Pacerier