fix: add a "set" trap to the "screen" module proxy (#26818)

This commit is contained in:
Alexey Kuzmin 2020-12-07 20:20:50 +03:00 committed by GitHub
parent d3b1566181
commit e89b3ca1d1
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 35 additions and 21 deletions

View file

@ -2,37 +2,39 @@ const { createScreen } = process._linkedBinding('electron_common_screen');
let _screen: Electron.Screen; let _screen: Electron.Screen;
const createScreenIfNeeded = () => {
if (_screen === undefined) {
_screen = createScreen();
}
};
// We can't call createScreen until after app.on('ready'), but this module // We can't call createScreen until after app.on('ready'), but this module
// exposes an instance created by createScreen. In order to avoid // exposes an instance created by createScreen. In order to avoid
// side-effecting and calling createScreen upon import of this module, instead // side-effecting and calling createScreen upon import of this module, instead
// we export a proxy which lazily calls createScreen on first access. // we export a proxy which lazily calls createScreen on first access.
export default new Proxy({}, { export default new Proxy({}, {
get: (target, prop: keyof Electron.Screen) => { get: (target, property: keyof Electron.Screen) => {
if (_screen === undefined) { createScreenIfNeeded();
_screen = createScreen(); const value = _screen[property];
if (typeof value === 'function') {
return value.bind(_screen);
} }
const v = _screen[prop]; return value;
if (typeof v === 'function') { },
return v.bind(_screen); set: (target, property: string, value: unknown) => {
} createScreenIfNeeded();
return v; return Reflect.set(_screen, property, value);
}, },
ownKeys: () => { ownKeys: () => {
if (_screen === undefined) { createScreenIfNeeded();
_screen = createScreen();
}
return Reflect.ownKeys(_screen); return Reflect.ownKeys(_screen);
}, },
has: (target, prop: string) => { has: (target, property: string) => {
if (_screen === undefined) { createScreenIfNeeded();
_screen = createScreen(); return property in _screen;
}
return prop in _screen;
}, },
getOwnPropertyDescriptor: (target, prop: string) => { getOwnPropertyDescriptor: (target, property: string) => {
if (_screen === undefined) { createScreenIfNeeded();
_screen = createScreen(); return Reflect.getOwnPropertyDescriptor(_screen, property);
}
return Reflect.getOwnPropertyDescriptor(_screen, prop);
} }
}); });

View file

@ -2,6 +2,18 @@ import { expect } from 'chai';
import { screen } from 'electron/main'; import { screen } from 'electron/main';
describe('screen module', () => { describe('screen module', () => {
describe('methods reassignment', () => {
it('works for a selected method', () => {
const originalFunction = screen.getPrimaryDisplay;
try {
(screen as any).getPrimaryDisplay = () => null;
expect(screen.getPrimaryDisplay()).to.be.null();
} finally {
screen.getPrimaryDisplay = originalFunction;
}
});
});
describe('screen.getCursorScreenPoint()', () => { describe('screen.getCursorScreenPoint()', () => {
it('returns a point object', () => { it('returns a point object', () => {
const point = screen.getCursorScreenPoint(); const point = screen.getCursorScreenPoint();