diff options
Diffstat (limited to 'mojo/public/js/new_bindings/lib/control_message_handler.js')
-rw-r--r-- | mojo/public/js/new_bindings/lib/control_message_handler.js | 111 |
1 files changed, 111 insertions, 0 deletions
diff --git a/mojo/public/js/new_bindings/lib/control_message_handler.js b/mojo/public/js/new_bindings/lib/control_message_handler.js new file mode 100644 index 0000000..81d9002 --- /dev/null +++ b/mojo/public/js/new_bindings/lib/control_message_handler.js @@ -0,0 +1,111 @@ +// 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. + +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 validateControlRequestWithResponse(message) { + var messageValidator = new Validator(message); + var error = messageValidator.validateMessageIsRequestExpectingResponse(); + if (error !== validator.validationError.NONE) { + throw error; + } + + if (message.getName() != controlMessages.kRunMessageId) { + throw new Error("Control message name is not kRunMessageId"); + } + + // Validate payload. + error = controlMessages.RunMessageParams.validate(messageValidator, + message.getHeaderNumBytes()); + if (error != validator.validationError.NONE) { + throw error; + } + } + + function validateControlRequestWithoutResponse(message) { + var messageValidator = new Validator(message); + var error = messageValidator.validateMessageIsRequestWithoutResponse(); + if (error != validator.validationError.NONE) { + throw error; + } + + if (message.getName() != controlMessages.kRunOrClosePipeMessageId) { + throw new Error("Control message name is not kRunOrClosePipeMessageId"); + } + + // Validate payload. + error = controlMessages.RunOrClosePipeMessageParams.validate( + messageValidator, message.getHeaderNumBytes()); + if (error != validator.validationError.NONE) { + throw error; + } + } + + function runOrClosePipe(message, interface_version) { + var reader = new codec.MessageReader(message); + var runOrClosePipeMessageParams = reader.decodeStruct( + controlMessages.RunOrClosePipeMessageParams); + return interface_version >= + runOrClosePipeMessageParams.input.require_version.version; + } + + function run(message, responder, interface_version) { + var reader = new codec.MessageReader(message); + var runMessageParams = + reader.decodeStruct(controlMessages.RunMessageParams); + var runOutput = null; + + if (runMessageParams.input.query_version) { + runOutput = new controlMessages.RunOutput(); + runOutput.query_version_result = new + controlMessages.QueryVersionResult({'version': interface_version}); + } + + var runResponseMessageParams = new + controlMessages.RunResponseMessageParams(); + runResponseMessageParams.output = runOutput; + + var messageName = controlMessages.kRunMessageId; + var payloadSize = controlMessages.RunResponseMessageParams.encodedSize; + var requestID = reader.requestID; + var builder = new codec.MessageWithRequestIDBuilder(messageName, + payloadSize, codec.kMessageIsResponse, requestID); + builder.encodeStruct(controlMessages.RunResponseMessageParams, + runResponseMessageParams); + responder.accept(builder.finish()); + return true; + } + + function isControlMessage(message) { + return message.getName() == controlMessages.kRunMessageId || + message.getName() == controlMessages.kRunOrClosePipeMessageId; + } + + function ControlMessageHandler(interface_version) { + this.interface_version = interface_version; + } + + ControlMessageHandler.prototype.accept = function(message) { + validateControlRequestWithoutResponse(message); + return runOrClosePipe(message, this.interface_version); + }; + + ControlMessageHandler.prototype.acceptWithResponder = function(message, + responder) { + validateControlRequestWithResponse(message); + return run(message, responder, this.interface_version); + }; + + var exports = {}; + exports.ControlMessageHandler = ControlMessageHandler; + exports.isControlMessage = isControlMessage; + + return exports; +}); |