用户操作
一些 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);