Chrome扩展中的同步消息传递?

时间:2010-10-22 11:20:58

标签: javascript google-chrome google-chrome-extension

我正在尝试阻止脚本文件加载到用户定义的网站上。要阻止脚本文件我在内容脚本中使用beforeload eventevent.preventDefault();,只要我已经知道网站列表就可以正常工作。我的问题是我不提前知道网站列表,所以要获取网站列表我正在向后台页面发送请求,但响应是异步且无法使用。

在Google文档中我可能错过了哪些同步消息传递给Chrome扩展程序?

// 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);

2 个答案:

答案 0 :(得分:8)

不幸的是没有。有一个关于缺少同步消息传递的bug report已经开放,也许如果有足够的人明星,他们会对此做些什么。

答案 1 :(得分:1)

您可以使用HTML5文件API(navigator.webkitTemporaryStorage或较旧的不推荐使用的window.webkitStorageInfo和TEMPORARY选项)将设置存储到文件中。这部分是异步的,但你可以从后台或你的选项页面或弹出窗口中进行。此API可以更改,因为它尚未标准化。由于它是临时存储,因此您的后台页面可能需要运行持久性以防止chrome删除文件。

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

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

它不需要清单中的任何特殊权限。我个人用chrome 35测试了这个,但我知道它也适用于早期版本。但是,我不知道最低版本要求。我记得在Chrome 33中提到了一个与安全性变化相关的回归,它没有起作用,但很快得到修复。

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