| <!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> |