Browse Source

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

* fix: add a "set" trap to the "screen" module proxy

* fixup! fix: add a "set" trap to the "screen" module proxy

Co-authored-by: Aleksei Kuzmin <[email protected]>
trop[bot] 4 years ago
parent
commit
6b54fe37de
2 changed files with 35 additions and 21 deletions
  1. 23 21
      lib/browser/api/screen.ts
  2. 12 0
      spec-main/api-screen-spec.ts

+ 23 - 21
lib/browser/api/screen.ts

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

+ 12 - 0
spec-main/api-screen-spec.ts

@@ -2,6 +2,18 @@ import { expect } from 'chai';
 import { screen } from 'electron/main';
 
 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()', () => {
     it('returns a point object', () => {
       const point = screen.getCursorScreenPoint();