2016-04-18 223 views
0

我需要在扩展的web_accessible_resources中保留一个JSON文件,以便它可以通过同步XHR由内容脚本读取(同步部分很重要,这就是为什么我使用XHR)。Chrome扩展程序:有扩展程序编辑其web_accessible_resources

但是这个文件应该反映用户通过扩展接口采取的行动,所以当用户改变那里的东西时,JSON文件被背景页面重写(这可以异步发生)。这样,下次内容脚本读取文件时,它就会更新。

扩展名是否有任何修改web_accessible_resources下列出的文件的方法?

另外,作为最后一个资源,可以让扩展在文本编辑器中打开文件并让用户直接对其进行编辑,但恐怕会让Chrome认为扩展受到攻击,禁用它。

+0

为什么它需要同步? –

+0

内容脚本需要在加载页面之前注入一些代码,但代码取决于内容脚本没有的信息,因此它需要从文件或背景页面获取(同步)。 – user3648026

回答

2

无法修改扩展名中文件的内容。

在这种情况下你可以做什么是雇用chrome.storage.onChanged事件。

  1. 您的背景页面更新了chrome.storage中的信息。
  2. 这在内容脚本中触发chrome.storage.onChanged。您通过保存数据的本地副本来对此做出反应。您甚至不需要查询存储空间:新数据在该事件中可用。
  3. 您可以同步访问数据的本地副本。

这并没有解决内容脚本刚开始执行时产生数据的问题,因为您必须首先异步填充它。但同步XHR是一个非常笨拙的想法。

还有一些想法被覆盖了here。他们中的任何一个都是非常复杂的黑客,而Chrome的official position is "won't happen"

P.S.而且为了防止有人想到这个问题,他们真的寻求对XHR的可变响应,人们可以使用chrome.webRequest API重定向到包含数据的URI; data:。问题在于URI本身必须同步构建/可用。

+0

我已经使用了您所链接的问题中解释的File API方法,它可以工作。正如你所说的那样,这有点破绽,但似乎并没有一种合适的“干净”的方式来实现我想要的。感谢您的澄清。 – user3648026

1

我不认为这是可能的,因为这是为什么有一个fileSystem API。我不知道你的特殊用例,但是扩展一旦启动就不会有加载文件的可能性吗?在大多数情况下,加载应该在用户甚至可以交互之前完成。

+0

该文件需要由内容脚本读取,因此每次访问页面时都需要阅读该文件。我考虑了[chrome.storage](https://developer.chrome.com/extensions/storage)或[消息传递](https://developer.chrome.com/extensions/messaging)以使所需信息内容脚本,但它们都是异步的。 – user3648026