ejemplo javascript firefox firefox-addon firefox-addon-sdk xpcom

ejemplo - filereader javascript



Use Blob en el complemento de Firefox (1)

He intentado que el siguiente código funcione en el complemento de Firefox:

var oMyForm = new FormData(); oMyForm.append("username", "Groucho"); oMyForm.append("accountnum", 123456); // number 123456 is immediately converted to string "123456" // HTML file input user''s choice... oMyForm.append("userfile", fileInputElement.files[0]); // JavaScript file-like object... var oFileBody = ''<a id="a"><b id="b">hey!</b></a>''; // the body of the new file... var oBlob = new Blob([oFileBody], { type: "text/xml"}); oMyForm.append("webmasterfile", oBlob); var oReq = new XMLHttpRequest(); oReq.open("POST", "http://foo.com/submitform.php"); oReq.send(oMyForm);

de https://developer.mozilla.org/en-US/docs/Web/Guide/Using_FormData_Objects?redirectlocale=en-US&redirectslug=Web%2FAPI%2FFormData%2FUsing_FormData_Objects

Entonces sé que tengo que usar XPCOM, pero no puedo encontrar el equivalente. Encontré esto hasta ahora:

var oMyForm = Cc["@mozilla.org/files/formdata;1"].createInstance(Ci.nsIDOMFormData); oMyForm.append("username", "Groucho"); oMyForm.append("accountnum", 123456); // number 123456 is immediately converted to string "123456" // JavaScript file-like object... var oFileBody = ''<a id="a"><b id="b">hey!</b></a>''; // the body of the new file... var oBlob = Cc["@mozilla.org/files/file;1"].createInstance(Ci.nsIDOMFile, [oFileBody], { type: "text/xml"}); oMyForm.append("webmasterfile", oBlob); var oReq = Cc["@mozilla.org/xmlextras/xmlhttprequest;1"].createInstance(Ci.nsIXMLHttpRequest); oReq.open("POST", "http://localhost:3000"); oReq.send(oMyForm);

Básicamente, el problema es var oBlob = Cc["@mozilla.org/files/file;1"].createInstance(Ci.nsIDOMFile, [oFileBody], { type: "text/xml"}); porque "@mozilla.org/files/file;1" o Ci.nsIDOMFile es incorrecto. Tenga en cuenta que nsIDOMFile hereda de nsIDOMBlob.

¿Alguien sabe qué hacer?

Gracias un montón.


Vamos a engañar un poco para responder esto:

  • Los módulos de código JS realmente tienen Blob y File , mientras que los módulos SDK no :(
  • Cu.import() devolverá el global completo de un módulo de código, incl. Blob .
  • Sabiendo eso, podemos obtener un Blob válido importando un módulo conocido, como Services.jsm

Ejemplo completo y probado, basado en su código:

const {Cc, Ci, Cu} = require("chrome"); // This is the cheat ;) const {Blob, File} = Cu.import("resource://gre/modules/Services.jsm", {}); var oMyForm = Cc["@mozilla.org/files/formdata;1"].createInstance(Ci.nsIDOMFormData); oMyForm.append("username", "Groucho"); oMyForm.append("accountnum", 123456); // number 123456 is immediately converted to string "123456" // JavaScript file-like object... var oFileBody = ''<a id="a"><b id="b">hey!</b></a>''; // the body of the new file... var oBlob = Blob([oFileBody], { type: "text/xml"}); oMyForm.append("webmasterfile", oBlob, "myfile.html"); var oReq = Cc["@mozilla.org/xmlextras/xmlhttprequest;1"].createInstance(Ci.nsIXMLHttpRequest); oReq.open("POST", "http://example.org/"); oReq.send(oMyForm);