Upgrade Electron from 13 to 16 (PR #1288)

https://www.electronjs.org/docs/latest/breaking-changes

Co-authored-by: Ronan Jouchet <ronan@jouchet.fr>
This commit is contained in:
Adam Weeden 2022-01-02 06:17:06 -05:00 committed by GitHub
parent 6f4ae587c4
commit d483597320
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
9 changed files with 771 additions and 817 deletions

View File

@ -17,7 +17,7 @@
"source-map-support": "^0.5.19"
},
"devDependencies": {
"electron": "^13.6.1"
"electron": "^16.0.5"
}
},
"node_modules/@electron/get": {
@ -64,9 +64,9 @@
}
},
"node_modules/@types/node": {
"version": "14.18.0",
"resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.0.tgz",
"integrity": "sha512-0GeIl2kmVMXEnx8tg1SlG6Gg8vkqirrW752KqolYo1PHevhhZN3bhJ67qHj+bQaINhX0Ra3TlWwRvMCd9iEfNQ==",
"version": "14.18.4",
"resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.4.tgz",
"integrity": "sha512-swe3lD4izOJWHuxvsZdDFRq6S9i6koJsXOnQKYekhSO5JTizMVirUFgY/bUsaOJQj8oSD4oxmRYPBM/0b6jpdw==",
"dev": true
},
"node_modules/ansi-regex": {
@ -296,13 +296,13 @@
"dev": true
},
"node_modules/electron": {
"version": "13.6.3",
"resolved": "https://registry.npmjs.org/electron/-/electron-13.6.3.tgz",
"integrity": "sha512-kevgR6/RuEhchJQbgCKhHle9HvJhi2dOJlicFZJqbbqa9BVpZARqqFDlwTSatYxmUPUJwu09FvyMwJG2DMQIng==",
"version": "16.0.5",
"resolved": "https://registry.npmjs.org/electron/-/electron-16.0.5.tgz",
"integrity": "sha512-TgQXWmEGQ3uH2P2JDq5GyJDEu/fimRgqp1iNisARtGreU1k3630PqWlR+4SPnSEHN9NuSv92ng6NWxtefeFzxg==",
"dev": true,
"hasInstallScript": true,
"dependencies": {
"@electron/get": "^1.0.1",
"@electron/get": "^1.13.0",
"@types/node": "^14.6.2",
"extract-zip": "^1.0.3"
},
@ -1241,9 +1241,9 @@
}
},
"@types/node": {
"version": "14.18.0",
"resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.0.tgz",
"integrity": "sha512-0GeIl2kmVMXEnx8tg1SlG6Gg8vkqirrW752KqolYo1PHevhhZN3bhJ67qHj+bQaINhX0Ra3TlWwRvMCd9iEfNQ==",
"version": "14.18.4",
"resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.4.tgz",
"integrity": "sha512-swe3lD4izOJWHuxvsZdDFRq6S9i6koJsXOnQKYekhSO5JTizMVirUFgY/bUsaOJQj8oSD4oxmRYPBM/0b6jpdw==",
"dev": true
},
"ansi-regex": {
@ -1422,12 +1422,12 @@
"dev": true
},
"electron": {
"version": "13.6.3",
"resolved": "https://registry.npmjs.org/electron/-/electron-13.6.3.tgz",
"integrity": "sha512-kevgR6/RuEhchJQbgCKhHle9HvJhi2dOJlicFZJqbbqa9BVpZARqqFDlwTSatYxmUPUJwu09FvyMwJG2DMQIng==",
"version": "16.0.5",
"resolved": "https://registry.npmjs.org/electron/-/electron-16.0.5.tgz",
"integrity": "sha512-TgQXWmEGQ3uH2P2JDq5GyJDEu/fimRgqp1iNisARtGreU1k3630PqWlR+4SPnSEHN9NuSv92ng6NWxtefeFzxg==",
"dev": true,
"requires": {
"@electron/get": "^1.0.1",
"@electron/get": "^1.13.0",
"@types/node": "^14.6.2",
"extract-zip": "^1.0.3"
}

View File

@ -20,6 +20,6 @@
"source-map-support": "^0.5.19"
},
"devDependencies": {
"electron": "^13.6.3"
"electron": "^16.0.5"
}
}

