http/tests/security/frame-loading-via-document-write-async-delegates.html fails with...
authorcdumez@apple.com <cdumez@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 9 Mar 2018 18:45:59 +0000 (18:45 +0000)
committercdumez@apple.com <cdumez@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 9 Mar 2018 18:45:59 +0000 (18:45 +0000)
https://bugs.webkit.org/show_bug.cgi?id=183460

Reviewed by Alex Christensen.

The test has 3 frames which all initially load "about:blank". Then using document.write(), it inserts
HTML in each frame.
Frame 1: body has an onload event handler, which calls JS is click an anchor link to navigate the frame.
Frame 2: body has an onload event handler to do some logging
Frame 3: body has an onload event handler and finishes the test (calls testRunner.notifyDone())

The issue is that with asynchronous policy delegates, the first frame may not have navigated yet by the
time the third frame is loaded. Indeed, the onload event of the first frame merely clicks am anchor link
which will trigger a navigation policy check and then later navigate.

To make the test more robust, we now count the number of loads and call testRunner.notifyDone() when
we've reached the expected number of loads.

* http/tests/security/frame-loading-via-document-write-async-delegates-expected.txt: Added.
* http/tests/security/frame-loading-via-document-write-async-delegates.html: Copied from LayoutTests/http/tests/security/frame-loading-via-document-write.html.
* http/tests/security/frame-loading-via-document-write.html:
* http/tests/security/resources/frame-loading-via-document-write.js:

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@229468 268f45cc-cd09-0410-ab3c-d52691b4dbfc

LayoutTests/ChangeLog
LayoutTests/http/tests/security/frame-loading-via-document-write-async-delegates-expected.txt [new file with mode: 0644]
LayoutTests/http/tests/security/frame-loading-via-document-write-async-delegates.html [new file with mode: 0644]
LayoutTests/http/tests/security/frame-loading-via-document-write.html
LayoutTests/http/tests/security/resources/frame-loading-via-document-write.js

index 0503d3d..f189403 100644 (file)
@@ -1,3 +1,28 @@
+2018-03-09  Chris Dumez  <cdumez@apple.com>
+
+        http/tests/security/frame-loading-via-document-write-async-delegates.html fails with async delegates
+        https://bugs.webkit.org/show_bug.cgi?id=183460
+
+        Reviewed by Alex Christensen.
+
+        The test has 3 frames which all initially load "about:blank". Then using document.write(), it inserts
+        HTML in each frame.
+        Frame 1: body has an onload event handler, which calls JS is click an anchor link to navigate the frame.
+        Frame 2: body has an onload event handler to do some logging
+        Frame 3: body has an onload event handler and finishes the test (calls testRunner.notifyDone())
+
+        The issue is that with asynchronous policy delegates, the first frame may not have navigated yet by the
+        time the third frame is loaded. Indeed, the onload event of the first frame merely clicks am anchor link
+        which will trigger a navigation policy check and then later navigate.
+
+        To make the test more robust, we now count the number of loads and call testRunner.notifyDone() when
+        we've reached the expected number of loads.
+
+        * http/tests/security/frame-loading-via-document-write-async-delegates-expected.txt: Added.
+        * http/tests/security/frame-loading-via-document-write-async-delegates.html: Copied from LayoutTests/http/tests/security/frame-loading-via-document-write.html.
+        * http/tests/security/frame-loading-via-document-write.html:
+        * http/tests/security/resources/frame-loading-via-document-write.js:
+
 2018-03-09  Jer Noble  <jer.noble@apple.com>
 
         webkitfullscreenchange event not fired at the same time as :-webkit-full-screen pseudo selector changes; causes glitchiness
diff --git a/LayoutTests/http/tests/security/frame-loading-via-document-write-async-delegates-expected.txt b/LayoutTests/http/tests/security/frame-loading-via-document-write-async-delegates-expected.txt
new file mode 100644 (file)
index 0000000..d4b9f90
--- /dev/null
@@ -0,0 +1,22 @@
+CONSOLE MESSAGE: line 1: Not allowed to load local resource: abe.png
+
+
+--------
+Frame: 'topRow'
+--------
+This page was successfully loaded.
+My protocol is http:
+My referrer is blank
+
+
+--------
+Frame: 'middleRow'
+--------
+Image NOT loaded.
+
+
+--------
+Frame: 'bottomRow'
+--------
+Image loaded.
+
diff --git a/LayoutTests/http/tests/security/frame-loading-via-document-write-async-delegates.html b/LayoutTests/http/tests/security/frame-loading-via-document-write-async-delegates.html
new file mode 100644 (file)
index 0000000..c5989b9
--- /dev/null
@@ -0,0 +1,82 @@
+<html>
+<head>
+<title></title>
+
+<script language="JavaScript">
+
+const expectedLoadCount = 7;
+let loadCount = 0;
+function finishTestIfLastLoad()
+{
+    if (++loadCount == expectedLoadCount && window.testRunner)
+        testRunner.notifyDone();
+}
+
+function buildFrameset()
+{
+    if (window.testRunner) {
+        testRunner.waitUntilDone();
+        testRunner.dumpAsText();
+        testRunner.dumpChildFramesAsText();
+        if (testRunner.setShouldDecideNavigationPolicyAfterDelay)
+            testRunner.setShouldDecideNavigationPolicyAfterDelay(true);
+    }
+
+    var outHTML="<frameset rows=\"33%, 33%, 33%\">"+
+                "<frame src=\"\" onload=\"finishTestIfLastLoad()\" name=\"topRow\">"+
+                "<frame src=\"\" onload=\"finishTestIfLastLoad()\" name=\"middleRow\">"+
+                "<frame src=\"\" onload=\"finishTestIfLastLoad()\" name=\"bottomRow\">"+
+                "</frameset>";
+
+    document.open("text/html","replace");
+    document.write(outHTML);
+    document.close();
+
+    outHTML = "<html><head><scr" + "ipt language=\"JavaScript\" src=\"resources/frame-loading-via-document-write.js\">"+
+              "</scr" + "ipt></head><body onLoad=\"clickAnchor()\"><table><tr><td>"+
+              "<a href=\"resources/success.html\" target=\"topRow\" id=\"anchorLink\">Click me. If nothing loads above we have a problem.</a>"+
+              "</td></tr></table></body></html>";
+
+    frames['topRow'].document.open("text/html","replace");
+    frames['topRow'].document.charset=document.charset;
+    frames['topRow'].document.write(outHTML);
+    frames['topRow'].document.close();
+
+    var localImageLocation = "file:///tmp/LayoutTests/fast/dom/resources/abe.png";
+    if (window.testRunner)
+        localImageLocation = testRunner.pathToLocalResource(localImageLocation);
+
+    outHTML = "<html><head><scr" + "ipt language=\"JavaScript\" src=\"resources/frame-loading-via-document-write.js\">"+
+              "</scr" + "ipt></head><body onLoad=\"didImageLoad()\"><table><tr><td>"+
+              "<div id=\"result\"></div>"+
+              "<img src=\"" + localImageLocation + "\" id=\"myImg\">"+
+              "</td></tr></table></body></html>";
+
+    frames['middleRow'].document.open("text/html","replace");
+    frames['middleRow'].document.charset=document.charset;
+    frames['middleRow'].document.write(outHTML);
+    frames['middleRow'].document.close();
+
+    outHTML = "<html><head><scr" + "ipt language=\"JavaScript\" src=\"resources/frame-loading-via-document-write.js\">"+
+              "</scr" + "ipt></head><body onLoad=\"didImageLoad()\"><table><tr><td>"+
+              "<div id=\"result\"></div>"+
+              "<img src=\"/resources/abe.png\" id=\"myImg\">"+
+              "</td></tr></table></body></html>";
+
+    frames['bottomRow'].document.open("text/html","replace");
+    frames['bottomRow'].document.charset=document.charset;
+    frames['bottomRow'].document.write(outHTML);
+    frames['bottomRow'].document.close();
+}
+
+buildFrameset();
+
+</script>
+</head>
+
+<body>
+<p>JavaScript FAILED! you should not see this.</p>
+</body>
+
+</html>
+
index cbd829d..de684df 100644 (file)
@@ -4,6 +4,14 @@
 
 <script language="JavaScript">
 
+const expectedLoadCount = 7;
+let loadCount = 0;
+function finishTestIfLastLoad()
+{
+    if (++loadCount == expectedLoadCount && window.testRunner)
+        testRunner.notifyDone();
+}
+
 function buildFrameset()
 {
     if (window.testRunner) {
@@ -13,9 +21,9 @@ function buildFrameset()
     }
 
     var outHTML="<frameset rows=\"33%, 33%, 33%\">"+
-                "<frame src=\"\" name=\"topRow\">"+
-                "<frame src=\"\" name=\"middleRow\">"+
-                "<frame src=\"\" name=\"bottomRow\">"+
+                "<frame src=\"\" onload=\"finishTestIfLastLoad()\" name=\"topRow\">"+
+                "<frame src=\"\" onload=\"finishTestIfLastLoad()\" name=\"middleRow\">"+
+                "<frame src=\"\" onload=\"finishTestIfLastLoad()\" name=\"bottomRow\">"+
                 "</frameset>";
 
     document.open("text/html","replace");
@@ -48,7 +56,7 @@ function buildFrameset()
     frames['middleRow'].document.close();
 
     outHTML = "<html><head><scr" + "ipt language=\"JavaScript\" src=\"resources/frame-loading-via-document-write.js\">"+
-              "</scr" + "ipt></head><body onLoad=\"lastTest()\"><table><tr><td>"+
+              "</scr" + "ipt></head><body onLoad=\"didImageLoad()\"><table><tr><td>"+
               "<div id=\"result\"></div>"+
               "<img src=\"/resources/abe.png\" id=\"myImg\">"+
               "</td></tr></table></body></html>";
index 883c02f..99c5b45 100644 (file)
@@ -17,11 +17,3 @@ function didImageLoad()
     }
 }
 
-function lastTest()
-{
-    didImageLoad();
-
-    if (window.testRunner)
-        testRunner.notifyDone();
-}
-