2013-02-15 47 views
0

(交叉贴here打开和写入到一个新的窗口

嗨,

我有一个沙箱页面(在我的清单中指定的),它加载到一个iframe中我的分机的背景页面。从我的沙盒页面中,我想打开一个新窗口并写入它,即:

var win = window.open(); win.document.write('< p & gtHello!</p >');

这适用于我的扩展的后台页面和常规网页,但是当从内容脚本或我的沙盒页面调用时,窗口会打开,但我无法访问win对象(已定义,但为空)--- console .log输出“窗口{}”)。

我认为这是由于同源策略(每个窗口在沙箱环境内都被赋予一个uinque源)。然而,由于窗口打开about:空白页面,我很困惑为什么这会很重要。

这是功能吗?有没有一个参数可以添加到我的清单中以避免这种情况?有没有人知道不涉及使用postMessage回到我的背景页面的解决方法?我的理想解决方案是让我的沙盒脚本打开一个新窗口并直接与它交互,而不是通过消息传递。

我可以提供一个完整的例子,如果有必要,但我希望有人可能只是知道他们的头顶。如果有帮助,我在Mac上运行Chrome 24.0.1312.57,在Ubuntu上运行24.0.1312.68。

感谢,

汉克

回答

0

每交叉后here,这个问题确实是打开的窗口被赋予独特的起源。标准工作组(SWG)的成员认为,对于以下内容不应例外:在继承沙盒原点的空白页面上更安全一些,这是故意的。

但是,为了解决这个问题,至少为了我的目的,我可以使用下面的方法。首先,忘记沙箱。此解决方法使用嵌入在背景页面中的iframe,其src url设置为data:text/html,...。这给iframe一个独特的起源,所以它不再处于扩展空间。这意味着可以使用eval,并且不能访问chrome apis。与沙盒不同,从iframe打开的窗口与iframe的起源相同,从而允许访问创建的窗口。例如:

在后台HTML页面:

<html> 
<head> 
    ... 
    <script src="background.js"></script> 
    ... 
</head> 
<body> 
    ... 
    <iframe id="myframe"></iframe> 
    ... 
</body> 
</html> 

在background.js:

... 
document.getElementById('myframe').setAttribute('src', 'data:text/html,'+ 
    encodeURI('<html><head>'+ 
    '<script src='+chrome.extension.getURL('jquery.js')+'></script>'+ 
    '<script src='+chrome.extension.getURL('myscript.js')+'></script>'+ 
    ... 
    '</head><body></body></html>' 
)); 
... 

在myscript.js

jQuery(document).ready(function(){ 
    ... 
    // To receive messages from background.js. 
    window.addEventListener('message', function(e){ ... }); 

    // To send messages to background.js. 
    parent.postMessage({...}, '*'); 

    // To open AND ACCESS a window. 
    var win = window.open(); 
    win.document.write('Hello'); // Fails in sandbox, works here. 

    // Eval code, if you want. Can't do this from an extension 
    // page loaded normally unless you allow eval in your manifest. 
    // Here, it's okay! 
    eval('var x = window.open(); x.document.write("Hi!")'); 

    // No chrome apis. 
    chrome.log(chrome.extension); // -> undefined 
    chrome.log(chrome.windows); // -> undefined 

    // No direct access to background page (e.g., parent). 
    chrome.log(parent); // -> Window with no properties. 
    ... 
}); 
0

内容脚本,顾名思义,是您加载,所以我真的不知道怎么你的脚本可以“常规网页”上工作的外部一般网页的一部分,但而不是内容脚本。你的意思是说,当你将代码嵌入到自己的页面中时,代码能够正常工作,而不是通过内容脚本嵌入到其他页面中?

无论如何,如果脚本在您的背景页面上正常工作,您可以随时尝试发送消息。 (更多在这里:http://developer.chrome.com/extensions/messaging.html

脚本为您的沙箱/ contentscript:

//send message to background page 
chrome.extension.sendMessage({todo: "newWindow"}); 

在后台页面:

//create a listener 
chrome.extension.onMessage.addListener(
    function(request, sender) { 
    if (request.todo === "newWindow") { 
    //do your stuff here 
     var win = window.open(); win.document.write('<p&gtHello!</p>'); 
    } 
    }); 
+0

我的意思是, ,如果你写一个网页,完全忽略扩展es'var win = window.open(); win.document.write('<p> Hello!</p >')',它按预期工作。但是,从我的扩展中的沙箱内,情况并非如此。在我的交叉帖子后面,来自chrome团队的人证实了这个问题,即从沙箱打开的任何窗口都有唯一的来源。 – Hank 2013-02-16 16:24:31