我想創建一個 Chrome 擴展程式,它記錄 HTTP 請求(到預定義的主機)并將它們作為串列保存在本地存盤中,因此當我再次呼叫特定網站時,該串列將被擴展。
我想使用 Manifest v3 使擴展“為未來做好準備”。我創建了一個后臺腳本來觸發當前將所有詳細資訊放入本地存盤的請求(目前這對于演示目的是多余的,我也單獨嘗試過):
chrome.webRequest.onBeforeRequest.addListener(details => {
var urls = [];
chrome.storage.local.get(['data'], function(data){
urls = data.urls;
});
chrome.scripting.executeScript(
{
target: {tabId: details.tabId},
func: recordClick,
args: [details, urls]
},
() => {
urls.push(details);
console.log(urls.length);
chrome.storage.local.set({urls: urls});
});
}, {
urls: ['<all_urls>']
});
還有另一個名為 recordClick() 的函式與回呼中的功能相同:
function recordClick(details, urls) {
urls.push(details.url);
chrome.storage.local.set({urls: urls});
}
我嘗試了幾種方法來加載和保存結果,但都沒有奏效。當我在 onBeforeRequest 觸發器中加載之前的 url 時,url 不是全域的,并且在回呼中是未知的。當我將它放在觸發器定義之外時,它不會實時讀取存盤。我還嘗試在“檔案開始”時加載的內容腳本中加載 url。我嘗試在頂部的后端腳本中加載 url,依此類推。
好像我有一個時間問題:觸發器總是加載一個空串列或者變數不是全域的。我無法擴展串列。無論我把存盤功能放在哪里。
我的計劃完全可行嗎?我做錯了什么?
謝謝!
uj5u.com熱心網友回復:
由于chrome.storage.local.get是異步的,您應該chrome.scripting.executeScript進入它的回呼。
onComplete可能適合您的目的,而不是onBeforeRequest.
chrome.webRequest.onBeforeRequest.addListener(details => {
chrome.storage.local.get('urls', function(data){
let urls = [];
if( data.urls ) {
urls = data.urls;
}
urls.push(details);
chrome.storage.local.set({urls: urls}, function() {
console.log('Value is set to ');
console.log(urls);
});
chrome.scripting.executeScript( {
target: {tabId: details.tabId},
func: function(details, urls){ console.log("executed script") },
args: [details, urls]
},
() => {
console.log("injected")
});
});
},
{ urls: ['<all_urls>'] }
);
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/357770.html
上一篇:VS2019除錯chrome黑屏
