javascript - 浏览器扩展 (CrossRider) iframe 来源和父访问

标签 javascript google-chrome iframe same-origin-policy crossrider

我目前正在与 Crossrider 一起开发扩展。我现在正在使其在 IE 和 Chrome 上也能运行。该扩展将 IFrame 添加到每个页面作为侧边栏,并通过 iframe 与父窗口进行交互。为了实现这项工作,我使用 Crossriders“建议”使用 iframe 的数据编码 block 而不是 URL 来解决同一域的安全问题。

这在 Firefox 中有效(并且在 IE 中也有一些黑客攻击),但是在 Chrome 中我遇到了以下问题:

Blocked a frame with origin "null" from accessing a cross-origin frame.

据我所知,解决这个问题的唯一方法是实际上位于同一个域(不可能,因为该插件适用于每个网站)或使用跨窗口消息传递(因为我们与父级有丰富的交互)高架)。所以我的问题是,如何配置覆盖或其他任何内容来修复 Chrome 的此问题,有办法吗?作为一种快速解决方案,它甚至可以是我必须在 Chrome 中进行的设置。

但总的来说,我认为应该有办法解决这个问题,因为最终我已经拥有对浏览器的完全访问权限,因为安装了扩展程序,所以我认为我应该能够以某种方式覆盖它?

最佳答案

一般来说,iframe 受到浏览器实现的安全策略的保护。因此,iframe 和在其父页面上运行的扩展之间进行交互的最简单方法是在它们之间发送消息。

您可以通过在 IDE 中启用(设置>)在 Iframe 中运行功能来实现此目的,然后在 extension.js 中区分 iframe 及其父级代码。以下示例应该可以帮助您理解总体思路:

extension.js:

appAPI.ready(function($) {
  if (appAPI.dom.isIframe()) {
    // iframe code
    appAPI.message.addListener(function(msg) {
      if (msg.action === 'someAction') {
        ...
        // send response
        appAPI.message.toCurrentTabWindow({
          action:'otherAction',
          response:'otherResponse'
        });
      }
    });
    // end iframe code
    return;
  }
  // Parent window code
  appAPI.message.addListener(function(msg) {
    if (msg.action === 'otherAction') {
      ...
      // send response
      appAPI.message.toCurrentTabIframes({
        action:'someAction',
        response:'someResponse'
      });
    }
  });
});

有关示例中使用的方法的更多信息,请参阅 appAPI.dom.isIframe , appAPI.message.toCurrentTabIframes ,和appAPI.message.toCurrentTabWindow .

[披露:我是 Crossrider 员工]

关于javascript - 浏览器扩展 (CrossRider) iframe 来源和父访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31379866/

相关文章:

Android Webview 性能差异

javascript - 如何显示在 iframe 中呈现的 html 文件的源代码

javascript - 在 PhantomJS 中循环创建页面对象

javascript - 显示来自 http get 请求的 PNG

css - Canvas 边缘的 SVG 蒙版为 "bleeding"

javascript - Firefox 的 monitorEvents() 等价物是什么?

javascript - 如何从 iFrame 中获取文本值

javascript - Iframe 内容不显示在 IE 上

javascript - 如何在 Vue JS 中使用按字母顺序返回数组

javascript - 对不同的类重复一段javascript代码,无需重复代码