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; |