我正在开发一个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]
答案 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)