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

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

Issue 282063003: Fix handling of null pointers in JS bindings. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 6 years, 7 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 0b680172c2ddedc562e289f499ced46515c78c99..84c86c1299125a654fdf3a9dec84b6295bcf6bbc 100644
--- a/mojo/public/js/bindings/codec.js
+++ b/mojo/public/js/bindings/codec.js
@@ -202,8 +202,8 @@ define("mojo/public/js/bindings/codec", [
return offsetPointer + offset;
};
- Decoder.prototype.decodeAndCreateDecoder = function() {
- return new Decoder(this.buffer, this.handles, this.decodePointer());
+ Decoder.prototype.decodeAndCreateDecoder = function(pointer) {
+ return new Decoder(this.buffer, this.handles, pointer);
};
Decoder.prototype.decodeHandle = function() {
@@ -234,15 +234,27 @@ define("mojo/public/js/bindings/codec", [
};
Decoder.prototype.decodeStructPointer = function(cls) {
- return cls.decode(this.decodeAndCreateDecoder());
+ var pointer = this.decodePointer();
+ if (!pointer) {
+ return null;
+ }
Matt Perry 2014/05/16 18:39:04 I assume this mimics how its done on the C++ side?
Tom Sepez 2014/05/16 18:56:17 It's not exactly analogous, because JS has to deco
+ return cls.decode(this.decodeAndCreateDecoder(pointer));
};
Decoder.prototype.decodeArrayPointer = function(cls) {
- return this.decodeAndCreateDecoder().decodeArray(cls);
+ var pointer = this.decodePointer();
+ if (!pointer) {
+ return null;
+ }
+ return this.decodeAndCreateDecoder(pointer).decodeArray(cls);
};
Decoder.prototype.decodeStringPointer = function() {
- return this.decodeAndCreateDecoder().decodeString();
+ var pointer = this.decodePointer();
+ if (!pointer) {
+ return null;
+ }
+ return this.decodeAndCreateDecoder(pointer).decodeString();
};
// Encoder ------------------------------------------------------------------
@@ -367,17 +379,29 @@ define("mojo/public/js/bindings/codec", [
};
Encoder.prototype.encodeStructPointer = function(cls, val) {
+ if (!val) {
+ this.encodePointer(val);
+ return;
+ }
var encoder = this.createAndEncodeEncoder(cls.encodedSize);
cls.encode(encoder, val);
};
Encoder.prototype.encodeArrayPointer = function(cls, val) {
+ if (!val) {
+ this.encodePointer(val);
+ return;
+ }
var encodedSize = kArrayHeaderSize + cls.encodedSize * val.length;
var encoder = this.createAndEncodeEncoder(encodedSize);
encoder.encodeArray(cls, val);
};
Encoder.prototype.encodeStringPointer = function(val) {
+ if (!val) {
+ this.encodePointer(val);
+ return;
+ }
var encodedSize = kArrayHeaderSize + unicode.utf8Length(val);
var encoder = this.createAndEncodeEncoder(encodedSize);
encoder.encodeString(val);
@@ -642,10 +666,18 @@ define("mojo/public/js/bindings/codec", [
PointerTo.prototype.encodedSize = 8;
PointerTo.prototype.decode = function(decoder) {
- return this.cls.decode(decoder.decodeAndCreateDecoder());
+ var pointer = decoder.decodePointer();
+ if (!pointer) {
+ return null;
+ }
+ return this.cls.decode(decoder.decodeAndCreateDecoder(pointer));
};
PointerTo.prototype.encode = function(encoder, val) {
+ if (!val) {
+ encoder.encodePointer(val);
+ return;
+ }
var objectEncoder = encoder.createAndEncodeEncoder(this.cls.encodedSize);
this.cls.encode(objectEncoder, val);
};
« mojo/apps/js/test/js_to_cpp_unittest.js ('K') | « mojo/apps/js/test/js_to_cpp_unittest.js ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698