| <html> |
| <script> |
| // When both timeouts finish, the counter will be 2. |
| window.completionCounter = 0; |
| function test() |
| { |
| if (window.testRunner) { |
| testRunner.dumpAsText(); |
| testRunner.waitUntilDone(); |
| } |
| |
| // Get the iframe's window. |
| var mainWindow = window; |
| var iframeWindow = window.frames["testIframe"]; |
| |
| // setTimeout with a callback specified as a JS closure. |
| // This one should run in the context of the main page. |
| iframeWindow.setTimeout( |
| function() { |
| document.getElementById("closureResult").innerText = (window == mainWindow ? "PASS" : "FAIL"); |
| completionCounter++; |
| }, 0); |
| |
| // setTimeout with a JS string containing similar code. |
| // This one should run 'inside' iframe. |
| mainWindow.setTimeout.call( |
| iframeWindow, |
| "parent.document.getElementById('stringResult').innerText = (window != parent ? 'PASS' : 'FAIL');" + |
| "parent.completionCounter++;", |
| 0); |
| |
| // The callback this value must be the context object. |
| iframeWindow.setTimeout.call(window, function() { |
| document.getElementById("contextResult").innerText = (this == mainWindow ? "PASS" : "FAIL"); |
| completionCounter++; |
| }, 0); |
| |
| window.setInterval(checkResult, 10); |
| } |
| function checkResult() { |
| if (completionCounter < 3) |
| return; |
| if (window.testRunner) |
| testRunner.notifyDone(); |
| } |
| </script> |
| <body onload="test()"> |
| <p>Test verifies that a timeout callback is run in the proper execution context. 3 timeouts are set on a child iframe's window. Test passes if you see 3 lines 'PASS' below. See also: |
| <a href="https://html.spec.whatwg.org/multipage/webappapis.html#timer-initialisation-steps">https://html.spec.whatwg.org/multipage/webappapis.html#timer-initialisation-steps</a></p> |
| |
| <div><span id="closureResult">FAIL: Test didn't run.</span> -- function argument: if the argument is a function, then the callback function must run in the relevant realm for that function object.</div> |
| <div><span id="stringResult">FAIL: Test didn't run.</span> -- string argument: if the argument is a string, then it must be compiled in the relevant realm for the context object, hence must run in the relevant realm for the context object.</div> |
| <div><span id="contextResult">FAIL: Test didn't run.</span> -- callback this value: the callback this value must be the context object.</div> |
| <iframe style="display:none" src="about:blank" name="testIframe"></iframe> |
| </body> |
| </html> |