background から HTML を取得する
background から HTML を取得したい。
- タブ更新時
- URL に 'yahoo' を含む場合、pageAction アイコンを表示
- pageAction アイコンをクリック時
- Yahoo! トップページの HTML を取得したい(←ここ)
結論
やりかたは2通り:
- chrome.tabs.executeScript によりコード実行し、コールバックを実装する。
- background から content_scripts に chrome.runtime.sendMessage して、
content_scripts から background に sendResponse する。
いずれもコールバックを使う(非同期)。
説明: executeScript
こちらのほうがシンプル。
Manifest.json
"permissions": [ "tabs", "http://*/*", "https://*/*" ], "background": { "scripts": [ "background.js" ], "persistent": false }, "page_action": { "default_name": "PageAction", "default_icon": "icon19.png" }, "manifest_version": 2
background.js
chrome.tabs.onUpdated.addListener(function(tabId, changeInfo, tab) { if (tab.url.indexOf('yahoo') != -1) { chrome.pageAction.show(tabId); } }); chrome.pageAction.onClicked.addListener(function() { chrome.tabs.executeScript(null, { "code": "document.all[0].outerHTML" }, function(result) { console.log(result); }
chrome.tabs.executeScript によりスクリプトを実行する。
"code" に指定したスクリプトは return を省略できる。
つまり、"var x = 10; x" を指定すると、10 が返却される。
今回の場合では、Yahoo! トップページの HTML が return される。
説明: content_script
構成が複雑になる。
Manifest.json
"permissions": [ "tabs", "http://*/*", "https://*/*" ], "background": { "scripts": [ "background.js" ], "persistent": false }, "content_scripts": [{ "matches": [ "https://www.google.co.jp/*" ], "js": [ "content_script.js" ] }], "page_action": { "default_name": "PageAction", "default_icon": "icon19.png" }, "manifest_version": 2
content_script.js
chrome.runtime.onMessage.addListener(function(request, sender, sendResponse) { if (request.method == "getHTML") { sendResponse({ data: document.all[0].outerHTML }); } else { sendResponse({}); } });
chrome.runtime.onMessage イベントによりメッセージを受信する。
request は任意の仮想配列。今回は method: "getHTML" とする。
受信したメッセージに対して、sendResponse により返信する。
sendResponse の引数も任意の仮想配列。今回は data に HTML を設定する。
background.js
chrome.tabs.onUpdated.addListener(function(tabId, changeInfo, tab) { if (tab.url.indexOf('yahoo') != -1) { chrome.pageAction.show(tabId); } }); chrome.pageAction.onClicked.addListener(function() { chrome.tabs.sendMessage({ method: "getHTML" }, function(response) { console.log(response.data); });
ページ更新時
chrome.pageAction.show によりページアクションを表示する。
クリック時
content_script に chrome.tabs.sendMessage によりメッセージを送信する。
content_script からのコールバック時、response.data をログに表示する。
参考記事
"manifest_version": 1 のときのものなので若干古いですが、参考になりました。