feat: ELECTRON-1332 (Make Context Isolation configurable) (#691)

* ELECTRON-1332 - Make Context Isolation configurable

* ELECTRON-1332 - Abstract opts constructors functions
This commit is contained in:
Kiran Niranjan 2019-06-25 10:26:01 +05:30 committed by Vishwas Shashidhar
parent 0caef99513
commit 2e80c599fc
3 changed files with 87 additions and 119 deletions

View File

@ -8,6 +8,7 @@
"isCustomTitleBar": true,
"memoryRefresh": true,
"devToolsEnabled": true,
"contextIsolation": false,
"ctWhitelist": [],
"notificationSettings": {
"position": "upper-right",

View File

@ -31,6 +31,7 @@ export interface IConfig {
isCustomTitleBar: boolean;
memoryRefresh: boolean;
devToolsEnabled: boolean;
contextIsolation: boolean;
ctWhitelist: string[];
configVersion: string;
buildNumber: string;

View File

@ -45,97 +45,6 @@ const DEFAULT_HEIGHT: number = 900;
export class WindowHandler {
/**
* Screen picker window opts
*/
private static getScreenPickerWindowOpts(): ICustomBrowserWindowConstructorOpts {
return {
alwaysOnTop: true,
autoHideMenuBar: true,
frame: false,
height: isMac ? 519 : 523,
width: 580,
modal: false,
resizable: true,
show: false,
webPreferences: {
nodeIntegration: false,
sandbox: true,
contextIsolation: false,
},
winKey: getGuid(),
};
}
/**
* Notification settings window opts
*/
private static getNotificationSettingsOpts(): ICustomBrowserWindowConstructorOpts {
return {
width: 460,
height: 360,
show: false,
modal: true,
minimizable: false,
maximizable: false,
fullscreenable: false,
autoHideMenuBar: true,
webPreferences: {
sandbox: true,
nodeIntegration: false,
devTools: false,
contextIsolation: false,
},
winKey: getGuid(),
};
}
/**
* Screen sharing indicator window opts
*/
private static getScreenSharingIndicatorOpts(): ICustomBrowserWindowConstructorOpts {
return {
width: 620,
height: 48,
show: false,
modal: true,
frame: false,
focusable: false,
transparent: true,
autoHideMenuBar: true,
resizable: false,
alwaysOnTop: true,
webPreferences: {
sandbox: true,
nodeIntegration: false,
devTools: false,
contextIsolation: false,
},
winKey: getGuid(),
};
}
/**
* Basic auth window opts
*/
private static getBasicAuthOpts(): ICustomBrowserWindowConstructorOpts {
return {
width: 360,
height: isMac ? 270 : 295,
show: false,
modal: true,
autoHideMenuBar: true,
resizable: false,
webPreferences: {
sandbox: true,
nodeIntegration: false,
devTools: false,
contextIsolation: false,
},
winKey: getGuid(),
};
}
/**
* Verifies if the url is valid and
* forcefully appends https if not present
@ -159,6 +68,7 @@ export class WindowHandler {
public willQuitApp: boolean = false;
public spellchecker: SpellChecker | undefined;
private readonly contextIsolation: boolean;
private readonly windowOpts: ICustomBrowserWindowConstructorOpts;
private readonly globalConfig: IConfig;
private readonly config: IConfig;
@ -178,11 +88,21 @@ export class WindowHandler {
constructor(opts?: Electron.BrowserViewConstructorOptions) {
// Use these variables only on initial setup
this.config = config.getConfigFields([ 'isCustomTitleBar', 'mainWinPos', 'minimizeOnClose', 'notificationSettings' ]);
this.globalConfig = config.getGlobalConfigFields([ 'url' ]);
this.globalConfig = config.getGlobalConfigFields([ 'url', 'contextIsolation' ]);
this.windows = {};
this.contextIsolation = this.globalConfig.contextIsolation || false;
this.isCustomTitleBar = isWindowsOS && this.config.isCustomTitleBar;
this.windowOpts = { ...this.getMainWindowOpts(), ...opts };
this.windowOpts = {
...this.getWindowOpts({
frame: !this.isCustomTitleBar,
minHeight: 300,
minWidth: 300,
title: 'Symphony',
}, {
preload: path.join(__dirname, '../renderer/_preload-main.js'),
}), ...opts,
};
this.isAutoReload = false;
this.isOnline = true;
@ -519,7 +439,16 @@ export class WindowHandler {
this.screenPickerWindow.close();
}
const opts = WindowHandler.getScreenPickerWindowOpts();
const opts = this.getWindowOpts({
alwaysOnTop: true,
autoHideMenuBar: true,
frame: false,
height: isMac ? 519 : 523,
width: 580,
show: false,
}, {
devTools: false,
});
this.screenPickerWindow = createComponentWindow('screen-picker', opts);
this.screenPickerWindow.webContents.once('did-finish-load', () => {
if (!this.screenPickerWindow || !windowExists(this.screenPickerWindow)) {
@ -553,7 +482,16 @@ export class WindowHandler {
* @param callback
*/
public createBasicAuthWindow(window: ICustomBrowserWindow, hostname: string, isMultipleTries: boolean, clearSettings, callback): void {
const opts = WindowHandler.getBasicAuthOpts();
const opts = this.getWindowOpts({
width: 360,
height: isMac ? 270 : 295,
show: false,
modal: true,
autoHideMenuBar: true,
resizable: false,
}, {
devTools: false,
});
opts.parent = window;
this.basicAuthWindow = createComponentWindow('basic-auth', opts);
this.basicAuthWindow.setVisibleOnAllWorkspaces(true);
@ -594,7 +532,18 @@ export class WindowHandler {
* @param windowName
*/
public createNotificationSettingsWindow(windowName: string): void {
const opts = WindowHandler.getNotificationSettingsOpts();
const opts = this.getWindowOpts({
width: 460,
height: 360,
show: false,
modal: true,
minimizable: false,
maximizable: false,
fullscreenable: false,
autoHideMenuBar: true,
}, {
devTools: false,
});
// This prevents creating multiple instances of the
// notification configuration window
if (this.notificationSettingsWindow && !this.notificationSettingsWindow.isDestroyed()) {
@ -669,7 +618,22 @@ export class WindowHandler {
const screenRect = indicatorScreen.workArea;
// Set stream id as winKey to link stream to the window
let opts = { ...WindowHandler.getScreenSharingIndicatorOpts(), ...{ winKey: streamId } };
let opts = {
...this.getWindowOpts({
width: 620,
height: 48,
show: false,
modal: true,
frame: false,
focusable: false,
transparent: true,
autoHideMenuBar: true,
resizable: false,
alwaysOnTop: true,
}, {
devTools: false,
}), ...{ winKey: streamId },
};
if (opts.width && opts.height) {
opts = Object.assign({}, opts, {
x: screenRect.x + Math.round((screenRect.width - opts.width) / 2),
@ -784,27 +748,6 @@ export class WindowHandler {
this.mainWindow = null;
}
/**
* Main window opts
*/
private getMainWindowOpts(): ICustomBrowserWindowConstructorOpts {
return {
alwaysOnTop: false,
frame: !this.isCustomTitleBar,
minHeight: 300,
minWidth: 300,
show: true,
title: 'Symphony',
webPreferences: {
nodeIntegration: false,
preload: path.join(__dirname, '../renderer/_preload-main.js'),
sandbox: true,
contextIsolation: false,
},
winKey: getGuid(),
};
}
/**
* Check if build is expired and show an error message
* @param browserWindow Focused window instance
@ -827,12 +770,35 @@ export class WindowHandler {
type: 'error',
title: i18n.t('Build expired')(),
message: i18n.t('Sorry, this is a test build and it has expired. Please contact your administrator to get a production build.')(),
buttons: [ i18n.t('Quit')()],
buttons: [ i18n.t('Quit')() ],
cancelId: 0,
};
electron.dialog.showMessageBox(browserWindow, options, response);
}
/**
* Returns constructor opts for the browser window
*
* @param windowOpts {Electron.BrowserWindowConstructorOptions}
* @param webPreferences {Electron.WebPreferences}
*/
private getWindowOpts(windowOpts: Electron.BrowserWindowConstructorOptions, webPreferences: Electron.WebPreferences): ICustomBrowserWindowConstructorOpts {
const defaultPreferencesOpts = {
...{
sandbox: true,
nodeIntegration: false,
contextIsolation: this.contextIsolation,
}, ...webPreferences,
};
const defaultWindowOpts = {
alwaysOnTop: false,
webPreferences: defaultPreferencesOpts,
winKey: getGuid(),
};
return { ...defaultWindowOpts, ...windowOpts };
}
}
const windowHandler = new WindowHandler();