使用 userScripts

警告:这是已弃用的 userScripts API 的文档。它在 Manifest V2 的 Firefox 中可用。有关在 Manifest V3 中支持用户脚本的功能,请参阅新的 userScripts API。

通过实现 userScripts,扩展开发者可以修改站点的外观和/或功能,以更好地满足用户需求。

按照以下步骤在您的扩展中实现 userScripts

  1. 在扩展的 manifest 中使用 "user_scripts" 键定义脚本。
  2. 注册 userScript
  3. 实现 userScript 函数

让我们通过一个小型示例 Web 扩展来逐步了解这些过程。该示例可在 GitHub 上的 webextensions-examples 仓库中找到。

userScripts Manifest

userScript 由扩展 manifest 的 user_scripts 键的内容标识。user_scripts 键的最低信息是

json
  "user_scripts": {
    "api_script": "customUserScriptAPIs.js"
  }

"api_script" 属性指示包含 userScript 代码的 JavaScript 文件的路径。

加载示例扩展

下载示例后

导航到 about:debugging,点击 **Load Temporary Add-on…**,然后双击扩展的 manifest。

示例中包含的默认代码允许您加载一个 userScript,该脚本将“吃掉”与 Hosts 条目匹配的页面的内容。在点击面板底部的 **Register script** 按钮之前,请进行任何您想做的更改。

在下面的图片中,该扩展将“吃掉”域名以 .org 结尾的页面的内容。这是此扩展的默认行为。

User script example

在您点击 **Register script** 按钮之前,什么都不会发生。该按钮将根据此对话框上的设置实现 user script。这意味着您可以尝试脚本的行为,而无需自己实现扩展。

注册 userScript

在 userScript 可以执行之前,必须使用 userScripts.register() 方法对其进行注册。以下是注册示例扩展的代码

js
async function registerScript() {
  const params = {
    hosts: stringToArray(hostsInput.value),
    code: codeInput.value,
    excludeMatches: stringToArray(excludeMatchesInput.value),
    includeGlobs: stringToArray(includeGlobsInput.value),
    excludeGlobs: stringToArray(excludeGlobsInput.value),
    runAt: runAtInput.value,
    matchAboutBlank: stringToBool(matchAboutBlankInput.value),
    allFrames: stringToBool(allFramesInput.value),
    scriptMetadata: { name: scriptNameInput.value || null },
  };

  // Store the last submitted values to the extension storage
  // (so that they can be restored when the popup is opened
  // the next time).
  await browser.storage.local.set({
    lastSetValues: params,
  });

  try {
    // Clear the last userScripts.register result.
    lastResultEl.textContent = "";

    await browser.runtime.sendMessage(params);
    lastResultEl.textContent = "UserScript successfully registered";
    // Clear the last userScripts.register error.
    lastErrorEl.textContent = "";

    // Clear the last error stored.
    await browser.storage.local.remove("lastError");
  } catch (e) {
    // There was an error on registering the userScript,
    // let's show the error message in the popup and store
    // the last error into the extension storage.

    const lastError = `${e}`;
    // Show the last userScripts.register error.
    lastErrorEl.textContent = lastError;

    // Store the last error.
    await browser.storage.local.set({ lastError });
  }
}

此代码首先初始化 params 对象,以便将值传递给 userScripts.register 方法。

实现 userScript 函数

脚本注册后,导航到一个域名以 .org 结尾的页面,您将看到类似以下内容

Status message indicating that websites ending in .org have been eaten: "This page has been eaten. {"OldStoredValue:" "website address", "NewStoredValue:" "website address"}"

另见