2016-08-24 164 views
2

我開始用Chrome擴展的發展,並有一對夫婦的關於發展過程中的擴展安裝/更新流程和測試問題:Chrome擴展更新流程

  1. 與擴展更新後的背景劇本,會發生什麼呢鉻執行後臺腳本重新加載?
  2. 擴展更新後內容腳本是否與後臺腳本分離?
  3. 如果在後臺腳本中有一個onInstalled事件處理程序,那麼當chrome更新擴展時(該事件處理程序分離,並且更新完成時,新處理程序被附加,然後執行或執行其他一些流程),該事件處理程序會發生什麼情況? ?
  4. 有沒有辦法在開發過程中模擬更新過程,以便調試更新過程中發生的事件,例如在本地服務器上託管擴展並從那裏更新?
  5. 在哪裏尋找關於這個主題的文檔以及類似文章,鉻源代碼是否正確或者至少是出發點?

謝謝!

+0

請參閱標記此問題的標籤[tag:google-chrome-extension]?有一個信息[鏈接](https://stackoverflow.com/tags/google-chrome-extension/info) –

回答

4
  1. 擴展更新後的背景腳本會發生什麼,Chrome是否執行後臺腳本重裝?

的行爲取決於你是否有一個處理程序,註冊chrome.runtime.onUpdateAvailable event是否您的擴展有着執着的背景頁面或活動頁面。

  • 如果你有一個持續的背景頁:
    • 如果您處理此事件,並呼籲chrome.runtime.reload(),延長再次被加載之前卸載,然後更新。
    • 如果您處理此事件並且不呼叫chrome.runtime.reload(),那麼更新將僅在下次重新載入擴展時適用 - 可能是下一次完整的瀏覽器重新啓動。
    • 如果你根本沒有處理這個事件,那麼這個擴展將立即被卸載並被更新。
  • 如果你有一個非持久性活動頁面:
    • 如果您處理此事件,並呼籲chrome.runtime.reload(),延長再次被加載之前更新。
    • 如果您沒有撥打chrome.runtime.reload()或根本沒有處理該事件,Chrome會在下一個事件頁面卸載時更新擴展程序。

沒有辦法以編程方式防止一次更新後臺頁面被卸載無論出於何種原因。

  1. 擴展更新後,內容腳本是否從後臺腳本中分離出來?

是的,它不漂亮。當使用Chrome API提供不一致的錯誤時,它們會進入「孤立」狀態(有些什麼都不做,有些會觸發異常),但仍然在運行 - 例如,任何DOM事件偵聽器都會觸發。

因此,如果你想要的內容腳本,再立即開始工作,你的工作是:

  • 進樣編程腳本在現有的選項卡,而不進行一個假設,即它沒有前執行:清理第一,如果必要。
  • 確保孤立副本停止執行:或者注意舊副本中的孤立副本,或者從新副本中廣播DOM事件。

約WebExtensions重要提示:火狐,Chrome的不同,總是重新注入負載的內容腳本到匹配清單條目頁面。確保考慮到這一點。

有幾個問題覆蓋了這個;例如:

  • 如果有一個onInstalled事件處理程序在後臺腳本,如何處理該事件發生當chrome更新擴展(這個事件處理程序是分離的,並且當更新完成時,新的處理程序被附加,然後執行或者其他一些流程是行使)?
  • 由於而背景頁上的卸載的更新僅發生,沒有複雜的邏輯;它只會在details.reason == "update"之後在第一次加載分機時觸發。一定要在腳本加載時(例如在頂級代碼中)同步註冊處理程序,否則您可能會錯過該事件 - 通常這隻涉及事件頁面,但我懷疑這也是重要的。

  • 有沒有辦法從那裏發展的過程中,以模擬更新過程中,爲了在更新過程中發生的調試事件,例如一些地方的服務器上託管擴展和更新?
  • 可悲的是,這是不再可能了我所知,除非你可以使用Enterprise Policy install。你最好的選擇是在CWS中有一個擴展名爲Private。

    在某種程度上,在對已解包的擴展進行一些更改後按下「重新加載」可模擬更新過程中發生的情況 - onInstalled事件除外。

  • 哪裏搜索在這樣和類似主題的文檔,是鉻源代碼在正確的地方或至少起點?
  • 那麼..有關詳細問題Chromium代碼當然是權威的來源。你也應該搜索StackOverflow,因爲這裏已經有相當豐富的知識。最後,官方文檔提供了大量信息,即使它並不立即顯現 - 例如chrome.runtime API docs