Commit 46cdc9ad authored by wangjimmy's avatar wangjimmy Committed by Commit bot

Add associated binding set. Add associated_binding.html layout test.

BUG=695635

Review-Url: https://codereview.chromium.org/2844133003
Cr-Commit-Position: refs/heads/master@{#468288}
parent 612ac411
......@@ -3,11 +3,16 @@
// found in the LICENSE file.
define("mojo/public/js/associated_bindings", [
"mojo/public/js/bindings",
"mojo/public/js/core",
"mojo/public/js/interface_types",
"mojo/public/js/lib/interface_endpoint_client",
"mojo/public/js/lib/interface_endpoint_handle",
], function(core, types, interfaceEndpointClient, interfaceEndpointHandle) {
], function(bindings,
core,
types,
interfaceEndpointClient,
interfaceEndpointHandle) {
var InterfaceEndpointClient = interfaceEndpointClient.InterfaceEndpointClient;
......@@ -237,12 +242,23 @@ define("mojo/public/js/associated_bindings", [
return result;
};
// ---------------------------------------------------------------------------
function AssociatedBindingSet(interfaceType) {
bindings.BindingSet.call(this, interfaceType);
this.bindingType_ = AssociatedBinding;
}
AssociatedBindingSet.prototype = Object.create(bindings.BindingSet.prototype);
AssociatedBindingSet.prototype.constructor = AssociatedBindingSet;
var exports = {};
exports.AssociatedInterfacePtrInfo = types.AssociatedInterfacePtrInfo;
exports.AssociatedInterfaceRequest = types.AssociatedInterfaceRequest;
exports.makeRequest = makeRequest;
exports.AssociatedInterfacePtrController = AssociatedInterfacePtrController;
exports.AssociatedBinding = AssociatedBinding;
exports.AssociatedBindingSet = AssociatedBindingSet;
return exports;
});
......@@ -259,14 +259,15 @@ define("mojo/public/js/bindings", [
// ---------------------------------------------------------------------------
function BindingSetEntry(bindingSet, interfaceType, impl, requestOrHandle,
bindingId) {
function BindingSetEntry(bindingSet, interfaceType, bindingType, impl,
requestOrHandle, bindingId) {
this.bindingSet_ = bindingSet;
this.bindingId_ = bindingId;
this.binding_ = new Binding(interfaceType, impl, requestOrHandle);
this.binding_ = new bindingType(interfaceType, impl,
requestOrHandle);
this.binding_.setConnectionErrorHandler(function() {
this.bindingSet_.onConnectionError(bindingId);
this.binding_.setConnectionErrorHandler(function(reason) {
this.bindingSet_.onConnectionError(bindingId, reason);
}.bind(this));
}
......@@ -279,6 +280,7 @@ define("mojo/public/js/bindings", [
this.nextBindingId_ = 0;
this.bindings_ = new Map();
this.errorHandler_ = null;
this.bindingType_ = Binding;
}
BindingSet.prototype.isEmpty = function() {
......@@ -288,8 +290,8 @@ define("mojo/public/js/bindings", [
BindingSet.prototype.addBinding = function(impl, requestOrHandle) {
this.bindings_.set(
this.nextBindingId_,
new BindingSetEntry(this, this.interfaceType_, impl, requestOrHandle,
this.nextBindingId_));
new BindingSetEntry(this, this.interfaceType_, this.bindingType_, impl,
requestOrHandle, this.nextBindingId_));
++this.nextBindingId_;
};
......@@ -303,11 +305,11 @@ define("mojo/public/js/bindings", [
this.errorHandler_ = callback;
};
BindingSet.prototype.onConnectionError = function(bindingId) {
BindingSet.prototype.onConnectionError = function(bindingId, reason) {
this.bindings_.delete(bindingId);
if (this.errorHandler_)
this.errorHandler_();
this.errorHandler_(reason);
};
var exports = {};
......
<!DOCTYPE html>
<script src="../resources/testharness.js"></script>
<script src="../resources/testharnessreport.js"></script>
<script src="../resources/mojo-helpers.js"></script>
<script>
'use strict';
setup({ explicit_done: true });
define([
"mojo/public/interfaces/bindings/tests/test_associated_interfaces.mojom",
"mojo/public/js/associated_bindings",
"mojo/public/js/bindings",
], function(testAssociatedInterfaces, associatedBindings, bindings) {
function SenderImpl(callback) {
this.callback = callback;
}
SenderImpl.prototype.echo = function(value) {
return Promise.resolve({value: value});
};
SenderImpl.prototype.send = function(value) {
if (this.callback) {
this.callback(value);
}
};
var IntegerSenderImpl = SenderImpl;
function IntegerSenderConnectionImpl() {
this.integerSenderBindings = new associatedBindings.AssociatedBindingSet(
testAssociatedInterfaces.IntegerSender);
}
IntegerSenderConnectionImpl.prototype.getSender = function(
integerSenderRequest) {
this.integerSenderBindings.addBinding(new IntegerSenderImpl(),
integerSenderRequest);
};
promise_test(async () => {
var integerSenderConnection =
new testAssociatedInterfaces.IntegerSenderConnectionPtr();
var integerSenderConnectionImpl = new IntegerSenderConnectionImpl();
var integerSenderConnectionBinding = new bindings.Binding(
testAssociatedInterfaces.IntegerSenderConnection,
integerSenderConnectionImpl,
bindings.makeRequest(integerSenderConnection));
// AssociatedInterfaceRequest for integerSender.
var integerSenderPtrInfo0 =
new associatedBindings.AssociatedInterfacePtrInfo();
var integerSenderRequest0 = associatedBindings.makeRequest(
integerSenderPtrInfo0);
var integerSender0 =
new testAssociatedInterfaces.AssociatedIntegerSenderPtr(
integerSenderPtrInfo0);
var integerSenderPtrInfo1 =
new associatedBindings.AssociatedInterfacePtrInfo();
var integerSenderRequest1 = associatedBindings.makeRequest(
integerSenderPtrInfo1);
var integerSender1 =
new testAssociatedInterfaces.AssociatedIntegerSenderPtr(
integerSenderPtrInfo1);
integerSenderConnection.getSender(integerSenderRequest0);
integerSenderConnection.getSender(integerSenderRequest1);
// Master Binding close triggers connection error handler on
// interface endpoint clients for all associated endpoints.
var connectionErrorHandler0 = new Promise((resolve, reject) => {
integerSender0.ptr.setConnectionErrorHandler(() => {
resolve();
});
});
var connectionErrorHandler1 = new Promise((resolve, reject) => {
integerSender1.ptr.setConnectionErrorHandler(() => {
resolve();
});
});
setTimeout(integerSenderConnectionBinding.close.bind(
integerSenderConnectionBinding), 0);
await Promise.all([connectionErrorHandler0, connectionErrorHandler1]);
}, 'all endpoints connectionErrorHandler called on master binding close');
promise_test(async () => {
var integerSenderConnection =
new testAssociatedInterfaces.IntegerSenderConnectionPtr();
var integerSenderConnectionImpl = new IntegerSenderConnectionImpl();
var integerSenderConnectionBinding = new bindings.Binding(
testAssociatedInterfaces.IntegerSenderConnection,
integerSenderConnectionImpl,
bindings.makeRequest(integerSenderConnection));
var integerSenders = [];
for (var i = 0; i < 3; i++) {
// AssociatedInterfaceRequest for integerSender.
var integerSenderPtrInfo =
new associatedBindings.AssociatedInterfacePtrInfo();
var integerSenderRequest = associatedBindings.makeRequest(
integerSenderPtrInfo);
var integerSender =
new testAssociatedInterfaces.AssociatedIntegerSenderPtr(
integerSenderPtrInfo);
integerSenderConnection.getSender(integerSenderRequest);
// Wait for integerSenderConnection getSender message to be received by
// integerSenderConnection's binding side and all integerSender binding
// to be created.
assert_equals((await integerSender.echo(3)).value, 3);
integerSenders.push(integerSender);
}
await new Promise((resolve, reject) => {
integerSenderConnectionImpl.integerSenderBindings
.setConnectionErrorHandler(() => {resolve();});
integerSenders[0].ptr.reset();
});
await new Promise((resolve, reject) => {
integerSenderConnectionImpl.integerSenderBindings
.setConnectionErrorHandler(function({custom_reason, description}) {
assert_equals(custom_reason, 32);
assert_equals(description, 'goodbye');
resolve();
});
integerSenders[1].ptr.resetWithReason({custom_reason: 32,
description: 'goodbye'});
});
// integerSender2's binding should still exist.
assert_equals((await integerSenders[2].echo(11)).value, 11);
integerSenderConnectionImpl.integerSenderBindings.closeAllBindings();
assert_true(integerSenderConnectionImpl.integerSenderBindings.isEmpty());
}, 'associated binding set');
done();
});
</script>
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