Chrome 116 现已推出 Beta 版,其中包含许多令人兴奋的更新,可供 Chrome 扩展程序开发者使用。让我们快速了解一下有哪些新变化。
以编程方式打开侧边栏
边栏是 Chrome 扩展程序中最受用户欢迎的功能之一,自 Chrome 114 版以来已在 Chrome 中提供。在推出 Side Panel API 后,我们收到的第一批反馈之一是,开发者希望能够以编程方式打开侧边栏。现在,chrome.sidePanel.open
已推出 Beta 版。您可以使用它以程序化方式打开扩展程序侧边栏,以响应用户互动(例如点击上下文菜单):
chrome.contextMenus.onClicked.addListener((info, tab) => {
if (info.menuItemId === 'openSidePanel') {
// This will open the panel in all the pages on the current window.
chrome.sidePanel.open({ windowId: tab.windowId });
}
});
Service Worker 中的 WebSocket 支持
对于许多计划迁移到 Manifest V3 的扩展程序,WebSocket 支持至关重要。Chrome 116 进一步改进了对服务工作线程中的 WebSocket 的支持,因为所有 WebSocket 活动都会重置30 秒的服务工作线程空闲计时器。这意味着,只要 WebSocket 处于活跃状态,服务工作线程就会保持活跃状态。
您可以使用此方法来实现 keepalive 机制,确保您的服务工作线程在等待服务器发送消息时保持活跃状态,即使下一条消息在 30 秒后才到达:
function keepAlive() {
const keepAliveIntervalId = setInterval(
() => {
if (webSocket) {
webSocket.send('keepalive');
} else {
clearInterval(keepAliveIntervalId);
}
},
// It's important to pick an interval that's shorter than 30s, to
// avoid that the service worker becomes inactive.
2
0 * 1000
);
}
如需了解详情,请参阅我们的新 WebSocket 指南和示例。
针对 Service Worker 的强 Keepalive
说到 service worker 生命周期,我们还推出了一项重要更新:对于需要用户互动的 API,现在支持强 keepalive。需要用户互动的 API 将为扩展服务工作线程提供“强”心跳信号(即允许工作线程在此任务上花费的时间超过 5 分钟):
permissions.request()
desktopCapture.chooseDesktopMedia()
identity.launchWebAuthFlow()
management.uninstall()
在后台录制音频和视频
Manifest V2 和 Manifest V3 之间的另一个差距已弥合:您可以使用 tabCapture
和屏幕外文档在后台录制音频和视频。在服务工作线程中使用 chrome.tabCapture
API,以在用户手势之后获取媒体流 ID。然后,可以将此对象传递给 offscreen document 以开始录制。
请查看我们更新后的 tabCapture
指南,了解其运作方式;如需查看有效示例,请参阅 Tab Capture - Recorder 示例。
新 API:runtime.getContexts()
借助新的 runtime.getContexts()
API,您可以获取与扩展程序关联的有效上下文的相关信息。例如,您可以使用它来检查是否存在有效的屏幕外文档:
const existingContexts = await chrome.runtime.getContexts({});
const offscreenDocument = existingContexts.find(
(c) => c.contextType === 'OFFSCREEN_DOCUMENT
9;
);
新的屏幕外原因:地理定位
添加了 geolocation
作为使用屏幕外文档的另一种有效原因。请参阅我们的使用地理定位指南,详细了解如何使用 Offscreen API 获取扩展程序的地理位置。
chrome.action.setBadgeText()
action.setBadgeText
已更新,以解决 Manifest V2 和 Manifest V3 之间存在的不一致问题。向 action.setBadgeText
传递空字符串或 null
将清除指定标签页的徽章文本,并默认使用全局徽章文本。
action.setBadgeText({tabId: tabId, text: '
39;});
总结:朝着 Manifest V3 又迈出了一步
我们改进了 Service Worker 生命周期支持并更新了 TabCapture API,从而继续朝着缩小 Manifest V2 和 V3 之间的功能差距这一目标迈进。如需了解当前状态,请访问我们的已知问题页面。