针对Chrome扩展的iFrame的跨源问题

时间:2016-10-14 17:13:28

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

我正在尝试为Google Hangouts中的自动拨号编写Chrome扩展程序,因此我不必为每次会议输入我的会议桥接号码。将它们保存起来会很高兴......无论如何,我的概念类似于工作,但我试图解决跨源问题。

当您在Google环聊中拨打电话时,请从联系页面开始,然后输入您要拨打的号码。当您按Enter键或单击"拨打电话"时,拨号器将加载到iFrame中。在我的Chrome扩展程序中,我可以获得对iFrame的引用,但框架位于域" plus.google.com",我的脚本正在访问" hangouts.google.com& #34;

我知道他们都在google.com父域名下,因此我尝试允许我的Chrome扩展程序访问框架,以便在框架内的拨号器按钮上执行.click()。 s contentWindow。

在Chrome扩展程序的内容脚本中,我从父页面中选择iframe元素并设置为名为iframe的变量。

var iframe = $("div iframe")[0];

我可以设置

document.domain = "google.com";

没有问题,但是当我尝试

iframe.contentWindow.document.domain = "google.com";

我得到了

content.js:3 Uncaught SecurityError: Blocked a frame with origin 
"https://hangouts.google.com" from accessing a frame with origin 
"https://plus.google.com". The frame requesting access set "document.domain" to 
"google.com", but the frame being accessed did not. Both must set 
"document.domain" to the same value to allow access.

我已尝试放宽扩展程序中的内容安全政策,但也许我做得不对:

  "content_security_policy": "script-src 'self' https://google.com; object-src 'self'",
  "permissions": [
    "http://*/",
    "tabs"
  ]

有没有办法解决这个问题?

1 个答案:

答案 0 :(得分:0)

在这种情况下,添加权限或放宽CSP将无济于事。

您需要在iframe中使用内容脚本的第二个实例来操作其跨域文档。

确保使用"all_frames": true注入内容脚本。

您可以使用iframe.contentWindow.postMessage在内容脚本之间进行通信。