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

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

Issue 2796253002: Associated Message Validation (Closed)
Patch Set: Formatting. Add braces to if statements in validateMessageHeader Created 3 years, 8 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
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/codec", [ 5 define("mojo/public/js/codec", [
6 "mojo/public/js/buffer", 6 "mojo/public/js/buffer",
7 "mojo/public/js/interface_types", 7 "mojo/public/js/interface_types",
8 "mojo/public/js/lib/interface_endpoint_handle",
8 "mojo/public/js/unicode", 9 "mojo/public/js/unicode",
9 ], function(buffer, types, unicode) { 10 ], function(buffer, types, interfaceEndpointHandle, unicode) {
10 11
11 var kErrorUnsigned = "Passing negative value to unsigned"; 12 var kErrorUnsigned = "Passing negative value to unsigned";
12 var kErrorArray = "Passing non Array for array type"; 13 var kErrorArray = "Passing non Array for array type";
13 var kErrorString = "Passing non String for string type"; 14 var kErrorString = "Passing non String for string type";
14 var kErrorMap = "Passing non Map for map type"; 15 var kErrorMap = "Passing non Map for map type";
16 var InterfaceEndpointHandle = interfaceEndpointHandle.InterfaceEndpointHandle;
15 17
16 // Memory ------------------------------------------------------------------- 18 // Memory -------------------------------------------------------------------
17 19
18 var kAlignment = 8; 20 var kAlignment = 8;
19 21
20 function align(size) { 22 function align(size) {
21 return size + (kAlignment - (size % kAlignment)) % kAlignment; 23 return size + (kAlignment - (size % kAlignment)) % kAlignment;
22 } 24 }
23 25
24 function isAligned(offset) { 26 function isAligned(offset) {
25 return offset >= 0 && (offset % kAlignment) === 0; 27 return offset >= 0 && (offset % kAlignment) === 0;
26 } 28 }
27 29
28 // Constants ---------------------------------------------------------------- 30 // Constants ----------------------------------------------------------------
29 31
30 var kArrayHeaderSize = 8; 32 var kArrayHeaderSize = 8;
31 var kStructHeaderSize = 8; 33 var kStructHeaderSize = 8;
32 var kMessageHeaderSize = 24; 34 var kMessageV0HeaderSize = 24;
33 var kMessageWithRequestIDHeaderSize = 32; 35 var kMessageV1HeaderSize = 32;
36 var kMessageV2HeaderSize = 48;
34 var kMapStructPayloadSize = 16; 37 var kMapStructPayloadSize = 16;
35 38
36 var kStructHeaderNumBytesOffset = 0; 39 var kStructHeaderNumBytesOffset = 0;
37 var kStructHeaderVersionOffset = 4; 40 var kStructHeaderVersionOffset = 4;
41 var kMessagePayloadInterfaceIdsPointerOffset = kMessageV2HeaderSize - 8;
yzshen1 2017/04/12 00:50:33 Please move this line to be below line 434
wangjimmy 2017/04/12 18:58:25 Done.
38 42
39 var kEncodedInvalidHandleValue = 0xFFFFFFFF; 43 var kEncodedInvalidHandleValue = 0xFFFFFFFF;
40 44
41 // Decoder ------------------------------------------------------------------ 45 // Decoder ------------------------------------------------------------------
42 46
43 function Decoder(buffer, handles, base) { 47 function Decoder(buffer, handles, base) {
44 this.buffer = buffer; 48 this.buffer = buffer;
45 this.handles = handles; 49 this.handles = handles;
46 this.base = base; 50 this.base = base;
47 this.next = base; 51 this.next = base;
(...skipping 402 matching lines...) Expand 10 before | Expand all | Expand 10 after
450 }; 454 };
451 455
452 Message.prototype.getFlags = function() { 456 Message.prototype.getFlags = function() {
453 return this.buffer.getUint32(kMessageFlagsOffset); 457 return this.buffer.getUint32(kMessageFlagsOffset);
454 }; 458 };
455 459
456 Message.prototype.getInterfaceId = function() { 460 Message.prototype.getInterfaceId = function() {
457 return this.buffer.getUint32(kMessageInterfaceIdOffset); 461 return this.buffer.getUint32(kMessageInterfaceIdOffset);
458 }; 462 };
459 463
464 Message.prototype.getPayloadInterfaceIds = function() {
465 if (this.getHeaderVersion() < 2) {
466 return null;
467 }
468
469 var decoder = new Decoder(this.buffer, this.handles,
470 kMessagePayloadInterfaceIdsPointerOffset);
471 var payloadInterfaceIds = decoder.decodeArrayPointer(Uint32);
472 return payloadInterfaceIds;
473 };
474
460 Message.prototype.isResponse = function() { 475 Message.prototype.isResponse = function() {
461 return (this.getFlags() & kMessageIsResponse) != 0; 476 return (this.getFlags() & kMessageIsResponse) != 0;
462 }; 477 };
463 478
464 Message.prototype.expectsResponse = function() { 479 Message.prototype.expectsResponse = function() {
465 return (this.getFlags() & kMessageExpectsResponse) != 0; 480 return (this.getFlags() & kMessageExpectsResponse) != 0;
466 }; 481 };
467 482
468 Message.prototype.setRequestID = function(requestID) { 483 Message.prototype.setRequestID = function(requestID) {
469 // TODO(darin): Verify that space was reserved for this field! 484 // TODO(darin): Verify that space was reserved for this field!
470 this.buffer.setUint64(kMessageRequestIDOffset, requestID); 485 this.buffer.setUint64(kMessageRequestIDOffset, requestID);
471 }; 486 };
472 487
473 Message.prototype.setInterfaceId = function(interfaceId) { 488 Message.prototype.setInterfaceId = function(interfaceId) {
474 this.buffer.setUint32(kMessageInterfaceIdOffset, interfaceId); 489 this.buffer.setUint32(kMessageInterfaceIdOffset, interfaceId);
475 }; 490 };
476 491
477 492
478 // MessageBuilder ----------------------------------------------------------- 493 // MessageBuilder -----------------------------------------------------------
479 494
480 function MessageBuilder(messageName, payloadSize) { 495 function MessageBuilder(messageName, payloadSize) {
481 // Currently, we don't compute the payload size correctly ahead of time. 496 // Currently, we don't compute the payload size correctly ahead of time.
482 // Instead, we resize the buffer at the end. 497 // Instead, we resize the buffer at the end.
483 var numberOfBytes = kMessageHeaderSize + payloadSize; 498 var numberOfBytes = kMessageV0HeaderSize + payloadSize;
484 this.buffer = new buffer.Buffer(numberOfBytes); 499 this.buffer = new buffer.Buffer(numberOfBytes);
485 this.handles = []; 500 this.handles = [];
486 var encoder = this.createEncoder(kMessageHeaderSize); 501 var encoder = this.createEncoder(kMessageV0HeaderSize);
487 encoder.writeUint32(kMessageHeaderSize); 502 encoder.writeUint32(kMessageV0HeaderSize);
488 encoder.writeUint32(0); // version. 503 encoder.writeUint32(0); // version.
489 encoder.writeUint32(0); // interface ID. 504 encoder.writeUint32(0); // interface ID.
490 encoder.writeUint32(messageName); 505 encoder.writeUint32(messageName);
491 encoder.writeUint32(0); // flags. 506 encoder.writeUint32(0); // flags.
492 encoder.writeUint32(0); // padding. 507 encoder.writeUint32(0); // padding.
493 } 508 }
494 509
495 MessageBuilder.prototype.createEncoder = function(size) { 510 MessageBuilder.prototype.createEncoder = function(size) {
496 var pointer = this.buffer.alloc(size); 511 var pointer = this.buffer.alloc(size);
497 return new Encoder(this.buffer, this.handles, pointer); 512 return new Encoder(this.buffer, this.handles, pointer);
(...skipping 13 matching lines...) Expand all
511 this.encoder = null; 526 this.encoder = null;
512 return message; 527 return message;
513 }; 528 };
514 529
515 // MessageWithRequestIDBuilder ----------------------------------------------- 530 // MessageWithRequestIDBuilder -----------------------------------------------
516 531
517 function MessageWithRequestIDBuilder(messageName, payloadSize, flags, 532 function MessageWithRequestIDBuilder(messageName, payloadSize, flags,
518 requestID) { 533 requestID) {
519 // Currently, we don't compute the payload size correctly ahead of time. 534 // Currently, we don't compute the payload size correctly ahead of time.
520 // Instead, we resize the buffer at the end. 535 // Instead, we resize the buffer at the end.
521 var numberOfBytes = kMessageWithRequestIDHeaderSize + payloadSize; 536 var numberOfBytes = kMessageV1HeaderSize + payloadSize;
522 this.buffer = new buffer.Buffer(numberOfBytes); 537 this.buffer = new buffer.Buffer(numberOfBytes);
523 this.handles = []; 538 this.handles = [];
524 var encoder = this.createEncoder(kMessageWithRequestIDHeaderSize); 539 var encoder = this.createEncoder(kMessageV1HeaderSize);
525 encoder.writeUint32(kMessageWithRequestIDHeaderSize); 540 encoder.writeUint32(kMessageV1HeaderSize);
526 encoder.writeUint32(1); // version. 541 encoder.writeUint32(1); // version.
527 encoder.writeUint32(0); // interface ID. 542 encoder.writeUint32(0); // interface ID.
528 encoder.writeUint32(messageName); 543 encoder.writeUint32(messageName);
529 encoder.writeUint32(flags); 544 encoder.writeUint32(flags);
530 encoder.writeUint32(0); // padding. 545 encoder.writeUint32(0); // padding.
531 encoder.writeUint64(requestID); 546 encoder.writeUint64(requestID);
532 } 547 }
533 548
534 MessageWithRequestIDBuilder.prototype = 549 MessageWithRequestIDBuilder.prototype =
535 Object.create(MessageBuilder.prototype); 550 Object.create(MessageBuilder.prototype);
(...skipping 295 matching lines...) Expand 10 before | Expand all | Expand 10 after
831 encoder.encodeHandle(interfacePtrInfo.handle); 846 encoder.encodeHandle(interfacePtrInfo.handle);
832 encoder.writeUint32(interfacePtrInfo.version); 847 encoder.writeUint32(interfacePtrInfo.version);
833 }; 848 };
834 849
835 function NullableInterface(cls) { 850 function NullableInterface(cls) {
836 Interface.call(this, cls); 851 Interface.call(this, cls);
837 } 852 }
838 853
839 NullableInterface.prototype = Object.create(Interface.prototype); 854 NullableInterface.prototype = Object.create(Interface.prototype);
840 855
856 function AssociatedInterfacePtrInfo() {
857 }
858
859 AssociatedInterfacePtrInfo.prototype.encodedSize = 8;
860
861 function NullableAssociatedInterfacePtrInfo() {
862 }
863
864 NullableAssociatedInterfacePtrInfo.encodedSize =
865 AssociatedInterfacePtrInfo.encodedSize;
866
841 function InterfaceRequest() { 867 function InterfaceRequest() {
842 } 868 }
843 869
844 InterfaceRequest.encodedSize = 4; 870 InterfaceRequest.encodedSize = 4;
845 871
846 InterfaceRequest.decode = function(decoder) { 872 InterfaceRequest.decode = function(decoder) {
847 return new types.InterfaceRequest(decoder.decodeHandle()); 873 return new types.InterfaceRequest(decoder.decodeHandle());
848 }; 874 };
849 875
850 InterfaceRequest.encode = function(encoder, val) { 876 InterfaceRequest.encode = function(encoder, val) {
851 encoder.encodeHandle(val ? val.handle : null); 877 encoder.encodeHandle(val ? val.handle : null);
852 }; 878 };
853 879
854 function NullableInterfaceRequest() { 880 function NullableInterfaceRequest() {
855 } 881 }
856 882
857 NullableInterfaceRequest.encodedSize = InterfaceRequest.encodedSize; 883 NullableInterfaceRequest.encodedSize = InterfaceRequest.encodedSize;
858 884
859 NullableInterfaceRequest.decode = InterfaceRequest.decode; 885 NullableInterfaceRequest.decode = InterfaceRequest.decode;
860 886
861 NullableInterfaceRequest.encode = InterfaceRequest.encode; 887 NullableInterfaceRequest.encode = InterfaceRequest.encode;
862 888
889 function AssociatedInterfaceRequest() {
890 }
891
892 AssociatedInterfaceRequest.encodedSize = 4;
893
894 function NullableAssociatedInterfaceRequest() {
895 }
896
897 NullableAssociatedInterfaceRequest.encodedSize =
898 AssociatedInterfaceRequest.encodedSize;
899
863 function MapOf(keyClass, valueClass) { 900 function MapOf(keyClass, valueClass) {
864 this.keyClass = keyClass; 901 this.keyClass = keyClass;
865 this.valueClass = valueClass; 902 this.valueClass = valueClass;
866 } 903 }
867 904
868 MapOf.prototype.encodedSize = 8; 905 MapOf.prototype.encodedSize = 8;
869 906
870 MapOf.prototype.decode = function(decoder) { 907 MapOf.prototype.decode = function(decoder) {
871 return decoder.decodeMapPointer(this.keyClass, this.valueClass); 908 return decoder.decodeMapPointer(this.keyClass, this.valueClass);
872 }; 909 };
(...skipping 12 matching lines...) Expand all
885 exports.align = align; 922 exports.align = align;
886 exports.isAligned = isAligned; 923 exports.isAligned = isAligned;
887 exports.Message = Message; 924 exports.Message = Message;
888 exports.MessageBuilder = MessageBuilder; 925 exports.MessageBuilder = MessageBuilder;
889 exports.MessageWithRequestIDBuilder = MessageWithRequestIDBuilder; 926 exports.MessageWithRequestIDBuilder = MessageWithRequestIDBuilder;
890 exports.MessageReader = MessageReader; 927 exports.MessageReader = MessageReader;
891 exports.kArrayHeaderSize = kArrayHeaderSize; 928 exports.kArrayHeaderSize = kArrayHeaderSize;
892 exports.kMapStructPayloadSize = kMapStructPayloadSize; 929 exports.kMapStructPayloadSize = kMapStructPayloadSize;
893 exports.kStructHeaderSize = kStructHeaderSize; 930 exports.kStructHeaderSize = kStructHeaderSize;
894 exports.kEncodedInvalidHandleValue = kEncodedInvalidHandleValue; 931 exports.kEncodedInvalidHandleValue = kEncodedInvalidHandleValue;
895 exports.kMessageHeaderSize = kMessageHeaderSize; 932 exports.kMessageV0HeaderSize = kMessageV0HeaderSize;
896 exports.kMessageWithRequestIDHeaderSize = kMessageWithRequestIDHeaderSize; 933 exports.kMessageV1HeaderSize = kMessageV1HeaderSize;
934 exports.kMessageV2HeaderSize = kMessageV2HeaderSize;
935 exports.kMessagePayloadInterfaceIdsPointerOffset =
yzshen1 2017/04/12 00:50:33 Is it necessary to export this value?
wangjimmy 2017/04/12 18:58:25 Yes, I use it as the offset for validateArrayPoint
936 kMessagePayloadInterfaceIdsPointerOffset;
897 exports.kMessageExpectsResponse = kMessageExpectsResponse; 937 exports.kMessageExpectsResponse = kMessageExpectsResponse;
898 exports.kMessageIsResponse = kMessageIsResponse; 938 exports.kMessageIsResponse = kMessageIsResponse;
899 exports.Int8 = Int8; 939 exports.Int8 = Int8;
900 exports.Uint8 = Uint8; 940 exports.Uint8 = Uint8;
901 exports.Int16 = Int16; 941 exports.Int16 = Int16;
902 exports.Uint16 = Uint16; 942 exports.Uint16 = Uint16;
903 exports.Int32 = Int32; 943 exports.Int32 = Int32;
904 exports.Uint32 = Uint32; 944 exports.Uint32 = Uint32;
905 exports.Int64 = Int64; 945 exports.Int64 = Int64;
906 exports.Uint64 = Uint64; 946 exports.Uint64 = Uint64;
907 exports.Float = Float; 947 exports.Float = Float;
908 exports.Double = Double; 948 exports.Double = Double;
909 exports.String = String; 949 exports.String = String;
910 exports.Enum = Enum; 950 exports.Enum = Enum;
911 exports.NullableString = NullableString; 951 exports.NullableString = NullableString;
912 exports.PointerTo = PointerTo; 952 exports.PointerTo = PointerTo;
913 exports.NullablePointerTo = NullablePointerTo; 953 exports.NullablePointerTo = NullablePointerTo;
914 exports.ArrayOf = ArrayOf; 954 exports.ArrayOf = ArrayOf;
915 exports.NullableArrayOf = NullableArrayOf; 955 exports.NullableArrayOf = NullableArrayOf;
916 exports.PackedBool = PackedBool; 956 exports.PackedBool = PackedBool;
917 exports.Handle = Handle; 957 exports.Handle = Handle;
918 exports.NullableHandle = NullableHandle; 958 exports.NullableHandle = NullableHandle;
919 exports.Interface = Interface; 959 exports.Interface = Interface;
920 exports.NullableInterface = NullableInterface; 960 exports.NullableInterface = NullableInterface;
921 exports.InterfaceRequest = InterfaceRequest; 961 exports.InterfaceRequest = InterfaceRequest;
922 exports.NullableInterfaceRequest = NullableInterfaceRequest; 962 exports.NullableInterfaceRequest = NullableInterfaceRequest;
963 exports.AssociatedInterfacePtrInfo = AssociatedInterfacePtrInfo;
964 exports.NullableAssociatedInterfacePtrInfo =
965 NullableAssociatedInterfacePtrInfo;
966 exports.AssociatedInterfaceRequest = AssociatedInterfaceRequest;
967 exports.NullableAssociatedInterfaceRequest =
968 NullableAssociatedInterfaceRequest;
923 exports.MapOf = MapOf; 969 exports.MapOf = MapOf;
924 exports.NullableMapOf = NullableMapOf; 970 exports.NullableMapOf = NullableMapOf;
925 return exports; 971 return exports;
926 }); 972 });
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698