Commit cd38dfe2 authored by Christopher Lam's avatar Christopher Lam Committed by Commit Bot

[Mojo Lite] Remove externs generators and use for-compile generators everywhere.

This CL removes the Mojo Lite externs generators and compiles all WebUIs
with the for-compile targets instead.

Structurally, all Mojo types are now Closure record typedefs, and their
generated business logic is underneath a Spec object to prevent the name
collisions that were happening in the original implementation.

All goog.requires have also been dropped, and goog.provides are now
per interface/struct/enum.

This CL paves the way for generating single file Closure compiled blobs
that have all the Mojo bindings for a single WebUI.

TBR=kinuko@chromium.org

Bug: 914149
Change-Id: I8866fa9eaa707b2db42369e695ed0a51c373c6b6
Reviewed-on: https://chromium-review.googlesource.com/c/1476886
Commit-Queue: calamity <calamity@chromium.org>
Reviewed-by: default avatarKen Rockot <rockot@google.com>
Cr-Commit-Position: refs/heads/master@{#634527}
parent 33917e8f
......@@ -38,7 +38,7 @@ if (!is_android) {
js_library("actions") {
deps = [
"//chrome/browser/ui/webui/app_management:mojo_bindings_js_externs",
"//chrome/browser/ui/webui/app_management:mojo_bindings_js_library_for_compile",
"//ui/webui/resources/js:cr",
]
}
......@@ -67,7 +67,7 @@ if (!is_android) {
":store_client",
":types",
":util",
"//chrome/browser/ui/webui/app_management:mojo_bindings_js_externs",
"//chrome/browser/ui/webui/app_management:mojo_bindings_js_library_for_compile",
]
}
......@@ -93,7 +93,7 @@ if (!is_android) {
js_library("browser_proxy") {
deps = [
":fake_page_handler",
"//chrome/browser/ui/webui/app_management:mojo_bindings_js_externs",
"//chrome/browser/ui/webui/app_management:mojo_bindings_js_library_for_compile",
"//ui/webui/resources/js:cr",
]
}
......@@ -125,7 +125,7 @@ if (!is_android) {
":constants",
":types",
":util",
"//chrome/browser/ui/webui/app_management:mojo_bindings_js_externs",
"//chrome/browser/ui/webui/app_management:mojo_bindings_js_library_for_compile",
"//ui/webui/resources/js:cr",
]
}
......@@ -238,7 +238,7 @@ if (!is_android) {
js_library("types") {
deps = [
"//chrome/browser/ui/webui/app_management:mojo_bindings_js_externs",
"//chrome/browser/ui/webui/app_management:mojo_bindings_js_library_for_compile",
]
}
......
......@@ -57,7 +57,7 @@ Polymer({
}
app_management.BrowserProxy.getInstance().handler.setPinned(
this.app_.id, newPinnedValue);
this.app_.id, assert(newPinnedValue));
},
/**
......
......@@ -82,7 +82,7 @@ Polymer({
return app_management.util.createPermission(
app_management.util.permissionTypeHandle(app, permissionType),
PermissionValueType.kBool, newPermissionValue);
PermissionValueType.kBool, assert(newPermissionValue));
},
/**
......@@ -114,6 +114,6 @@ Polymer({
return app_management.util.createPermission(
app_management.util.permissionTypeHandle(app, permissionType),
PermissionValueType.kTriState, newPermissionValue);
PermissionValueType.kTriState, assert(newPermissionValue));
},
});
......@@ -31,7 +31,7 @@ js_library("bluetooth_internals") {
]
deps = [
"//chrome/browser/ui/webui/bluetooth_internals:mojo_bindings_js_externs",
"//chrome/browser/ui/webui/bluetooth_internals:mojo_bindings_js_library_for_compile",
"//ui/webui/resources/js:cr",
"//ui/webui/resources/js:util",
"//ui/webui/resources/js/cr/ui:array_data_model",
......
......@@ -31,7 +31,7 @@ js_library("database_tab") {
deps = [
":discards",
":sorted_table_behavior",
"//chrome/browser/ui/webui/discards:mojo_bindings_js_externs",
"//chrome/browser/ui/webui/discards:mojo_bindings_js_library_for_compile",
"//ui/webui/resources/js:assert",
"//ui/webui/resources/js:cr",
]
......@@ -41,7 +41,7 @@ js_library("discards_tab") {
deps = [
":discards",
":sorted_table_behavior",
"//chrome/browser/ui/webui/discards:mojo_bindings_js_externs",
"//chrome/browser/ui/webui/discards:mojo_bindings_js_library_for_compile",
"//ui/webui/resources/js:assert",
"//ui/webui/resources/js:icon",
"//ui/webui/resources/js:util",
......@@ -50,8 +50,8 @@ js_library("discards_tab") {
js_library("graph_tab") {
deps = [
"//chrome/browser/ui/webui/discards:mojo_bindings_js_externs",
"//services/resource_coordinator/public/mojom:mojom_js_externs",
"//chrome/browser/ui/webui/discards:mojo_bindings_js_library_for_compile",
"//services/resource_coordinator/public/mojom:mojom_js_library_for_compile",
"//ui/webui/resources/js:assert",
"//ui/webui/resources/js:cr",
]
......@@ -59,7 +59,7 @@ js_library("graph_tab") {
js_library("graph_doc") {
deps = [
"//services/resource_coordinator/public/mojom:mojom_js_externs",
"//services/resource_coordinator/public/mojom:mojom_js_library_for_compile",
]
externs_list = [ "../../../../third_party/d3/src/externs.js" ]
......
......@@ -34,7 +34,7 @@ js_type_check("closure_compile") {
js_library("browser_proxy") {
deps = [
"//chrome/browser/ui/webui/downloads:mojo_bindings_js_externs",
"//chrome/browser/ui/webui/downloads:mojo_bindings_js_library_for_compile",
"//ui/webui/resources/js:cr",
]
externs_list = [ "externs.js" ]
......
......@@ -12,7 +12,7 @@ js_type_check("closure_compile") {
js_library("site_engagement") {
deps = [
"//chrome/browser/engagement:mojo_bindings_js_externs",
"//chrome/browser/engagement:mojo_bindings_js_library_for_compile",
"//ui/webui/resources/js:assert",
"//ui/webui/resources/js:util",
]
......
......@@ -12,16 +12,10 @@ js_type_check("closure_compile") {
js_library("omnibox") {
deps = [
"//ui/webui/resources/js:util",
":omnibox_element",
":omnibox_input",
":omnibox_output",
]
extra_deps = [ "//chrome/browser/ui/webui/omnibox:mojo_bindings_js" ]
externs_list = [
"$root_gen_dir/chrome/browser/ui/webui/omnibox/omnibox.mojom-lite.externs.js",
"$externs_path/mojo.js",
"$externs_path/pending.js",
"//chrome/browser/ui/webui/omnibox:mojo_bindings_js_library_for_compile",
]
}
......@@ -32,4 +26,7 @@ js_library("omnibox_input") {
}
js_library("omnibox_output") {
deps = [
"//ui/webui/resources/js:util",
]
}
......@@ -61,6 +61,6 @@ js_library("bluetooth_device_list_item") {
js_library("bluetooth_system_on_extensions") {
sources = []
deps = [
"//services/device/public/mojom:mojom_js_externs",
"//services/device/public/mojom:mojom_js_library_for_compile",
]
}
......@@ -16,7 +16,7 @@ js_library("usb_internals") {
]
deps = [
"//chrome/browser/ui/webui/usb_internals:mojo_bindings_js_externs",
"//chrome/browser/ui/webui/usb_internals:mojo_bindings_js_library_for_compile",
"//ui/webui/resources/js:cr",
"//ui/webui/resources/js:util",
"//ui/webui/resources/js/cr/ui:tabs",
......
......@@ -12,7 +12,7 @@ js_type_check("closure_compile") {
js_library("process_internals") {
deps = [
"//content/browser/process_internals:mojo_bindings_js_externs",
"//content/browser/process_internals:mojo_bindings_js_library_for_compile",
"//ui/webui/resources/js:assert",
"//ui/webui/resources/js:util",
"//ui/webui/resources/js/cr/ui:tree",
......
......@@ -60,14 +60,14 @@ bindings_lite_sources = [
bindings_lite_compiled_file = "$target_gen_dir/mojo_bindings_lite.js"
if (enable_mojom_closure_compile) {
js_library("bindings_lite_sources") {
sources = [ "compile_preamble.js" ] + bindings_lite_sources
deps = [
"//mojo/public/interfaces/bindings:bindings_js_library_for_compile",
]
}
js_library("bindings_lite_sources") {
sources = [ "compile_preamble.js" ] + bindings_lite_sources
deps = [
"//mojo/public/interfaces/bindings:bindings_js_library_for_compile",
]
}
if (enable_mojom_closure_compile || closure_compile) {
js_binary("bindings_lite") {
outputs = [
bindings_lite_compiled_file,
......
......@@ -3,7 +3,8 @@
// found in the LICENSE file.
'use strict';
goog.require('mojo.interfaceControl');
goog.require('mojo.interfaceControl.kRunMessageId');
goog.require('mojo.interfaceControl.RunResponseMessageParamsSpec');
goog.require('mojo.internal');
goog.provide('mojo.internal.interfaceSupport');
......@@ -27,7 +28,7 @@ mojo.internal.interfaceSupport.ControlMessageHandler = class {
mojo.internal.serializeAndSendMessage(
this.handle_, mojo.interfaceControl.kRunMessageId, requestId,
mojo.internal.kMessageFlagExpectsResponse,
mojo.interfaceControl.RunMessageParams.$, {'input': input});
mojo.interfaceControl.RunMessageParamsSpec.$, {'input': input});
this.pendingFlushResolvers_.set(requestId, resolve);
});
}
......@@ -47,12 +48,13 @@ mojo.internal.interfaceSupport.ControlMessageHandler = class {
handleRunRequest_(requestId, decoder) {
const input = decoder.decodeStructInline(
mojo.interfaceControl.RunMessageParams.$.$.structSpec)['input'];
mojo.interfaceControl.RunMessageParamsSpec.$.$.structSpec)['input'];
if (input.hasOwnProperty('flushForTesting')) {
mojo.internal.serializeAndSendMessage(
this.handle_, mojo.interfaceControl.kRunMessageId, requestId,
mojo.internal.kMessageFlagIsResponse,
mojo.interfaceControl.RunResponseMessageParams.$, {'output': null});
mojo.interfaceControl.RunResponseMessageParamsSpec.$,
{'output': null});
return true;
}
......
......@@ -349,7 +349,7 @@
if (cls === PackedBool) {
var byte = 0;
for (i = 0; i < numberOfElements; ++i) {
for (let i = 0; i < numberOfElements; ++i) {
if (val[i])
byte |= (1 << i % 8);
if (i % 8 === 7 || i == numberOfElements - 1) {
......
......@@ -54,7 +54,7 @@
* Accepts the response message from the receiver and decodes the message
* struct to RunResponseMessageParams.
*
* @param {Router} receiver.
* @param {Router} receiver
* @param {RunMessageParams} runMessageParams to be sent via a message.
* @return {Promise} that resolves to a RunResponseMessageParams.
*/
......
......@@ -70,14 +70,10 @@ action("precompile_templates") {
"$mojom_generator_root/generators/js_templates/interface_definition.tmpl",
"$mojom_generator_root/generators/js_templates/lite/enum_definition.tmpl",
"$mojom_generator_root/generators/js_templates/lite/interface_definition.tmpl",
"$mojom_generator_root/generators/js_templates/lite/interface_externs.tmpl",
"$mojom_generator_root/generators/js_templates/lite/module.externs.tmpl",
"$mojom_generator_root/generators/js_templates/lite/module_definition.tmpl",
"$mojom_generator_root/generators/js_templates/lite/mojom-lite.js.tmpl",
"$mojom_generator_root/generators/js_templates/lite/struct_definition.tmpl",
"$mojom_generator_root/generators/js_templates/lite/struct_externs.tmpl",
"$mojom_generator_root/generators/js_templates/lite/union_definition.tmpl",
"$mojom_generator_root/generators/js_templates/lite/union_externs.tmpl",
"$mojom_generator_root/generators/js_templates/module.amd.tmpl",
"$mojom_generator_root/generators/js_templates/module_definition.tmpl",
"$mojom_generator_root/generators/js_templates/struct_definition.tmpl",
......
{%- macro enum_def(enum_name, enum) -%}
{%- macro enum_def(enum_spec_parent, enum_parent, enum) -%}
{# TODO: Less generic enum annotations would be nice. We do it this way because
the bindings generator is still too stupid to generate the right integral
constants directly. #}
{% if generate_closure_exports -%}
goog.provide('{{enum_spec_parent}}.{{enum.name}}Spec');
{%- endif %}
/**
* @const {!Object}
* @const { {$: !mojo.internal.MojomType} }
* @export
*/
{{enum_name}} = { $: mojo.internal.Enum() };
{{enum_spec_parent}}.{{enum.name}}Spec = { $: mojo.internal.Enum() };
/**
* @enum {number}
* @export
*/
{{enum_parent}}.{{enum.name}} = {
{# Set up the enum here, but fill out the values later. #}
{%- for field in enum.fields %}
{%- if field.value %}
{{enum_name}}.{{field.name}} = {{field.value|expression_to_text_lite}};
{%- elif loop.first %}
{{enum_name}}.{{field.name}} = 0;
{%- else %}
{{enum_name}}.{{field.name}} = {{enum_name}}.{{enum.fields[loop.index0 - 1].name}} + 1;
{%- endif %}
{{field.name}}: 0,
{%- endfor %}
{%- if enum.min_value is not none %}
{{enum_name}}.MIN_VALUE = {{enum.min_value}};
MIN_VALUE: {{enum.min_value}},
{%- endif %}
{%- if enum.max_value is not none %}
{{enum_name}}.MAX_VALUE = {{enum.max_value}};
MAX_VALUE: {{enum.max_value}},
{%- endif %}
};
{%- for field in enum.fields %}
{# Suppress type checks since we're assigning number into an enum. #}
/** @suppress {checkTypes} */
{%- if field.value %}
{{enum_parent}}.{{enum.name}}.{{field.name}} = {{field.value|expression_to_text_lite}};
{%- elif loop.first %}
{{enum_parent}}.{{enum.name}}.{{field.name}} = 0;
{%- else %}
{{enum_parent}}.{{enum.name}}.{{field.name}} = {{enum_parent}}.{{enum.name}}.{{enum.fields[loop.index0 - 1].name}} + 1;
{%- endif %}
{%- endfor %}
{%- endmacro %}
{% macro generateMethodAnnotation(method) %}
/**
{%- for param in method.parameters %}
* @param { {{param.kind|lite_closure_type_with_nullability}} } {{param.name|sanitize_identifier}}
{%- endfor -%}
{%- if method.response_parameters != None %}
{%- if method.response_parameters|length == 0 %}
* @return {Promise}
{%- else %}
* @return {Promise<{
{%- for response_parameter in method.response_parameters %}
{{response_parameter.name}}: {{response_parameter.kind|lite_closure_type_with_nullability}},
{%- endfor %}
* }>}
{%- endif %}
{%- endif %}
*/
{% endmacro %}
/** @export */
{{module.namespace}}.{{interface.name}}Request = class {
/** @param {!MojoHandle} handle */
......@@ -11,14 +30,7 @@
/** @interface */
{{module.namespace}}.{{interface.name}}Interface = class {
{%- for method in interface.methods %}
/**
{%- for param in method.parameters %}
* @param { {{param.kind|lite_closure_param_type}} } {{param.name|sanitize_identifier}}
{%- endfor -%}
{%- if method.response_parameters != None %}
* @return {Promise}
{%- endif %}
*/
{{generateMethodAnnotation(method)}}
{{method.name}}(
{%- for param in method.parameters -%}
{{param.name|sanitize_identifier}}{% if not loop.last %}, {% endif %}
......@@ -28,7 +40,10 @@
};
{%- endif %}
/** @implements { {{module.namespace}}.{{interface.name}}Interface } */
/**
* @export
* @implements { {{module.namespace}}.{{interface.name}}Interface }
*/
{{module.namespace}}.{{interface.name}}Proxy = class {
/** @param {MojoHandle=} opt_handle */
constructor(opt_handle) {
......@@ -41,7 +56,7 @@
opt_handle);
/**
* @public {!mojo.internal.interfaceSupport.InterfaceProxyBaseWrapper<!{{module.namespace}}.{{interface.name}}Request>>
* @public {!mojo.internal.interfaceSupport.InterfaceProxyBaseWrapper<!{{module.namespace}}.{{interface.name}}Request>}
*/
this.$ = new mojo.internal.interfaceSupport.InterfaceProxyBaseWrapper(this.proxy);
......@@ -53,15 +68,7 @@
{%- set interface_message_id =
interface.mojom_name ~ "_" ~ method.mojom_name %}
/**
{%- for param in method.parameters %}
* @param { {{param.kind|lite_closure_param_type}} } {{param.name|sanitize_identifier}}
{%- endfor -%}
{%- if method.response_parameters != None %}
* @return {Promise}
{%- endif %}
* @export
*/
{{generateMethodAnnotation(method)}}
{{method.name}}(
{%- for param in method.parameters %}
{{param.name}}{%- if not loop.last %},{% endif %}
......@@ -72,9 +79,9 @@
this.proxy.sendMessage(
{%- endif %}
{{method.ordinal}},
{{module.namespace}}.{{interface_message_id}}_Params.$,
{{module.namespace}}.{{interface_message_id}}_ParamsSpec.$,
{%- if method.response_parameters != None %}
{{module.namespace}}.{{interface_message_id}}_ResponseParams.$,
{{module.namespace}}.{{interface_message_id}}_ResponseParamsSpec.$,
{%- else %}
null,
{%- endif %}
......@@ -105,9 +112,9 @@
interface.mojom_name ~ "_" ~ method.mojom_name %}
this.target_.registerHandler(
{{method.ordinal}},
{{module.namespace}}.{{interface_message_id}}_Params.$,
{{module.namespace}}.{{interface_message_id}}_ParamsSpec.$,
{%- if method.response_parameters != None %}
{{module.namespace}}.{{interface_message_id}}_ResponseParams.$,
{{module.namespace}}.{{interface_message_id}}_ResponseParamsSpec.$,
{%- else %}
null,
{%- endif %}
......@@ -156,9 +163,10 @@
};
{#--- Enums #}
{% from "lite/enum_definition.tmpl" import enum_def %}
{% from "lite/enum_definition.tmpl" import enum_def with context %}
{%- for enum in interface.enums %}
{{ enum_def("%s.%s.%s"|format(module.namespace, interface.name, enum.name),
{{ enum_def("%s.%sSpec"|format(module.namespace, interface.name),
"%s.%s"|format(module.namespace, interface.name),
enum) }}
{%- endfor %}
......@@ -184,15 +192,18 @@
{% for method in interface.methods %}
{%- set interface_message_id =
interface.mojom_name ~ "_" ~ method.mojom_name %}
/** @public {!mojo.internal.interfaceSupport.InterfaceCallbackTarget} */
/**
* @export {!mojo.internal.interfaceSupport.InterfaceCallbackTarget}
*/
this.{{method.name}} =
new mojo.internal.interfaceSupport.InterfaceCallbackTarget(
this.router_);
this.target_.registerHandler(
{{method.ordinal}},
{{module.namespace}}.{{interface_message_id}}_Params.$,
{{module.namespace}}.{{interface_message_id}}_ParamsSpec.$,
{%- if method.response_parameters != None %}
{{module.namespace}}.{{interface_message_id}}_ResponseParams.$,
{{module.namespace}}.{{interface_message_id}}_ResponseParamsSpec.$,
this.{{method.name}}.createTargetHandler(true /* expectsResponse */));
{%- else %}
null,
......
{# Note that goog.provide is understood by the Closure Compiler even if the
Closure base library is unavailable. See https://crbug.com/898692 #}
goog.provide('{{module.namespace}}.{{interface.name}}');
goog.provide('{{module.namespace}}.{{interface.name}}Interface');
goog.provide('{{module.namespace}}.{{interface.name}}Request');
goog.provide('{{module.namespace}}.{{interface.name}}Proxy');
goog.provide('{{module.namespace}}.{{interface.name}}CallbackRouter');
{% macro generateInterfaceClassBody() -%}
{%- for method in interface.methods %}
/**
{%- for parameter in method.parameters %}
* @param { {{parameter.kind|lite_closure_type_with_nullability}} } {{parameter.name|sanitize_identifier}}
{%- endfor -%}
{%- if method.response_parameters != None %}
{%- if method.response_parameters|length == 0 %}
* @return {Promise}
{%- else %}
* @return {Promise<{
{%- for response_parameter in method.response_parameters %}
{{response_parameter.name}}: {{response_parameter.kind|lite_closure_type_with_nullability}},
{%- endfor %}
* }>}
{%- endif %}
{%- endif %}
*/
{{method.name}}(
{%- for parameter in method.parameters -%}
{{parameter.name|sanitize_identifier}}{% if not loop.last %}, {% endif %}
{%- endfor -%}
) {}
{%- endfor %}
{%- endmacro %}
/** @interface */
{{module.namespace}}.{{interface.name}}Interface = class {
{{ generateInterfaceClassBody() }}
};
{{module.namespace}}.{{interface.name}}Request = class {
/** @param {!MojoHandle} handle */
constructor(handle) {}
};
/** @implements { {{module.namespace}}.{{interface.name}}Interface } */
{{module.namespace}}.{{interface.name}}Proxy = class {
constructor() {
/** @public {!{
* createRequest: function(): !{{module.namespace}}.{{interface.name}}Request,
* close: function(),
* flushForTesting: function(): !Promise
* }}
*/
this.$;
/** @public {!mojo.internal.ConnectionErrorEventRouter} */
this.onConnectionError;
}
{{ generateInterfaceClassBody() }}
};
{{module.namespace}}.{{interface.name}} = class {
/** @param {!{{module.namespace}}.{{interface.name}}Interface} impl */
constructor(impl) {}
/**
* @param {!MojoHandle} handle
*/
bindHandle(handle) {}
/**
* @return {!{{module.namespace}}.{{interface.name}}Proxy }
*/
static getProxy() {}
/**
* @return {!{{module.namespace}}.{{interface.name}}Proxy }
*/
createProxy() {}
};
/** @const {!string} */
{{module.namespace}}.{{interface.name}}.$interfaceName;
{{module.namespace}}.{{interface.name}}CallbackRouter = class {
constructor() {
{%- for method in interface.methods %}
/** @public {!mojo.internal.InterfaceCallbackTarget} */
this.{{method.name}};
{%- endfor %}
}
/**
* @param {!MojoHandle} handle
*/
bindHandle(handle) {}
/**
* @return {!{{module.namespace}}.{{interface.name}}Proxy }
*/
createProxy() {}
/**
* @param {number} id An ID returned by a prior call to addListener.
* @return {boolean} True iff the identified listener was found and removed.
*/
removeListener(id) {}
};
{#--- Enum definitions #}
{% for enum in interface.enums %}
/** @enum {number} */
{{module.namespace}}.{{interface.name}}.{{enum.name}} = {};
{%- for field in enum.fields %}
{{module.namespace}}.{{interface.name}}.{{enum.name}}.{{field.name}};
{%- endfor %}
{%- endfor %}
// Copyright 2018 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.
{# Note that goog.provide is understood by the Closure Compiler even if the
Closure base library is unavailable. See https://crbug.com/898692 #}
{#--- Constant definitions #}
{%- for constant in module.constants %}
/** @type { {{constant.kind|closure_type_with_nullability }} } */
goog.provide('{{module.namespace}}.{{constant.name}}');
{%- endfor %}
{#--- Enum definitions #}
{% for enum in enums %}
/** @enum {number} */
{{module.namespace}}.{{enum.name}} = {};
{%- for field in enum.fields %}
{{module.namespace}}.{{enum.name}}.{{field.name}};
{%- endfor %}
{%- endfor %}
{#--- Interface definitions #}
{%- for interface in interfaces -%}
{%- include "lite/interface_externs.tmpl" %}
{% endfor -%}
{#--- Struct definitions #}
{%- for struct in structs -%}
{%- include "lite/struct_externs.tmpl" %}
{% endfor -%}
{#--- Union definitions #}
{%- for union in unions -%}
{%- include "lite/union_externs.tmpl" %}
{% endfor -%}
{#--- Constants #}
{%- for constant in module.constants %}
{% if generate_closure_exports -%}
goog.provide('{{module.namespace}}.{{constant.name}}');
{%- endif %}
/**
* @const { {{constant.kind|lite_closure_type_with_nullability}} }
* @export
......@@ -9,9 +13,9 @@
{%- endfor %}
{#--- Enums #}
{% from "lite/enum_definition.tmpl" import enum_def %}
{% from "lite/enum_definition.tmpl" import enum_def with context %}
{%- for enum in enums %}
{{enum_def("%s.%s"|format(module.namespace, enum.name), enum)}}
{{enum_def(module.namespace, module.namespace, enum)}}
{% endfor %}
{#--- Interface definitions #}
......@@ -24,19 +28,25 @@
# mojo.internal.Struct and mojo.internal.Union will fix-up the object
# appropriately, and we don't want Closure to complain. #}
{% for struct in structs %}
{% if generate_closure_exports -%}
goog.provide('{{module.namespace}}.{{struct.name}}Spec');
{%- endif %}
/**
* @const {!Object}
* @const { {$:!mojo.internal.MojomType}}
* @export
*/
{{module.namespace}}.{{struct.name}} =
{{module.namespace}}.{{struct.name}}Spec =
{ $: /** @type {!mojo.internal.MojomType} */ ({}) };
{% endfor %}
{%- for union in unions %}
{% if generate_closure_exports -%}
goog.provide('{{module.namespace}}.{{union.name}}Spec');
{%- endif %}
/**
* @const {!Object}
* @const { {$:!mojo.internal.MojomType} }
* @export
*/
{{module.namespace}}.{{union.name}} =
{{module.namespace}}.{{union.name}}Spec =
{ $: /** @type {!mojo.internal.MojomType} */ ({}) };
{% endfor %}
......
......@@ -8,11 +8,6 @@ goog.require('mojo.internal');
{%- if interfaces %}
goog.require('mojo.internal.interfaceSupport');
{%- endif %}
{% for import in imports -%}
goog.require('{{import.namespace}}');
{% endfor %}
goog.provide('{{module.namespace}}');
{% endif %}
mojo.internal.exportModule('{{module.namespace}}');
......
......@@ -7,13 +7,14 @@
{{constant.value|expression_to_text_lite}};
{% endfor %}
{%- from "lite/enum_definition.tmpl" import enum_def %}
{%- from "lite/enum_definition.tmpl" import enum_def with context %}
{% for enum in struct.enums %}
{{enum_def("%s.%s.%s"|format(module.namespace, struct.name, enum.name), enum)}}
{{enum_def("%s.%sSpec"|format(module.namespace, struct.name),
"%s.%s"|format(module.namespace, struct.name), enum)}}
{% endfor %}
mojo.internal.Struct(
{{module.namespace}}.{{struct.name}}.$,
{{module.namespace}}.{{struct.name}}Spec.$,
'{{struct.name}}',
{{struct.packed|payload_size}},
[
......@@ -31,3 +32,21 @@ mojo.internal.Struct(
{%- endif %}
{%- endfor %}
]);
{% if generate_closure_exports -%}
goog.provide('{{module.namespace}}.{{struct.name}}');
{% if struct.packed.packed_fields %}
/**
* @typedef { {
{%- for packed_field in struct.packed.packed_fields %}
* {{packed_field.field.name}}: {{packed_field.field.kind|lite_closure_field_type}},
{%- endfor %}
* } }
*/
{% else %}
/** @typedef {Object} */
{% endif %}
{{module.namespace}}.{{struct.name}};
{%- endif %}
{# Note that goog.provide is understood by the Closure Compiler even if the
Closure base library is unavailable. See https://crbug.com/898692 #}
goog.provide('{{module.namespace}}.{{struct.name}}');
{% if struct.packed.packed_fields %}
/**
* @typedef { {
{%- for packed_field in struct.packed.packed_fields %}
* {{packed_field.field.name}}: {{packed_field.field.kind|lite_closure_field_type}},
{%- endfor %}
* } }
*/
{% else %}
/** @typedef {Object} */
{% endif %}
{{module.namespace}}.{{struct.name}};
{#--- Enum definitions #}
{% for enum in struct.enums %}
/** @enum {number} */
{{module.namespace}}.{{struct.name}}.{{enum.name}} = {};
{%- for field in enum.fields %}
{{module.namespace}}.{{struct.name}}.{{enum.name}}.{{field.name}};
{%- endfor %}
{%- endfor %}
......@@ -20,6 +20,6 @@ js_type_check("closure_compile") {
js_library("test") {
deps = [
":mojo_bindings_js_externs",
":mojo_bindings_js_library_for_compile",
]
}
......@@ -7,10 +7,13 @@ async function testFunction() {
let proxy = test.mojom.TestPageHandler.getProxy()
// Type infers {?{values: !Array<!string>}} from Promise return type.
let result = await proxy.method1();
let result = await proxy.method1(' ', 5);
/** @type {Array<string>} */
let values = result.values;
/** @type {test.mojom.TestStruct} */
let testStruct = result.ts
}
/** @implements {test.mojom.TestPageInterface} */
......
......@@ -24,7 +24,7 @@ struct TestStruct {
};
interface TestPageHandler {
Method1() => (array<string> values);
Method1(string p1, int32 p2) => (array<string> values, TestStruct ts);
};
interface TestPage {
......
mojo.internal.Union(
{{module.namespace}}.{{union.name}}.$, '{{union.name}}',
{{module.namespace}}.{{union.name}}Spec.$, '{{union.name}}',
{
{%- for field in union.fields %}
'{{field.name}}': {
......@@ -12,3 +12,12 @@ mojo.internal.Union(
},
{%- endfor %}
});
/**
* @typedef { {
{%- for field in union.fields %}
* {{field.name}}: ({{field.kind|lite_closure_type_with_nullability}}|undefined),
{%- endfor %}
* } }
*/
{{module.namespace}}.{{union.name}};
{# Note that goog.provide is understood by the Closure Compiler even if the
Closure base library is unavailable. See https://crbug.com/898692 #}
goog.provide('{{module.namespace}}.{{union.name}}');
{{module.namespace}}.{{union.name}} = class {
constructor() {
{%- for field in fields %}
/** @type { {{field.kind|lite_closure_type_with_nullability}} } */
this.{{field.name}};
{%- endfor %}
}
};
......@@ -341,10 +341,6 @@ class Generator(generator.Generator):
def _GenerateLiteBindingsForCompile(self):
return self._GetParameters(for_compile=True)
@UseJinja("lite/module.externs.tmpl")
def _GenerateLiteExterns(self):
return self._GetParameters()
def GenerateFiles(self, args):
if self.variant:
raise Exception("Variants not supported in JavaScript bindings.")
......@@ -362,8 +358,6 @@ class Generator(generator.Generator):
self.Write(self._GenerateLiteBindings(), "%s-lite.js" % self.module.path)
self.Write(self._GenerateLiteBindingsForCompile(),
"%s-lite-for-compile.js" % self.module.path)
self.Write(self._GenerateLiteExterns(),
"%s-lite.externs.js" % self.module.path)
def _SetUniqueNameForImports(self):
used_names = set()
......@@ -532,19 +526,20 @@ class Generator(generator.Generator):
if named_kind.module:
name.append(named_kind.module.namespace)
if named_kind.parent_kind:
name.append(named_kind.parent_kind.name)
name.append(named_kind.parent_kind.name + "Spec")
name.append(named_kind.name)
name = ".".join(name)
if (mojom.IsStructKind(kind) or mojom.IsUnionKind(kind) or
mojom.IsEnumKind(kind)):
return "%s.$" % name
return "%sSpec.$" % name
if mojom.IsInterfaceKind(kind):
return "mojo.internal.InterfaceProxy(%sProxy)" % name
if mojom.IsInterfaceRequestKind(kind):
return "mojo.internal.InterfaceRequest(%sRequest)" % name
if mojom.IsAssociatedInterfaceKind(kind):
return "mojo.internal.AssociatedInterfaceProxy(%sAssociatedProxy)" % (
# TODO(rockot): Implement associated interfaces.
return "mojo.internal.AssociatedInterfaceProxy(%sProxy)" % (
name)
if mojom.IsAssociatedInterfaceRequestKind(kind):
return "mojo.internal.AssociatedInterfaceRequest(%s)" % name
......@@ -584,7 +579,7 @@ class Generator(generator.Generator):
if mojom.IsStructKind(field.kind):
assert field.default == "default"
return "null";
return self._ExpressionToText(field.default)
return self._ExpressionToTextLite(field.default)
if field.kind in mojom.PRIMITIVES:
return _kind_to_javascript_default_value[field.kind]
if mojom.IsEnumKind(field.kind):
......
......@@ -1219,7 +1219,6 @@ template("mojom") {
"$target_gen_dir/$source.externs.js",
"$target_gen_dir/$source-lite.js",
"$target_gen_dir/$source-lite-for-compile.js",
"$target_gen_dir/$source-lite.externs.js",
]
}
......@@ -1293,48 +1292,30 @@ template("mojom") {
}
}
if (enable_mojom_closure_compile) {
js_library_for_compile_target_name =
"${target_name}_js_library_for_compile"
if (defined(invoker.sources)) {
generator_js_lite_for_compile_outputs =
[ "{{source_gen_dir}}/{{source_file_part}}-lite-for-compile.js" ]
js_library(js_library_for_compile_target_name) {
extra_public_deps = [ ":$generator_js_target_name" ]
sources = process_file_template(invoker.sources,
generator_js_lite_for_compile_outputs)
deps = []
foreach(d, all_deps) {
full_name = get_label_info(d, "label_no_toolchain")
deps += [ "${full_name}_js_library_for_compile" ]
}
}
} else {
group(js_library_for_compile_target_name) {
}
}
}
js_externs_target_suffix = "_js_externs"
js_externs_target_name = "${target_name}${js_externs_target_suffix}"
js_library_for_compile_target_name = "${target_name}_js_library_for_compile"
if (defined(invoker.sources)) {
js_library(js_externs_target_name) {
sources = []
generator_js_lite_for_compile_outputs =
[ "{{source_gen_dir}}/{{source_file_part}}-lite-for-compile.js" ]
js_library(js_library_for_compile_target_name) {
extra_public_deps = [ ":$generator_js_target_name" ]
externs_list = [ "${externs_path}/mojo.js" ]
externs_list += process_file_template(
invoker.sources,
[ "{{source_gen_dir}}/{{source_file_part}}-lite.externs.js" ])
sources = process_file_template(invoker.sources,
generator_js_lite_for_compile_outputs)
externs_list = [
"${externs_path}/mojo_core.js",
"${externs_path}/pending.js",
]
deps = []
if (!defined(invoker.disallow_native_types)) {
deps += [ "//mojo/public/js:bindings_lite_sources" ]
}
foreach(d, all_deps) {
full_name = get_label_info(d, "label_no_toolchain")
deps += [ "${full_name}${js_externs_target_suffix}" ]
deps += [ "${full_name}_js_library_for_compile" ]
}
}
} else {
group(js_externs_target_name) {
group(js_library_for_compile_target_name) {
}
}
}
......
......@@ -26,14 +26,14 @@ js_library("button_bar") {
js_library("fake_mojo_service") {
deps = [
"//chromeos/services/multidevice_setup/public/mojom:mojom_js_externs",
"//chromeos/services/multidevice_setup/public/mojom:mojom_js_library_for_compile",
"//ui/webui/resources/js:cr",
]
}
js_library("mojo_api") {
deps = [
"//chromeos/services/multidevice_setup/public/mojom:mojom_js_externs",
"//chromeos/services/multidevice_setup/public/mojom:mojom_js_library_for_compile",
"//ui/webui/resources/js:cr",
]
}
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment