Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/google-chrome/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript chrome扩展中的同步消息传递?_Javascript_Google Chrome_Google Chrome Extension - Fatal编程技术网

Javascript chrome扩展中的同步消息传递?

Javascript chrome扩展中的同步消息传递?,javascript,google-chrome,google-chrome-extension,Javascript,Google Chrome,Google Chrome Extension,我正试图阻止在用户定义的网站上加载脚本文件。要阻止脚本文件,我正在使用beforeload event和event.preventDefault()在内容脚本,工作良好,只要我已经知道网站列表。我的问题是我事先不知道网站列表,所以为了获得网站列表,我向后台页面发送了一个请求,但响应是异步的,无法使用 在Chrome扩展中是否有我可能在Google文档中遗漏的同步消息传递 // my (simplified) code from content script: document.addEventL

我正试图阻止在用户定义的网站上加载脚本文件。要阻止脚本文件,我正在使用
beforeload event
event.preventDefault()在内容脚本,工作良好,只要我已经知道网站列表。我的问题是我事先不知道网站列表,所以为了获得网站列表,我向后台页面发送了一个请求,但响应是异步的,无法使用

在Chrome扩展中是否有我可能在Google文档中遗漏的同步消息传递

// my (simplified) code from content script:
document.addEventListener("beforeload", function(event)
{
  chrome.extension.sendRequest({fnc:"is_owner"}, function(response)
  {
    // asynchronous response is not usable because
    // all scripts have already been loaded
    if (response.is_owner) event.preventDefault();
  });
}, true);

不幸的是没有。有一个公开的问题是缺少同步消息传递,如果有足够多的人启动它,他们可能会对此采取一些措施。

您可以使用HTML5文件API(navigator.webkitTemporaryStorage或旧的不推荐的window.webkitStorageInfo和临时选项)将设置存储到文件中。这部分是异步的,但您可以从后台、选项页或弹出窗口执行。由于尚未标准化,此API可能会发生变化。由于它是临时存储,您的后台页面可能需要运行persistent以防止chrome删除该文件

然后从内容脚本中,您可以使用同步XMLHttpRequest从“filesystem:+chrome.extension.getURL”(“temporary/”+filename)获取文件。url上的“filesystem:”前缀相当重要

最好的办法是使用chrome.storage API(或localStorage)进行设置,并从中钩住onChanged事件以更新临时文件。如果需要在设置更改后重新加载页面,则需要在文件系统写入操作的回调中执行此操作,以便内容脚本可以看到更改

它不需要清单中的任何特殊权限。我个人曾在Chrome35上测试过这个功能,但我知道它在早期版本中同样有效。但是,我不知道最低版本要求。我记得在Chrome33中看到一个提到安全性变化相关的回归,它不起作用,但很快就被修复了


我见过一些其他的解决方法(例如,从onBeforeWebRequest重定向到blob url或数据uri),用于在页面自己的脚本运行之前将设置放入内容脚本中,但据我所知,由于一般XSS和扩展安全性的改进,在最新版本的chrome中,这些设置都被故意破坏。

感谢链接,我盯着它看。问题现在以WontFix结束:(谷歌有时会非常烦人。让一切变得如此困难有什么意义?据你所知,这仍然是一个可行的解决方案吗?这个文件系统+XMLHttpRequest,最后一种同步传递消息的方式,现在已经在Chrome 76中被打破了。