| <!DOCTYPE html> |
| <html> |
| <head> |
| <meta charset=utf-8> |
| <title>HTML: Document.prototype.currentScript</title> |
| <meta name="author" title="Ryosuke Niwa" href="mailto:rniwa@webkit.org"> |
| <meta name="assert" content="If the script element is in a document, then set the script element's node document's currentScript attribute to the script element."> |
| <link rel="help" href="https://html.spec.whatwg.org/multipage/scripting.html#execute-the-script-block"> |
| <script src="/resources/testharness.js"></script> |
| <script src="/resources/testharnessreport.js"></script> |
| </head> |
| <body> |
| <div id="log"></div> |
| <script id="outerScriptElement"> |
| |
| function assert_shadowdom_supported() { |
| assert_true('attachShadow' in document.createElement('div'), 'Shadow DOM is not supported'); |
| } |
| |
| var outerScriptElement = document.currentScript; |
| |
| function testInlineScript(mode) |
| { |
| test(function () { |
| assert_shadowdom_supported(); |
| var host = document.createElement('div'); |
| var shadowRoot = host.attachShadow({mode: mode}); |
| var scriptElement = document.createElement('script'); |
| scriptElement.textContent = 'assert_equals(document.currentScript, null)'; |
| shadowRoot.appendChild(scriptElement); |
| |
| assert_equals(document.currentScript, outerScriptElement, |
| 'document.currentScript must be set to the currently excusing script element in a document tree before executing a script in a shadow tree'); |
| document.body.appendChild(host); |
| assert_equals(document.currentScript, outerScriptElement, |
| 'document.currentScript must be set to the currently excusing script element in a document tree after executing a script in a shadow tree'); |
| |
| }, 'document.currentScript must not to be set to a script element in a shadow tree in ' + mode + ' mode'); |
| } |
| |
| testInlineScript('open'); |
| testInlineScript('closed'); |
| |
| var executeExternalScript = null; |
| var testedScriptElement = null; |
| function executeNextTest() |
| { |
| var testCase = asyncScriptTests.shift(); |
| if (!testCase) |
| return; |
| |
| var mode = testCase.mode; |
| |
| testCase.test.add_cleanup(() => { |
| setTimeout(executeNextTest, 1); |
| }); |
| testCase.test.step(function () { |
| assert_shadowdom_supported(); |
| testedScriptElement = document.createElement('script'); |
| testedScriptElement.src = 'resources/Document-prototype-currentScript-helper.js'; |
| |
| if (mode !== null) { |
| var host = document.createElement('div'); |
| var shadowRoot = host.attachShadow({mode: mode}); |
| shadowRoot.appendChild(testedScriptElement); |
| document.body.appendChild(host); |
| } else { |
| document.body.appendChild(testedScriptElement); |
| } |
| |
| if (testCase.remove) |
| testedScriptElement.parentNode.removeChild(testedScriptElement); |
| }); |
| |
| executeExternalScript = function () { |
| testCase.test.step(function () { |
| assert_equals(document.currentScript, testCase.expected()); |
| }); |
| testCase.test.done(); |
| } |
| } |
| |
| var asyncScriptTests = [ |
| { |
| test: async_test('document.currentScript must be set to a script element that loads an external script in a document tree'), |
| mode: null, remove: false, expected: function () { return testedScriptElement; }}, |
| { |
| test: async_test('document.currentScript must be set to a script element that loads an external script in a document tree (2)'), |
| mode: null, remove: true, expected: function () { return testedScriptElement; }}, |
| { |
| test: async_test('document.currentScript must not be set to a script element that loads an external script in an open shadow tree'), |
| mode: 'open', remove: false, expected: function () { return null; }}, |
| { |
| test: async_test('document.currentScript must not be set to a script element that loads an external script in a closed shadow tree'), |
| mode: 'closed', remove: false, expected: function () { return null; }}, |
| { |
| test: async_test('document.currentScript must be set to a script element that loads an external script that was in an open shadow tree and then removed'), |
| mode: 'open', remove: true, expected: function () { return testedScriptElement; }}, |
| { |
| test: async_test('document.currentScript must be set to a script element that loads an external script that was in a closed shadow tree and then removed'), |
| mode: 'closed', remove: true, expected: function () { return testedScriptElement; }}, |
| ]; |
| |
| executeNextTest(); |
| |
| </script> |
| </body> |
| </html> |