Browse Source

fix: emit process 'loaded' event in sandboxed renderers (#17807)

Milan Burda 6 years ago
parent
commit
66c5a8362a

+ 2 - 0
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<v8::Local<v8::Value>>());
 }
 
 void AtomSandboxedRendererClient::WillReleaseScriptContext(

+ 5 - 0
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

+ 13 - 0
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({

+ 5 - 0
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