我的扩展程序正在修改一些网址。它工作正常,但现在我想检查是否在设置中启用了修改。
chrome.webRequest.onBeforeRequest.addListener
(
modifyUrl,
{urls: ['http://somewebsite/*'], types: ['main_frame']},
['blocking']
);
问题在于我不知道如何等待这个值。我必须在退出modifyUrl
之前获取设置。这可能吗?如果这是C#,我可能会在调用ManualResetEvent
之后使用sync.get
或其他内容。
function modifyUrl(details)
{
chrome.storage.sync.get("someSetting",
function (data)
{
//I can get the setting here
}
);
//how to know the setting here?
if(enabled in the setting)
{
return {redirectUrl: some different url};
}
}
答案 0 :(得分:3)
有关详细说明,请参阅Returning Chrome storage API value without function。
简而言之,blocking
onBeforeRequest事件是同步的,因此它不能依赖异步函数,例如所有chrome。* API回调来获取其返回值。
将数据缓存在全局变量中,并在其他地方更改时使用chrome.storage.onChanged进行更新,如果您使用chrome.storage.sync(它在配置文件同步时更新),则很容易发生这种情况。
var settingEnabled; // a global variable
chrome.storage.sync.get("someSetting", function (data) {
var settingEnabled = data.someSetting;
});
chrome.webRequest.onBeforeRequest.addListener(
modifyUrl,
{urls: ['http://somewebsite/*'], types: ['main_frame']},
['blocking']
);
function modifyUrl(details) {
if (settingEnabled) {
return {redirectUrl: 'http://example.com'};
}
}
chrome.storage.onChanged.addListener(function(changes, area) {
if (area == "sync" && "someSetting" in changes) {
settingEnabled = changes.someSetting.newValue;
}
});
当然,如果您想完全禁用处理,只需分离监听器:
function toggleListener(enable) {
if (enable) {
chrome.webRequest.onBeforeRequest.addListener(
modifyUrl,
{urls: ['http://somewebsite/*'], types: ['main_frame']},
['blocking']
);
} else {
chrome.webRequest.onBeforeRequest.removeListener(modifyUrl);
}
}
chrome.storage.onChanged.addListener(function(changes, area) {
if (area == "sync" && "someSetting" in changes) {
toggleListener(changes.someSetting.newValue);
}
});
chrome.storage.sync.get("someSetting", function (data) {
toggleListener(data.someSetting);
});
另一个有趣的方法是更新re-attach onBeforeRequest inside storage.get callback。