mirror of
https://github.com/electron/electron.git
synced 2026-04-10 03:01:51 -04:00
fix: crash on navigator.serial.getPorts() (#34328)
(cherry picked from commit7f9431764f) (cherry picked from commit1b5738e308)
This commit is contained in:
committed by
GitHub
parent
d585bf3250
commit
9bb03e9e03
@@ -333,22 +333,32 @@ bool ElectronPermissionManager::CheckDevicePermission(
|
||||
static_cast<content::PermissionType>(
|
||||
WebContentsPermissionHelper::PermissionType::SERIAL)) {
|
||||
#if defined(OS_WIN)
|
||||
if (device->FindStringKey(kDeviceInstanceIdKey) ==
|
||||
granted_device.FindStringKey(kDeviceInstanceIdKey))
|
||||
const auto* instance_id = device->FindStringKey(kDeviceInstanceIdKey);
|
||||
const auto* port_instance_id =
|
||||
granted_device.FindStringKey(kDeviceInstanceIdKey);
|
||||
if (instance_id && port_instance_id &&
|
||||
*instance_id == *port_instance_id)
|
||||
return true;
|
||||
#else
|
||||
const auto* serial_number =
|
||||
granted_device.FindStringKey(kSerialNumberKey);
|
||||
const auto* port_serial_number =
|
||||
device->FindStringKey(kSerialNumberKey);
|
||||
if (device->FindIntKey(kVendorIdKey) !=
|
||||
granted_device.FindIntKey(kVendorIdKey) ||
|
||||
device->FindIntKey(kProductIdKey) !=
|
||||
granted_device.FindIntKey(kProductIdKey) ||
|
||||
*device->FindStringKey(kSerialNumberKey) !=
|
||||
*granted_device.FindStringKey(kSerialNumberKey)) {
|
||||
(serial_number && port_serial_number &&
|
||||
*port_serial_number != *serial_number)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
#if defined(OS_MAC)
|
||||
if (*device->FindStringKey(kUsbDriverKey) !=
|
||||
*granted_device.FindStringKey(kUsbDriverKey)) {
|
||||
const auto* usb_driver_key = device->FindStringKey(kUsbDriverKey);
|
||||
const auto* port_usb_driver_key =
|
||||
granted_device.FindStringKey(kUsbDriverKey);
|
||||
if (usb_driver_key && port_usb_driver_key &&
|
||||
*usb_driver_key != *port_usb_driver_key) {
|
||||
continue;
|
||||
}
|
||||
#endif // defined(OS_MAC)
|
||||
|
||||
@@ -1723,11 +1723,39 @@ describe('navigator.serial', () => {
|
||||
});
|
||||
|
||||
it('returns a port when select-serial-port event is defined', async () => {
|
||||
let havePorts = false;
|
||||
w.webContents.session.on('select-serial-port', (event, portList, webContents, callback) => {
|
||||
callback(portList[0].portId);
|
||||
if (portList.length > 0) {
|
||||
havePorts = true;
|
||||
callback(portList[0].portId);
|
||||
} else {
|
||||
callback('');
|
||||
}
|
||||
});
|
||||
const port = await getPorts();
|
||||
expect(port).to.equal('[object SerialPort]');
|
||||
if (havePorts) {
|
||||
expect(port).to.equal('[object SerialPort]');
|
||||
} else {
|
||||
expect(port).to.equal('NotFoundError: No port selected by the user.');
|
||||
}
|
||||
});
|
||||
|
||||
it('navigator.serial.getPorts() returns values', async () => {
|
||||
let havePorts = false;
|
||||
|
||||
w.webContents.session.on('select-serial-port', (event, portList, webContents, callback) => {
|
||||
if (portList.length > 0) {
|
||||
havePorts = true;
|
||||
callback(portList[0].portId);
|
||||
} else {
|
||||
callback('');
|
||||
}
|
||||
});
|
||||
await getPorts();
|
||||
if (havePorts) {
|
||||
const grantedPorts = await w.webContents.executeJavaScript('navigator.serial.getPorts()');
|
||||
expect(grantedPorts).to.not.be.empty();
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
|
||||
Reference in New Issue
Block a user