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) { ...@@ -38,7 +38,7 @@ if (!is_android) {
js_library("actions") { js_library("actions") {
deps = [ 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", "//ui/webui/resources/js:cr",
] ]
} }
...@@ -67,7 +67,7 @@ if (!is_android) { ...@@ -67,7 +67,7 @@ if (!is_android) {
":store_client", ":store_client",
":types", ":types",
":util", ":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) { ...@@ -93,7 +93,7 @@ if (!is_android) {
js_library("browser_proxy") { js_library("browser_proxy") {
deps = [ deps = [
":fake_page_handler", ":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", "//ui/webui/resources/js:cr",
] ]
} }
...@@ -125,7 +125,7 @@ if (!is_android) { ...@@ -125,7 +125,7 @@ if (!is_android) {
":constants", ":constants",
":types", ":types",
":util", ":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", "//ui/webui/resources/js:cr",
] ]
} }
...@@ -238,7 +238,7 @@ if (!is_android) { ...@@ -238,7 +238,7 @@ if (!is_android) {
js_library("types") { js_library("types") {
deps = [ 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({ ...@@ -57,7 +57,7 @@ Polymer({
} }
app_management.BrowserProxy.getInstance().handler.setPinned( app_management.BrowserProxy.getInstance().handler.setPinned(
this.app_.id, newPinnedValue); this.app_.id, assert(newPinnedValue));
}, },
/** /**
......
...@@ -82,7 +82,7 @@ Polymer({ ...@@ -82,7 +82,7 @@ Polymer({
return app_management.util.createPermission( return app_management.util.createPermission(
app_management.util.permissionTypeHandle(app, permissionType), app_management.util.permissionTypeHandle(app, permissionType),
PermissionValueType.kBool, newPermissionValue); PermissionValueType.kBool, assert(newPermissionValue));
}, },
/** /**
...@@ -114,6 +114,6 @@ Polymer({ ...@@ -114,6 +114,6 @@ Polymer({
return app_management.util.createPermission( return app_management.util.createPermission(
app_management.util.permissionTypeHandle(app, permissionType), app_management.util.permissionTypeHandle(app, permissionType),
PermissionValueType.kTriState, newPermissionValue); PermissionValueType.kTriState, assert(newPermissionValue));
}, },
}); });
...@@ -31,7 +31,7 @@ js_library("bluetooth_internals") { ...@@ -31,7 +31,7 @@ js_library("bluetooth_internals") {
] ]
deps = [ 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:cr",
"//ui/webui/resources/js:util", "//ui/webui/resources/js:util",
"//ui/webui/resources/js/cr/ui:array_data_model", "//ui/webui/resources/js/cr/ui:array_data_model",
......
...@@ -31,7 +31,7 @@ js_library("database_tab") { ...@@ -31,7 +31,7 @@ js_library("database_tab") {
deps = [ deps = [
":discards", ":discards",
":sorted_table_behavior", ":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:assert",
"//ui/webui/resources/js:cr", "//ui/webui/resources/js:cr",
] ]
...@@ -41,7 +41,7 @@ js_library("discards_tab") { ...@@ -41,7 +41,7 @@ js_library("discards_tab") {
deps = [ deps = [
":discards", ":discards",
":sorted_table_behavior", ":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:assert",
"//ui/webui/resources/js:icon", "//ui/webui/resources/js:icon",
"//ui/webui/resources/js:util", "//ui/webui/resources/js:util",
...@@ -50,8 +50,8 @@ js_library("discards_tab") { ...@@ -50,8 +50,8 @@ js_library("discards_tab") {
js_library("graph_tab") { js_library("graph_tab") {
deps = [ deps = [
"//chrome/browser/ui/webui/discards:mojo_bindings_js_externs", "//chrome/browser/ui/webui/discards:mojo_bindings_js_library_for_compile",
"//services/resource_coordinator/public/mojom:mojom_js_externs", "//services/resource_coordinator/public/mojom:mojom_js_library_for_compile",
"//ui/webui/resources/js:assert", "//ui/webui/resources/js:assert",
"//ui/webui/resources/js:cr", "//ui/webui/resources/js:cr",
] ]
...@@ -59,7 +59,7 @@ js_library("graph_tab") { ...@@ -59,7 +59,7 @@ js_library("graph_tab") {
js_library("graph_doc") { js_library("graph_doc") {
deps = [ 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" ] externs_list = [ "../../../../third_party/d3/src/externs.js" ]
......
...@@ -34,7 +34,7 @@ js_type_check("closure_compile") { ...@@ -34,7 +34,7 @@ js_type_check("closure_compile") {
js_library("browser_proxy") { js_library("browser_proxy") {
deps = [ 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", "//ui/webui/resources/js:cr",
] ]
externs_list = [ "externs.js" ] externs_list = [ "externs.js" ]
......
...@@ -12,7 +12,7 @@ js_type_check("closure_compile") { ...@@ -12,7 +12,7 @@ js_type_check("closure_compile") {
js_library("site_engagement") { js_library("site_engagement") {
deps = [ 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:assert",
"//ui/webui/resources/js:util", "//ui/webui/resources/js:util",
] ]
......
...@@ -12,16 +12,10 @@ js_type_check("closure_compile") { ...@@ -12,16 +12,10 @@ js_type_check("closure_compile") {
js_library("omnibox") { js_library("omnibox") {
deps = [ deps = [
"//ui/webui/resources/js:util",
":omnibox_element", ":omnibox_element",
":omnibox_input", ":omnibox_input",
":omnibox_output", ":omnibox_output",
] "//chrome/browser/ui/webui/omnibox:mojo_bindings_js_library_for_compile",
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",
] ]
} }
...@@ -32,4 +26,7 @@ js_library("omnibox_input") { ...@@ -32,4 +26,7 @@ js_library("omnibox_input") {
} }
js_library("omnibox_output") { js_library("omnibox_output") {
deps = [
"//ui/webui/resources/js:util",
]
} }
...@@ -61,6 +61,6 @@ js_library("bluetooth_device_list_item") { ...@@ -61,6 +61,6 @@ js_library("bluetooth_device_list_item") {
js_library("bluetooth_system_on_extensions") { js_library("bluetooth_system_on_extensions") {
sources = [] sources = []
deps = [ 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") { ...@@ -16,7 +16,7 @@ js_library("usb_internals") {
] ]
deps = [ 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:cr",
"//ui/webui/resources/js:util", "//ui/webui/resources/js:util",
"//ui/webui/resources/js/cr/ui:tabs", "//ui/webui/resources/js/cr/ui:tabs",
......
...@@ -12,7 +12,7 @@ js_type_check("closure_compile") { ...@@ -12,7 +12,7 @@ js_type_check("closure_compile") {
js_library("process_internals") { js_library("process_internals") {
deps = [ 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:assert",
"//ui/webui/resources/js:util", "//ui/webui/resources/js:util",
"//ui/webui/resources/js/cr/ui:tree", "//ui/webui/resources/js/cr/ui:tree",
......
...@@ -60,14 +60,14 @@ bindings_lite_sources = [ ...@@ -60,14 +60,14 @@ bindings_lite_sources = [
bindings_lite_compiled_file = "$target_gen_dir/mojo_bindings_lite.js" bindings_lite_compiled_file = "$target_gen_dir/mojo_bindings_lite.js"
if (enable_mojom_closure_compile) { js_library("bindings_lite_sources") {
js_library("bindings_lite_sources") { sources = [ "compile_preamble.js" ] + bindings_lite_sources
sources = [ "compile_preamble.js" ] + bindings_lite_sources deps = [
deps = [ "//mojo/public/interfaces/bindings:bindings_js_library_for_compile",
"//mojo/public/interfaces/bindings:bindings_js_library_for_compile", ]
] }
}
if (enable_mojom_closure_compile || closure_compile) {
js_binary("bindings_lite") { js_binary("bindings_lite") {
outputs = [ outputs = [
bindings_lite_compiled_file, bindings_lite_compiled_file,
......
...@@ -3,7 +3,8 @@ ...@@ -3,7 +3,8 @@
// found in the LICENSE file. // found in the LICENSE file.
'use strict'; 'use strict';
goog.require('mojo.interfaceControl'); goog.require('mojo.interfaceControl.kRunMessageId');
goog.require('mojo.interfaceControl.RunResponseMessageParamsSpec');
goog.require('mojo.internal'); goog.require('mojo.internal');
goog.provide('mojo.internal.interfaceSupport'); goog.provide('mojo.internal.interfaceSupport');
...@@ -27,7 +28,7 @@ mojo.internal.interfaceSupport.ControlMessageHandler = class { ...@@ -27,7 +28,7 @@ mojo.internal.interfaceSupport.ControlMessageHandler = class {
mojo.internal.serializeAndSendMessage( mojo.internal.serializeAndSendMessage(
this.handle_, mojo.interfaceControl.kRunMessageId, requestId, this.handle_, mojo.interfaceControl.kRunMessageId, requestId,
mojo.internal.kMessageFlagExpectsResponse, mojo.internal.kMessageFlagExpectsResponse,
mojo.interfaceControl.RunMessageParams.$, {'input': input}); mojo.interfaceControl.RunMessageParamsSpec.$, {'input': input});
this.pendingFlushResolvers_.set(requestId, resolve); this.pendingFlushResolvers_.set(requestId, resolve);
}); });
} }
...@@ -47,12 +48,13 @@ mojo.internal.interfaceSupport.ControlMessageHandler = class { ...@@ -47,12 +48,13 @@ mojo.internal.interfaceSupport.ControlMessageHandler = class {
handleRunRequest_(requestId, decoder) { handleRunRequest_(requestId, decoder) {
const input = decoder.decodeStructInline( const input = decoder.decodeStructInline(
mojo.interfaceControl.RunMessageParams.$.$.structSpec)['input']; mojo.interfaceControl.RunMessageParamsSpec.$.$.structSpec)['input'];
if (input.hasOwnProperty('flushForTesting')) { if (input.hasOwnProperty('flushForTesting')) {
mojo.internal.serializeAndSendMessage( mojo.internal.serializeAndSendMessage(
this.handle_, mojo.interfaceControl.kRunMessageId, requestId, this.handle_, mojo.interfaceControl.kRunMessageId, requestId,
mojo.internal.kMessageFlagIsResponse, mojo.internal.kMessageFlagIsResponse,
mojo.interfaceControl.RunResponseMessageParams.$, {'output': null}); mojo.interfaceControl.RunResponseMessageParamsSpec.$,
{'output': null});
return true; return true;
} }
......
...@@ -349,7 +349,7 @@ ...@@ -349,7 +349,7 @@
if (cls === PackedBool) { if (cls === PackedBool) {
var byte = 0; var byte = 0;
for (i = 0; i < numberOfElements; ++i) { for (let i = 0; i < numberOfElements; ++i) {
if (val[i]) if (val[i])
byte |= (1 << i % 8); byte |= (1 << i % 8);
if (i % 8 === 7 || i == numberOfElements - 1) { if (i % 8 === 7 || i == numberOfElements - 1) {
......
...@@ -54,7 +54,7 @@ ...@@ -54,7 +54,7 @@
* Accepts the response message from the receiver and decodes the message * Accepts the response message from the receiver and decodes the message
* struct to RunResponseMessageParams. * struct to RunResponseMessageParams.
* *
* @param {Router} receiver. * @param {Router} receiver
* @param {RunMessageParams} runMessageParams to be sent via a message. * @param {RunMessageParams} runMessageParams to be sent via a message.
* @return {Promise} that resolves to a RunResponseMessageParams. * @return {Promise} that resolves to a RunResponseMessageParams.
*/ */
......
...@@ -70,14 +70,10 @@ action("precompile_templates") { ...@@ -70,14 +70,10 @@ action("precompile_templates") {
"$mojom_generator_root/generators/js_templates/interface_definition.tmpl", "$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/enum_definition.tmpl",
"$mojom_generator_root/generators/js_templates/lite/interface_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/module_definition.tmpl",
"$mojom_generator_root/generators/js_templates/lite/mojom-lite.js.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_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_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.amd.tmpl",
"$mojom_generator_root/generators/js_templates/module_definition.tmpl", "$mojom_generator_root/generators/js_templates/module_definition.tmpl",
"$mojom_generator_root/generators/js_templates/struct_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 {# 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 the bindings generator is still too stupid to generate the right integral
constants directly. #} constants directly. #}
{% if generate_closure_exports -%}
goog.provide('{{enum_spec_parent}}.{{enum.name}}Spec');
{%- endif %}
/** /**
* @const {!Object} * @const { {$: !mojo.internal.MojomType} }
* @export * @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 %} {%- for field in enum.fields %}
{%- if field.value %} {{field.name}}: 0,
{{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 %}
{%- endfor %} {%- endfor %}
{%- if enum.min_value is not none %} {%- if enum.min_value is not none %}
{{enum_name}}.MIN_VALUE = {{enum.min_value}}; MIN_VALUE: {{enum.min_value}},
{%- endif %} {%- endif %}
{%- if enum.max_value is not none %} {%- if enum.max_value is not none %}
{{enum_name}}.MAX_VALUE = {{enum.max_value}}; MAX_VALUE: {{enum.max_value}},
{%- endif %} {%- 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 %} {%- 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 */ /** @export */
{{module.namespace}}.{{interface.name}}Request = class { {{module.namespace}}.{{interface.name}}Request = class {
/** @param {!MojoHandle} handle */ /** @param {!MojoHandle} handle */
...@@ -11,14 +30,7 @@ ...@@ -11,14 +30,7 @@
/** @interface */ /** @interface */
{{module.namespace}}.{{interface.name}}Interface = class { {{module.namespace}}.{{interface.name}}Interface = class {
{%- for method in interface.methods %} {%- for method in interface.methods %}
/** {{generateMethodAnnotation(method)}}
{%- 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 %}
*/
{{method.name}}( {{method.name}}(
{%- for param in method.parameters -%} {%- for param in method.parameters -%}
{{param.name|sanitize_identifier}}{% if not loop.last %}, {% endif %} {{param.name|sanitize_identifier}}{% if not loop.last %}, {% endif %}
...@@ -28,7 +40,10 @@ ...@@ -28,7 +40,10 @@
}; };
{%- endif %} {%- endif %}
/** @implements { {{module.namespace}}.{{interface.name}}Interface } */ /**
* @export
* @implements { {{module.namespace}}.{{interface.name}}Interface }
*/
{{module.namespace}}.{{interface.name}}Proxy = class { {{module.namespace}}.{{interface.name}}Proxy = class {
/** @param {MojoHandle=} opt_handle */ /** @param {MojoHandle=} opt_handle */
constructor(opt_handle) { constructor(opt_handle) {
...@@ -41,7 +56,7 @@ ...@@ -41,7 +56,7 @@
opt_handle); 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); this.$ = new mojo.internal.interfaceSupport.InterfaceProxyBaseWrapper(this.proxy);
...@@ -53,15 +68,7 @@ ...@@ -53,15 +68,7 @@
{%- set interface_message_id = {%- set interface_message_id =
interface.mojom_name ~ "_" ~ method.mojom_name %} interface.mojom_name ~ "_" ~ method.mojom_name %}
/** {{generateMethodAnnotation(method)}}
{%- 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
*/
{{method.name}}( {{method.name}}(
{%- for param in method.parameters %} {%- for param in method.parameters %}
{{param.name}}{%- if not loop.last %},{% endif %} {{param.name}}{%- if not loop.last %},{% endif %}
...@@ -72,9 +79,9 @@ ...@@ -72,9 +79,9 @@
this.proxy.sendMessage( this.proxy.sendMessage(
{%- endif %} {%- endif %}
{{method.ordinal}}, {{method.ordinal}},
{{module.namespace}}.{{interface_message_id}}_Params.$, {{module.namespace}}.{{interface_message_id}}_ParamsSpec.$,
{%- if method.response_parameters != None %} {%- if method.response_parameters != None %}
{{module.namespace}}.{{interface_message_id}}_ResponseParams.$, {{module.namespace}}.{{interface_message_id}}_ResponseParamsSpec.$,
{%- else %} {%- else %}
null, null,
{%- endif %} {%- endif %}
...@@ -105,9 +112,9 @@ ...@@ -105,9 +112,9 @@
interface.mojom_name ~ "_" ~ method.mojom_name %} interface.mojom_name ~ "_" ~ method.mojom_name %}
this.target_.registerHandler( this.target_.registerHandler(
{{method.ordinal}}, {{method.ordinal}},
{{module.namespace}}.{{interface_message_id}}_Params.$, {{module.namespace}}.{{interface_message_id}}_ParamsSpec.$,
{%- if method.response_parameters != None %} {%- if method.response_parameters != None %}
{{module.namespace}}.{{interface_message_id}}_ResponseParams.$, {{module.namespace}}.{{interface_message_id}}_ResponseParamsSpec.$,
{%- else %} {%- else %}
null, null,
{%- endif %} {%- endif %}
...@@ -156,9 +163,10 @@ ...@@ -156,9 +163,10 @@
}; };
{#--- Enums #} {#--- Enums #}
{% from "lite/enum_definition.tmpl" import enum_def %} {% from "lite/enum_definition.tmpl" import enum_def with context %}
{%- for enum in interface.enums %} {%- 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) }} enum) }}
{%- endfor %} {%- endfor %}
...@@ -184,15 +192,18 @@ ...@@ -184,15 +192,18 @@
{% for method in interface.methods %} {% for method in interface.methods %}
{%- set interface_message_id = {%- set interface_message_id =
interface.mojom_name ~ "_" ~ method.mojom_name %} interface.mojom_name ~ "_" ~ method.mojom_name %}
/** @public {!mojo.internal.interfaceSupport.InterfaceCallbackTarget} */ /**
* @export {!mojo.internal.interfaceSupport.InterfaceCallbackTarget}
*/
this.{{method.name}} = this.{{method.name}} =
new mojo.internal.interfaceSupport.InterfaceCallbackTarget( new mojo.internal.interfaceSupport.InterfaceCallbackTarget(
this.router_); this.router_);
this.target_.registerHandler( this.target_.registerHandler(
{{method.ordinal}}, {{method.ordinal}},
{{module.namespace}}.{{interface_message_id}}_Params.$, {{module.namespace}}.{{interface_message_id}}_ParamsSpec.$,
{%- if method.response_parameters != None %} {%- if method.response_parameters != None %}
{{module.namespace}}.{{interface_message_id}}_ResponseParams.$, {{module.namespace}}.{{interface_message_id}}_ResponseParamsSpec.$,
this.{{method.name}}.createTargetHandler(true /* expectsResponse */)); this.{{method.name}}.createTargetHandler(true /* expectsResponse */));
{%- else %} {%- else %}
null, 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 #} {#--- Constants #}
{%- for constant in module.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}} } * @const { {{constant.kind|lite_closure_type_with_nullability}} }
* @export * @export
...@@ -9,9 +13,9 @@ ...@@ -9,9 +13,9 @@
{%- endfor %} {%- endfor %}
{#--- Enums #} {#--- Enums #}
{% from "lite/enum_definition.tmpl" import enum_def %} {% from "lite/enum_definition.tmpl" import enum_def with context %}
{%- for enum in enums %} {%- for enum in enums %}
{{enum_def("%s.%s"|format(module.namespace, enum.name), enum)}} {{enum_def(module.namespace, module.namespace, enum)}}
{% endfor %} {% endfor %}
{#--- Interface definitions #} {#--- Interface definitions #}
...@@ -24,19 +28,25 @@ ...@@ -24,19 +28,25 @@
# mojo.internal.Struct and mojo.internal.Union will fix-up the object # mojo.internal.Struct and mojo.internal.Union will fix-up the object
# appropriately, and we don't want Closure to complain. #} # appropriately, and we don't want Closure to complain. #}
{% for struct in structs %} {% for struct in structs %}
{% if generate_closure_exports -%}
goog.provide('{{module.namespace}}.{{struct.name}}Spec');
{%- endif %}
/** /**
* @const {!Object} * @const { {$:!mojo.internal.MojomType}}
* @export * @export
*/ */
{{module.namespace}}.{{struct.name}} = {{module.namespace}}.{{struct.name}}Spec =
{ $: /** @type {!mojo.internal.MojomType} */ ({}) }; { $: /** @type {!mojo.internal.MojomType} */ ({}) };
{% endfor %} {% endfor %}
{%- for union in unions %} {%- for union in unions %}
{% if generate_closure_exports -%}
goog.provide('{{module.namespace}}.{{union.name}}Spec');
{%- endif %}
/** /**
* @const {!Object} * @const { {$:!mojo.internal.MojomType} }
* @export * @export
*/ */
{{module.namespace}}.{{union.name}} = {{module.namespace}}.{{union.name}}Spec =
{ $: /** @type {!mojo.internal.MojomType} */ ({}) }; { $: /** @type {!mojo.internal.MojomType} */ ({}) };
{% endfor %} {% endfor %}
......
...@@ -8,11 +8,6 @@ goog.require('mojo.internal'); ...@@ -8,11 +8,6 @@ goog.require('mojo.internal');
{%- if interfaces %} {%- if interfaces %}
goog.require('mojo.internal.interfaceSupport'); goog.require('mojo.internal.interfaceSupport');
{%- endif %} {%- endif %}
{% for import in imports -%}
goog.require('{{import.namespace}}');
{% endfor %}
goog.provide('{{module.namespace}}');
{% endif %} {% endif %}
mojo.internal.exportModule('{{module.namespace}}'); mojo.internal.exportModule('{{module.namespace}}');
......
...@@ -7,13 +7,14 @@ ...@@ -7,13 +7,14 @@
{{constant.value|expression_to_text_lite}}; {{constant.value|expression_to_text_lite}};
{% endfor %} {% endfor %}
{%- from "lite/enum_definition.tmpl" import enum_def %} {%- from "lite/enum_definition.tmpl" import enum_def with context %}
{% for enum in struct.enums %} {% 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 %} {% endfor %}
mojo.internal.Struct( mojo.internal.Struct(
{{module.namespace}}.{{struct.name}}.$, {{module.namespace}}.{{struct.name}}Spec.$,
'{{struct.name}}', '{{struct.name}}',
{{struct.packed|payload_size}}, {{struct.packed|payload_size}},
[ [
...@@ -31,3 +32,21 @@ mojo.internal.Struct( ...@@ -31,3 +32,21 @@ mojo.internal.Struct(
{%- endif %} {%- endif %}
{%- endfor %} {%- 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") { ...@@ -20,6 +20,6 @@ js_type_check("closure_compile") {
js_library("test") { js_library("test") {
deps = [ deps = [
":mojo_bindings_js_externs", ":mojo_bindings_js_library_for_compile",
] ]
} }
...@@ -7,10 +7,13 @@ async function testFunction() { ...@@ -7,10 +7,13 @@ async function testFunction() {
let proxy = test.mojom.TestPageHandler.getProxy() let proxy = test.mojom.TestPageHandler.getProxy()
// Type infers {?{values: !Array<!string>}} from Promise return type. // Type infers {?{values: !Array<!string>}} from Promise return type.
let result = await proxy.method1(); let result = await proxy.method1(' ', 5);
/** @type {Array<string>} */ /** @type {Array<string>} */
let values = result.values; let values = result.values;
/** @type {test.mojom.TestStruct} */
let testStruct = result.ts
} }
/** @implements {test.mojom.TestPageInterface} */ /** @implements {test.mojom.TestPageInterface} */
......
...@@ -24,7 +24,7 @@ struct TestStruct { ...@@ -24,7 +24,7 @@ struct TestStruct {
}; };
interface TestPageHandler { interface TestPageHandler {
Method1() => (array<string> values); Method1(string p1, int32 p2) => (array<string> values, TestStruct ts);
}; };
interface TestPage { interface TestPage {
......
mojo.internal.Union( mojo.internal.Union(
{{module.namespace}}.{{union.name}}.$, '{{union.name}}', {{module.namespace}}.{{union.name}}Spec.$, '{{union.name}}',
{ {
{%- for field in union.fields %} {%- for field in union.fields %}
'{{field.name}}': { '{{field.name}}': {
...@@ -12,3 +12,12 @@ mojo.internal.Union( ...@@ -12,3 +12,12 @@ mojo.internal.Union(
}, },
{%- endfor %} {%- 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): ...@@ -341,10 +341,6 @@ class Generator(generator.Generator):
def _GenerateLiteBindingsForCompile(self): def _GenerateLiteBindingsForCompile(self):
return self._GetParameters(for_compile=True) return self._GetParameters(for_compile=True)
@UseJinja("lite/module.externs.tmpl")
def _GenerateLiteExterns(self):
return self._GetParameters()
def GenerateFiles(self, args): def GenerateFiles(self, args):
if self.variant: if self.variant:
raise Exception("Variants not supported in JavaScript bindings.") raise Exception("Variants not supported in JavaScript bindings.")
...@@ -362,8 +358,6 @@ class Generator(generator.Generator): ...@@ -362,8 +358,6 @@ class Generator(generator.Generator):
self.Write(self._GenerateLiteBindings(), "%s-lite.js" % self.module.path) self.Write(self._GenerateLiteBindings(), "%s-lite.js" % self.module.path)
self.Write(self._GenerateLiteBindingsForCompile(), self.Write(self._GenerateLiteBindingsForCompile(),
"%s-lite-for-compile.js" % self.module.path) "%s-lite-for-compile.js" % self.module.path)
self.Write(self._GenerateLiteExterns(),
"%s-lite.externs.js" % self.module.path)
def _SetUniqueNameForImports(self): def _SetUniqueNameForImports(self):
used_names = set() used_names = set()
...@@ -532,19 +526,20 @@ class Generator(generator.Generator): ...@@ -532,19 +526,20 @@ class Generator(generator.Generator):
if named_kind.module: if named_kind.module:
name.append(named_kind.module.namespace) name.append(named_kind.module.namespace)
if named_kind.parent_kind: 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.append(named_kind.name)
name = ".".join(name) name = ".".join(name)
if (mojom.IsStructKind(kind) or mojom.IsUnionKind(kind) or if (mojom.IsStructKind(kind) or mojom.IsUnionKind(kind) or
mojom.IsEnumKind(kind)): mojom.IsEnumKind(kind)):
return "%s.$" % name return "%sSpec.$" % name
if mojom.IsInterfaceKind(kind): if mojom.IsInterfaceKind(kind):
return "mojo.internal.InterfaceProxy(%sProxy)" % name return "mojo.internal.InterfaceProxy(%sProxy)" % name
if mojom.IsInterfaceRequestKind(kind): if mojom.IsInterfaceRequestKind(kind):
return "mojo.internal.InterfaceRequest(%sRequest)" % name return "mojo.internal.InterfaceRequest(%sRequest)" % name
if mojom.IsAssociatedInterfaceKind(kind): if mojom.IsAssociatedInterfaceKind(kind):
return "mojo.internal.AssociatedInterfaceProxy(%sAssociatedProxy)" % ( # TODO(rockot): Implement associated interfaces.
return "mojo.internal.AssociatedInterfaceProxy(%sProxy)" % (
name) name)
if mojom.IsAssociatedInterfaceRequestKind(kind): if mojom.IsAssociatedInterfaceRequestKind(kind):
return "mojo.internal.AssociatedInterfaceRequest(%s)" % name return "mojo.internal.AssociatedInterfaceRequest(%s)" % name
...@@ -584,7 +579,7 @@ class Generator(generator.Generator): ...@@ -584,7 +579,7 @@ class Generator(generator.Generator):
if mojom.IsStructKind(field.kind): if mojom.IsStructKind(field.kind):
assert field.default == "default" assert field.default == "default"
return "null"; return "null";
return self._ExpressionToText(field.default) return self._ExpressionToTextLite(field.default)
if field.kind in mojom.PRIMITIVES: if field.kind in mojom.PRIMITIVES:
return _kind_to_javascript_default_value[field.kind] return _kind_to_javascript_default_value[field.kind]
if mojom.IsEnumKind(field.kind): if mojom.IsEnumKind(field.kind):
......
...@@ -1219,7 +1219,6 @@ template("mojom") { ...@@ -1219,7 +1219,6 @@ template("mojom") {
"$target_gen_dir/$source.externs.js", "$target_gen_dir/$source.externs.js",
"$target_gen_dir/$source-lite.js", "$target_gen_dir/$source-lite.js",
"$target_gen_dir/$source-lite-for-compile.js", "$target_gen_dir/$source-lite-for-compile.js",
"$target_gen_dir/$source-lite.externs.js",
] ]
} }
...@@ -1293,48 +1292,30 @@ template("mojom") { ...@@ -1293,48 +1292,30 @@ template("mojom") {
} }
} }
if (enable_mojom_closure_compile) { js_library_for_compile_target_name = "${target_name}_js_library_for_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}"
if (defined(invoker.sources)) { if (defined(invoker.sources)) {
js_library(js_externs_target_name) { generator_js_lite_for_compile_outputs =
sources = [] [ "{{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" ] extra_public_deps = [ ":$generator_js_target_name" ]
externs_list = [ "${externs_path}/mojo.js" ] sources = process_file_template(invoker.sources,
externs_list += process_file_template( generator_js_lite_for_compile_outputs)
invoker.sources,
[ "{{source_gen_dir}}/{{source_file_part}}-lite.externs.js" ])
externs_list = [
"${externs_path}/mojo_core.js",
"${externs_path}/pending.js",
]
deps = [] deps = []
if (!defined(invoker.disallow_native_types)) {
deps += [ "//mojo/public/js:bindings_lite_sources" ]
}
foreach(d, all_deps) { foreach(d, all_deps) {
full_name = get_label_info(d, "label_no_toolchain") full_name = get_label_info(d, "label_no_toolchain")
deps += [ "${full_name}${js_externs_target_suffix}" ] deps += [ "${full_name}_js_library_for_compile" ]
} }
} }
} else { } else {
group(js_externs_target_name) { group(js_library_for_compile_target_name) {
} }
} }
} }
......
...@@ -26,14 +26,14 @@ js_library("button_bar") { ...@@ -26,14 +26,14 @@ js_library("button_bar") {
js_library("fake_mojo_service") { js_library("fake_mojo_service") {
deps = [ 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", "//ui/webui/resources/js:cr",
] ]
} }
js_library("mojo_api") { js_library("mojo_api") {
deps = [ 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", "//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