Commit 4443328b authored by Oliver Chang's avatar Oliver Chang Committed by Commit Bot

Mojo JS Bindings: Prevent issues with method parameter names.

- Append '_' to parameter names which are also reserved keywords in
  JavaScript. Struct field names remain unchanged as such keywords
  still work there.

- Rename "params" variable in generated Proxy.prototype.{{method.name}}
  to prevent a parameter named "params" from breaking the bindings.

Bug: 826070
Change-Id: I29046179929df18e14f63ff4d1cc3a74c1ef71e0
Reviewed-on: https://chromium-review.googlesource.com/1009347Reviewed-by: default avatarKen Rockot <rockot@chromium.org>
Commit-Queue: Oliver Chang <ochang@chromium.org>
Cr-Commit-Position: refs/heads/master@{#550420}
parent 50743d4a
......@@ -3,7 +3,7 @@
{% for method in interface.methods %}
/**
{%- for parameter in method.parameters %}
* @param { {{parameter.kind|closure_type_with_nullability}} } {{parameter.name}}
* @param { {{parameter.kind|closure_type_with_nullability}} } {{parameter.name|sanitize_identifier}}
{%- endfor -%}
{%- if method.response_parameters != None %}
* @return {Promise}
......@@ -11,7 +11,7 @@
*/
{{method.name}}(
{%- for parameter in method.parameters -%}
{{parameter.name}}{% if not loop.last %}, {% endif %}
{{parameter.name|sanitize_identifier}}{% if not loop.last %}, {% endif %}
{%- endfor -%}
) {}
{%- endfor %}
......
......@@ -33,12 +33,12 @@
{{interface.name}}Proxy.prototype.{{method.name}} = function(
{%- for parameter in method.parameters -%}
{{parameter.name}}{% if not loop.last %}, {% endif %}
{{parameter.name|sanitize_identifier}}{% if not loop.last %}, {% endif %}
{%- endfor -%}
) {
var params = new {{interface_method_id}}_Params();
var params_ = new {{interface_method_id}}_Params();
{%- for parameter in method.parameters %}
params.{{parameter.name}} = {{parameter.name}};
params_.{{parameter.name}} = {{parameter.name|sanitize_identifier}};
{%- endfor %}
{%- if method.response_parameters == None %}
......@@ -46,12 +46,12 @@
var builder = new codec.MessageV2Builder(
k{{interface_method_id}}_Name,
codec.align({{interface_method_id}}_Params.encodedSize));
builder.setPayload({{interface_method_id}}_Params, params);
builder.setPayload({{interface_method_id}}_Params, params_);
{%- else %}
var builder = new codec.MessageV0Builder(
k{{interface_method_id}}_Name,
codec.align({{interface_method_id}}_Params.encodedSize));
builder.encodeStruct({{interface_method_id}}_Params, params);
builder.encodeStruct({{interface_method_id}}_Params, params_);
{%- endif %}
var message = builder.finish();
this.receiver_.accept(message);
......@@ -62,13 +62,13 @@
k{{interface_method_id}}_Name,
codec.align({{interface_method_id}}_Params.encodedSize),
codec.kMessageExpectsResponse, 0);
builder.setPayload({{interface_method_id}}_Params, params);
builder.setPayload({{interface_method_id}}_Params, params_);
{%- else %}
var builder = new codec.MessageV1Builder(
k{{interface_method_id}}_Name,
codec.align({{interface_method_id}}_Params.encodedSize),
codec.kMessageExpectsResponse, 0);
builder.encodeStruct({{interface_method_id}}_Params, params);
builder.encodeStruct({{interface_method_id}}_Params, params_);
{%- endif %}
var message = builder.finish();
this.receiver_.acceptAndExpectResponse(message).then(function(message) {
......@@ -89,8 +89,8 @@
}
{%- for method in interface.methods %}
{{interface.name}}Stub.prototype.{{method.name}} = function({{method.parameters|map(attribute='name')|join(', ')}}) {
return this.delegate_ && this.delegate_.{{method.name}} && this.delegate_.{{method.name}}({{method.parameters|map(attribute='name')|join(', ')}});
{{interface.name}}Stub.prototype.{{method.name}} = function({{method.parameters|map(attribute='name')|map('sanitize_identifier')|join(', ')}}) {
return this.delegate_ && this.delegate_.{{method.name}} && this.delegate_.{{method.name}}({{method.parameters|map(attribute='name')|map('sanitize_identifier')|join(', ')}});
}
{%- endfor %}
......
......@@ -89,6 +89,54 @@ _kind_to_closure_type = {
mojom.NULLABLE_SHAREDBUFFER: "mojo.MojoHandle",
}
_js_reserved_keywords = [
'arguments',
'await',
'break'
'case',
'catch',
'class',
'const',
'continue',
'debugger',
'default',
'delete',
'do',
'else',
'enum',
'export',
'extends',
'finally',
'for',
'function',
'if',
'implements',
'import',
'in',
'instanceof',
'interface',
'let',
'new',
'package',
'private',
'protected',
'public',
'return',
'static',
'super',
'switch',
'this',
'throw',
'try',
'typeof',
'var',
'void',
'while',
'with',
'yield',
]
def JavaScriptPayloadSize(packed):
packed_fields = packed.packed_fields
if not packed_fields:
......@@ -204,6 +252,7 @@ class Generator(generator.Generator):
"validate_nullable_params": self._JavaScriptNullableParam,
"validate_struct_params": self._JavaScriptValidateStructParams,
"validate_union_params": self._JavaScriptValidateUnionParams,
"sanitize_identifier": self._JavaScriptSanitizeIdentifier,
}
return js_filters
......@@ -449,6 +498,12 @@ class Generator(generator.Generator):
return "%s, %s, %s, %s" % \
(nullable, keys_type, values_type, values_nullable)
def _JavaScriptSanitizeIdentifier(self, identifier):
if identifier in _js_reserved_keywords:
return identifier + '_'
return identifier
def _TranslateConstants(self, token):
if isinstance(token, (mojom.EnumValue, mojom.NamedValue)):
# Both variable and enum constants are constructed like:
......
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