fix: desktopCapturer
and screen
source ids should match screen ids (#42781)
* fix: desktopCapturer screen source ids should match screen ids * test: add a regression test
This commit is contained in:
parent
fa6ce4f0f8
commit
4e10eeb87e
2 changed files with 48 additions and 6 deletions
|
@ -167,6 +167,16 @@ std::unique_ptr<ThumbnailCapturer> MakeScreenCapturer() {
|
||||||
: nullptr;
|
: nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if BUILDFLAG(IS_WIN)
|
||||||
|
BOOL CALLBACK EnumDisplayMonitorsCallback(HMONITOR monitor,
|
||||||
|
HDC hdc,
|
||||||
|
LPRECT rect,
|
||||||
|
LPARAM data) {
|
||||||
|
reinterpret_cast<std::vector<HMONITOR>*>(data)->push_back(monitor);
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
} // namespace
|
} // namespace
|
||||||
|
|
||||||
namespace gin {
|
namespace gin {
|
||||||
|
@ -396,11 +406,22 @@ void DesktopCapturer::UpdateSourcesList(DesktopMediaList* list) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
int device_name_index = 0;
|
std::vector<HMONITOR> monitors;
|
||||||
for (auto& source : screen_sources) {
|
EnumDisplayMonitors(nullptr, nullptr, EnumDisplayMonitorsCallback,
|
||||||
const auto& device_name = device_names[device_name_index++];
|
reinterpret_cast<LPARAM>(&monitors));
|
||||||
const int64_t device_id = base::PersistentHash(device_name);
|
|
||||||
source.display_id = base::NumberToString(device_id);
|
std::vector<std::pair<std::string, MONITORINFOEX>> 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));
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#elif BUILDFLAG(IS_MAC)
|
#elif BUILDFLAG(IS_MAC)
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
import { expect } from 'chai';
|
import { expect } from 'chai';
|
||||||
import { Display, screen } from 'electron/main';
|
import { Display, screen, desktopCapturer } from 'electron/main';
|
||||||
|
import { ifit } from './lib/spec-helpers';
|
||||||
|
|
||||||
describe('screen module', () => {
|
describe('screen module', () => {
|
||||||
describe('methods reassignment', () => {
|
describe('methods reassignment', () => {
|
||||||
|
@ -14,6 +15,26 @@ describe('screen module', () => {
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
describe('screen.getAllDisplays', () => {
|
||||||
|
it('returns an array of displays', () => {
|
||||||
|
const displays = screen.getAllDisplays();
|
||||||
|
expect(displays).to.be.an('array').with.lengthOf.at.least(1);
|
||||||
|
for (const display of displays) {
|
||||||
|
expect(display).to.be.an('object');
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// desktopCapturer.getSources does not work as expected in Windows CI.
|
||||||
|
ifit(process.platform !== 'win32')('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);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
describe('screen.getCursorScreenPoint()', () => {
|
describe('screen.getCursorScreenPoint()', () => {
|
||||||
it('returns a point object', () => {
|
it('returns a point object', () => {
|
||||||
const point = screen.getCursorScreenPoint();
|
const point = screen.getCursorScreenPoint();
|
||||||
|
|
Loading…
Reference in a new issue