| 
									
										
										
										
											2020-07-08 21:19:49 -07:00
										 |  |  | /* global binding */ | 
					
						
							| 
									
										
										
										
											2020-05-30 02:56:54 -07:00
										 |  |  | import * as events from 'events'; | 
					
						
							| 
									
										
										
										
											2020-10-13 23:11:06 +02:00
										 |  |  | import { IPC_MESSAGES } from '@electron/internal/common/ipc-messages'; | 
					
						
							| 
									
										
										
										
											2020-05-30 02:56:54 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-05-06 03:05:01 +02:00
										 |  |  | import type * as ipcRendererUtilsModule from '@electron/internal/renderer/ipc-renderer-internal-utils'; | 
					
						
							|  |  |  | import type * as ipcRendererInternalModule from '@electron/internal/renderer/ipc-renderer-internal'; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-30 23:24:00 +02:00
										 |  |  | const { EventEmitter } = events; | 
					
						
							| 
									
										
										
										
											2016-08-21 07:30:14 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-06-22 20:32:45 -07:00
										 |  |  | process._linkedBinding = binding.get; | 
					
						
							| 
									
										
										
										
											2017-02-20 10:59:39 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-06-22 20:32:45 -07:00
										 |  |  | const v8Util = process._linkedBinding('electron_common_v8_util'); | 
					
						
							| 
									
										
										
										
											2019-06-02 13:03:03 -07:00
										 |  |  | // Expose Buffer shim as a hidden value. This is used by C++ code to
 | 
					
						
							| 
									
										
										
										
											2017-03-16 13:20:09 -03:00
										 |  |  | // deserialize Buffer instances sent from browser process.
 | 
					
						
							|  |  |  | v8Util.setHiddenValue(global, 'Buffer', Buffer); | 
					
						
							| 
									
										
										
										
											2019-06-02 13:03:03 -07:00
										 |  |  | // The process object created by webpack is not an event emitter, fix it so
 | 
					
						
							| 
									
										
										
										
											2017-02-27 14:14:36 -03:00
										 |  |  | // the API is more compatible with non-sandboxed renderers.
 | 
					
						
							| 
									
										
										
										
											2020-05-30 02:56:54 -07:00
										 |  |  | for (const prop of Object.keys(EventEmitter.prototype) as (keyof typeof process)[]) { | 
					
						
							| 
									
										
										
										
											2020-03-20 08:12:18 -07:00
										 |  |  |   if (Object.prototype.hasOwnProperty.call(process, prop)) { | 
					
						
							| 
									
										
										
										
											2017-02-27 14:14:36 -03:00
										 |  |  |     delete process[prop]; | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2016-08-21 07:30:14 -03:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2018-09-30 23:24:00 +02:00
										 |  |  | Object.setPrototypeOf(process, EventEmitter.prototype); | 
					
						
							| 
									
										
										
										
											2016-08-21 07:30:14 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-05-06 03:05:01 +02:00
										 |  |  | const { ipcRendererInternal } = require('@electron/internal/renderer/ipc-renderer-internal') as typeof ipcRendererInternalModule; | 
					
						
							|  |  |  | const ipcRendererUtils = require('@electron/internal/renderer/ipc-renderer-internal-utils') as typeof ipcRendererUtilsModule; | 
					
						
							| 
									
										
										
										
											2018-12-05 19:07:56 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-11-23 20:39:08 +01:00
										 |  |  | const { preloadScripts, process: processProps } = ipcRendererUtils.invokeSync(IPC_MESSAGES.BROWSER_SANDBOX_LOAD); | 
					
						
							| 
									
										
										
										
											2018-12-05 19:07:56 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | const electron = require('electron'); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-06-02 02:32:32 -07:00
										 |  |  | const loadedModules = new Map<string, any>([ | 
					
						
							| 
									
										
										
										
											2017-03-21 10:41:23 -03:00
										 |  |  |   ['electron', electron], | 
					
						
							| 
									
										
										
										
											2020-06-01 17:37:02 -07:00
										 |  |  |   ['electron/common', electron], | 
					
						
							|  |  |  |   ['electron/renderer', electron], | 
					
						
							| 
									
										
										
										
											2020-06-02 02:32:32 -07:00
										 |  |  |   ['events', events] | 
					
						
							|  |  |  | ]); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | const loadableModules = new Map<string, Function>([ | 
					
						
							|  |  |  |   ['timers', () => require('timers')], | 
					
						
							|  |  |  |   ['url', () => require('url')] | 
					
						
							| 
									
										
										
										
											2016-08-21 07:30:14 -03:00
										 |  |  | ]); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-04-13 14:32:29 -07:00
										 |  |  | // ElectronSandboxedRendererClient will look for the "lifecycle" hidden object when
 | 
					
						
							| 
									
										
										
										
											2019-04-02 15:38:16 -07:00
										 |  |  | v8Util.setHiddenValue(global, 'lifecycle', { | 
					
						
							| 
									
										
										
										
											2019-04-04 20:35:06 +02:00
										 |  |  |   onLoaded () { | 
					
						
							| 
									
										
										
										
											2020-05-30 02:56:54 -07:00
										 |  |  |     (process as events.EventEmitter).emit('loaded'); | 
					
						
							| 
									
										
										
										
											2019-04-04 20:35:06 +02:00
										 |  |  |   }, | 
					
						
							| 
									
										
										
										
											2019-04-02 15:38:16 -07:00
										 |  |  |   onExit () { | 
					
						
							| 
									
										
										
										
											2020-05-30 02:56:54 -07:00
										 |  |  |     (process as events.EventEmitter).emit('exit'); | 
					
						
							| 
									
										
										
										
											2019-04-02 15:38:16 -07:00
										 |  |  |   }, | 
					
						
							|  |  |  |   onDocumentStart () { | 
					
						
							| 
									
										
										
										
											2020-05-30 02:56:54 -07:00
										 |  |  |     (process as events.EventEmitter).emit('document-start'); | 
					
						
							| 
									
										
										
										
											2019-04-02 15:38:16 -07:00
										 |  |  |   }, | 
					
						
							|  |  |  |   onDocumentEnd () { | 
					
						
							| 
									
										
										
										
											2020-05-30 02:56:54 -07:00
										 |  |  |     (process as events.EventEmitter).emit('document-end'); | 
					
						
							| 
									
										
										
										
											2019-04-02 15:38:16 -07:00
										 |  |  |   } | 
					
						
							|  |  |  | }); | 
					
						
							| 
									
										
										
										
											2019-03-07 19:00:28 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-06-22 20:32:45 -07:00
										 |  |  | // Pass different process object to the preload script.
 | 
					
						
							| 
									
										
										
										
											2020-05-30 02:56:54 -07:00
										 |  |  | const preloadProcess: NodeJS.Process = new EventEmitter() as any; | 
					
						
							| 
									
										
										
										
											2018-09-26 07:44:55 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-30 23:24:00 +02:00
										 |  |  | Object.assign(preloadProcess, binding.process); | 
					
						
							| 
									
										
										
										
											2018-08-21 20:05:45 +02:00
										 |  |  | Object.assign(preloadProcess, processProps); | 
					
						
							| 
									
										
										
										
											2018-09-30 23:24:00 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | Object.assign(process, binding.process); | 
					
						
							| 
									
										
										
										
											2018-08-21 20:05:45 +02:00
										 |  |  | Object.assign(process, processProps); | 
					
						
							| 
									
										
										
										
											2018-05-21 09:56:05 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-10-06 07:30:31 +09:00
										 |  |  | process.getProcessMemoryInfo = preloadProcess.getProcessMemoryInfo = () => { | 
					
						
							|  |  |  |   return ipcRendererInternal.invoke<Electron.ProcessMemoryInfo>(IPC_MESSAGES.BROWSER_GET_PROCESS_MEMORY_INFO); | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-12-05 10:34:09 +01:00
										 |  |  | Object.defineProperty(preloadProcess, 'noDeprecation', { | 
					
						
							|  |  |  |   get () { | 
					
						
							|  |  |  |     return process.noDeprecation; | 
					
						
							|  |  |  |   }, | 
					
						
							|  |  |  |   set (value) { | 
					
						
							|  |  |  |     process.noDeprecation = value; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-05-30 02:56:54 -07:00
										 |  |  | process.on('loaded', () => (preloadProcess as events.EventEmitter).emit('loaded')); | 
					
						
							|  |  |  | process.on('exit', () => (preloadProcess as events.EventEmitter).emit('exit')); | 
					
						
							|  |  |  | (process as events.EventEmitter).on('document-start', () => (preloadProcess as events.EventEmitter).emit('document-start')); | 
					
						
							|  |  |  | (process as events.EventEmitter).on('document-end', () => (preloadProcess as events.EventEmitter).emit('document-end')); | 
					
						
							| 
									
										
										
										
											2017-02-27 14:14:36 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  | // This is the `require` function that will be visible to the preload script
 | 
					
						
							| 
									
										
										
										
											2020-05-30 02:56:54 -07:00
										 |  |  | function preloadRequire (module: string) { | 
					
						
							| 
									
										
										
										
											2018-05-21 09:56:05 -03:00
										 |  |  |   if (loadedModules.has(module)) { | 
					
						
							|  |  |  |     return loadedModules.get(module); | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2020-06-02 02:32:32 -07:00
										 |  |  |   if (loadableModules.has(module)) { | 
					
						
							|  |  |  |     const loadedModule = loadableModules.get(module)!(); | 
					
						
							|  |  |  |     loadedModules.set(module, loadedModule); | 
					
						
							|  |  |  |     return loadedModule; | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2019-03-19 20:00:41 +01:00
										 |  |  |   throw new Error(`module not found: ${module}`); | 
					
						
							| 
									
										
										
										
											2016-08-21 07:30:14 -03:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-01-22 02:08:16 +01:00
										 |  |  | // Process command line arguments.
 | 
					
						
							| 
									
										
										
										
											2020-06-22 20:32:45 -07:00
										 |  |  | const { hasSwitch } = process._linkedBinding('electron_common_command_line'); | 
					
						
							| 
									
										
										
										
											2019-01-03 17:22:34 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-06-22 20:32:45 -07:00
										 |  |  | // Similar to nodes --expose-internals flag, this exposes _linkedBinding so
 | 
					
						
							| 
									
										
										
										
											2020-05-15 11:57:40 -07:00
										 |  |  | // that tests can call it to get access to some test only bindings
 | 
					
						
							|  |  |  | if (hasSwitch('unsafely-expose-electron-internals-for-testing')) { | 
					
						
							| 
									
										
										
										
											2020-06-22 20:32:45 -07:00
										 |  |  |   preloadProcess._linkedBinding = process._linkedBinding; | 
					
						
							| 
									
										
										
										
											2020-05-15 11:57:40 -07:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-11-10 01:59:33 +01:00
										 |  |  | // Common renderer initialization
 | 
					
						
							|  |  |  | require('@electron/internal/renderer/common-init'); | 
					
						
							| 
									
										
										
										
											2018-07-02 09:06:26 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-27 14:14:36 -03:00
										 |  |  | // Wrap the script into a function executed in global scope. It won't have
 | 
					
						
							|  |  |  | // access to the current scope, so we'll expose a few objects as arguments:
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | // - `require`: The `preloadRequire` function
 | 
					
						
							|  |  |  | // - `process`: The `preloadProcess` object
 | 
					
						
							| 
									
										
										
										
											2019-06-02 13:03:03 -07:00
										 |  |  | // - `Buffer`: Shim of `Buffer` implementation
 | 
					
						
							|  |  |  | // - `global`: The window object, which is aliased to `global` by webpack.
 | 
					
						
							| 
									
										
										
										
											2020-05-30 02:56:54 -07:00
										 |  |  | function runPreloadScript (preloadSrc: string) { | 
					
						
							| 
									
										
										
										
											2019-03-12 00:13:46 +01:00
										 |  |  |   const preloadWrapperSrc = `(function(require, process, Buffer, global, setImmediate, clearImmediate, exports) {
 | 
					
						
							| 
									
										
										
										
											2018-03-22 00:15:57 -07:00
										 |  |  |   ${preloadSrc} | 
					
						
							|  |  |  |   })`;
 | 
					
						
							| 
									
										
										
										
											2016-08-21 07:30:14 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-07-12 21:17:11 -05:00
										 |  |  |   // eval in window scope
 | 
					
						
							|  |  |  |   const preloadFn = binding.createPreloadScript(preloadWrapperSrc); | 
					
						
							| 
									
										
										
										
											2018-09-14 02:10:51 +10:00
										 |  |  |   const { setImmediate, clearImmediate } = require('timers'); | 
					
						
							| 
									
										
										
										
											2019-01-18 12:03:43 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-03-12 00:13:46 +01:00
										 |  |  |   preloadFn(preloadRequire, preloadProcess, Buffer, global, setImmediate, clearImmediate, {}); | 
					
						
							| 
									
										
										
										
											2019-01-18 12:03:43 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-01-29 02:16:46 +01:00
										 |  |  | for (const { preloadPath, preloadSrc, preloadError } of preloadScripts) { | 
					
						
							|  |  |  |   try { | 
					
						
							|  |  |  |     if (preloadSrc) { | 
					
						
							|  |  |  |       runPreloadScript(preloadSrc); | 
					
						
							|  |  |  |     } else if (preloadError) { | 
					
						
							| 
									
										
										
										
											2019-10-10 15:59:08 +02:00
										 |  |  |       throw preloadError; | 
					
						
							| 
									
										
										
										
											2019-01-29 02:16:46 +01:00
										 |  |  |     } | 
					
						
							|  |  |  |   } catch (error) { | 
					
						
							|  |  |  |     console.error(`Unable to load preload script: ${preloadPath}`); | 
					
						
							| 
									
										
										
										
											2019-07-15 00:54:33 -04:00
										 |  |  |     console.error(error); | 
					
						
							| 
									
										
										
										
											2019-01-29 02:16:46 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-10-13 23:11:06 +02:00
										 |  |  |     ipcRendererInternal.send(IPC_MESSAGES.BROWSER_PRELOAD_ERROR, preloadPath, error); | 
					
						
							| 
									
										
										
										
											2019-01-18 12:03:43 +01:00
										 |  |  |   } | 
					
						
							| 
									
										
										
										
											2018-03-22 00:15:57 -07:00
										 |  |  | } |