Chromium Code Reviews| Index: mojo/public/js/bindings/codec.js |
| diff --git a/mojo/public/js/bindings/codec.js b/mojo/public/js/bindings/codec.js |
| index 84c86c1299125a654fdf3a9dec84b6295bcf6bbc..0e8d195e4986b51035ecb3f13814c8db1082b875 100644 |
| --- a/mojo/public/js/bindings/codec.js |
| +++ b/mojo/public/js/bindings/codec.js |
| @@ -229,6 +229,23 @@ define("mojo/public/js/bindings/codec", [ |
| return val; |
| }; |
| + Decoder.prototype.decodeBoolArray = function() { |
| + var numberOfBytes = this.readUint32(); |
| + var numberOfElements = this.readUint32(); |
| + |
| + var bitsLength = Math.ceil(numberOfElements / 8); |
| + var bits = new Uint8Array(bitsLength); |
| + for (var i = 0; i < bitsLength; ++i) { |
| + bits[i] = Uint8.decode(this); |
| + } |
| + |
| + var val = new Array(numberOfElements); |
| + for (var i = 0; i < numberOfElements; ++i) { |
| + val[i] = (bits[Math.floor(i / 8)] & (1 << i % 8)) ? true : false; |
| + } |
| + return val; |
| + }; |
| + |
| Decoder.prototype.decodeStruct = function(cls) { |
| return cls.decode(this); |
| }; |
| @@ -249,6 +266,14 @@ define("mojo/public/js/bindings/codec", [ |
| return this.decodeAndCreateDecoder(pointer).decodeArray(cls); |
| }; |
| + Decoder.prototype.decodeBoolArrayPointer = function() { |
| + var pointer = this.decodePointer(); |
| + if (!pointer) { |
| + return null; |
| + } |
| + return this.decodeAndCreateDecoder(pointer).decodeBoolArray(); |
| + }; |
| + |
| Decoder.prototype.decodeStringPointer = function() { |
| var pointer = this.decodePointer(); |
| if (!pointer) { |
| @@ -364,12 +389,14 @@ define("mojo/public/js/bindings/codec", [ |
| this.next += numberOfElements; |
| }; |
| - Encoder.prototype.encodeArray = function(cls, val) { |
| - var numberOfElements = val.length; |
| - var numberOfBytes = kArrayHeaderSize + cls.encodedSize * numberOfElements; |
| + Encoder.prototype.encodeArray = function(cls, val, numberOfElements) { |
| + if (numberOfElements === undefined) |
| + numberOfElements = val.length; |
| + var valLength = val.length; |
|
Matt Perry
2014/07/07 22:45:45
nit: why not just use val.length everywhere?
|
| + var numberOfBytes = kArrayHeaderSize + cls.encodedSize * valLength; |
| this.writeUint32(numberOfBytes); |
| this.writeUint32(numberOfElements); |
| - for (var i = 0; i < numberOfElements; ++i) { |
| + for (var i = 0; i < valLength; ++i) { |
| cls.encode(this, val[i]); |
| } |
| }; |
| @@ -397,6 +424,23 @@ define("mojo/public/js/bindings/codec", [ |
| encoder.encodeArray(cls, val); |
| }; |
| + Encoder.prototype.encodeBoolArrayPointer = function(val) { |
| + if (!val) { |
| + this.encodePointer(val); |
| + return; |
| + } |
| + var numberOfElements = val.length; |
| + var encodedSize = kArrayHeaderSize + Math.ceil(numberOfElements / 8); |
|
Matt Perry
2014/07/07 22:45:45
do you also need to add cls.encodedSize? That rese
|
| + var encoder = this.createAndEncodeEncoder(encodedSize); |
| + |
| + var bits = new Uint8Array(Math.ceil(numberOfElements / 8)); |
| + for (var i = 0; i < numberOfElements; i++) { |
| + if (val[i]) |
| + bits[Math.floor(i / 8)] |= (1 << i % 8); |
| + } |
| + encoder.encodeArray(Uint8, bits, numberOfElements); |
| + }; |
| + |
| Encoder.prototype.encodeStringPointer = function(val) { |
| if (!val) { |
| this.encodePointer(val); |
| @@ -696,6 +740,19 @@ define("mojo/public/js/bindings/codec", [ |
| encoder.encodeArrayPointer(this.cls, val); |
| }; |
| + function ArrayOfBool() { |
| + } |
| + |
| + ArrayOfBool.prototype.encodedSize = 8; |
| + |
| + ArrayOfBool.prototype.decode = function(decoder) { |
| + return decoder.decodeBoolArrayPointer(); |
| + }; |
| + |
| + ArrayOfBool.prototype.encode = function(encoder, val) { |
| + encoder.encodeBoolArrayPointer(val); |
| + }; |
| + |
| function Handle() { |
| } |
| @@ -734,6 +791,7 @@ define("mojo/public/js/bindings/codec", [ |
| exports.String = String; |
| exports.PointerTo = PointerTo; |
| exports.ArrayOf = ArrayOf; |
| + exports.ArrayOfBool = ArrayOfBool; |
| exports.Handle = Handle; |
| return exports; |
| }); |