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.
This commit is contained in:
Kevin Sawicki 2017-02-23 10:01:27 -08:00
parent 51d6a55061
commit e8a79cb88d
2 changed files with 50 additions and 24 deletions

View file

@ -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: {

View file

@ -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)