From e8a79cb88d98c572ad34bc8a86c917ae8f2f3aa3 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Thu, 23 Feb 2017 10:01:27 -0800 Subject: [PATCH] Don't require browser process module from renderer This can cause issues when it is accessed from the require cache or module tree since the getters throw errors when called. --- lib/browser/api/exports/electron.js | 25 ++++++++------- lib/renderer/api/remote.js | 49 ++++++++++++++++++++++------- 2 files changed, 50 insertions(+), 24 deletions(-) diff --git a/lib/browser/api/exports/electron.js b/lib/browser/api/exports/electron.js index 9a486b575dc7..904f0bab73d8 100644 --- a/lib/browser/api/exports/electron.js +++ b/lib/browser/api/exports/electron.js @@ -5,6 +5,7 @@ common.defineProperties(exports) Object.defineProperties(exports, { // Browser side modules, please sort with alphabet order. + // Any new modules added here must also be added to the array in remote.js app: { enumerable: true, get: function () { @@ -35,18 +36,18 @@ Object.defineProperties(exports, { return require('../dialog') } }, - ipcMain: { - enumerable: true, - get: function () { - return require('../ipc-main') - } - }, globalShortcut: { enumerable: true, get: function () { return require('../global-shortcut') } }, + ipcMain: { + enumerable: true, + get: function () { + return require('../ipc-main') + } + }, Menu: { enumerable: true, get: function () { @@ -59,6 +60,12 @@ Object.defineProperties(exports, { return require('../menu-item') } }, + net: { + enumerable: true, + get: function () { + return require('../net') + } + }, powerMonitor: { enumerable: true, get: function () { @@ -107,12 +114,6 @@ Object.defineProperties(exports, { return require('../web-contents') } }, - net: { - enumerable: true, - get: function () { - return require('../net') - } - }, // The internal modules, invisible unless you know their names. NavigationController: { diff --git a/lib/renderer/api/remote.js b/lib/renderer/api/remote.js index 8258a91a6619..240aa22d8924 100644 --- a/lib/renderer/api/remote.js +++ b/lib/renderer/api/remote.js @@ -288,18 +288,6 @@ ipcRenderer.on('ELECTRON_RENDERER_RELEASE_CALLBACK', function (event, id) { callbacksRegistry.remove(id) }) -// List all built-in modules in browser process. -const browserModules = require('../../browser/api/exports/electron') - -// And add a helper receiver for each one. -for (let name of Object.getOwnPropertyNames(browserModules)) { - Object.defineProperty(exports, name, { - get: function () { - return exports.getBuiltin(name) - } - }) -} - // Get remote module. exports.require = function (module) { return metaToValue(ipcRenderer.sendSync('ELECTRON_BROWSER_REQUIRE', module)) @@ -344,3 +332,40 @@ exports.getGuestWebContents = function (guestInstanceId) { const meta = ipcRenderer.sendSync('ELECTRON_BROWSER_GUEST_WEB_CONTENTS', guestInstanceId) return metaToValue(meta) } + +const addBuiltinProperty = (name) => { + Object.defineProperty(exports, name, { + get: function () { + return exports.getBuiltin(name) + } + }) +} + +// Add each browser module name as a property +// This list should match the exports in browser/api/exports/electron.js +const browserModules = [ + 'app', + 'autoUpdater', + 'BrowserWindow', + 'contentTracing', + 'dialog', + 'globalShortcut', + 'ipcMain', + 'Menu', + 'MenuItem', + 'net', + 'powerMonitor', + 'powerSaveBlocker', + 'protocol', + 'screen', + 'session', + 'systemPreferences', + 'Tray', + 'webContents' +] +browserModules.forEach(addBuiltinProperty) + +// Add each common module name as a property +const commonModules = {} +require('../../common/api/exports/electron').defineProperties(commonModules) +Object.getOwnPropertyNames(commonModules).forEach(addBuiltinProperty)