Index: LayoutTests/http/tests/security/contentSecurityPolicy/resources/frame-ancestors-test.js |
diff --git a/LayoutTests/http/tests/security/contentSecurityPolicy/resources/frame-ancestors-test.js b/LayoutTests/http/tests/security/contentSecurityPolicy/resources/frame-ancestors-test.js |
new file mode 100644 |
index 0000000000000000000000000000000000000000..e467a9d83e58ce2ad2eea0b6f90eb18f40d67a5d |
--- /dev/null |
+++ b/LayoutTests/http/tests/security/contentSecurityPolicy/resources/frame-ancestors-test.js |
@@ -0,0 +1,113 @@ |
+var SAME_ORIGIN = true; |
+var CROSS_ORIGIN = false; |
+ |
+var EXPECT_BLOCK = true; |
+var EXPECT_LOAD = false; |
+ |
+var SAMEORIGIN_ORIGIN = "http://127.0.0.1:8000"; |
+var CROSSORIGIN_ORIGIN = "http://localhost:8080"; |
+ |
+window.jsTestIsAsync = true; |
+window.wasPostTestScriptParsed = true; |
+ |
+if (window.testRunner) |
+ testRunner.dumpChildFramesAsText(); |
+ |
+window.addEventListener("message", function (e) { |
+ if (window.parent != window) { |
+ window.parent.postMessage(e.data, "*"); |
+ } else { |
+ if (e.data) |
+ testFailed("The inner IFrame failed."); |
+ else |
+ testPassed("The inner IFrame passed."); |
+ |
+ finishJSTest(); |
+ } |
+}); |
+ |
+function injectNestedIframe(policy, parent, child, expectation) { |
+ var iframe = document.createElement("iframe"); |
+ |
+ var url = "/security/contentSecurityPolicy/resources/frame-in-frame.pl?" |
+ + "policy=" + policy |
+ + "&parent=" + parent |
+ + "&child=" + child |
+ + "&expectation=" + expectation; |
+ url = (parent == "same" ? SAMEORIGIN_ORIGIN : CROSSORIGIN_ORIGIN) + url; |
+ |
+ iframe.src = url; |
+ document.body.appendChild(iframe); |
+} |
+ |
+function injectIFrame(policy, sameOrigin, expectBlock) { |
+ var iframe = document.createElement("iframe"); |
+ iframe.addEventListener("load", iframeLoaded(expectBlock)); |
+ iframe.addEventListener("error", iframeLoaded(expectBlock)); |
+ |
+ var url = "/security/contentSecurityPolicy/resources/frame-ancestors.pl?policy=" + policy; |
+ if (!sameOrigin) |
+ url = CROSSORIGIN_ORIGIN + url; |
+ |
+ iframe.src = url; |
+ document.body.appendChild(iframe); |
+} |
+ |
+function iframeLoaded(expectBlock) { |
+ return function(ev) { |
+ var failed = true; |
+ try { |
+ console.log("IFrame load event fired: the IFrame's location is '" + ev.target.contentWindow.location.href + "'."); |
+ if (expectBlock) { |
+ testFailed("The IFrame should have been blocked (or cross-origin). It wasn't."); |
+ failed = true; |
+ } else { |
+ testPassed("The IFrame should not have been blocked. It wasn't."); |
+ failed = false; |
+ } |
+ } catch (ex) { |
+ debug("IFrame load event fired: the IFrame is cross-origin (or was blocked)."); |
+ if (expectBlock) { |
+ testPassed("The IFrame should have been blocked (or cross-origin). It was."); |
+ failed = false; |
+ } else { |
+ testFailed("The IFrame should not have been blocked. It was."); |
+ failed = true; |
+ } |
+ } |
+ if (window.parent != window) |
+ window.parent.postMessage(failed, '*'); |
+ else |
+ finishJSTest(); |
+ }; |
+} |
+ |
+function crossOriginFrameShouldBeBlocked(policy) { |
+ window.onload = function () { |
+ injectIFrame(policy, CROSS_ORIGIN, EXPECT_BLOCK); |
+ }; |
+} |
+ |
+function crossOriginFrameShouldBeAllowed(policy) { |
+ window.onload = function () { |
+ injectIFrame(policy, CROSS_ORIGIN, EXPECT_LOAD); |
+ }; |
+} |
+ |
+function sameOriginFrameShouldBeBlocked(policy) { |
+ window.onload = function () { |
+ injectIFrame(policy, SAME_ORIGIN, EXPECT_BLOCK); |
+ }; |
+} |
+ |
+function sameOriginFrameShouldBeAllowed(policy) { |
+ window.onload = function () { |
+ injectIFrame(policy, SAME_ORIGIN, EXPECT_LOAD); |
+ }; |
+} |
+ |
+function testNestedIFrame(policy, parent, child, expectation) { |
+ window.onload = function () { |
+ injectNestedIframe(policy, parent == SAME_ORIGIN ? "same" : "cross", child == SAME_ORIGIN ? "same" : "cross", expectation == EXPECT_LOAD ? "Allowed" : "Blocked"); |
+ }; |
+} |