From 44b5c72f671c877d4aac83e5913c142ac42a8082 Mon Sep 17 00:00:00 2001 From: John Kleinschmidt Date: Mon, 23 May 2022 13:21:05 -0400 Subject: [PATCH] fix: crash on navigator.serial.getPorts() (#34323) (cherry picked from commit 7f9431764fb39e10fa9c67db0e2af1422f8e44de) --- shell/browser/electron_permission_manager.cc | 22 +++++++++---- spec-main/chromium-spec.ts | 33 ++++++++++++++++++-- 2 files changed, 46 insertions(+), 9 deletions(-) diff --git a/shell/browser/electron_permission_manager.cc b/shell/browser/electron_permission_manager.cc index ad3ae6229fe0f..6cac4ba683383 100644 --- a/shell/browser/electron_permission_manager.cc +++ b/shell/browser/electron_permission_manager.cc @@ -335,22 +335,32 @@ bool ElectronPermissionManager::CheckDevicePermission( static_cast( WebContentsPermissionHelper::PermissionType::SERIAL)) { #if BUILDFLAG(IS_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 BUILDFLAG(IS_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 // BUILDFLAG(IS_MAC) diff --git a/spec-main/chromium-spec.ts b/spec-main/chromium-spec.ts index 78a67894007c6..e799d6dc98d8b 100644 --- a/spec-main/chromium-spec.ts +++ b/spec-main/chromium-spec.ts @@ -1679,11 +1679,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(); + } }); }); @@ -2006,7 +2034,6 @@ describe('navigator.hid', () => { if (details.deviceList.length > 0) { details.deviceList.find((device) => { if (device.name && device.name !== '' && device.serialNumber && device.serialNumber !== '') { - console.log('device is: ', device); if (checkForExcludedDevice) { const compareDevice = { vendorId: device.vendorId,