diff --git a/package.json b/package.json index 1de9bffa..79cbc399 100644 --- a/package.json +++ b/package.json @@ -15,7 +15,7 @@ "build:clean": "cross-env BUILD_TARGET=clean node .electron-vue/build.js", "build:dev": "node .electron-vue/build.js", "dev": "cross-env node .electron-vue/dev-runner.js", - "e2e": "yarn run pack && cross-env MARKTEXT_EXIT_ON_ERROR=1 mocha --timeout 10000 test/e2e", + "e2e": "yarn run pack && cross-env MARKTEXT_EXIT_ON_ERROR=1 playwright test -c test/e2e/playwright.config.js test/e2e", "lint": "eslint --ext .js,.vue -f ./node_modules/eslint-friendly-formatter src test", "lint:fix": "eslint --ext .js,.vue -f ./node_modules/eslint-friendly-formatter --fix src test", "pack": "yarn run pack:main && yarn run pack:renderer", @@ -33,6 +33,7 @@ "validate-licenses": "node tools/validateLicenses.js" }, "dependencies": { + "@electron/remote": "^2.0.1", "@hfelix/electron-localshortcut": "^3.1.1", "@hfelix/electron-spellchecker": "^2.0.0", "@octokit/rest": "^16.43.2", @@ -98,6 +99,7 @@ "@babel/register": "^7.16.0", "@babel/runtime": "^7.16.3", "@markedjs/html-differ": "^3.0.4", + "@playwright/test": "^1.17.1", "babel-eslint": "^10.1.0", "babel-loader": "^8.2.3", "babel-plugin-component": "^1.1.1", @@ -112,7 +114,7 @@ "del": "^5.1.0", "devtron": "^1.4.0", "dotenv": "^10.0.0", - "electron": "^13.6.1", + "electron": "^15.3.4", "electron-builder": "^22.14.8", "electron-devtools-installer": "^3.2.0", "electron-rebuild": "^3.2.5", @@ -148,11 +150,11 @@ "multispinner": "^0.2.1", "node-fetch": "^2.6.6", "node-loader": "^1.0.3", + "playwright": "^1.17.1", "postcss-loader": "^3.0.0", "postcss-preset-env": "^6.7.0", "raw-loader": "^4.0.2", "require-dir": "^1.2.0", - "spectron": "^15.0.0", "style-loader": "^2.0.0", "svg-sprite-loader": "^4.3.0", "svgo": "^1.3.2", diff --git a/src/main/config.js b/src/main/config.js index 69c2602d..7420487f 100644 --- a/src/main/config.js +++ b/src/main/config.js @@ -6,7 +6,6 @@ export const editorWinOptions = Object.freeze({ minWidth: 550, minHeight: 350, webPreferences: { - enableRemoteModule: true, contextIsolation: false, spellcheck: false, nodeIntegration: true, @@ -23,7 +22,6 @@ export const preferencesWinOptions = Object.freeze({ width: 950, height: 650, webPreferences: { - enableRemoteModule: true, contextIsolation: false, spellcheck: false, nodeIntegration: true, diff --git a/src/main/index.js b/src/main/index.js index ed83ed17..13f158e1 100644 --- a/src/main/index.js +++ b/src/main/index.js @@ -1,6 +1,7 @@ import './globalSetting' import path from 'path' import { app, dialog } from 'electron' +import { initialize as remoteInitializeServer } from '@electron/remote/main' import cli from './cli' import setupExceptionHandler, { initExceptionLogger } from './exceptionHandler' import log from 'electron-log' @@ -12,10 +13,9 @@ import { getLogLevel } from './utils' const initializeLogger = appEnvironment => { log.transports.console.level = process.env.NODE_ENV === 'development' ? true : 'error' log.transports.rendererConsole = null - log.transports.file.file = path.join(appEnvironment.paths.logPath, 'main.log') + log.transports.file.resolvePath = () => path.join(appEnvironment.paths.logPath, 'main.log') log.transports.file.level = getLogLevel() log.transports.file.sync = true - log.transports.file.init() initExceptionLogger() } @@ -80,5 +80,9 @@ log.transports.file.sync = false // Be careful when changing code before this line! // NOTE: Do not create classes or other code before this line! +// TODO: We should switch to another async API like https://nornagon.medium.com/electrons-remote-module-considered-harmful-70d69500f31. +// Enable remote module +remoteInitializeServer() + const marktext = new App(accessor, args) marktext.init() diff --git a/src/main/windows/editor.js b/src/main/windows/editor.js index 2bae0f34..f40bd817 100644 --- a/src/main/windows/editor.js +++ b/src/main/windows/editor.js @@ -1,5 +1,6 @@ import path from 'path' import { BrowserWindow, dialog, ipcMain } from 'electron' +import { enable as remoteEnable } from '@electron/remote/main' import log from 'electron-log' import windowStateKeeper from 'electron-window-state' import { isChildOfDirectory, isSamePathSync } from 'common/filesystem/paths' @@ -68,6 +69,7 @@ class EditorWindow extends BaseWindow { winOptions.backgroundColor = this._getPreferredBackgroundColor(theme) let win = this.browserWindow = new BrowserWindow(winOptions) + remoteEnable(win.webContents) this.id = win.id // Create a menu for the current window diff --git a/src/main/windows/setting.js b/src/main/windows/setting.js index a704653e..9facbbbf 100644 --- a/src/main/windows/setting.js +++ b/src/main/windows/setting.js @@ -1,5 +1,6 @@ import path from 'path' import { BrowserWindow, ipcMain } from 'electron' +import { enable as remoteEnable } from '@electron/remote/main' import electronLocalshortcut from '@hfelix/electron-localshortcut' import BaseWindow, { WindowLifecycle, WindowType } from './base' import { centerWindowOptions } from './utils' @@ -45,6 +46,7 @@ class SettingWindow extends BaseWindow { winOptions.backgroundColor = this._getPreferredBackgroundColor(theme) let win = this.browserWindow = new BrowserWindow(winOptions) + remoteEnable(win.webContents) this.id = win.id // Create a menu for the current window diff --git a/src/renderer/bootstrap.js b/src/renderer/bootstrap.js index efd393ab..09ea54af 100644 --- a/src/renderer/bootstrap.js +++ b/src/renderer/bootstrap.js @@ -9,10 +9,9 @@ const configureLogger = () => { const { debug, paths, windowId } = global.marktext.env log.transports.console.level = process.env.NODE_ENV === 'development' // mirror to window console log.transports.mainConsole = null - log.transports.file.file = path.join(paths.logPath, `editor-${windowId}.log`) + log.transports.file.resolvePath = () => path.join(paths.logPath, `editor-${windowId}.log`) log.transports.file.level = debug ? 'debug' : 'info' log.transports.file.sync = false - log.transports.file.init() exceptionLogger = log.error } diff --git a/src/renderer/commands/index.js b/src/renderer/commands/index.js index 89c01a23..bf4b4ebe 100644 --- a/src/renderer/commands/index.js +++ b/src/renderer/commands/index.js @@ -1,5 +1,6 @@ // List of all static commands that are loaded into command center. -import { ipcRenderer, remote, shell } from 'electron' +import { ipcRenderer, shell } from 'electron' +import { getCurrentWindow } from '@electron/remote' import bus from '../bus' import { delay, isOsx } from '@/util' import { isUpdatable } from './utils' @@ -509,7 +510,7 @@ const commands = [ id: 'window.minimize', description: 'Window: Minimize', execute: async () => { - remote.getCurrentWindow().minimize() + getCurrentWindow().minimize() } }, { id: 'window.always-on-top', @@ -521,7 +522,7 @@ const commands = [ id: 'window.toggle-full-screen', description: 'Window: Toggle Full Screen', execute: async () => { - const win = remote.getCurrentWindow() + const win = getCurrentWindow() win.setFullScreen(!win.isFullScreen()) } }, diff --git a/src/renderer/components/titleBar/index.vue b/src/renderer/components/titleBar/index.vue index 94087230..94eb9b40 100644 --- a/src/renderer/components/titleBar/index.vue +++ b/src/renderer/components/titleBar/index.vue @@ -98,7 +98,8 @@