From 66c5a8362ac8869af08448576661f883f67d2ff4 Mon Sep 17 00:00:00 2001 From: Milan Burda Date: Wed, 17 Apr 2019 01:23:53 +0200 Subject: [PATCH] fix: emit process 'loaded' event in sandboxed renderers (#17807) --- atom/renderer/atom_sandboxed_renderer_client.cc | 2 ++ lib/sandboxed_renderer/init.js | 5 +++++ spec/api-browser-window-spec.js | 13 +++++++++++++ spec/fixtures/module/preload-sandbox.js | 5 +++++ 4 files changed, 25 insertions(+) diff --git a/atom/renderer/atom_sandboxed_renderer_client.cc b/atom/renderer/atom_sandboxed_renderer_client.cc index 2461c024a37ea..b2900e698a7f1 100644 --- a/atom/renderer/atom_sandboxed_renderer_client.cc +++ b/atom/renderer/atom_sandboxed_renderer_client.cc @@ -232,6 +232,8 @@ void AtomSandboxedRendererClient::DidCreateScriptContext( // Execute the function with proper arguments ignore_result( func->Call(context, v8::Null(isolate), node::arraysize(args), args)); + + InvokeIpcCallback(context, "onLoaded", std::vector>()); } void AtomSandboxedRendererClient::WillReleaseScriptContext( diff --git a/lib/sandboxed_renderer/init.js b/lib/sandboxed_renderer/init.js index fe20f45c9e2bf..c6fb38cb94b78 100644 --- a/lib/sandboxed_renderer/init.js +++ b/lib/sandboxed_renderer/init.js @@ -58,6 +58,10 @@ ipcNative.onMessage = function (channel, args, senderId) { electron.ipcRenderer.emit(channel, { sender: electron.ipcRenderer, senderId }, ...args) } +ipcNative.onLoaded = function () { + process.emit('loaded') +} + ipcNative.onExit = function () { process.emit('exit') } @@ -90,6 +94,7 @@ Object.assign(preloadProcess, processProps) Object.assign(process, binding.process) Object.assign(process, processProps) +process.on('loaded', () => preloadProcess.emit('loaded')) process.on('exit', () => preloadProcess.emit('exit')) // This is the `require` function that will be visible to the preload script diff --git a/spec/api-browser-window-spec.js b/spec/api-browser-window-spec.js index 30c13ddbb15ea..0c82370cf45bf 100644 --- a/spec/api-browser-window-spec.js +++ b/spec/api-browser-window-spec.js @@ -1527,6 +1527,19 @@ describe('BrowserWindow module', () => { w.loadFile(path.join(fixtures, 'api', 'preload.html')) }) + it('exposes "loaded" event to preload script', function (done) { + w.destroy() + w = new BrowserWindow({ + show: false, + webPreferences: { + sandbox: true, + preload + } + }) + ipcMain.once('process-loaded', () => done()) + w.loadURL('about:blank') + }) + it('exposes "exit" event to preload script', function (done) { w.destroy() w = new BrowserWindow({ diff --git a/spec/fixtures/module/preload-sandbox.js b/spec/fixtures/module/preload-sandbox.js index 750ebdbc0392b..aaab2ab94d1c1 100644 --- a/spec/fixtures/module/preload-sandbox.js +++ b/spec/fixtures/module/preload-sandbox.js @@ -4,6 +4,11 @@ window.ipcRenderer = ipcRenderer window.setImmediate = setImmediate window.require = require + + process.once('loaded', () => { + ipcRenderer.send('process-loaded') + }) + if (location.protocol === 'file:') { window.test = 'preload' window.process = process