我的问题关于应用CSP https://developer.mozilla.org/en-US/Apps/CSP
这表示,所有的远程脚本,内联脚本,javascript中的URI,和其他安全问题不会在一个Firefox OS的应用程序工作。
所以,我试图下载一个脚本,需要我的应用程序(乱舞和广告服务),并没有在设备上是可行的。 我提出的要求的方式是用AJAX,这样,我会避免遥控器和内嵌脚本,这两个脚本换货。 在模拟器完美的作品,但在设备上的广告从不显示,从来没有开始乱舞会议。
这里是我做的AJAX调用的乱舞我的代码的一部分:
$.ajax({
url: 'https://cdn.flurry.com/js/flurry.js',
dataType: "script",
xhrFields: {
mozSystem: true
},
success: function(msg){
console && console.log("Script de Flurry: luego de la descarga en AJAX "+msg);
flurryLibrary = true;
FlurryAgent.startSession("7ZFX9Z4CVT66KJBVP7CF");
},
error:function(object,status,errortxt){
console && console.log("The script wasn't downloaded as text. The error:" +errortxt);
flurryLibrary = false;
},
always: function(object,status,errortxt){
console && console.log("The script may or may not be downloaded or executed. The error could be:" +errortxt);
}
});
在我的应用我使用systemXHR许可,并为使用该行的其他网站的电话:
request = new XMLHttpRequest({ mozSystem: true });
至极相同使用xhrFields {mozSystem:真正}在AJAX调用。
我相信这不是一个跨域问题,因为在我的应用程序的其余部分我做出不在我的域名的XML文件的调用,并调用成功地返回。
所以,我的问题是,可以在火狐OS的应用程序执行,它们通过AJAX下载的脚本? 有没有办法来解决这个问题呢?
感谢您的时间。
PS:我忘了补充一点,我的应用程序是特权,以防万一你问
我认为是一个安全功能和短回答你的问题就没有。 引用你链接到自己的CSP文档:
你不能在远程JavaScript文件指向一个。 这意味着,您引用的所有JS文件必须包含在你的应用的程序包。
如果您使用从远程服务器的AJAX,那JS不包含在你的应用程序包加载JS文件。 你应该小心遵守CSP的限制。 这是可能得到的东西在模拟器甚至手机工作时不完全符合于CSP发展,但这并不意味着它是确定。 当您在将来提交应用到任何可信的市场(如Firefox市场),将仔细审查,以确保它不违反CSP限制。 作为一般的经验法则,我会说,在动态评估JS代码的任何尝试都将是一个安全隐患,最有可能通过CSP法规禁止的。
首先,我要指出的是,你的两个例子是不等价的 。
$.ajax({
xhrFields: {
mozSystem: true
},
});
是相同的
request = new XMLHttpRequest();
request.mozSystem = true;
这是不一样的
request = new XMLHttpRequest({ mozSystem: true });
相反,我们可以按照链接错误报告的建议,并在运行应用程序加载时间如下:
$.ajaxSetup( {
xhr: function() {
return new window.XMLHttpRequest( {
mozSystem: true
} );
}
} );
单单这应该可以解决您的问题。 但是,如果它不工作,那么这里下一个解决方法是获取脚本资源为纯文本 ,然后加载文本内容为脚本。
然而,内嵌脚本和data:
URL对于特权的Firefox OS应用禁地。 我们仍然可以通过实现这个目标blob:
URL,但是:
window.URL = window.URL || window.webkitURL;
var request = new XMLHttpRequest({ mozSystem: true });
request.open("GET", "https://cdn.flurry.com/js/flurry.js");
// when the Ajax request resolves, load content into a <script> tag
request.addEventListener("load", function() {
// make a new blob whose content is the script
var blob = new Blob([request.textContent], {type: 'text/javascript'});
var script = document.createElement('script');
script.src = window.URL.createObjectURL(blob);
// after the script finishes, do something else
script.addEventListener("load", function() {
flurryLibrary = true;
FlurryAgent.startSession("7ZFX9Z4CVT66KJBVP7CF");
});
document.body.appendChild(script);
});
但是,如果脚本本身并没有什么用CSP允许的,那么你肯定是出于运气。
您必须使用mozSystem和mozAnon特性,例如:
变种的XMLHttpRequest =新的XMLHttpRequest({mozAnon:真,mozSystem:真});
它是一种耻辱,这是一个问题,我希望在得到loadScript工作,作为firefoxOS是一个环境,在我的应用,该应用程序代码是HTML5和地方,目前的规则是所有的脚本需要在内存中加载一个出手,除非你的网址加载整个页面,这意味着在需要的时候,你不能在工地附近的一个persisten包装和Ajax在矿井用的产生密切相关脚本的网页。 你会想到,火狐将至少启用了脚本本地延迟加载。 工作在铬,但不是在Firefox浏览器。