View File

@ -2,7 +2,7 @@ jest.mock('./helpers');
jest.mock('./windowEvents');
jest.mock('./windowHelpers');
import { dialog, BrowserWindow, WebContents } from 'electron';
import { dialog, BrowserWindow } from 'electron';
import { WindowOptions } from '../../../shared/src/options/model';
import { linkIsInternal, openExternal, nativeTabsSupported } from './helpers';
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
@ -371,7 +371,7 @@ describe('onWillPreventUnload', () => {
test('shows dialog and calls preventDefault on ok', () => {
mockShowDialog.mockReturnValue(0);
const event = { preventDefault, sender: new WebContents() };
const event = { preventDefault, sender: {} };
onWillPreventUnload(event);
expect(mockFromWebContents).toHaveBeenCalledWith(event.sender);
@ -382,7 +382,7 @@ describe('onWillPreventUnload', () => {
test('shows dialog and does not call preventDefault on cancel', () => {
mockShowDialog.mockReturnValue(1);
const event = { preventDefault, sender: new WebContents() };
const event = { preventDefault, sender: {} };
onWillPreventUnload(event);
expect(mockFromWebContents).toHaveBeenCalledWith(event.sender);

View File

@ -1,4 +1,4 @@
import { dialog, BrowserWindow, WebContents } from 'electron';
import { dialog, BrowserWindow } from 'electron';
jest.mock('loglevel');
import { error } from 'loglevel';
import { WindowOptions } from '../../../shared/src/options/model';
@ -102,35 +102,30 @@ describe('injectCSS', () => {
jest.setTimeout(10000);
const mockGetCSSToInject: jest.SpyInstance = getCSSToInject as jest.Mock;
let mockGetURL: jest.SpyInstance;
const mockLogError: jest.SpyInstance = error as jest.Mock;
const mockWebContentsInsertCSS: jest.SpyInstance = jest.spyOn(
WebContents.prototype,
'insertCSS',
);
const css = 'body { color: white; }';
let responseHeaders: Record<string, string[]>;
beforeEach(() => {
mockGetCSSToInject.mockReset().mockReturnValue('');
mockGetURL = jest
.spyOn(WebContents.prototype, 'getURL')
.mockReturnValue('https://example.com');
mockLogError.mockReset();
mockWebContentsInsertCSS.mockReset().mockResolvedValue(undefined);
responseHeaders = { 'x-header': ['value'], 'content-type': ['test/other'] };
});
afterAll(() => {
mockGetCSSToInject.mockRestore();
mockGetURL.mockRestore();
mockLogError.mockRestore();
mockWebContentsInsertCSS.mockRestore();
});
test('will not inject if getCSSToInject is empty', () => {
const window = new BrowserWindow();
const mockWebContentsInsertCSS: jest.SpyInstance = jest
.spyOn(window.webContents, 'insertCSS')
.mockResolvedValue('');
jest
.spyOn(window.webContents, 'getURL')
.mockReturnValue('https://example.com');
injectCSS(window);
@ -141,6 +136,12 @@ describe('injectCSS', () => {
test('will inject on did-navigate + onResponseStarted', () => {
mockGetCSSToInject.mockReturnValue(css);
const window = new BrowserWindow();
const mockWebContentsInsertCSS: jest.SpyInstance = jest
.spyOn(window.webContents, 'insertCSS')
.mockResolvedValue('');
jest
.spyOn(window.webContents, 'getURL')
.mockReturnValue('https://example.com');
injectCSS(window);
@ -162,6 +163,12 @@ describe('injectCSS', () => {
(contentType: string) => {
mockGetCSSToInject.mockReturnValue(css);
const window = new BrowserWindow();
const mockWebContentsInsertCSS: jest.SpyInstance = jest
.spyOn(window.webContents, 'insertCSS')
.mockResolvedValue('');
jest
.spyOn(window.webContents, 'getURL')
.mockReturnValue('https://example.com');
responseHeaders['content-type'] = [contentType];
@ -188,6 +195,12 @@ describe('injectCSS', () => {
(contentType: string) => {
mockGetCSSToInject.mockReturnValue(css);
const window = new BrowserWindow();
const mockWebContentsInsertCSS: jest.SpyInstance = jest
.spyOn(window.webContents, 'insertCSS')
.mockResolvedValue('');
jest
.spyOn(window.webContents, 'getURL')
.mockReturnValue('https://example.com');
responseHeaders['content-type'] = [contentType];
@ -214,6 +227,12 @@ describe('injectCSS', () => {
(resourceType: string) => {
mockGetCSSToInject.mockReturnValue(css);
const window = new BrowserWindow();
const mockWebContentsInsertCSS: jest.SpyInstance = jest
.spyOn(window.webContents, 'insertCSS')
.mockResolvedValue('');
jest
.spyOn(window.webContents, 'getURL')
.mockReturnValue('https://example.com');
injectCSS(window);
@ -239,6 +258,12 @@ describe('injectCSS', () => {
(resourceType: string) => {
mockGetCSSToInject.mockReturnValue(css);
const window = new BrowserWindow();
const mockWebContentsInsertCSS: jest.SpyInstance = jest
.spyOn(window.webContents, 'insertCSS')
.mockResolvedValue('');
jest
.spyOn(window.webContents, 'getURL')
.mockReturnValue('https://example.com');
injectCSS(window);

View File

@ -5,7 +5,6 @@ import * as path from 'path';
import electron, {
app,
crashReporter,
dialog,
globalShortcut,
systemPreferences,
@ -211,14 +210,6 @@ app.on('quit', (event, exitCode) => {
app.on('will-finish-launching', () => {
log.debug('app.will-finish-launching');
if (appArgs.crashReporter) {
crashReporter.start({
companyName: appArgs.companyName ?? '',
productName: appArgs.name,
submitURL: appArgs.crashReporter,
uploadToServer: true,
});
}
});
if (appArgs.widevine) {

1477
npm-shrinkwrap.json generated

File diff suppressed because it is too large Load Diff

View File

@ -45,7 +45,7 @@
"prepare": "cd app && npm ci && cd .. && npm run build",
"relock": "rm -rf ./node_modules/ ./app/node_modules/ ./npm-shrinkwrap.json ./app/npm-shrinkwrap.json && npm install --ignore-scripts --package-lock && mv package-lock.json npm-shrinkwrap.json && npm out; cd app && npm install --ignore-scripts --package-lock && mv package-lock.json npm-shrinkwrap.json && npm out",
"test:integration": "jest --testRegex '.*integration-test.js'",
"test:manual": "npm run build && ./.github/manual-test",
"test:manual": "npm run build && bash .github/manual-test",
"test:unit": "jest",
"test:watch": "echo 'Remember to run npm run build:watch for the test watcher to work!' && jest --watchAll --collectCoverage=false",
"test:withlog": "LOGLEVEL=trace npm run test",

View File

@ -4,13 +4,13 @@ export const DEFAULT_APP_NAME = 'APP';
// Update both DEFAULT_ELECTRON_VERSION and DEFAULT_CHROME_VERSION together,
// and update app / package.json / devDeps / electron to value of DEFAULT_ELECTRON_VERSION
export const DEFAULT_ELECTRON_VERSION = '13.6.3';
export const DEFAULT_ELECTRON_VERSION = '16.0.5';
// https://atom.io/download/atom-shell/index.json
export const DEFAULT_CHROME_VERSION = '91.0.4472.164';
export const DEFAULT_CHROME_VERSION = '96.0.4664.55';
// Update each of these periodically
// https://product-details.mozilla.org/1.0/firefox_versions.json
export const DEFAULT_FIREFOX_VERSION = '94.0.2';
export const DEFAULT_FIREFOX_VERSION = '95.0.2';
// https://en.wikipedia.org/wiki/Safari_version_history
export const DEFAULT_SAFARI_VERSION = {

View File

@ -27,7 +27,12 @@ export async function icon(options: IconParams): Promise<string | undefined> {
options.packager.platform,
);
} catch (err: unknown) {
log.warn('Cannot automatically retrieve the app icon:', err);
// eslint-disable-next-line
const errorUrl: string = (err as any)?.config?.url;
log.warn(
'Cannot automatically retrieve the app icon:',
errorUrl ? `${(err as Error).message} on ${errorUrl}` : err,
);
return undefined;
}
}