preload.ts 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. const { ipcRenderer, contextBridge } = require('electron/renderer');
  2. const policy = window.trustedTypes.createPolicy('electron-default-app', {
  3. // we trust the SVG contents
  4. createHTML: input => input
  5. });
  6. async function getOcticonSvg (name: string) {
  7. try {
  8. const response = await fetch(`octicon/${name}.svg`);
  9. const div = document.createElement('div');
  10. div.innerHTML = policy.createHTML(await response.text());
  11. return div;
  12. } catch {
  13. return null;
  14. }
  15. }
  16. async function loadSVG (element: HTMLSpanElement) {
  17. for (const cssClass of element.classList) {
  18. if (cssClass.startsWith('octicon-')) {
  19. const icon = await getOcticonSvg(cssClass.substr(8));
  20. if (icon) {
  21. for (const elemClass of element.classList) {
  22. icon.classList.add(elemClass);
  23. }
  24. element.before(icon);
  25. element.remove();
  26. break;
  27. }
  28. }
  29. }
  30. }
  31. async function initialize () {
  32. const electronPath = await ipcRenderer.invoke('bootstrap');
  33. function replaceText (selector: string, text: string, link?: string) {
  34. const element = document.querySelector<HTMLElement>(selector);
  35. if (element) {
  36. if (link) {
  37. const anchor = document.createElement('a');
  38. anchor.textContent = text;
  39. anchor.href = link;
  40. anchor.target = '_blank';
  41. element.appendChild(anchor);
  42. } else {
  43. element.innerText = text;
  44. }
  45. }
  46. }
  47. replaceText('.electron-version', `Electron v${process.versions.electron}`, 'https://electronjs.org/docs');
  48. replaceText('.chrome-version', `Chromium v${process.versions.chrome}`, 'https://developer.chrome.com/docs/chromium');
  49. replaceText('.node-version', `Node v${process.versions.node}`, `https://nodejs.org/docs/v${process.versions.node}/api`);
  50. replaceText('.v8-version', `v8 v${process.versions.v8}`, 'https://v8.dev/docs');
  51. replaceText('.command-example', `${electronPath} path-to-app`);
  52. for (const element of document.querySelectorAll<HTMLSpanElement>('.octicon')) {
  53. loadSVG(element);
  54. }
  55. }
  56. contextBridge.exposeInMainWorld('electronDefaultApp', {
  57. initialize
  58. });