| <!DOCTYPE HTML> | |
| <html> | |
| <head> | |
| <title>Example with iframe that notifies containing document via callbacks</title> | |
| <script src="../testharness.js"></script> | |
| <script src="../testharnessreport.js"></script> | |
| </head> | |
| <body onload="start_test_in_iframe()"> | |
| <h1>Callbacks From Tests Running In An IFRAME</h1> | |
| <p>A test is run inside an <tt>iframe</tt> with a same origin document. The | |
| containing document should receive callbacks as the tests progress inside the | |
| <tt>iframe</tt>. A single passing test is expected in the summary below. | |
| <div id="log"></div> | |
| <script> | |
| var callbacks = []; | |
| var START = 1 | |
| var TEST_STATE = 2 | |
| var RESULT = 3 | |
| var COMPLETION = 4 | |
| var test_complete = false; | |
| setup({explicit_done: true}); | |
| // The following callbacks are called for tests in this document as well as the | |
| // tests in the IFRAME. Currently, callbacks invoked from this document and any | |
| // child document are indistinguishable from each other. | |
| function start_callback(properties) { | |
| callbacks.push(START); | |
| } | |
| function test_state_callback(test) { | |
| callbacks.push(TEST_STATE); | |
| } | |
| function result_callback(test) { | |
| callbacks.push(RESULT); | |
| } | |
| function completion_callback(tests, status) { | |
| if (test_complete) { | |
| return; | |
| } | |
| test_complete = true; | |
| callbacks.push(COMPLETION); | |
| verify_received_callbacks(); | |
| done(); | |
| } | |
| function verify_received_callbacks() { | |
| var copy_of_callbacks = callbacks.slice(0); | |
| // Note that you can't run test assertions directly in a callback even if | |
| // this is a file test. When the callback is invoked from a same-origin child | |
| // page, the callstack reaches into the calling child document. Any | |
| // exception thrown in a callback will be handled by the child rather than | |
| // this document. | |
| test( | |
| function() { | |
| // callbacks list should look like: | |
| // START 1*(TEST_STATE) RESULT COMPLETION | |
| assert_equals(copy_of_callbacks.shift(), START, | |
| "The first received callback should be 'start_callback'."); | |
| assert_equals(copy_of_callbacks.shift(), TEST_STATE, | |
| "'test_state_callback' should be received before any " + | |
| "result or completion callbacks."); | |
| while(copy_of_callbacks.length > 0) { | |
| var callback = copy_of_callbacks.shift(); | |
| if (callback != TEST_STATE) { | |
| copy_of_callbacks.unshift(callback); | |
| break; | |
| } | |
| } | |
| assert_equals(copy_of_callbacks.shift(), RESULT, | |
| "'test_state_callback' should be followed by 'result_callback'."); | |
| assert_equals(copy_of_callbacks.shift(), COMPLETION, | |
| "Final 'result_callback' should be followed by 'completion_callback'."); | |
| assert_equals(copy_of_callbacks.length, 0, | |
| "'completion_callback' should be the last callback."); | |
| }); | |
| } | |
| function start_test_in_iframe() { | |
| // This document is going to clear any received callbacks and maintain | |
| // radio silence until the test in the iframe runs to completion. The | |
| // completion_callback() will then complete the testing on this document. | |
| callbacks.length = 0; | |
| var iframe = document.createElement("iframe"); | |
| // apisample6.html has a single test. | |
| iframe.src = "apisample6.html"; | |
| iframe.style.setProperty("display", "none"); | |
| document.getElementById("target").appendChild(iframe); | |
| } | |
| </script> | |
| <div id="target"> | |
| </div> | |
| </body> |