我正在开发一个需要支持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'
答案 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)。