Chrome 116 现已推出 Beta 版,其中包含许多面向 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 支持
WebSocket 支持对于许多计划迁移到 Manifest V3 的扩展程序来说至关重要。Chrome 116 进一步改进了 Service Worker 中的 WebSocket 支持,因为所有 WebSocket 活动都会重置 30 秒的 Service Worker 空闲计时器。这意味着,只要 WebSocket 处于活动状态,Service Worker 就会一直保持活动状态。
您可以使用它来实现一个 keepalive 机制,确保您的 Service Worker 在等待服务器的消息时保持活跃状态,即使下一一条消息到达需要 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.
20 * 1000
);
}
如需了解详情,请参阅我们新的 WebSocket 指南和示例。
适用于 Service Worker 的强 keepalive
说到 Service Worker 生命周期,另一个重要更新已落地:为需要用户互动的 API 提供强大的 keepalive。需要用户互动的 API 将为扩展程序 Service Worker 提供“强”的 keepalive(即允许 Worker 执行此任务的时间超过 5 分钟):
permissions.request()
desktopCapture.chooseDesktopMedia()
identity.launchWebAuthFlow()
management.uninstall()
在后台录制音频和视频
Manifest V2 与 Manifest V3 的另一个差距已经缩小:您可以使用 tabCapture
和屏幕外文档在后台录制音频和视频。在 Service Worker 中使用 chrome.tabCapture
API,在用户手势后获取数据流 ID。随后,系统会将这些内容传递到屏幕外文档以开始录制。
请参阅更新后的 tabCapture
指南,了解其工作原理;如需查看实际示例,请参阅标签页捕获 - 记录器示例。
新 API:runtime.getContexts()
新的 runtime.getContexts()
API 可让您提取与您的扩展程序相关联的有效上下文的相关信息。例如,您可以使用它来检查是否存在有效的屏幕外文档:
const existingContexts = await chrome.runtime.getContexts({});
const offscreenDocument = existingContexts.find(
(c) => c.contextType === 'OFFSCREEN_DOCUMENT'
);
新的屏幕外原因:GEOLOCATION
添加了 geolocation
作为另一个使用屏幕外文档的正当理由。如需详细了解如何使用 Offscreen API 获取扩展程序的地理位置,请参阅使用地理定位指南。
chrome.action.setBadgeText()
更新了 action.setBadgeText
,解决了 Manifest V2 和 Manifest V3 之间的不一致问题。向 action.setBadgeText
传递空字符串或 null
会清除指定标签页的标记文本,并默认显示全局标记文本。
action.setBadgeText({tabId: tabId, text: ''});
摘要:迈向 Manifest V3 的又一步
通过改进的 Service Worker 生命周期支持和更新后的 TabCapture API,我们不断朝着目标迈进,缩小 Manifest V2 和 V3 之间的功能差距。如需了解当前状态,请访问我们的已知问题页面。