2015-01-26 4 views
7

Sto sviluppando un'estensione per Firefox basata su XUL. Sto cercando di creare un web worker in linea usando BLOB. Il codice utilizzato per funzionare in Firefox 33 ma dopo l'aggiornamento a Firefox 35 ottengo un errore. Ecco un esempio di codice:Impossibile creare Web Worker in linea in Firefox 35 addon

try { 
    var blob = new Blob(["function f(){}"], {type: "application/javascript"}); 
    var url = window.URL.createObjectURL(blob); //blob:null/371e34bd-1fbf-4f66-89cc-24d0c1c7bad5 
    return new Worker(url); 
} catch(e) { 
    console.error(e); 
} 

e ottenere un seguente errore:

Failed to load script (nsresult = 0x805303f4) 

Sono consapevole del fatto che questo errore viene visualizzato quando Web Worker cerca di caricare uno script da un dominio diverso ma non posso capire perché questo sta accadendo nel mio caso. L'URL che ottengo dalla funzione createObjectURL() sembra non essere valido. Contiene prefisso "null /".

Qualcuno ha una spiegazione su cosa sta succedendo? Qual è la possibile soluzione qui?

+1

Può darsi che 'Blob' non è più nel campo di applicazione addon (i havent stato in grado di utilizzarlo in JSMS per un po 'ora), non sono sicuro, prova a importare Blob in questo modo: https://developer.mozilla.org/en-US/docs/Web/API/Blob#Chrome_Code_-_Scope_Availability anche io vedo che stai toccando 'window' per ottenere' window.URL' puoi importare anche URL nello stesso modo: https://developer.mozilla.org/en-US/docs/Web/API/URL#Chrome_Code_-_Scope_Availability – Noitidart

+0

Dove esattamente si esegue quel codice? Nell'ambito XUL (chrome), iniettato nella pagina web, tramite un 'SandBox'? Si prega di fornire un esempio * completo *, riproducibile. – nmaier

+0

Il codice è in esecuzione nell'ambito chrome, NON viene iniettato in nessuna pagina web. Aggiunta di 'Components.utils.importGlobalProperties (['Blob', 'URL']);' non aiuta. – saloman

risposta

1

Questo esempio funziona per me, testato da Firefox 37 a 39.0a2.

// URL.createObjectURL 
window.URL = window.URL || window.webkitURL; 

// "Server response", used in all examples 
var response = "self.onmessage=function(e){postMessage('Worker: '+e.data);}"; 

var blob; 
try { 
    blob = new Blob([response], {type: 'application/javascript'}); 
} catch (e) { // Backwards-compatibility 
    window.BlobBuilder = window.BlobBuilder || window.WebKitBlobBuilder || window.MozBlobBuilder; 
    blob = new BlobBuilder(); 
    blob.append(response); 
    blob = blob.getBlob(); 
} 
var worker = new Worker(URL.createObjectURL(blob)); 

// Test, used in all examples: 
worker.onmessage = function(e) { 
    alert('Response: ' + e.data); 
}; 
worker.postMessage('Test');