mirror of
https://github.com/balena-io/etcher.git
synced 2025-04-20 13:27:17 +00:00

This issue only affects GNU/Linux and macOS. If the user sends SIGINT to the application, the main process dies, but we get an orphaned blank browser window. The problem only seems to occur when there is a `beforeunload` window event handlers, which we use to warn the user when quitting while flashing. Change-Type: patch Changelog-Entry: Prevent blank application when sending SIGINT on GNU/Linux and macOS. Fixes: https://github.com/resin-io/etcher/issues/1028 Signed-off-by: Juan Cruz Viotti <jviotti@openmailbox.org>
119 lines
4.0 KiB
JavaScript
119 lines
4.0 KiB
JavaScript
/*
|
|
* Copyright 2016 resin.io
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*/
|
|
|
|
'use strict';
|
|
|
|
const electron = require('electron');
|
|
const _ = require('lodash');
|
|
const path = require('path');
|
|
const EXIT_CODES = require('../shared/exit-codes');
|
|
let mainWindow = null;
|
|
|
|
electron.app.on('window-all-closed', electron.app.quit);
|
|
|
|
// Sending a `SIGINT` (e.g: Ctrl-C) to an Electron app that registers
|
|
// a `beforeunload` window event handler results in a disconnected white
|
|
// browser window in GNU/Linux and macOS.
|
|
// The `before-quit` Electron event is triggered in `SIGINT`, so we can
|
|
// make use of it to ensure the browser window is completely destroyed.
|
|
// See https://github.com/electron/electron/issues/5273
|
|
electron.app.on('before-quit', () => {
|
|
process.exit(EXIT_CODES.SUCCESS);
|
|
});
|
|
|
|
electron.app.on('ready', () => {
|
|
|
|
// No menu bar
|
|
electron.Menu.setApplicationMenu(null);
|
|
|
|
mainWindow = new electron.BrowserWindow({
|
|
width: 800,
|
|
height: 380,
|
|
useContentSize: true,
|
|
show: false,
|
|
resizable: false,
|
|
fullscreen: false,
|
|
titleBarStyle: 'hidden-inset',
|
|
icon: path.join(__dirname, '..', '..', 'assets', 'icon.png')
|
|
});
|
|
|
|
// Prevent flash of white when starting the application
|
|
// https://github.com/atom/electron/issues/2172
|
|
mainWindow.webContents.on('did-finish-load', () => {
|
|
const WEBVIEW_LOAD_TIMEOUT_MS = 100;
|
|
|
|
// The flash of white is still present for a very short
|
|
// while after the WebView reports it finished loading
|
|
setTimeout(() => {
|
|
mainWindow.show();
|
|
}, WEBVIEW_LOAD_TIMEOUT_MS);
|
|
|
|
});
|
|
|
|
mainWindow.on('closed', () => {
|
|
mainWindow = null;
|
|
});
|
|
|
|
// For some reason, Electron shortcuts are registered
|
|
// globally, which means that the app listers for shorcuts
|
|
// even if its not currently focused, potentially interferring
|
|
// with shorcuts registered by other applications.
|
|
// As a workaround, we register all shortcuts when the windows
|
|
// gains focus, and unregister them when the windows loses focus.
|
|
// See http://electron.atom.io/docs/api/global-shortcut/
|
|
|
|
mainWindow.on('focus', () => {
|
|
electron.globalShortcut.register('CmdOrCtrl+Alt+I', () => {
|
|
mainWindow.webContents.openDevTools({
|
|
mode: 'detach'
|
|
});
|
|
});
|
|
|
|
// Disable refreshing the browser window
|
|
// This is supposed to be handled by the `will-navigate`
|
|
// event, however there seems to be an issue where such
|
|
// event is not fired in macOS
|
|
// See: https://github.com/electron/electron/issues/8841
|
|
electron.globalShortcut.register('CmdOrCtrl+R', _.noop);
|
|
electron.globalShortcut.register('F5', _.noop);
|
|
|
|
});
|
|
|
|
mainWindow.on('blur', () => {
|
|
electron.globalShortcut.unregisterAll();
|
|
});
|
|
|
|
// Prevent the user from being allowed to zoom-in the application.
|
|
//
|
|
// This function should be called on the renderer process. We use
|
|
// `executeJavaScript()` rather than moving this to a file in the
|
|
// renderer process for convenience, since we have all other
|
|
// electron desktop experience fixes in this file.
|
|
//
|
|
// See https://github.com/electron/electron/issues/3609
|
|
mainWindow.webContents.executeJavaScript('require(\'electron\').webFrame.setZoomLevelLimits(1, 1);');
|
|
|
|
// Prevent external resources from being loaded (like images)
|
|
// when dropping them on the WebView.
|
|
// See https://github.com/electron/electron/issues/5919
|
|
mainWindow.webContents.on('will-navigate', (event) => {
|
|
event.preventDefault();
|
|
});
|
|
|
|
mainWindow.loadURL(`file://${path.join(__dirname, 'index.html')}`);
|
|
});
|
|
|