【发布时间】:2018-08-17 09:33:01
【问题描述】:
我正在开发一个 Chrome 扩展程序,我想阻止基于外部查找的页面加载(例如,根据用户在输入栏中输入的 URL 检查垃圾邮件评级或其他服务)。
来自 Chrome 开发者文档,他们提供了following basic example for blocking:
chrome.webRequest.onBeforeRequest.addListener(
function(details) { return {cancel: true}; },
{urls: ["*://www.evil.com/*"]},
["blocking"]);
我遇到的问题是试图找出使用回调、promise 或 async/await 的正确方法,以便确定是否要返回 true 并阻止网页加载。
例如,这将起作用:
function returnTrue(){
return {cancel: true};
}
chrome.webRequest.onBeforeRequest.addListener(
returnTrue,
{
urls: ["<all_urls>"],
types: ["main_frame"]
},
["blocking"]);
但是如果我使returnTrue() async 监听器不再阻塞,页面就会加载。例如,
async function returnTrue(){
return {cancel: true};
}
在我的真实函数中,我尝试在包装的承诺结果上使用 await
XMLHttpRequest()。在此之前,我尝试通过将最后一个参数设置为 false 来使其在调用 XMLHttpRequest().open() 时同步。这会导致同步执行,但它的功能已被弃用,并导致其他一些奇怪的问题,导致 ,send() 失败并出现错误。因此,我想避免强制 .open() 同步。
我也尝试将 async 关键字放在 chrome.webRequest.onBeforeRequest... 之前,但这也不起作用。
如何确保我强制 Chrome 插件等到我调用远程服务并在它执行之前做出决定。由于这会阻塞加载,因此在做出阻塞决定之前,它确实应该都是同步逻辑或至少等待。
【问题讨论】:
-
我不认为
webRequest.onBeforeRequest可以处理由侦听器返回的承诺 - 至少,不是在 chrome 中 - Chrome 的(糟糕的)文档中没有关于此的任何内容提及承诺 -
Chrome API 是基于回调的,这在文档中所有方法的描述中都有明确说明,因此 async/await 将不起作用,因为它是基于 Promise 的。因此唯一可用的方法是同步 XHR。您可以忽略弃用警告。您还可以添加超时以确保您的后台页面不会被阻止超过指定的时间。
标签: javascript google-chrome-extension xmlhttprequest