[MM-38936] Revert #1758, upgrade to Electron 14.1.0 (#1779) (#1784)

* Revert "[MM-38649] Put top bar in a BrowserView (#1758)"

This reverts commit c914903df9.

* [MM-38936] Upgrade to Electron 14.1.0

(cherry picked from commit e3ea6e4c6a)

Co-authored-by: Devin Binnie <52460000+devinbinnie@users.noreply.github.com>
This commit is contained in:
Mattermost Build 2021-10-05 15:27:49 +02:00 committed by GitHub
parent ceec1ec19b
commit 8c45e25a9f
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
8 changed files with 49 additions and 87 deletions

14
package-lock.json generated
View file

@ -67,7 +67,7 @@
"cross-env": "^5.2.0", "cross-env": "^5.2.0",
"css-loader": "^1.0.1", "css-loader": "^1.0.1",
"devtron": "^1.4.0", "devtron": "^1.4.0",
"electron": "14.0.0", "electron": "14.1.0",
"electron-builder": "22.11.7", "electron-builder": "22.11.7",
"electron-connect": "^0.6.3", "electron-connect": "^0.6.3",
"electron-mocha": "^10.1.0", "electron-mocha": "^10.1.0",
@ -12459,9 +12459,9 @@
} }
}, },
"node_modules/electron": { "node_modules/electron": {
"version": "14.0.0", "version": "14.1.0",
"resolved": "https://registry.npmjs.org/electron/-/electron-14.0.0.tgz", "resolved": "https://registry.npmjs.org/electron/-/electron-14.1.0.tgz",
"integrity": "sha512-O6EI7L1BPIrTpEIFefjjmdbmSn9LtE4mmrv4dfpV4Mqaa8uKuNYQogwZPEvSwaBexb69eb1LQ25n+f+kBcjiRQ==", "integrity": "sha512-MnZSITjtdrY6jM/z/qXcuJqbIvz7MbxHp9f1O93mq/vt7aTxHYgjerPSqwya/RoUjkPEm1gkz669FsRk6ZtMdQ==",
"dev": true, "dev": true,
"hasInstallScript": true, "hasInstallScript": true,
"dependencies": { "dependencies": {
@ -38279,9 +38279,9 @@
} }
}, },
"electron": { "electron": {
"version": "14.0.0", "version": "14.1.0",
"resolved": "https://registry.npmjs.org/electron/-/electron-14.0.0.tgz", "resolved": "https://registry.npmjs.org/electron/-/electron-14.1.0.tgz",
"integrity": "sha512-O6EI7L1BPIrTpEIFefjjmdbmSn9LtE4mmrv4dfpV4Mqaa8uKuNYQogwZPEvSwaBexb69eb1LQ25n+f+kBcjiRQ==", "integrity": "sha512-MnZSITjtdrY6jM/z/qXcuJqbIvz7MbxHp9f1O93mq/vt7aTxHYgjerPSqwya/RoUjkPEm1gkz669FsRk6ZtMdQ==",
"dev": true, "dev": true,
"requires": { "requires": {
"@electron/get": "^1.0.1", "@electron/get": "^1.0.1",

View file

@ -89,7 +89,7 @@
"cross-env": "^5.2.0", "cross-env": "^5.2.0",
"css-loader": "^1.0.1", "css-loader": "^1.0.1",
"devtron": "^1.4.0", "devtron": "^1.4.0",
"electron": "14.0.0", "electron": "14.1.0",
"electron-builder": "22.11.7", "electron-builder": "22.11.7",
"electron-connect": "^0.6.3", "electron-connect": "^0.6.3",
"electron-mocha": "^10.1.0", "electron-mocha": "^10.1.0",

View file

@ -142,7 +142,14 @@ function createTemplate(config: Config) {
return 'Ctrl+Shift+I'; return 'Ctrl+Shift+I';
})(), })(),
click(item: Electron.MenuItem, focusedWindow?: WebContents) { click(item: Electron.MenuItem, focusedWindow?: WebContents) {
WindowManager.openAppWrapperDevTools(focusedWindow); if (focusedWindow) {
// toggledevtools opens it in the last known position, so sometimes it goes below the browserview
if (focusedWindow.isDevToolsOpened()) {
focusedWindow.closeDevTools();
} else {
focusedWindow.openDevTools({mode: 'detach'});
}
}
}, },
}, { }, {
label: 'Developer Tools for Current Tab', label: 'Developer Tools for Current Tab',

View file

@ -22,15 +22,6 @@ export function shouldBeHiddenOnStartup(parsedArgv: Args) {
return false; return false;
} }
export function getMainViewBounds(windowWidth: number, windowHeight: number) {
return {
x: 0,
y: 0,
width: windowWidth,
height: windowHeight,
};
}
export function getWindowBoundaries(win: BrowserWindow, hasBackBar = false) { export function getWindowBoundaries(win: BrowserWindow, hasBackBar = false) {
const {width, height} = win.getContentBounds(); const {width, height} = win.getContentBounds();
return getAdjustedWindowBoundaries(width, height, hasBackBar); return getAdjustedWindowBoundaries(width, height, hasBackBar);

View file

@ -128,12 +128,8 @@ export default class TeamDropdownView {
} }
getBounds = (width: number, height: number) => { getBounds = (width: number, height: number) => {
let threeDotMenuWidth = THREE_DOT_MENU_WIDTH;
if (process.platform === 'darwin') {
threeDotMenuWidth = this.window.isFullScreen() ? 6 : THREE_DOT_MENU_WIDTH_MAC;
}
return { return {
x: threeDotMenuWidth - MENU_SHADOW_WIDTH, x: (process.platform === 'darwin' ? THREE_DOT_MENU_WIDTH_MAC : THREE_DOT_MENU_WIDTH) - MENU_SHADOW_WIDTH,
y: TAB_BAR_HEIGHT - MENU_SHADOW_WIDTH, y: TAB_BAR_HEIGHT - MENU_SHADOW_WIDTH,
width, width,
height, height,

View file

@ -45,16 +45,14 @@ export class ViewManager {
urlView?: BrowserView; urlView?: BrowserView;
urlViewCancel?: () => void; urlViewCancel?: () => void;
mainWindow: BrowserWindow; mainWindow: BrowserWindow;
mainView: BrowserView;
loadingScreen?: BrowserView; loadingScreen?: BrowserView;
constructor(config: CombinedConfig, mainWindow: BrowserWindow, mainView: BrowserView) { constructor(config: CombinedConfig, mainWindow: BrowserWindow) {
this.configServers = config.teams; this.configServers = config.teams;
this.lastActiveServer = config.lastActiveTeam; this.lastActiveServer = config.lastActiveTeam;
this.viewOptions = {webPreferences: {spellcheck: config.useSpellChecker}}; this.viewOptions = {webPreferences: {spellcheck: config.useSpellChecker}};
this.views = new Map(); // keep in mind that this doesn't need to hold server order, only tabs on the renderer need that. this.views = new Map(); // keep in mind that this doesn't need to hold server order, only tabs on the renderer need that.
this.mainWindow = mainWindow; this.mainWindow = mainWindow;
this.mainView = mainView;
this.closedViews = new Map(); this.closedViews = new Map();
} }
@ -132,7 +130,7 @@ export class ViewManager {
delete this.currentView; delete this.currentView;
this.showInitial(); this.showInitial();
} else { } else {
this.mainView.webContents.send(SET_ACTIVE_VIEW); this.mainWindow.webContents.send(SET_ACTIVE_VIEW);
} }
} }
oldviews.forEach((unused) => { oldviews.forEach((unused) => {
@ -179,16 +177,11 @@ export class ViewManager {
if (newView.needsLoadingScreen()) { if (newView.needsLoadingScreen()) {
this.showLoadingScreen(); this.showLoadingScreen();
} }
this.mainView.webContents.send(SET_ACTIVE_VIEW, newView.tab.server.name, newView.tab.type); newView.window.webContents.send(SET_ACTIVE_VIEW, newView.tab.server.name, newView.tab.type);
ipcMain.emit(SET_ACTIVE_VIEW, true, newView.tab.server.name, newView.tab.type); ipcMain.emit(SET_ACTIVE_VIEW, true, newView.tab.server.name, newView.tab.type);
if (newView.isReady()) { if (newView.isReady()) {
// if view is not ready, the renderer will have something to display instead. // if view is not ready, the renderer will have something to display instead.
newView.show(); newView.show();
// Need to call this function so that macOS has a draggable top bar
// https://github.com/electron/electron/issues/31068
this.mainView.setBounds(this.mainView.getBounds());
ipcMain.emit(UPDATE_LAST_ACTIVE, true, newView.tab.server.name, newView.tab.type); ipcMain.emit(UPDATE_LAST_ACTIVE, true, newView.tab.server.name, newView.tab.type);
if (newView.needsLoadingScreen()) { if (newView.needsLoadingScreen()) {
this.showLoadingScreen(); this.showLoadingScreen();

View file

@ -17,6 +17,7 @@ import {DEFAULT_WINDOW_HEIGHT, DEFAULT_WINDOW_WIDTH, MINIMUM_WINDOW_HEIGHT, MINI
import * as Validator from '../Validator'; import * as Validator from '../Validator';
import ContextMenu from '../contextMenu'; import ContextMenu from '../contextMenu';
import {getLocalPreload, getLocalURLString} from '../utils';
function saveWindowState(file: string, window: BrowserWindow) { function saveWindowState(file: string, window: BrowserWindow) {
const windowState: SavedWindowState = { const windowState: SavedWindowState = {
@ -42,6 +43,7 @@ function isFramelessWindow() {
function createMainWindow(config: CombinedConfig, options: {linuxAppIcon: string}) { function createMainWindow(config: CombinedConfig, options: {linuxAppIcon: string}) {
// Create the browser window. // Create the browser window.
const preload = getLocalPreload('mainWindow.js');
const boundsInfoPath = path.join(app.getPath('userData'), 'bounds-info.json'); const boundsInfoPath = path.join(app.getPath('userData'), 'bounds-info.json');
let savedWindowState; let savedWindowState;
try { try {
@ -61,6 +63,8 @@ function createMainWindow(config: CombinedConfig, options: {linuxAppIcon: string
const {maximized: windowIsMaximized} = savedWindowState; const {maximized: windowIsMaximized} = savedWindowState;
const spellcheck = (typeof config.useSpellChecker === 'undefined' ? true : config.useSpellChecker);
const windowOptions: BrowserWindowConstructorOptions = Object.assign({}, savedWindowState, { const windowOptions: BrowserWindowConstructorOptions = Object.assign({}, savedWindowState, {
title: app.name, title: app.name,
fullscreenable: true, fullscreenable: true,
@ -78,6 +82,8 @@ function createMainWindow(config: CombinedConfig, options: {linuxAppIcon: string
nodeIntegration: process.env.NODE_ENV === 'test', nodeIntegration: process.env.NODE_ENV === 'test',
contextIsolation: process.env.NODE_ENV !== 'test', contextIsolation: process.env.NODE_ENV !== 'test',
disableBlinkFeatures: 'Auxclick', disableBlinkFeatures: 'Auxclick',
preload,
spellcheck,
}, },
}); });
@ -94,13 +100,24 @@ function createMainWindow(config: CombinedConfig, options: {linuxAppIcon: string
log.error('Tried to register second handler, skipping'); log.error('Tried to register second handler, skipping');
} }
mainWindow.once('show', () => { const localURL = getLocalURLString('index.html');
mainWindow.loadURL(localURL).catch(
(reason) => {
log.error(`Main window failed to load: ${reason}`);
});
mainWindow.once('ready-to-show', () => {
mainWindow.webContents.zoomLevel = 0;
mainWindow.show(); mainWindow.show();
if (windowIsMaximized) { if (windowIsMaximized) {
mainWindow.maximize(); mainWindow.maximize();
} }
}); });
mainWindow.once('show', () => {
mainWindow.show();
});
mainWindow.once('restore', () => { mainWindow.once('restore', () => {
mainWindow.restore(); mainWindow.restore();
}); });

View file

@ -2,7 +2,7 @@
// See LICENSE.txt for license information. // See LICENSE.txt for license information.
import path from 'path'; import path from 'path';
import {app, BrowserWindow, nativeImage, systemPreferences, ipcMain, IpcMainEvent, BrowserView, WebContents} from 'electron'; import {app, BrowserWindow, nativeImage, systemPreferences, ipcMain, IpcMainEvent} from 'electron';
import log from 'electron-log'; import log from 'electron-log';
import {CombinedConfig} from 'types/config'; import {CombinedConfig} from 'types/config';
@ -23,7 +23,7 @@ import urlUtils from 'common/utils/url';
import {getTabViewName} from 'common/tabs/TabView'; import {getTabViewName} from 'common/tabs/TabView';
import {getAdjustedWindowBoundaries, getLocalPreload, getLocalURLString, getMainViewBounds} from '../utils'; import {getAdjustedWindowBoundaries} from '../utils';
import {ViewManager} from '../views/viewManager'; import {ViewManager} from '../views/viewManager';
import CriticalErrorHandler from '../CriticalErrorHandler'; import CriticalErrorHandler from '../CriticalErrorHandler';
@ -37,7 +37,6 @@ import createMainWindow from './mainWindow';
type WindowManagerStatus = { type WindowManagerStatus = {
mainWindow?: BrowserWindow; mainWindow?: BrowserWindow;
mainView?: BrowserView;
settingsWindow?: BrowserWindow; settingsWindow?: BrowserWindow;
config?: CombinedConfig; config?: CombinedConfig;
viewManager?: ViewManager; viewManager?: ViewManager;
@ -105,33 +104,6 @@ export function showMainWindow(deeplinkingURL?: string | URL) {
app.quit(); app.quit();
} }
const preload = getLocalPreload('mainWindow.js');
const spellcheck = (typeof status.config.useSpellChecker === 'undefined' ? true : status.config.useSpellChecker);
status.mainView = new BrowserView({
webPreferences: {
nodeIntegration: process.env.NODE_ENV === 'test',
contextIsolation: process.env.NODE_ENV !== 'test',
disableBlinkFeatures: 'Auxclick',
preload,
spellcheck,
},
});
const localURL = getLocalURLString('index.html');
status.mainView.webContents.loadURL(localURL).catch(
(reason) => {
log.error(`Main view failed to load: ${reason}`);
});
status.mainWindow.addBrowserView(status.mainView);
const windowBounds = status.mainWindow.getContentBounds();
status.mainView.setBounds(getMainViewBounds(windowBounds.width, windowBounds.height));
status.mainView.webContents.once('did-finish-load', () => {
if (status.mainView) {
status.mainView.webContents.zoomLevel = 0;
}
status.mainWindow?.show();
});
// window handlers // window handlers
status.mainWindow.on('closed', () => { status.mainWindow.on('closed', () => {
log.warn('main window closed'); log.warn('main window closed');
@ -150,7 +122,7 @@ export function showMainWindow(deeplinkingURL?: string | URL) {
status.mainWindow.on('leave-full-screen', () => sendToRenderer('leave-full-screen')); status.mainWindow.on('leave-full-screen', () => sendToRenderer('leave-full-screen'));
if (process.env.MM_DEBUG_SETTINGS) { if (process.env.MM_DEBUG_SETTINGS) {
status.mainView.webContents.openDevTools({mode: 'detach'}); status.mainWindow.webContents.openDevTools({mode: 'detach'});
} }
if (status.viewManager) { if (status.viewManager) {
@ -204,9 +176,6 @@ function handleResizeMainWindow() {
if (currentView) { if (currentView) {
currentView.setBounds(getAdjustedWindowBoundaries(bounds.width!, bounds.height!, !(urlUtils.isTeamUrl(currentView.tab.url, currentView.view.webContents.getURL()) || urlUtils.isAdminUrl(currentView.tab.url, currentView.view.webContents.getURL())))); currentView.setBounds(getAdjustedWindowBoundaries(bounds.width!, bounds.height!, !(urlUtils.isTeamUrl(currentView.tab.url, currentView.view.webContents.getURL()) || urlUtils.isAdminUrl(currentView.tab.url, currentView.view.webContents.getURL()))));
} }
status.mainView?.setBounds(getMainViewBounds(bounds.width!, bounds.height!));
status.viewManager?.setLoadingScreenBounds();
status.teamDropdown?.updateWindowBounds();
}; };
// Another workaround since the window doesn't update properly under Linux for some reason // Another workaround since the window doesn't update properly under Linux for some reason
@ -216,13 +185,15 @@ function handleResizeMainWindow() {
} else { } else {
setBoundsFunction(); setBoundsFunction();
} }
status.viewManager.setLoadingScreenBounds();
status.teamDropdown?.updateWindowBounds();
} }
export function sendToRenderer(channel: string, ...args: any[]) { export function sendToRenderer(channel: string, ...args: any[]) {
if (!status.mainWindow) { if (!status.mainWindow) {
showMainWindow(); showMainWindow();
} }
status.mainView!.webContents.send(channel, ...args); status.mainWindow!.webContents.send(channel, ...args);
if (status.settingsWindow && status.settingsWindow.isVisible()) { if (status.settingsWindow && status.settingsWindow.isVisible()) {
status.settingsWindow.webContents.send(channel, ...args); status.settingsWindow.webContents.send(channel, ...args);
} }
@ -378,8 +349,8 @@ export function handleDoubleClick(e: IpcMainEvent, windowType?: string) {
} }
function initializeViewManager() { function initializeViewManager() {
if (!status.viewManager && status.config && status.mainWindow && status.mainView) { if (!status.viewManager && status.config && status.mainWindow) {
status.viewManager = new ViewManager(status.config, status.mainWindow, status.mainView); status.viewManager = new ViewManager(status.config, status.mainWindow);
status.viewManager.load(); status.viewManager.load();
status.viewManager.showInitial(); status.viewManager.showInitial();
status.currentServerName = (status.config.teams.find((team) => team.order === status.config?.lastActiveTeam) || status.config.teams.find((team) => team.order === 0))?.name; status.currentServerName = (status.config.teams.find((team) => team.order === status.config?.lastActiveTeam) || status.config.teams.find((team) => team.order === 0))?.name;
@ -434,9 +405,9 @@ export function openBrowserViewDevTools() {
} }
export function focusThreeDotMenu() { export function focusThreeDotMenu() {
if (status.mainView) { if (status.mainWindow) {
status.mainView.webContents.focus(); status.mainWindow.webContents.focus();
status.mainView.webContents.send(FOCUS_THREE_DOT_MENU); status.mainWindow.webContents.send(FOCUS_THREE_DOT_MENU);
} }
} }
@ -605,16 +576,3 @@ export function getCurrentTeamName() {
function handleAppLoggedIn(event: IpcMainEvent, viewName: string) { function handleAppLoggedIn(event: IpcMainEvent, viewName: string) {
status.viewManager?.reloadViewIfNeeded(viewName); status.viewManager?.reloadViewIfNeeded(viewName);
} }
export function openAppWrapperDevTools(focusedWindow?: WebContents) {
if (focusedWindow) {
// toggledevtools opens it in the last known position, so sometimes it goes below the browserview
if (focusedWindow.isDevToolsOpened()) {
focusedWindow.closeDevTools();
} else if (focusedWindow.id === status.mainWindow?.webContents.id) {
status.mainView?.webContents.openDevTools({mode: 'detach'});
} else {
focusedWindow.openDevTools({mode: 'detach'});
}
}
}