2016-04-18 219 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