{%- for method in interface.methods %} {%- set interface_method_id = interface.mojom_name ~ "_" ~ method.mojom_name %} var k{{interface_method_id}}_Name = {{method.ordinal}}; {%- endfor %} function {{interface.name}}Ptr(handleOrPtrInfo) { this.ptr = new bindings.InterfacePtrController({{interface.name}}, handleOrPtrInfo); } function {{interface.name}}AssociatedPtr(associatedInterfacePtrInfo) { this.ptr = new associatedBindings.AssociatedInterfacePtrController( {{interface.name}}, associatedInterfacePtrInfo); } {{interface.name}}AssociatedPtr.prototype = Object.create({{interface.name}}Ptr.prototype); {{interface.name}}AssociatedPtr.prototype.constructor = {{interface.name}}AssociatedPtr; function {{interface.name}}Proxy(receiver) { this.receiver_ = receiver; } {%- for method in interface.methods %} {%- set interface_method_id = interface.mojom_name ~ "_" ~ method.mojom_name %} {{interface.name}}Ptr.prototype.{{method.name}} = function() { return {{interface.name}}Proxy.prototype.{{method.name}} .apply(this.ptr.getProxy(), arguments); }; {{interface.name}}Proxy.prototype.{{method.name}} = function( {%- for parameter in method.parameters -%} {{parameter.name|sanitize_identifier}}{% if not loop.last %}, {% endif %} {%- endfor -%} ) { var params_ = new {{interface_method_id}}_Params(); {%- for parameter in method.parameters %} params_.{{parameter.name}} = {{parameter.name|sanitize_identifier}}; {%- endfor %} {%- if method.response_parameters == None %} {%- if method|method_passes_associated_kinds %} var builder = new codec.MessageV2Builder( k{{interface_method_id}}_Name, codec.align({{interface_method_id}}_Params.encodedSize)); 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_); {%- endif %} var message = builder.finish(); this.receiver_.accept(message); {%- else %} return new Promise(function(resolve, reject) { {%- if method|method_passes_associated_kinds %} var builder = new codec.MessageV2Builder( k{{interface_method_id}}_Name, codec.align({{interface_method_id}}_Params.encodedSize), codec.kMessageExpectsResponse, 0); 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_); {%- endif %} var message = builder.finish(); this.receiver_.acceptAndExpectResponse(message).then(function(message) { var reader = new codec.MessageReader(message); var responseParams = reader.decodeStruct({{interface_method_id}}_ResponseParams); resolve(responseParams); }).catch(function(result) { reject(Error("Connection error: " + result)); }); }.bind(this)); {%- endif %} }; {%- endfor %} function {{interface.name}}Stub(delegate) { this.delegate_ = delegate; } {%- for method in interface.methods %} {{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 %} {{interface.name}}Stub.prototype.accept = function(message) { var reader = new codec.MessageReader(message); switch (reader.messageName) { {%- for method in interface.methods %} {%- set interface_method_id = interface.mojom_name ~ "_" ~ method.mojom_name %} {%- if method.response_parameters == None %} case k{{interface_method_id}}_Name: var params = reader.decodeStruct({{interface_method_id}}_Params); this.{{method.name}}( {%- for parameter in method.parameters -%} params.{{parameter.name}}{% if not loop.last %}, {% endif %} {%- endfor %}); return true; {%- endif %} {%- endfor %} default: return false; } }; {{interface.name}}Stub.prototype.acceptWithResponder = function(message, responder) { var reader = new codec.MessageReader(message); switch (reader.messageName) { {%- for method in interface.methods %} {%- set interface_method_id = interface.mojom_name ~ "_" ~ method.mojom_name %} {%- if method.response_parameters != None %} case k{{interface_method_id}}_Name: var params = reader.decodeStruct({{interface_method_id}}_Params); this.{{method.name}}( {%- for parameter in method.parameters -%} params.{{parameter.name}}{% if not loop.last %}, {% endif -%} {%- endfor %}).then(function(response) { var responseParams = new {{interface_method_id}}_ResponseParams(); {%- for parameter in method.response_parameters %} responseParams.{{parameter.name}} = response.{{parameter.name}}; {%- endfor %} {%- if method|method_passes_associated_kinds %} var builder = new codec.MessageV2Builder( k{{interface_method_id}}_Name, codec.align({{interface_method_id}}_ResponseParams .encodedSize), codec.kMessageIsResponse, reader.requestID); builder.setPayload({{interface_method_id}}_ResponseParams, responseParams); {%- else %} var builder = new codec.MessageV1Builder( k{{interface_method_id}}_Name, codec.align({{interface_method_id}}_ResponseParams.encodedSize), codec.kMessageIsResponse, reader.requestID); builder.encodeStruct({{interface_method_id}}_ResponseParams, responseParams); {%- endif %} var message = builder.finish(); responder.accept(message); }); return true; {%- endif %} {%- endfor %} default: return false; } }; {#--- Validation #} function validate{{interface.name}}Request(messageValidator) { {%- if not(interface.methods) %} return validator.validationError.NONE; {%- else %} var message = messageValidator.message; var paramsClass = null; switch (message.getName()) { {%- for method in interface.methods %} {%- set interface_method_id = interface.mojom_name ~ "_" ~ method.mojom_name %} case k{{interface_method_id}}_Name: {%- if method.response_parameters == None %} if (!message.expectsResponse() && !message.isResponse()) paramsClass = {{interface_method_id}}_Params; {%- else %} if (message.expectsResponse()) paramsClass = {{interface_method_id}}_Params; {%- endif %} break; {%- endfor %} } if (paramsClass === null) return validator.validationError.NONE; return paramsClass.validate(messageValidator, messageValidator.message.getHeaderNumBytes()); {%- endif %} } function validate{{interface.name}}Response(messageValidator) { {%- if not(interface|has_callbacks) %} return validator.validationError.NONE; {%- else %} var message = messageValidator.message; var paramsClass = null; switch (message.getName()) { {%- for method in interface.methods %} {%- set interface_method_id = interface.mojom_name ~ "_" ~ method.mojom_name %} {%- if method.response_parameters != None %} case k{{interface_method_id}}_Name: if (message.isResponse()) paramsClass = {{interface_method_id}}_ResponseParams; break; {%- endif %} {%- endfor %} } if (paramsClass === null) return validator.validationError.NONE; return paramsClass.validate(messageValidator, messageValidator.message.getHeaderNumBytes()); {%- endif %} } var {{interface.name}} = { name: '{{module.mojom_namespace}}.{{interface.mojom_name}}', kVersion: {{interface.version}}, ptrClass: {{interface.name}}Ptr, proxyClass: {{interface.name}}Proxy, stubClass: {{interface.name}}Stub, validateRequest: validate{{interface.name}}Request, {%- if interface|has_callbacks %} validateResponse: validate{{interface.name}}Response, {%- else %} validateResponse: null, {%- endif %} {%- if generate_fuzzing %} mojomId: '{{module.path}}', fuzzMethods: { {%- for method in interface.methods %} {%- set interface_method_id = interface.mojom_name ~ "_" ~ method.mojom_name %} {{ method.name }}: { params: {{interface_method_id}}_Params, }, {%- endfor %} }, {%- endif %} }; {#--- Interface Constants #} {%- for constant in interface.constants %} {{interface.name}}.{{constant.name}} = {{constant.value|expression_to_text}}, {%- endfor %} {#--- Interface Enums #} {%- from "enum_definition.tmpl" import enum_def -%} {%- for enum in interface.enums %} {{ enum_def("%s.%s"|format(interface.name, enum.name), enum) }} {%- endfor %} {{interface.name}}Stub.prototype.validator = validate{{interface.name}}Request; {%- if interface|has_callbacks %} {{interface.name}}Proxy.prototype.validator = validate{{interface.name}}Response; {%- else %} {{interface.name}}Proxy.prototype.validator = null; {%- endif %}