runtime.connect()

在扩展程序中的不同上下文之间建立连接。

你可以在以下位置调用此方法:

  • 在扩展程序的content scripts中,用于与扩展程序的background scripts(或特权类似的脚本,如popup scripts或options page scripts)建立连接。
  • 在扩展程序的background scripts(或特权类似的脚本)中,用于与另一个扩展程序建立连接。

请注意,你不能使用此函数连接扩展程序与其content scripts。要实现此目的,请使用 tabs.connect()

默认情况下,此连接允许扩展程序与其自身或其他任何扩展程序(如果指定了 extensionId)交换消息。但是,可以使用 externally_connectable manifest 键将通信限制为特定扩展程序,并启用与网站的通信。扩展程序内部的连接会触发 runtime.onConnect 事件,来自其他扩展程序或网页的连接会触发 runtime.onConnectExternal 事件。

语法

js
let port = browser.runtime.connect(
  extensionId, // optional string
  connectInfo  // optional object
)

参数

extensionId 可选

string。要连接的扩展程序的 ID。如果目标使用 manifest.json 中的 browser_specific_settings 键显式设置了 ID,则 extensionId 应为该值。否则,它应为为目标生成的 ID。

connectInfo 可选

object。连接的详细信息

name 可选

string。将传递给正在监听连接事件的进程的 runtime.onConnect

includeTlsChannelId 可选

boolean。是否将 TLS 通道 ID 传递给正在监听连接事件的进程的 runtime.onConnectExternal

返回值

runtime.Port。用于发送和接收消息的端口。如果扩展程序不存在,则会触发端口的 onDisconnect 事件。

示例

此内容脚本

  • 连接到 background script,并将 Port 存储在名为 myPort 的变量中。
  • 监听 myPort 上的消息并记录它们。
  • 当用户点击文档时,使用 myPort 向 background script 发送消息。
js
// content-script.js

let myPort = browser.runtime.connect({ name: "port-from-cs" });
myPort.postMessage({ greeting: "hello from content script" });

myPort.onMessage.addListener((m) => {
  console.log("In content script, received message from background script: ");
  console.log(m.greeting);
});

document.body.addEventListener("click", () => {
  myPort.postMessage({ greeting: "they clicked the page!" });
});

相应的后台脚本

  • 监听来自 content script 的连接尝试。

  • 当收到连接尝试时

    • 将端口存储在名为 portFromCS 的变量中。
    • 使用该端口向 content script 发送消息。
    • 开始监听通过端口接收到的消息,并记录它们。
  • 当用户点击扩展程序的 browser action 时,使用 portFromCS 向 content script 发送消息。

js
// background-script.js

let portFromCS;

function connected(p) {
  portFromCS = p;
  portFromCS.postMessage({ greeting: "hi there content script!" });
  portFromCS.onMessage.addListener((m) => {
    console.log("In background script, received message from content script");
    console.log(m.greeting);
  });
}

browser.runtime.onConnect.addListener(connected);

browser.browserAction.onClicked.addListener(() => {
  portFromCS.postMessage({ greeting: "they clicked the button!" });
});

浏览器兼容性

注意: 此 API 基于 Chromium 的 chrome.runtime API。本文档源自 Chromium 代码中的 runtime.json