【问题标题】:Chrome extension - migrate from manifest v2 to v3Chrome 扩展 - 从清单 v2 迁移到 v3
【发布时间】:2021-03-26 10:38:08
【问题描述】:

我需要将一些 chrome 扩展迁移到清单 v3。我有一个扩展,它使用后台脚本来拦截一些 ajax 请求以获取相关视频文件。我已经开始修改清单文件,但我不确定如何处理清单 background 部分,它是相关的 JavaScript 文件。

目前我已经以这种方式修改了清单:

{
  "manifest_version": 3,
  "name": "__MSG_extName__",
  "description": "__MSG_extDescription__",
  "default_locale": "en",
  "permissions": [
    "tabs",
    "activeTab",
    "webRequest"
  ],
  "host_permissions": [
    "https://*"
  ],
  "icons": {
    "16": "icons/16.png",
    "48": "icons/48.png",
    "128": "icons/128.png"
  },
  "background": {
    "scripts": [
      "js/background.js"
    ],
    "persistent": true
  },
  "web_accessible_resources": [{
    "resources": ["room.html"]
  }],
  "action": {},
  "version": "2.1.0",
  "content_security_policy": {
    "extension_pages": "script-src 'self' ; object-src 'self'"
  }
}

如果我知道我需要删除 persistent 并将 scripts 替换为 service_workers 这是一个字符串,我不清楚如何修改背景部分?

对于 background.js 文件内容,我不知道它是否会按原样工作,或者我是否需要注册服务人员?

//
let payload = {}

chrome.runtime.onInstalled.addListener(function() {
  chrome.declarativeContent.onPageChanged.removeRules(undefined, function() {
    chrome.declarativeContent.onPageChanged.addRules([
      {
        conditions: [
          new chrome.declarativeContent.PageStateMatcher({
            pageUrl: { urlMatches: 'www.mywebsite.com/video/*', schemes: ["https"] },
          })
        ],
        actions: [ new chrome.declarativeContent.ShowPageAction() ]
      }
    ]);
  });
});

//
chrome.runtime.onInstalled.addListener( () => {
  chrome.tabs.create({
    url: browser.runtime.getURL('instructions.html')
  })
})

//
chrome.runtime.onUpdateAvailable.addListener( () => {
  chrome.runtime.reload()
})

//
chrome.pageAction.onClicked.addListener( () => {
  chrome.windows.create({
    url: browser.runtime.getURL('popup.html'),
    width: 500,
    height: 295,
    type: 'popup'
  })
})

//
chrome.webRequest.onCompleted.addListener( (details) => {
  payload.url = details.url
},{
  urls: ["https://*.akamaihd.net/*/index_0_av.m3u8*"],
  types: ["xmlhttprequest"]
},["responseHeaders"])

chrome.webRequest.onCompleted.addListener( (details) => {
  payload.streamInfo = details.url
},{
  urls: ["https://*.mywebsite.com/video/*/*.json*"],
  types: ["xmlhttprequest"]
},["responseHeaders"])

// 
chrome.runtime.onMessage.addListener( (message) => {
  console.log(message)
  if( message.action === 'openPopup' ){
    chrome.windows.create({
      url: browser.runtime.getURL('popup.html'),
      width: 500,
      height: 295,
      type: 'popup'
    })
  }
  if( message.status === 'ready' ){
    chrome.runtime.sendMessage( payload )
  }
  else if( message.status === 'refresh' ){
    chrome.runtime.sendMessage( payload )
  }
})

谁能帮帮我?

【问题讨论】:

    标签: javascript google-chrome google-chrome-extension manifest


    【解决方案1】:

    无需显式注册任何内容。
    您只需在 manifest.json 中正确声明脚本即可。

    1. 如果您希望扩展程序在 Chrome 92 或更早版本中运行,请将后台服务工作者脚本移至扩展程序根目录。这是您的 manifest.json 所在的位置。

    2. 在 manifest.json 中只指定一个后台服务工作者脚本

      "background": {
        "service_worker": "background.js"
      }
      

      这个文件可以使用同步内置的importScripts来加载里面的其他文件。

    3. 修改您的代码,使其不使用像payload 这样的全局变量,方法是切换到chrome.storage.local。它仅支持与 JSON 兼容的类型(字符串、数字、布尔值、null 和仅由这些类型递归组成的数组/对象),因此如果您的数据无法序列化,您将不得不force the service worker to persist

    【讨论】:

    • 感谢您的帮助。目前我需要 payload 变量将提取的 url 传递回前端,但我不需要存储它,因为它每次都会根据用户选择的视频文件而改变。如果我把它放在那里会是个问题吗?
    • Service Worker 会在 30 秒后自动终止(如果没有打开的消息通道),因此如果您在此时间跨度内使用该变量不会有任何问题。当然,在 Chrome 开发人员决定更改超时之前,但这不太可能。
    • 我需要在迁移后测试扩展,但我认为 30 秒对于变量的范围来说是可以的。还有一件事,我需要将pageAction 迁移到文档中报告的操作吗?
    • 谢谢。我正在测试更改,并且目前正在 macOS 的 chrome 87 上测试某些东西目前无法正常工作,这是因为目前清单 v3 似乎只在开发通道上工作。我将开始修改我的扩展,当 v3 完全实施时,我将在 CWS 上更新它们
    • 请注意,Chrome 现在可以从嵌套目录加载后台服务人员(该错误已在 5 月修复)。
    猜你喜欢
    • 1970-01-01
    • 2020-11-28
    • 2022-10-20
    • 2021-09-16
    • 2021-09-30
    • 2015-07-06
    • 2023-02-14
    • 2021-09-21
    • 1970-01-01
    相关资源
    最近更新 更多