用户操作

一些 WebExtension API 执行的功能通常是用户操作的结果。遵循“不惊喜”的原则,这些 API 只能在用户操作(也称为用户手势)的处理程序内部调用。这些用户操作包括:

  • 点击扩展的浏览器操作或页面操作。
  • 选择扩展定义的上下文菜单项。
  • 激活扩展定义的键盘快捷键(从 Firefox 63 开始才被视为用户操作)。
  • 点击随扩展包一起提供的页面上的按钮。
  • 点击地址栏(omnibox)中的扩展建议(从 Firefox 142 开始才被视为用户操作)。

通过用户操作启用的 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);