Chrome 扩展 - 从清单 v2 迁移到 v3

new*_*dev 6 javascript google-chrome manifest google-chrome-extension

我需要将一些 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'"
  }
}
Run Code Online (Sandbox Code Playgroud)

persistent如果我知道我需要删除并替换scriptsservice_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 )
  }
})
Run Code Online (Sandbox Code Playgroud)

有人可以帮我吗?

wOx*_*xOm 5

无需显式注册任何内容。
您所需要做的就是在manifest.json 中正确声明脚本。

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

  2. 在manifest.json中仅指定一个后台服务工作线程脚本

    "background": {
      "service_worker": "background.js"
    }
    
    Run Code Online (Sandbox Code Playgroud)

    该文件可以使用同步内置的importScripts加载内部的其他文件。

  3. 重新编写您的代码,使其不使用全局变量,例如payload切换到chrome.storage.local. 它仅支持 JSON 兼容类型(字符串、数字、布尔值、null 以及仅由这些类型递归组成的数组/对象),因此如果您的数据无法序列化,您将不得不强制服务工作人员持久保存