XMLHttpRequest.responseXML触发'权限被拒绝'异常

时间:2014-01-30 08:59:54

标签: ajax xmlhttprequest firefox-addon-sdk permission-denied

我正在开发一个需要支持ajax请求的firefox插件。请求将全部发送到'messagebeam.tagpulse.nl'域,因此我将其添加到package.json中的权限,如下所示:

{
    "name": "messagebeam",
    "title": "Message Beam for Android™",
    "id": "jid1-j831e5AVhpvjDA",
    "description": "With one click bidirectionally beam anything you want between Chrome and your Android device!",
    "permissions": {
        "cross-domain-content": ["http://messagebeam.tagpulse.nl/"]
    },  
    "author": "TwZ",
    "license": "MPL 2.0",
    "version": "0.3"
}

到目前为止一切顺利。在我的main.js中,我定义了一个(非常基本的)小部件和一个面板(在main.js中)来演示这个问题:

var testPanel = require("sdk/panel").Panel({
  width:430,
  height:500,
  contentURL: data.url("test.html"),
  contentScriptFile: [
                        data.url('scripts/jquery-2.1.0.js'),
                        data.url('test.js')
                      ]
});
var widgets = require("sdk/widget");
var tabs = require("sdk/tabs");
var widget = widgets.Widget({
  id: "test-popup",
  label: "Message Beam",
  contentURL: data.url("img/test.png"),
  panel: testPanel
});

test.html非常基本(没有内容):

<html>
    <head>
    </head>
    <body>
        No content
    </body>
</html>

test.js(产生权限被拒绝错误的实际代码):

$(document).ready(function() {
    xmlhttp=new XMLHttpRequest();
    xmlhttp.onreadystatechange=function() {
        if (xmlhttp.readyState==4 && xmlhttp.status==200) {
            console.log('finished');
            console.log(xmlhttp.responseXML);
            console.log('reported xml');
        }
    }
    xmlhttp.open("GET","http://messagebeam.tagpulse.nl/test/test2.php",true);
    xmlhttp.send(); 
});

返回的xml如下(内容类型:text / xml响应头,使用http://messagebeam.tagpulse.nl/test/test2.php测试):

<?xml version="1.0" encoding="UTF-8" ?>
<test>
  text
</test>

现在的问题是:为什么console.log(xmlhttp.responseXML)行会产生以下错误:

console.log: messagebeam: finished
System JS : ERROR resource://gre/modules/XPIProvider.jsm -> jar:file:///c:/users/js/appdata/local/temp/tmpfcjrsq.mozrunner/extensions/jid1-j831e5AVhpvjDA@jetpack.xpi!/bootstrap.js -> resource://gre/modules/commonjs/toolkit/loader.js -> resource://gre/modules/commonjs/sdk/loader/sandbox.js -> resource://gre/modules/commonjs/sdk/content/content-worker.js:81
                     Error: Permission denied to access property 'toJSON'

1 个答案:

答案 0 :(得分:1)

首先查看错误消息中提到的代码行是个好主意。这是resource://gre/modules/commonjs/sdk/content/content-worker.js,第81行 - 这是集成到浏览器中的附加SDK代码。在Firefox 26中,这一行说:

let str = JSON.stringify(args, replacer);

此代码属于内容工作者的消息传递机制。 <{1}}正在被序列化的对象called implicitly by JSON.stringify

显然,访问toJSON不会触发任何内容工作者事件。但是,xmlhttp.responseXML确实 - 在console.log()中有问题的createPipe方法正下方,您可以看到content-worker.js方法。这个为内容工作者提供injectConsole API,它将使用消息传递转发对主扩展代码的任何调用。

此时问题应该是显而易见的:即使“真正的”console方法可以处理类型console.log()的参数,提供给内容工作者的参数也不能 - 它期望一个对象可以被序列化为JSON。但是,调用XMLDocument应该可行。此外,console.log(xmlhttp.responseText)可能有用(我不确定是否在工作人员上下文中定义了XMLSerializer constructor)。