【问题标题】:Chrome Content script injection in MHTML filesMHTML 文件中的 Chrome 内容脚本注入
【发布时间】:2015-09-23 15:44:48
【问题描述】:

Chrome 似乎没有将内容脚本注入到 MHTML 类型的本地文件中。出于安全原因,他们可能会这样做。它们也不允许您下载具有 MHTML 扩展名的文件。所以这让我很怀疑。

如果本地文件类型是 HTML,我的内容脚本会被正确注入。

这是我的清单:

"content_scripts": [
    {
        "matches": [ "http://*/*", "https://*/*", "file://*/*", "<all_urls>" ],
        "run_at": "document_start",
        "js": [
            "js/contentscript.js"
        ]
    }
],

"permissions": [ "tabs", "http://*/*", "https://*/*"],

在扩展管理页面我也检查了:

[x] Allow Access to file URLs

最后我得到的错误:

test1.mhtml:1 Blocked script execution in 'file:///Users/test/Downloads/test1.mhtml' 
because the document's frame is sandboxed and the 'allow-scripts' permission is not set.

有没有办法解决这个问题并将我的脚本注入 .mhtl 文件?

更新: Here is a simple test extension 显示脚本注入和测试 mhtml 文件。确保在扩展管理页面中选中此复选框。 [x] 允许访问文件 URL

更新 2: 找到了。这是一个chrome错误https://code.google.com/p/chromium/issues/detail?id=452901

更新 3: 所以看起来它可以工作,但是当文件类型为 MHTML 时,chrome 调试器不会在 UI 中显示内容脚本文件。

【问题讨论】:

  • 您好,您是查看 chrome 代码还是在猜测?保存在 MHTML 中需要一个 chrome 标志。但是从文件系统打开一个就可以了。下载 mhtml 也被阻止。我真的希望注入内容脚本能够正常工作。 :-(也许不是
  • 您是仅使用 mhtml 提取数据,还是还与页面交互,例如,填写 input 元素?我可以完美地从 mhtml 文件中提取数据,但我无法填写表格,无论是手动还是通过 puppeteer。
  • 这确实很旧,但我记得 chrome 团队明确阻止了在 mhtml 页面中运行内容脚本。他们说是为了安全?您是说现在您可以将内容脚本注入这些 mhtml 页面吗?你是从文件中加载这些吗?
  • 在我的情况下略有不同,因为我正在使用 puppeteer (stackoverflow.com/q/61800030/4694994) 编写 e2e 测试;没有扩展。我通过在页面的每一帧上运行eval 来插入脚本,并将函数附加到window。尽管浏览器随后会记录不允许执行脚本,但它仍然可以工作。感谢您就这么老的话题回复我。 :-)

标签: google-chrome-extension content-script mhtml


【解决方案1】:

内容脚本通过标准声明添加,例如:

"content_scripts": [
    {
        "matches": [ "<all_urls>" ],
        "run_at": "document_end",
        "js": ["content.js"]
    }
],

注意事项:

  • 它不会显示在 Chrome 开发工具 -> 源 -> 内容脚本面板中,这似乎是一个错误。
  • MHTML 有一些限制,因此某些功能可能无法使用,请在任何地方使用 console.log

【讨论】:

  • :-( 我累了。但这不起作用。在 chrome 调试器的内容脚本选项卡中没有注入任何内容。但是@wOxxOm 我还有一个问题要问你,我认为答案是 all_frames=是的,但是那个也不起作用。如果您不介意,请看一下这个老问题。stackoverflow.com/questions/11395168/…
  • 内容脚本被注入,调试器根本不显示。
  • 嗯。我不这么认为。这里我做了一个简单的测试。 dropbox.com/s/71zz1jin90qjyfn/extension_permission_bug.zip?dl=0
  • @DavidDehghan,如果在脚本开头使用调试器和 console.log,您会注意到您只需删除 $(...) 包装器,因为它永远不会执行,因为您的内容脚本被注入document_end。实际上"all_frames": true 是不需要的。整个问题是由$()的错误使用引起的。
  • 我想自己开枪。 :-( 你是绝对正确的。我在这件愚蠢的事情上损失了 4-5 小时。我非常感谢你没有放弃这一点。
猜你喜欢
  • 2016-08-20
  • 1970-01-01
  • 1970-01-01
  • 2012-04-12
  • 2022-11-07
  • 2023-02-26
  • 1970-01-01
  • 1970-01-01
  • 2011-10-31
相关资源
最近更新 更多