用户操作
一些 WebExtension API 执行的功能通常是用户操作的结果。遵循“不惊喜”的原则,这些 API 只能在用户操作(也称为用户手势)的处理程序内部调用。这些用户操作包括:
- 点击扩展的浏览器操作或页面操作。
- 选择扩展定义的上下文菜单项。
- 激活扩展定义的键盘快捷键(从 Firefox 63 开始才被视为用户操作)。
- 点击随扩展包一起提供的页面上的按钮。
- 点击地址栏(omnibox)中的扩展建议(从 Firefox 142 开始才被视为用户操作)。
通过用户操作启用的 API 包括:
- 用于打开扩展的浏览器操作或页面操作弹出窗口的
action.openPopup、browserAction.openPopup和pageAction.openPopupAPI。用户通过点击浏览器操作或页面操作来执行相同操作。 - 用于打开和关闭扩展侧边栏的
sidebarAction.open、sidebarAction.close和sidebarAction.toggleAPI。用户通过浏览器内置用户界面的某些部分(例如“查看”>“侧边栏”菜单)来执行此操作。 - 用于打开已下载文件的
downloads.openAPI。用户通过浏览器内置用户界面的某些部分(例如“工具”>“下载”菜单)来执行此操作。 management.setEnabledAPI。用户可以从扩展的附加组件管理器页面关闭主题扩展。permissions.requestAPI。用户可以从扩展的附加组件管理器权限和数据选项卡授予权限。
例如
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);