Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1269)

Unified Diff: mojo/public/js/bindings/codec.js

Issue 654843005: Mojo JS Bindings: add support for associative arrays (Mojo map type) (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 6 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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;

Powered by Google App Engine
This is Rietveld 408576698