Commit fdbcb258 authored by Reilly Grant's avatar Reilly Grant Committed by Commit Bot

serial: Add option to switch enumeration methods

A potential solution for issue 1119497 is to switch from enumerating
devices implementing GUID_DEVINTERFACE_COMPORT to using the "bus
enumerator" identified by GUID_DEVINTERFACE_SERENUM_BUS_ENUMERATOR.

I'm putting this behind a flag so that developers can try it out in
canary-channel. If it works I can enable it by default and keep the flag
around for a couple releases in case it causes other problems.

Bug: 1119497
Change-Id: Icad9008799ed331c3da15e5a70e0184144c47a58
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2417460
Commit-Queue: Ovidio de Jesús Ruiz-Henríquez <odejesush@chromium.org>
Reviewed-by: default avatarOvidio de Jesús Ruiz-Henríquez <odejesush@chromium.org>
Auto-Submit: Reilly Grant <reillyg@chromium.org>
Cr-Commit-Position: refs/heads/master@{#808368}
parent c6979306
......@@ -6433,6 +6433,13 @@ const FeatureEntry kFeatureEntries[] = {
FEATURE_VALUE_TYPE(printing::features::kEnableOopPrintDrivers)},
#endif
#if defined(OS_WIN)
{"use-serial-bus-enumerator",
flag_descriptions::kUseSerialBusEnumeratorName,
flag_descriptions::kUseSerialBusEnumeratorDescription, kOsWin,
FEATURE_VALUE_TYPE(features::kUseSerialBusEnumerator)},
#endif
// NOTE: Adding a new flag requires adding a corresponding entry to enum
// "LoginCustomFlags" in tools/metrics/histograms/enums.xml. See "Flag
// Histograms" in tools/metrics/histograms/README.md (run the
......
......@@ -4545,6 +4545,11 @@
"owners": [ "khorimoto", "zentaro" ],
"expiry_milestone": 85
},
{
"name": "use-serial-bus-enumerator",
"owners": [ "reillyg" ],
"expiry_milestone": 89
},
{
"name": "use-sync-sandbox",
"owners": [ "//components/sync/OWNERS" ],
......
......@@ -3452,6 +3452,11 @@ const char kUseAngleD3D11[] = "D3D11";
const char kUseAngleD3D9[] = "D3D9";
const char kUseAngleD3D11on12[] = "D3D11on12";
const char kUseSerialBusEnumeratorName[] = "Use system serial port enumerator";
const char kUseSerialBusEnumeratorDescription[] =
"Use the system-supplied enumerator for serial port devices instead of "
"enumerating devices implementing the COM port interface.";
const char kUseWinrtMidiApiName[] = "Use Windows Runtime MIDI API";
const char kUseWinrtMidiApiDescription[] =
"Use Windows Runtime MIDI API for WebMIDI (effective only on Windows 10 or "
......
......@@ -1975,6 +1975,9 @@ extern const char kUseAngleD3D11[];
extern const char kUseAngleD3D9[];
extern const char kUseAngleD3D11on12[];
extern const char kUseSerialBusEnumeratorName[];
extern const char kUseSerialBusEnumeratorDescription[];
extern const char kUseWinrtMidiApiName[];
extern const char kUseWinrtMidiApiDescription[];
......
......@@ -23,4 +23,12 @@ const base::Feature kWinrtGeolocationImplementation{
const base::Feature kMacCoreLocationImplementation{
"kMacCoreLocationImplementation", base::FEATURE_ENABLED_BY_DEFAULT};
#if defined(OS_WIN)
// Switches from enumerating serial ports using GUID_DEVINTERFACE_SERIALPORT to
// GUID_DEVINTERFACE_SERENUM_BUS_ENUMERATOR. This is an experimental solution to
// https://crbug.com/1119497.
const base::Feature kUseSerialBusEnumerator{"UseSerialBusEnumerator",
base::FEATURE_DISABLED_BY_DEFAULT};
#endif // defined(OS_WIN)
} // namespace features
......@@ -9,6 +9,7 @@
#define SERVICES_DEVICE_PUBLIC_CPP_DEVICE_FEATURES_H_
#include "base/feature_list.h"
#include "build/build_config.h"
#include "services/device/public/cpp/device_features_export.h"
namespace features {
......@@ -22,6 +23,10 @@ DEVICE_FEATURES_EXPORT extern const base::Feature
DEVICE_FEATURES_EXPORT extern const base::Feature
kMacCoreLocationImplementation;
#if defined(OS_WIN)
DEVICE_FEATURES_EXPORT extern const base::Feature kUseSerialBusEnumerator;
#endif // defined(OS_WIN)
} // namespace features
#endif // SERVICES_DEVICE_PUBLIC_CPP_DEVICE_FEATURES_H_
......@@ -55,6 +55,7 @@ if (is_win || ((is_linux || is_chromeos) && use_udev) || is_mac) {
"//device/bluetooth/public/cpp",
"//mojo/public/cpp/bindings",
"//net",
"//services/device/public/cpp:device_features",
"//services/device/public/cpp/bluetooth:bluetooth",
"//services/device/public/cpp/serial:switches",
]
......
......@@ -19,6 +19,7 @@
#include <string>
#include <utility>
#include "base/feature_list.h"
#include "base/metrics/histogram_functions.h"
#include "base/numerics/ranges.h"
#include "base/scoped_generic.h"
......@@ -30,6 +31,7 @@
#include "base/threading/scoped_blocking_call.h"
#include "base/win/registry.h"
#include "base/win/scoped_devinfo.h"
#include "services/device/public/cpp/device_features.h"
#include "third_party/re2/src/re2/re2.h"
namespace device {
......@@ -110,6 +112,13 @@ bool GetProductID(const std::string& instance_id, uint32_t* product_id) {
base::HexStringToUInt(product_id_str, product_id);
}
const GUID& GetDeviceInterfaceGuid() {
if (base::FeatureList::IsEnabled(features::kUseSerialBusEnumerator))
return GUID_DEVINTERFACE_SERENUM_BUS_ENUMERATOR;
return GUID_DEVINTERFACE_COMPORT;
}
} // namespace
class SerialDeviceEnumeratorWin::UiThreadHelper
......@@ -131,7 +140,7 @@ class SerialDeviceEnumeratorWin::UiThreadHelper
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
enumerator_ = std::move(enumerator);
device_observer_.Add(
DeviceMonitorWin::GetForDeviceInterface(GUID_DEVINTERFACE_COMPORT));
DeviceMonitorWin::GetForDeviceInterface(GetDeviceInterfaceGuid()));
}
void OnDeviceAdded(const GUID& class_guid,
......@@ -239,7 +248,7 @@ void SerialDeviceEnumeratorWin::DoInitialEnumeration() {
base::BlockingType::MAY_BLOCK);
// Make a device interface query to find all serial devices.
base::win::ScopedDevInfo dev_info(
SetupDiGetClassDevs(&GUID_DEVINTERFACE_COMPORT, nullptr, 0,
SetupDiGetClassDevs(&GetDeviceInterfaceGuid(), nullptr, 0,
DIGCF_DEVICEINTERFACE | DIGCF_PRESENT));
if (!dev_info.is_valid())
return;
......
......@@ -41976,6 +41976,7 @@ from previous Chrome versions.
label="AutofillSaveCardDialogUnlabeledExpirationDate:disabled"/>
<int value="-697751423" label="disable-quickoffice-component-app"/>
<int value="-696693295" label="Canvas2DImageChromium:disabled"/>
<int value="-696225611" label="UseSerialBusEnumerator:disabled"/>
<int value="-695687521" label="double-buffer-compositing"/>
<int value="-694622753" label="VizHitTest:disabled"/>
<int value="-694187898" label="MashOopViz:disabled"/>
......@@ -42538,6 +42539,7 @@ from previous Chrome versions.
<int value="-94335249" label="UseAAudioDriver:enabled"/>
<int value="-92116820" label="InlineUpdateFlow:enabled"/>
<int value="-91767554" label="enable-de-jelly"/>
<int value="-91370149" label="UseSerialBusEnumerator:enabled"/>
<int value="-90521375" label="PDFTwoUpView:enabled"/>
<int value="-90032223" label="BuiltInModuleInfra:disabled"/>
<int value="-89690053" label="MaterialDesignUserManager:enabled"/>
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment