如要從背景頁面轉換至擴充功能服務 worker,並取代功能,開發人員可以使用 chrome.offscreen
API 和資訊清單權限 (從 Chrome 109 開始)。您可以要求這項權限,建立螢幕外文件來使用 DOM API,而不必惱人地開啟新視窗或分頁,打斷使用者體驗。chrome.offscreen
API 現已可在 Chrome 擴充功能中使用。
在 Chromium 中,Manifest V3 擴充功能是基於服務工作者的,但服務工作者不支援與全文檔案型網頁 (包括背景和事件網頁) 相同的 API 和機制。此外,使用內容指令碼存取網頁上的 DOM API 時,擴充功能會受到不同網頁內容安全性政策的影響。為解決這個問題,我們推出了 Offscreen Documents,可支援 DOM 相關功能和 API,讓 Manifest V3 擴充功能透過專屬 API 在執行階段開啟最少、最受限,且相對不需授權的離螢幕文件。
功能資訊
由於離線文件是專門用於處理服務工作者不支援的用途 (例如音訊播放),因此這個頁面的生命週期和授予的權限,都與擴充功能服務工作者不同。這個網頁會採用與資訊清單 2 版事件網頁類似的生命週期機制,也就是在停止執行動作時會拆除。此外,使用者代理程式可能會針對指定用途進一步限制生命週期。螢幕外文件的設計目的是填補只有 DOM API 可存取的 API 空白;因此,擴充 API 不必直接在這個情境中公開。為降低擴充功能將這些 API 用於「背景頁面替換」的可能性,只有 chrome.runtime
訊息 API 會公開給離線文件。(開發人員也可以透過服務工作者,將離螢幕外的文件宣稱為用戶端,以便使用網路訊息傳送功能)。由於某些用途 (尤其是網站擷取) 需要存取跨來源框架,因此我們允許這些文件根據擴充功能頁面現有的規則,嵌入跨來源框架。在離線文件中,延伸模組指定的內容指令碼可在這些影格中執行,以便擷取任何必要的內容,就像在任何一般網頁中一樣。
原因,以及要求提供用途
如要建立非螢幕畫面文件,必須提供明確理由和進一步說明。這些原因列於 API 參考說明文件中,並以不同方式處理文件的生命週期。舉例來說,如果您目前是為了音訊播放而開啟文件,則該文件的生命週期會套用不同的規則,而非為了剪貼簿管理而開啟的文件。您也可以在「justification」中進一步說明離屏文件的用途,這是開發人員編寫的字串,而非對文件產生效果的參數。隨著開發人員分享意見回饋和用途,API 可能會隨時間新增更多原因。
未來展望
為方便實作,這個 API 的第一個版本一次只支援每個擴充功能和每個設定檔各一個網頁。在日後的版本中,我們可能會放寬這項限制,以支援多個網頁。目前,如果擴充功能在分割模式下執行,且有一個有效的無痕模式設定檔,則一般和無痕模式設定檔都能各自有一個離線文件。我們也打算日後為擴充功能工作者提供 DOM 功能。您可以將使用螢幕外 API 的函式與服務工作者中等同的註解函式配對,以便日後進行交換,藉此讓擴充功能「符合未來需求」。
// Solution 1 - Service workers cannot directly interact with
// the system clipboard. To work around this, we'll create an offscreen
// document and pass the data we want to write to the clipboard.
async function addToClipboard(value) {
await chrome.offscreen.createDocument({
url: 'offscreen.html',
reasons: [chrome.offscreen.Reason.CLIPBOARD],
justification: 'Write text to the clipboard.',
});
}
// Solution 2 – Once extension service workers can use the Clipboard API,
// replace the offscreen document based implementation with something like this
async function addToClipboardV2(value) {
navigator.clipboard.writeText(value);
}
此外,當 DOM 功能和 API 新增至服務工作者時,系統會根據服務工作者的目前狀態和使用離螢幕文件的原因,新增或減少建立文件的原因清單。
結論
螢幕外文件可讓擴充功能存取 DOM 或視窗互動,這項功能目前無法在服務工作者中實現。它也提供彈性方法,可新增新用途,並移除日後解決的用途。擴充功能應採用建議的螢幕外文件 API 來處理特定用途,而擴充功能的主要背景內容應維持資訊清單中指定的服務工作者。由於畫面外文件的 API 存取權有限,因此不應用於儲存主要擴充功能邏輯。離線文件的生命週期與建立該文件的服務 worker 無關。我們將在另一篇網誌文章中討論服務工作站生命週期考量因素,以及擴充功能中與服務工作站生命週期相關的用途。隨著功能和 API 新增至服務工作者本身,使用離線文件的原因也會隨之變動。我們很期待開發人員在這項功能推出後提供意見。