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

Side by Side 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 unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 define("mojo/public/js/bindings/codec", [ 5 define("mojo/public/js/bindings/codec", [
6 "mojo/public/js/bindings/unicode" 6 "mojo/public/js/bindings/unicode"
7 ], function(unicode) { 7 ], function(unicode) {
8 8
9 var kErrorUnsigned = "Passing negative value to unsigned"; 9 var kErrorUnsigned = "Passing negative value to unsigned";
10 10
(...skipping 184 matching lines...) Expand 10 before | Expand all | Expand 10 after
195 Decoder.prototype.decodePointer = function() { 195 Decoder.prototype.decodePointer = function() {
196 // TODO(abarth): To correctly decode a pointer, we need to know the real 196 // TODO(abarth): To correctly decode a pointer, we need to know the real
197 // base address of the array buffer. 197 // base address of the array buffer.
198 var offsetPointer = this.next; 198 var offsetPointer = this.next;
199 var offset = this.readUint64(); 199 var offset = this.readUint64();
200 if (!offset) 200 if (!offset)
201 return 0; 201 return 0;
202 return offsetPointer + offset; 202 return offsetPointer + offset;
203 }; 203 };
204 204
205 Decoder.prototype.decodeAndCreateDecoder = function() { 205 Decoder.prototype.decodeAndCreateDecoder = function(pointer) {
206 return new Decoder(this.buffer, this.handles, this.decodePointer()); 206 return new Decoder(this.buffer, this.handles, pointer);
207 }; 207 };
208 208
209 Decoder.prototype.decodeHandle = function() { 209 Decoder.prototype.decodeHandle = function() {
210 return this.handles[this.readUint32()]; 210 return this.handles[this.readUint32()];
211 }; 211 };
212 212
213 Decoder.prototype.decodeString = function() { 213 Decoder.prototype.decodeString = function() {
214 var numberOfBytes = this.readUint32(); 214 var numberOfBytes = this.readUint32();
215 var numberOfElements = this.readUint32(); 215 var numberOfElements = this.readUint32();
216 var base = this.next; 216 var base = this.next;
(...skipping 10 matching lines...) Expand all
227 val[i] = cls.decode(this); 227 val[i] = cls.decode(this);
228 } 228 }
229 return val; 229 return val;
230 }; 230 };
231 231
232 Decoder.prototype.decodeStruct = function(cls) { 232 Decoder.prototype.decodeStruct = function(cls) {
233 return cls.decode(this); 233 return cls.decode(this);
234 }; 234 };
235 235
236 Decoder.prototype.decodeStructPointer = function(cls) { 236 Decoder.prototype.decodeStructPointer = function(cls) {
237 return cls.decode(this.decodeAndCreateDecoder()); 237 var pointer = this.decodePointer();
238 if (!pointer) {
239 return null;
240 }
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
241 return cls.decode(this.decodeAndCreateDecoder(pointer));
238 }; 242 };
239 243
240 Decoder.prototype.decodeArrayPointer = function(cls) { 244 Decoder.prototype.decodeArrayPointer = function(cls) {
241 return this.decodeAndCreateDecoder().decodeArray(cls); 245 var pointer = this.decodePointer();
246 if (!pointer) {
247 return null;
248 }
249 return this.decodeAndCreateDecoder(pointer).decodeArray(cls);
242 }; 250 };
243 251
244 Decoder.prototype.decodeStringPointer = function() { 252 Decoder.prototype.decodeStringPointer = function() {
245 return this.decodeAndCreateDecoder().decodeString(); 253 var pointer = this.decodePointer();
254 if (!pointer) {
255 return null;
256 }
257 return this.decodeAndCreateDecoder(pointer).decodeString();
246 }; 258 };
247 259
248 // Encoder ------------------------------------------------------------------ 260 // Encoder ------------------------------------------------------------------
249 261
250 function Encoder(buffer, handles, base) { 262 function Encoder(buffer, handles, base) {
251 this.buffer = buffer; 263 this.buffer = buffer;
252 this.handles = handles; 264 this.handles = handles;
253 this.base = base; 265 this.base = base;
254 this.next = base; 266 this.next = base;
255 } 267 }
(...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after
360 for (var i = 0; i < numberOfElements; ++i) { 372 for (var i = 0; i < numberOfElements; ++i) {
361 cls.encode(this, val[i]); 373 cls.encode(this, val[i]);
362 } 374 }
363 }; 375 };
364 376
365 Encoder.prototype.encodeStruct = function(cls, val) { 377 Encoder.prototype.encodeStruct = function(cls, val) {
366 return cls.encode(this, val); 378 return cls.encode(this, val);
367 }; 379 };
368 380
369 Encoder.prototype.encodeStructPointer = function(cls, val) { 381 Encoder.prototype.encodeStructPointer = function(cls, val) {
382 if (!val) {
383 this.encodePointer(val);
384 return;
385 }
370 var encoder = this.createAndEncodeEncoder(cls.encodedSize); 386 var encoder = this.createAndEncodeEncoder(cls.encodedSize);
371 cls.encode(encoder, val); 387 cls.encode(encoder, val);
372 }; 388 };
373 389
374 Encoder.prototype.encodeArrayPointer = function(cls, val) { 390 Encoder.prototype.encodeArrayPointer = function(cls, val) {
391 if (!val) {
392 this.encodePointer(val);
393 return;
394 }
375 var encodedSize = kArrayHeaderSize + cls.encodedSize * val.length; 395 var encodedSize = kArrayHeaderSize + cls.encodedSize * val.length;
376 var encoder = this.createAndEncodeEncoder(encodedSize); 396 var encoder = this.createAndEncodeEncoder(encodedSize);
377 encoder.encodeArray(cls, val); 397 encoder.encodeArray(cls, val);
378 }; 398 };
379 399
380 Encoder.prototype.encodeStringPointer = function(val) { 400 Encoder.prototype.encodeStringPointer = function(val) {
401 if (!val) {
402 this.encodePointer(val);
403 return;
404 }
381 var encodedSize = kArrayHeaderSize + unicode.utf8Length(val); 405 var encodedSize = kArrayHeaderSize + unicode.utf8Length(val);
382 var encoder = this.createAndEncodeEncoder(encodedSize); 406 var encoder = this.createAndEncodeEncoder(encodedSize);
383 encoder.encodeString(val); 407 encoder.encodeString(val);
384 }; 408 };
385 409
386 // Message ------------------------------------------------------------------ 410 // Message ------------------------------------------------------------------
387 411
388 var kMessageExpectsResponse = 1 << 0; 412 var kMessageExpectsResponse = 1 << 0;
389 var kMessageIsResponse = 1 << 1; 413 var kMessageIsResponse = 1 << 1;
390 414
(...skipping 244 matching lines...) Expand 10 before | Expand all | Expand 10 after
635 encoder.writeDouble(val); 659 encoder.writeDouble(val);
636 }; 660 };
637 661
638 function PointerTo(cls) { 662 function PointerTo(cls) {
639 this.cls = cls; 663 this.cls = cls;
640 } 664 }
641 665
642 PointerTo.prototype.encodedSize = 8; 666 PointerTo.prototype.encodedSize = 8;
643 667
644 PointerTo.prototype.decode = function(decoder) { 668 PointerTo.prototype.decode = function(decoder) {
645 return this.cls.decode(decoder.decodeAndCreateDecoder()); 669 var pointer = decoder.decodePointer();
670 if (!pointer) {
671 return null;
672 }
673 return this.cls.decode(decoder.decodeAndCreateDecoder(pointer));
646 }; 674 };
647 675
648 PointerTo.prototype.encode = function(encoder, val) { 676 PointerTo.prototype.encode = function(encoder, val) {
677 if (!val) {
678 encoder.encodePointer(val);
679 return;
680 }
649 var objectEncoder = encoder.createAndEncodeEncoder(this.cls.encodedSize); 681 var objectEncoder = encoder.createAndEncodeEncoder(this.cls.encodedSize);
650 this.cls.encode(objectEncoder, val); 682 this.cls.encode(objectEncoder, val);
651 }; 683 };
652 684
653 function ArrayOf(cls) { 685 function ArrayOf(cls) {
654 this.cls = cls; 686 this.cls = cls;
655 } 687 }
656 688
657 ArrayOf.prototype.encodedSize = 8; 689 ArrayOf.prototype.encodedSize = 8;
658 690
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
698 exports.Int64 = Int64; 730 exports.Int64 = Int64;
699 exports.Uint64 = Uint64; 731 exports.Uint64 = Uint64;
700 exports.Float = Float; 732 exports.Float = Float;
701 exports.Double = Double; 733 exports.Double = Double;
702 exports.String = String; 734 exports.String = String;
703 exports.PointerTo = PointerTo; 735 exports.PointerTo = PointerTo;
704 exports.ArrayOf = ArrayOf; 736 exports.ArrayOf = ArrayOf;
705 exports.Handle = Handle; 737 exports.Handle = Handle;
706 return exports; 738 return exports;
707 }); 739 });
OLDNEW
« 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