Chrome扩展程序:在页面加载之前注入JS

Ian*_*ber 29 javascript google-chrome google-chrome-extension

是否可以在页面加载之前注入JS,还是需要使用内容脚本和文档完成的方式?

例如,是否有更快的方式来执行JS,一旦打开页面就会将页面变为红色?

Rob*_*b W 47

在清单文件中声明内容脚本,"run_at": "document_start"以使其尽快运行,即在构建文档根目录之后(当时<head>尚不存在).

对于您的特定示例,最好是声明内容样式,类似于内容脚本,但使用"css"键而不是"js".

如果要尽快动态运行脚本,则chrome.tabs.executeScriptchrome.webNavigation.onCommitted触发事件时调用.

  • @RobW,该文档另外写道“*如果通过 Chrome Instant 或 Instant Pages 触发导航,则完全加载的页面将交换到当前选项卡*”。在这种情况下,是否仍然可以在任何网页代码运行之前运行脚本来用我自己的代理 win 对象替换网页的“window”对象? (2认同)
  • 顺便说一句,清单的 document_start 内容脚本将在 `chrome.webNavigation.onCommissed` 之前运行,但它无法访问 bg 可用的 chrome 函数。对于bg来说,`chrome.webNavigation.onCommited`仍然是最早的方式。 (2认同)

Chr*_*her 7

对于 Manifest V3,102.0.5005.58 稳定版的内容脚本中添加了一个新字段:world

还有很多与该主题相关的 chrome 错误:#634381#1054624#1207006

您必须"world": "main"将内容脚本与"run_at": "document_start"CSP 一起使用,以允许从扩展注入。否则注入的脚本会被拒绝:

拒绝执行内联脚本,因为它违反了以下内容安全策略指令:“script-src 'self' 'wasm-unsafe-eval'”。启用内联执行需要“unsafe-inline”关键字、哈希值(“sha256-*”)或随机数(“nonce-...”)。

“世界”:“主要”:

[扩展] 为动态内容脚本添加主世界注入

此 CL 为动态内容脚本添加了一个新字段“world”,它允许扩展指定脚本是否将在隔离世界或主世界中运行。默认情况下,未指定此字段的脚本将在隔离世界中运行。

有效属性为"ISOLATED"(默认)或"MAIN".

我使用的示例文件:

清单.json

{
  "name": "script injection",
  "version": "0",
  "manifest_version": 3,
  "minimum_chrome_version": "103.0",
  "content_scripts": [
    {
      "matches": ["*://*/*"],
      "js": ["inject.js"],
      "run_at": "document_start",
      "world": "MAIN"
    }
  ],
  "web_accessible_resources": [{
    "resources": ["injected.js"],
    "matches": ["<all_urls>"]
  }],
  "content_security_policy": {
    "extension_pages": "default-src 'self' 'wasm-unsafe-eval';"
  }
}
Run Code Online (Sandbox Code Playgroud)

注入.js

let el = document.createElement("script");
el.src = chrome.runtime.getURL("injected.js");
document.documentElement.appendChild(el);
console.log("injected");
Run Code Online (Sandbox Code Playgroud)

注入.js

console.log(typeof alert); // "function"
console.log("injected file");
delete window.alert;
console.log(typeof alert); // "undefined"
Run Code Online (Sandbox Code Playgroud)

[在此输入图像描述]