preload.ts 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  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) {
  34. const element = document.querySelector<HTMLElement>(selector);
  35. if (element) {
  36. element.innerText = text;
  37. }
  38. }
  39. replaceText('.electron-version', `Electron v${process.versions.electron}`);
  40. replaceText('.chrome-version', `Chromium v${process.versions.chrome}`);
  41. replaceText('.node-version', `Node v${process.versions.node}`);
  42. replaceText('.v8-version', `v8 v${process.versions.v8}`);
  43. replaceText('.command-example', `${electronPath} path-to-app`);
  44. for (const element of document.querySelectorAll<HTMLSpanElement>('.octicon')) {
  45. loadSVG(element);
  46. }
  47. }
  48. contextBridge.exposeInMainWorld('electronDefaultApp', {
  49. initialize
  50. });