在Firefox OS设备上通过AJAX执行脚本

时间:2013-11-18 16:23:49

标签: javascript jquery ajax firefox-os

我的问题是关于应用CSP https://developer.mozilla.org/en-US/Apps/CSP

这里说所有远程脚本,内联脚本,javascript URI和其他安全问题都无法在Firefox OS应用程序上运行。

所以,我尝试下载我的应用程序所必需的脚本(Flurry和Ad服务),但这两种方法都无法在设备上运行。我打电话的方式是使用AJAX,这样我就可以避免脚本编写的远程和内联脚本。在模拟器中工作得很好,但在设备上,广告永远不会显示,而Flurry会话永远不会开始。

以下是我为Flurry进行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 });

与在AJAX调用中使用xhrFields {mozSystem:true}相同。

我认为这不是一个跨域问题,因为在我的应用程序的其余部分中,我调用了不在我的域中的xml文件,并且成功返回了调用。

所以,我的问题是,Firefox OS应用程序可以执行通过AJAX下载的脚本吗?有办法解决这个问题吗?

感谢您的时间。

PS:我忘了添加我的应用程序是特权,以防你问

4 个答案:

答案 0 :(得分:2)

我认为这是一个安全的功能,对你的问题的简短回答是否定的。引用您链接到自己的CSP文档:

  

您无法指向远程JavaScript文件。这意味着您引用的所有JS文件都必须包含在您的应用程序包中。

如果从远程服务器使用ajax加载JS文件,则该JS不包含在您的应用程序包中。您应该小心遵守CSP限制。在没有完全遵守CSP的情况下进行开发时,可以在模拟器甚至手机中使用很多东西,但这并不意味着它没问题。当您将来将应用程序提交到任何可靠的市场(例如Firefox Marketplace)时,将仔细审核以确保它不违反CSP限制。作为一般的经验法则,我认为任何动态评估JS代码的尝试都会带来安全风险,并且很可能被CSP法规禁止。

答案 1 :(得分:0)

首先,我会指出你的两个例子are not equivalent

$.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:网址实现此目标,但是:

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不允许的事情,那么你肯定是运气不好。

答案 2 :(得分:0)

您必须使用mozSystem和mozAnon属性,例如:

var xMLHttpRequest = new XMLHttpRequest({             mozAnon:是的,             mozSystem:是的         });

答案 3 :(得分:0)

很遗憾这是一个问题,我希望得到loadScript工作,因为firefoxOS是一个环境,而在我的应用程序中所有的应用程序代码都是HTML5和本地的,当前的规则是需要加载的所有脚本一次性内存,除非你url加载一个完整的页面,这意味着你不能在网站周围有一个持久包装器,并在需要时在带有相关脚本的页面中使用ajax。你会想到firefox至少会为脚本启用本地延迟加载。适用于chrome,但不适用于Firefox。