| <!DOCTYPE HTML> |
| <meta charset=utf-8> |
| <title>Document.currentScript</title> |
| <link rel=help href="https://html.spec.whatwg.org/multipage/#dom-document-currentscript"> |
| <link rel=help href="https://html.spec.whatwg.org/multipage/#execute-the-script-block"> |
| <script src="/resources/testharness.js"></script> |
| <script src="/resources/testharnessreport.js"></script> |
| <div id="log"></div> |
| <script> |
| var data = { |
| "parse-inline" : [], |
| "parse-ext" : [], |
| "dom-inline" : [], |
| "dom-ext" : [], |
| "nested" : ["nested-outer","nested-inner","nested-outer"], |
| "script-exec" : ["script-exec-before-after","script-exec-before-after"], |
| "script-load-error" : [null], |
| "script-window-error" : ["script-error-compile","script-error-runtime"], |
| "timeout" : [null], |
| "eval" : [], |
| "xhr-test" : [], |
| "script-svg" : [], |
| "script-async" : [], |
| "script-defer" : [], |
| "script-async-false" : [], |
| "iframe-src" : [], |
| "cross-origin" : [null], |
| "document-write" : [] |
| }; |
| |
| var expected = {}; |
| var actual = {}; |
| |
| Object.keys(data).forEach(function(id) { |
| var test_expected = data[id]; |
| if(test_expected.length == 0) { |
| test_expected = [id]; |
| } |
| expected[id] = test_expected; |
| actual[id] = []; |
| }); |
| |
| var tests = {}; |
| setup({allow_uncaught_exception : true}); |
| |
| Object.keys(expected).forEach(function(id) { |
| var testmsg = "Script " + id; |
| tests[id] = async_test(testmsg); |
| }); |
| |
| function verify(id) { |
| tests[id].step(function() { |
| actual[id].push(document.currentScript); |
| }) |
| } |
| |
| function finish(id) { |
| tests[id].step(function() { |
| assert_array_equals(actual[id],expected[id].map(function(id) { |
| return document.getElementById(id); |
| })); |
| this.done(); |
| }) |
| } |
| |
| </script> |
| |
| <!-- Test parser inserted scripts --> |
| <script id="parse-inline"> |
| verify('parse-inline'); |
| finish('parse-inline') |
| </script> |
| <script id="parse-ext" src="data:text/plain,verify('parse-ext')"></script> |
| <script>finish('parse-ext');</script> |
| |
| <!-- Test DOM inserted scripts --> |
| <script> |
| var s = document.createElement("script"); |
| s.textContent = "verify('dom-inline');"; |
| s.id = "dom-inline"; |
| document.body.appendChild(s); |
| finish('dom-inline'); |
| |
| s = document.createElement("script"); |
| s.src = "data:text/plain,verify('dom-ext');"; |
| s.id = "dom-ext"; |
| s.onload = function() { |
| finish('dom-ext'); |
| } |
| document.body.appendChild(s); |
| </script> |
| |
| <!-- Test Nested scripts --> |
| <script id="nested-outer"> |
| verify("nested"); |
| var s = document.createElement("script"); |
| s.textContent = "verify('nested')"; |
| s.id = "nested-inner"; |
| document.body.appendChild(s); |
| verify("nested"); |
| finish('nested'); |
| </script> |
| |
| <!-- Test beforescriptexecute and afterscriptexecute --> |
| <script id="script-exec-before-after"> |
| function verifyScriptExec(e) { |
| verify('script-exec'); |
| } |
| |
| document.addEventListener('beforescriptexecute', verifyScriptExec, false); |
| document.addEventListener('afterscriptexecute', verifyScriptExec, false); |
| |
| var s = document.createElement("script"); |
| s.id = "script-exec-test"; |
| s.textContent = "function nop() { return false }"; |
| document.body.appendChild(s); |
| |
| document.removeEventListener('beforescriptexecute', verifyScriptExec); |
| document.removeEventListener('afterscriptexecute', verifyScriptExec); |
| |
| finish('script-exec'); |
| </script> |
| |
| <!-- Test script load error event listener --> |
| <script> |
| function testLoadFail() { |
| verify('script-load-error'); |
| finish('script-load-error'); |
| } |
| </script> |
| |
| <script src="http://some.nonexistant.test/fail" id="script-load-error" onerror="testLoadFail()"> |
| </script> |
| |
| <!-- Test for runtime and compile time errors --> |
| <script> |
| window.onerror = function() { |
| verify('script-window-error'); |
| } |
| |
| var s = document.createElement("script"); |
| s.id = "script-error-compile"; |
| s.textContent = "{"; |
| document.body.appendChild(s); |
| |
| window.onerror = function() { |
| verify('script-window-error'); |
| } |
| |
| s = document.createElement("script"); |
| s.id = "script-error-runtime"; |
| s.textContent = "undefinedfn();"; |
| document.body.appendChild(s); |
| |
| finish('script-window-error'); |
| </script> |
| |
| <!-- Verify in setTimeout --> |
| <script> |
| setTimeout(function() { |
| verify('timeout'); |
| finish('timeout'); |
| },0); |
| </script> |
| |
| <!-- Verify in eval --> |
| <script id="eval"> |
| eval('verify("eval")'); |
| finish("eval"); |
| </script> |
| |
| <!-- Verify in synchronous xhr --> |
| <script id="xhr-test"> |
| var request = new XMLHttpRequest(); |
| request.open('GET','/',false); |
| request.send(null); |
| |
| if(request.status === 200) { |
| verify('xhr-test'); |
| finish('xhr-test'); |
| } |
| </script> |
| |
| <!-- Testing script within svg --> |
| <svg> |
| <script id="script-svg"> |
| verify('script-svg'); |
| finish('script-svg'); |
| </script> |
| </svg> |
| |
| <!-- Test script async and defer --> |
| <script id='script-async' async src='data:text/plain,verify("script-async"),finish("script-async")'></script> |
| |
| <script id='script-defer' defer src='data:text/plain,verify("script-defer"),finish("script-defer")'></script> |
| |
| <!-- Test async = false dynamic script loading --> |
| <script> |
| var s = document.createElement("script"); |
| s.id = "script-async-false"; |
| s.src = "data:text/plain,verify('script-async-false');" |
| s.onload = function() { |
| finish('script-async-false'); |
| } |
| s.async = false; |
| document.body.appendChild(s); |
| </script> |
| |
| <!-- Verify in iframe javascript uri scheme --> |
| <iframe src="javascript:parent.verify('iframe-src'),parent.finish('iframe-src')" |
| style="visibility:hidden;display:none"> |
| </iframe> |
| |
| <!-- Testing cross origin script --> |
| <script> |
| var s = document.createElement("script"); |
| s.id = "cross-origin"; |
| s.src = "http://{{domains[www1]}}:{{ports[http][1]}}/html/dom/documents/dom-tree-accessors/cross-domain.js" |
| s.onload = function() { |
| verify('cross-origin') |
| finish('cross-origin'); |
| } |
| document.body.appendChild(s); |
| |
| </script> |
| |
| <!-- Testing document.write --> |
| <script> |
| document.write('<script id="document-write">verify("document-write"); finish("document-write");</' + 'script>'); |
| </script> |