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 623cca71b66ff334e41f72173997199cbd410e52..529c2a65aed2f8ee32d2f49a7dc22c30312b69d1 100644 |
| --- a/mojo/public/js/bindings/codec.js |
| +++ b/mojo/public/js/bindings/codec.js |
| @@ -4,8 +4,8 @@ |
| define("mojo/public/js/bindings/codec", [ |
| "mojo/public/js/bindings/unicode", |
| - "mojo/public/js/bindings/buffer" |
| - ], function(unicode, buffer) { |
| + "mojo/public/js/bindings/buffer", |
| +], function(unicode, buffer) { |
| var kErrorUnsigned = "Passing negative value to unsigned"; |
| @@ -27,6 +27,7 @@ define("mojo/public/js/bindings/codec", [ |
| var kStructHeaderSize = 8; |
| var kMessageHeaderSize = 16; |
| var kMessageWithRequestIDHeaderSize = 24; |
| + var kMapStructSize = 16; |
|
yzshen1
2014/10/15 05:58:02
It doesn't include the struct header itself, right
hansmuller
2014/10/15 21:45:46
Done.
|
| var kStructHeaderNumBytesOffset = 0; |
| var kStructHeaderNumFieldsOffset = 4; |
| @@ -180,6 +181,26 @@ define("mojo/public/js/bindings/codec", [ |
| return this.decodeAndCreateDecoder(pointer).decodeString(); |
| }; |
| + Decoder.prototype.decodeMap = function(keyClass, valueClass) { |
| + this.skip(4); // numberOfBytes |
| + this.skip(4); // numberOfFields |
|
qsr
2014/10/15 13:03:40
Don't you want to check that the header is the one
hansmuller
2014/10/15 21:45:46
Yes. That will happen when the incoming message is
|
| + var keys = this.decodeArrayPointer(keyClass); |
| + var values = this.decodeArrayPointer(valueClass); |
| + var val = new Map(); |
| + for (var i = 0; i < keys.length; i++) |
| + val.set(keys[i], values[i]); |
| + return val; |
| + }; |
| + |
| + Decoder.prototype.decodeMapPointer = function(keyClass, valueClass) { |
| + var pointer = this.decodePointer(); |
| + if (!pointer) { |
| + return null; |
| + } |
| + var decoder = this.decodeAndCreateDecoder(pointer); |
| + return decoder.decodeMap(keyClass, valueClass); |
| + }; |
| + |
| // Encoder ------------------------------------------------------------------ |
| function Encoder(buffer, handles, base) { |
| @@ -349,6 +370,31 @@ define("mojo/public/js/bindings/codec", [ |
| encoder.encodeString(val); |
| }; |
| + Encoder.prototype.encodeMap = function(keyClass, valueClass, val) { |
| + var keys = new Array(val.size); |
| + var values = new Array(val.size); |
| + var i = 0; |
| + val.forEach(function(value, key) { |
| + values[i] = value; |
| + keys[i++] = key; |
| + }); |
|
abarth-chromium
2014/10/15 04:53:26
for (var [key, value] of val) {
...
}
https://d
hansmuller
2014/10/15 21:45:46
That would be nicer. I gave it a try; it doesn't a
|
| + this.writeUint32(kMapStructSize); |
|
yzshen1
2014/10/15 05:58:02
num_bytes should also include the header size.
hansmuller
2014/10/15 21:45:46
Yes it should! Sorry about that.
|
| + this.writeUint32(2); |
| + this.encodeArrayPointer(keyClass, keys); |
| + this.encodeArrayPointer(valueClass, values); |
| + } |
| + |
| + Encoder.prototype.encodeMapPointer = function(keyClass, valueClass, val) { |
| + if (val == null) { |
| + // Also handles undefined, since undefined == null. |
| + this.encodePointer(val); |
| + return; |
| + } |
| + var encodedSize = kStructHeaderSize + kMapStructSize; |
| + var encoder = this.createAndEncodeEncoder(encodedSize); |
| + encoder.encodeMap(keyClass, valueClass, val); |
| + }; |
| + |
| // Message ------------------------------------------------------------------ |
| var kMessageNameOffset = kStructHeaderSize; |