2016-12-09 28 views
0

最近Chromeをバージョン55.0.2883.75に更新しました。 自分で開発したChromeプラグインを使用してHTMLファイルを解析しています。ここでchrome.tabs.executescriptを使用して背景HTMLページからデータを取得しています。 chrome.extension.onRequestを実行すると、バックグラウンドページの解析データがグローバル変数に保存され、chrome.tabs.executescriptのコールバック関数にアクセスして処理します。Chromeバージョン55のchrome.tabs.executescriptのグローバル変数にアクセスできません

バージョン55.0.2883.75にアップデートするまでこれは正常に機能していました。 新しいバージョンのグローバル変数にはどうすればアクセスできますか?

以下

マイコード:

ステップ1:

chrome.extension.onRequest.addListener(
    function (request, sender, sendResponse) { 
     parser = new DOMParser(); 
     htmlDoc = parser.parseFromString(request.content, "text/html"); 

     //outputJson is a global variable which is Populated here 
     outputJson = parseMyPage(outputJson, htmlDoc); 


    }); 

ステップ2:

chrome.tabs.getSelected(null, function (tab) { 
    // Now inject a script onto the page 
    chrome.tabs.executeScript(tab.id,{ 
     code: "chrome.extension.sendRequest({content: document.body.innerHTML}, function(response) { console.log('success'); });" 
    }, function() { 

     //my code to access global variables 
if (outputJson && null != outputJson) { 
    // other stuff 
} 

    }); 
}); 
+0

エクステンションを読み込んで実行するときに[*あなたのエクステンションのさまざまな適切なコンソール](http://stackoverflow.com/a/38920982/3773011)に表示されるものは何ですか? – Makyen

+0

* manifest.json *を使用すると助かります。テストするためにマニフェストを作成する必要はありません。 – Makyen

+0

話題になる質問を編集してください:問題を再現する*完全** [mcve]を含めてください*。 *マニフェストを含む。json *、背景/コンテンツ/ポップアップスクリプト/ HTMLの一部。デバッグの助けを求める質問(「**なぜこのコードは動作しないのですか?**」)には、以下が含まれていなければなりません:►必要な動作、►特定の問題またはエラー*、および►問題を再現するのに必要な最短コード自体**。明確な問題文がない質問は、他の読者にとって有用ではありません。参照してください: "**どのように[mcve] **を作成するか"、[ここで私はどんな話題を聞くことができますか?](http://stackoverflow.com/help/on-topic)、[ask] – Makyen

答えて

1

あなたのコードが設計された方法、あなたは順番に2つの非同期ブロックに依存していますextension.onRequest イベントとコールバック​​が実行されます。あなたのコードでは、​​コールバックが実行される前にextension.onRequest イベントが発生する必要があります。これが起こる順序であるという保証はありません。これがリリースされた拡張機能の場合、ユーザーの構成によっては、これが失敗している可能性があります。また、ChromeのコードがChrome 55以前では、必要な順序でイベントとコールバックが常に発生する可能性があります。

解決策は、これらの非同期コードブロックの実行に特定の順序を必要としないようにこれを書き直すことです。幸いにも、それを行い、同時に複雑さを減らす方法があります。

メッセージを明示的に渡すことなく、コンテンツスクリプトからの情報をバックグラウンドスクリプトにtabs.executeScript()のコールバックに直接転送することができます。実行されたスクリプトの値は、スクリプトが挿入されたフレームごとに1つのエントリを含む配列のコールバックに渡されます。これは、コンテンツスクリプトから​​コールバックにデータを渡すのに非常に便利です。明らかに、この方法でフレームごとに1つの値しか戻すことはできません。

次のコードは、あなたが望むようにする必要があります。私はこの質問と私のanswer hereのあなたのコードからこのコードを編集しました。クローム33以降廃止されている

chrome.tabs.getSelected(null, function (tab) { 
    // Now inject a script onto the page 
    chrome.tabs.executeScript(tab.id,{ 
     code: "document.body.innerHTML;" 
    }, function (results) { 
     parser = new DOMParser(); 
     htmlDoc = parser.parseFromString(results[0], "text/html"); 
     //outputJson is a global variable which is Populated here 
     outputJson = parseMyPage(outputJson, htmlDoc); 
     //my code to access global variables 
     if (outputJson && null != outputJson) { 
      // other stuff 
     } 
    }); 
}); 

  1. extension.sendRequest()extension.onRequest:その答えのコードが完全にテストされている間、私はこの答えの中にこれを編集した事実は多少の誤差がでこっそりしていることを意味しあなたはruntime.sendmessage()runtime.onMessageで置き換えてください。
+0

このソリューションはMakyenを動作させます!私は、すべてのコードがchrome.tabs.executeScript()のコールバックで処理されるため、extension.sendRequest()およびextension.onRequest()は必要ないと思います。私は正しいですか? – Ricks

+0

@Ricks:はい、正しいです。コンテンツスクリプトから必要なものが 'tabs.executeScript()'のコールバックに返された場合、他のタイプの通信は必要ありません。 – Makyen

関連する問題