| <!DOCTYPE html> |
| <script src="../resources/testharness.js"></script> |
| <script src="../resources/testharnessreport.js"></script> |
| <script src="file:///gen/layout_test_data/mojo/public/js/mojo_bindings.js"></script> |
| <script src="file:///gen/mojo/public/interfaces/bindings/tests/test_associated_interfaces.mojom.js"></script> |
| <script> |
| 'use strict'; |
| |
| 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 mojo.AssociatedBindingSet( |
| mojo.test.IntegerSender); |
| } |
| |
| IntegerSenderConnectionImpl.prototype.getSender = function( |
| integerSenderRequest) { |
| this.integerSenderBindings.addBinding(new IntegerSenderImpl(), |
| integerSenderRequest); |
| }; |
| |
| promise_test(async () => { |
| var integerSenderConnection = new mojo.test.IntegerSenderConnectionPtr(); |
| var integerSenderConnectionImpl = new IntegerSenderConnectionImpl(); |
| var integerSenderConnectionBinding = new mojo.Binding( |
| mojo.test.IntegerSenderConnection, |
| integerSenderConnectionImpl, |
| mojo.makeRequest(integerSenderConnection)); |
| |
| // AssociatedInterfaceRequest for integerSender. |
| var integerSenderPtrInfo0 = new mojo.AssociatedInterfacePtrInfo(); |
| var integerSenderRequest0 = mojo.makeRequest(integerSenderPtrInfo0); |
| var integerSender0 = new mojo.test.IntegerSenderAssociatedPtr( |
| integerSenderPtrInfo0); |
| |
| var integerSenderPtrInfo1 = new mojo.AssociatedInterfacePtrInfo(); |
| var integerSenderRequest1 = mojo.makeRequest(integerSenderPtrInfo1); |
| var integerSender1 = new mojo.test.IntegerSenderAssociatedPtr( |
| 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 mojo.test.IntegerSenderConnectionPtr(); |
| var integerSenderConnectionImpl = new IntegerSenderConnectionImpl(); |
| var integerSenderConnectionBinding = new mojo.Binding( |
| mojo.test.IntegerSenderConnection, |
| integerSenderConnectionImpl, |
| mojo.makeRequest(integerSenderConnection)); |
| |
| var integerSenders = []; |
| for (var i = 0; i < 3; i++) { |
| // AssociatedInterfaceRequest for integerSender. |
| var integerSenderPtrInfo = new mojo.AssociatedInterfacePtrInfo(); |
| var integerSenderRequest = mojo.makeRequest(integerSenderPtrInfo); |
| var integerSender = |
| new mojo.test.IntegerSenderAssociatedPtr(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({customReason, description}) { |
| assert_equals(customReason, 32); |
| assert_equals(description, 'goodbye'); |
| resolve(); |
| }); |
| integerSenders[1].ptr.resetWithReason({customReason: 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'); |
| |
| </script> |