Chrome 116 for Extensions 中的新变化

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.
    20 * 1000
  );
}

如需了解详情,请参阅我们的新 WebSocket 指南示例

针对 Service Worker 的强 Keepalive

说到 service worker 生命周期,我们还推出了一项重要更新:对于需要用户互动的 API,现在支持强 keepalive。需要用户互动的 API 将为扩展服务工作线程提供“强”心跳信号(即允许工作线程在此任务上花费的时间超过 5 分钟):

在后台录制音频和视频

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_DOCUMENT9;
  );

新的屏幕外原因:地理定位

添加了 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 之间的功能差距这一目标迈进。如需了解当前状态,请访问我们的已知问题页面