sandbox.html 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. <html>
  2. <script type="text/javascript" charset="utf-8">
  3. function timeout(ms) {
  4. return new Promise((resolve) => {
  5. setTimeout(resolve, ms)
  6. })
  7. }
  8. async function invokeGc () {
  9. // it seems calling window.gc once does not guarantee garbage will be
  10. // collected, so we repeat 10 times with interval of 100 ms
  11. for (let i = 0; i < 10; i++) {
  12. window.gc()
  13. await timeout(100)
  14. }
  15. }
  16. const [,test] = window.location.href.split('?')
  17. if (window.opener && test !== 'reload-remote') {
  18. window.callback = () => {
  19. opener.require('electron').ipcRenderer.send('answer', document.body.innerHTML)
  20. }
  21. } else {
  22. const tests = {
  23. 'reload-remote-child': () => {
  24. open(`${location.protocol}//${location.pathname}?reload-remote`)
  25. },
  26. 'reload-remote': async () => {
  27. const {ipcRenderer, remote} = require('electron')
  28. const p = ipcRenderer.sendSync('get-remote-module-path')
  29. const Hello = remote.require(p)
  30. if (!ipcRenderer.sendSync('reloaded')) {
  31. ipcRenderer.send('reload')
  32. return
  33. }
  34. await invokeGc()
  35. ipcRenderer.send('answer', new Hello().say())
  36. },
  37. 'webcontents-stop': () => {
  38. stop()
  39. },
  40. 'webcontents-events': () => {
  41. addEventListener('load', () => {
  42. location.hash = 'in-page-navigate'
  43. setTimeout(() => {
  44. location.reload()
  45. }, 50)
  46. })
  47. },
  48. 'exit-event': () => {
  49. const {ipcRenderer} = require('electron')
  50. process.on('exit', () => {
  51. ipcRenderer.send('answer', location.href)
  52. })
  53. location.assign('http://www.google.com')
  54. },
  55. 'window-open': () => {
  56. addEventListener('load', () => {
  57. popup = open(window.location.href, 'popup!', 'top=60,left=50,width=500,height=600')
  58. popup.addEventListener('DOMContentLoaded', () => {
  59. popup.document.write('<h1>scripting from opener</h1>')
  60. popup.callback()
  61. }, false)
  62. })
  63. },
  64. 'window-open-external': () => {
  65. const {ipcRenderer} = require('electron')
  66. addEventListener('load', () => {
  67. ipcRenderer.once('open-the-popup', (event, url) => {
  68. popup = open(url, '', 'top=65,left=55,width=505,height=605')
  69. })
  70. ipcRenderer.once('touch-the-popup', () => {
  71. let errorMessage = null
  72. try {
  73. const childDoc = popup.document
  74. } catch (error) {
  75. errorMessage = error.message
  76. }
  77. ipcRenderer.send('answer', errorMessage)
  78. })
  79. ipcRenderer.send('opener-loaded')
  80. })
  81. },
  82. 'verify-ipc-sender': () => {
  83. const {ipcRenderer} = require('electron')
  84. popup = open()
  85. ipcRenderer.once('verified', () => {
  86. ipcRenderer.send('parent-answer')
  87. })
  88. popup.ipcRenderer.once('verified', () => {
  89. popup.ipcRenderer.send('child-answer')
  90. })
  91. ipcRenderer.send('parent-ready')
  92. popup.ipcRenderer.send('child-ready')
  93. }
  94. }
  95. addEventListener('unload', () => {
  96. if (window.popup)
  97. popup.close()
  98. }, false)
  99. if (tests.hasOwnProperty(test))
  100. tests[test]()
  101. }
  102. </script>
  103. </html>