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 {ipcRenderer, remote} = require('electron')
  23. const tests = {
  24. 'reload-remote-child': () => {
  25. open(`${location.protocol}//${location.pathname}?reload-remote`)
  26. },
  27. 'reload-remote': async () => {
  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. 'window-events': () => {
  38. document.title = 'changed'
  39. },
  40. 'webcontents-stop': () => {
  41. stop()
  42. },
  43. 'webcontents-events': () => {
  44. addEventListener('load', () => {
  45. location.hash = 'in-page-navigate'
  46. setTimeout(() => {
  47. location.reload()
  48. }, 50)
  49. })
  50. },
  51. 'exit-event': () => {
  52. process.on('exit', () => {
  53. ipcRenderer.send('answer', location.href)
  54. })
  55. location.assign('http://www.google.com')
  56. },
  57. 'window-open': () => {
  58. addEventListener('load', () => {
  59. popup = open(window.location.href, 'popup!', 'top=60,left=50,width=500,height=600')
  60. popup.addEventListener('DOMContentLoaded', () => {
  61. popup.document.write('<h1>scripting from opener</h1>')
  62. popup.callback()
  63. }, false)
  64. })
  65. },
  66. 'window-open-external': () => {
  67. addEventListener('load', () => {
  68. ipcRenderer.once('open-the-popup', (event, url) => {
  69. popup = open(url, '', 'top=65,left=55,width=505,height=605')
  70. })
  71. ipcRenderer.once('touch-the-popup', () => {
  72. let errorMessage = null
  73. try {
  74. const childDoc = popup.document
  75. } catch (error) {
  76. errorMessage = error.message
  77. }
  78. ipcRenderer.send('answer', errorMessage)
  79. })
  80. ipcRenderer.send('opener-loaded')
  81. })
  82. },
  83. 'verify-ipc-sender': () => {
  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>