(function () {
  const { setImmediate } = require('timers');
  const { ipcRenderer } = require('electron');
  window.ipcRenderer = ipcRenderer;
  window.setImmediate = setImmediate;
  window.require = require;

  function invoke (code) {
    try {
      return code();
    } catch {
      return null;
    }
  }

  process.once('loaded', () => {
    ipcRenderer.send('process-loaded');
  });

  if (location.protocol === 'file:') {
    window.test = 'preload';
    window.process = process;
    if (process.env.sandboxmain) {
      window.test = {
        osSandbox: !process.argv.includes('--no-sandbox'),
        hasCrash: typeof process.crash === 'function',
        hasHang: typeof process.hang === 'function',
        creationTime: invoke(() => process.getCreationTime()),
        heapStatistics: invoke(() => process.getHeapStatistics()),
        blinkMemoryInfo: invoke(() => process.getBlinkMemoryInfo()),
        processMemoryInfo: invoke(() => process.getProcessMemoryInfo()),
        systemMemoryInfo: invoke(() => process.getSystemMemoryInfo()),
        systemVersion: invoke(() => process.getSystemVersion()),
        cpuUsage: invoke(() => process.getCPUUsage()),
        ioCounters: invoke(() => process.getIOCounters()),
        env: process.env,
        execPath: process.execPath,
        pid: process.pid,
        arch: process.arch,
        platform: process.platform,
        sandboxed: process.sandboxed,
        type: process.type,
        version: process.version,
        versions: process.versions
      };
    }
  } else if (location.href !== 'about:blank') {
    addEventListener('DOMContentLoaded', () => {
      ipcRenderer.on('touch-the-opener', () => {
        let errorMessage = null;
        try {
          const openerDoc = opener.document; // eslint-disable-line no-unused-vars
        } catch (error) {
          errorMessage = error.message;
        }
        ipcRenderer.send('answer', errorMessage);
      });
      ipcRenderer.send('child-loaded', window.opener == null, document.body.innerHTML, location.href);
    });
  }
})();
