diff --git a/app/common/remote.ts b/app/common/remote.ts index 49638de3..5ac1d17f 100644 --- a/app/common/remote.ts +++ b/app/common/remote.ts @@ -1,4 +1,7 @@ import electron from "electron"; export const {app, dialog} = - process.type === "renderer" ? electron.remote : electron; + process.type === "renderer" + ? // eslint-disable-next-line @typescript-eslint/no-require-imports, @typescript-eslint/no-var-requires + (require("@electron/remote") as typeof import("@electron/remote")) + : electron; diff --git a/app/main/index.ts b/app/main/index.ts index 33b765bb..71a88a36 100644 --- a/app/main/index.ts +++ b/app/main/index.ts @@ -2,6 +2,7 @@ import electron, {app, dialog, session} from "electron"; import fs from "fs"; import path from "path"; +import * as remoteMain from "@electron/remote/main"; import windowStateKeeper from "electron-window-state"; import * as ConfigUtil from "../common/config-util"; @@ -66,7 +67,6 @@ function createMainWindow(): Electron.BrowserWindow { minHeight: 400, webPreferences: { contextIsolation: false, - enableRemoteModule: true, nodeIntegration: true, partition: "persist:webviewsession", webviewTag: true, @@ -74,6 +74,7 @@ function createMainWindow(): Electron.BrowserWindow { }, show: false, }); + remoteMain.enable(win.webContents); win.on("focus", () => { send(win.webContents, "focus"); @@ -145,6 +146,8 @@ function createMainWindow(): Electron.BrowserWindow { // Used for notifications on Windows app.setAppUserModelId("org.zulip.zulip-electron"); + remoteMain.initialize(); + app.on("second-instance", () => { if (mainWindow) { if (mainWindow.isMinimized()) { diff --git a/app/renderer/js/components/context-menu.ts b/app/renderer/js/components/context-menu.ts index 35a0d45d..50a6403b 100644 --- a/app/renderer/js/components/context-menu.ts +++ b/app/renderer/js/components/context-menu.ts @@ -1,10 +1,9 @@ import type {ContextMenuParams} from "electron"; -import {remote} from "electron"; + +import {Menu, clipboard} from "@electron/remote"; import * as t from "../../../common/translation-util"; -const {clipboard, Menu} = remote; - export const contextMenu = ( webContents: Electron.WebContents, event: Event, diff --git a/app/renderer/js/components/handle-external-link.ts b/app/renderer/js/components/handle-external-link.ts index 2bfcc4d8..e7829803 100644 --- a/app/renderer/js/components/handle-external-link.ts +++ b/app/renderer/js/components/handle-external-link.ts @@ -1,4 +1,4 @@ -import {remote} from "electron"; +import {app, shell} from "@electron/remote"; import * as ConfigUtil from "../../../common/config-util"; import {ipcRenderer} from "../typed-ipc-renderer"; @@ -6,8 +6,6 @@ import * as LinkUtil from "../utils/link-util"; import type WebView from "./webview"; -const {shell, app} = remote; - const dingSound = new Audio("../resources/sounds/ding.ogg"); export default function handleExternalLink( diff --git a/app/renderer/js/components/webview.ts b/app/renderer/js/components/webview.ts index f877fed0..51fe7cee 100644 --- a/app/renderer/js/components/webview.ts +++ b/app/renderer/js/components/webview.ts @@ -1,7 +1,9 @@ -import {remote} from "electron"; import fs from "fs"; import path from "path"; +import * as remote from "@electron/remote"; +import {app, dialog} from "@electron/remote"; + import * as ConfigUtil from "../../../common/config-util"; import {HTML, html} from "../../../common/html"; import type {RendererMessage} from "../../../common/typed-ipc"; @@ -13,8 +15,6 @@ import {generateNodeFromHTML} from "./base"; import {contextMenu} from "./context-menu"; import handleExternalLink from "./handle-external-link"; -const {app, dialog} = remote; - const shouldSilentWebview = ConfigUtil.getConfigItem("silent", false); interface WebViewProps { diff --git a/app/renderer/js/main.ts b/app/renderer/js/main.ts index 15719efa..ec21b1ae 100644 --- a/app/renderer/js/main.ts +++ b/app/renderer/js/main.ts @@ -1,6 +1,9 @@ -import {clipboard, remote} from "electron"; +import {clipboard} from "electron"; import path from "path"; +import {Menu, app, dialog, session} from "@electron/remote"; +import * as remote from "@electron/remote"; + import type {Config} from "../../common/config-util"; import * as ConfigUtil from "../../common/config-util"; import * as DNDUtil from "../../common/dnd-util"; @@ -21,8 +24,6 @@ import * as DomainUtil from "./utils/domain-util"; import * as LinkUtil from "./utils/link-util"; import ReconnectUtil from "./utils/reconnect-util"; -const {session, app, Menu, dialog} = remote; - type WebviewListener = | "webview-reload" | "back" diff --git a/app/renderer/js/pages/about.ts b/app/renderer/js/pages/about.ts index 4ec69835..060fe5ac 100644 --- a/app/renderer/js/pages/about.ts +++ b/app/renderer/js/pages/about.ts @@ -1,9 +1,7 @@ -import {remote} from "electron"; +import {app} from "@electron/remote"; import {html} from "../../../common/html"; -const {app} = remote; - export class AboutView { readonly $view: HTMLElement; diff --git a/app/renderer/js/pages/preference/general-section.ts b/app/renderer/js/pages/preference/general-section.ts index 6300fdec..51cd1d82 100644 --- a/app/renderer/js/pages/preference/general-section.ts +++ b/app/renderer/js/pages/preference/general-section.ts @@ -1,8 +1,9 @@ import type {OpenDialogOptions} from "electron"; -import {remote} from "electron"; import fs from "fs"; import path from "path"; +import * as remote from "@electron/remote"; +import {app, dialog, session} from "@electron/remote"; import Tagify from "@yaireo/tagify"; import ISO6391 from "iso-639-1"; import * as z from "zod"; @@ -16,7 +17,6 @@ import {ipcRenderer} from "../../typed-ipc-renderer"; import {generateSelectHTML, generateSettingOption} from "./base-section"; -const {app, dialog, session} = remote; const currentBrowserWindow = remote.getCurrentWindow(); interface GeneralSectionProps { diff --git a/app/renderer/js/pages/preference/new-server-form.ts b/app/renderer/js/pages/preference/new-server-form.ts index a6f40bc4..a674f467 100644 --- a/app/renderer/js/pages/preference/new-server-form.ts +++ b/app/renderer/js/pages/preference/new-server-form.ts @@ -1,4 +1,4 @@ -import {remote} from "electron"; +import {dialog} from "@electron/remote"; import {html} from "../../../../common/html"; import * as t from "../../../../common/translation-util"; @@ -7,8 +7,6 @@ import {ipcRenderer} from "../../typed-ipc-renderer"; import * as DomainUtil from "../../utils/domain-util"; import * as LinkUtil from "../../utils/link-util"; -const {dialog} = remote; - interface NewServerFormProps { $root: Element; onChange: () => void; diff --git a/app/renderer/js/pages/preference/server-info-form.ts b/app/renderer/js/pages/preference/server-info-form.ts index e3dc8afb..28d11ecd 100644 --- a/app/renderer/js/pages/preference/server-info-form.ts +++ b/app/renderer/js/pages/preference/server-info-form.ts @@ -1,4 +1,4 @@ -import {remote} from "electron"; +import {dialog} from "@electron/remote"; import {html} from "../../../../common/html"; import * as Messages from "../../../../common/messages"; @@ -8,8 +8,6 @@ import {generateNodeFromHTML} from "../../components/base"; import {ipcRenderer} from "../../typed-ipc-renderer"; import * as DomainUtil from "../../utils/domain-util"; -const {dialog} = remote; - interface ServerInfoFormProps { $root: Element; server: ServerConf; diff --git a/app/renderer/js/tray.ts b/app/renderer/js/tray.ts index 13d1db44..5c024209 100644 --- a/app/renderer/js/tray.ts +++ b/app/renderer/js/tray.ts @@ -1,15 +1,14 @@ import type {NativeImage} from "electron"; -import {remote} from "electron"; import path from "path"; +import {BrowserWindow, Menu, Tray, nativeImage} from "@electron/remote"; + import * as ConfigUtil from "../../common/config-util"; import type {RendererMessage} from "../../common/typed-ipc"; import type {ServerManagerView} from "./main"; import {ipcRenderer} from "./typed-ipc-renderer"; -const {Tray, Menu, nativeImage, BrowserWindow} = remote; - let tray: Electron.Tray | null = null; const ICON_DIR = "../../resources/tray"; diff --git a/app/renderer/js/utils/domain-util.ts b/app/renderer/js/utils/domain-util.ts index 8ee7caa6..827ba92b 100644 --- a/app/renderer/js/utils/domain-util.ts +++ b/app/renderer/js/utils/domain-util.ts @@ -1,7 +1,7 @@ -import {remote} from "electron"; import fs from "fs"; import path from "path"; +import {app, dialog} from "@electron/remote"; import {JsonDB} from "node-json-db"; import {DataError} from "node-json-db/dist/lib/Errors"; import * as z from "zod"; @@ -12,8 +12,6 @@ import * as Messages from "../../../common/messages"; import type {ServerConf} from "../../../common/types"; import {ipcRenderer} from "../typed-ipc-renderer"; -const {app, dialog} = remote; - const logger = new Logger({ file: "domain-util.log", }); diff --git a/package-lock.json b/package-lock.json index ed13ba8a..c384cd5e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -425,6 +425,10 @@ } } }, + "@electron/remote": { + "version": "github:andersk/electron-remote#9436ea742cf2e7a56780be0a079c6a490ff5540d", + "from": "github:andersk/electron-remote#2.0.6-fixes" + }, "@electron/universal": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/@electron/universal/-/universal-1.0.5.tgz", diff --git a/package.json b/package.json index 81c6d454..120504dd 100644 --- a/package.json +++ b/package.json @@ -146,6 +146,7 @@ "InstantMessaging" ], "dependencies": { + "@electron/remote": "github:andersk/electron-remote#2.0.6-fixes", "@sentry/electron": "^2.5.1", "@yaireo/tagify": "^4.5.0", "adm-zip": "^0.5.5",