2010-10-22 189 views
9

我想阻止加载用户定义的网站上的脚本文件。要阻止脚本文件,我在内容脚本中使用beforeload eventevent.preventDefault();,只要我已经知道网站列表,它就可以正常工作。我的问题是我不知道网站列表提前,所以要获取网站列表我发送请求到后台页面,但响应是异步和不可用的。在chrome扩展中传递同步消息?

是否有任何同步邮件在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); 
+1

同一问题的另一个[问题报告](https://code.google.com/p/chromium/issues/detail?id=135095&thanks=135095&ts=1340923674) – 2012-06-28 22:48:57

回答

6

不幸的是没有。有一个关于缺乏同步消息传递的bug report,也许如果有足够多的人出来,他们会做一些事情。

+0

感谢您的链接,我盯着它。 – 2010-10-23 15:13:28

+0

这个问题现在已经关闭,因为WontFix :( – cprcrack 2017-05-15 16:07:47

1

您可以使用HTML5文件API(navigator.webkitTemporaryStorage或具有TEMPORARY选项的旧版弃用window.webkitStorageInfo)将设置存储到文件。这部分是异步的,但您可以从后台或选项页面或弹出窗口执行此操作。由于API尚未标准化,因此此API可能会改变。由于它是临时存储,因此您的后台页面可能需要持续运行以防止Chrome删除文件。

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

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

它不需要清单中的任何特殊权限。我亲自用铬35测试过这个,但我知道它在早期版本中也有效。但是,我不知道最低版本要求。我记得在铬33中发现了一个与安全性变化相关的回归,但它没有起作用,但很快就被修正了。

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

+0

就你所知,这是一个可行的解决方案吗? – 2016-11-16 15:43:01

相关问题