2013-08-04 11 views
6

を与える:私の拡張機能であるHTMLページとタブを作成タブを作成し、その中にコンテンツスクリプトを挿入すると、私は次の操作を行う必要があり、私のChromeの拡張機能の背景ページでパーミッションエラー

  1. フォルダまたはバックグラウンドページによって動的に生成されます;
  2. 新しいタブが読み込まれたら、メッセージパッシングを使用するために、その中にコンテンツスクリプトを挿入します。
  3. スクリプトが挿入されたら、いくつかのデータで新しいタブにメッセージを送信します。

これは、常にエラーになり:
tabs.executeScript: "URLのコンテンツにアクセスできません"。拡張マニフェストは、このホストにアクセスするためのアクセス許可を要求する必要があります。
またはページまたはスクリプトが拡張フォルダ内の.htmlと.js専用ファイルに保存されている場合:
tabs.executeScript:URLの内容にアクセスできません "chrome-extension://ehdjfh.../page。 html "拡張マニフェストは、このホストにアクセスするためのアクセス許可を要求する必要があります。

chrome.tabs.executeScript()が実行され、コンテンツスクリプトの注入がブロックされているときにエラーが発生します。 (私はコード化されたhtmlのURLに文字列として直接渡される場合、切り捨てられるタブにいくつかの大きなデータを渡すために、この構造が必要です)

ここでは動作する拡張機能に動作をテストするために使用できるコードサンプルですちょうどペーストをコピーして、Chromeの拡張機能をロード:

background.jsを

chrome.browserAction.onClicked.addListener(function() { 
    var getSampleHTML = function() { 
     return 'javascript:\'<!doctype html><html>' + 
      '<head></head>' + 
      '<body>' + 
      '<p id="myId">page created...</p>' + 
      '</body>' + 
      '</html>\''; 
    }; 

    // create a new tab with an html page that resides in extension domain: 
    chrome.tabs.create({'url': getSampleHTML(), 'active': false}, function(tab){ 
     var getSampleScript = function() { 
      return 'chrome.extension.onRequest.addListener(' + 
       'function(request, sender, sendResponse) {' + 
        'if(request.action == "print_data" && sender.tab.id == ' + tab.id + '){' + 
         'var p = document.getElementById("myId");' + 
         'p += "<br>data received: " + request.data;' + 
        '}' + 
       '});' 
       'document.getElementById("myId").innerHTML += "<br>content-script loaded...";' 
     }; 
     // inject the content-script in the page created: 
     chrome.tabs.executeScript(tab.id, {code: getSampleScript()}, function(){ 
      // send the data to the content-script: 
      chrome.tabs.sendRequest(tab.id, {action: "print_data", 
              data: "some long data"}); 
     }); 
    }); 
}); 

manifest.jsonを

{ 
    "name": "ContentScript Injection Sample", 
    "description": "", 
    "version": "0.1", 
    "permissions": ["tabs"], 
    "background": { 
    "persistent": false, 
    "scripts": ["background.js"] 
    }, 
    "browser_action": { 
    "default_title": "open a new tab and inject contentscript" 
    }, 
    "manifest_version": 2 
} 
+1

エラーは何が間違っているかを正確に示します。ホストのアクセス許可を宣言する必要があります。[match patterns](https://developer.chrome.com/extensions/match_patterns.html)を参照してください。 –

+1

独自の拡張機能で異なるページ間でデータを共有したい場合は、単に 'chrome.extension.getViews'(https://developer.chrome.com/extensions/extension.html#method-getViews)を使うだけです。コンテンツスクリプトは、Webページにスクリプトを挿入するために使用されます(および使用のみ可能)。メッセージの受け渡しは、通常、Webページ、コンテンツスクリプトまたは*その他の拡張機能との通信に使用されます。 –

+0

@RobW実行時にローカルページに注入されるコンテンツスクリプトの実行を可能にするために、マニフェストのマッチパターンをどのように設定できるのだろうと思っていました(_ "chrome-extension:// */*" _ @ "content_scripts"の_ "matches_ _"プロパティで拡張マニフェストを設定することで、外部のhttp urlのように "permissions" _がエラーを出します_ _ "js" _スクリプトがないのでナンセンスでエラーも返すプログラムで注入する)** manifest.json **の変更で** background.js **コードを実行できないと思われる** – guari

答えて

5

これは私の間違いを指摘するための@RobWと@方觉のおかげです。(私のエラーはローカルWebページを通常のWebページとして新しい作成タブに開いたと考えることでした。例えばchrome.extension APIへのアクセス。ポップアップ):

background.js

chrome.browserAction.onClicked.addListener(function() { 
    // create a new tab with an html page that resides in extension domain: 
    chrome.tabs.create({'url': chrome.extension.getURL("page.html"), 
         'active': false}, function(tab){ 
     var selfTabId = tab.id; 
     chrome.tabs.onUpdated.addListener(function(tabId, changeInfo, tab) { 
      if (changeInfo.status == "complete" && tabId == selfTabId){ 
       // send the data to the page's script: 
       var tabs = chrome.extension.getViews({type: "tab"}); 
       tabs[0].doSomething("some long data"); 
      } 
     }); 
    }); 
}); 

page.html

<!doctype html> 
<html> 
    <head> 
    </head> 
    <body> 
     <p id="myId">page created...</p> 
     <script src="page.js" type="text/javascript"></script> 
    </body> 
</html> 

page.js

var alreadyRun = false; 
function doSomething(data){ 
    if (!alreadyRun) { 
     var p = document.getElementById("myId"); 
     p.innerHTML += "<br>data received: " + data; 
     // needed because opening eg. DevTools to inpect the page 
     // will trigger both the "complete" state and the tabId conditions 
     // in background.js: 
     alreadyRun = true; 
    } 
} 
document.getElementById("myId").innerHTML += "<br>script loaded..."; 

何Iドンこのソリューションの多くが好きなのは、作成されたタブが完全にロードされているかどうか、そしてタブの状態の変更がトリガーされたかどうかをチェックするのに、chrome.tabs.onUpdated.addListener()を使用することです(無駄です...関心のあるタブのチェックのみを実行してください)

関連する問題