Latest
This commit is contained in:
@@ -1,48 +1,46 @@
|
||||
import { app, shell } from 'electron';
|
||||
import { Window } from './window';
|
||||
export class App {
|
||||
static launch() {
|
||||
app.on('window-all-closed', App.quit);
|
||||
app.on('activate', App.start);
|
||||
app.on('ready', App.start);
|
||||
// Limit navigation and open external links in default browser
|
||||
app.on('web-contents-created', App.openExternalLinksInDefaultBrowser);
|
||||
}
|
||||
static get electronWindow() {
|
||||
return this._wrapper ? this._wrapper.electronWindow : undefined;
|
||||
}
|
||||
static start() {
|
||||
// On MacOS it is common to re-create a window from app even after all windows have been closed
|
||||
if (!App.electronWindow) {
|
||||
App._wrapper = new Window();
|
||||
}
|
||||
}
|
||||
static quit() {
|
||||
// On MacOS it is common for applications to stay open until the user explicitly quits
|
||||
// But WebDriverIO Test Runner does handle that behaviour yet
|
||||
if (
|
||||
process.platform !== 'darwin' ||
|
||||
global.appConfig.configId === 'e2e-test'
|
||||
) {
|
||||
app.quit();
|
||||
}
|
||||
}
|
||||
static launch() {
|
||||
app.on('window-all-closed', App.quit);
|
||||
app.on('activate', App.start);
|
||||
app.on('ready', App.start);
|
||||
// Limit navigation and open external links in default browser
|
||||
app.on('web-contents-created', App.openExternalLinksInDefaultBrowser);
|
||||
}
|
||||
static get electronWindow() {
|
||||
return this._wrapper ? this._wrapper.electronWindow : undefined;
|
||||
}
|
||||
static start() {
|
||||
// On MacOS it is common to re-create a window from app even after all windows have been closed
|
||||
if (!App.electronWindow) {
|
||||
App._wrapper = new Window();
|
||||
}
|
||||
}
|
||||
static quit() {
|
||||
// On MacOS it is common for applications to stay open until the user explicitly quits
|
||||
// But WebDriverIO Test Runner does handle that behaviour yet
|
||||
if (process.platform !== 'darwin' ||
|
||||
global.appConfig.configId === 'e2e-test') {
|
||||
app.quit();
|
||||
}
|
||||
}
|
||||
}
|
||||
App.openExternalLinksInDefaultBrowser = (event, contents) => {
|
||||
// Disabling creation of new windows
|
||||
contents.setWindowOpenHandler((handler) => {
|
||||
// Telling the user platform to open this event's url in the default browser
|
||||
shell.openExternal(handler.url);
|
||||
// Blocking this event from loading in current app
|
||||
return { action: 'deny' };
|
||||
});
|
||||
// Limiting navigation
|
||||
contents.on('will-navigate', (event, navigationUrl) => {
|
||||
const parsedUrl = new URL(navigationUrl);
|
||||
// Allowing local navigation only
|
||||
if (parsedUrl.origin !== 'http://localhost:4200') {
|
||||
event.preventDefault();
|
||||
}
|
||||
});
|
||||
// Disabling creation of new windows
|
||||
contents.setWindowOpenHandler((handler) => {
|
||||
// Telling the user platform to open this event's url in the default browser
|
||||
shell.openExternal(handler.url);
|
||||
// Blocking this event from loading in current app
|
||||
return { action: 'deny' };
|
||||
});
|
||||
// Limiting navigation
|
||||
contents.on('will-navigate', (event, navigationUrl) => {
|
||||
const parsedUrl = new URL(navigationUrl);
|
||||
// Allowing local navigation only
|
||||
if (parsedUrl.origin !== 'http://localhost:4200') {
|
||||
event.preventDefault();
|
||||
}
|
||||
});
|
||||
};
|
||||
//# sourceMappingURL=app.js.map
|
||||
//# sourceMappingURL=app.js.map
|
||||
@@ -1,141 +1,126 @@
|
||||
var __awaiter =
|
||||
(this && this.__awaiter) ||
|
||||
function (thisArg, _arguments, P, generator) {
|
||||
function adopt(value) {
|
||||
return value instanceof P
|
||||
? value
|
||||
: new P(function (resolve) {
|
||||
resolve(value);
|
||||
});
|
||||
}
|
||||
return new (P || (P = Promise))(function (resolve, reject) {
|
||||
function fulfilled(value) {
|
||||
try {
|
||||
step(generator.next(value));
|
||||
} catch (e) {
|
||||
reject(e);
|
||||
}
|
||||
}
|
||||
function rejected(value) {
|
||||
try {
|
||||
step(generator['throw'](value));
|
||||
} catch (e) {
|
||||
reject(e);
|
||||
}
|
||||
}
|
||||
function step(result) {
|
||||
result.done
|
||||
? resolve(result.value)
|
||||
: adopt(result.value).then(fulfilled, rejected);
|
||||
}
|
||||
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
||||
});
|
||||
};
|
||||
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
||||
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
||||
return new (P || (P = Promise))(function (resolve, reject) {
|
||||
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
||||
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
||||
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
||||
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
||||
});
|
||||
};
|
||||
import * as remoteMain from '@electron/remote/main';
|
||||
import { app, BrowserWindow, ipcMain, nativeImage } from 'electron';
|
||||
import * as path from 'node:path';
|
||||
import { FileListService } from '../services/file-list-service';
|
||||
import { PrintService } from './../services/print-service';
|
||||
import { Logger } from '../utils/logger';
|
||||
import { DoorService } from '../services/door-service';
|
||||
import { readFile } from 'node:fs';
|
||||
export class Window {
|
||||
constructor() {
|
||||
this.createWindow();
|
||||
this.loadRenderer();
|
||||
this.registerService(new FileListService());
|
||||
}
|
||||
createWindow() {
|
||||
this._electronWindow = new BrowserWindow({
|
||||
width: 1280,
|
||||
height: 720,
|
||||
backgroundColor: '#FFFFFF',
|
||||
icon: this.loadIcon(),
|
||||
webPreferences: {
|
||||
// Default behavior in Electron since 5, that
|
||||
// limits the powers granted to remote content
|
||||
// except in e2e test when those powers are required
|
||||
nodeIntegration: global.appConfig.isNodeIntegration,
|
||||
// Isolate window context to protect against prototype pollution
|
||||
// except in e2e test when that access is required
|
||||
contextIsolation: global.appConfig.isContextIsolation,
|
||||
// Introduced in Electron 20 and enabled by default
|
||||
// Among others security constraints, it prevents from required
|
||||
// CommonJS modules imports into preload script
|
||||
// which is not bundled yet in dev mode
|
||||
sandbox: global.appConfig.isSandbox,
|
||||
// Use a preload script to enhance security
|
||||
preload: MAIN_WINDOW_PRELOAD_WEBPACK_ENTRY,
|
||||
},
|
||||
});
|
||||
// Disable the remote module to enhance security
|
||||
// except in e2e test when that access is required
|
||||
if (global.appConfig.isEnableRemoteModule) {
|
||||
remoteMain.enable(this._electronWindow.webContents);
|
||||
}
|
||||
}
|
||||
loadIcon() {
|
||||
let iconObject;
|
||||
if (global.appConfig.isIconAvailable) {
|
||||
const iconPath = path.join(__dirname, 'icons/icon.png');
|
||||
Logger.debug('Icon Path', iconPath);
|
||||
iconObject = nativeImage.createFromPath(iconPath);
|
||||
// Change dock icon on MacOS
|
||||
if (iconObject && process.platform === 'darwin') {
|
||||
app.dock.setIcon(iconObject);
|
||||
}
|
||||
}
|
||||
return iconObject;
|
||||
}
|
||||
loadRenderer() {
|
||||
if (global.appConfig.configId === 'development') {
|
||||
// Dev mode, take advantage of the live reload by loading local URL
|
||||
this.electronWindow.loadURL(`http://localhost:4200`);
|
||||
} else {
|
||||
// Else mode, we simply load angular bundle
|
||||
const indexPath = path.join(
|
||||
__dirname,
|
||||
'../renderer/angular_window/index.html'
|
||||
);
|
||||
this.electronWindow.loadURL(`file://${indexPath}`);
|
||||
}
|
||||
if (global.appConfig.isOpenDevTools) {
|
||||
this.openDevTools();
|
||||
}
|
||||
// When the window is closed`
|
||||
this._electronWindow.on('closed', () => {
|
||||
// Remove IPC Main listeners
|
||||
ipcMain.removeAllListeners();
|
||||
// Delete current reference
|
||||
delete this._electronWindow;
|
||||
});
|
||||
}
|
||||
openDevTools() {
|
||||
this._electronWindow.webContents.openDevTools();
|
||||
this._electronWindow.webContents.on('devtools-opened', () => {
|
||||
this._electronWindow.focus();
|
||||
setImmediate(() => {
|
||||
this._electronWindow.focus();
|
||||
});
|
||||
});
|
||||
}
|
||||
registerService(service) {
|
||||
ipcMain.on(service.receptionChannel(), (event, ...parameters) =>
|
||||
__awaiter(this, void 0, void 0, function* () {
|
||||
// Handling input
|
||||
const input = parameters[0];
|
||||
Logger.debug(`[${service.receptionChannel()}] =====> `, input);
|
||||
const output = service.process(input);
|
||||
// Handling output
|
||||
if (service.sendingChannel()) {
|
||||
Logger.debug(`[${service.sendingChannel()}] =====> `, output);
|
||||
this._electronWindow.webContents.send(
|
||||
service.sendingChannel(),
|
||||
output
|
||||
);
|
||||
}
|
||||
})
|
||||
);
|
||||
}
|
||||
get electronWindow() {
|
||||
return this._electronWindow;
|
||||
}
|
||||
constructor() {
|
||||
this.createWindow();
|
||||
this.loadRenderer();
|
||||
const fileListService = new FileListService();
|
||||
this.registerService(fileListService);
|
||||
this.registerService(new DoorService());
|
||||
readFile('./config.json', 'utf8', (error, data) => {
|
||||
if (error) {
|
||||
console.log(error);
|
||||
return;
|
||||
}
|
||||
const config = JSON.parse(data);
|
||||
fileListService.setPaths(config.filePaths);
|
||||
});
|
||||
}
|
||||
createWindow() {
|
||||
this._electronWindow = new BrowserWindow({
|
||||
fullscreen: false,
|
||||
backgroundColor: '#FFFFFF',
|
||||
icon: this.loadIcon(),
|
||||
webPreferences: {
|
||||
// Default behavior in Electron since 5, that
|
||||
// limits the powers granted to remote content
|
||||
// except in e2e test when those powers are required
|
||||
nodeIntegration: global.appConfig.isNodeIntegration,
|
||||
// Isolate window context to protect against prototype pollution
|
||||
// except in e2e test when that access is required
|
||||
contextIsolation: global.appConfig.isContextIsolation,
|
||||
// Introduced in Electron 20 and enabled by default
|
||||
// Among others security constraints, it prevents from required
|
||||
// CommonJS modules imports into preload script
|
||||
// which is not bundled yet in dev mode
|
||||
sandbox: global.appConfig.isSandbox,
|
||||
// Use a preload script to enhance security
|
||||
preload: MAIN_WINDOW_PRELOAD_WEBPACK_ENTRY,
|
||||
},
|
||||
});
|
||||
this._printService = new PrintService();
|
||||
this._printService.setWindow(this._electronWindow);
|
||||
this.registerService(this._printService);
|
||||
// Disable the remote module to enhance security
|
||||
// except in e2e test when that access is required
|
||||
if (global.appConfig.isEnableRemoteModule) {
|
||||
remoteMain.enable(this._electronWindow.webContents);
|
||||
}
|
||||
}
|
||||
loadIcon() {
|
||||
let iconObject;
|
||||
if (global.appConfig.isIconAvailable) {
|
||||
const iconPath = path.join(__dirname, 'icons/icon.png');
|
||||
Logger.debug('Icon Path', iconPath);
|
||||
iconObject = nativeImage.createFromPath(iconPath);
|
||||
// Change dock icon on MacOS
|
||||
if (iconObject && process.platform === 'darwin') {
|
||||
app.dock.setIcon(iconObject);
|
||||
}
|
||||
}
|
||||
return iconObject;
|
||||
}
|
||||
loadRenderer() {
|
||||
if (global.appConfig.configId === 'development') {
|
||||
// Dev mode, take advantage of the live reload by loading local URL
|
||||
this.electronWindow.loadURL(`http://localhost:4200`);
|
||||
}
|
||||
else {
|
||||
// Else mode, we simply load angular bundle
|
||||
const indexPath = path.join(__dirname, '../renderer/angular_window/index.html');
|
||||
this.electronWindow.loadURL(`file://${indexPath}`);
|
||||
}
|
||||
if (global.appConfig.isOpenDevTools) {
|
||||
this.openDevTools();
|
||||
}
|
||||
// When the window is closed`
|
||||
this._electronWindow.on('closed', () => {
|
||||
// Remove IPC Main listeners
|
||||
ipcMain.removeAllListeners();
|
||||
// Delete current reference
|
||||
delete this._electronWindow;
|
||||
});
|
||||
}
|
||||
openDevTools() {
|
||||
this._electronWindow.webContents.openDevTools();
|
||||
this._electronWindow.webContents.on('devtools-opened', () => {
|
||||
this._electronWindow.focus();
|
||||
setImmediate(() => {
|
||||
this._electronWindow.focus();
|
||||
});
|
||||
});
|
||||
}
|
||||
registerService(service) {
|
||||
ipcMain.on(service.receptionChannel(), (event, ...parameters) => __awaiter(this, void 0, void 0, function* () {
|
||||
// Handling input
|
||||
const input = parameters[0];
|
||||
Logger.debug(`[${service.receptionChannel()}] =====> `, input);
|
||||
service.process(input).then((output) => {
|
||||
// Handling output
|
||||
if (service.sendingChannel()) {
|
||||
Logger.debug(`[${service.sendingChannel()}] =====> `, output);
|
||||
this._electronWindow.webContents.send(service.sendingChannel(), output);
|
||||
}
|
||||
});
|
||||
}));
|
||||
}
|
||||
get electronWindow() {
|
||||
return this._electronWindow;
|
||||
}
|
||||
}
|
||||
//# sourceMappingURL=window.js.map
|
||||
//# sourceMappingURL=window.js.map
|
||||
@@ -1 +1 @@
|
||||
{"version":3,"file":"window.js","sourceRoot":"","sources":["../../../../workspaces/electron-app/main/components/window.ts"],"names":[],"mappings":"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"}
|
||||
{"version":3,"file":"window.js","sourceRoot":"","sources":["../../../../workspaces/electron-app/main/components/window.ts"],"names":[],"mappings":"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"}
|
||||
Reference in New Issue
Block a user