2014-01-30 59 views
0

我正在研究一個需要支持ajax請求的firefox插件。這些請求都將被髮送到「messagebeam.tagpulse.nl」域,所以我把它添加到權限的package.json這樣的:XMLHttpRequest.responseXML觸發'拒絕權限'異常

{ 
    "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如下(與內容類型:文本/ 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/[email protected]!/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

這是第一次看的代碼錯誤消息中提到的線是個好主意。這裏是resource://gre/modules/commonjs/sdk/content/content-worker.js,第81行 - 這是集成到瀏覽器中的附加SDK代碼。在Firefox 26中這行說:

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

此代碼屬於內容工作者的消息機制。 toJSON對正在序列化的對象正在called implicitly by JSON.stringify

顯然,訪問xmlhttp.responseXML不會觸發任何內容工作者事件。但是,console.log()確實 - 在content-worker.js中有問題的createPipe方法下方,您可以看到一個injectConsole方法。這爲內容工作者提供了console API,它將使用消息傳遞將任何呼叫轉發到主擴展代碼。

在這一點上的問題,應該是很明顯的:即使「真正的」 console.log()方法可以處理XMLDocument類型的參數,提供給內容工人缺一不可 - 預計可序列化到JSON對象。然而,調用console.log(xmlhttp.responseText)應該可以工作。此外,console.log(new XMLSerializer.serializeToString(xmlhttp.responseXML))可能工作(我不確定XMLSerializer constructor是否在工作環境中定義)。

+0

感謝您的詳細解答。這實際上是有道理的。但是,還有一個問題(完全相關)。我仍然無法'訪問'responseXML。我創建了一個新的Xml文檔並解析了responseText,它工作了(即console.log(xmlDoc.documentElement.childNodes [0] .nodeValue);顯示'text',但是執行console.log(xmlhttp.responseXML.childNodes [ 0] .nodeValue);仍然有一個權限被拒絕(在childNodes上)。有什麼想法? – Toverbal

+0

@Toverbal:不,不是真的 - 聽起來像是附加組件SDK使用的沙箱的副作用。值得[作爲附加SDK錯誤提交](https://bugzilla.mozilla.org/enter_bug.cgi?product=Add-on%20SDK)。 –

+0

我會這麼做的,我想知道他們對它的看法。再次! – Toverbal

相關問題