コンテンツ スクリプトの重い拡張機能をアップグレード後も引き続き機能させ、インストール後すぐに機能させる方法があります。
インストール/アップグレード
インストール方法は、すべてのウィンドウのすべてのタブを単純に反復し、一致する URL を持つタブにプログラムでいくつかのスクリプトを挿入することです。
もちろん、manifest.json で宣言されたバックグラウンド ページまたはイベント ページスクリプトで実行する必要があります。
"background": {
"scripts": ["background.js"]
},
background.js:
// Add a `manifest` property to the `chrome` object.
chrome.manifest = chrome.runtime.getManifest();
var injectIntoTab = function (tab) {
// You could iterate through the content scripts here
var scripts = chrome.manifest.content_scripts[0].js;
var i = 0, s = scripts.length;
for( ; i < s; i++ ) {
chrome.tabs.executeScript(tab.id, {
file: scripts[i]
});
}
}
// Get all windows
chrome.windows.getAll({
populate: true
}, function (windows) {
var i = 0, w = windows.length, currentWindow;
for( ; i < w; i++ ) {
currentWindow = windows[i];
var j = 0, t = currentWindow.tabs.length, currentTab;
for( ; j < t; j++ ) {
currentTab = currentWindow.tabs[j];
// Skip chrome:// and https:// pages
if( ! currentTab.url.match(/(chrome|https):\/\//gi) ) {
injectIntoTab(currentTab);
}
}
}
});
マニフェストV3
マニフェスト.json:
"background": {"service_worker": "background.js"},
"permissions": ["scripting"],
"host_permissions": ["<all_urls"],
これらの host_permissions は、コンテンツ スクリプトのmatches
.
background.js:
chrome.runtime.onInstalled.addListener(async () => {
for (const cs of chrome.runtime.getManifest().content_scripts) {
for (const tab of await chrome.tabs.query({url: cs.matches})) {
chrome.scripting.executeScript({
target: {tabId: tab.id},
files: cs.js,
});
}
}
});
これは、フレームを処理しない単純化された例です。getAllFrames API を使用して、自分で URL を照合できます。パターンの照合については、ドキュメントを参照してください。
歴史のトリビア
古い Chrome 26 以前のコンテンツ スクリプトでは、バックグラウンド スクリプトへの接続を復元できました。2013 年にhttp://crbug.com/168263で修正されました。この回答の以前のリビジョンで、このトリックの例を見ることができます。