diff options
author | blundell <blundell@chromium.org> | 2015-01-19 09:18:33 -0800 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2015-01-19 17:19:27 +0000 |
commit | 70fb54767b472a5edfb859e489beeeec7abdb0e4 (patch) | |
tree | 28e534ec774391a9f6571a1770e12a0d63ebf833 /mojo/public/js | |
parent | ba5f0233fa38f949e24f6274ba891fa652eab640 (diff) | |
download | chromium_src-70fb54767b472a5edfb859e489beeeec7abdb0e4.zip chromium_src-70fb54767b472a5edfb859e489beeeec7abdb0e4.tar.gz chromium_src-70fb54767b472a5edfb859e489beeeec7abdb0e4.tar.bz2 |
Move //mojo/{public, edk} underneath //third_party
This CL move //mojo/public and //mojo/edk to live in the following locations:
- //third_party/mojo/src/mojo/public
- //third_party/mojo/src/mojo/edk
It moves the related gypfiles from //mojo to //third_party/mojo and updates
them as necessary to account for the file moves. It also updates clients of the
mojo SDK and EDK targets in both GYP and GN. (Note that for GN, the mojo SDK
and EDK build systems are maintained in the Mojo repo and designed to be
flexible wrt the location of the SDK/EDK in a client repo, so no changes are
needed.
This CL does not update include paths to the code being moved to limit the
number of moving parts, instead relying on the include_dirs that the SDK and
EDK targets supply to their direct dependents to ensure that include paths
continue to resolve correctly.
NOPRESUBMIT=true
Review URL: https://codereview.chromium.org/814543006
Cr-Commit-Position: refs/heads/master@{#312129}
Diffstat (limited to 'mojo/public/js')
-rw-r--r-- | mojo/public/js/BUILD.gn | 12 | ||||
-rw-r--r-- | mojo/public/js/bindings.js | 100 | ||||
-rw-r--r-- | mojo/public/js/buffer.js | 156 | ||||
-rw-r--r-- | mojo/public/js/codec.js | 829 | ||||
-rw-r--r-- | mojo/public/js/codec_unittests.js | 292 | ||||
-rw-r--r-- | mojo/public/js/connection.js | 125 | ||||
-rw-r--r-- | mojo/public/js/connector.js | 132 | ||||
-rw-r--r-- | mojo/public/js/constants.cc | 18 | ||||
-rw-r--r-- | mojo/public/js/constants.h | 22 | ||||
-rw-r--r-- | mojo/public/js/core.js | 239 | ||||
-rw-r--r-- | mojo/public/js/core_unittests.js | 197 | ||||
-rw-r--r-- | mojo/public/js/router.js | 145 | ||||
-rw-r--r-- | mojo/public/js/struct_unittests.js | 271 | ||||
-rw-r--r-- | mojo/public/js/support.js | 30 | ||||
-rw-r--r-- | mojo/public/js/test/validation_test_input_parser.js | 299 | ||||
-rw-r--r-- | mojo/public/js/threading.js | 21 | ||||
-rw-r--r-- | mojo/public/js/unicode.js | 51 | ||||
-rw-r--r-- | mojo/public/js/validation_unittests.js | 302 | ||||
-rw-r--r-- | mojo/public/js/validator.js | 356 |
19 files changed, 0 insertions, 3597 deletions
diff --git a/mojo/public/js/BUILD.gn b/mojo/public/js/BUILD.gn deleted file mode 100644 index 1cb1a60..0000000 --- a/mojo/public/js/BUILD.gn +++ /dev/null @@ -1,12 +0,0 @@ -# Copyright 2014 The Chromium Authors. All rights reserved. -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -import("../mojo_sdk.gni") - -mojo_sdk_source_set("js") { - sources = [ - "constants.cc", - "constants.h", - ] -} diff --git a/mojo/public/js/bindings.js b/mojo/public/js/bindings.js deleted file mode 100644 index 5f85860..0000000 --- a/mojo/public/js/bindings.js +++ /dev/null @@ -1,100 +0,0 @@ -// Copyright 2014 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -define("mojo/public/js/bindings", [ - "mojo/public/js/router", -], function(router) { - - var Router = router.Router; - - var kProxyProperties = Symbol("proxyProperties"); - var kStubProperties = Symbol("stubProperties"); - - // Public proxy class properties that are managed at runtime by the JS - // bindings. See ProxyBindings below. - function ProxyProperties(receiver) { - this.receiver = receiver; - } - - ProxyProperties.prototype.getLocalDelegate = function() { - return this.local && StubBindings(this.local).delegate; - } - - ProxyProperties.prototype.setLocalDelegate = function(impl) { - if (this.local) - StubBindings(this.local).delegate = impl; - else - throw new Error("no stub object"); - } - - // Public stub class properties that are managed at runtime by the JS - // bindings. See StubBindings below. - function StubProperties(delegate) { - this.delegate = delegate; - } - - // The base class for generated proxy classes. - function ProxyBase(receiver) { - this[kProxyProperties] = new ProxyProperties(receiver); - - // TODO(hansmuller): Temporary, for Chrome backwards compatibility. - if (receiver instanceof Router) - this.receiver_ = receiver; - } - - // The base class for generated stub classes. - function StubBase(delegate) { - this[kStubProperties] = new StubProperties(delegate); - } - - // Provides access to properties added to a proxy object without risking - // Mojo interface name collisions. Unless otherwise specified, the initial - // value of all properties is undefined. - // - // ProxyBindings(proxy).connection - The Connection object that links the - // proxy for a remote Mojo service to an optional local stub for a local - // service. The value of ProxyBindings(proxy).connection.remote == proxy. - // - // ProxyBindings(proxy).local - The "local" stub object whose delegate - // implements the proxy's Mojo client interface. - // - // ProxyBindings(proxy).setLocalDelegate(impl) - Sets the implementation - // delegate of the proxy's client stub object. This is just shorthand - // for |StubBindings(ProxyBindings(proxy).local).delegate = impl|. - // - // ProxyBindings(proxy).getLocalDelegate() - Returns the implementation - // delegate of the proxy's client stub object. This is just shorthand - // for |StubBindings(ProxyBindings(proxy).local).delegate|. - - function ProxyBindings(proxy) { - return (proxy instanceof ProxyBase) ? proxy[kProxyProperties] : proxy; - } - - // Provides access to properties added to a stub object without risking - // Mojo interface name collisions. Unless otherwise specified, the initial - // value of all properties is undefined. - // - // StubBindings(stub).delegate - The optional implementation delegate for - // the Mojo interface stub. - // - // StubBindings(stub).connection - The Connection object that links an - // optional proxy for a remote service to this stub. The value of - // StubBindings(stub).connection.local == stub. - // - // StubBindings(stub).remote - A proxy for the the stub's Mojo client - // service. - - function StubBindings(stub) { - return stub instanceof StubBase ? stub[kStubProperties] : stub; - } - - var exports = {}; - exports.EmptyProxy = ProxyBase; - exports.EmptyStub = StubBase; - exports.ProxyBase = ProxyBase; - exports.ProxyBindings = ProxyBindings; - exports.StubBase = StubBase; - exports.StubBindings = StubBindings; - return exports; -});
\ No newline at end of file diff --git a/mojo/public/js/buffer.js b/mojo/public/js/buffer.js deleted file mode 100644 index e35f695..0000000 --- a/mojo/public/js/buffer.js +++ /dev/null @@ -1,156 +0,0 @@ -// Copyright 2014 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -define("mojo/public/js/buffer", function() { - - var kHostIsLittleEndian = (function () { - var endianArrayBuffer = new ArrayBuffer(2); - var endianUint8Array = new Uint8Array(endianArrayBuffer); - var endianUint16Array = new Uint16Array(endianArrayBuffer); - endianUint16Array[0] = 1; - return endianUint8Array[0] == 1; - })(); - - var kHighWordMultiplier = 0x100000000; - - function Buffer(sizeOrArrayBuffer) { - if (sizeOrArrayBuffer instanceof ArrayBuffer) - this.arrayBuffer = sizeOrArrayBuffer; - else - this.arrayBuffer = new ArrayBuffer(sizeOrArrayBuffer); - - this.dataView = new DataView(this.arrayBuffer); - this.next = 0; - } - - Object.defineProperty(Buffer.prototype, "byteLength", { - get: function() { return this.arrayBuffer.byteLength; } - }); - - Buffer.prototype.alloc = function(size) { - var pointer = this.next; - this.next += size; - if (this.next > this.byteLength) { - var newSize = (1.5 * (this.byteLength + size)) | 0; - this.grow(newSize); - } - return pointer; - }; - - function copyArrayBuffer(dstArrayBuffer, srcArrayBuffer) { - (new Uint8Array(dstArrayBuffer)).set(new Uint8Array(srcArrayBuffer)); - } - - Buffer.prototype.grow = function(size) { - var newArrayBuffer = new ArrayBuffer(size); - copyArrayBuffer(newArrayBuffer, this.arrayBuffer); - this.arrayBuffer = newArrayBuffer; - this.dataView = new DataView(this.arrayBuffer); - }; - - Buffer.prototype.trim = function() { - this.arrayBuffer = this.arrayBuffer.slice(0, this.next); - this.dataView = new DataView(this.arrayBuffer); - }; - - Buffer.prototype.getUint8 = function(offset) { - return this.dataView.getUint8(offset); - } - Buffer.prototype.getUint16 = function(offset) { - return this.dataView.getUint16(offset, kHostIsLittleEndian); - } - Buffer.prototype.getUint32 = function(offset) { - return this.dataView.getUint32(offset, kHostIsLittleEndian); - } - Buffer.prototype.getUint64 = function(offset) { - var lo, hi; - if (kHostIsLittleEndian) { - lo = this.dataView.getUint32(offset, kHostIsLittleEndian); - hi = this.dataView.getUint32(offset + 4, kHostIsLittleEndian); - } else { - hi = this.dataView.getUint32(offset, kHostIsLittleEndian); - lo = this.dataView.getUint32(offset + 4, kHostIsLittleEndian); - } - return lo + hi * kHighWordMultiplier; - } - - Buffer.prototype.getInt8 = function(offset) { - return this.dataView.getInt8(offset); - } - Buffer.prototype.getInt16 = function(offset) { - return this.dataView.getInt16(offset, kHostIsLittleEndian); - } - Buffer.prototype.getInt32 = function(offset) { - return this.dataView.getInt32(offset, kHostIsLittleEndian); - } - Buffer.prototype.getInt64 = function(offset) { - var lo, hi; - if (kHostIsLittleEndian) { - lo = this.dataView.getUint32(offset, kHostIsLittleEndian); - hi = this.dataView.getInt32(offset + 4, kHostIsLittleEndian); - } else { - hi = this.dataView.getInt32(offset, kHostIsLittleEndian); - lo = this.dataView.getUint32(offset + 4, kHostIsLittleEndian); - } - return lo + hi * kHighWordMultiplier; - } - - Buffer.prototype.getFloat32 = function(offset) { - return this.dataView.getFloat32(offset, kHostIsLittleEndian); - } - Buffer.prototype.getFloat64 = function(offset) { - return this.dataView.getFloat64(offset, kHostIsLittleEndian); - } - - Buffer.prototype.setUint8 = function(offset, value) { - this.dataView.setUint8(offset, value); - } - Buffer.prototype.setUint16 = function(offset, value) { - this.dataView.setUint16(offset, value, kHostIsLittleEndian); - } - Buffer.prototype.setUint32 = function(offset, value) { - this.dataView.setUint32(offset, value, kHostIsLittleEndian); - } - Buffer.prototype.setUint64 = function(offset, value) { - var hi = (value / kHighWordMultiplier) | 0; - if (kHostIsLittleEndian) { - this.dataView.setInt32(offset, value, kHostIsLittleEndian); - this.dataView.setInt32(offset + 4, hi, kHostIsLittleEndian); - } else { - this.dataView.setInt32(offset, hi, kHostIsLittleEndian); - this.dataView.setInt32(offset + 4, value, kHostIsLittleEndian); - } - } - - Buffer.prototype.setInt8 = function(offset, value) { - this.dataView.setInt8(offset, value); - } - Buffer.prototype.setInt16 = function(offset, value) { - this.dataView.setInt16(offset, value, kHostIsLittleEndian); - } - Buffer.prototype.setInt32 = function(offset, value) { - this.dataView.setInt32(offset, value, kHostIsLittleEndian); - } - Buffer.prototype.setInt64 = function(offset, value) { - var hi = Math.floor(value / kHighWordMultiplier); - if (kHostIsLittleEndian) { - this.dataView.setInt32(offset, value, kHostIsLittleEndian); - this.dataView.setInt32(offset + 4, hi, kHostIsLittleEndian); - } else { - this.dataView.setInt32(offset, hi, kHostIsLittleEndian); - this.dataView.setInt32(offset + 4, value, kHostIsLittleEndian); - } - } - - Buffer.prototype.setFloat32 = function(offset, value) { - this.dataView.setFloat32(offset, value, kHostIsLittleEndian); - } - Buffer.prototype.setFloat64 = function(offset, value) { - this.dataView.setFloat64(offset, value, kHostIsLittleEndian); - } - - var exports = {}; - exports.Buffer = Buffer; - return exports; -}); diff --git a/mojo/public/js/codec.js b/mojo/public/js/codec.js deleted file mode 100644 index 357e507..0000000 --- a/mojo/public/js/codec.js +++ /dev/null @@ -1,829 +0,0 @@ -// Copyright 2014 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -define("mojo/public/js/codec", [ - "mojo/public/js/unicode", - "mojo/public/js/buffer", -], function(unicode, buffer) { - - var kErrorUnsigned = "Passing negative value to unsigned"; - var kErrorArray = "Passing non Array for array type"; - var kErrorString = "Passing non String for string type"; - var kErrorMap = "Passing non Map for map type"; - - // Memory ------------------------------------------------------------------- - - var kAlignment = 8; - - function align(size) { - return size + (kAlignment - (size % kAlignment)) % kAlignment; - } - - function isAligned(offset) { - return offset >= 0 && (offset % kAlignment) === 0; - } - - // Constants ---------------------------------------------------------------- - - var kArrayHeaderSize = 8; - var kStructHeaderSize = 8; - var kMessageHeaderSize = 16; - var kMessageWithRequestIDHeaderSize = 24; - var kMapStructPayloadSize = 16; - - var kStructHeaderNumBytesOffset = 0; - var kStructHeaderNumFieldsOffset = 4; - - var kEncodedInvalidHandleValue = 0xFFFFFFFF; - - // Decoder ------------------------------------------------------------------ - - function Decoder(buffer, handles, base) { - this.buffer = buffer; - this.handles = handles; - this.base = base; - this.next = base; - } - - Decoder.prototype.skip = function(offset) { - this.next += offset; - }; - - Decoder.prototype.readInt8 = function() { - var result = this.buffer.getInt8(this.next); - this.next += 1; - return result; - }; - - Decoder.prototype.readUint8 = function() { - var result = this.buffer.getUint8(this.next); - this.next += 1; - return result; - }; - - Decoder.prototype.readInt16 = function() { - var result = this.buffer.getInt16(this.next); - this.next += 2; - return result; - }; - - Decoder.prototype.readUint16 = function() { - var result = this.buffer.getUint16(this.next); - this.next += 2; - return result; - }; - - Decoder.prototype.readInt32 = function() { - var result = this.buffer.getInt32(this.next); - this.next += 4; - return result; - }; - - Decoder.prototype.readUint32 = function() { - var result = this.buffer.getUint32(this.next); - this.next += 4; - return result; - }; - - Decoder.prototype.readInt64 = function() { - var result = this.buffer.getInt64(this.next); - this.next += 8; - return result; - }; - - Decoder.prototype.readUint64 = function() { - var result = this.buffer.getUint64(this.next); - this.next += 8; - return result; - }; - - Decoder.prototype.readFloat = function() { - var result = this.buffer.getFloat32(this.next); - this.next += 4; - return result; - }; - - Decoder.prototype.readDouble = function() { - var result = this.buffer.getFloat64(this.next); - this.next += 8; - return result; - }; - - Decoder.prototype.decodePointer = function() { - // TODO(abarth): To correctly decode a pointer, we need to know the real - // base address of the array buffer. - var offsetPointer = this.next; - var offset = this.readUint64(); - if (!offset) - return 0; - return offsetPointer + offset; - }; - - Decoder.prototype.decodeAndCreateDecoder = function(pointer) { - return new Decoder(this.buffer, this.handles, pointer); - }; - - Decoder.prototype.decodeHandle = function() { - return this.handles[this.readUint32()] || null; - }; - - Decoder.prototype.decodeString = function() { - var numberOfBytes = this.readUint32(); - var numberOfElements = this.readUint32(); - var base = this.next; - this.next += numberOfElements; - return unicode.decodeUtf8String( - new Uint8Array(this.buffer.arrayBuffer, base, numberOfElements)); - }; - - Decoder.prototype.decodeArray = function(cls) { - var numberOfBytes = this.readUint32(); - var numberOfElements = this.readUint32(); - var val = new Array(numberOfElements); - if (cls === PackedBool) { - var byte; - for (var i = 0; i < numberOfElements; ++i) { - if (i % 8 === 0) - byte = this.readUint8(); - val[i] = (byte & (1 << i % 8)) ? true : false; - } - } else { - for (var i = 0; i < numberOfElements; ++i) { - val[i] = cls.decode(this); - } - } - return val; - }; - - Decoder.prototype.decodeStruct = function(cls) { - return cls.decode(this); - }; - - Decoder.prototype.decodeStructPointer = function(cls) { - var pointer = this.decodePointer(); - if (!pointer) { - return null; - } - return cls.decode(this.decodeAndCreateDecoder(pointer)); - }; - - Decoder.prototype.decodeArrayPointer = function(cls) { - var pointer = this.decodePointer(); - if (!pointer) { - return null; - } - return this.decodeAndCreateDecoder(pointer).decodeArray(cls); - }; - - Decoder.prototype.decodeStringPointer = function() { - var pointer = this.decodePointer(); - if (!pointer) { - return null; - } - return this.decodeAndCreateDecoder(pointer).decodeString(); - }; - - Decoder.prototype.decodeMap = function(keyClass, valueClass) { - this.skip(4); // numberOfBytes - this.skip(4); // numberOfFields - var keys = this.decodeArrayPointer(keyClass); - var values = this.decodeArrayPointer(valueClass); - var val = new Map(); - for (var i = 0; i < keys.length; i++) - val.set(keys[i], values[i]); - return val; - }; - - Decoder.prototype.decodeMapPointer = function(keyClass, valueClass) { - var pointer = this.decodePointer(); - if (!pointer) { - return null; - } - var decoder = this.decodeAndCreateDecoder(pointer); - return decoder.decodeMap(keyClass, valueClass); - }; - - // Encoder ------------------------------------------------------------------ - - function Encoder(buffer, handles, base) { - this.buffer = buffer; - this.handles = handles; - this.base = base; - this.next = base; - } - - Encoder.prototype.skip = function(offset) { - this.next += offset; - }; - - Encoder.prototype.writeInt8 = function(val) { - this.buffer.setInt8(this.next, val); - this.next += 1; - }; - - Encoder.prototype.writeUint8 = function(val) { - if (val < 0) { - throw new Error(kErrorUnsigned); - } - this.buffer.setUint8(this.next, val); - this.next += 1; - }; - - Encoder.prototype.writeInt16 = function(val) { - this.buffer.setInt16(this.next, val); - this.next += 2; - }; - - Encoder.prototype.writeUint16 = function(val) { - if (val < 0) { - throw new Error(kErrorUnsigned); - } - this.buffer.setUint16(this.next, val); - this.next += 2; - }; - - Encoder.prototype.writeInt32 = function(val) { - this.buffer.setInt32(this.next, val); - this.next += 4; - }; - - Encoder.prototype.writeUint32 = function(val) { - if (val < 0) { - throw new Error(kErrorUnsigned); - } - this.buffer.setUint32(this.next, val); - this.next += 4; - }; - - Encoder.prototype.writeInt64 = function(val) { - this.buffer.setInt64(this.next, val); - this.next += 8; - }; - - Encoder.prototype.writeUint64 = function(val) { - if (val < 0) { - throw new Error(kErrorUnsigned); - } - this.buffer.setUint64(this.next, val); - this.next += 8; - }; - - Encoder.prototype.writeFloat = function(val) { - this.buffer.setFloat32(this.next, val); - this.next += 4; - }; - - Encoder.prototype.writeDouble = function(val) { - this.buffer.setFloat64(this.next, val); - this.next += 8; - }; - - Encoder.prototype.encodePointer = function(pointer) { - if (!pointer) - return this.writeUint64(0); - // TODO(abarth): To correctly encode a pointer, we need to know the real - // base address of the array buffer. - var offset = pointer - this.next; - this.writeUint64(offset); - }; - - Encoder.prototype.createAndEncodeEncoder = function(size) { - var pointer = this.buffer.alloc(align(size)); - this.encodePointer(pointer); - return new Encoder(this.buffer, this.handles, pointer); - }; - - Encoder.prototype.encodeHandle = function(handle) { - this.handles.push(handle); - this.writeUint32(this.handles.length - 1); - }; - - Encoder.prototype.encodeString = function(val) { - var base = this.next + kArrayHeaderSize; - var numberOfElements = unicode.encodeUtf8String( - val, new Uint8Array(this.buffer.arrayBuffer, base)); - var numberOfBytes = kArrayHeaderSize + numberOfElements; - this.writeUint32(numberOfBytes); - this.writeUint32(numberOfElements); - this.next += numberOfElements; - }; - - Encoder.prototype.encodeArray = - function(cls, val, numberOfElements, encodedSize) { - if (numberOfElements === undefined) - numberOfElements = val.length; - if (encodedSize === undefined) - encodedSize = kArrayHeaderSize + cls.encodedSize * numberOfElements; - - this.writeUint32(encodedSize); - this.writeUint32(numberOfElements); - - if (cls === PackedBool) { - var byte = 0; - for (i = 0; i < numberOfElements; ++i) { - if (val[i]) - byte |= (1 << i % 8); - if (i % 8 === 7 || i == numberOfElements - 1) { - Uint8.encode(this, byte); - byte = 0; - } - } - } else { - for (var i = 0; i < numberOfElements; ++i) - cls.encode(this, val[i]); - } - }; - - Encoder.prototype.encodeStruct = function(cls, val) { - return cls.encode(this, val); - }; - - Encoder.prototype.encodeStructPointer = function(cls, val) { - if (val == null) { - // Also handles undefined, since undefined == null. - this.encodePointer(val); - return; - } - var encoder = this.createAndEncodeEncoder(cls.encodedSize); - cls.encode(encoder, val); - }; - - Encoder.prototype.encodeArrayPointer = function(cls, val) { - if (val == null) { - // Also handles undefined, since undefined == null. - this.encodePointer(val); - return; - } - - var numberOfElements = val.length; - if (!Number.isSafeInteger(numberOfElements) || numberOfElements < 0) - throw new Error(kErrorArray); - - var encodedSize = kArrayHeaderSize + ((cls === PackedBool) ? - Math.ceil(numberOfElements / 8) : cls.encodedSize * numberOfElements); - var encoder = this.createAndEncodeEncoder(encodedSize); - encoder.encodeArray(cls, val, numberOfElements, encodedSize); - }; - - Encoder.prototype.encodeStringPointer = function(val) { - if (val == null) { - // Also handles undefined, since undefined == null. - this.encodePointer(val); - return; - } - // Only accepts string primivites, not String Objects like new String("foo") - if (typeof(val) !== "string") { - throw new Error(kErrorString); - } - var encodedSize = kArrayHeaderSize + unicode.utf8Length(val); - var encoder = this.createAndEncodeEncoder(encodedSize); - encoder.encodeString(val); - }; - - Encoder.prototype.encodeMap = function(keyClass, valueClass, val) { - var keys = new Array(val.size); - var values = new Array(val.size); - var i = 0; - val.forEach(function(value, key) { - values[i] = value; - keys[i++] = key; - }); - this.writeUint32(kStructHeaderSize + kMapStructPayloadSize); - this.writeUint32(2); // two fields: keys, values - this.encodeArrayPointer(keyClass, keys); - this.encodeArrayPointer(valueClass, values); - } - - Encoder.prototype.encodeMapPointer = function(keyClass, valueClass, val) { - if (val == null) { - // Also handles undefined, since undefined == null. - this.encodePointer(val); - return; - } - if (!(val instanceof Map)) { - throw new Error(kErrorMap); - } - var encodedSize = kStructHeaderSize + kMapStructPayloadSize; - var encoder = this.createAndEncodeEncoder(encodedSize); - encoder.encodeMap(keyClass, valueClass, val); - }; - - // Message ------------------------------------------------------------------ - - var kMessageNameOffset = kStructHeaderSize; - var kMessageFlagsOffset = kMessageNameOffset + 4; - var kMessageRequestIDOffset = kMessageFlagsOffset + 4; - - var kMessageExpectsResponse = 1 << 0; - var kMessageIsResponse = 1 << 1; - - function Message(buffer, handles) { - this.buffer = buffer; - this.handles = handles; - } - - Message.prototype.getHeaderNumBytes = function() { - return this.buffer.getUint32(kStructHeaderNumBytesOffset); - }; - - Message.prototype.getHeaderNumFields = function() { - return this.buffer.getUint32(kStructHeaderNumFieldsOffset); - }; - - Message.prototype.getName = function() { - return this.buffer.getUint32(kMessageNameOffset); - }; - - Message.prototype.getFlags = function() { - return this.buffer.getUint32(kMessageFlagsOffset); - }; - - Message.prototype.isResponse = function() { - return (this.getFlags() & kMessageIsResponse) != 0; - }; - - Message.prototype.expectsResponse = function() { - return (this.getFlags() & kMessageExpectsResponse) != 0; - }; - - Message.prototype.setRequestID = function(requestID) { - // TODO(darin): Verify that space was reserved for this field! - this.buffer.setUint64(kMessageRequestIDOffset, requestID); - }; - - - // MessageBuilder ----------------------------------------------------------- - - function MessageBuilder(messageName, payloadSize) { - // Currently, we don't compute the payload size correctly ahead of time. - // Instead, we resize the buffer at the end. - var numberOfBytes = kMessageHeaderSize + payloadSize; - this.buffer = new buffer.Buffer(numberOfBytes); - this.handles = []; - var encoder = this.createEncoder(kMessageHeaderSize); - encoder.writeUint32(kMessageHeaderSize); - encoder.writeUint32(2); // num_fields. - encoder.writeUint32(messageName); - encoder.writeUint32(0); // flags. - } - - MessageBuilder.prototype.createEncoder = function(size) { - var pointer = this.buffer.alloc(size); - return new Encoder(this.buffer, this.handles, pointer); - }; - - MessageBuilder.prototype.encodeStruct = function(cls, val) { - cls.encode(this.createEncoder(cls.encodedSize), val); - }; - - MessageBuilder.prototype.finish = function() { - // TODO(abarth): Rather than resizing the buffer at the end, we could - // compute the size we need ahead of time, like we do in C++. - this.buffer.trim(); - var message = new Message(this.buffer, this.handles); - this.buffer = null; - this.handles = null; - this.encoder = null; - return message; - }; - - // MessageWithRequestIDBuilder ----------------------------------------------- - - function MessageWithRequestIDBuilder(messageName, payloadSize, flags, - requestID) { - // Currently, we don't compute the payload size correctly ahead of time. - // Instead, we resize the buffer at the end. - var numberOfBytes = kMessageWithRequestIDHeaderSize + payloadSize; - this.buffer = new buffer.Buffer(numberOfBytes); - this.handles = []; - var encoder = this.createEncoder(kMessageWithRequestIDHeaderSize); - encoder.writeUint32(kMessageWithRequestIDHeaderSize); - encoder.writeUint32(3); // num_fields. - encoder.writeUint32(messageName); - encoder.writeUint32(flags); - encoder.writeUint64(requestID); - } - - MessageWithRequestIDBuilder.prototype = - Object.create(MessageBuilder.prototype); - - MessageWithRequestIDBuilder.prototype.constructor = - MessageWithRequestIDBuilder; - - // MessageReader ------------------------------------------------------------ - - function MessageReader(message) { - this.decoder = new Decoder(message.buffer, message.handles, 0); - var messageHeaderSize = this.decoder.readUint32(); - this.payloadSize = message.buffer.byteLength - messageHeaderSize; - var numFields = this.decoder.readUint32(); - this.messageName = this.decoder.readUint32(); - this.flags = this.decoder.readUint32(); - if (numFields >= 3) - this.requestID = this.decoder.readUint64(); - this.decoder.skip(messageHeaderSize - this.decoder.next); - } - - MessageReader.prototype.decodeStruct = function(cls) { - return cls.decode(this.decoder); - }; - - // Built-in types ----------------------------------------------------------- - - // This type is only used with ArrayOf(PackedBool). - function PackedBool() { - } - - function Int8() { - } - - Int8.encodedSize = 1; - - Int8.decode = function(decoder) { - return decoder.readInt8(); - }; - - Int8.encode = function(encoder, val) { - encoder.writeInt8(val); - }; - - Uint8.encode = function(encoder, val) { - encoder.writeUint8(val); - }; - - function Uint8() { - } - - Uint8.encodedSize = 1; - - Uint8.decode = function(decoder) { - return decoder.readUint8(); - }; - - Uint8.encode = function(encoder, val) { - encoder.writeUint8(val); - }; - - function Int16() { - } - - Int16.encodedSize = 2; - - Int16.decode = function(decoder) { - return decoder.readInt16(); - }; - - Int16.encode = function(encoder, val) { - encoder.writeInt16(val); - }; - - function Uint16() { - } - - Uint16.encodedSize = 2; - - Uint16.decode = function(decoder) { - return decoder.readUint16(); - }; - - Uint16.encode = function(encoder, val) { - encoder.writeUint16(val); - }; - - function Int32() { - } - - Int32.encodedSize = 4; - - Int32.decode = function(decoder) { - return decoder.readInt32(); - }; - - Int32.encode = function(encoder, val) { - encoder.writeInt32(val); - }; - - function Uint32() { - } - - Uint32.encodedSize = 4; - - Uint32.decode = function(decoder) { - return decoder.readUint32(); - }; - - Uint32.encode = function(encoder, val) { - encoder.writeUint32(val); - }; - - function Int64() { - } - - Int64.encodedSize = 8; - - Int64.decode = function(decoder) { - return decoder.readInt64(); - }; - - Int64.encode = function(encoder, val) { - encoder.writeInt64(val); - }; - - function Uint64() { - } - - Uint64.encodedSize = 8; - - Uint64.decode = function(decoder) { - return decoder.readUint64(); - }; - - Uint64.encode = function(encoder, val) { - encoder.writeUint64(val); - }; - - function String() { - }; - - String.encodedSize = 8; - - String.decode = function(decoder) { - return decoder.decodeStringPointer(); - }; - - String.encode = function(encoder, val) { - encoder.encodeStringPointer(val); - }; - - function NullableString() { - } - - NullableString.encodedSize = String.encodedSize; - - NullableString.decode = String.decode; - - NullableString.encode = String.encode; - - function Float() { - } - - Float.encodedSize = 4; - - Float.decode = function(decoder) { - return decoder.readFloat(); - }; - - Float.encode = function(encoder, val) { - encoder.writeFloat(val); - }; - - function Double() { - } - - Double.encodedSize = 8; - - Double.decode = function(decoder) { - return decoder.readDouble(); - }; - - Double.encode = function(encoder, val) { - encoder.writeDouble(val); - }; - - function PointerTo(cls) { - this.cls = cls; - } - - PointerTo.prototype.encodedSize = 8; - - PointerTo.prototype.decode = function(decoder) { - 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); - }; - - function NullablePointerTo(cls) { - PointerTo.call(this, cls); - } - - NullablePointerTo.prototype = Object.create(PointerTo.prototype); - - function ArrayOf(cls, length) { - this.cls = cls; - this.length = length || 0; - } - - ArrayOf.prototype.encodedSize = 8; - - ArrayOf.prototype.dimensions = function() { - return [this.length].concat( - (this.cls instanceof ArrayOf) ? this.cls.dimensions() : []); - } - - ArrayOf.prototype.decode = function(decoder) { - return decoder.decodeArrayPointer(this.cls); - }; - - ArrayOf.prototype.encode = function(encoder, val) { - encoder.encodeArrayPointer(this.cls, val); - }; - - function NullableArrayOf(cls) { - ArrayOf.call(this, cls); - } - - NullableArrayOf.prototype = Object.create(ArrayOf.prototype); - - function Handle() { - } - - Handle.encodedSize = 4; - - Handle.decode = function(decoder) { - return decoder.decodeHandle(); - }; - - Handle.encode = function(encoder, val) { - encoder.encodeHandle(val); - }; - - function NullableHandle() { - } - - NullableHandle.encodedSize = Handle.encodedSize; - - NullableHandle.decode = Handle.decode; - - NullableHandle.encode = Handle.encode; - - function MapOf(keyClass, valueClass) { - this.keyClass = keyClass; - this.valueClass = valueClass; - } - - MapOf.prototype.encodedSize = 8; - - MapOf.prototype.decode = function(decoder) { - return decoder.decodeMapPointer(this.keyClass, this.valueClass); - }; - - MapOf.prototype.encode = function(encoder, val) { - encoder.encodeMapPointer(this.keyClass, this.valueClass, val); - }; - - function NullableMapOf(keyClass, valueClass) { - MapOf.call(this, keyClass, valueClass); - } - - NullableMapOf.prototype = Object.create(MapOf.prototype); - - var exports = {}; - exports.align = align; - exports.isAligned = isAligned; - exports.Message = Message; - exports.MessageBuilder = MessageBuilder; - exports.MessageWithRequestIDBuilder = MessageWithRequestIDBuilder; - exports.MessageReader = MessageReader; - exports.kArrayHeaderSize = kArrayHeaderSize; - exports.kMapStructPayloadSize = kMapStructPayloadSize; - exports.kStructHeaderSize = kStructHeaderSize; - exports.kEncodedInvalidHandleValue = kEncodedInvalidHandleValue; - exports.kMessageHeaderSize = kMessageHeaderSize; - exports.kMessageWithRequestIDHeaderSize = kMessageWithRequestIDHeaderSize; - exports.kMessageExpectsResponse = kMessageExpectsResponse; - exports.kMessageIsResponse = kMessageIsResponse; - exports.Int8 = Int8; - exports.Uint8 = Uint8; - exports.Int16 = Int16; - exports.Uint16 = Uint16; - exports.Int32 = Int32; - exports.Uint32 = Uint32; - exports.Int64 = Int64; - exports.Uint64 = Uint64; - exports.Float = Float; - exports.Double = Double; - exports.String = String; - exports.NullableString = NullableString; - exports.PointerTo = PointerTo; - exports.NullablePointerTo = NullablePointerTo; - exports.ArrayOf = ArrayOf; - exports.NullableArrayOf = NullableArrayOf; - exports.PackedBool = PackedBool; - exports.Handle = Handle; - exports.NullableHandle = NullableHandle; - exports.MapOf = MapOf; - exports.NullableMapOf = NullableMapOf; - return exports; -}); diff --git a/mojo/public/js/codec_unittests.js b/mojo/public/js/codec_unittests.js deleted file mode 100644 index 3d3ac9c..0000000 --- a/mojo/public/js/codec_unittests.js +++ /dev/null @@ -1,292 +0,0 @@ -// Copyright 2014 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -define([ - "gin/test/expect", - "mojo/public/js/codec", - "mojo/public/interfaces/bindings/tests/rect.mojom", - "mojo/public/interfaces/bindings/tests/sample_service.mojom", - "mojo/public/interfaces/bindings/tests/test_structs.mojom", - ], function(expect, codec, rect, sample, structs) { - testBar(); - testFoo(); - testNamedRegion(); - testTypes(); - testAlign(); - testUtf8(); - testTypedPointerValidation(); - this.result = "PASS"; - - function testBar() { - var bar = new sample.Bar(); - bar.alpha = 1; - bar.beta = 2; - bar.gamma = 3; - bar.type = 0x08070605; - bar.extraProperty = "banana"; - - var messageName = 42; - var payloadSize = sample.Bar.encodedSize; - - var builder = new codec.MessageBuilder(messageName, payloadSize); - builder.encodeStruct(sample.Bar, bar); - - var message = builder.finish(); - - var expectedMemory = new Uint8Array([ - 16, 0, 0, 0, - 2, 0, 0, 0, - 42, 0, 0, 0, - 0, 0, 0, 0, - - 16, 0, 0, 0, - 4, 0, 0, 0, - - 1, 2, 3, 0, - 5, 6, 7, 8, - ]); - - var actualMemory = new Uint8Array(message.buffer.arrayBuffer); - expect(actualMemory).toEqual(expectedMemory); - - var reader = new codec.MessageReader(message); - - expect(reader.payloadSize).toBe(payloadSize); - expect(reader.messageName).toBe(messageName); - - var bar2 = reader.decodeStruct(sample.Bar); - - expect(bar2.alpha).toBe(bar.alpha); - expect(bar2.beta).toBe(bar.beta); - expect(bar2.gamma).toBe(bar.gamma); - expect("extraProperty" in bar2).toBeFalsy(); - } - - function testFoo() { - var foo = new sample.Foo(); - foo.x = 0x212B4D5; - foo.y = 0x16E93; - foo.a = 1; - foo.b = 0; - foo.c = 3; // This will get truncated to one bit. - foo.bar = new sample.Bar(); - foo.bar.alpha = 91; - foo.bar.beta = 82; - foo.bar.gamma = 73; - foo.data = [ - 4, 5, 6, 7, 8, - ]; - foo.extra_bars = [ - new sample.Bar(), new sample.Bar(), new sample.Bar(), - ]; - for (var i = 0; i < foo.extra_bars.length; ++i) { - foo.extra_bars[i].alpha = 1 * i; - foo.extra_bars[i].beta = 2 * i; - foo.extra_bars[i].gamma = 3 * i; - } - foo.name = "I am a banana"; - // This is supposed to be a handle, but we fake it with an integer. - foo.source = 23423782; - foo.array_of_array_of_bools = [ - [true], [false, true] - ]; - foo.array_of_bools = [ - true, false, true, false, true, false, true, true - ]; - - - var messageName = 31; - var payloadSize = 304; - - var builder = new codec.MessageBuilder(messageName, payloadSize); - builder.encodeStruct(sample.Foo, foo); - - var message = builder.finish(); - - var expectedMemory = new Uint8Array([ - /* 0: */ 16, 0, 0, 0, 2, 0, 0, 0, - /* 8: */ 31, 0, 0, 0, 0, 0, 0, 0, - /* 16: */ 96, 0, 0, 0, 15, 0, 0, 0, - /* 24: */ 0xD5, 0xB4, 0x12, 0x02, 0x93, 0x6E, 0x01, 0, - /* 32: */ 5, 0, 0, 0, 0, 0, 0, 0, - /* 40: */ 72, 0, 0, 0, 0, 0, 0, 0, - ]); - // TODO(abarth): Test more of the message's raw memory. - var actualMemory = new Uint8Array(message.buffer.arrayBuffer, - 0, expectedMemory.length); - expect(actualMemory).toEqual(expectedMemory); - - var expectedHandles = [ - 23423782, - ]; - - expect(message.handles).toEqual(expectedHandles); - - var reader = new codec.MessageReader(message); - - expect(reader.payloadSize).toBe(payloadSize); - expect(reader.messageName).toBe(messageName); - - var foo2 = reader.decodeStruct(sample.Foo); - - expect(foo2.x).toBe(foo.x); - expect(foo2.y).toBe(foo.y); - - expect(foo2.a).toBe(foo.a & 1 ? true : false); - expect(foo2.b).toBe(foo.b & 1 ? true : false); - expect(foo2.c).toBe(foo.c & 1 ? true : false); - - expect(foo2.bar).toEqual(foo.bar); - expect(foo2.data).toEqual(foo.data); - - expect(foo2.extra_bars).toEqual(foo.extra_bars); - expect(foo2.name).toBe(foo.name); - expect(foo2.source).toEqual(foo.source); - - expect(foo2.array_of_bools).toEqual(foo.array_of_bools); - } - - function createRect(x, y, width, height) { - var r = new rect.Rect(); - r.x = x; - r.y = y; - r.width = width; - r.height = height; - return r; - } - - // Verify that the references to the imported Rect type in test_structs.mojom - // are generated correctly. - function testNamedRegion() { - var r = new structs.NamedRegion(); - r.name = "rectangle"; - r.rects = new Array(createRect(1, 2, 3, 4), createRect(10, 20, 30, 40)); - - var builder = new codec.MessageBuilder(1, structs.NamedRegion.encodedSize); - builder.encodeStruct(structs.NamedRegion, r); - var reader = new codec.MessageReader(builder.finish()); - var result = reader.decodeStruct(structs.NamedRegion); - - expect(result.name).toEqual("rectangle"); - expect(result.rects[0]).toEqual(createRect(1, 2, 3, 4)); - expect(result.rects[1]).toEqual(createRect(10, 20, 30, 40)); - } - - function testTypes() { - function encodeDecode(cls, input, expectedResult, encodedSize) { - var messageName = 42; - var payloadSize = encodedSize || cls.encodedSize; - - var builder = new codec.MessageBuilder(messageName, payloadSize); - builder.encodeStruct(cls, input) - var message = builder.finish(); - - var reader = new codec.MessageReader(message); - expect(reader.payloadSize).toBe(payloadSize); - expect(reader.messageName).toBe(messageName); - var result = reader.decodeStruct(cls); - expect(result).toEqual(expectedResult); - } - encodeDecode(codec.String, "banana", "banana", 24); - encodeDecode(codec.NullableString, null, null, 8); - encodeDecode(codec.Int8, -1, -1); - encodeDecode(codec.Int8, 0xff, -1); - encodeDecode(codec.Int16, -1, -1); - encodeDecode(codec.Int16, 0xff, 0xff); - encodeDecode(codec.Int16, 0xffff, -1); - encodeDecode(codec.Int32, -1, -1); - encodeDecode(codec.Int32, 0xffff, 0xffff); - encodeDecode(codec.Int32, 0xffffffff, -1); - encodeDecode(codec.Float, 1.0, 1.0); - encodeDecode(codec.Double, 1.0, 1.0); - } - - function testAlign() { - var aligned = [ - 0, // 0 - 8, // 1 - 8, // 2 - 8, // 3 - 8, // 4 - 8, // 5 - 8, // 6 - 8, // 7 - 8, // 8 - 16, // 9 - 16, // 10 - 16, // 11 - 16, // 12 - 16, // 13 - 16, // 14 - 16, // 15 - 16, // 16 - 24, // 17 - 24, // 18 - 24, // 19 - 24, // 20 - ]; - for (var i = 0; i < aligned.length; ++i) - expect(codec.align(i)).toBe(aligned[i]); - } - - function testUtf8() { - var str = "B\u03ba\u1f79"; // some UCS-2 codepoints - var messageName = 42; - var payloadSize = 24; - - var builder = new codec.MessageBuilder(messageName, payloadSize); - var encoder = builder.createEncoder(8); - encoder.encodeStringPointer(str); - var message = builder.finish(); - var expectedMemory = new Uint8Array([ - /* 0: */ 16, 0, 0, 0, 2, 0, 0, 0, - /* 8: */ 42, 0, 0, 0, 0, 0, 0, 0, - /* 16: */ 8, 0, 0, 0, 0, 0, 0, 0, - /* 24: */ 14, 0, 0, 0, 6, 0, 0, 0, - /* 32: */ 0x42, 0xCE, 0xBA, 0xE1, 0xBD, 0xB9, 0, 0, - ]); - var actualMemory = new Uint8Array(message.buffer.arrayBuffer); - expect(actualMemory.length).toEqual(expectedMemory.length); - expect(actualMemory).toEqual(expectedMemory); - - var reader = new codec.MessageReader(message); - expect(reader.payloadSize).toBe(payloadSize); - expect(reader.messageName).toBe(messageName); - var str2 = reader.decoder.decodeStringPointer(); - expect(str2).toEqual(str); - } - - function testTypedPointerValidation() { - var encoder = new codec.MessageBuilder(42, 24).createEncoder(8); - function DummyClass() {}; - var testCases = [ - // method, args, invalid examples, valid examples - [encoder.encodeArrayPointer, [DummyClass], [75], - [[], null, undefined, new Uint8Array([])]], - [encoder.encodeStringPointer, [], [75, new String("foo")], - ["", "bar", null, undefined]], - [encoder.encodeMapPointer, [DummyClass, DummyClass], [75], - [new Map(), null, undefined]], - ]; - - testCases.forEach(function(test) { - var method = test[0]; - var baseArgs = test[1]; - var invalidExamples = test[2]; - var validExamples = test[3]; - - var encoder = new codec.MessageBuilder(42, 24).createEncoder(8); - invalidExamples.forEach(function(invalid) { - expect(function() { - method.apply(encoder, baseArgs.concat(invalid)); - }).toThrow(); - }); - - validExamples.forEach(function(valid) { - var encoder = new codec.MessageBuilder(42, 24).createEncoder(8); - method.apply(encoder, baseArgs.concat(valid)); - }); - }); - } -}); diff --git a/mojo/public/js/connection.js b/mojo/public/js/connection.js deleted file mode 100644 index 3976efd..0000000 --- a/mojo/public/js/connection.js +++ /dev/null @@ -1,125 +0,0 @@ -// Copyright 2014 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -define("mojo/public/js/connection", [ - "mojo/public/js/bindings", - "mojo/public/js/connector", - "mojo/public/js/core", - "mojo/public/js/router", -], function(bindings, connector, core, router) { - - var Router = router.Router; - var EmptyProxy = bindings.EmptyProxy; - var EmptyStub = bindings.EmptyStub; - var ProxyBindings = bindings.ProxyBindings; - var StubBindings = bindings.StubBindings; - var TestConnector = connector.TestConnector; - var TestRouter = router.TestRouter; - - // TODO(hansmuller): the proxy receiver_ property should be receiver$ - - function BaseConnection(localStub, remoteProxy, router) { - this.router_ = router; - this.local = localStub; - this.remote = remoteProxy; - - this.router_.setIncomingReceiver(localStub); - if (this.remote) - this.remote.receiver_ = router; - - // Validate incoming messages: remote responses and local requests. - var validateRequest = localStub && localStub.validator; - var validateResponse = remoteProxy && remoteProxy.validator; - var payloadValidators = []; - if (validateRequest) - payloadValidators.push(validateRequest); - if (validateResponse) - payloadValidators.push(validateResponse); - this.router_.setPayloadValidators(payloadValidators); - } - - BaseConnection.prototype.close = function() { - this.router_.close(); - this.router_ = null; - this.local = null; - this.remote = null; - }; - - BaseConnection.prototype.encounteredError = function() { - return this.router_.encounteredError(); - }; - - function Connection( - handle, localFactory, remoteFactory, routerFactory, connectorFactory) { - var routerClass = routerFactory || Router; - var router = new routerClass(handle, connectorFactory); - var remoteProxy = remoteFactory && new remoteFactory(router); - var localStub = localFactory && new localFactory(remoteProxy); - BaseConnection.call(this, localStub, remoteProxy, router); - } - - Connection.prototype = Object.create(BaseConnection.prototype); - - // The TestConnection subclass is only intended to be used in unit tests. - function TestConnection(handle, localFactory, remoteFactory) { - Connection.call(this, - handle, - localFactory, - remoteFactory, - TestRouter, - TestConnector); - } - - TestConnection.prototype = Object.create(Connection.prototype); - - function createOpenConnection( - messagePipeHandle, client, localInterface, remoteInterface) { - var stubClass = (localInterface && localInterface.stubClass) || EmptyStub; - var proxyClass = - (remoteInterface && remoteInterface.proxyClass) || EmptyProxy; - var proxy = new proxyClass; - var stub = new stubClass; - var router = new Router(messagePipeHandle); - var connection = new BaseConnection(stub, proxy, router); - - ProxyBindings(proxy).connection = connection; - ProxyBindings(proxy).local = connection.local; - StubBindings(stub).connection = connection; - StubBindings(proxy).remote = connection.remote; - - var clientImpl = client instanceof Function ? client(proxy) : client; - if (clientImpl) - StubBindings(stub).delegate = clientImpl; - - return connection; - } - - // Return a message pipe handle. - function bindProxyClient(clientImpl, localInterface, remoteInterface) { - var messagePipe = core.createMessagePipe(); - if (messagePipe.result != core.RESULT_OK) - throw new Error("createMessagePipe failed " + messagePipe.result); - - createOpenConnection( - messagePipe.handle0, clientImpl, localInterface, remoteInterface); - return messagePipe.handle1; - } - - // Return a proxy. - function bindProxyHandle(proxyHandle, localInterface, remoteInterface) { - if (!core.isHandle(proxyHandle)) - throw new Error("Not a handle " + proxyHandle); - - var connection = createOpenConnection( - proxyHandle, undefined, localInterface, remoteInterface); - return connection.remote; - } - - var exports = {}; - exports.Connection = Connection; - exports.TestConnection = TestConnection; - exports.bindProxyHandle = bindProxyHandle; - exports.bindProxyClient = bindProxyClient; - return exports; -}); diff --git a/mojo/public/js/connector.js b/mojo/public/js/connector.js deleted file mode 100644 index 78ed963..0000000 --- a/mojo/public/js/connector.js +++ /dev/null @@ -1,132 +0,0 @@ -// Copyright 2014 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -define("mojo/public/js/connector", [ - "mojo/public/js/buffer", - "mojo/public/js/codec", - "mojo/public/js/core", - "mojo/public/js/support", -], function(buffer, codec, core, support) { - - function Connector(handle) { - if (!core.isHandle(handle)) - throw new Error("Connector: not a handle " + handle); - this.handle_ = handle; - this.dropWrites_ = false; - this.error_ = false; - this.incomingReceiver_ = null; - this.readWaitCookie_ = null; - this.errorHandler_ = null; - - if (handle) - this.waitToReadMore_(); - } - - Connector.prototype.close = function() { - if (this.readWaitCookie_) { - support.cancelWait(this.readWaitCookie_); - this.readWaitCookie_ = null; - } - if (this.handle_ != null) { - core.close(this.handle_); - this.handle_ = null; - } - }; - - Connector.prototype.accept = function(message) { - if (this.error_) - return false; - - if (this.dropWrites_) - return true; - - var result = core.writeMessage(this.handle_, - new Uint8Array(message.buffer.arrayBuffer), - message.handles, - core.WRITE_MESSAGE_FLAG_NONE); - switch (result) { - case core.RESULT_OK: - // The handles were successfully transferred, so we don't own them - // anymore. - message.handles = []; - break; - case core.RESULT_FAILED_PRECONDITION: - // There's no point in continuing to write to this pipe since the other - // end is gone. Avoid writing any future messages. Hide write failures - // from the caller since we'd like them to continue consuming any - // backlog of incoming messages before regarding the message pipe as - // closed. - this.dropWrites_ = true; - break; - default: - // This particular write was rejected, presumably because of bad input. - // The pipe is not necessarily in a bad state. - return false; - } - return true; - }; - - Connector.prototype.setIncomingReceiver = function(receiver) { - this.incomingReceiver_ = receiver; - }; - - Connector.prototype.setErrorHandler = function(handler) { - this.errorHandler_ = handler; - }; - - Connector.prototype.encounteredError = function() { - return this.error_; - }; - - Connector.prototype.waitToReadMore_ = function() { - this.readWaitCookie_ = support.asyncWait(this.handle_, - core.HANDLE_SIGNAL_READABLE, - this.readMore_.bind(this)); - }; - - Connector.prototype.readMore_ = function(result) { - for (;;) { - var read = core.readMessage(this.handle_, - core.READ_MESSAGE_FLAG_NONE); - if (this.handle_ == null) // The connector has been closed. - return; - if (read.result == core.RESULT_SHOULD_WAIT) { - this.waitToReadMore_(); - return; - } - if (read.result != core.RESULT_OK) { - this.error_ = true; - if (this.errorHandler_) - this.errorHandler_.onError(read.result); - return; - } - var messageBuffer = new buffer.Buffer(read.buffer); - var message = new codec.Message(messageBuffer, read.handles); - if (this.incomingReceiver_) { - this.incomingReceiver_.accept(message); - } - } - }; - - // The TestConnector subclass is only intended to be used in unit tests. It - // enables delivering a message to the pipe's handle without an async wait. - - function TestConnector(handle) { - Connector.call(this, handle); - } - - TestConnector.prototype = Object.create(Connector.prototype); - - TestConnector.prototype.waitToReadMore_ = function() { - }; - - TestConnector.prototype.deliverMessage = function() { - this.readMore_(core.RESULT_OK); - } - - var exports = {}; - exports.Connector = Connector; - exports.TestConnector = TestConnector; - return exports; -}); diff --git a/mojo/public/js/constants.cc b/mojo/public/js/constants.cc deleted file mode 100644 index d29f5cb..0000000 --- a/mojo/public/js/constants.cc +++ /dev/null @@ -1,18 +0,0 @@ -// Copyright 2014 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "mojo/public/js/constants.h" - -namespace mojo { - -const char kBindingsModuleName[] = "mojo/public/js/bindings"; -const char kBufferModuleName[] = "mojo/public/js/buffer"; -const char kCodecModuleName[] = "mojo/public/js/codec"; -const char kConnectionModuleName[] = "mojo/public/js/connection"; -const char kConnectorModuleName[] = "mojo/public/js/connector"; -const char kUnicodeModuleName[] = "mojo/public/js/unicode"; -const char kRouterModuleName[] = "mojo/public/js/router"; -const char kValidatorModuleName[] = "mojo/public/js/validator"; - -} // namespace mojo diff --git a/mojo/public/js/constants.h b/mojo/public/js/constants.h deleted file mode 100644 index de75a90..0000000 --- a/mojo/public/js/constants.h +++ /dev/null @@ -1,22 +0,0 @@ -// Copyright 2014 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef MOJO_PUBLIC_JS_BINDINGS_CONSTANTS_H_ -#define MOJO_PUBLIC_JS_BINDINGS_CONSTANTS_H_ - -namespace mojo { - -// JavaScript module names: -extern const char kBindingsModuleName[]; -extern const char kBufferModuleName[]; -extern const char kCodecModuleName[]; -extern const char kConnectionModuleName[]; -extern const char kConnectorModuleName[]; -extern const char kUnicodeModuleName[]; -extern const char kRouterModuleName[]; -extern const char kValidatorModuleName[]; - -} // namespace mojo - -#endif // MOJO_PUBLIC_JS_BINDINGS_CONSTANTS_H_ diff --git a/mojo/public/js/core.js b/mojo/public/js/core.js deleted file mode 100644 index 6eb6ae6..0000000 --- a/mojo/public/js/core.js +++ /dev/null @@ -1,239 +0,0 @@ -// Copyright 2014 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Module "mojo/public/js/core" -// -// Note: This file is for documentation purposes only. The code here is not -// actually executed. The real module is implemented natively in Mojo. -// -// This module provides the JavaScript bindings for mojo/public/c/system/core.h. -// Refer to that file for more detailed documentation for equivalent methods. - -while (1); - -/** - * MojoHandle: An opaque handles to a Mojo object (e.g. a message pipe). - */ -var kInvalidHandle; - -/** - * MojoResult {number}: Result codes for Mojo operations. - * See core.h for more information. - */ -var RESULT_OK; -var RESULT_CANCELLED; -var RESULT_UNKNOWN; -var RESULT_INVALID_ARGUMENT; -var RESULT_DEADLINE_EXCEEDED; -var RESULT_NOT_FOUND; -var RESULT_ALREADY_EXISTS; -var RESULT_PERMISSION_DENIED; -var RESULT_RESOURCE_EXHAUSTED; -var RESULT_FAILED_PRECONDITION; -var RESULT_ABORTED; -var RESULT_OUT_OF_RANGE; -var RESULT_UNIMPLEMENTED; -var RESULT_INTERNAL; -var RESULT_UNAVAILABLE; -var RESULT_DATA_LOSS; -var RESULT_BUSY; -var RESULT_SHOULD_WAIT; - -/** - * MojoDeadline {number}: Used to specify deadlines (timeouts), in microseconds. - * See core.h for more information. - */ -var DEADLINE_INDEFINITE; - -/** - * MojoHandleSignals: Used to specify signals that can be waited on for a handle - *(and which can be triggered), e.g., the ability to read or write to - * the handle. - * See core.h for more information. - */ -var HANDLE_SIGNAL_NONE; -var HANDLE_SIGNAL_READABLE; -var HANDLE_SIGNAL_WRITABLE; -var HANDLE_SIGNAL_PEER_CLOSED; - -/** - * MojoCreateDataMessageOptions: Used to specify creation parameters for a data - * pipe to |createDataMessage()|. - * See core.h for more information. - */ -dictionary MojoCreateDataMessageOptions { - MojoCreateDataMessageOptionsFlags flags; // See below. -}; - -// MojoCreateDataMessageOptionsFlags -var CREATE_MESSAGE_PIPE_OPTIONS_FLAG_NONE; - -/* - * MojoWriteMessageFlags: Used to specify different modes to |writeMessage()|. - * See core.h for more information. - */ -var WRITE_MESSAGE_FLAG_NONE; - -/** - * MojoReadMessageFlags: Used to specify different modes to |readMessage()|. - * See core.h for more information. - */ -var READ_MESSAGE_FLAG_NONE; -var READ_MESSAGE_FLAG_MAY_DISCARD; - -/** - * MojoCreateDataPipeOptions: Used to specify creation parameters for a data - * pipe to |createDataPipe()|. - * See core.h for more information. - */ -dictionary MojoCreateDataPipeOptions { - MojoCreateDataPipeOptionsFlags flags; // See below. - int32 elementNumBytes; // The size of an element, in bytes. - int32 capacityNumBytes; // The capacity of the data pipe, in bytes. -}; - -// MojoCreateDataPipeOptionsFlags -var CREATE_DATA_PIPE_OPTIONS_FLAG_NONE; -var CREATE_DATA_PIPE_OPTIONS_FLAG_MAY_DISCARD; - -/* - * MojoWriteDataFlags: Used to specify different modes to |writeData()|. - * See core.h for more information. - */ -var WRITE_DATA_FLAG_NONE; -var WRITE_DATA_FLAG_ALL_OR_NONE; - -/** - * MojoReadDataFlags: Used to specify different modes to |readData()|. - * See core.h for more information. - */ -var READ_DATA_FLAG_NONE; -var READ_DATA_FLAG_ALL_OR_NONE; -var READ_DATA_FLAG_DISCARD; -var READ_DATA_FLAG_QUERY; -var READ_DATA_FLAG_PEEK; - -/** - * Closes the given |handle|. See MojoClose for more info. - * @param {MojoHandle} Handle to close. - * @return {MojoResult} Result code. - */ -function close(handle) { [native code] } - -/** - * Waits on the given handle until a signal indicated by |signals| is - * satisfied or until |deadline| is passed. See MojoWait for more information. - * - * @param {MojoHandle} handle Handle to wait on. - * @param {MojoHandleSignals} signals Specifies the condition to wait for. - * @param {MojoDeadline} deadline Stops waiting if this is reached. - * @return {MojoResult} Result code. - */ -function wait(handle, signals, deadline) { [native code] } - -/** - * Waits on |handles[0]|, ..., |handles[handles.length-1]| for at least one of - * them to satisfy the state indicated by |flags[0]|, ..., - * |flags[handles.length-1]|, respectively, or until |deadline| has passed. - * See MojoWaitMany for more information. - * - * @param {Array.MojoHandle} handles Handles to wait on. - * @param {Array.MojoHandleSignals} signals Specifies the condition to wait for, - * for each corresponding handle. Must be the same length as |handles|. - * @param {MojoDeadline} deadline Stops waiting if this is reached. - * @return {MojoResult} Result code. - */ -function waitMany(handles, signals, deadline) { [native code] } - -/** - * Creates a message pipe. This function always succeeds. - * See MojoCreateMessagePipe for more information on message pipes. - * - * @param {MojoCreateMessagePipeOptions} optionsDict Options to control the - * message pipe parameters. May be null. - * @return {MessagePipe} An object of the form { - * handle0, - * handle1, - * } - * where |handle0| and |handle1| are MojoHandles to each end of the channel. - */ -function createMessagePipe(optionsDict) { [native code] } - -/** - * Writes a message to the message pipe endpoint given by |handle|. See - * MojoWriteMessage for more information, including return codes. - * - * @param {MojoHandle} handle The endpoint to write to. - * @param {ArrayBufferView} buffer The message data. May be empty. - * @param {Array.MojoHandle} handlesArray Any handles to attach. Handles are - * transferred on success and will no longer be valid. May be empty. - * @param {MojoWriteMessageFlags} flags Flags. - * @return {MojoResult} Result code. - */ -function writeMessage(handle, buffer, handlesArray, flags) { [native code] } - -/** - * Reads a message from the message pipe endpoint given by |handle|. See - * MojoReadMessage for more information, including return codes. - * - * @param {MojoHandle} handle The endpoint to read from. - * @param {MojoReadMessageFlags} flags Flags. - * @return {object} An object of the form { - * result, // |RESULT_OK| on success, error code otherwise. - * buffer, // An ArrayBufferView of the message data (only on success). - * handles // An array of MojoHandles transferred, if any. - * } - */ -function readMessage(handle, flags) { [native code] } - -/** - * Creates a data pipe, which is a unidirectional communication channel for - * unframed data, with the given options. See MojoCreateDataPipe for more - * more information, including return codes. - * - * @param {MojoCreateDataPipeOptions} optionsDict Options to control the data - * pipe parameters. May be null. - * @return {object} An object of the form { - * result, // |RESULT_OK| on success, error code otherwise. - * producerHandle, // MojoHandle to use with writeData (only on success). - * consumerHandle, // MojoHandle to use with readData (only on success). - * } - */ -function createDataPipe(optionsDict) { [native code] } - -/** - * Writes the given data to the data pipe producer given by |handle|. See - * MojoWriteData for more information, including return codes. - * - * @param {MojoHandle} handle A producerHandle returned by createDataPipe. - * @param {ArrayBufferView} buffer The data to write. - * @param {MojoWriteDataFlags} flags Flags. - * @return {object} An object of the form { - * result, // |RESULT_OK| on success, error code otherwise. - * numBytes, // The number of bytes written. - * } - */ -function writeData(handle, buffer, flags) { [native code] } - -/** - * Reads data from the data pipe consumer given by |handle|. May also - * be used to discard data. See MojoReadData for more information, including - * return codes. - * - * @param {MojoHandle} handle A consumerHandle returned by createDataPipe. - * @param {MojoReadDataFlags} flags Flags. - * @return {object} An object of the form { - * result, // |RESULT_OK| on success, error code otherwise. - * buffer, // An ArrayBufferView of the data read (only on success). - * } - */ -function readData(handle, flags) { [native code] } - -/** - * True if the argument is a message or data pipe handle. - * - * @param {value} an arbitrary JS value. - * @return true or false - */ -function isHandle(value) { [native code] } diff --git a/mojo/public/js/core_unittests.js b/mojo/public/js/core_unittests.js deleted file mode 100644 index 0f7b3ff..0000000 --- a/mojo/public/js/core_unittests.js +++ /dev/null @@ -1,197 +0,0 @@ -// Copyright 2014 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -define([ - "gin/test/expect", - "mojo/public/js/core", - "gc", - ], function(expect, core, gc) { - - var HANDLE_SIGNAL_READWRITABLE = core.HANDLE_SIGNAL_WRITABLE | - core.HANDLE_SIGNAL_READABLE; - var HANDLE_SIGNAL_ALL = core.HANDLE_SIGNAL_WRITABLE | - core.HANDLE_SIGNAL_READABLE | - core.HANDLE_SIGNAL_PEER_CLOSED; - - runWithMessagePipe(testNop); - runWithMessagePipe(testReadAndWriteMessage); - runWithMessagePipeWithOptions(testNop); - runWithMessagePipeWithOptions(testReadAndWriteMessage); - runWithDataPipe(testNop); - runWithDataPipe(testReadAndWriteDataPipe); - runWithDataPipeWithOptions(testNop); - runWithDataPipeWithOptions(testReadAndWriteDataPipe); - runWithMessagePipe(testIsHandleMessagePipe); - runWithDataPipe(testIsHandleDataPipe); - gc.collectGarbage(); // should not crash - this.result = "PASS"; - - function runWithMessagePipe(test) { - var pipe = core.createMessagePipe(); - expect(pipe.result).toBe(core.RESULT_OK); - - test(pipe); - - expect(core.close(pipe.handle0)).toBe(core.RESULT_OK); - expect(core.close(pipe.handle1)).toBe(core.RESULT_OK); - } - - function runWithMessagePipeWithOptions(test) { - var pipe = core.createMessagePipe({ - flags: core.CREATE_MESSAGE_PIPE_OPTIONS_FLAG_NONE - }); - expect(pipe.result).toBe(core.RESULT_OK); - - test(pipe); - - expect(core.close(pipe.handle0)).toBe(core.RESULT_OK); - expect(core.close(pipe.handle1)).toBe(core.RESULT_OK); - } - - function runWithDataPipe(test) { - var pipe = core.createDataPipe(); - expect(pipe.result).toBe(core.RESULT_OK); - - test(pipe); - - expect(core.close(pipe.producerHandle)).toBe(core.RESULT_OK); - expect(core.close(pipe.consumerHandle)).toBe(core.RESULT_OK); - } - - function runWithDataPipeWithOptions(test) { - var pipe = core.createDataPipe({ - flags: core.CREATE_DATA_PIPE_OPTIONS_FLAG_NONE, - elementNumBytes: 1, - capacityNumBytes: 64 - }); - expect(pipe.result).toBe(core.RESULT_OK); - - test(pipe); - - expect(core.close(pipe.producerHandle)).toBe(core.RESULT_OK); - expect(core.close(pipe.consumerHandle)).toBe(core.RESULT_OK); - } - - function testNop(pipe) { - } - - function testReadAndWriteMessage(pipe) { - var wait = core.waitMany([], [], 0); - expect(wait.result).toBe(core.RESULT_INVALID_ARGUMENT); - expect(wait.index).toBe(null); - expect(wait.signalsState).toBe(null); - - wait = core.wait(pipe.handle0, core.HANDLE_SIGNAL_READABLE, 0); - expect(wait.result).toBe(core.RESULT_DEADLINE_EXCEEDED); - expect(wait.signalsState.satisfiedSignals).toBe( - core.HANDLE_SIGNAL_WRITABLE); - expect(wait.signalsState.satisfiableSignals).toBe(HANDLE_SIGNAL_ALL); - - wait = core.waitMany( - [pipe.handle0, pipe.handle1], - [core.HANDLE_SIGNAL_READABLE,core.HANDLE_SIGNAL_READABLE], - 0); - expect(wait.result).toBe(core.RESULT_DEADLINE_EXCEEDED); - expect(wait.index).toBe(null); - expect(wait.signalsState[0].satisfiedSignals).toBe( - core.HANDLE_SIGNAL_WRITABLE); - expect(wait.signalsState[0].satisfiableSignals).toBe(HANDLE_SIGNAL_ALL); - expect(wait.signalsState[1].satisfiedSignals).toBe( - core.HANDLE_SIGNAL_WRITABLE); - expect(wait.signalsState[1].satisfiableSignals).toBe(HANDLE_SIGNAL_ALL); - - wait = core.wait(pipe.handle0, core.HANDLE_SIGNAL_WRITABLE, 0); - expect(wait.result).toBe(core.RESULT_OK); - expect(wait.signalsState.satisfiedSignals).toBe( - core.HANDLE_SIGNAL_WRITABLE); - expect(wait.signalsState.satisfiableSignals).toBe(HANDLE_SIGNAL_ALL); - - var senderData = new Uint8Array(42); - for (var i = 0; i < senderData.length; ++i) { - senderData[i] = i * i; - } - - var result = core.writeMessage( - pipe.handle0, senderData, [], - core.WRITE_MESSAGE_FLAG_NONE); - - expect(result).toBe(core.RESULT_OK); - - wait = core.waitMany( - [pipe.handle0, pipe.handle1], - [core.HANDLE_SIGNAL_WRITABLE,core.HANDLE_SIGNAL_WRITABLE], - 0); - expect(wait.result).toBe(core.RESULT_OK); - expect(wait.index).toBe(0); - expect(wait.signalsState[0].satisfiedSignals).toBe( - core.HANDLE_SIGNAL_WRITABLE); - expect(wait.signalsState[0].satisfiableSignals).toBe(HANDLE_SIGNAL_ALL); - expect(wait.signalsState[1].satisfiedSignals).toBe( - HANDLE_SIGNAL_READWRITABLE); - expect(wait.signalsState[1].satisfiableSignals).toBe(HANDLE_SIGNAL_ALL); - - var read = core.readMessage( - pipe.handle1, core.READ_MESSAGE_FLAG_NONE); - - expect(read.result).toBe(core.RESULT_OK); - expect(read.buffer.byteLength).toBe(42); - expect(read.handles.length).toBe(0); - - var memory = new Uint8Array(read.buffer); - for (var i = 0; i < memory.length; ++i) - expect(memory[i]).toBe((i * i) & 0xFF); - } - - function testReadAndWriteDataPipe(pipe) { - var senderData = new Uint8Array(42); - for (var i = 0; i < senderData.length; ++i) { - senderData[i] = i * i; - } - - var write = core.writeData( - pipe.producerHandle, senderData, - core.WRITE_DATA_FLAG_ALL_OR_NONE); - - expect(write.result).toBe(core.RESULT_OK); - expect(write.numBytes).toBe(42); - - var peeked = core.readData( - pipe.consumerHandle, - core.READ_DATA_FLAG_PEEK | core.READ_DATA_FLAG_ALL_OR_NONE); - expect(peeked.result).toBe(core.RESULT_OK); - expect(peeked.buffer.byteLength).toBe(42); - - var peeked_memory = new Uint8Array(peeked.buffer); - for (var i = 0; i < peeked_memory.length; ++i) - expect(peeked_memory[i]).toBe((i * i) & 0xFF); - - var read = core.readData( - pipe.consumerHandle, core.READ_DATA_FLAG_ALL_OR_NONE); - - expect(read.result).toBe(core.RESULT_OK); - expect(read.buffer.byteLength).toBe(42); - - var memory = new Uint8Array(read.buffer); - for (var i = 0; i < memory.length; ++i) - expect(memory[i]).toBe((i * i) & 0xFF); - } - - function testIsHandleMessagePipe(pipe) { - expect(core.isHandle(123).toBeFalsy); - expect(core.isHandle("123").toBeFalsy); - expect(core.isHandle({}).toBeFalsy); - expect(core.isHandle([]).toBeFalsy); - expect(core.isHandle(undefined).toBeFalsy); - expect(core.isHandle(pipe).toBeFalsy); - expect(core.isHandle(pipe.handle0)).toBeTruthy(); - expect(core.isHandle(pipe.handle1)).toBeTruthy(); - expect(core.isHandle(null)).toBeTruthy(); - } - - function testIsHandleDataPipe(pipe) { - expect(core.isHandle(pipe.consumerHandle)).toBeTruthy(); - expect(core.isHandle(pipe.producerHandle)).toBeTruthy(); - } - -}); diff --git a/mojo/public/js/router.js b/mojo/public/js/router.js deleted file mode 100644 index dba3e3c..0000000 --- a/mojo/public/js/router.js +++ /dev/null @@ -1,145 +0,0 @@ -// Copyright 2014 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -define("mojo/public/js/router", [ - "mojo/public/js/codec", - "mojo/public/js/core", - "mojo/public/js/connector", - "mojo/public/js/validator", -], function(codec, core, connector, validator) { - - var Connector = connector.Connector; - var MessageReader = codec.MessageReader; - var Validator = validator.Validator; - - function Router(handle, connectorFactory) { - if (!core.isHandle(handle)) - throw new Error("Router constructor: Not a handle"); - if (connectorFactory === undefined) - connectorFactory = Connector; - this.connector_ = new connectorFactory(handle); - this.incomingReceiver_ = null; - this.nextRequestID_ = 0; - this.completers_ = new Map(); - this.payloadValidators_ = []; - - this.connector_.setIncomingReceiver({ - accept: this.handleIncomingMessage_.bind(this), - }); - this.connector_.setErrorHandler({ - onError: this.handleConnectionError_.bind(this), - }); - } - - Router.prototype.close = function() { - this.completers_.clear(); // Drop any responders. - this.connector_.close(); - }; - - Router.prototype.accept = function(message) { - this.connector_.accept(message); - }; - - Router.prototype.reject = function(message) { - // TODO(mpcomplete): no way to trasmit errors over a Connection. - }; - - Router.prototype.acceptAndExpectResponse = function(message) { - // Reserve 0 in case we want it to convey special meaning in the future. - var requestID = this.nextRequestID_++; - if (requestID == 0) - requestID = this.nextRequestID_++; - - message.setRequestID(requestID); - var result = this.connector_.accept(message); - if (!result) - return Promise.reject(Error("Connection error")); - - var completer = {}; - this.completers_.set(requestID, completer); - return new Promise(function(resolve, reject) { - completer.resolve = resolve; - completer.reject = reject; - }); - }; - - Router.prototype.setIncomingReceiver = function(receiver) { - this.incomingReceiver_ = receiver; - }; - - Router.prototype.setPayloadValidators = function(payloadValidators) { - this.payloadValidators_ = payloadValidators; - }; - - Router.prototype.encounteredError = function() { - return this.connector_.encounteredError(); - }; - - Router.prototype.handleIncomingMessage_ = function(message) { - var noError = validator.validationError.NONE; - var messageValidator = new Validator(message); - var err = messageValidator.validateMessageHeader(); - for (var i = 0; err === noError && i < this.payloadValidators_.length; ++i) - err = this.payloadValidators_[i](messageValidator); - - if (err == noError) - this.handleValidIncomingMessage_(message); - else - this.handleInvalidIncomingMessage_(message, err); - }; - - Router.prototype.handleValidIncomingMessage_ = function(message) { - if (message.expectsResponse()) { - if (this.incomingReceiver_) { - this.incomingReceiver_.acceptWithResponder(message, this); - } else { - // If we receive a request expecting a response when the client is not - // listening, then we have no choice but to tear down the pipe. - this.close(); - } - } else if (message.isResponse()) { - var reader = new MessageReader(message); - var requestID = reader.requestID; - var completer = this.completers_.get(requestID); - this.completers_.delete(requestID); - completer.resolve(message); - } else { - if (this.incomingReceiver_) - this.incomingReceiver_.accept(message); - } - } - - Router.prototype.handleInvalidIncomingMessage_ = function(message, error) { - this.close(); - } - - Router.prototype.handleConnectionError_ = function(result) { - this.completers_.forEach(function(value) { - value.reject(result); - }); - this.close(); - }; - - // The TestRouter subclass is only intended to be used in unit tests. - // It defeats valid message handling and delgates invalid message handling. - - function TestRouter(handle, connectorFactory) { - Router.call(this, handle, connectorFactory); - } - - TestRouter.prototype = Object.create(Router.prototype); - - TestRouter.prototype.handleValidIncomingMessage_ = function() { - }; - - TestRouter.prototype.handleInvalidIncomingMessage_ = - function(message, error) { - this.validationErrorHandler(error); - }; - - var exports = {}; - exports.Router = Router; - exports.TestRouter = TestRouter; - return exports; -}); diff --git a/mojo/public/js/struct_unittests.js b/mojo/public/js/struct_unittests.js deleted file mode 100644 index 39a8978..0000000 --- a/mojo/public/js/struct_unittests.js +++ /dev/null @@ -1,271 +0,0 @@ -// Copyright 2014 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -define([ - "gin/test/expect", - "mojo/public/interfaces/bindings/tests/rect.mojom", - "mojo/public/interfaces/bindings/tests/test_structs.mojom", - "mojo/public/js/codec", - "mojo/public/js/validator", -], function(expect, - rect, - testStructs, - codec, - validator) { - - function testConstructors() { - var r = new rect.Rect(); - expect(r).toEqual(new rect.Rect({x:0, y:0, width:0, height:0})); - expect(r).toEqual(new rect.Rect({foo:100, bar:200})); - - r.x = 10; - r.y = 20; - r.width = 30; - r.height = 40; - var rp = new testStructs.RectPair({first: r, second: r}); - expect(rp.first).toEqual(r); - expect(rp.second).toEqual(r); - - expect(new testStructs.RectPair({second: r}).first).toBeNull(); - - var nr = new testStructs.NamedRegion(); - expect(nr.name).toBeNull(); - expect(nr.rects).toBeNull(); - expect(nr).toEqual(new testStructs.NamedRegion({})); - - nr.name = "foo"; - nr.rects = [r, r, r]; - expect(nr).toEqual(new testStructs.NamedRegion({ - name: "foo", - rects: [r, r, r], - })); - - var e = new testStructs.EmptyStruct(); - expect(e).toEqual(new testStructs.EmptyStruct({foo:123})); - } - - function testNoDefaultFieldValues() { - var s = new testStructs.NoDefaultFieldValues(); - expect(s.f0).toEqual(false); - - // f1 - f10, number type fields - for (var i = 1; i <= 10; i++) - expect(s["f" + i]).toEqual(0); - - // f11,12 strings, f13-22 handles, f23-f26 arrays, f27,28 structs - for (var i = 11; i <= 28; i++) - expect(s["f" + i]).toBeNull(); - } - - function testDefaultFieldValues() { - var s = new testStructs.DefaultFieldValues(); - expect(s.f0).toEqual(true); - - // f1 - f12, number type fields - for (var i = 1; i <= 12; i++) - expect(s["f" + i]).toEqual(100); - - // f13,14 "foo" - for (var i = 13; i <= 14; i++) - expect(s["f" + i]).toEqual("foo"); - - // f15,16 a default instance of Rect - var r = new rect.Rect(); - expect(s.f15).toEqual(r); - expect(s.f16).toEqual(r); - } - - function testScopedConstants() { - expect(testStructs.ScopedConstants.TEN).toEqual(10); - expect(testStructs.ScopedConstants.ALSO_TEN).toEqual(10); - expect(testStructs.ScopedConstants.TEN_TOO).toEqual(10); - - expect(testStructs.ScopedConstants.EType.E0).toEqual(0); - expect(testStructs.ScopedConstants.EType.E1).toEqual(1); - expect(testStructs.ScopedConstants.EType.E2).toEqual(10); - expect(testStructs.ScopedConstants.EType.E3).toEqual(10); - expect(testStructs.ScopedConstants.EType.E4).toEqual(11); - - var s = new testStructs.ScopedConstants(); - expect(s.f0).toEqual(0); - expect(s.f1).toEqual(1); - expect(s.f2).toEqual(10); - expect(s.f3).toEqual(10); - expect(s.f4).toEqual(11); - expect(s.f5).toEqual(10); - expect(s.f6).toEqual(10); - } - - function structEncodeDecode(struct) { - var structClass = struct.constructor; - var builder = new codec.MessageBuilder(1234, structClass.encodedSize); - builder.encodeStruct(structClass, struct); - var message = builder.finish(); - - var messageValidator = new validator.Validator(message); - var err = structClass.validate(messageValidator, codec.kMessageHeaderSize); - expect(err).toEqual(validator.validationError.NONE); - - var reader = new codec.MessageReader(message); - return reader.decodeStruct(structClass); - } - - function testMapKeyTypes() { - var mapFieldsStruct = new testStructs.MapKeyTypes({ - f0: new Map([[true, false], [false, true]]), // map<bool, bool> - f1: new Map([[0, 0], [1, 127], [-1, -128]]), // map<int8, int8> - f2: new Map([[0, 0], [1, 127], [2, 255]]), // map<uint8, uint8> - f3: new Map([[0, 0], [1, 32767], [2, -32768]]), // map<int16, int16> - f4: new Map([[0, 0], [1, 32768], [2, 0xFFFF]]), // map<uint16, uint16> - f5: new Map([[0, 0], [1, 32767], [2, -32768]]), // map<int32, int32> - f6: new Map([[0, 0], [1, 32768], [2, 0xFFFF]]), // map<uint32, uint32> - f7: new Map([[0, 0], [1, 32767], [2, -32768]]), // map<int64, int64> - f8: new Map([[0, 0], [1, 32768], [2, 0xFFFF]]), // map<uint64, uint64> - f9: new Map([[1000.5, -50000], [100.5, 5000]]), // map<float, float> - f10: new Map([[-100.5, -50000], [0, 50000000]]), // map<double, double> - f11: new Map([["one", "two"], ["free", "four"]]), // map<string, string> - }); - var decodedStruct = structEncodeDecode(mapFieldsStruct); - expect(decodedStruct.f0).toEqual(mapFieldsStruct.f0); - expect(decodedStruct.f1).toEqual(mapFieldsStruct.f1); - expect(decodedStruct.f2).toEqual(mapFieldsStruct.f2); - expect(decodedStruct.f3).toEqual(mapFieldsStruct.f3); - expect(decodedStruct.f4).toEqual(mapFieldsStruct.f4); - expect(decodedStruct.f5).toEqual(mapFieldsStruct.f5); - expect(decodedStruct.f6).toEqual(mapFieldsStruct.f6); - expect(decodedStruct.f7).toEqual(mapFieldsStruct.f7); - expect(decodedStruct.f8).toEqual(mapFieldsStruct.f8); - expect(decodedStruct.f9).toEqual(mapFieldsStruct.f9); - expect(decodedStruct.f10).toEqual(mapFieldsStruct.f10); - expect(decodedStruct.f11).toEqual(mapFieldsStruct.f11); - } - - function testMapValueTypes() { - var mapFieldsStruct = new testStructs.MapValueTypes({ - // array<string>> - f0: new Map([["a", ["b", "c"]], ["d", ["e"]]]), - // array<string>?> - f1: new Map([["a", null], ["b", ["c", "d"]]]), - // array<string?>> - f2: new Map([["a", [null]], ["b", [null, "d"]]]), - // array<string,2>> - f3: new Map([["a", ["1", "2"]], ["b", ["1", "2"]]]), - // array<array<string, 1>?> - f4: new Map([["a", [["1"]]], ["b", [null]]]), - // array<array<string, 2>, 1>> - f5: new Map([["a", [["1", "2"]]]]), - // map<string, Rect?> - f6: new Map([["a", null]]), - // map<string, map<string, string>> - f7: new Map([["a", new Map([["b", "c"]])]]), - // map<string, array<map<string, string>>> - f8: new Map([["a", [new Map([["b", "c"]])]]]), - }); - var decodedStruct = structEncodeDecode(mapFieldsStruct); - expect(decodedStruct.f0).toEqual(mapFieldsStruct.f0); - expect(decodedStruct.f1).toEqual(mapFieldsStruct.f1); - expect(decodedStruct.f2).toEqual(mapFieldsStruct.f2); - expect(decodedStruct.f3).toEqual(mapFieldsStruct.f3); - expect(decodedStruct.f4).toEqual(mapFieldsStruct.f4); - expect(decodedStruct.f5).toEqual(mapFieldsStruct.f5); - expect(decodedStruct.f6).toEqual(mapFieldsStruct.f6); - expect(decodedStruct.f7).toEqual(mapFieldsStruct.f7); - expect(decodedStruct.f8).toEqual(mapFieldsStruct.f8); - } - - function testFloatNumberValues() { - var decodedStruct = structEncodeDecode(new testStructs.FloatNumberValues); - expect(decodedStruct.f0).toEqual(testStructs.FloatNumberValues.V0); - expect(decodedStruct.f1).toEqual(testStructs.FloatNumberValues.V1); - expect(decodedStruct.f2).toEqual(testStructs.FloatNumberValues.V2); - expect(decodedStruct.f3).toEqual(testStructs.FloatNumberValues.V3); - expect(decodedStruct.f4).toEqual(testStructs.FloatNumberValues.V4); - expect(decodedStruct.f5).toEqual(testStructs.FloatNumberValues.V5); - expect(decodedStruct.f6).toEqual(testStructs.FloatNumberValues.V6); - expect(decodedStruct.f7).toEqual(testStructs.FloatNumberValues.V7); - expect(decodedStruct.f8).toEqual(testStructs.FloatNumberValues.V8); - expect(decodedStruct.f9).toEqual(testStructs.FloatNumberValues.V9); - } - - function testIntegerNumberValues() { - var decodedStruct = structEncodeDecode(new testStructs.IntegerNumberValues); - expect(decodedStruct.f0).toEqual(testStructs.IntegerNumberValues.V0); - expect(decodedStruct.f1).toEqual(testStructs.IntegerNumberValues.V1); - expect(decodedStruct.f2).toEqual(testStructs.IntegerNumberValues.V2); - expect(decodedStruct.f3).toEqual(testStructs.IntegerNumberValues.V3); - expect(decodedStruct.f4).toEqual(testStructs.IntegerNumberValues.V4); - expect(decodedStruct.f5).toEqual(testStructs.IntegerNumberValues.V5); - expect(decodedStruct.f6).toEqual(testStructs.IntegerNumberValues.V6); - expect(decodedStruct.f7).toEqual(testStructs.IntegerNumberValues.V7); - expect(decodedStruct.f8).toEqual(testStructs.IntegerNumberValues.V8); - expect(decodedStruct.f9).toEqual(testStructs.IntegerNumberValues.V9); - expect(decodedStruct.f10).toEqual(testStructs.IntegerNumberValues.V10); - expect(decodedStruct.f11).toEqual(testStructs.IntegerNumberValues.V11); - expect(decodedStruct.f12).toEqual(testStructs.IntegerNumberValues.V12); - expect(decodedStruct.f13).toEqual(testStructs.IntegerNumberValues.V13); - expect(decodedStruct.f14).toEqual(testStructs.IntegerNumberValues.V14); - expect(decodedStruct.f15).toEqual(testStructs.IntegerNumberValues.V15); - expect(decodedStruct.f16).toEqual(testStructs.IntegerNumberValues.V16); - expect(decodedStruct.f17).toEqual(testStructs.IntegerNumberValues.V17); - expect(decodedStruct.f18).toEqual(testStructs.IntegerNumberValues.V18); - expect(decodedStruct.f19).toEqual(testStructs.IntegerNumberValues.V19); - } - - function testUnsignedNumberValues() { - var decodedStruct = - structEncodeDecode(new testStructs.UnsignedNumberValues); - expect(decodedStruct.f0).toEqual(testStructs.UnsignedNumberValues.V0); - expect(decodedStruct.f1).toEqual(testStructs.UnsignedNumberValues.V1); - expect(decodedStruct.f2).toEqual(testStructs.UnsignedNumberValues.V2); - expect(decodedStruct.f3).toEqual(testStructs.UnsignedNumberValues.V3); - expect(decodedStruct.f4).toEqual(testStructs.UnsignedNumberValues.V4); - expect(decodedStruct.f5).toEqual(testStructs.UnsignedNumberValues.V5); - expect(decodedStruct.f6).toEqual(testStructs.UnsignedNumberValues.V6); - expect(decodedStruct.f7).toEqual(testStructs.UnsignedNumberValues.V7); - expect(decodedStruct.f8).toEqual(testStructs.UnsignedNumberValues.V8); - expect(decodedStruct.f9).toEqual(testStructs.UnsignedNumberValues.V9); - expect(decodedStruct.f10).toEqual(testStructs.UnsignedNumberValues.V10); - expect(decodedStruct.f11).toEqual(testStructs.UnsignedNumberValues.V11); - } - - - function testBitArrayValues() { - var bitArraysStruct = new testStructs.BitArrayValues({ - // array<bool, 1> f0; - f0: [true], - // array<bool, 7> f1; - f1: [true, false, true, false, true, false, true], - // array<bool, 9> f2; - f2: [true, false, true, false, true, false, true, false, true], - // array<bool> f3; - f3: [true, false, true, false, true, false, true, false], - // array<array<bool>> f4; - f4: [[true], [false], [true, false], [true, false, true, false]], - // array<array<bool>?> f5; - f5: [[true], null, null, [true, false, true, false]], - // array<array<bool, 2>?> f6; - f6: [[true, false], [true, false], [true, false]], - }); - var decodedStruct = structEncodeDecode(bitArraysStruct); - expect(decodedStruct.f0).toEqual(bitArraysStruct.f0); - expect(decodedStruct.f1).toEqual(bitArraysStruct.f1); - expect(decodedStruct.f2).toEqual(bitArraysStruct.f2); - expect(decodedStruct.f3).toEqual(bitArraysStruct.f3); - expect(decodedStruct.f4).toEqual(bitArraysStruct.f4); - expect(decodedStruct.f5).toEqual(bitArraysStruct.f5); - expect(decodedStruct.f6).toEqual(bitArraysStruct.f6); - } - - testConstructors(); - testNoDefaultFieldValues(); - testDefaultFieldValues(); - testScopedConstants(); - testMapKeyTypes(); - testMapValueTypes(); - testFloatNumberValues(); - testIntegerNumberValues(); - testUnsignedNumberValues(); - testBitArrayValues(); - this.result = "PASS"; -}); diff --git a/mojo/public/js/support.js b/mojo/public/js/support.js deleted file mode 100644 index 025da6c..0000000 --- a/mojo/public/js/support.js +++ /dev/null @@ -1,30 +0,0 @@ -// Copyright 2014 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Module "mojo/public/js/support" -// -// Note: This file is for documentation purposes only. The code here is not -// actually executed. The real module is implemented natively in Mojo. - -while (1); - -/* - * Waits on the given handle until the state indicated by |signals| is - * satisfied. - * - * @param {MojoHandle} handle The handle to wait on. - * @param {MojoHandleSignals} signals Specifies the condition to wait for. - * @param {function (mojoResult)} callback Called with the result the wait is - * complete. See MojoWait for possible result codes. - * - * @return {MojoWaitId} A waitId that can be passed to cancelWait to cancel the - * wait. - */ -function asyncWait(handle, signals, callback) { [native code] } - -/* - * Cancels the asyncWait operation specified by the given |waitId|. - * @param {MojoWaitId} waitId The waitId returned by asyncWait. - */ -function cancelWait(waitId) { [native code] } diff --git a/mojo/public/js/test/validation_test_input_parser.js b/mojo/public/js/test/validation_test_input_parser.js deleted file mode 100644 index f5a57f9..0000000 --- a/mojo/public/js/test/validation_test_input_parser.js +++ /dev/null @@ -1,299 +0,0 @@ -// Copyright 2014 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Support for parsing binary sequences encoded as readable strings -// or ".data" files. The input format is described here: -// mojo/public/cpp/bindings/tests/validation_test_input_parser.h - -define([ - "mojo/public/js/buffer" - ], function(buffer) { - - // Files and Lines represent the raw text from an input string - // or ".data" file. - - function InputError(message, line) { - this.message = message; - this.line = line; - } - - InputError.prototype.toString = function() { - var s = 'Error: ' + this.message; - if (this.line) - s += ', at line ' + - (this.line.number + 1) + ': "' + this.line.contents + '"'; - return s; - } - - function File(contents) { - this.contents = contents; - this.index = 0; - this.lineNumber = 0; - } - - File.prototype.endReached = function() { - return this.index >= this.contents.length; - } - - File.prototype.nextLine = function() { - if (this.endReached()) - return null; - var start = this.index; - var end = this.contents.indexOf('\n', start); - if (end == -1) - end = this.contents.length; - this.index = end + 1; - return new Line(this.contents.substring(start, end), this.lineNumber++); - } - - function Line(contents, number) { - var i = contents.indexOf('//'); - var s = (i == -1) ? contents.trim() : contents.substring(0, i).trim(); - this.contents = contents; - this.items = (s.length > 0) ? s.split(/\s+/) : []; - this.index = 0; - this.number = number; - } - - Line.prototype.endReached = function() { - return this.index >= this.items.length; - } - - var ITEM_TYPE_SIZES = { - u1: 1, u2: 2, u4: 4, u8: 8, s1: 1, s2: 2, s4: 4, s8: 8, b: 1, f: 4, d: 8, - dist4: 4, dist8: 8, anchr: 0, handles: 0 - }; - - function isValidItemType(type) { - return ITEM_TYPE_SIZES[type] !== undefined; - } - - Line.prototype.nextItem = function() { - if (this.endReached()) - return null; - - var itemString = this.items[this.index++]; - var type = 'u1'; - var value = itemString; - - if (itemString.charAt(0) == '[') { - var i = itemString.indexOf(']'); - if (i != -1 && i + 1 < itemString.length) { - type = itemString.substring(1, i); - value = itemString.substring(i + 1); - } else { - throw new InputError('invalid item', this); - } - } - if (!isValidItemType(type)) - throw new InputError('invalid item type', this); - - return new Item(this, type, value); - } - - // The text for each whitespace delimited binary data "item" is represented - // by an Item. - - function Item(line, type, value) { - this.line = line; - this.type = type; - this.value = value; - this.size = ITEM_TYPE_SIZES[type]; - } - - Item.prototype.isFloat = function() { - return this.type == 'f' || this.type == 'd'; - } - - Item.prototype.isInteger = function() { - return ['u1', 'u2', 'u4', 'u8', - 's1', 's2', 's4', 's8'].indexOf(this.type) != -1; - } - - Item.prototype.isNumber = function() { - return this.isFloat() || this.isInteger(); - } - - Item.prototype.isByte = function() { - return this.type == 'b'; - } - - Item.prototype.isDistance = function() { - return this.type == 'dist4' || this.type == 'dist8'; - } - - Item.prototype.isAnchor = function() { - return this.type == 'anchr'; - } - - Item.prototype.isHandles = function() { - return this.type == 'handles'; - } - - // A TestMessage represents the complete binary message loaded from an input - // string or ".data" file. The parseTestMessage() function below constructs - // a TestMessage from a File. - - function TestMessage(byteLength) { - this.index = 0; - this.buffer = new buffer.Buffer(byteLength); - this.distances = {}; - this.handleCount = 0; - } - - function checkItemNumberValue(item, n, min, max) { - if (n < min || n > max) - throw new InputError('invalid item value', item.line); - } - - TestMessage.prototype.addNumber = function(item) { - var n = item.isInteger() ? parseInt(item.value) : parseFloat(item.value); - if (Number.isNaN(n)) - throw new InputError("can't parse item value", item.line); - - switch(item.type) { - case 'u1': - checkItemNumberValue(item, n, 0, 0xFF); - this.buffer.setUint8(this.index, n); - break; - case 'u2': - checkItemNumberValue(item, n, 0, 0xFFFF); - this.buffer.setUint16(this.index, n); - break; - case 'u4': - checkItemNumberValue(item, n, 0, 0xFFFFFFFF); - this.buffer.setUint32(this.index, n); - break; - case 'u8': - checkItemNumberValue(item, n, 0, Number.MAX_SAFE_INTEGER); - this.buffer.setUint64(this.index, n); - break; - case 's1': - checkItemNumberValue(item, n, -128, 127); - this.buffer.setInt8(this.index, n); - break; - case 's2': - checkItemNumberValue(item, n, -32768, 32767); - this.buffer.setInt16(this.index, n); - break; - case 's4': - checkItemNumberValue(item, n, -2147483648, 2147483647); - this.buffer.setInt32(this.index, n); - break; - case 's8': - checkItemNumberValue(item, n, - Number.MIN_SAFE_INTEGER, - Number.MAX_SAFE_INTEGER); - this.buffer.setInt64(this.index, n); - break; - case 'f': - this.buffer.setFloat32(this.index, n); - break; - case 'd': - this.buffer.setFloat64(this.index, n); - break; - - default: - throw new InputError('unrecognized item type', item.line); - } - } - - TestMessage.prototype.addByte = function(item) { - if (!/^[01]{8}$/.test(item.value)) - throw new InputError('invalid byte item value', item.line); - function b(i) { - return (item.value.charAt(7 - i) == '1') ? 1 << i : 0; - } - var n = b(0) | b(1) | b(2) | b(3) | b(4) | b(5) | b(6) | b(7); - this.buffer.setUint8(this.index, n); - } - - TestMessage.prototype.addDistance = function(item) { - if (this.distances[item.value]) - throw new InputError('duplicate distance item', item.line); - this.distances[item.value] = {index: this.index, item: item}; - } - - TestMessage.prototype.addAnchor = function(item) { - var dist = this.distances[item.value]; - if (!dist) - throw new InputError('unmatched anchor item', item.line); - delete this.distances[item.value]; - - var n = this.index - dist.index; - // TODO(hansmuller): validate n - - if (dist.item.type == 'dist4') - this.buffer.setUint32(dist.index, n); - else if (dist.item.type == 'dist8') - this.buffer.setUint64(dist.index, n); - else - throw new InputError('unrecognzed distance item type', dist.item.line); - } - - TestMessage.prototype.addHandles = function(item) { - this.handleCount = parseInt(item.value); - if (Number.isNaN(this.handleCount)) - throw new InputError("can't parse handleCount", item.line); - } - - TestMessage.prototype.addItem = function(item) { - if (item.isNumber()) - this.addNumber(item); - else if (item.isByte()) - this.addByte(item); - else if (item.isDistance()) - this.addDistance(item); - else if (item.isAnchor()) - this.addAnchor(item); - else if (item.isHandles()) - this.addHandles(item); - else - throw new InputError('unrecognized item type', item.line); - - this.index += item.size; - } - - TestMessage.prototype.unanchoredDistances = function() { - var names = null; - for (var name in this.distances) { - if (this.distances.hasOwnProperty(name)) - names = (names === null) ? name : names + ' ' + name; - } - return names; - } - - function parseTestMessage(text) { - var file = new File(text); - var items = []; - var messageLength = 0; - while(!file.endReached()) { - var line = file.nextLine(); - while (!line.endReached()) { - var item = line.nextItem(); - if (item.isHandles() && items.length > 0) - throw new InputError('handles item is not first'); - messageLength += item.size; - items.push(item); - } - } - - var msg = new TestMessage(messageLength); - for (var i = 0; i < items.length; i++) - msg.addItem(items[i]); - - if (messageLength != msg.index) - throw new InputError('failed to compute message length'); - var names = msg.unanchoredDistances(); - if (names) - throw new InputError('no anchors for ' + names, 0); - - return msg; - } - - var exports = {}; - exports.parseTestMessage = parseTestMessage; - exports.InputError = InputError; - return exports; -}); diff --git a/mojo/public/js/threading.js b/mojo/public/js/threading.js deleted file mode 100644 index cfe5037..0000000 --- a/mojo/public/js/threading.js +++ /dev/null @@ -1,21 +0,0 @@ -// Copyright 2014 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Module "mojo/public/js/threading" -// -// Note: This file is for documentation purposes only. The code here is not -// actually executed. The real module is implemented natively in Mojo. -// -// This module provides a way for a Mojo application implemented in JS -// to exit by quitting the current message loop. This module is not -// intended to be used by Mojo JS application started by the JS -// content handler. - -while (1); - -/** - * Quits the current message loop, esssentially: - * base::MessageLoop::current()->QuitNow(); -*/ -function quit() { [native code] } diff --git a/mojo/public/js/unicode.js b/mojo/public/js/unicode.js deleted file mode 100644 index be2ba0e..0000000 --- a/mojo/public/js/unicode.js +++ /dev/null @@ -1,51 +0,0 @@ -// Copyright 2014 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -/** - * Defines functions for translating between JavaScript strings and UTF8 strings - * stored in ArrayBuffers. There is much room for optimization in this code if - * it proves necessary. - */ -define("mojo/public/js/unicode", function() { - /** - * Decodes the UTF8 string from the given buffer. - * @param {ArrayBufferView} buffer The buffer containing UTF8 string data. - * @return {string} The corresponding JavaScript string. - */ - function decodeUtf8String(buffer) { - return decodeURIComponent(escape(String.fromCharCode.apply(null, buffer))); - } - - /** - * Encodes the given JavaScript string into UTF8. - * @param {string} str The string to encode. - * @param {ArrayBufferView} outputBuffer The buffer to contain the result. - * Should be pre-allocated to hold enough space. Use |utf8Length| to determine - * how much space is required. - * @return {number} The number of bytes written to |outputBuffer|. - */ - function encodeUtf8String(str, outputBuffer) { - var utf8String = unescape(encodeURIComponent(str)); - if (outputBuffer.length < utf8String.length) - throw new Error("Buffer too small for encodeUtf8String"); - for (var i = 0; i < outputBuffer.length && i < utf8String.length; i++) - outputBuffer[i] = utf8String.charCodeAt(i); - return i; - } - - /** - * Returns the number of bytes that a UTF8 encoding of the JavaScript string - * |str| would occupy. - */ - function utf8Length(str) { - var utf8String = unescape(encodeURIComponent(str)); - return utf8String.length; - } - - var exports = {}; - exports.decodeUtf8String = decodeUtf8String; - exports.encodeUtf8String = encodeUtf8String; - exports.utf8Length = utf8Length; - return exports; -}); diff --git a/mojo/public/js/validation_unittests.js b/mojo/public/js/validation_unittests.js deleted file mode 100644 index 05988f3..0000000 --- a/mojo/public/js/validation_unittests.js +++ /dev/null @@ -1,302 +0,0 @@ -// Copyright 2014 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -define([ - "console", - "file", - "gin/test/expect", - "mojo/public/interfaces/bindings/tests/validation_test_interfaces.mojom", - "mojo/public/js/buffer", - "mojo/public/js/codec", - "mojo/public/js/connection", - "mojo/public/js/connector", - "mojo/public/js/core", - "mojo/public/js/test/validation_test_input_parser", - "mojo/public/js/router", - "mojo/public/js/validator", -], function(console, - file, - expect, - testInterface, - buffer, - codec, - connection, - connector, - core, - parser, - router, - validator) { - - var noError = validator.validationError.NONE; - - function checkTestMessageParser() { - function TestMessageParserFailure(message, input) { - this.message = message; - this.input = input; - } - - TestMessageParserFailure.prototype.toString = function() { - return 'Error: ' + this.message + ' for "' + this.input + '"'; - } - - function checkData(data, expectedData, input) { - if (data.byteLength != expectedData.byteLength) { - var s = "message length (" + data.byteLength + ") doesn't match " + - "expected length: " + expectedData.byteLength; - throw new TestMessageParserFailure(s, input); - } - - for (var i = 0; i < data.byteLength; i++) { - if (data.getUint8(i) != expectedData.getUint8(i)) { - var s = 'message data mismatch at byte offset ' + i; - throw new TestMessageParserFailure(s, input); - } - } - } - - function testFloatItems() { - var input = '[f]+.3e9 [d]-10.03'; - var msg = parser.parseTestMessage(input); - var expectedData = new buffer.Buffer(12); - expectedData.setFloat32(0, +.3e9); - expectedData.setFloat64(4, -10.03); - checkData(msg.buffer, expectedData, input); - } - - function testUnsignedIntegerItems() { - var input = '[u1]0x10// hello world !! \n\r \t [u2]65535 \n' + - '[u4]65536 [u8]0xFFFFFFFFFFFFF 0 0Xff'; - var msg = parser.parseTestMessage(input); - var expectedData = new buffer.Buffer(17); - expectedData.setUint8(0, 0x10); - expectedData.setUint16(1, 65535); - expectedData.setUint32(3, 65536); - expectedData.setUint64(7, 0xFFFFFFFFFFFFF); - expectedData.setUint8(15, 0); - expectedData.setUint8(16, 0xff); - checkData(msg.buffer, expectedData, input); - } - - function testSignedIntegerItems() { - var input = '[s8]-0x800 [s1]-128\t[s2]+0 [s4]-40'; - var msg = parser.parseTestMessage(input); - var expectedData = new buffer.Buffer(15); - expectedData.setInt64(0, -0x800); - expectedData.setInt8(8, -128); - expectedData.setInt16(9, 0); - expectedData.setInt32(11, -40); - checkData(msg.buffer, expectedData, input); - } - - function testByteItems() { - var input = '[b]00001011 [b]10000000 // hello world\n [b]00000000'; - var msg = parser.parseTestMessage(input); - var expectedData = new buffer.Buffer(3); - expectedData.setUint8(0, 11); - expectedData.setUint8(1, 128); - expectedData.setUint8(2, 0); - checkData(msg.buffer, expectedData, input); - } - - function testAnchors() { - var input = '[dist4]foo 0 [dist8]bar 0 [anchr]foo [anchr]bar'; - var msg = parser.parseTestMessage(input); - var expectedData = new buffer.Buffer(14); - expectedData.setUint32(0, 14); - expectedData.setUint8(4, 0); - expectedData.setUint64(5, 9); - expectedData.setUint8(13, 0); - checkData(msg.buffer, expectedData, input); - } - - function testHandles() { - var input = '// This message has handles! \n[handles]50 [u8]2'; - var msg = parser.parseTestMessage(input); - var expectedData = new buffer.Buffer(8); - expectedData.setUint64(0, 2); - - if (msg.handleCount != 50) { - var s = 'wrong handle count (' + msg.handleCount + ')'; - throw new TestMessageParserFailure(s, input); - } - checkData(msg.buffer, expectedData, input); - } - - function testEmptyInput() { - var msg = parser.parseTestMessage(''); - if (msg.buffer.byteLength != 0) - throw new TestMessageParserFailure('expected empty message', ''); - } - - function testBlankInput() { - var input = ' \t // hello world \n\r \t// the answer is 42 '; - var msg = parser.parseTestMessage(input); - if (msg.buffer.byteLength != 0) - throw new TestMessageParserFailure('expected empty message', input); - } - - function testInvalidInput() { - function parserShouldFail(input) { - try { - parser.parseTestMessage(input); - } catch (e) { - if (e instanceof parser.InputError) - return; - throw new TestMessageParserFailure( - 'unexpected exception ' + e.toString(), input); - } - throw new TestMessageParserFailure("didn't detect invalid input", file); - } - - ['/ hello world', - '[u1]x', - '[u2]-1000', - '[u1]0x100', - '[s2]-0x8001', - '[b]1', - '[b]1111111k', - '[dist4]unmatched', - '[anchr]hello [dist8]hello', - '[dist4]a [dist4]a [anchr]a', - // '[dist4]a [anchr]a [dist4]a [anchr]a', - '0 [handles]50' - ].forEach(parserShouldFail); - } - - try { - testFloatItems(); - testUnsignedIntegerItems(); - testSignedIntegerItems(); - testByteItems(); - testInvalidInput(); - testEmptyInput(); - testBlankInput(); - testHandles(); - testAnchors(); - } catch (e) { - return e.toString(); - } - return null; - } - - function getMessageTestFiles(key) { - var sourceRoot = file.getSourceRootDirectory(); - expect(sourceRoot).not.toBeNull(); - - var testDir = sourceRoot + - "/mojo/public/interfaces/bindings/tests/data/validation/"; - var testFiles = file.getFilesInDirectory(testDir); - expect(testFiles).not.toBeNull(); - expect(testFiles.length).toBeGreaterThan(0); - - // The matching ".data" pathnames with the extension removed. - return testFiles.filter(function(s) { - return s.substr(-5) == ".data"; - }).map(function(s) { - return testDir + s.slice(0, -5); - }).filter(function(s) { - return s.indexOf(key) != -1; - }); - } - - function readTestMessage(filename) { - var contents = file.readFileToString(filename + ".data"); - expect(contents).not.toBeNull(); - return parser.parseTestMessage(contents); - } - - function readTestExpected(filename) { - var contents = file.readFileToString(filename + ".expected"); - expect(contents).not.toBeNull(); - return contents.trim(); - } - - function checkValidationResult(testFile, err) { - var actualResult = (err === noError) ? "PASS" : err; - var expectedResult = readTestExpected(testFile); - if (actualResult != expectedResult) - console.log("[Test message validation failed: " + testFile + " ]"); - expect(actualResult).toEqual(expectedResult); - } - - function testMessageValidation(key, filters) { - var testFiles = getMessageTestFiles(key); - expect(testFiles.length).toBeGreaterThan(0); - - for (var i = 0; i < testFiles.length; i++) { - // TODO(hansmuller): Temporarily skipping array pointer overflow tests. - if (testFiles[i].indexOf("overflow") != -1) { - console.log("[Skipping " + testFiles[i] + "]"); - continue; - } - - var testMessage = readTestMessage(testFiles[i]); - var handles = new Array(testMessage.handleCount); - var message = new codec.Message(testMessage.buffer, handles); - var messageValidator = new validator.Validator(message); - - var err = messageValidator.validateMessageHeader(); - for (var j = 0; err === noError && j < filters.length; ++j) - err = filters[j](messageValidator); - - checkValidationResult(testFiles[i], err); - } - } - - function testConformanceMessageValidation() { - testMessageValidation("conformance_", [ - testInterface.ConformanceTestInterface.validateRequest]); - } - - function testNotImplementedMessageValidation() { - testMessageValidation("not_implemented_", [ - testInterface.ConformanceTestInterface.validateRequest]); - } - - function testIntegratedMessageValidation() { - var testFiles = getMessageTestFiles("integration_"); - expect(testFiles.length).toBeGreaterThan(0); - - for (var i = 0; i < testFiles.length; i++) { - // TODO(hansmuller): Temporarily skipping array pointer overflow tests. - if (testFiles[i].indexOf("overflow") != -1) { - console.log("[Skipping " + testFiles[i] + "]"); - continue; - } - - var testMessage = readTestMessage(testFiles[i]); - var handles = new Array(testMessage.handleCount); - var testMessagePipe = new core.createMessagePipe(); - expect(testMessagePipe.result).toBe(core.RESULT_OK); - - var writeMessageValue = core.writeMessage( - testMessagePipe.handle0, - new Uint8Array(testMessage.buffer.arrayBuffer), - new Array(testMessage.handleCount), - core.WRITE_MESSAGE_FLAG_NONE); - expect(writeMessageValue).toBe(core.RESULT_OK); - - var testConnection = new connection.TestConnection( - testMessagePipe.handle1, - testInterface.IntegrationTestInterface1.stubClass, - testInterface.IntegrationTestInterface2.proxyClass); - - var validationError = noError; - testConnection.router_.validationErrorHandler = function(err) { - validationError = err; - } - - testConnection.router_.connector_.deliverMessage(); - checkValidationResult(testFiles[i], validationError); - - testConnection.close(); - expect(core.close(testMessagePipe.handle0)).toBe(core.RESULT_OK); - } - } - - expect(checkTestMessageParser()).toBeNull(); - testConformanceMessageValidation(); - testIntegratedMessageValidation(); - this.result = "PASS"; -}); diff --git a/mojo/public/js/validator.js b/mojo/public/js/validator.js deleted file mode 100644 index a6be692..0000000 --- a/mojo/public/js/validator.js +++ /dev/null @@ -1,356 +0,0 @@ -// Copyright 2014 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -define("mojo/public/js/validator", [ - "mojo/public/js/codec", -], function(codec) { - - var validationError = { - NONE: 'VALIDATION_ERROR_NONE', - MISALIGNED_OBJECT: 'VALIDATION_ERROR_MISALIGNED_OBJECT', - ILLEGAL_MEMORY_RANGE: 'VALIDATION_ERROR_ILLEGAL_MEMORY_RANGE', - UNEXPECTED_STRUCT_HEADER: 'VALIDATION_ERROR_UNEXPECTED_STRUCT_HEADER', - UNEXPECTED_ARRAY_HEADER: 'VALIDATION_ERROR_UNEXPECTED_ARRAY_HEADER', - ILLEGAL_HANDLE: 'VALIDATION_ERROR_ILLEGAL_HANDLE', - UNEXPECTED_INVALID_HANDLE: 'VALIDATION_ERROR_UNEXPECTED_INVALID_HANDLE', - ILLEGAL_POINTER: 'VALIDATION_ERROR_ILLEGAL_POINTER', - UNEXPECTED_NULL_POINTER: 'VALIDATION_ERROR_UNEXPECTED_NULL_POINTER', - MESSAGE_HEADER_INVALID_FLAG_COMBINATION: - 'VALIDATION_ERROR_MESSAGE_HEADER_INVALID_FLAG_COMBINATION', - MESSAGE_HEADER_MISSING_REQUEST_ID: - 'VALIDATION_ERROR_MESSAGE_HEADER_MISSING_REQUEST_ID', - DIFFERENT_SIZED_ARRAYS_IN_MAP: - 'VALIDATION_ERROR_DIFFERENT_SIZED_ARRAYS_IN_MAP', - }; - - var NULL_MOJO_POINTER = "NULL_MOJO_POINTER"; - - function isStringClass(cls) { - return cls === codec.String || cls === codec.NullableString; - } - - function isHandleClass(cls) { - return cls === codec.Handle || cls === codec.NullableHandle; - } - - function isNullable(type) { - return type === codec.NullableString || type === codec.NullableHandle || - type instanceof codec.NullableArrayOf || - type instanceof codec.NullablePointerTo; - } - - function Validator(message) { - this.message = message; - this.offset = 0; - this.handleIndex = 0; - } - - Object.defineProperty(Validator.prototype, "offsetLimit", { - get: function() { return this.message.buffer.byteLength; } - }); - - Object.defineProperty(Validator.prototype, "handleIndexLimit", { - get: function() { return this.message.handles.length; } - }); - - // True if we can safely allocate a block of bytes from start to - // to start + numBytes. - Validator.prototype.isValidRange = function(start, numBytes) { - // Only positive JavaScript integers that are less than 2^53 - // (Number.MAX_SAFE_INTEGER) can be represented exactly. - if (start < this.offset || numBytes <= 0 || - !Number.isSafeInteger(start) || - !Number.isSafeInteger(numBytes)) - return false; - - var newOffset = start + numBytes; - if (!Number.isSafeInteger(newOffset) || newOffset > this.offsetLimit) - return false; - - return true; - } - - Validator.prototype.claimRange = function(start, numBytes) { - if (this.isValidRange(start, numBytes)) { - this.offset = start + numBytes; - return true; - } - return false; - } - - Validator.prototype.claimHandle = function(index) { - if (index === codec.kEncodedInvalidHandleValue) - return true; - - if (index < this.handleIndex || index >= this.handleIndexLimit) - return false; - - // This is safe because handle indices are uint32. - this.handleIndex = index + 1; - return true; - } - - Validator.prototype.validateHandle = function(offset, nullable) { - var index = this.message.buffer.getUint32(offset); - - if (index === codec.kEncodedInvalidHandleValue) - return nullable ? - validationError.NONE : validationError.UNEXPECTED_INVALID_HANDLE; - - if (!this.claimHandle(index)) - return validationError.ILLEGAL_HANDLE; - return validationError.NONE; - } - - Validator.prototype.validateStructHeader = - function(offset, minNumBytes, minNumFields) { - if (!codec.isAligned(offset)) - return validationError.MISALIGNED_OBJECT; - - if (!this.isValidRange(offset, codec.kStructHeaderSize)) - return validationError.ILLEGAL_MEMORY_RANGE; - - var numBytes = this.message.buffer.getUint32(offset); - var numFields = this.message.buffer.getUint32(offset + 4); - - if (numBytes < minNumBytes || numFields < minNumFields) - return validationError.UNEXPECTED_STRUCT_HEADER; - - if (!this.claimRange(offset, numBytes)) - return validationError.ILLEGAL_MEMORY_RANGE; - - return validationError.NONE; - } - - Validator.prototype.validateMessageHeader = function() { - var err = this.validateStructHeader(0, codec.kMessageHeaderSize, 2); - if (err != validationError.NONE) - return err; - - var numBytes = this.message.getHeaderNumBytes(); - var numFields = this.message.getHeaderNumFields(); - - var validNumFieldsAndNumBytes = - (numFields == 2 && numBytes == codec.kMessageHeaderSize) || - (numFields == 3 && - numBytes == codec.kMessageWithRequestIDHeaderSize) || - (numFields > 3 && - numBytes >= codec.kMessageWithRequestIDHeaderSize); - if (!validNumFieldsAndNumBytes) - return validationError.UNEXPECTED_STRUCT_HEADER; - - var expectsResponse = this.message.expectsResponse(); - var isResponse = this.message.isResponse(); - - if (numFields == 2 && (expectsResponse || isResponse)) - return validationError.MESSAGE_HEADER_MISSING_REQUEST_ID; - - if (isResponse && expectsResponse) - return validationError.MESSAGE_HEADER_INVALID_FLAG_COMBINATION; - - return validationError.NONE; - } - - // Returns the message.buffer relative offset this pointer "points to", - // NULL_MOJO_POINTER if the pointer represents a null, or JS null if the - // pointer's value is not valid. - Validator.prototype.decodePointer = function(offset) { - var pointerValue = this.message.buffer.getUint64(offset); - if (pointerValue === 0) - return NULL_MOJO_POINTER; - var bufferOffset = offset + pointerValue; - return Number.isSafeInteger(bufferOffset) ? bufferOffset : null; - } - - Validator.prototype.validateArrayPointer = function( - offset, elementSize, elementType, nullable, expectedDimensionSizes, - currentDimension) { - var arrayOffset = this.decodePointer(offset); - if (arrayOffset === null) - return validationError.ILLEGAL_POINTER; - - if (arrayOffset === NULL_MOJO_POINTER) - return nullable ? - validationError.NONE : validationError.UNEXPECTED_NULL_POINTER; - - return this.validateArray(arrayOffset, elementSize, elementType, - expectedDimensionSizes, currentDimension); - } - - Validator.prototype.validateStructPointer = function( - offset, structClass, nullable) { - var structOffset = this.decodePointer(offset); - if (structOffset === null) - return validationError.ILLEGAL_POINTER; - - if (structOffset === NULL_MOJO_POINTER) - return nullable ? - validationError.NONE : validationError.UNEXPECTED_NULL_POINTER; - - return structClass.validate(this, structOffset); - } - - // This method assumes that the array at arrayPointerOffset has - // been validated. - - Validator.prototype.arrayLength = function(arrayPointerOffset) { - var arrayOffset = this.decodePointer(arrayPointerOffset); - return this.message.buffer.getUint32(arrayOffset + 4); - } - - Validator.prototype.validateMapPointer = function( - offset, mapIsNullable, keyClass, valueClass, valueIsNullable) { - // Validate the implicit map struct: - // struct {array<keyClass> keys; array<valueClass> values}; - var structOffset = this.decodePointer(offset); - if (structOffset === null) - return validationError.ILLEGAL_POINTER; - - if (structOffset === NULL_MOJO_POINTER) - return mapIsNullable ? - validationError.NONE : validationError.UNEXPECTED_NULL_POINTER; - - var mapEncodedSize = codec.kStructHeaderSize + codec.kMapStructPayloadSize; - var err = this.validateStructHeader(structOffset, mapEncodedSize, 2); - if (err !== validationError.NONE) - return err; - - // Validate the keys array. - var keysArrayPointerOffset = structOffset + codec.kStructHeaderSize; - err = this.validateArrayPointer( - keysArrayPointerOffset, keyClass.encodedSize, keyClass, false, [0], 0); - if (err !== validationError.NONE) - return err; - - // Validate the values array. - var valuesArrayPointerOffset = keysArrayPointerOffset + 8; - var valuesArrayDimensions = [0]; // Validate the actual length below. - if (valueClass instanceof codec.ArrayOf) - valuesArrayDimensions = - valuesArrayDimensions.concat(valueClass.dimensions()); - var err = this.validateArrayPointer(valuesArrayPointerOffset, - valueClass.encodedSize, - valueClass, - valueIsNullable, - valuesArrayDimensions, - 0); - if (err !== validationError.NONE) - return err; - - // Validate the lengths of the keys and values arrays. - var keysArrayLength = this.arrayLength(keysArrayPointerOffset); - var valuesArrayLength = this.arrayLength(valuesArrayPointerOffset); - if (keysArrayLength != valuesArrayLength) - return validationError.DIFFERENT_SIZED_ARRAYS_IN_MAP; - - return validationError.NONE; - } - - Validator.prototype.validateStringPointer = function(offset, nullable) { - return this.validateArrayPointer( - offset, codec.Uint8.encodedSize, codec.Uint8, nullable, [0], 0); - } - - // Similar to Array_Data<T>::Validate() - // mojo/public/cpp/bindings/lib/array_internal.h - - Validator.prototype.validateArray = - function (offset, elementSize, elementType, expectedDimensionSizes, - currentDimension) { - if (!codec.isAligned(offset)) - return validationError.MISALIGNED_OBJECT; - - if (!this.isValidRange(offset, codec.kArrayHeaderSize)) - return validationError.ILLEGAL_MEMORY_RANGE; - - var numBytes = this.message.buffer.getUint32(offset); - var numElements = this.message.buffer.getUint32(offset + 4); - - // Note: this computation is "safe" because elementSize <= 8 and - // numElements is a uint32. - var elementsTotalSize = (elementType === codec.PackedBool) ? - Math.ceil(numElements / 8) : (elementSize * numElements); - - if (numBytes < codec.kArrayHeaderSize + elementsTotalSize) - return validationError.UNEXPECTED_ARRAY_HEADER; - - if (expectedDimensionSizes[currentDimension] != 0 && - numElements != expectedDimensionSizes[currentDimension]) { - return validationError.UNEXPECTED_ARRAY_HEADER; - } - - if (!this.claimRange(offset, numBytes)) - return validationError.ILLEGAL_MEMORY_RANGE; - - // Validate the array's elements if they are pointers or handles. - - var elementsOffset = offset + codec.kArrayHeaderSize; - var nullable = isNullable(elementType); - - if (isHandleClass(elementType)) - return this.validateHandleElements(elementsOffset, numElements, nullable); - if (isStringClass(elementType)) - return this.validateArrayElements( - elementsOffset, numElements, codec.Uint8, nullable, [0], 0); - if (elementType instanceof codec.PointerTo) - return this.validateStructElements( - elementsOffset, numElements, elementType.cls, nullable); - if (elementType instanceof codec.ArrayOf) - return this.validateArrayElements( - elementsOffset, numElements, elementType.cls, nullable, - expectedDimensionSizes, currentDimension + 1); - - return validationError.NONE; - } - - // Note: the |offset + i * elementSize| computation in the validateFooElements - // methods below is "safe" because elementSize <= 8, offset and - // numElements are uint32, and 0 <= i < numElements. - - Validator.prototype.validateHandleElements = - function(offset, numElements, nullable) { - var elementSize = codec.Handle.encodedSize; - for (var i = 0; i < numElements; i++) { - var elementOffset = offset + i * elementSize; - var err = this.validateHandle(elementOffset, nullable); - if (err != validationError.NONE) - return err; - } - return validationError.NONE; - } - - // The elementClass parameter is the element type of the element arrays. - Validator.prototype.validateArrayElements = - function(offset, numElements, elementClass, nullable, - expectedDimensionSizes, currentDimension) { - var elementSize = codec.PointerTo.prototype.encodedSize; - for (var i = 0; i < numElements; i++) { - var elementOffset = offset + i * elementSize; - var err = this.validateArrayPointer( - elementOffset, elementClass.encodedSize, elementClass, nullable, - expectedDimensionSizes, currentDimension); - if (err != validationError.NONE) - return err; - } - return validationError.NONE; - } - - Validator.prototype.validateStructElements = - function(offset, numElements, structClass, nullable) { - var elementSize = codec.PointerTo.prototype.encodedSize; - for (var i = 0; i < numElements; i++) { - var elementOffset = offset + i * elementSize; - var err = - this.validateStructPointer(elementOffset, structClass, nullable); - if (err != validationError.NONE) - return err; - } - return validationError.NONE; - } - - var exports = {}; - exports.validationError = validationError; - exports.Validator = Validator; - return exports; -}); |