2016-05-17 9 views
0

これはバグか、マニフェストファイルの設定ミスであるかわかりませんが、<all_urls>パーミッションがコンテンツスクリプトインジェクションでは機能していません。クロムの拒否<all_urls>コンテンツスクリプトのインジェクションの許可

{ 
    "manifest_version": 2, 
    "name": "Bug?", 
    "version": "1", 
    "description": "This seems to be a bug", 
    "minimum_chrome_version": "50", 
    "background": { 
    "scripts": ["background.js"], 
    "persistent": false 
    }, 
    "permissions": [ 
    "<all_urls>", 
    "tabs", 
    "webNavigation" 
    ] 
} 

background.js:

chrome.webNavigation.onBeforeNavigate.addListener(info => { 
    chrome.tabs.executeScript(info.tabId, { 
     frameId: info.frameId, 
     code: 'console.log("works")', 
     runAt: 'document_start' 
    },() => { 
     if(chrome.runtime.lastError) 
      console.error(chrome.runtime.lastError.message) 
    }) 
}) 

私の目標

私は私のコンテンツのスクリプトは、任意の前に実行したいここでエラー

manifest.jsonをの原因となる単純な例でありますhtmlはページ内のブラウザで処理され、のサブフレームはすべてです。私はマニフェストファイルに自分のコンテンツスクリプトを指定できることを知っています。しかし、これでは、ルートとサブフレームに異なるコンテンツスクリプトを実行することはできません。したがって、上記のコードは、私の最終的なコードがどのように見えるかの良いおもちゃの例です。実際

コンテンツのスクリプトをどうなり

は、フレームごとに、次のエラーで実行に失敗:?

Cannot access contents of url "<some url>". Extension manifest must request permission to access this host.

何... <all_urls>すべて URLを意味するものではありませんか?

どのように機能するのですか?

chrome.webNavigation.onBeforeNavigatechrome.webNavigation.onCommittedに変更した場合、注入は期待どおりに機能します(これは簡単に修正できるabout:blankページを除く)。ただし、これは、htmlが処理される前にコンテンツスクリプトが実行されることを保証するものではありません。

どのような考えですか?

+0

」は_all_ URLではなく、すべての_supported_ URLを意味します。失敗したURLの例を挙げることはできますか? – Xan

答えて

0

ここでタイミングの問題が発生しています。

あなたはonCommittedが起こる注入しようとした場合は、効果的に、それはまだ変更されていないことから、古い文書に注入しようとしています。

これは教育的な推測ですですが、古いURLのアクセス許可が評価されたときに競合が発生する可能性がありますが、注入が実際に行われてナビゲーションが有効になり、現在の原点が異なる場合があります。

webNavigation/tabsイベントに関しては、run_at: "document_start"の予定がありません。これは、マニフェスト(またはdeclarativeContent APIのまだ実験的なコンテンツスクリプトアクション)で指定した場合にのみ有効です。

今、あなたの問題のスピーキング:

これは、しかし、私はルートとサブフレームに異なるコンテンツスクリプトを実行することを選択したことはできません。

これはまったく真実ではありません。

if (window.parent != window) { 
    // Subframe 
} else { 
    // Main frame 
} 

だから、あなたは"document_start"スクリプトのマニフェストの注射に頼る必要があり、あなたは同期サブフレームごとに異なるロジックを実装することができます:あなたは、あなたのロジックdepending on your position in the iframe hierarchyを分岐することができます。

関連する問題