diff options
author | yzshen <yzshen@chromium.org> | 2017-04-03 07:01:27 +0900 |
---|---|---|
committer | Qijiang Fan <fqj@google.com> | 2020-06-05 05:43:30 +0900 |
commit | d3b98d144f1e812461aa66a9e6854958a296790a (patch) | |
tree | e507a5bfc16b37c70e334f6f889d6fdbcc455646 | |
parent | c7531babbfb7e54d0da8f5f5b72d747f1a8d2eaa (diff) | |
download | libchrome-d3b98d144f1e812461aa66a9e6854958a296790a.tar.gz |
Mojo JS bindings: change module loading solution.
This change takes place on the mojo/public/js/new_bindings copy so it doesn't
affect existing users.
- This change gets rid of AMD module loading. Now the bindings API is defined in
the "mojo" namespace. At build time, all bindings files are combined
into a single file "mojo_bindings.js". Users should use <script> tag to include
this file (as well as generated mojom.js files).
- Generated mojom.js files export their definitions under the same namespace as
the "module" statement in the corresponding mojom files.
- This change also adds a "use_new_js_bindings" option to the generator. It
duplicates the control message mojom files in order to generate two
different flavors of JS bindings.
- The new bindings use the Mojo system API defined by Web IDL.
BUG=699569
Review-Url: https://codereview.chromium.org/2759563004
Cr-Original-Commit-Position: refs/heads/master@{#459654}
Committed: https://chromium.googlesource.com/chromium/src/+/e6a5534bb3fe61b5224f1a22e43ba957190ad5d0
Review-Url: https://codereview.chromium.org/2759563004
Cr-Commit-Position: refs/heads/master@{#461349}
CrOS-Libchrome-Original-Commit: a06469911359843f3d823fac7a7c06fec3c46edb
21 files changed, 452 insertions, 301 deletions
diff --git a/mojo/public/interfaces/bindings/new_bindings/interface_control_messages.mojom b/mojo/public/interfaces/bindings/new_bindings/interface_control_messages.mojom new file mode 100644 index 0000000000..e03ffd6589 --- /dev/null +++ b/mojo/public/interfaces/bindings/new_bindings/interface_control_messages.mojom @@ -0,0 +1,67 @@ +// Copyright 2015 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. + +[JavaPackage="org.chromium.mojo.bindings.interfacecontrol"] +module mojo.interface_control2; + +// For each user-defined interface, some control functions are provided by the +// interface endpoints at both sides. + +//////////////////////////////////////////////////////////////////////////////// +// Run@0xFFFFFFFF(RunInput input) => (RunOutput? output); +// +// This control function runs the input command. If the command is not +// supported, |output| is set to null; otherwise |output| stores the result, +// whose type depends on the input. + +const uint32 kRunMessageId = 0xFFFFFFFF; + +struct RunMessageParams { + RunInput input; +}; +union RunInput { + QueryVersion query_version; + FlushForTesting flush_for_testing; +}; + +struct RunResponseMessageParams { + RunOutput? output; +}; +union RunOutput { + QueryVersionResult query_version_result; +}; + +// Queries the max supported version of the user-defined interface. +// Sent by the interface client side. +struct QueryVersion { +}; +struct QueryVersionResult { + uint32 version; +}; + +// Sent by either side of the interface. +struct FlushForTesting { +}; + +//////////////////////////////////////////////////////////////////////////////// +// RunOrClosePipe@0xFFFFFFFE(RunOrClosePipeInput input); +// +// This control function runs the input command. If the operation fails or the +// command is not supported, the message pipe is closed. + +const uint32 kRunOrClosePipeMessageId = 0xFFFFFFFE; + +struct RunOrClosePipeMessageParams { + RunOrClosePipeInput input; +}; +union RunOrClosePipeInput { + RequireVersion require_version; +}; + +// If the specified version of the user-defined interface is not supported, the +// function fails and the pipe is closed. +// Sent by the interface client side. +struct RequireVersion { + uint32 version; +}; diff --git a/mojo/public/interfaces/bindings/new_bindings/pipe_control_messages.mojom b/mojo/public/interfaces/bindings/new_bindings/pipe_control_messages.mojom new file mode 100644 index 0000000000..69975fc1c0 --- /dev/null +++ b/mojo/public/interfaces/bindings/new_bindings/pipe_control_messages.mojom @@ -0,0 +1,46 @@ +// Copyright 2015 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. + +[JavaPackage="org.chromium.mojo.bindings.pipecontrol"] +module mojo.pipe_control2; + +// For each message pipe running user-defined interfaces, some control +// functions are provided and used by the routers at both ends of the pipe, so +// that they can coordinate to manage interface endpoints. +// All these control messages will have the interface ID field in the message +// header set to invalid. + +//////////////////////////////////////////////////////////////////////////////// +// RunOrClosePipe@0xFFFFFFFE(RunOrClosePipeInput input); +// +// This control function runs the input command. If the operation fails or the +// command is not supported, the message pipe is closed. + +const uint32 kRunOrClosePipeMessageId = 0xFFFFFFFE; + +struct RunOrClosePipeMessageParams { + RunOrClosePipeInput input; +}; + +union RunOrClosePipeInput { + PeerAssociatedEndpointClosedEvent peer_associated_endpoint_closed_event; +}; + +// A user-defined reason about why the interface is disconnected. +struct DisconnectReason { + uint32 custom_reason; + string description; +}; + +// An event to notify that an interface endpoint set up at the message sender +// side has been closed. +// +// This event is omitted if the endpoint belongs to the master interface and +// there is no disconnect reason specified. +struct PeerAssociatedEndpointClosedEvent { + // The interface ID. + uint32 id; + DisconnectReason? disconnect_reason; +}; + diff --git a/mojo/public/interfaces/bindings/tests/echo.mojom b/mojo/public/interfaces/bindings/tests/echo.mojom new file mode 100644 index 0000000000..56c6063010 --- /dev/null +++ b/mojo/public/interfaces/bindings/tests/echo.mojom @@ -0,0 +1,12 @@ +// Copyright 2017 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 test.echo.mojom; + +import "echo_import.mojom"; + +interface Echo { + EchoPoint(test.echo_import.mojom.Point point) + => (test.echo_import.mojom.Point result); +}; diff --git a/mojo/public/interfaces/bindings/tests/echo_import.mojom b/mojo/public/interfaces/bindings/tests/echo_import.mojom new file mode 100644 index 0000000000..a024ce2ff1 --- /dev/null +++ b/mojo/public/interfaces/bindings/tests/echo_import.mojom @@ -0,0 +1,10 @@ +// Copyright 2017 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 test.echo_import.mojom; + +struct Point { + int32 x; + int32 y; +}; diff --git a/mojo/public/js/new_bindings/base.js b/mojo/public/js/new_bindings/base.js new file mode 100644 index 0000000000..ef7aa32f73 --- /dev/null +++ b/mojo/public/js/new_bindings/base.js @@ -0,0 +1,33 @@ +// Copyright 2017 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. + +'use strict'; + +if (mojo && mojo.internal) { + throw new Error('The Mojo bindings library has been initialized.'); +} + +var mojo = mojo || {}; +mojo.internal = {}; +mojo.internal.global = this; + +(function() { + var internal = mojo.internal; + + function exposeNamespace(namespace) { + var current = internal.global; + var parts = namespace.split('.'); + + for (var part; parts.length && (part = parts.shift());) { + if (!current[part]) { + current[part] = {}; + } + current = current[part]; + } + + return current; + } + + internal.exposeNamespace = exposeNamespace; +})(); diff --git a/mojo/public/js/new_bindings/bindings.js b/mojo/public/js/new_bindings/bindings.js index f3e40d293e..5b3b66ecea 100644 --- a/mojo/public/js/new_bindings/bindings.js +++ b/mojo/public/js/new_bindings/bindings.js @@ -2,19 +2,14 @@ // 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/core", - "mojo/public/js/lib/control_message_proxy", - "mojo/public/js/interface_types", - "mojo/public/js/router", -], function(core, controlMessageProxy, types, router) { - +(function() { + var internal = mojo.internal; // --------------------------------------------------------------------------- function makeRequest(interfacePtr) { - var pipe = core.createMessagePipe(); - interfacePtr.ptr.bind(new types.InterfacePtrInfo(pipe.handle0, 0)); - return new types.InterfaceRequest(pipe.handle1); + var pipe = Mojo.createMessagePipe(); + interfacePtr.ptr.bind(new mojo.InterfacePtrInfo(pipe.handle0, 0)); + return new mojo.InterfaceRequest(pipe.handle1); } // --------------------------------------------------------------------------- @@ -41,7 +36,7 @@ define("mojo/public/js/bindings", [ InterfacePtrController.prototype.bind = function(ptrInfoOrHandle) { this.reset(); - if (ptrInfoOrHandle instanceof types.InterfacePtrInfo) { + if (ptrInfoOrHandle instanceof mojo.InterfacePtrInfo) { this.version = ptrInfoOrHandle.version; this.handle_ = ptrInfoOrHandle.handle; } else { @@ -64,7 +59,7 @@ define("mojo/public/js/bindings", [ this.proxy_ = null; } if (this.handle_) { - core.close(this.handle_); + this.handle_.close(); this.handle_ = null; } }; @@ -82,12 +77,12 @@ define("mojo/public/js/bindings", [ var result; if (this.router_) { // TODO(yzshen): Fix Router interface to support extracting handle. - result = new types.InterfacePtrInfo( + result = new mojo.InterfacePtrInfo( this.router_.connector_.handle_, this.version); this.router_.connector_.handle_ = null; } else { // This also handles the case when this object is not bound. - result = new types.InterfacePtrInfo(this.handle_, this.version); + result = new mojo.InterfacePtrInfo(this.handle_, this.version); this.handle_ = null; } @@ -109,12 +104,11 @@ define("mojo/public/js/bindings", [ if (!this.handle_) return; - this.router_ = new router.Router(this.handle_); + this.router_ = new internal.Router(this.handle_); this.handle_ = null; this.router_ .setPayloadValidators([this.interfaceType_.validateResponse]); - this.controlMessageProxy_ = new - controlMessageProxy.ControlMessageProxy(this.router_); + this.controlMessageProxy_ = new internal.ControlMessageProxy(this.router_); this.proxy_ = new this.interfaceType_.proxyClass(this.router_); }; @@ -179,13 +173,13 @@ define("mojo/public/js/bindings", [ Binding.prototype.bind = function(requestOrHandle) { this.close(); - var handle = requestOrHandle instanceof types.InterfaceRequest ? + var handle = requestOrHandle instanceof mojo.InterfaceRequest ? requestOrHandle.handle : requestOrHandle; - if (!core.isHandle(handle)) + if (!(handle instanceof MojoHandle)) return; this.stub_ = new this.interfaceType_.stubClass(this.impl_); - this.router_ = new router.Router(handle, this.interfaceType_.kVersion); + this.router_ = new internal.Router(handle, this.interfaceType_.kVersion); this.router_.setIncomingReceiver(this.stub_); this.router_ .setPayloadValidators([this.interfaceType_.validateRequest]); }; @@ -208,9 +202,9 @@ define("mojo/public/js/bindings", [ Binding.prototype.unbind = function() { if (!this.isBound()) - return new types.InterfaceRequest(null); + return new mojo.InterfaceRequest(null); - var result = new types.InterfaceRequest(this.router_.connector_.handle_); + var result = new mojo.InterfaceRequest(this.router_.connector_.handle_); this.router_.connector_.handle_ = null; this.close(); return result; @@ -273,13 +267,9 @@ define("mojo/public/js/bindings", [ this.errorHandler_(); }; - var exports = {}; - exports.InterfacePtrInfo = types.InterfacePtrInfo; - exports.InterfaceRequest = types.InterfaceRequest; - exports.makeRequest = makeRequest; - exports.InterfacePtrController = InterfacePtrController; - exports.Binding = Binding; - exports.BindingSet = BindingSet; - return exports; -}); + mojo.makeRequest = makeRequest; + mojo.Binding = Binding; + mojo.BindingSet = BindingSet; + mojo.InterfacePtrController = InterfacePtrController; +})(); diff --git a/mojo/public/js/new_bindings/buffer.js b/mojo/public/js/new_bindings/buffer.js index e35f69513f..c44058bd0f 100644 --- a/mojo/public/js/new_bindings/buffer.js +++ b/mojo/public/js/new_bindings/buffer.js @@ -2,7 +2,8 @@ // 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() { +(function() { + var internal = mojo.internal; var kHostIsLittleEndian = (function () { var endianArrayBuffer = new ArrayBuffer(2); @@ -150,7 +151,5 @@ define("mojo/public/js/buffer", function() { this.dataView.setFloat64(offset, value, kHostIsLittleEndian); } - var exports = {}; - exports.Buffer = Buffer; - return exports; -}); + internal.Buffer = Buffer; +})(); diff --git a/mojo/public/js/new_bindings/codec.js b/mojo/public/js/new_bindings/codec.js index ff5d31a08e..339fc169da 100644 --- a/mojo/public/js/new_bindings/codec.js +++ b/mojo/public/js/new_bindings/codec.js @@ -2,11 +2,8 @@ // 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/buffer", - "mojo/public/js/interface_types", - "mojo/public/js/unicode", -], function(buffer, types, unicode) { +(function() { + var internal = mojo.internal; var kErrorUnsigned = "Passing negative value to unsigned"; var kErrorArray = "Passing non Array for array type"; @@ -138,7 +135,7 @@ define("mojo/public/js/codec", [ var numberOfElements = this.readUint32(); var base = this.next; this.next += numberOfElements; - return unicode.decodeUtf8String( + return internal.decodeUtf8String( new Uint8Array(this.buffer.arrayBuffer, base, numberOfElements)); }; @@ -314,7 +311,7 @@ define("mojo/public/js/codec", [ Encoder.prototype.encodeString = function(val) { var base = this.next + kArrayHeaderSize; - var numberOfElements = unicode.encodeUtf8String( + var numberOfElements = internal.encodeUtf8String( val, new Uint8Array(this.buffer.arrayBuffer, base)); var numberOfBytes = kArrayHeaderSize + numberOfElements; this.writeUint32(numberOfBytes); @@ -389,7 +386,7 @@ define("mojo/public/js/codec", [ if (typeof(val) !== "string") { throw new Error(kErrorString); } - var encodedSize = kArrayHeaderSize + unicode.utf8Length(val); + var encodedSize = kArrayHeaderSize + internal.utf8Length(val); var encoder = this.createAndEncodeEncoder(encodedSize); encoder.encodeString(val); }; @@ -473,7 +470,7 @@ define("mojo/public/js/codec", [ // 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.buffer = new internal.Buffer(numberOfBytes); this.handles = []; var encoder = this.createEncoder(kMessageHeaderSize); encoder.writeUint32(kMessageHeaderSize); @@ -511,7 +508,7 @@ define("mojo/public/js/codec", [ // 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.buffer = new internal.Buffer(numberOfBytes); this.handles = []; var encoder = this.createEncoder(kMessageWithRequestIDHeaderSize); encoder.writeUint32(kMessageWithRequestIDHeaderSize); @@ -814,7 +811,7 @@ define("mojo/public/js/codec", [ Interface.prototype.encodedSize = 8; Interface.prototype.decode = function(decoder) { - var interfacePtrInfo = new types.InterfacePtrInfo( + var interfacePtrInfo = new mojo.InterfacePtrInfo( decoder.decodeHandle(), decoder.readUint32()); var interfacePtr = new this.cls(); interfacePtr.ptr.bind(interfacePtrInfo); @@ -823,7 +820,7 @@ define("mojo/public/js/codec", [ Interface.prototype.encode = function(encoder, val) { var interfacePtrInfo = - val ? val.ptr.passInterface() : new types.InterfacePtrInfo(null, 0); + val ? val.ptr.passInterface() : new mojo.InterfacePtrInfo(null, 0); encoder.encodeHandle(interfacePtrInfo.handle); encoder.writeUint32(interfacePtrInfo.version); }; @@ -840,7 +837,7 @@ define("mojo/public/js/codec", [ InterfaceRequest.encodedSize = 4; InterfaceRequest.decode = function(decoder) { - return new types.InterfaceRequest(decoder.decodeHandle()); + return new mojo.InterfaceRequest(decoder.decodeHandle()); }; InterfaceRequest.encode = function(encoder, val) { @@ -877,46 +874,44 @@ define("mojo/public/js/codec", [ 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.Enum = Enum; - 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.Interface = Interface; - exports.NullableInterface = NullableInterface; - exports.InterfaceRequest = InterfaceRequest; - exports.NullableInterfaceRequest = NullableInterfaceRequest; - exports.MapOf = MapOf; - exports.NullableMapOf = NullableMapOf; - return exports; -}); + internal.align = align; + internal.isAligned = isAligned; + internal.Message = Message; + internal.MessageBuilder = MessageBuilder; + internal.MessageWithRequestIDBuilder = MessageWithRequestIDBuilder; + internal.MessageReader = MessageReader; + internal.kArrayHeaderSize = kArrayHeaderSize; + internal.kMapStructPayloadSize = kMapStructPayloadSize; + internal.kStructHeaderSize = kStructHeaderSize; + internal.kEncodedInvalidHandleValue = kEncodedInvalidHandleValue; + internal.kMessageHeaderSize = kMessageHeaderSize; + internal.kMessageWithRequestIDHeaderSize = kMessageWithRequestIDHeaderSize; + internal.kMessageExpectsResponse = kMessageExpectsResponse; + internal.kMessageIsResponse = kMessageIsResponse; + internal.Int8 = Int8; + internal.Uint8 = Uint8; + internal.Int16 = Int16; + internal.Uint16 = Uint16; + internal.Int32 = Int32; + internal.Uint32 = Uint32; + internal.Int64 = Int64; + internal.Uint64 = Uint64; + internal.Float = Float; + internal.Double = Double; + internal.String = String; + internal.Enum = Enum; + internal.NullableString = NullableString; + internal.PointerTo = PointerTo; + internal.NullablePointerTo = NullablePointerTo; + internal.ArrayOf = ArrayOf; + internal.NullableArrayOf = NullableArrayOf; + internal.PackedBool = PackedBool; + internal.Handle = Handle; + internal.NullableHandle = NullableHandle; + internal.Interface = Interface; + internal.NullableInterface = NullableInterface; + internal.InterfaceRequest = InterfaceRequest; + internal.NullableInterfaceRequest = NullableInterfaceRequest; + internal.MapOf = MapOf; + internal.NullableMapOf = NullableMapOf; +})(); diff --git a/mojo/public/js/new_bindings/connector.js b/mojo/public/js/new_bindings/connector.js index 4d06278653..7fa4822f89 100644 --- a/mojo/public/js/new_bindings/connector.js +++ b/mojo/public/js/new_bindings/connector.js @@ -2,15 +2,11 @@ // 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() { + var internal = mojo.internal; function Connector(handle) { - if (!core.isHandle(handle)) + if (!(handle instanceof MojoHandle)) throw new Error("Connector: not a handle " + handle); this.handle_ = handle; this.dropWrites_ = false; @@ -20,19 +16,18 @@ define("mojo/public/js/connector", [ this.errorHandler_ = null; if (handle) { - this.readWatcher_ = support.watch(handle, - core.HANDLE_SIGNAL_READABLE, - this.readMore_.bind(this)); + this.readWatcher_ = handle.watch({readable: true}, + this.readMore_.bind(this)); } } Connector.prototype.close = function() { if (this.readWatcher_) { - support.cancelWatch(this.readWatcher_); + this.readWatcher_.cancel(); this.readWatcher_ = null; } if (this.handle_ != null) { - core.close(this.handle_); + this.handle_.close(); this.handle_ = null; } }; @@ -44,17 +39,15 @@ define("mojo/public/js/connector", [ if (this.dropWrites_) return true; - var result = core.writeMessage(this.handle_, - new Uint8Array(message.buffer.arrayBuffer), - message.handles, - core.WRITE_MESSAGE_FLAG_NONE); + var result = this.handle_.writeMessage( + new Uint8Array(message.buffer.arrayBuffer), message.handles); switch (result) { - case core.RESULT_OK: + case Mojo.RESULT_OK: // The handles were successfully transferred, so we don't own them // anymore. message.handles = []; break; - case core.RESULT_FAILED_PRECONDITION: + case Mojo.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 @@ -83,32 +76,29 @@ define("mojo/public/js/connector", [ }; Connector.prototype.waitForNextMessageForTesting = function() { - var wait = core.wait(this.handle_, core.HANDLE_SIGNAL_READABLE); - this.readMore_(wait.result); + // TODO(yzshen): Change the tests that use this method. + throw new Error("Not supported!"); }; Connector.prototype.readMore_ = function(result) { for (;;) { - var read = core.readMessage(this.handle_, - core.READ_MESSAGE_FLAG_NONE); + var read = this.handle_.readMessage(); if (this.handle_ == null) // The connector has been closed. return; - if (read.result == core.RESULT_SHOULD_WAIT) + if (read.result == Mojo.RESULT_SHOULD_WAIT) return; - if (read.result != core.RESULT_OK) { + if (read.result != Mojo.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); + var messageBuffer = new internal.Buffer(read.buffer); + var message = new internal.Message(messageBuffer, read.handles); if (this.incomingReceiver_) this.incomingReceiver_.accept(message); } }; - var exports = {}; - exports.Connector = Connector; - return exports; -}); + internal.Connector = Connector; +})(); diff --git a/mojo/public/js/new_bindings/interface_types.js b/mojo/public/js/new_bindings/interface_types.js index 01ea2d1dd4..c52f6c7e55 100644 --- a/mojo/public/js/new_bindings/interface_types.js +++ b/mojo/public/js/new_bindings/interface_types.js @@ -2,10 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -define("mojo/public/js/interface_types", [ - "mojo/public/js/core", -], function(core) { - +(function() { // --------------------------------------------------------------------------- function InterfacePtrInfo(handle, version) { @@ -14,14 +11,14 @@ define("mojo/public/js/interface_types", [ } InterfacePtrInfo.prototype.isValid = function() { - return core.isHandle(this.handle); + return this.handle instanceof MojoHandle; }; InterfacePtrInfo.prototype.close = function() { if (!this.isValid()) return; - core.close(this.handle); + this.handle.close(); this.handle = null; this.version = 0; }; @@ -33,20 +30,17 @@ define("mojo/public/js/interface_types", [ } InterfaceRequest.prototype.isValid = function() { - return core.isHandle(this.handle); + return this.handle instanceof MojoHandle; }; InterfaceRequest.prototype.close = function() { if (!this.isValid()) return; - core.close(this.handle); + this.handle.close(); this.handle = null; }; - var exports = {}; - exports.InterfacePtrInfo = InterfacePtrInfo; - exports.InterfaceRequest = InterfaceRequest; - - return exports; -}); + mojo.InterfacePtrInfo = InterfacePtrInfo; + mojo.InterfaceRequest = InterfaceRequest; +})(); diff --git a/mojo/public/js/new_bindings/lib/control_message_handler.js b/mojo/public/js/new_bindings/lib/control_message_handler.js index 81d9002e0b..3f122fb379 100644 --- a/mojo/public/js/new_bindings/lib/control_message_handler.js +++ b/mojo/public/js/new_bindings/lib/control_message_handler.js @@ -2,90 +2,88 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -define("mojo/public/js/lib/control_message_handler", [ - "mojo/public/js/codec", - "mojo/public/interfaces/bindings/interface_control_messages.mojom", - "mojo/public/js/validator", -], function(codec, controlMessages, validator) { - - var Validator = validator.Validator; +(function() { + var internal = mojo.internal; function validateControlRequestWithResponse(message) { - var messageValidator = new Validator(message); + var messageValidator = new internal.Validator(message); var error = messageValidator.validateMessageIsRequestExpectingResponse(); - if (error !== validator.validationError.NONE) { + if (error !== internal.validationError.NONE) { throw error; } - if (message.getName() != controlMessages.kRunMessageId) { + if (message.getName() != mojo.interface_control2.kRunMessageId) { throw new Error("Control message name is not kRunMessageId"); } // Validate payload. - error = controlMessages.RunMessageParams.validate(messageValidator, + error = mojo.interface_control2.RunMessageParams.validate(messageValidator, message.getHeaderNumBytes()); - if (error != validator.validationError.NONE) { + if (error != internal.validationError.NONE) { throw error; } } function validateControlRequestWithoutResponse(message) { - var messageValidator = new Validator(message); + var messageValidator = new internal.Validator(message); var error = messageValidator.validateMessageIsRequestWithoutResponse(); - if (error != validator.validationError.NONE) { + if (error != internal.validationError.NONE) { throw error; } - if (message.getName() != controlMessages.kRunOrClosePipeMessageId) { + if (message.getName() != mojo.interface_control2.kRunOrClosePipeMessageId) { throw new Error("Control message name is not kRunOrClosePipeMessageId"); } // Validate payload. - error = controlMessages.RunOrClosePipeMessageParams.validate( + error = mojo.interface_control2.RunOrClosePipeMessageParams.validate( messageValidator, message.getHeaderNumBytes()); - if (error != validator.validationError.NONE) { + if (error != internal.validationError.NONE) { throw error; } } function runOrClosePipe(message, interface_version) { - var reader = new codec.MessageReader(message); + var reader = new internal.MessageReader(message); var runOrClosePipeMessageParams = reader.decodeStruct( - controlMessages.RunOrClosePipeMessageParams); + mojo.interface_control2.RunOrClosePipeMessageParams); return interface_version >= runOrClosePipeMessageParams.input.require_version.version; } function run(message, responder, interface_version) { - var reader = new codec.MessageReader(message); + var reader = new internal.MessageReader(message); var runMessageParams = - reader.decodeStruct(controlMessages.RunMessageParams); + reader.decodeStruct(mojo.interface_control2.RunMessageParams); var runOutput = null; if (runMessageParams.input.query_version) { - runOutput = new controlMessages.RunOutput(); + runOutput = new mojo.interface_control2.RunOutput(); runOutput.query_version_result = new - controlMessages.QueryVersionResult({'version': interface_version}); + mojo.interface_control2.QueryVersionResult( + {'version': interface_version}); } var runResponseMessageParams = new - controlMessages.RunResponseMessageParams(); + mojo.interface_control2.RunResponseMessageParams(); runResponseMessageParams.output = runOutput; - var messageName = controlMessages.kRunMessageId; - var payloadSize = controlMessages.RunResponseMessageParams.encodedSize; + var messageName = mojo.interface_control2.kRunMessageId; + var payloadSize = + mojo.interface_control2.RunResponseMessageParams.encodedSize; var requestID = reader.requestID; - var builder = new codec.MessageWithRequestIDBuilder(messageName, - payloadSize, codec.kMessageIsResponse, requestID); - builder.encodeStruct(controlMessages.RunResponseMessageParams, + var builder = new internal.MessageWithRequestIDBuilder(messageName, + payloadSize, internal.kMessageIsResponse, requestID); + builder.encodeStruct(mojo.interface_control2.RunResponseMessageParams, runResponseMessageParams); responder.accept(builder.finish()); return true; } - function isControlMessage(message) { - return message.getName() == controlMessages.kRunMessageId || - message.getName() == controlMessages.kRunOrClosePipeMessageId; + function isInterfaceControlMessage(message) { + return message.getName() == mojo.interface_control2.kRunMessageId || + message.getName() == + mojo.interface_control2.kRunOrClosePipeMessageId; } function ControlMessageHandler(interface_version) { @@ -103,9 +101,6 @@ define("mojo/public/js/lib/control_message_handler", [ return run(message, responder, this.interface_version); }; - var exports = {}; - exports.ControlMessageHandler = ControlMessageHandler; - exports.isControlMessage = isControlMessage; - - return exports; -}); + internal.ControlMessageHandler = ControlMessageHandler; + internal.isInterfaceControlMessage = isInterfaceControlMessage; +})(); diff --git a/mojo/public/js/new_bindings/lib/control_message_proxy.js b/mojo/public/js/new_bindings/lib/control_message_proxy.js index d6c0734fe1..1d57557ae2 100644 --- a/mojo/public/js/new_bindings/lib/control_message_proxy.js +++ b/mojo/public/js/new_bindings/lib/control_message_proxy.js @@ -2,39 +2,35 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -define("mojo/public/js/lib/control_message_proxy", [ - "mojo/public/interfaces/bindings/interface_control_messages.mojom", - "mojo/public/js/codec", - "mojo/public/js/validator", -], function(controlMessages, codec, validator) { - - var Validator = validator.Validator; +(function() { + var internal = mojo.internal; function sendRunOrClosePipeMessage(receiver, runOrClosePipeMessageParams) { - var messageName = controlMessages.kRunOrClosePipeMessageId; - var payloadSize = controlMessages.RunOrClosePipeMessageParams.encodedSize; - var builder = new codec.MessageBuilder(messageName, payloadSize); - builder.encodeStruct(controlMessages.RunOrClosePipeMessageParams, + var messageName = mojo.interface_control2.kRunOrClosePipeMessageId; + var payloadSize = + mojo.interface_control2.RunOrClosePipeMessageParams.encodedSize; + var builder = new internal.MessageBuilder(messageName, payloadSize); + builder.encodeStruct(mojo.interface_control2.RunOrClosePipeMessageParams, runOrClosePipeMessageParams); var message = builder.finish(); receiver.accept(message); } function validateControlResponse(message) { - var messageValidator = new Validator(message); + var messageValidator = new internal.Validator(message); var error = messageValidator.validateMessageIsResponse(); - if (error != validator.validationError.NONE) { + if (error != internal.validationError.NONE) { throw error; } - if (message.getName() != controlMessages.kRunMessageId) { + if (message.getName() != mojo.interface_control2.kRunMessageId) { throw new Error("Control message name is not kRunMessageId"); } // Validate payload. - error = controlMessages.RunResponseMessageParams.validate( + error = mojo.interface_control2.RunResponseMessageParams.validate( messageValidator, message.getHeaderNumBytes()); - if (error != validator.validationError.NONE) { + if (error != internal.validationError.NONE) { throw error; } } @@ -42,9 +38,9 @@ define("mojo/public/js/lib/control_message_proxy", [ function acceptRunResponse(message) { validateControlResponse(message); - var reader = new codec.MessageReader(message); + var reader = new internal.MessageReader(message); var runResponseMessageParams = reader.decodeStruct( - controlMessages.RunResponseMessageParams); + mojo.interface_control2.RunResponseMessageParams); return Promise.resolve(runResponseMessageParams); } @@ -59,12 +55,13 @@ define("mojo/public/js/lib/control_message_proxy", [ * @return {Promise} that resolves to a RunResponseMessageParams. */ function sendRunMessage(receiver, runMessageParams) { - var messageName = controlMessages.kRunMessageId; - var payloadSize = controlMessages.RunMessageParams.encodedSize; + var messageName = mojo.interface_control2.kRunMessageId; + var payloadSize = mojo.interface_control2.RunMessageParams.encodedSize; // |requestID| is set to 0, but is later properly set by Router. - var builder = new codec.MessageWithRequestIDBuilder(messageName, - payloadSize, codec.kMessageExpectsResponse, 0); - builder.encodeStruct(controlMessages.RunMessageParams, runMessageParams); + var builder = new internal.MessageWithRequestIDBuilder(messageName, + payloadSize, internal.kMessageExpectsResponse, 0); + builder.encodeStruct(mojo.interface_control2.RunMessageParams, + runMessageParams); var message = builder.finish(); return receiver.acceptAndExpectResponse(message).then(acceptRunResponse); @@ -75,9 +72,10 @@ define("mojo/public/js/lib/control_message_proxy", [ } ControlMessageProxy.prototype.queryVersion = function() { - var runMessageParams = new controlMessages.RunMessageParams(); - runMessageParams.input = new controlMessages.RunInput(); - runMessageParams.input.query_version = new controlMessages.QueryVersion(); + var runMessageParams = new mojo.interface_control2.RunMessageParams(); + runMessageParams.input = new mojo.interface_control2.RunInput(); + runMessageParams.input.query_version = + new mojo.interface_control2.QueryVersion(); return sendRunMessage(this.receiver, runMessageParams).then(function( runResponseMessageParams) { @@ -87,16 +85,13 @@ define("mojo/public/js/lib/control_message_proxy", [ ControlMessageProxy.prototype.requireVersion = function(version) { var runOrClosePipeMessageParams = new - controlMessages.RunOrClosePipeMessageParams(); + mojo.interface_control2.RunOrClosePipeMessageParams(); runOrClosePipeMessageParams.input = new - controlMessages.RunOrClosePipeInput(); + mojo.interface_control2.RunOrClosePipeInput(); runOrClosePipeMessageParams.input.require_version = new - controlMessages.RequireVersion({'version': version}); + mojo.interface_control2.RequireVersion({'version': version}); sendRunOrClosePipeMessage(this.receiver, runOrClosePipeMessageParams); }; - var exports = {}; - exports.ControlMessageProxy = ControlMessageProxy; - - return exports; -}); + internal.ControlMessageProxy = ControlMessageProxy; +})(); diff --git a/mojo/public/js/new_bindings/router.js b/mojo/public/js/new_bindings/router.js index e94c5eb50f..1272407c1e 100644 --- a/mojo/public/js/new_bindings/router.js +++ b/mojo/public/js/new_bindings/router.js @@ -2,25 +2,14 @@ // 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", [ - "console", - "mojo/public/js/codec", - "mojo/public/js/core", - "mojo/public/js/connector", - "mojo/public/js/lib/control_message_handler", - "mojo/public/js/validator", -], function(console, codec, core, connector, controlMessageHandler, validator) { - - var Connector = connector.Connector; - var MessageReader = codec.MessageReader; - var Validator = validator.Validator; - var ControlMessageHandler = controlMessageHandler.ControlMessageHandler; +(function() { + var internal = mojo.internal; function Router(handle, interface_version, connectorFactory) { - if (!core.isHandle(handle)) + if (!(handle instanceof MojoHandle)) throw new Error("Router constructor: Not a handle"); if (connectorFactory === undefined) - connectorFactory = Connector; + connectorFactory = internal.Connector; this.connector_ = new connectorFactory(handle); this.incomingReceiver_ = null; this.errorHandler_ = null; @@ -31,7 +20,7 @@ define("mojo/public/js/router", [ if (interface_version !== undefined) { this.controlMessageHandler_ = new - ControlMessageHandler(interface_version); + internal.ControlMessageHandler(interface_version); } this.connector_.setIncomingReceiver({ @@ -97,8 +86,8 @@ define("mojo/public/js/router", [ }; Router.prototype.handleIncomingMessage_ = function(message) { - var noError = validator.validationError.NONE; - var messageValidator = new Validator(message); + var noError = internal.validationError.NONE; + var messageValidator = new internal.Validator(message); var err = messageValidator.validateMessageHeader(); for (var i = 0; err === noError && i < this.payloadValidators_.length; ++i) err = this.payloadValidators_[i](messageValidator); @@ -114,7 +103,7 @@ define("mojo/public/js/router", [ return; if (message.expectsResponse()) { - if (controlMessageHandler.isControlMessage(message)) { + if (internal.isInterfaceControlMessage(message)) { if (this.controlMessageHandler_) { this.controlMessageHandler_.acceptWithResponder(message, this); } else { @@ -128,7 +117,7 @@ define("mojo/public/js/router", [ this.close(); } } else if (message.isResponse()) { - var reader = new MessageReader(message); + var reader = new internal.MessageReader(message); var requestID = reader.requestID; var completer = this.completers_.get(requestID); if (completer) { @@ -138,7 +127,7 @@ define("mojo/public/js/router", [ console.log("Unexpected response with request ID: " + requestID); } } else { - if (controlMessageHandler.isControlMessage(message)) { + if (internal.isInterfaceControlMessage(message)) { if (this.controlMessageHandler_) { var ok = this.controlMessageHandler_.accept(message); if (ok) return; @@ -156,7 +145,7 @@ define("mojo/public/js/router", [ // TODO(yzshen): This should also trigger connection error handler. // Consider making accept() return a boolean and let the connector deal // with this, as the C++ code does. - console.log("Invalid message: " + validator.validationError[error]); + console.log("Invalid message: " + internal.validationError[error]); this.close(); return; @@ -197,7 +186,5 @@ define("mojo/public/js/router", [ this.invalidMessageHandler_(error); }; - var exports = {}; - exports.Router = Router; - return exports; -}); + internal.Router = Router; +})(); diff --git a/mojo/public/js/new_bindings/unicode.js b/mojo/public/js/new_bindings/unicode.js index be2ba0e63c..6ed8839c3f 100644 --- a/mojo/public/js/new_bindings/unicode.js +++ b/mojo/public/js/new_bindings/unicode.js @@ -7,7 +7,9 @@ * stored in ArrayBuffers. There is much room for optimization in this code if * it proves necessary. */ -define("mojo/public/js/unicode", function() { +(function() { + var internal = mojo.internal; + /** * Decodes the UTF8 string from the given buffer. * @param {ArrayBufferView} buffer The buffer containing UTF8 string data. @@ -43,9 +45,7 @@ define("mojo/public/js/unicode", function() { return utf8String.length; } - var exports = {}; - exports.decodeUtf8String = decodeUtf8String; - exports.encodeUtf8String = encodeUtf8String; - exports.utf8Length = utf8Length; - return exports; -}); + internal.decodeUtf8String = decodeUtf8String; + internal.encodeUtf8String = encodeUtf8String; + internal.utf8Length = utf8Length; +})(); diff --git a/mojo/public/js/new_bindings/validator.js b/mojo/public/js/new_bindings/validator.js index fee742d0c1..610112b58e 100644 --- a/mojo/public/js/new_bindings/validator.js +++ b/mojo/public/js/new_bindings/validator.js @@ -2,9 +2,8 @@ // 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) { +(function() { + var internal = mojo.internal; var validationError = { NONE: 'VALIDATION_ERROR_NONE', @@ -30,32 +29,33 @@ define("mojo/public/js/validator", [ var NULL_MOJO_POINTER = "NULL_MOJO_POINTER"; function isEnumClass(cls) { - return cls instanceof codec.Enum; + return cls instanceof internal.Enum; } function isStringClass(cls) { - return cls === codec.String || cls === codec.NullableString; + return cls === internal.String || cls === internal.NullableString; } function isHandleClass(cls) { - return cls === codec.Handle || cls === codec.NullableHandle; + return cls === internal.Handle || cls === internal.NullableHandle; } function isInterfaceClass(cls) { - return cls instanceof codec.Interface; + return cls instanceof internal.Interface; } function isInterfaceRequestClass(cls) { - return cls === codec.InterfaceRequest || - cls === codec.NullableInterfaceRequest; + return cls === internal.InterfaceRequest || + cls === internal.NullableInterfaceRequest; } function isNullable(type) { - return type === codec.NullableString || type === codec.NullableHandle || - type === codec.NullableInterface || - type === codec.NullableInterfaceRequest || - type instanceof codec.NullableArrayOf || - type instanceof codec.NullablePointerTo; + return type === internal.NullableString || + type === internal.NullableHandle || + type === internal.NullableInterface || + type === internal.NullableInterfaceRequest || + type instanceof internal.NullableArrayOf || + type instanceof internal.NullablePointerTo; } function Validator(message) { @@ -98,7 +98,7 @@ define("mojo/public/js/validator", [ }; Validator.prototype.claimHandle = function(index) { - if (index === codec.kEncodedInvalidHandleValue) + if (index === internal.kEncodedInvalidHandleValue) return true; if (index < this.handleIndex || index >= this.handleIndexLimit) @@ -119,7 +119,7 @@ define("mojo/public/js/validator", [ Validator.prototype.validateHandle = function(offset, nullable) { var index = this.message.buffer.getUint32(offset); - if (index === codec.kEncodedInvalidHandleValue) + if (index === internal.kEncodedInvalidHandleValue) return nullable ? validationError.NONE : validationError.UNEXPECTED_INVALID_HANDLE; @@ -138,10 +138,10 @@ define("mojo/public/js/validator", [ }; Validator.prototype.validateStructHeader = function(offset, minNumBytes) { - if (!codec.isAligned(offset)) + if (!internal.isAligned(offset)) return validationError.MISALIGNED_OBJECT; - if (!this.isValidRange(offset, codec.kStructHeaderSize)) + if (!this.isValidRange(offset, internal.kStructHeaderSize)) return validationError.ILLEGAL_MEMORY_RANGE; var numBytes = this.message.buffer.getUint32(offset); @@ -182,7 +182,7 @@ define("mojo/public/js/validator", [ Validator.prototype.validateMessageHeader = function() { - var err = this.validateStructHeader(0, codec.kMessageHeaderSize); + var err = this.validateStructHeader(0, internal.kMessageHeaderSize); if (err != validationError.NONE) return err; @@ -190,11 +190,11 @@ define("mojo/public/js/validator", [ var version = this.message.getHeaderVersion(); var validVersionAndNumBytes = - (version == 0 && numBytes == codec.kMessageHeaderSize) || + (version == 0 && numBytes == internal.kMessageHeaderSize) || (version == 1 && - numBytes == codec.kMessageWithRequestIDHeaderSize) || + numBytes == internal.kMessageWithRequestIDHeaderSize) || (version > 1 && - numBytes >= codec.kMessageWithRequestIDHeaderSize); + numBytes >= internal.kMessageWithRequestIDHeaderSize); if (!validVersionAndNumBytes) return validationError.UNEXPECTED_STRUCT_HEADER; @@ -322,13 +322,14 @@ define("mojo/public/js/validator", [ return mapIsNullable ? validationError.NONE : validationError.UNEXPECTED_NULL_POINTER; - var mapEncodedSize = codec.kStructHeaderSize + codec.kMapStructPayloadSize; + var mapEncodedSize = internal.kStructHeaderSize + + internal.kMapStructPayloadSize; var err = this.validateStructHeader(structOffset, mapEncodedSize); if (err !== validationError.NONE) return err; // Validate the keys array. - var keysArrayPointerOffset = structOffset + codec.kStructHeaderSize; + var keysArrayPointerOffset = structOffset + internal.kStructHeaderSize; err = this.validateArrayPointer( keysArrayPointerOffset, keyClass.encodedSize, keyClass, false, [0], 0); if (err !== validationError.NONE) @@ -337,7 +338,7 @@ define("mojo/public/js/validator", [ // Validate the values array. var valuesArrayPointerOffset = keysArrayPointerOffset + 8; var valuesArrayDimensions = [0]; // Validate the actual length below. - if (valueClass instanceof codec.ArrayOf) + if (valueClass instanceof internal.ArrayOf) valuesArrayDimensions = valuesArrayDimensions.concat(valueClass.dimensions()); var err = this.validateArrayPointer(valuesArrayPointerOffset, @@ -360,7 +361,7 @@ define("mojo/public/js/validator", [ Validator.prototype.validateStringPointer = function(offset, nullable) { return this.validateArrayPointer( - offset, codec.Uint8.encodedSize, codec.Uint8, nullable, [0], 0); + offset, internal.Uint8.encodedSize, internal.Uint8, nullable, [0], 0); }; // Similar to Array_Data<T>::Validate() @@ -369,10 +370,10 @@ define("mojo/public/js/validator", [ Validator.prototype.validateArray = function (offset, elementSize, elementType, expectedDimensionSizes, currentDimension) { - if (!codec.isAligned(offset)) + if (!internal.isAligned(offset)) return validationError.MISALIGNED_OBJECT; - if (!this.isValidRange(offset, codec.kArrayHeaderSize)) + if (!this.isValidRange(offset, internal.kArrayHeaderSize)) return validationError.ILLEGAL_MEMORY_RANGE; var numBytes = this.message.buffer.getUint32(offset); @@ -380,10 +381,10 @@ define("mojo/public/js/validator", [ // Note: this computation is "safe" because elementSize <= 8 and // numElements is a uint32. - var elementsTotalSize = (elementType === codec.PackedBool) ? + var elementsTotalSize = (elementType === internal.PackedBool) ? Math.ceil(numElements / 8) : (elementSize * numElements); - if (numBytes < codec.kArrayHeaderSize + elementsTotalSize) + if (numBytes < internal.kArrayHeaderSize + elementsTotalSize) return validationError.UNEXPECTED_ARRAY_HEADER; if (expectedDimensionSizes[currentDimension] != 0 && @@ -396,7 +397,7 @@ define("mojo/public/js/validator", [ // Validate the array's elements if they are pointers or handles. - var elementsOffset = offset + codec.kArrayHeaderSize; + var elementsOffset = offset + internal.kArrayHeaderSize; var nullable = isNullable(elementType); if (isHandleClass(elementType)) @@ -409,11 +410,11 @@ define("mojo/public/js/validator", [ elementsOffset, numElements, nullable); if (isStringClass(elementType)) return this.validateArrayElements( - elementsOffset, numElements, codec.Uint8, nullable, [0], 0); - if (elementType instanceof codec.PointerTo) + elementsOffset, numElements, internal.Uint8, nullable, [0], 0); + if (elementType instanceof internal.PointerTo) return this.validateStructElements( elementsOffset, numElements, elementType.cls, nullable); - if (elementType instanceof codec.ArrayOf) + if (elementType instanceof internal.ArrayOf) return this.validateArrayElements( elementsOffset, numElements, elementType.cls, nullable, expectedDimensionSizes, currentDimension + 1); @@ -430,7 +431,7 @@ define("mojo/public/js/validator", [ Validator.prototype.validateHandleElements = function(offset, numElements, nullable) { - var elementSize = codec.Handle.encodedSize; + var elementSize = internal.Handle.encodedSize; for (var i = 0; i < numElements; i++) { var elementOffset = offset + i * elementSize; var err = this.validateHandle(elementOffset, nullable); @@ -442,7 +443,7 @@ define("mojo/public/js/validator", [ Validator.prototype.validateInterfaceElements = function(offset, numElements, nullable) { - var elementSize = codec.Interface.prototype.encodedSize; + var elementSize = internal.Interface.prototype.encodedSize; for (var i = 0; i < numElements; i++) { var elementOffset = offset + i * elementSize; var err = this.validateInterface(elementOffset, nullable); @@ -454,7 +455,7 @@ define("mojo/public/js/validator", [ Validator.prototype.validateInterfaceRequestElements = function(offset, numElements, nullable) { - var elementSize = codec.InterfaceRequest.encodedSize; + var elementSize = internal.InterfaceRequest.encodedSize; for (var i = 0; i < numElements; i++) { var elementOffset = offset + i * elementSize; var err = this.validateInterfaceRequest(elementOffset, nullable); @@ -468,7 +469,7 @@ define("mojo/public/js/validator", [ Validator.prototype.validateArrayElements = function(offset, numElements, elementClass, nullable, expectedDimensionSizes, currentDimension) { - var elementSize = codec.PointerTo.prototype.encodedSize; + var elementSize = internal.PointerTo.prototype.encodedSize; for (var i = 0; i < numElements; i++) { var elementOffset = offset + i * elementSize; var err = this.validateArrayPointer( @@ -482,7 +483,7 @@ define("mojo/public/js/validator", [ Validator.prototype.validateStructElements = function(offset, numElements, structClass, nullable) { - var elementSize = codec.PointerTo.prototype.encodedSize; + var elementSize = internal.PointerTo.prototype.encodedSize; for (var i = 0; i < numElements; i++) { var elementOffset = offset + i * elementSize; var err = @@ -495,7 +496,7 @@ define("mojo/public/js/validator", [ Validator.prototype.validateEnumElements = function(offset, numElements, enumClass) { - var elementSize = codec.Enum.prototype.encodedSize; + var elementSize = internal.Enum.prototype.encodedSize; for (var i = 0; i < numElements; i++) { var elementOffset = offset + i * elementSize; var err = this.validateEnum(elementOffset, enumClass); @@ -505,8 +506,6 @@ define("mojo/public/js/validator", [ return validationError.NONE; }; - var exports = {}; - exports.validationError = validationError; - exports.Validator = Validator; - return exports; -}); + internal.validationError = validationError; + internal.Validator = Validator; +})(); diff --git a/mojo/public/tools/bindings/generators/js_templates/module.amd.tmpl b/mojo/public/tools/bindings/generators/js_templates/module.amd.tmpl index 1616e7c9d7..7eadbe338c 100644 --- a/mojo/public/tools/bindings/generators/js_templates/module.amd.tmpl +++ b/mojo/public/tools/bindings/generators/js_templates/module.amd.tmpl @@ -2,19 +2,38 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +{%- if use_new_js_bindings %} + +"use strict"; + +(function() { + // TODO(yzshen): Define these aliases to minimize the differences between the + // old/new modes. Remove them when the old mode goes away. + var bindings = mojo; + var codec = mojo.internal; + var validator = mojo.internal; +{%- for import in imports %} + var {{import.unique_name}} = {{import.module.namespace}}; +{%- endfor %} + +{% include "module_definition.tmpl" %} +})(); + +{%- else %} + define("{{module.path}}", [ {%- if module.path != "mojo/public/interfaces/bindings/interface_control_messages.mojom" and module.path != "mojo/public/interfaces/bindings/pipe_control_messages.mojom" %} "mojo/public/js/bindings", -{%- endif %} +{%- endif %} "mojo/public/js/codec", "mojo/public/js/core", "mojo/public/js/validator", -{%- for import in imports %} +{%- for import in imports %} "{{import.module.path}}", -{%- endfor %} +{%- endfor %} ], function( {%- if module.path != "mojo/public/interfaces/bindings/interface_control_messages.mojom" and @@ -22,12 +41,14 @@ define("{{module.path}}", [ "mojo/public/interfaces/bindings/pipe_control_messages.mojom" -%} bindings, {% endif -%} codec, core, validator -{%- for import in imports -%} +{%- for import in imports -%} , {{import.unique_name}} -{%- endfor -%} +{%- endfor -%} ) { {%- include "module_definition.tmpl" %} return exports; }); + +{%- endif %} diff --git a/mojo/public/tools/bindings/generators/js_templates/module_definition.tmpl b/mojo/public/tools/bindings/generators/js_templates/module_definition.tmpl index ddfef72bcc..a119ee9480 100644 --- a/mojo/public/tools/bindings/generators/js_templates/module_definition.tmpl +++ b/mojo/public/tools/bindings/generators/js_templates/module_definition.tmpl @@ -1,5 +1,5 @@ {#--- Constants #} -{%- for constant in module.constants %} +{%- for constant in module.constants %} var {{constant.name}} = {{constant.value|expression_to_text}}; {%- endfor %} @@ -25,8 +25,13 @@ {%- include "interface_definition.tmpl" %} {%- endfor %} +{%- if use_new_js_bindings %} + var exports = mojo.internal.exposeNamespace("{{module.namespace}}"); +{%- else %} var exports = {}; -{%- for constant in module.constants %} +{%- endif %} + +{%- for constant in module.constants %} exports.{{constant.name}} = {{constant.name}}; {%- endfor %} {%- for enum in enums %} @@ -41,10 +46,4 @@ {%- for interface in interfaces %} exports.{{interface.name}} = {{interface.name}}; exports.{{interface.name}}Ptr = {{interface.name}}Ptr; -{#--- Interface Client #} -{%- if interface.client in interfaces|map(attribute='name') %} - exports.{{interface.name}}.client = {{interface.client}}; -{%- elif interface.client in imported_interfaces %} - exports.{{interface.name}}.client = {{imported_interfaces[interface.client]}}; -{%- endif %} {%- endfor %} diff --git a/mojo/public/tools/bindings/generators/mojom_js_generator.py b/mojo/public/tools/bindings/generators/mojom_js_generator.py index 0eedb31445..6184f6dfe4 100644 --- a/mojo/public/tools/bindings/generators/mojom_js_generator.py +++ b/mojo/public/tools/bindings/generators/mojom_js_generator.py @@ -368,6 +368,7 @@ class Generator(generator.Generator): "module": self.module, "structs": self.GetStructs() + self.GetStructsFromMethods(), "unions": self.GetUnions(), + "use_new_js_bindings": self.use_new_js_bindings, "interfaces": self.GetInterfaces(), "imported_interfaces": self.GetImportedInterfaces(), } diff --git a/mojo/public/tools/bindings/mojom.gni b/mojo/public/tools/bindings/mojom.gni index 246663672e..4a244fb5b1 100644 --- a/mojo/public/tools/bindings/mojom.gni +++ b/mojo/public/tools/bindings/mojom.gni @@ -134,6 +134,13 @@ if (enable_mojom_typemapping) { # cpp_only (optional) # If set to true, only the C++ bindings targets will be generated. # +# use_new_js_bindings (optional) +# If set to true, the generated JS code will use the new module loading +# approach and the core API exposed by Web IDL. +# +# TODO(yzshen): Switch all existing users to use_new_js_bindings=true and +# remove the old mode. +# # The following parameters are used to support the component build. They are # needed so that bindings which are linked with a component can use the same # export settings for classes. The first three are for the chromium variant, and @@ -434,6 +441,11 @@ template("mojom") { if (defined(invoker.use_once_callback) && invoker.use_once_callback) { args += [ "--use_once_callback" ] } + + if (defined(invoker.use_new_js_bindings) && + invoker.use_new_js_bindings) { + args += [ "--use_new_js_bindings" ] + } } } diff --git a/mojo/public/tools/bindings/mojom_bindings_generator.py b/mojo/public/tools/bindings/mojom_bindings_generator.py index 3a0b6fc87e..a9650d7764 100755 --- a/mojo/public/tools/bindings/mojom_bindings_generator.py +++ b/mojo/public/tools/bindings/mojom_bindings_generator.py @@ -167,6 +167,7 @@ class MojomProcessor(object): variant=args.variant, bytecode_path=args.bytecode_path, for_blink=args.for_blink, use_once_callback=args.use_once_callback, + use_new_js_bindings=args.use_new_js_bindings, export_attribute=args.export_attribute, export_header=args.export_header, generate_non_variant_code=args.generate_non_variant_code) @@ -298,6 +299,10 @@ def main(): "--use_once_callback", action="store_true", help="Use base::OnceCallback instead of base::RepeatingCallback.") generate_parser.add_argument( + "--use_new_js_bindings", action="store_true", + help="Use the new module loading approach and the core API exposed by " + "Web IDL. This option only affects the JavaScript bindings.") + generate_parser.add_argument( "--export_attribute", type=str, default="", help="Optional attribute to specify on class declaration to export it " "for the component build.") diff --git a/mojo/public/tools/bindings/pylib/mojom/generate/generator.py b/mojo/public/tools/bindings/pylib/mojom/generate/generator.py index e4ab37357e..0e64af78a1 100644 --- a/mojo/public/tools/bindings/pylib/mojom/generate/generator.py +++ b/mojo/public/tools/bindings/pylib/mojom/generate/generator.py @@ -38,8 +38,8 @@ class Generator(object): # files to stdout. def __init__(self, module, output_dir=None, typemap=None, variant=None, bytecode_path=None, for_blink=False, use_once_callback=False, - export_attribute=None, export_header=None, - generate_non_variant_code=False): + use_new_js_bindings=False, export_attribute=None, + export_header=None, generate_non_variant_code=False): self.module = module self.output_dir = output_dir self.typemap = typemap or {} @@ -47,6 +47,7 @@ class Generator(object): self.bytecode_path = bytecode_path self.for_blink = for_blink self.use_once_callback = use_once_callback + self.use_new_js_bindings = use_new_js_bindings self.export_attribute = export_attribute self.export_header = export_header self.generate_non_variant_code = generate_non_variant_code |