用户操作

一些 WebExtension API 执行的功能通常是由于用户操作而执行的。例如:

  • 带有弹出窗口的浏览器操作会在用户单击时显示弹出窗口,但还有一个 browserAction.openPopup (en-US) API 允许扩展程序以编程方式打开弹出窗口。
  • 如果扩展程序添加了侧边栏,用户通常通过浏览器内置的用户界面的某些部分(例如“视图/侧边栏”菜单)打开它。但还有一个 sidebarAction.open (en-US) API 允许扩展程序以编程方式打开其侧边栏。

为了遵循“没有意外”的原则,这类 API 只能从用户操作的处理器内部调用。用户操作包括以下内容:

  • 点击扩展程序的浏览器操作或页面操作。
  • 选择扩展定义的上下文菜单项。
  • 激活扩展定义的键盘快捷键(仅从 Firefox 63 开始,被视为用户操作)。
  • 点击与扩展程序捆绑在一起的页面中的按钮。

例如:

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

browser.browserAction.onClicked.addListener(handleClick);

注意,普通网页中的用户操作不被视为用于此目的的用户操作。例如,如果用户单击普通网页中的按钮,并且内容脚本已为该按钮添加点击的处理器,并且在该处理器中向扩展的后台页面发送消息,那么后台页面的消息处理器不被视为正在处理用户操作。

此外,如果用户输入的处理器等待 promise,那么它作为用户输入处理器的状态将会丢失。例如:

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

  // 这将失败,因为处理器丢失了其“用户操作处理器”状态
  browser.sidebarAction.open();
}

browser.browserAction.onClicked.addListener(handleClick);