使用者操作

一些 WebExtension API 執行的功能通常是使用者操作的結果。遵循“不驚喜”的原則,這些 API 只能在使用者操作(也稱為使用者手勢)的處理程式內部呼叫。這些使用者操作包括:

  • 點選擴充套件的瀏覽器操作或頁面操作。
  • 選擇擴充套件定義的上下文選單項。
  • 啟用擴充套件定義的鍵盤快捷鍵(從 Firefox 63 開始才被視為使用者操作)。
  • 點選隨擴充套件包一起提供的頁面上的按鈕。
  • 點選位址列(omnibox)中的擴充套件建議(從 Firefox 142 開始才被視為使用者操作)。

透過使用者操作啟用的 API 包括:

  • 用於開啟擴充套件的瀏覽器操作或頁面操作彈出視窗的 action.openPopupbrowserAction.openPopuppageAction.openPopup API。使用者透過點選瀏覽器操作或頁面操作來執行相同操作。
  • 用於開啟和關閉擴充套件側邊欄的 sidebarAction.opensidebarAction.closesidebarAction.toggle API。使用者透過瀏覽器內建使用者介面的某些部分(例如“檢視”>“側邊欄”選單)來執行此操作。
  • 用於開啟已下載檔案的 downloads.open API。使用者透過瀏覽器內建使用者介面的某些部分(例如“工具”>“下載”選單)來執行此操作。
  • management.setEnabled API。使用者可以從擴充套件的附加元件管理器頁面關閉主題擴充套件。
  • permissions.request API。使用者可以從擴充套件的附加元件管理器許可權和資料選項卡授予許可權。

例如

js
function handleClick() {
  browser.sidebarAction.open();
}

browser.browserAction.onClicked.addListener(handleClick);

除了啟用 API 外,這些操作還會啟用 "activeTab" 許可權。此許可權為使用者操作發生時可見的選項卡授予額外許可權。

正常網頁中的使用者互動不被視為使用者操作。例如,考慮正常網頁上的一個按鈕,它使用內容指令碼。這個內容指令碼為按鈕添加了一個點選處理程式,該處理程式將訊息傳送到擴充套件的後臺頁面。當用戶點選按鈕時,後臺頁面的訊息處理程式不被認為是處理使用者操作。

另外,如果使用者輸入處理程式等待一個 Promise,那麼它作為使用者輸入處理程式的身份就會丟失。例如:

js
async function handleClick() {
  let result = await someAsyncFunction();

  // this fails, because the handler lost its "user action handler" status
  browser.sidebarAction.open();
}

browser.browserAction.onClicked.addListener(handleClick);