Chromium Code Reviews| Index: pkg/browser/lib/interop.js |
| diff --git a/pkg/browser/lib/interop.js b/pkg/browser/lib/interop.js |
| index 8577e4f28b8c30aa67270ff78727da5789d0bea0..99556fa864252c8a1abca879d9ca9ed853d82d99 100644 |
| --- a/pkg/browser/lib/interop.js |
| +++ b/pkg/browser/lib/interop.js |
| @@ -14,7 +14,7 @@ function ReceivePortSync() { |
| } |
| // Type for remote proxies to Dart objects with dart2js. |
| -function DartProxy(o) { |
| +function DartObject(o) { |
| this.o = o; |
| } |
| @@ -250,17 +250,27 @@ function DartProxy(o) { |
| return Object.keys(this.map).length; |
| } |
| + var _dartRefPropertyName = "_$dart_ref"; |
| + |
| // Adds an object to the table and return an ID for serialization. |
| - ProxiedObjectTable.prototype.add = function (obj) { |
| - for (var ref in this.map) { |
| - var o = this.map[ref]; |
| - if (o === obj) { |
| - return ref; |
| + ProxiedObjectTable.prototype.add = function (obj, id) { |
| + if (id != null) { |
| + this.map[id] = obj; |
| + return id; |
| + } else { |
| + var ref = obj[_dartRefPropertyName]; |
| + if (ref == null) { |
| + ref = this.name + '-' + this._nextId++; |
| + this.map[ref] = obj; |
| + Object.defineProperty(obj, _dartRefPropertyName, { value: ref }); |
|
ahe
2013/10/11 12:54:40
Why are you using Object.defineProperty?
alexandre.ardhuin
2013/10/11 13:52:53
To avoid that this property shows up during proper
|
| } |
| + return ref; |
| } |
| - var ref = this.name + '-' + this._nextId++; |
| - this.map[ref] = obj; |
| - return ref; |
| + } |
| + |
| + // Gets the object or function corresponding to this ID. |
| + ProxiedObjectTable.prototype.contains = function (id) { |
| + return this.map.hasOwnProperty(id); |
| } |
| // Gets the object or function corresponding to this ID. |
| @@ -328,7 +338,7 @@ function DartProxy(o) { |
| proxiedObjectTable._initialize() |
| // Type for remote proxies to Dart objects. |
| - function DartProxy(id, sendPort) { |
| + function DartObject(id, sendPort) { |
| this.id = id; |
| this.port = sendPort; |
| } |
| @@ -361,7 +371,7 @@ function DartProxy(o) { |
| proxiedObjectTable.add(message), |
| proxiedObjectTable.sendPort ]; |
| } |
| - } else if (message instanceof DartProxy) { |
| + } else if (message instanceof DartObject) { |
| // Remote object proxy. |
| return [ 'objref', message.id, message.port ]; |
| } else { |
| @@ -402,6 +412,9 @@ function DartProxy(o) { |
| return proxiedObjectTable.get(id); |
| } else { |
| // Remote function. Forward to its port. |
| + if (proxiedObjectTable.contains(id)) { |
| + return proxiedObjectTable.get(id); |
| + } |
| var f = function () { |
| var args = Array.prototype.slice.apply(arguments); |
| args.splice(0, 0, this); |
| @@ -413,11 +426,12 @@ function DartProxy(o) { |
| // Cache the remote id and port. |
| f._dart_id = id; |
| f._dart_port = port; |
| + proxiedObjectTable.add(f, id); |
| return f; |
| } |
| } |
| - // Creates a DartProxy to forwards to the remote object. |
| + // Creates a DartObject to forwards to the remote object. |
| function deserializeObject(message) { |
| var id = message[1]; |
| var port = message[2]; |
| @@ -427,7 +441,12 @@ function DartProxy(o) { |
| return proxiedObjectTable.get(id); |
| } else { |
| // Remote object. |
| - return new DartProxy(id, port); |
| + if (proxiedObjectTable.contains(id)) { |
| + return proxiedObjectTable.get(id); |
| + } |
| + proxy = new DartObject(id, port); |
| + proxiedObjectTable.add(proxy, id); |
| + return proxy; |
| } |
| } |