diff --git a/shell/browser/api/electron_api_desktop_capturer.cc b/shell/browser/api/electron_api_desktop_capturer.cc index b2001bbe0c..ba762bb151 100644 --- a/shell/browser/api/electron_api_desktop_capturer.cc +++ b/shell/browser/api/electron_api_desktop_capturer.cc @@ -399,28 +399,37 @@ void DesktopCapturer::UpdateSourcesList(DesktopMediaList* list) { if (using_directx_capturer_) { std::vector device_names; // Crucially, this list of device names will be in the same order as - // |media_list_sources|. + // |screen_sources|. if (!webrtc::DxgiDuplicatorController::Instance()->GetDeviceNames( &device_names)) { HandleFailure(); return; } + DCHECK_EQ(device_names.size(), screen_sources.size()); std::vector monitors; EnumDisplayMonitors(nullptr, nullptr, EnumDisplayMonitorsCallback, reinterpret_cast(&monitors)); - std::vector> pairs; - for (const auto& device_name : device_names) { - std::wstring wide_device_name; - base::UTF8ToWide(device_name.c_str(), device_name.size(), - &wide_device_name); - for (const auto monitor : monitors) { - MONITORINFOEX monitorInfo{{sizeof(MONITORINFOEX)}}; - if (GetMonitorInfo(monitor, &monitorInfo)) { - if (wide_device_name == monitorInfo.szDevice) - pairs.push_back(std::make_pair(device_name, monitorInfo)); - } + base::flat_map device_name_to_id; + device_name_to_id.reserve(monitors.size()); + for (auto* monitor : monitors) { + MONITORINFOEX monitorInfo{{sizeof(MONITORINFOEX)}}; + if (!GetMonitorInfo(monitor, &monitorInfo)) { + continue; + } + + device_name_to_id[base::WideToUTF8(monitorInfo.szDevice)] = + display::win::internal::DisplayInfo::DisplayIdFromMonitorInfo( + monitorInfo); + } + + int device_name_index = 0; + for (auto& source : screen_sources) { + const auto& device_name = device_names[device_name_index++]; + if (auto id_iter = device_name_to_id.find(device_name); + id_iter != device_name_to_id.end()) { + source.display_id = base::NumberToString(id_iter->second); } } } diff --git a/spec/api-screen-spec.ts b/spec/api-screen-spec.ts index e5e09cbef6..8ff1b489d3 100644 --- a/spec/api-screen-spec.ts +++ b/spec/api-screen-spec.ts @@ -1,6 +1,5 @@ import { expect } from 'chai'; import { Display, screen, desktopCapturer } from 'electron/main'; -import { ifit } from './lib/spec-helpers'; describe('screen module', () => { describe('methods reassignment', () => { @@ -24,14 +23,14 @@ describe('screen module', () => { } }); - // desktopCapturer.getSources does not work as expected in Windows CI. - ifit(process.platform !== 'win32')('returns displays with IDs matching desktopCapturer source display IDs', async () => { + it('returns displays with IDs matching desktopCapturer source display IDs', async () => { const displayIds = screen.getAllDisplays().map(d => `${d.id}`); const sources = await desktopCapturer.getSources({ types: ['screen'] }); const sourceIds = sources.map(s => s.display_id); - expect(displayIds).to.have.members(sourceIds); + expect(displayIds).to.have.length(sources.length); + expect(displayIds).to.have.same.members(sourceIds); }); });