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

服务工件中的 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 指南示例

为服务工件提供强大的 keepalive

说到服务工件生命周期,我们还推出了另一项重要更新:针对需要用户互动的 API 的强力保持连接。需要用户互动的 API 将针对扩展程序服务工作器提供“强”保持连接(即允许工作器花费超过 5 分钟的时间来执行此任务):

在后台录制音频和视频

Manifest V2 和 Manifest V3 之间的另一个差距已消除:您可以使用 tabCapture 和屏幕外文档在后台录制音频和视频。在服务工作器中使用 chrome.tabCapture API 可在用户执行手势后获取串流 ID。然后,可以将其传递给屏幕外文档以开始录制。

请参阅更新后的 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'
  );

新的离线原因:地理位置

添加了 geolocation,作为使用屏幕外文档的另一个有效原因。请参阅我们的使用地理位置信息指南,详细了解如何使用 Offscreen API 获取扩展程序的地理位置信息。

chrome.action.setBadgeText()

action.setBadgeText 已更新,以解决 Manifest V2 和 Manifest V3 之间的不一致问题。将空字符串或 null 传递给 action.setBadgeText 会清除指定标签页的标记文本,并改为默认使用全局标记文本。

action.setBadgeText({tabId: tabId, text: ''});

摘要:朝着 Manifest V3 迈进了一步

通过改进的 Service Worker 生命周期支持和更新后的 TabCapture API,我们在缩小 Manifest V2 和 V3 之间的功能差距方面取得了进一步进展。请访问我们的已知问题页面,了解当前状态。