リクエストをリッスンし、フィールドに基づいてフィルタリングを行うことができtabId
ます。もちろん、アクティブなタブ (ウィンドウごとに 1 つのタブ) を追跡する必要があります。
例えば:
chrome.tabs.onActivatedを使用して、ウィンドウごとにアクティブなタブの変更をリッスンしtabId
、ローカル変数に保存します。
chrome.windows.onRemovedを使用して、閉じたウィンドウのタブの追跡を停止します。
目的に合ったchrome.webRequest.*イベントのリスナーを登録します。たとえば、リクエストの送信準備が整うとすぐにアクティブなタブのいずれかでリクエストの通知を受け取るには、chrome.webRequest.onBeforeRequestのリスナーを登録します。
以下は、まさにそれを行うサンプル拡張機能のソース コードです。
マニフェスト.json:
{
"manifest_version": 2,
"name": "Test Extension",
"version": "0.0",
"offline_enabled": false,
"background": {
"persistent": true,
"scripts": ["background.js"]
},
"permissions": [
"webRequest",
"*://*/*"
]
}
background.js:
/* Keep track of the active tab in each window */
var activeTabs = {};
chrome.tabs.onActivated.addListener(function(details) {
activeTabs[details.windowId] = details.tabId;
});
/* Clear the corresponding entry, whenever a window is closed */
chrome.windows.onRemoved.addListener(function(winId) {
delete(activeTabs[winId]);
});
/* Listen for web-requests and filter them */
chrome.webRequest.onBeforeRequest.addListener(function(details) {
if (details.tabId == -1) {
console.log("Skipping request from non-tabbed context...");
return;
}
var notInteresting = Object.keys(activeTabs).every(function(key) {
if (activeTabs[key] == details.tabId) {
/* We are interested in this request */
console.log("Check this out:", details);
return false;
} else {
return true;
}
});
if (notInteresting) {
/* We are not interested in this request */
console.log("Just ignore this one:", details);
}
}, { urls: ["<all_urls>"] });
/* Get the active tabs in all currently open windows */
chrome.tabs.query({ active: true }, function(tabs) {
tabs.forEach(function(tab) {
activeTabs[tab.windowId] = tab.id;
});
console.log("activeTabs = ", activeTabs);
});