Skip to content

Commit 7015477

Browse files
committed
Actually expose some methods
1 parent 0328ac3 commit 7015477

File tree

3 files changed

+89
-12
lines changed

3 files changed

+89
-12
lines changed

src/packager/electron-preload.js

Lines changed: 0 additions & 7 deletions
This file was deleted.

src/packager/electron-superpowers.js

Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
const exposeBrowserWindowMethods = [
2+
// https://www.electronjs.org/docs/latest/api/browser-window
3+
'focus',
4+
'blur',
5+
'isFocused',
6+
'show',
7+
'showInactive',
8+
'hide',
9+
'isVisible',
10+
'maximize',
11+
'unmaximize',
12+
'isMaximized',
13+
'minimize',
14+
'restore',
15+
'isMinimized',
16+
'isNormal',
17+
'setAspectRatio',
18+
'setBounds',
19+
'getBounds',
20+
'setContentBounds',
21+
'getContentBounds',
22+
'getNormalBounds',
23+
'setEnabled',
24+
'isEnabled',
25+
'setSize',
26+
'getSize',
27+
'setContentSize',
28+
'getContentSize',
29+
'setMinimumSize',
30+
'getMinimumSize',
31+
'setMaximumSize',
32+
'getMaximumSize',
33+
'setResizable',
34+
'isResizable',
35+
'setMovable',
36+
'isMovable',
37+
'setMinimizable',
38+
'isMinimizable',
39+
'setMaximizable',
40+
'isMaximizable',
41+
'setClosable',
42+
'isClosable',
43+
'setAlwaysOnTop',
44+
'isAlwaysOnTop',
45+
'moveTop',
46+
'center',
47+
'setPosition',
48+
'getPosition',
49+
'setProgressBar',
50+
'setOpacity',
51+
'getOpacity',
52+
'setFocusable',
53+
'isFocusable'
54+
];
55+
56+
const main = `
57+
const {ipcMain, BrowserWindow} = require('electron');
58+
59+
const ALLOWED_METHODS = ${JSON.stringify(exposeBrowserWindowMethods)};
60+
61+
ipcMain.handle('superpowers/BrowserWindow', (event, name, ...args) => {
62+
if (!ALLOWED_METHODS.includes(name)) {
63+
throw new Error('Unsupported BrowserWindow method: ' + name);
64+
}
65+
return BrowserWindow.fromWebContents(event.sender)[name](...args);
66+
});
67+
`.trimStart();
68+
69+
const preload = `
70+
const {contextBridge, ipcRenderer} = require('electron');
71+
72+
contextBridge.exposeInMainWorld('PackagerSuperpowers', {
73+
BrowserWindow: (name, ...args) => ipcRenderer.invoke('superpowers/BrowserWindow', name, ...args)
74+
});
75+
`.trimStart();
76+
77+
export default {
78+
main,
79+
preload
80+
};

src/packager/packager.js

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ import {APP_NAME, WEBSITE, COPYRIGHT_NOTICE, ACCENT_COLOR} from './brand';
1111
import {OutdatedPackagerError} from '../common/errors';
1212
import {darken} from './colors';
1313
import {Adapter} from './adapter';
14-
import electronPreloadJS from '!raw-loader!./electron-preload.js';
14+
import electronSuperpowerScripts from './electron-superpowers';
1515

1616
const PROGRESS_LOADED_SCRIPTS = 0.1;
1717

@@ -513,7 +513,8 @@ cd "$(dirname "$0")"
513513
const contentsPrefix = isMac ? `${rootPrefix}${packageName}.app/Contents/` : rootPrefix;
514514
const resourcesPrefix = isMac ? `${contentsPrefix}Resources/app/` : `${contentsPrefix}resources/app/`;
515515
const electronMainName = 'electron-main.js';
516-
const electronPreloadName = 'electron-preload.js';
516+
const electronSuperpowersMainName = 'electron-superpowers.js';
517+
const electronSuperpowersPreloadName = 'electron-preload.js';
517518
const iconName = 'icon.png';
518519

519520
const icon = await Adapter.getAppIcon(this.options.app.icon);
@@ -527,7 +528,7 @@ cd "$(dirname "$0")"
527528
zip.file(`${resourcesPrefix}package.json`, JSON.stringify(manifest, null, 4));
528529

529530
const mainJS = `'use strict';
530-
const {app, BrowserWindow, Menu, shell, screen, dialog} = require('electron');
531+
const {app, BrowserWindow, Menu, shell, screen, dialog, ipcMain} = require('electron');
531532
const path = require('path');
532533
533534
const isWindows = process.platform === 'win32';
@@ -560,7 +561,7 @@ const createWindow = (windowOptions) => {
560561
sandbox: true,
561562
contextIsolation: true,
562563
nodeIntegration: false,
563-
preload: path.resolve(__dirname, ${JSON.stringify(electronPreloadName)}),
564+
preload: path.resolve(__dirname, ${JSON.stringify(electronSuperpowersPreloadName)}),
564565
},
565566
show: true,
566567
width: 480,
@@ -698,9 +699,12 @@ app.on('window-all-closed', () => {
698699
app.whenReady().then(() => {
699700
createProjectWindow(defaultProjectURL);
700701
});
702+
703+
require('./' + ${JSON.stringify(electronSuperpowersMainName)});
701704
`;
702705
zip.file(`${resourcesPrefix}${electronMainName}`, mainJS);
703-
zip.file(`${resourcesPrefix}${electronPreloadName}`, electronPreloadJS);
706+
zip.file(`${resourcesPrefix}${electronSuperpowersMainName}`, electronSuperpowerScripts.main)
707+
zip.file(`${resourcesPrefix}${electronSuperpowersPreloadName}`, electronSuperpowerScripts.preload);
704708

705709
for (const [path, data] of Object.entries(projectZip.files)) {
706710
setFileFast(zip, `${resourcesPrefix}${path}`, data);

0 commit comments

Comments
 (0)