在firefox附加组件中嵌入SWF文件(无SDK)

时间:2014-04-03 18:53:13

标签: firefox-addon

我正在开发一个firefox扩展的问题。

我需要在页面中添加一个SWF文件。如果我从远程服务器加载它,它可以正常工作:

myObj2.setAttribute("data",'http://www.mySite.com/myFile.swf');
myPar1.setAttribute("value",'http://www.mySite.com/myFile.swf');

它工作正常,但不接受审查。

所以我在清单中创建了一个资源目录:

resource   ldvswf   swf/

并将脚本更改为:

myObj2.setAttribute("data",'resource://ldvswf/myFile.swf');
myPar1.setAttribute("value",'resource://ldvswf/myFile.swf');

但它不起作用。文件夹资源:// ldvswf没关系,因为我测试了加载图像,我看到了。

评论员写信告诉我,对于flash文件,它“需要通过文件:URL”这样做,但我不知道如何管理,我测试过:

'file: resource://ldvswf/myFile.swf'
'file://resource://ldvswf/myFile.swf'
'file://ldvswf/myFile.swf'
'file: ldvswf/myFile.swf'

没有任何作用。

对正确道路的任何建议?

非常感谢!
纳迪亚

更新:编辑写信给我:

您需要一个指向实际文件的文件URL。如果您的扩展程序已解压缩,则应执行以下操作:

Services.io.newFileURI(Services.io.newURI("resource://ldvswf/myFile.swf", null, null)
                              .QueryInterface(Ci.nsIFileURL).file)
          .spec 

但我不明白如何替换它:

myObj2.setAttribute("data",'http://www.mySite.com/myFile.swf');
myPar1.setAttribute("value",'http://www.mySite.com/myFile.swf');

我做了一些测试:

var file = Services.io.newFileURI(Services.io.newURI("resource://ldvswf/myFile.swf", null, null).QueryInterface(Ci.nsIFileURL).file).spec ;

myObj2.setAttribute("data",file);
myPar1.setAttribute("value",file);

但我收到此错误消息:
错误:NS_NOINTERFACE:组件返回失败代码:0x80004002(NS_NOINTERFACE)[nsIFileURL.file]

3 个答案:

答案 0 :(得分:1)

您是否尝试在contentaccessible=yes中使用chrome.manifest,如下所示:

content  package_name   content/ contentaccessible=yes

我在本地网页上用图片测试了它并且它有效,不知道SWF:

<img src="chrome://package_name/skin/window.png"/>

另一种方法是获取 chrome:// (非资源://)文件的文件URI,如下所示:

function chromeToPath (aPath){
    if (!aPath || !(/^chrome:/.test(aPath))){
       return null; //not a chrome url
    }
    var Cc = Components.classes, Ci = Components.interfaces;
    var spec, url, file;
    var ios = Cc['@mozilla.org/network/io-service;1'].getService(Ci["nsIIOService"]);
    var uri = ios.newURI(aPath, "UTF-8", null);
    var crs = Cc['@mozilla.org/chrome/chrome-registry;1'].getService(Ci["nsIChromeRegistry"]);
    var fph = Cc["@mozilla.org/network/protocol;1?name=file"].createInstance(Ci.nsIFileProtocolHandler);
    spec = crs.convertChromeURL(uri).spec;
    return spec;
}

用法:

chromeToPath('chrome://package_name/skin/window.png')

它将返回文件的 file:// URI。

如果您对此进行测试,请确保在安装时解压缩(解压缩)扩展程序: 在install.rdf中:     &LT; EM:解包&GT;真&LT; / EM:解压&GT;

答案 1 :(得分:0)

尝试打破这样的界限:

var file = Services.io.newURI("resource://ldvswf/myFile.swf", null, null).QueryInterface(Ci.nsIFileURL).file;
alert(file.path)
var file = Services.io.newFileURI(file).spec ;
alert(file)

第一个alert()应该给出一个本地系统路径,比如'c:\ folder \ filename ...' 第二个应该给出一个文件:// URI

所以你得到了什么?

答案 2 :(得分:0)

确保package.json中有一行:

   "unpack": true,

与姓名,职位,作者等处于同一级别。请注意true没有引号。

https://developer.mozilla.org/en-US/Add-ons/SDK/Tools/package_json