2014-04-03 53 views
0

我有一個問題,我正在開發一個Firefox擴展。嵌入SWF文件在Firefox附加組件(無SDK)

我需要在頁面中添加一個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 

但我不知道如何PLCE它來代替:

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)[ns IFileURL。文件]

+0

的var文件= ...行對我的作品(取代的東西的路徑後,我有) –

回答

1

您是否嘗試過在你的chrome.manifest使用contentaccessible=yes,像這樣:

content package_name content/ contentaccessible=yes 

我在本地網頁與圖像測試它和它的工作,不知道是不是SWF:

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

另一種方法是讓鉻的文件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') 

,它會返回文件:文件的// URI。

如果您對此進行測試,更好地確保擴展解壓(解壓)上安裝: 在install.rdf: < EM:解壓>真正</EM:解壓>

+0

測試 「contentaccessible = YES」。這是相同的。在資源上(或來自contentaccessible文件夾)我可以加載一個沒有任何問題的圖像,但不是swf – Nadia

+0

你試過我建議的另一種方法嗎?我認爲它*應該*工作,因爲它將使用'file://'URI –

+0

是的,測試它也不起作用 – Nadia

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) 

第一個警報()應該給像本地系統路徑 'C:\文件夾\文件名...' 第二應該給一個文件:// URI

那麼你會得到什麼?

+0

對不起,我已經離開了一段時間。使用腳本,我根本沒有任何提示,並且在錯誤控制檯中得到:'Timestamp:24/04/2014 12:13:18 錯誤:NS_NOINTERFACE:組件返回失敗代碼:0x80004002(NS_NOINTERFACE)[nsIFileURL.file] 源文件:chrome://ldvgenerator/content/ldvgenerator.js 行:174'第174行是您的腳本的第一個 – Nadia