Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(833)

Unified Diff: third_party/WebKit/LayoutTests/usb/resources/webusb-test.js

Issue 2816663002: Ensure tests don't depend on fake devices being added synchronously (Closed)
Patch Set: Define FakeUSBDevice class only once Created 3 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: third_party/WebKit/LayoutTests/usb/resources/webusb-test.js
diff --git a/third_party/WebKit/LayoutTests/usb/resources/webusb-test.js b/third_party/WebKit/LayoutTests/usb/resources/webusb-test.js
index 44d9aecec0550bade238313dd512805a4061117e..bec6876bb29b47333c2c84084cc9f002c8f40b08 100644
--- a/third_party/WebKit/LayoutTests/usb/resources/webusb-test.js
+++ b/third_party/WebKit/LayoutTests/usb/resources/webusb-test.js
@@ -8,16 +8,19 @@
//
// interface USBTest {
// attribute EventHandler ondeviceclose;
-// attribute DOMString? chosenDevice;
+// attribute FakeUSBDevice? chosenDevice;
// attribute FrozenArray<USBDeviceFilter>? lastFilters;
//
// Promise<void> initialize();
// Promise<void> attachToWindow(Window window);
-// DOMString addFakeDevice(FakeUSBDeviceInit deviceInit);
-// void removeFakeDevice(DOMString);
+// FakeUSBDevice addFakeDevice(FakeUSBDeviceInit deviceInit);
// void reset();
// };
//
+// interface FakeUSBDevice {
+// void disconnect();
+// };
+//
// dictionary FakeUSBDeviceInit {
// octet usbVersionMajor;
// octet usbVersionMinor;
@@ -76,6 +79,7 @@ let g_initializePromise = null;
let g_chooserService = null;
let g_deviceManager = null;
let g_closeListener = null;
+let g_nextGuid = 0;
function fakeDeviceInitToDeviceInfo(guid, init) {
let deviceInfo = {
@@ -347,33 +351,40 @@ class FakeDeviceManager {
this.bindingSet_ =
new mojo.bindings.BindingSet(mojo.deviceManager.DeviceManager);
this.devices_ = new Map();
+ this.devicesByGuid_ = new Map();
this.client_ = null;
+ this.nextGuid_ = 0;
}
addBinding(handle) {
this.bindingSet_.addBinding(this, handle);
}
- addDevice(info) {
+ addDevice(fakeDevice, info) {
let device = {
- guid: this.nextGuid_++ + "",
+ fakeDevice: fakeDevice,
+ guid: (this.nextGuid_++).toString(),
info: info,
bindingArray: []
};
- this.devices_.set(device.guid, device);
+ this.devices_.set(fakeDevice, device);
+ this.devicesByGuid_.set(device.guid, device);
if (this.client_)
this.client_.onDeviceAdded(fakeDeviceInitToDeviceInfo(device.guid, info));
- return device.guid;
}
- removeDevice(guid) {
- let device = this.devices_.get(guid);
+ removeDevice(fakeDevice) {
+ let device = this.devices_.get(fakeDevice);
+ if (!device)
+ throw new Error('Cannot remove unknown device.');
+
for (var binding of device.bindingArray)
binding.close();
- this.devices_.delete(guid);
+ this.devices_.delete(device.fakeDevice);
+ this.devicesByGuid_.delete(device.guid);
if (this.client_) {
this.client_.onDeviceRemoved(
- fakeDeviceInitToDeviceInfo(guid, device.info));
+ fakeDeviceInitToDeviceInfo(device.guid, device.info));
}
}
@@ -385,6 +396,7 @@ class FakeDeviceManager {
fakeDeviceInitToDeviceInfo(device.guid, device.info));
});
this.devices_.clear();
+ this.devicesByGuid_.clear();
}
getDevices(options) {
@@ -396,13 +408,13 @@ class FakeDeviceManager {
}
getDevice(guid, request) {
- let device = this.devices_.get(guid);
+ let device = this.devicesByGuid_.get(guid);
if (device) {
let binding = new mojo.bindings.Binding(
mojo.device.Device, new FakeDevice(device.info), request);
binding.setConnectionErrorHandler(() => {
if (g_closeListener)
- g_closeListener(guid);
+ g_closeListener(device.fakeDevice);
});
device.bindingArray.push(binding);
} else {
@@ -427,13 +439,13 @@ class FakeChooserService {
this.bindingSet_.addBinding(this, handle);
}
- setChosenDevice(guid) {
- this.chosenDeviceGuid_ = guid;
+ setChosenDevice(fakeDevice) {
+ this.chosenDevice_ = fakeDevice;
}
getPermission(deviceFilters) {
this.lastFilters_ = convertMojoDeviceFilters(deviceFilters);
- let device = g_deviceManager.devices_.get(this.chosenDeviceGuid_);
+ let device = g_deviceManager.devices_.get(this.chosenDevice_);
if (device) {
return Promise.resolve({
result: fakeDeviceInitToDeviceInfo(device.guid, device.info)
@@ -444,6 +456,13 @@ class FakeChooserService {
}
}
+// Unlike FakeDevice this class is exported to callers of USBTest.addFakeDevice.
+class FakeUSBDevice {
+ disconnect() {
+ setTimeout(() => g_deviceManager.removeDevice(this), 0);
+ }
+}
+
class USBTest {
constructor() {}
@@ -522,25 +541,23 @@ class USBTest {
if (!g_deviceManager)
throw new Error('Call initialize() before addFakeDevice().');
- return g_deviceManager.addDevice(deviceInit);
- }
-
- removeFakeDevice(guid) {
- if (!g_deviceManager)
- throw new Error('Call initialize() before removeFakeDevice().');
-
- return g_deviceManager.removeDevice(guid);
+ // |addDevice| and |removeDevice| are called in a setTimeout callback so
+ // that tests do not rely on the device being immediately available which
+ // may not be true for all implementations of this test API.
+ let fakeDevice = new FakeUSBDevice();
+ setTimeout(() => g_deviceManager.addDevice(fakeDevice, deviceInit), 0);
+ return fakeDevice;
}
set ondeviceclose(func) {
g_closeListener = func;
}
- set chosenDevice(guid) {
+ set chosenDevice(fakeDevice) {
if (!g_chooserService)
throw new Error('Call initialize() before setting chosenDevice.');
- g_chooserService.setChosenDevice(guid);
+ g_chooserService.setChosenDevice(fakeDevice);
}
get lastFilters() {
« no previous file with comments | « third_party/WebKit/LayoutTests/usb/resources/usb-helpers.js ('k') | third_party/WebKit/LayoutTests/usb/usb.html » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698