// Copyright 2015-2019 Parity Technologies (UK) Ltd. // This file is part of Parity. // // SPDX-License-Identifier: BSD-3-Clause /** * Preload script is run before Electron loads the guest page into * the renderer so it still has access to Electron and Node.js APIs * allowing us to use it to define a gated API in an isolated context that * only exposes the bare minimum functionality that the Fether web app * requires (instead of unrestricted access to Node.js file system and * network stack). * * Reference: https://slack.engineering/interops-labyrinth-sharing-code-between-web-electron-apps-f9474d62eccc */ const { ipcRenderer, remote } = require('electron'); const IS_PROD = remote.getGlobal('IS_PROD'); function init () { console.log( `Initialising Electron Preload Script in environment: ${ IS_PROD ? 'production' : 'development' }` ); /** * Expose only a bridging API to the Fether web app. * Set methods on global `window`. Additional methods added later by web app * * Do not expose functionality or APIs that could compromise the computer * such as core Electron (i.e. `electron`, `remote`), IPC (`ipcRenderer`) * or Node.js modules like `require`. * * Note however that we require `ipcRenderer` to be exposed for communication * between the main process and the renderer process. Hence why * we have had no other choice but to set `contextIsolation: false` * * Example 1: Do not expose as `window.bridge.electron` or `window.bridge.remote`. * Example 2: `require` should not be defined in Chrome Developer Tools Console. */ window.bridge = { currentWindowWebContentsAddListener: remote.getCurrentWindow().webContents .addListener, currentWindowWebContentsRemoveListener: remote.getCurrentWindow() .webContents.removeListener, currentWindowWebContentsReload: remote.getCurrentWindow().webContents .reload, defaultWsInterface: remote.getGlobal('defaultWsInterface'), defaultWsPort: remote.getGlobal('defaultWsPort'), ipcRenderer, isParityRunningStatus: remote.getGlobal('isParityRunning'), IS_PROD, wsPort: remote.getGlobal('wsPort') }; } init();