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

Side by Side Diff: mojo/public/js/bindings/codec.js

Issue 424463003: Basic Mojo message header validation for JavaScript. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Fixed an indent-O Created 6 years, 4 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 "mojo/public/js/bindings/buffer" 7 "mojo/public/js/bindings/buffer"
8 ], function(unicode, buffer) { 8 ], function(unicode, buffer) {
9 9
10 var kErrorUnsigned = "Passing negative value to unsigned"; 10 var kErrorUnsigned = "Passing negative value to unsigned";
11 11
12 // Memory ------------------------------------------------------------------- 12 // Memory -------------------------------------------------------------------
13 13
14 var kAlignment = 8; 14 var kAlignment = 8;
15 15
16 function align(size) { 16 function align(size) {
17 return size + (kAlignment - (size % kAlignment)) % kAlignment; 17 return size + (kAlignment - (size % kAlignment)) % kAlignment;
18 } 18 }
19 19
20 function isAligned(offset) {
21 return offset >= 0 && (offset % kAlignment) == 0;
Tom Sepez 2014/07/29 16:32:54 nit: purists might insist on === througout.
hansmuller 2014/07/29 19:06:22 Done.
22 }
23
20 // Constants ---------------------------------------------------------------- 24 // Constants ----------------------------------------------------------------
21 25
22 var kArrayHeaderSize = 8; 26 var kArrayHeaderSize = 8;
23 var kStructHeaderSize = 8; 27 var kStructHeaderSize = 8;
24 var kMessageHeaderSize = 16; 28 var kMessageHeaderSize = 16;
25 var kMessageWithRequestIDHeaderSize = 24; 29 var kMessageWithRequestIDHeaderSize = 24;
26 30
27 // Decoder ------------------------------------------------------------------ 31 // Decoder ------------------------------------------------------------------
28 32
29 function Decoder(buffer, handles, base) { 33 function Decoder(buffer, handles, base) {
(...skipping 318 matching lines...) Expand 10 before | Expand all | Expand 10 after
348 var encodedSize = kArrayHeaderSize + unicode.utf8Length(val); 352 var encodedSize = kArrayHeaderSize + unicode.utf8Length(val);
349 var encoder = this.createAndEncodeEncoder(encodedSize); 353 var encoder = this.createAndEncodeEncoder(encodedSize);
350 encoder.encodeString(val); 354 encoder.encodeString(val);
351 }; 355 };
352 356
353 // Message ------------------------------------------------------------------ 357 // Message ------------------------------------------------------------------
354 358
355 var kMessageExpectsResponse = 1 << 0; 359 var kMessageExpectsResponse = 1 << 0;
356 var kMessageIsResponse = 1 << 1; 360 var kMessageIsResponse = 1 << 1;
357 361
362 // Message header is a struct, begins with a struct header.
363 var kNumBytesOffset = 0;
yzshen1 2014/07/29 05:59:53 Maybe we could consider define these in the "const
hansmuller 2014/07/29 19:06:22 Done.
364 var kNumFieldsOffset = 4;
365
358 // Skip over num_bytes, num_fields, and message_name. 366 // Skip over num_bytes, num_fields, and message_name.
359 var kFlagsOffset = 4 + 4 + 4; 367 var kFlagsOffset = 4 + 4 + 4;
yzshen1 2014/07/29 05:59:53 Some of those 4's (or all of them) could be replac
hansmuller 2014/07/29 19:06:22 Done.
360 368
361 // Skip over num_bytes, num_fields, message_name, and flags. 369 // Skip over num_bytes, num_fields, message_name, and flags.
362 var kRequestIDOffset = 4 + 4 + 4 + 4; 370 var kRequestIDOffset = 4 + 4 + 4 + 4;
yzshen1 2014/07/29 05:59:53 ditto.
hansmuller 2014/07/29 19:06:22 Done.
363 371
364 function Message(buffer, handles) { 372 function Message(buffer, handles) {
365 this.buffer = buffer; 373 this.buffer = buffer;
366 this.handles = handles; 374 this.handles = handles;
367 } 375 }
368 376
377 Message.prototype.getHeaderNumBytes = function() {
378 return this.buffer.getUint32(kNumBytesOffset);
379 };
380
381 Message.prototype.getHeaderNumFields = function() {
382 return this.buffer.getUint32(kNumFieldsOffset);
383 };
384
385 Message.prototype.getFlags = function() {
386 return this.buffer.getUint32(kFlagsOffset);
387 };
388
389 Message.prototype.isResponse = function() {
390 return (this.getFlags() & kMessageIsResponse) != 0;
391 };
392
393 Message.prototype.expectsResponse = function() {
394 return (this.getFlags() & kMessageExpectsResponse) != 0;
395 };
396
369 Message.prototype.setRequestID = function(requestID) { 397 Message.prototype.setRequestID = function(requestID) {
370 // TODO(darin): Verify that space was reserved for this field! 398 // TODO(darin): Verify that space was reserved for this field!
371 this.buffer.setUint64(kRequestIDOffset, requestID); 399 this.buffer.setUint64(kRequestIDOffset, requestID);
372 }; 400 };
373 401
374 Message.prototype.getFlags = function() {
375 return this.buffer.getUint32(kFlagsOffset);
376 };
377 402
378 // MessageBuilder ----------------------------------------------------------- 403 // MessageBuilder -----------------------------------------------------------
379 404
380 function MessageBuilder(messageName, payloadSize) { 405 function MessageBuilder(messageName, payloadSize) {
381 // Currently, we don't compute the payload size correctly ahead of time. 406 // Currently, we don't compute the payload size correctly ahead of time.
382 // Instead, we resize the buffer at the end. 407 // Instead, we resize the buffer at the end.
383 var numberOfBytes = kMessageHeaderSize + payloadSize; 408 var numberOfBytes = kMessageHeaderSize + payloadSize;
384 this.buffer = new buffer.Buffer(numberOfBytes); 409 this.buffer = new buffer.Buffer(numberOfBytes);
385 this.handles = []; 410 this.handles = [];
386 var encoder = this.createEncoder(kMessageHeaderSize); 411 var encoder = this.createEncoder(kMessageHeaderSize);
(...skipping 272 matching lines...) Expand 10 before | Expand all | Expand 10 after
659 Handle.decode = function(decoder) { 684 Handle.decode = function(decoder) {
660 return decoder.decodeHandle(); 685 return decoder.decodeHandle();
661 }; 686 };
662 687
663 Handle.encode = function(encoder, val) { 688 Handle.encode = function(encoder, val) {
664 encoder.encodeHandle(val); 689 encoder.encodeHandle(val);
665 }; 690 };
666 691
667 var exports = {}; 692 var exports = {};
668 exports.align = align; 693 exports.align = align;
694 exports.isAligned = isAligned;
669 exports.Message = Message; 695 exports.Message = Message;
670 exports.MessageBuilder = MessageBuilder; 696 exports.MessageBuilder = MessageBuilder;
671 exports.MessageWithRequestIDBuilder = MessageWithRequestIDBuilder; 697 exports.MessageWithRequestIDBuilder = MessageWithRequestIDBuilder;
672 exports.MessageReader = MessageReader; 698 exports.MessageReader = MessageReader;
673 exports.kArrayHeaderSize = kArrayHeaderSize; 699 exports.kArrayHeaderSize = kArrayHeaderSize;
674 exports.kStructHeaderSize = kStructHeaderSize; 700 exports.kStructHeaderSize = kStructHeaderSize;
675 exports.kMessageHeaderSize = kMessageHeaderSize; 701 exports.kMessageHeaderSize = kMessageHeaderSize;
702 exports.kMessageWithRequestIDHeaderSize = kMessageWithRequestIDHeaderSize;
676 exports.kMessageExpectsResponse = kMessageExpectsResponse; 703 exports.kMessageExpectsResponse = kMessageExpectsResponse;
677 exports.kMessageIsResponse = kMessageIsResponse; 704 exports.kMessageIsResponse = kMessageIsResponse;
678 exports.Int8 = Int8; 705 exports.Int8 = Int8;
679 exports.Uint8 = Uint8; 706 exports.Uint8 = Uint8;
680 exports.Int16 = Int16; 707 exports.Int16 = Int16;
681 exports.Uint16 = Uint16; 708 exports.Uint16 = Uint16;
682 exports.Int32 = Int32; 709 exports.Int32 = Int32;
683 exports.Uint32 = Uint32; 710 exports.Uint32 = Uint32;
684 exports.Int64 = Int64; 711 exports.Int64 = Int64;
685 exports.Uint64 = Uint64; 712 exports.Uint64 = Uint64;
686 exports.Float = Float; 713 exports.Float = Float;
687 exports.Double = Double; 714 exports.Double = Double;
688 exports.String = String; 715 exports.String = String;
689 exports.PointerTo = PointerTo; 716 exports.PointerTo = PointerTo;
690 exports.ArrayOf = ArrayOf; 717 exports.ArrayOf = ArrayOf;
691 exports.ArrayOfBoolArrayPointers = ArrayOfBoolArrayPointers; 718 exports.ArrayOfBoolArrayPointers = ArrayOfBoolArrayPointers;
692 exports.Handle = Handle; 719 exports.Handle = Handle;
693 return exports; 720 return exports;
694 }); 721 });
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698