Bug 933497: Teach ObjectWrapper.jsm to deal with Typed Arrays. r=bholley
authorKyle Huey <khuey@kylehuey.com>
Wed, 04 Dec 2013 11:53:21 -0500
changeset 174509 c595dfa92c1294a7283b477b1122e6a42212e1a9
parent 174508 997ec8454c145822d7ef2becd568637092df6414
child 174510 7b6a44800b27f588fdc296b1d4555f849e607491
push id445
push userffxbld
push dateMon, 10 Mar 2014 22:05:19 +0000
treeherdermozilla-release@dc38b741b04e [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersbholley
bugs933497
milestone28.0a1
first release with
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
last release without
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
Bug 933497: Teach ObjectWrapper.jsm to deal with Typed Arrays. r=bholley
dom/base/ObjectWrapper.jsm
--- a/dom/base/ObjectWrapper.jsm
+++ b/dom/base/ObjectWrapper.jsm
@@ -7,44 +7,63 @@
 const Cu = Components.utils;
 const Cc = Components.classes;
 const Ci = Components.interfaces;
 
 this.EXPORTED_SYMBOLS = ["ObjectWrapper"];
 
 // Makes sure that we expose correctly chrome JS objects to content.
 
+const TypedArrayThings = [
+  "Int8Array",
+  "Uint8Array",
+  "Uint8ClampedArray",
+  "Int16Array",
+  "Uint16Array",
+  "Int32Array",
+  "Uint32Array",
+  "Float32Array",
+  "Float64Array",
+];
+
 this.ObjectWrapper = {
   getObjectKind: function objWrapper_getObjectKind(aObject) {
     if (aObject === null || aObject === undefined) {
       return "primitive";
     } else if (Array.isArray(aObject)) {
       return "array";
     } else if (aObject instanceof Ci.nsIDOMFile) {
       return "file";
     } else if (aObject instanceof Ci.nsIDOMBlob) {
       return "blob";
     } else if (aObject instanceof Date) {
       return "date";
+    } else if (TypedArrayThings.indexOf(aObject.constructor.name) !== -1) {
+      return aObject.constructor.name;
     } else if (typeof aObject == "object") {
       return "object";
     } else {
       return "primitive";
     }
   },
 
   wrap: function objWrapper_wrap(aObject, aCtxt) {
     // First check wich kind of object we have.
     let kind = this.getObjectKind(aObject);
     if (kind == "array") {
       let res = Cu.createArrayIn(aCtxt);
       aObject.forEach(function(aObj) {
         res.push(this.wrap(aObj, aCtxt));
       }, this);
       return res;
+    } else if (TypedArrayThings.indexOf(kind) !== -1) {
+      // This is slow, because from the perspective of the constructor in aCtxt
+      // aObject is a CCW, and it gets the indexed properties one by one rather
+      // instead of realizing that this is already a typed array thing.
+      return new aCtxt[kind](aObject);
     } else if (kind == "file") {
       return new aCtxt.File(aObject,
                             { name: aObject.name,
                               type: aObject.type });
     } else if (kind == "blob") {
       return new aCtxt.Blob([aObject], { type: aObject.type });
     } else if (kind == "date") {
       return Cu.createDateIn(aCtxt, aObject.getTime());