init.ts 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. import '@electron/internal/sandboxed_renderer/pre-init';
  2. import { IPC_MESSAGES } from '@electron/internal/common/ipc-messages';
  3. import type * as ipcRendererUtilsModule from '@electron/internal/renderer/ipc-renderer-internal-utils';
  4. import { createPreloadProcessObject, executeSandboxedPreloadScripts } from '@electron/internal/sandboxed_renderer/preload';
  5. import * as events from 'events';
  6. import { setImmediate, clearImmediate } from 'timers';
  7. declare const binding: {
  8. process: NodeJS.Process;
  9. createPreloadScript: (src: string) => Function
  10. };
  11. const ipcRendererUtils = require('@electron/internal/renderer/ipc-renderer-internal-utils') as typeof ipcRendererUtilsModule;
  12. const {
  13. preloadScripts,
  14. process: processProps
  15. } = ipcRendererUtils.invokeSync<{
  16. preloadScripts: ElectronInternal.PreloadScript[];
  17. process: NodeJS.Process;
  18. }>(IPC_MESSAGES.BROWSER_SANDBOX_LOAD);
  19. const electron = require('electron');
  20. const loadedModules = new Map<string, any>([
  21. ['electron', electron],
  22. ['electron/common', electron],
  23. ['electron/renderer', electron],
  24. ['events', events],
  25. ['node:events', events]
  26. ]);
  27. const loadableModules = new Map<string, Function>([
  28. ['timers', () => require('timers')],
  29. ['node:timers', () => require('timers')],
  30. ['url', () => require('url')],
  31. ['node:url', () => require('url')]
  32. ]);
  33. const preloadProcess = createPreloadProcessObject();
  34. // InvokeEmitProcessEvent in ElectronSandboxedRendererClient will look for this
  35. const v8Util = process._linkedBinding('electron_common_v8_util');
  36. v8Util.setHiddenValue(global, 'emit-process-event', (event: string) => {
  37. (process as events.EventEmitter).emit(event);
  38. (preloadProcess as events.EventEmitter).emit(event);
  39. });
  40. Object.assign(preloadProcess, binding.process);
  41. Object.assign(preloadProcess, processProps);
  42. Object.assign(process, processProps);
  43. // Common renderer initialization
  44. require('@electron/internal/renderer/common-init');
  45. executeSandboxedPreloadScripts({
  46. loadedModules,
  47. loadableModules,
  48. process: preloadProcess,
  49. createPreloadScript: binding.createPreloadScript,
  50. exposeGlobals: {
  51. Buffer,
  52. // FIXME(samuelmaddock): workaround webpack bug replacing this with just
  53. // `__webpack_require__.g,` which causes script error
  54. global: globalThis,
  55. setImmediate,
  56. clearImmediate
  57. }
  58. }, preloadScripts);