fix: add a "set" trap to the "screen" module proxy (#26818)
This commit is contained in:
parent
d3b1566181
commit
e89b3ca1d1
2 changed files with 35 additions and 21 deletions
|
@ -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);
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
|
@ -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();
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue