sandbox.html 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  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. const currentLocation = location.href.slice();
  51. process.on('exit', () => {
  52. ipcRenderer.send('answer', currentLocation)
  53. })
  54. location.assign('http://www.google.com')
  55. },
  56. 'window-open': () => {
  57. addEventListener('load', () => {
  58. const popup = open(window.location.href, 'popup!', 'top=60,left=50,width=500,height=600')
  59. popup.addEventListener('DOMContentLoaded', () => {
  60. popup.document.write('<h1>scripting from opener</h1>')
  61. popup.callback()
  62. }, false)
  63. })
  64. },
  65. 'window-open-external': () => {
  66. const {ipcRenderer} = require('electron')
  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. const {ipcRenderer} = require('electron')
  85. const popup = open()
  86. ipcRenderer.once('verified', () => {
  87. ipcRenderer.send('parent-answer')
  88. })
  89. popup.ipcRenderer.once('verified', () => {
  90. popup.ipcRenderer.send('child-answer')
  91. })
  92. ipcRenderer.send('parent-ready')
  93. popup.ipcRenderer.send('child-ready')
  94. }
  95. }
  96. addEventListener('unload', () => {
  97. if (window.popup)
  98. popup.close()
  99. }, false)
  100. if (tests.hasOwnProperty(test))
  101. tests[test]()
  102. }
  103. </script>
  104. </html>