【问题标题】:Chrome Extension: Interacting with iframe embedded within popupChrome 扩展程序:与弹出窗口中嵌入的 iframe 交互
【发布时间】:2015-09-19 13:28:51
【问题描述】:

我正在编写一个 Chrome 扩展程序,它需要与用户未打开的 url 进行交互。因此,我正在使用嵌入在弹出窗口中的隐藏 iframe,并尝试单击 iframe 中的按钮。但是,我收到了同源策略错误。我知道当 iframe 位于用户打开的选项卡上时,扩展程序可以通过内容脚本与不同域的 iframe 交互,但我不确定是否可以使用内容脚本与 iframe 交互直接在弹出窗口中。

这是我的代码:

ma​​nifest.json

"content_scripts": [


{
    "js": [ "bin/jquery.min.js", "interaction.js" ],
    "all_frames": true,
    "run_at": "document_start",
    "matches": [ "http://*/*",
                 "https://*/*" ]
  }],

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

interaction.js

$(document).ready(function() {
  $('div#iframes').append("<iframe id='shop' src='https://www.google.com/'></iframe>")
  $('iframe').bind("load", function() {
    $('iframe').contents().find("html").ready(function() {
      loadedStores += 1;
      if (loadedStores == carts.totalStores) {
        $('div#cost').append(carts.grandTotal)
        showMain();
      }
    })
  })
})

错误

Uncaught SecurityError: Blocked a frame with origin "chrome-extension://mapgjiofchdchalgcifmdolgcekfaadp" from accessing a frame with    origin "https://www.google.com/".  The frame requesting access has a protocol of "chrome-extension", the frame being accessed has a protocol of "http". Protocols must match.

错误发生在第三行的interaction.js中(带有加载回调)。有谁知道我应该对内容脚本进行任何更改以允许我与 iframe 交互?或者如果我应该采取其他方法?谢谢!

【问题讨论】:

  • 我更新了它以包含错误
  • 你为什么这样做?为什么使用旧的和可怕的 iframe ?由于 chrome 限制,您不能像这样注入 iframe。您可以做的是获取文件的内容,然后将其添加到您的 div 中
  • @EmrysMyrooin “是的,好吧,这就是你的意见,伙计。” “不能这样注入”是什么意思?
  • @Xan 我对这个主题有点不安,因为我正在处理这类事情......所以是的,我对此没有公正的意见。但是,更严重的是,使用 iframe 有很多限制。首先,当您向带有内容脚本的页面发送消息时,您无法选择目标 iframe。其次,您无法选择内容脚本所针对的 iframe(目前因为他们正在处理它)。并且您不能在内容来源不同的现有页面中添加 iframe。

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


【解决方案1】:

您的框架还将注入内容脚本。

您需要使用 Messaging 与该内容脚本进行通信,并使其执行您需要的操作。

这里有一些进一步的信息:

【讨论】:

  • 内容脚本是否真的注入到他的案例中?我的意思是,他在页面加载后附加了 iframe。 Chrome 会在页面加载后注入内容脚本吗?我从未测试过这种行为
  • 是的,它会被注入。
  • 您能告诉我如何做到这一点吗?像this 这样的其他堆栈溢出问题说这是不可能的。
  • 如果您的内容脚本在清单中定义(使用"allFrames": true),则应注入。我刚刚测试了它。如果你在后台运行它,连接到可能会有困难,但你可以通过让内容脚本启动连接来解决它。
  • 我的内容脚本确实有"allFrames": true。但是,它仍然遇到同源策略。我在弹出窗口(iframe)上运行它,所以我错过了什么吗?
猜你喜欢
  • 2012-05-07
  • 2023-01-02
  • 1970-01-01
  • 2011-09-27
  • 2013-10-26
  • 1970-01-01
  • 2012-03-08
  • 1970-01-01
  • 2011-06-12
相关资源
最近更新 更多