"mojo/public/js/bindings/validator",
], function(codec, connector, validator) {
- function Router(handle) {
- this.connector_ = new connector.Connector(handle);
+ function Router(handle, connectorFactory) {
+ if (connectorFactory === undefined)
+ connectorFactory = connector.Connector;
+ this.connector_ = new connectorFactory(handle);
this.incomingReceiver_ = null;
this.nextRequestID_ = 0;
this.responders_ = {};
+ this.payloadValidators_ = [];
this.connector_.setIncomingReceiver({
accept: this.handleIncomingMessage_.bind(this),
this.incomingReceiver_ = receiver;
};
+ Router.prototype.setPayloadValidators = function(payloadValidators) {
+ this.payloadValidators_ = payloadValidators;
+ };
+
Router.prototype.encounteredError = function() {
return this.connector_.encounteredError();
};
Router.prototype.handleIncomingMessage_ = function(message) {
- var v = new validator.Validator(message);
- if (v.validateMessage() !== validator.validationError.NONE)
- this.close();
+ var noError = validator.validationError.NONE;
+ var messageValidator = new validator.Validator(message);
+ var err = messageValidator.validateMessageHeader();
+ for (var i = 0; err === noError && i < this.payloadValidators_.length; ++i)
+ err = this.payloadValidators_[i](messageValidator);
+
+ if (err == noError)
+ this.handleValidIncomingMessage_(message);
+ else
+ this.handleInvalidIncomingMessage_(message, err);
+ };
+ Router.prototype.handleValidIncomingMessage_ = function(message) {
if (message.expectsResponse()) {
if (this.incomingReceiver_) {
this.incomingReceiver_.acceptWithResponder(message, this);
if (this.incomingReceiver_)
this.incomingReceiver_.accept(message);
}
- };
+ }
+
+ Router.prototype.handleInvalidIncomingMessage_ = function(message, error) {
+ this.close();
+ }
Router.prototype.handleConnectionError_ = function(result) {
for (var each in this.responders_)
this.close();
};
+ // The TestRouter subclass is only intended to be used in unit tests.
+ // It defeats valid message handling and delgates invalid message handling.
+
+ function TestRouter(handle, connectorFactory) {
+ Router.call(this, handle, connectorFactory);
+ }
+
+ TestRouter.prototype = Object.create(Router.prototype);
+
+ TestRouter.prototype.handleValidIncomingMessage_ = function() {
+ };
+
+ TestRouter.prototype.handleInvalidIncomingMessage_ =
+ function(message, error) {
+ this.validationErrorHandler(error);
+ };
+
var exports = {};
exports.Router = Router;
+ exports.TestRouter = TestRouter;
return exports;
});