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

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: make claimRange() consistent with isValidRange() 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
« no previous file with comments | « extensions/renderer/dispatcher.cc ('k') | mojo/public/js/bindings/constants.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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;
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
31 var kStructHeaderNumBytesOffset = 0;
32 var kStructHeaderNumFieldsOffset = 4;
33
27 // Decoder ------------------------------------------------------------------ 34 // Decoder ------------------------------------------------------------------
28 35
29 function Decoder(buffer, handles, base) { 36 function Decoder(buffer, handles, base) {
30 this.buffer = buffer; 37 this.buffer = buffer;
31 this.handles = handles; 38 this.handles = handles;
32 this.base = base; 39 this.base = base;
33 this.next = base; 40 this.next = base;
34 } 41 }
35 42
36 Decoder.prototype.skip = function(offset) { 43 Decoder.prototype.skip = function(offset) {
(...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after
134 return val; 141 return val;
135 }; 142 };
136 143
137 Decoder.prototype.decodeBoolArray = function() { 144 Decoder.prototype.decodeBoolArray = function() {
138 var numberOfBytes = this.readUint32(); 145 var numberOfBytes = this.readUint32();
139 var numberOfElements = this.readUint32(); 146 var numberOfElements = this.readUint32();
140 147
141 var val = new Array(numberOfElements); 148 var val = new Array(numberOfElements);
142 var byte; 149 var byte;
143 for (var i = 0; i < numberOfElements; ++i) { 150 for (var i = 0; i < numberOfElements; ++i) {
144 if (i % 8 == 0) 151 if (i % 8 === 0)
145 byte = this.readUint8(); 152 byte = this.readUint8();
146 val[i] = (byte & (1 << i % 8)) ? true : false; 153 val[i] = (byte & (1 << i % 8)) ? true : false;
147 } 154 }
148 return val; 155 return val;
149 }; 156 };
150 157
151 Decoder.prototype.decodeStruct = function(cls) { 158 Decoder.prototype.decodeStruct = function(cls) {
152 return cls.decode(this); 159 return cls.decode(this);
153 }; 160 };
154 161
(...skipping 190 matching lines...) Expand 10 before | Expand all | Expand 10 after
345 this.encodePointer(val); 352 this.encodePointer(val);
346 return; 353 return;
347 } 354 }
348 var encodedSize = kArrayHeaderSize + unicode.utf8Length(val); 355 var encodedSize = kArrayHeaderSize + unicode.utf8Length(val);
349 var encoder = this.createAndEncodeEncoder(encodedSize); 356 var encoder = this.createAndEncodeEncoder(encodedSize);
350 encoder.encodeString(val); 357 encoder.encodeString(val);
351 }; 358 };
352 359
353 // Message ------------------------------------------------------------------ 360 // Message ------------------------------------------------------------------
354 361
362 var kMessageNameOffset = kStructHeaderSize;
363 var kMessageFlagsOffset = kMessageNameOffset + 4;
364 var kMessageRequestIDOffset = kMessageFlagsOffset + 4;
365
355 var kMessageExpectsResponse = 1 << 0; 366 var kMessageExpectsResponse = 1 << 0;
356 var kMessageIsResponse = 1 << 1; 367 var kMessageIsResponse = 1 << 1;
357 368
358 // Skip over num_bytes, num_fields, and message_name.
359 var kFlagsOffset = 4 + 4 + 4;
360
361 // Skip over num_bytes, num_fields, message_name, and flags.
362 var kRequestIDOffset = 4 + 4 + 4 + 4;
363
364 function Message(buffer, handles) { 369 function Message(buffer, handles) {
365 this.buffer = buffer; 370 this.buffer = buffer;
366 this.handles = handles; 371 this.handles = handles;
367 } 372 }
368 373
369 Message.prototype.setRequestID = function(requestID) { 374 Message.prototype.getHeaderNumBytes = function() {
370 // TODO(darin): Verify that space was reserved for this field! 375 return this.buffer.getUint32(kStructHeaderNumBytesOffset);
371 this.buffer.setUint64(kRequestIDOffset, requestID); 376 };
377
378 Message.prototype.getHeaderNumFields = function() {
379 return this.buffer.getUint32(kStructHeaderNumFieldsOffset);
372 }; 380 };
373 381
374 Message.prototype.getFlags = function() { 382 Message.prototype.getFlags = function() {
375 return this.buffer.getUint32(kFlagsOffset); 383 return this.buffer.getUint32(kMessageFlagsOffset);
376 }; 384 };
377 385
386 Message.prototype.isResponse = function() {
387 return (this.getFlags() & kMessageIsResponse) != 0;
388 };
389
390 Message.prototype.expectsResponse = function() {
391 return (this.getFlags() & kMessageExpectsResponse) != 0;
392 };
393
394 Message.prototype.setRequestID = function(requestID) {
395 // TODO(darin): Verify that space was reserved for this field!
396 this.buffer.setUint64(kMessageRequestIDOffset, requestID);
397 };
398
399
378 // MessageBuilder ----------------------------------------------------------- 400 // MessageBuilder -----------------------------------------------------------
379 401
380 function MessageBuilder(messageName, payloadSize) { 402 function MessageBuilder(messageName, payloadSize) {
381 // Currently, we don't compute the payload size correctly ahead of time. 403 // Currently, we don't compute the payload size correctly ahead of time.
382 // Instead, we resize the buffer at the end. 404 // Instead, we resize the buffer at the end.
383 var numberOfBytes = kMessageHeaderSize + payloadSize; 405 var numberOfBytes = kMessageHeaderSize + payloadSize;
384 this.buffer = new buffer.Buffer(numberOfBytes); 406 this.buffer = new buffer.Buffer(numberOfBytes);
385 this.handles = []; 407 this.handles = [];
386 var encoder = this.createEncoder(kMessageHeaderSize); 408 var encoder = this.createEncoder(kMessageHeaderSize);
387 encoder.writeUint32(kMessageHeaderSize); 409 encoder.writeUint32(kMessageHeaderSize);
(...skipping 271 matching lines...) Expand 10 before | Expand all | Expand 10 after
659 Handle.decode = function(decoder) { 681 Handle.decode = function(decoder) {
660 return decoder.decodeHandle(); 682 return decoder.decodeHandle();
661 }; 683 };
662 684
663 Handle.encode = function(encoder, val) { 685 Handle.encode = function(encoder, val) {
664 encoder.encodeHandle(val); 686 encoder.encodeHandle(val);
665 }; 687 };
666 688
667 var exports = {}; 689 var exports = {};
668 exports.align = align; 690 exports.align = align;
691 exports.isAligned = isAligned;
669 exports.Message = Message; 692 exports.Message = Message;
670 exports.MessageBuilder = MessageBuilder; 693 exports.MessageBuilder = MessageBuilder;
671 exports.MessageWithRequestIDBuilder = MessageWithRequestIDBuilder; 694 exports.MessageWithRequestIDBuilder = MessageWithRequestIDBuilder;
672 exports.MessageReader = MessageReader; 695 exports.MessageReader = MessageReader;
673 exports.kArrayHeaderSize = kArrayHeaderSize; 696 exports.kArrayHeaderSize = kArrayHeaderSize;
674 exports.kStructHeaderSize = kStructHeaderSize; 697 exports.kStructHeaderSize = kStructHeaderSize;
675 exports.kMessageHeaderSize = kMessageHeaderSize; 698 exports.kMessageHeaderSize = kMessageHeaderSize;
699 exports.kMessageWithRequestIDHeaderSize = kMessageWithRequestIDHeaderSize;
676 exports.kMessageExpectsResponse = kMessageExpectsResponse; 700 exports.kMessageExpectsResponse = kMessageExpectsResponse;
677 exports.kMessageIsResponse = kMessageIsResponse; 701 exports.kMessageIsResponse = kMessageIsResponse;
678 exports.Int8 = Int8; 702 exports.Int8 = Int8;
679 exports.Uint8 = Uint8; 703 exports.Uint8 = Uint8;
680 exports.Int16 = Int16; 704 exports.Int16 = Int16;
681 exports.Uint16 = Uint16; 705 exports.Uint16 = Uint16;
682 exports.Int32 = Int32; 706 exports.Int32 = Int32;
683 exports.Uint32 = Uint32; 707 exports.Uint32 = Uint32;
684 exports.Int64 = Int64; 708 exports.Int64 = Int64;
685 exports.Uint64 = Uint64; 709 exports.Uint64 = Uint64;
686 exports.Float = Float; 710 exports.Float = Float;
687 exports.Double = Double; 711 exports.Double = Double;
688 exports.String = String; 712 exports.String = String;
689 exports.PointerTo = PointerTo; 713 exports.PointerTo = PointerTo;
690 exports.ArrayOf = ArrayOf; 714 exports.ArrayOf = ArrayOf;
691 exports.ArrayOfBoolArrayPointers = ArrayOfBoolArrayPointers; 715 exports.ArrayOfBoolArrayPointers = ArrayOfBoolArrayPointers;
692 exports.Handle = Handle; 716 exports.Handle = Handle;
693 return exports; 717 return exports;
694 }); 718 });
OLDNEW
« no previous file with comments | « extensions/renderer/dispatcher.cc ('k') | mojo/public/js/bindings/constants.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698