用户操作

一些 WebExtension API 执行通常由用户操作触发的功能。例如

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

为了遵循“没有惊喜”的原则,此类 API 只能在用户操作的处理程序内部调用。用户操作包括以下内容

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

例如

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

browser.browserAction.onClicked.addListener(handleClick);

请注意,普通网页中的用户操作不会被视为此目的的用户操作。例如,如果用户点击普通网页中的一个按钮,并且内容脚本为该按钮添加了一个点击处理程序,并且在该处理程序中向扩展的后台页面发送消息,则后台页面消息处理程序不被视为正在处理用户操作。

此外,如果用户输入处理程序等待 Promise,则其作为用户输入处理程序的状态将丢失。例如

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

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

browser.browserAction.onClicked.addListener(handleClick);