summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authoryzshen <yzshen@chromium.org>2017-04-03 07:01:27 +0900
committerQijiang Fan <fqj@google.com>2020-06-05 05:43:30 +0900
commitd3b98d144f1e812461aa66a9e6854958a296790a (patch)
treee507a5bfc16b37c70e334f6f889d6fdbcc455646
parentc7531babbfb7e54d0da8f5f5b72d747f1a8d2eaa (diff)
downloadlibchrome-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
-rw-r--r--mojo/public/interfaces/bindings/new_bindings/interface_control_messages.mojom67
-rw-r--r--mojo/public/interfaces/bindings/new_bindings/pipe_control_messages.mojom46
-rw-r--r--mojo/public/interfaces/bindings/tests/echo.mojom12
-rw-r--r--mojo/public/interfaces/bindings/tests/echo_import.mojom10
-rw-r--r--mojo/public/js/new_bindings/base.js33
-rw-r--r--mojo/public/js/new_bindings/bindings.js52
-rw-r--r--mojo/public/js/new_bindings/buffer.js9
-rw-r--r--mojo/public/js/new_bindings/codec.js107
-rw-r--r--mojo/public/js/new_bindings/connector.js50
-rw-r--r--mojo/public/js/new_bindings/interface_types.js22
-rw-r--r--mojo/public/js/new_bindings/lib/control_message_handler.js71
-rw-r--r--mojo/public/js/new_bindings/lib/control_message_proxy.js63
-rw-r--r--mojo/public/js/new_bindings/router.js39
-rw-r--r--mojo/public/js/new_bindings/unicode.js14
-rw-r--r--mojo/public/js/new_bindings/validator.js89
-rw-r--r--mojo/public/tools/bindings/generators/js_templates/module.amd.tmpl31
-rw-r--r--mojo/public/tools/bindings/generators/js_templates/module_definition.tmpl15
-rw-r--r--mojo/public/tools/bindings/generators/mojom_js_generator.py1
-rw-r--r--mojo/public/tools/bindings/mojom.gni12
-rwxr-xr-xmojo/public/tools/bindings/mojom_bindings_generator.py5
-rw-r--r--mojo/public/tools/bindings/pylib/mojom/generate/generator.py5
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