Chromium Code Reviews| Index: chrome/browser/resources/bluetooth_internals/bluetooth_internals.js |
| diff --git a/chrome/browser/resources/bluetooth_internals/bluetooth_internals.js b/chrome/browser/resources/bluetooth_internals/bluetooth_internals.js |
| index b9af7fb9c83e1c876d8d6555e259545d87b986da..654b85c201a3b21f39e825780264823db81854b0 100644 |
| --- a/chrome/browser/resources/bluetooth_internals/bluetooth_internals.js |
| +++ b/chrome/browser/resources/bluetooth_internals/bluetooth_internals.js |
| @@ -7,27 +7,56 @@ |
| * chrome://bluetooth-internals/. |
| */ |
| -/** |
| - * The implementation of AdapterClient in |
| - * device/bluetooth/public/interfaces/adapter.mojom. |
| - */ |
| -var AdapterClient = function() {}; |
| -AdapterClient.prototype = { |
| - /** |
| - * Prints added device to console. |
| - * @param {!bluetoothDevice.DeviceInfo} device |
| - */ |
| - deviceAdded: function(device) { console.log('Device added', device); }, |
| +(function() { |
| + var adapter, adapterClient, bluetoothAdapter, bluetoothDevice, connection; |
| + |
| + // Dictionary for address->client mapping |
|
scheib
2016/10/14 07:14:51
Close with .
mbrunson
2016/10/14 18:25:25
Done.
|
| + var gattClients = {}; |
| + |
| + // Dictionary for address->device mapping |
| + var devices = {}; |
| /** |
| - * Prints removed device to console. |
| - * @param {!bluetoothDevice.DeviceInfo} device |
| - */ |
| - deviceRemoved: function(device) { console.log('Device removed', device); } |
| -}; |
| + * The implementation of AdapterClient in |
| + * device/bluetooth/public/interfaces/adapter.mojom. |
| + */ |
| + var AdapterClient = function() {}; |
| + AdapterClient.prototype = { |
| + /** |
| + * Prints added device to console. |
| + * @param {!bluetoothDevice.DeviceInfo} device |
| + */ |
| + deviceAdded: function(device) { |
| + console.log('Device added', device); |
| + setDeviceClient(device); |
| + }, |
| + |
| + /** |
| + * Prints removed device to console. |
| + * @param {!bluetoothDevice.DeviceInfo} device |
| + */ |
| + deviceRemoved: function(device) { |
| + console.log('Device removed', device); |
| + delete gattClients[device.address]; |
| + delete devices[device.address]; |
| + } |
| + }; |
| -(function() { |
| - var adapter, adapterClient, bluetoothAdapter, bluetoothDevice, connection; |
| + /** |
| + * The implementation of GattClient in |
| + * device/bluetooth/public/interfaces/device.mojom. |
| + */ |
| + var GattClient = function() {}; |
| + GattClient.prototype = { |
| + /** |
| + * Prints received advertising packet to console. |
| + * @param {!bluetoothDevice.AdvertisingPacket} advertisingPacket the |
| + * advertising packet received from the device. |
| + */ |
| + deviceChanged: function(advertisingPacket) { |
| + console.log(new Date(advertisingPacket.timestamp), advertisingPacket); |
| + } |
| + }; |
| /** |
| * TODO(crbug.com/652361): Move to shared location. |
| @@ -64,6 +93,9 @@ AdapterClient.prototype = { |
| AdapterClient.prototype.__proto__ = |
| bluetoothAdapter.AdapterClient.stubClass.prototype; |
| + GattClient.prototype.__proto__ = |
| + bluetoothDevice.GattClient.stubClass.prototype; |
| + |
| var adapterFactory = connection.bindHandleToProxy( |
| frameInterfaces.getInterface(bluetoothAdapter.AdapterFactory.name), |
| bluetoothAdapter.AdapterFactory); |
| @@ -86,25 +118,62 @@ AdapterClient.prototype = { |
| } |
| /** |
| - * Prints device info from the device service. |
| + * Logs the latest info from the device. Creates a message pipe to the device |
| + * if none exists and caches it. |
| * @param {!bluetoothDevice.DeviceInfo} deviceInfo the device for which to |
| * get the information. |
| * @return {!Promise} resolves if device service is retrieved, rejects |
| * otherwise. |
| */ |
| function logDevice(deviceInfo) { |
| + return getDevice(deviceInfo).then(function(device) { |
| + return device.getInfo(); |
| + }).then(function(response) { |
| + console.log(response.info.name_for_display, response.info); |
| + }); |
| + } |
| + |
| + /** |
| + * Creates a logging client to the device with the given |deviceInfo|. |
| + * @param {!bluetoothDevice.DeviceInfo} deviceInfo the device for which to |
| + * get the information. |
| + * @return {!Promise} resolves if device service is retrieved, rejects |
| + * otherwise. |
| + */ |
| + function setDeviceClient(deviceInfo) { |
| + return getDevice(deviceInfo).then(function(device) { |
| + var gattClient = new GattClient(); |
| + device.setClient(connection.bindStubDerivedImpl(gattClient)); |
| + gattClients[deviceInfo.address] = gattClient; |
| + return Promise.resolve(); |
| + }); |
| + } |
| + |
| + /** |
| + * Gets a message pipe for the device. If none exists, a message pipe is |
| + * created and cached. |
| + * @param {!bluetoothDevice.DeviceInfo} deviceInfo the device for which to |
| + * get the information. |
| + * @return {!Promise<bluetoothDevice.Device>} resolves with Device if |
| + * message pipe was created successfully, reject otherwise. |
| + */ |
| + function getDevice(deviceInfo) { |
| + if (devices[deviceInfo.address]) { |
| + return Promise.resolve(devices[deviceInfo.address]); |
| + } |
| + |
| return adapter.getDevice(deviceInfo.address).then(function(response) { |
| - var deviceHandle = response.device; |
| - if (!deviceHandle) { |
| - throw new Error(deviceInfo.name_for_display + ' cannot be found.'); |
| - } |
| + var deviceHandle = response.device; |
| + if (!deviceHandle) { |
| + throw new Error(deviceInfo.name_for_display + ' cannot be found.'); |
| + } |
| - var device = connection.bindHandleToProxy( |
| + var device = connection.bindHandleToProxy( |
| deviceHandle, bluetoothDevice.Device); |
| - return device.getInfo(); |
| - }).then(function(response) { |
| - console.log(deviceInfo.name_for_display, response.info); |
| - }); |
| + |
| + devices[deviceInfo.address] = device; |
| + return device; |
| + }); |
| } |
| document.addEventListener('DOMContentLoaded', function() { |
| @@ -113,10 +182,11 @@ AdapterClient.prototype = { |
| .then(function(response) { console.log('adapter', response.info); }) |
| .then(function() { return adapter.getDevices(); }) |
| .then(function(response) { |
| - var devices = response.devices; |
| - console.log('devices', devices.length); |
| + var deviceInfos = response.devices; |
| + console.log('devices', deviceInfos.length); |
| - return Promise.all(devices.map(logDevice)); |
| + return Promise.all([...deviceInfos.map(logDevice), |
| + ...deviceInfos.map(setDeviceClient)]); |
| }) |
| .catch(function(error) { console.error(error); }); |
| }); |