Viewport percentage tests that resize the viewport are flaky
authordarin@apple.com <darin@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sun, 1 Jun 2014 00:01:16 +0000 (00:01 +0000)
committerdarin@apple.com <darin@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sun, 1 Jun 2014 00:01:16 +0000 (00:01 +0000)
https://bugs.webkit.org/show_bug.cgi?id=133351

Reviewed by Anders Carlsson.

Source/WebCore:
* page/FrameView.cpp:
(WebCore::FrameView::setFrameRect): Removed code that explicitly sends a resize event here.
The resize event will be sent as a side effect of layout instead.
(WebCore::FrameView::sendResizeEventIfNeeded): Don't send a resize event until layout is done,
since this is what propagates the new geometry in so the JavaScript code can detect it. Also
simplified the logic and streamlined a little, and added a FIXME about the bad idea here where
the code enqueues an event for an unknown time in the future. Removed the unneeded code that
passes in the DOM window as the target to dispatchWindowEvent, since that gets filled in as the
target by default.

Tools:
* DumpRenderTree/mac/DumpRenderTree.mm:
(sizeWebViewForCurrentTest): Added a call to reset the window origin, which
happens to be stored in the UI delegate object. This is part of resetting the
window position.

* DumpRenderTree/mac/UIDelegate.h: Store the window origin rather than storing
a frame rectangle. The size is stored in the size of the web view itself.
* DumpRenderTree/mac/UIDelegate.mm:
(-[UIDelegate resetWindowOrigin]): Added.
(-[UIDelegate webView:setFrame:]): Changed to set the size of the web view. The
old version would store the frame, but not resize the web view!
(-[UIDelegate webViewFrame:]): Get the size from the web view.

* WebKitTestRunner/efl/PlatformWebViewEfl.cpp:
(WTR::PlatformWebView::setWindowFrame): Added code to resize the web view.

* WebKitTestRunner/gtk/PlatformWebViewGtk.cpp:
(WTR::PlatformWebView::resizeTo): Added a comment about missing code to resize
the window.

* WebKitTestRunner/ios/PlatformWebViewIOS.mm:
(WTR::PlatformWebView::resizeTo): Changed this to call setWindowFrame so the
window gets resized too, not just the web view.
(WTR::PlatformWebView::setWindowFrame): Added code to set the size of the web view.

* WebKitTestRunner/mac/PlatformWebViewMac.mm:
(WTR::PlatformWebView::resizeTo): Changed this to call setWindowFrame so the
window gets resized too, not just the web view.
(WTR::PlatformWebView::setWindowFrame): Added code to set the size of the web view.

LayoutTests:
* css3/viewport-percentage-lengths/resources/resize-test.js:
Added code to compensate for the difference between innerWidth/Height and outerWidth/Height
so this works well in a browser window. Added code to "warm up" so the first resize triggers
a resize event. Tweaked style of the code a bit. Use resize events to avoid flakiness due
to race conditions. One thing I did not fix is the "out of order" problem where all the
test results get written out after the words TEST COMPLETE.

* css3/viewport-percentage-lengths/viewport-percentage-lengths-anonymous-block-expected.txt:
Updated due to changes to the underlying test machinery, and also to show actual expected success.
The old results said PASS with various obviously wrong results.

* css3/viewport-percentage-lengths/viewport-percentage-lengths-anonymous-block.html:
Changed this test to use the shared resize-test.js.

* css3/viewport-percentage-lengths/viewport-percentage-lengths-percent-size-child-expected.txt:
Updated due to changes to the underlying test machinery, and also to show actual expected success.
The old results said PASS with various obviously wrong results.

* css3/viewport-percentage-lengths/viewport-percentage-lengths-percent-size-child.html:
Streamlined this test a little.

* css3/viewport-percentage-lengths/viewport-percentage-lengths-relative-font-size-expected.txt:
Updated due to changes to the underlying test machinery, and also to show actual expected success.
The old results said PASS with various obviously wrong results.

* css3/viewport-percentage-lengths/viewport-percentage-lengths-relative-font-size.html:
Streamlined this test a little.

* css3/viewport-percentage-lengths/viewport-percentage-lengths-resize-expected.txt:
Updated due to changes to the underlying test machinery, and also to show both expected success,
and some expected failures. These failures were going unnoticed before since the test didn't
successfully do any resizing of the web view.

* css3/viewport-percentage-lengths/viewport-percentage-lengths-resize.html:
Streamlined this test a little.

* fast/dom/Window/window-resize-contents-expected.txt: Updated to reflect the test actually
resizing. The old test results expected no resizing to occur.
* fast/dom/Window/window-resize-contents.html: Updated to use a resize event handler so the
test can successfully test asynchronous resizes like the ones done by WebKit2.

* fast/dom/rtl-scroll-to-leftmost-and-resize.html: Updated to use a resize event handler so
this can test asynchronous resizes. Also fixed code that was treating the arguments to resizeTo
as if they were inner coordinates rather than outer. However, the bug this tests for has not
been fixed, so need to expect failures.

* platform/mac/TestExpectations: Added a failure expection for the test above.

* platform/mac/fast/dynamic/window-resize-scrollbars-test-expected.png: Updated to expect a result
that successfully resized.
* platform/mac/fast/dynamic/window-resize-scrollbars-test-expected.txt: Ditto.

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

26 files changed:
LayoutTests/ChangeLog
LayoutTests/css3/viewport-percentage-lengths/resources/resize-test.js
LayoutTests/css3/viewport-percentage-lengths/viewport-percentage-lengths-anonymous-block-expected.txt
LayoutTests/css3/viewport-percentage-lengths/viewport-percentage-lengths-anonymous-block.html
LayoutTests/css3/viewport-percentage-lengths/viewport-percentage-lengths-percent-size-child-expected.txt
LayoutTests/css3/viewport-percentage-lengths/viewport-percentage-lengths-percent-size-child.html
LayoutTests/css3/viewport-percentage-lengths/viewport-percentage-lengths-relative-font-size-expected.txt
LayoutTests/css3/viewport-percentage-lengths/viewport-percentage-lengths-relative-font-size.html
LayoutTests/css3/viewport-percentage-lengths/viewport-percentage-lengths-resize-expected.txt
LayoutTests/css3/viewport-percentage-lengths/viewport-percentage-lengths-resize.html
LayoutTests/fast/dom/Window/window-resize-contents-expected.txt
LayoutTests/fast/dom/Window/window-resize-contents.html
LayoutTests/fast/dom/rtl-scroll-to-leftmost-and-resize.html
LayoutTests/platform/mac/TestExpectations
LayoutTests/platform/mac/fast/dynamic/window-resize-scrollbars-test-expected.png
LayoutTests/platform/mac/fast/dynamic/window-resize-scrollbars-test-expected.txt
Source/WebCore/ChangeLog
Source/WebCore/page/FrameView.cpp
Tools/ChangeLog
Tools/DumpRenderTree/mac/DumpRenderTree.mm
Tools/DumpRenderTree/mac/UIDelegate.h
Tools/DumpRenderTree/mac/UIDelegate.mm
Tools/WebKitTestRunner/efl/PlatformWebViewEfl.cpp
Tools/WebKitTestRunner/gtk/PlatformWebViewGtk.cpp
Tools/WebKitTestRunner/ios/PlatformWebViewIOS.mm
Tools/WebKitTestRunner/mac/PlatformWebViewMac.mm

index 01eb591..7ec2446 100644 (file)
@@ -1,3 +1,62 @@
+2014-05-31  Darin Adler  <darin@apple.com>
+
+        Viewport percentage tests that resize the viewport are flaky
+        https://bugs.webkit.org/show_bug.cgi?id=133351
+
+        Reviewed by Anders Carlsson.
+
+        * css3/viewport-percentage-lengths/resources/resize-test.js:
+        Added code to compensate for the difference between innerWidth/Height and outerWidth/Height
+        so this works well in a browser window. Added code to "warm up" so the first resize triggers
+        a resize event. Tweaked style of the code a bit. Use resize events to avoid flakiness due
+        to race conditions. One thing I did not fix is the "out of order" problem where all the
+        test results get written out after the words TEST COMPLETE.
+
+        * css3/viewport-percentage-lengths/viewport-percentage-lengths-anonymous-block-expected.txt:
+        Updated due to changes to the underlying test machinery, and also to show actual expected success.
+        The old results said PASS with various obviously wrong results.
+
+        * css3/viewport-percentage-lengths/viewport-percentage-lengths-anonymous-block.html:
+        Changed this test to use the shared resize-test.js.
+
+        * css3/viewport-percentage-lengths/viewport-percentage-lengths-percent-size-child-expected.txt:
+        Updated due to changes to the underlying test machinery, and also to show actual expected success.
+        The old results said PASS with various obviously wrong results.
+
+        * css3/viewport-percentage-lengths/viewport-percentage-lengths-percent-size-child.html:
+        Streamlined this test a little.
+
+        * css3/viewport-percentage-lengths/viewport-percentage-lengths-relative-font-size-expected.txt:
+        Updated due to changes to the underlying test machinery, and also to show actual expected success.
+        The old results said PASS with various obviously wrong results.
+
+        * css3/viewport-percentage-lengths/viewport-percentage-lengths-relative-font-size.html:
+        Streamlined this test a little.
+
+        * css3/viewport-percentage-lengths/viewport-percentage-lengths-resize-expected.txt:
+        Updated due to changes to the underlying test machinery, and also to show both expected success,
+        and some expected failures. These failures were going unnoticed before since the test didn't
+        successfully do any resizing of the web view.
+
+        * css3/viewport-percentage-lengths/viewport-percentage-lengths-resize.html:
+        Streamlined this test a little.
+
+        * fast/dom/Window/window-resize-contents-expected.txt: Updated to reflect the test actually
+        resizing. The old test results expected no resizing to occur.
+        * fast/dom/Window/window-resize-contents.html: Updated to use a resize event handler so the
+        test can successfully test asynchronous resizes like the ones done by WebKit2.
+
+        * fast/dom/rtl-scroll-to-leftmost-and-resize.html: Updated to use a resize event handler so
+        this can test asynchronous resizes. Also fixed code that was treating the arguments to resizeTo
+        as if they were inner coordinates rather than outer. However, the bug this tests for has not
+        been fixed, so need to expect failures.
+
+        * platform/mac/TestExpectations: Added a failure expection for the test above.
+
+        * platform/mac/fast/dynamic/window-resize-scrollbars-test-expected.png: Updated to expect a result
+        that successfully resized.
+        * platform/mac/fast/dynamic/window-resize-scrollbars-test-expected.txt: Ditto.
+
 2014-05-30  Mario Sanchez Prada  <mario.prada@samsung.com>
 
         [GTK] Don't use logAccessibilityEvents() in aria-slider-required-attributes.html
index 349fb77..213ae98 100644 (file)
@@ -3,25 +3,56 @@ if (window.testRunner) {
     testRunner.dumpAsText();
 }
 
-function resizeTest(sizes, testfn) {
-    if (!sizes.length) {
+function resizeTest(sizes, testFunction)
+{
+    var widthDelta;
+    var heightDelta;
+
+    function performNextResize()
+    {
+        if (sizes.length) {
+            resizeTo(sizes[0][0] + widthDelta, sizes[0][1] + heightDelta);
+            return;
+        }
+        removeEventListener("resize", resizeHandler);
         if (window.testRunner)
             testRunner.notifyDone();
-        return;
+    };
+
+    function resizeHandler()
+    {
+        var nextSize = sizes.shift();
+
+        shouldEvaluateTo("innerWidth", nextSize[0]);
+        shouldEvaluateTo("innerHeight", nextSize[1]);
+
+        testFunction();
+
+        performNextResize();
+    };
+
+    const warmupWidth = outerWidth + 13;
+
+    function warmupDone()
+    {
+        if (outerWidth != warmupWidth)
+            return;
+        widthDelta = outerWidth - innerWidth;
+        heightDelta = outerHeight - innerHeight;
+        removeEventListener("resize", warmupDone);
+        setTimeout(function () {
+            addEventListener("resize", resizeHandler);
+            performNextResize();
+        }, 0);
     }
 
-    var size = sizes.shift();
-    var width = size[0];
-    var height = size[1];
-    window.resizeTo(width, height);
-    window.setTimeout(function () {
-        shouldBe("window.outerWidth", "" + width);
-        shouldBe("window.outerHeight", "" + height);
-        testfn(size);
-        resizeTest(sizes, testfn);
+    addEventListener("resize", warmupDone);
+    setTimeout(function () {
+        resizeTo(warmupWidth, outerHeight);
     }, 0);
 }
 
-function standardResizeTest(testfn) {
-    resizeTest([[800, 600], [900, 600], [900, 640], [500, 640], [800, 600]], testfn);
+function standardResizeTest(testFunction)
+{
+    resizeTest([[800, 600], [900, 600], [900, 640], [500, 640], [800, 600]], testFunction);
 }
index 630c1e1..b7b6930 100644 (file)
@@ -6,41 +6,41 @@ On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE
 PASS successfullyParsed is true
 
 TEST COMPLETE
-PASS window.outerWidth is 800
-PASS window.outerHeight is 600
-PASS getComputedStyle(container).width is '400px'
-PASS getComputedStyle(container).height is '300px'
-PASS getComputedStyle(random).width is '200px'
-PASS window.innerWidth/2 is >= document.getElementById('firstContent').offsetWidth
-PASS window.innerWidth/2 is >= document.getElementById('secondContent').offsetWidth
-PASS window.outerWidth is 900
-PASS window.outerHeight is 600
-PASS getComputedStyle(container).width is '400px'
-PASS getComputedStyle(container).height is '300px'
-PASS getComputedStyle(random).width is '200px'
-PASS window.innerWidth/2 is >= document.getElementById('firstContent').offsetWidth
-PASS window.innerWidth/2 is >= document.getElementById('secondContent').offsetWidth
-PASS window.outerWidth is 900
-PASS window.outerHeight is 640
-PASS getComputedStyle(container).width is '400px'
-PASS getComputedStyle(container).height is '300px'
-PASS getComputedStyle(random).width is '200px'
-PASS window.innerWidth/2 is >= document.getElementById('firstContent').offsetWidth
-PASS window.innerWidth/2 is >= document.getElementById('secondContent').offsetWidth
-PASS window.outerWidth is 500
-PASS window.outerHeight is 640
-PASS getComputedStyle(container).width is '400px'
-PASS getComputedStyle(container).height is '300px'
-PASS getComputedStyle(random).width is '200px'
-PASS window.innerWidth/2 is >= document.getElementById('firstContent').offsetWidth
-PASS window.innerWidth/2 is >= document.getElementById('secondContent').offsetWidth
-PASS window.outerWidth is 800
-PASS window.outerHeight is 600
-PASS getComputedStyle(container).width is '400px'
-PASS getComputedStyle(container).height is '300px'
-PASS getComputedStyle(random).width is '200px'
-PASS window.innerWidth/2 is >= document.getElementById('firstContent').offsetWidth
-PASS window.innerWidth/2 is >= document.getElementById('secondContent').offsetWidth
+PASS innerWidth is 800
+PASS innerHeight is 600
+PASS getComputedStyle(container).width is "400px"
+PASS getComputedStyle(container).height is "300px"
+PASS getComputedStyle(random).width is "200px"
+PASS innerWidth / 2 is >= document.getElementById('firstContent').offsetWidth
+PASS innerWidth / 2 is >= document.getElementById('secondContent').offsetWidth
+PASS innerWidth is 900
+PASS innerHeight is 600
+PASS getComputedStyle(container).width is "450px"
+PASS getComputedStyle(container).height is "300px"
+PASS getComputedStyle(random).width is "225px"
+PASS innerWidth / 2 is >= document.getElementById('firstContent').offsetWidth
+PASS innerWidth / 2 is >= document.getElementById('secondContent').offsetWidth
+PASS innerWidth is 900
+PASS innerHeight is 640
+PASS getComputedStyle(container).width is "450px"
+PASS getComputedStyle(container).height is "320px"
+PASS getComputedStyle(random).width is "225px"
+PASS innerWidth / 2 is >= document.getElementById('firstContent').offsetWidth
+PASS innerWidth / 2 is >= document.getElementById('secondContent').offsetWidth
+PASS innerWidth is 500
+PASS innerHeight is 640
+PASS getComputedStyle(container).width is "250px"
+PASS getComputedStyle(container).height is "320px"
+PASS getComputedStyle(random).width is "125px"
+PASS innerWidth / 2 is >= document.getElementById('firstContent').offsetWidth
+PASS innerWidth / 2 is >= document.getElementById('secondContent').offsetWidth
+PASS innerWidth is 800
+PASS innerHeight is 600
+PASS getComputedStyle(container).width is "400px"
+PASS getComputedStyle(container).height is "300px"
+PASS getComputedStyle(random).width is "200px"
+PASS innerWidth / 2 is >= document.getElementById('firstContent').offsetWidth
+PASS innerWidth / 2 is >= document.getElementById('secondContent').offsetWidth
 This is enough text content that it will wrap around in this container. We need lots of it to account for variances in font sizes.
 This is some content in an inner div.
 And here is some more content that will also wrap around in this container. We need lots of it to account for variances in font sizes.
index b2171c6..8cc63dc 100644 (file)
     </div>
 </body>
 <script src="../../resources/js-test-pre.js"></script>
+<script src="resources/resize-test.js"></script>
 <script>
-if (window.testRunner) {
-    testRunner.waitUntilDone();
-    testRunner.dumpAsText();
-}
-
 description("Test viewport unit sizes work when an anonymous block is involved.");
-
-function resizeTest(sizes) {
-    if (!sizes.length) {
-        testRunner.notifyDone();
-        return;
-    }
-
-    var size = sizes.shift();
-    var width = size[0];
-    var height = size[1];
-    window.resizeTo(width, height);
-    window.setTimeout(function () {
-        var min = Math.min(window.innerWidth, window.innerHeight);
-        var max = Math.max(window.innerWidth, window.innerHeight);
-        shouldBe("window.outerWidth", "" + width);
-        shouldBe("window.outerHeight", "" + height);
-        shouldBe("getComputedStyle(container).width", "'" + window.innerWidth/2 + "px'");
-        shouldBe("getComputedStyle(container).height", "'" + window.innerHeight/2 + "px'");
-        shouldBe("getComputedStyle(random).width", "'" + window.innerWidth/4 + "px'");
-        shouldBeGreaterThanOrEqual("window.innerWidth/2", "document.getElementById('firstContent').offsetWidth");
-        shouldBeGreaterThanOrEqual("window.innerWidth/2", "document.getElementById('secondContent').offsetWidth");
-        resizeTest(sizes);
-    }, 0);
-}
-
-resizeTest([[800, 600], [900, 600], [900, 640], [500, 640], [800, 600]]);
-
+standardResizeTest(function () {
+    shouldBeEqualToString("getComputedStyle(container).width", innerWidth / 2 + "px");
+    shouldBeEqualToString("getComputedStyle(container).height", innerHeight / 2 + "px");
+    shouldBeEqualToString("getComputedStyle(random).width", innerWidth / 4 + "px");
+    shouldBeGreaterThanOrEqual("innerWidth / 2", "document.getElementById('firstContent').offsetWidth");
+    shouldBeGreaterThanOrEqual("innerWidth / 2", "document.getElementById('secondContent').offsetWidth");
+});
 </script>
 <script src="../../resources/js-test-post.js"></script>
index e318bd9..98e4cba 100644 (file)
@@ -6,34 +6,34 @@ On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE
 PASS successfullyParsed is true
 
 TEST COMPLETE
-PASS window.outerWidth is 800
-PASS window.outerHeight is 600
-PASS getComputedStyle(container).width is '400px'
-PASS getComputedStyle(container).height is '300px'
-PASS getComputedStyle(percent).width is '200px'
-PASS getComputedStyle(percent).height is '150px'
-PASS window.outerWidth is 900
-PASS window.outerHeight is 600
-PASS getComputedStyle(container).width is '400px'
-PASS getComputedStyle(container).height is '300px'
-PASS getComputedStyle(percent).width is '200px'
-PASS getComputedStyle(percent).height is '150px'
-PASS window.outerWidth is 900
-PASS window.outerHeight is 640
-PASS getComputedStyle(container).width is '400px'
-PASS getComputedStyle(container).height is '300px'
-PASS getComputedStyle(percent).width is '200px'
-PASS getComputedStyle(percent).height is '150px'
-PASS window.outerWidth is 500
-PASS window.outerHeight is 640
-PASS getComputedStyle(container).width is '400px'
-PASS getComputedStyle(container).height is '300px'
-PASS getComputedStyle(percent).width is '200px'
-PASS getComputedStyle(percent).height is '150px'
-PASS window.outerWidth is 800
-PASS window.outerHeight is 600
-PASS getComputedStyle(container).width is '400px'
-PASS getComputedStyle(container).height is '300px'
-PASS getComputedStyle(percent).width is '200px'
-PASS getComputedStyle(percent).height is '150px'
+PASS innerWidth is 800
+PASS innerHeight is 600
+PASS getComputedStyle(container).width is "400px"
+PASS getComputedStyle(container).height is "300px"
+PASS getComputedStyle(percent).width is "200px"
+PASS getComputedStyle(percent).height is "150px"
+PASS innerWidth is 900
+PASS innerHeight is 600
+PASS getComputedStyle(container).width is "450px"
+PASS getComputedStyle(container).height is "300px"
+PASS getComputedStyle(percent).width is "225px"
+PASS getComputedStyle(percent).height is "150px"
+PASS innerWidth is 900
+PASS innerHeight is 640
+PASS getComputedStyle(container).width is "450px"
+PASS getComputedStyle(container).height is "320px"
+PASS getComputedStyle(percent).width is "225px"
+PASS getComputedStyle(percent).height is "160px"
+PASS innerWidth is 500
+PASS innerHeight is 640
+PASS getComputedStyle(container).width is "250px"
+PASS getComputedStyle(container).height is "320px"
+PASS getComputedStyle(percent).width is "125px"
+PASS getComputedStyle(percent).height is "160px"
+PASS innerWidth is 800
+PASS innerHeight is 600
+PASS getComputedStyle(container).width is "400px"
+PASS getComputedStyle(container).height is "300px"
+PASS getComputedStyle(percent).width is "200px"
+PASS getComputedStyle(percent).height is "150px"
 
index 8e6cd85..b35f3f4 100644 (file)
 <script src="resources/resize-test.js"></script>
 <script>
 description("Test that percentage dimensions work in a child with a parent with viewport unit dimensions.");
-
-standardResizeTest(function (sizes) {
-    shouldBe("getComputedStyle(container).width", "'" + window.innerWidth/2 + "px'");
-    shouldBe("getComputedStyle(container).height", "'" + window.innerHeight/2 + "px'");
-    shouldBe("getComputedStyle(percent).width", "'" + window.innerWidth/4 + "px'");
-    shouldBe("getComputedStyle(percent).height", "'" + window.innerHeight/4 + "px'");
+standardResizeTest(function () {
+    shouldBeEqualToString("getComputedStyle(container).width", innerWidth / 2 + "px");
+    shouldBeEqualToString("getComputedStyle(container).height", innerHeight / 2 + "px");
+    shouldBeEqualToString("getComputedStyle(percent).width", innerWidth / 4 + "px");
+    shouldBeEqualToString("getComputedStyle(percent).height", innerHeight / 4 + "px");
 });
 </script>
 <script src="../../resources/js-test-post.js"></script>
index 5354e8f..c7a179b 100644 (file)
@@ -6,29 +6,29 @@ On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE
 PASS successfullyParsed is true
 
 TEST COMPLETE
-PASS window.outerWidth is 800
-PASS window.outerHeight is 600
-PASS getComputedStyle(container).fontSize is '40px'
-PASS getComputedStyle(ems).fontSize is '160px'
-PASS getComputedStyle(percent).fontSize is '20px'
-PASS window.outerWidth is 900
-PASS window.outerHeight is 600
-PASS getComputedStyle(container).fontSize is '40px'
-PASS getComputedStyle(ems).fontSize is '160px'
-PASS getComputedStyle(percent).fontSize is '20px'
-PASS window.outerWidth is 900
-PASS window.outerHeight is 640
-PASS getComputedStyle(container).fontSize is '40px'
-PASS getComputedStyle(ems).fontSize is '160px'
-PASS getComputedStyle(percent).fontSize is '20px'
-PASS window.outerWidth is 500
-PASS window.outerHeight is 640
-PASS getComputedStyle(container).fontSize is '40px'
-PASS getComputedStyle(ems).fontSize is '160px'
-PASS getComputedStyle(percent).fontSize is '20px'
-PASS window.outerWidth is 800
-PASS window.outerHeight is 600
-PASS getComputedStyle(container).fontSize is '40px'
-PASS getComputedStyle(ems).fontSize is '160px'
-PASS getComputedStyle(percent).fontSize is '20px'
+PASS innerWidth is 800
+PASS innerHeight is 600
+PASS getComputedStyle(container).fontSize is "40px"
+PASS getComputedStyle(ems).fontSize is "160px"
+PASS getComputedStyle(percent).fontSize is "20px"
+PASS innerWidth is 900
+PASS innerHeight is 600
+PASS getComputedStyle(container).fontSize is "45px"
+PASS getComputedStyle(ems).fontSize is "180px"
+PASS getComputedStyle(percent).fontSize is "23px"
+PASS innerWidth is 900
+PASS innerHeight is 640
+PASS getComputedStyle(container).fontSize is "45px"
+PASS getComputedStyle(ems).fontSize is "180px"
+PASS getComputedStyle(percent).fontSize is "23px"
+PASS innerWidth is 500
+PASS innerHeight is 640
+PASS getComputedStyle(container).fontSize is "25px"
+PASS getComputedStyle(ems).fontSize is "100px"
+PASS getComputedStyle(percent).fontSize is "13px"
+PASS innerWidth is 800
+PASS innerHeight is 600
+PASS getComputedStyle(container).fontSize is "40px"
+PASS getComputedStyle(ems).fontSize is "160px"
+PASS getComputedStyle(percent).fontSize is "20px"
 
index 984b66c..95b426e 100644 (file)
 <script src="resources/resize-test.js"></script>
 <script>
 description("Test that relative font sizes work when the parent is in viewport units.");
-
-standardResizeTest(function (size) {
-        shouldBe("getComputedStyle(container).fontSize", "'" + Math.round(window.innerWidth/20) + "px'");
-        shouldBe("getComputedStyle(ems).fontSize", "'" + Math.round(window.innerWidth/5) + "px'");
-        shouldBe("getComputedStyle(percent).fontSize", "'" + Math.round(window.innerWidth/40) + "px'");
+standardResizeTest(function () {
+    shouldBeEqualToString("getComputedStyle(container).fontSize", Math.round(innerWidth / 20) + "px");
+    shouldBeEqualToString("getComputedStyle(ems).fontSize", Math.round(innerWidth / 5) + "px");
+    shouldBeEqualToString("getComputedStyle(percent).fontSize", Math.round(innerWidth / 40) + "px");
 });
-
 </script>
 <script src="../../resources/js-test-post.js"></script>
index 0dad02c..2f573f9 100644 (file)
@@ -6,34 +6,34 @@ On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE
 PASS successfullyParsed is true
 
 TEST COMPLETE
-PASS window.outerWidth is 800
-PASS window.outerHeight is 600
-PASS getComputedStyle(test).fontSize is '30px'
-PASS getComputedStyle(test).width is '400px'
-PASS getComputedStyle(testpseudo, ':after').marginLeft is '120px'
-PASS getComputedStyle(testpseudo, ':after').paddingRight is '200px'
-PASS window.outerWidth is 900
-PASS window.outerHeight is 600
-PASS getComputedStyle(test).fontSize is '30px'
-PASS getComputedStyle(test).width is '400px'
-PASS getComputedStyle(testpseudo, ':after').marginLeft is '120px'
-PASS getComputedStyle(testpseudo, ':after').paddingRight is '200px'
-PASS window.outerWidth is 900
-PASS window.outerHeight is 640
-PASS getComputedStyle(test).fontSize is '30px'
-PASS getComputedStyle(test).width is '400px'
-PASS getComputedStyle(testpseudo, ':after').marginLeft is '120px'
-PASS getComputedStyle(testpseudo, ':after').paddingRight is '200px'
-PASS window.outerWidth is 500
-PASS window.outerHeight is 640
-PASS getComputedStyle(test).fontSize is '30px'
-PASS getComputedStyle(test).width is '400px'
-PASS getComputedStyle(testpseudo, ':after').marginLeft is '120px'
-PASS getComputedStyle(testpseudo, ':after').paddingRight is '200px'
-PASS window.outerWidth is 800
-PASS window.outerHeight is 600
-PASS getComputedStyle(test).fontSize is '30px'
-PASS getComputedStyle(test).width is '400px'
-PASS getComputedStyle(testpseudo, ':after').marginLeft is '120px'
-PASS getComputedStyle(testpseudo, ':after').paddingRight is '200px'
+PASS innerWidth is 800
+PASS innerHeight is 600
+PASS getComputedStyle(test).fontSize is "30px"
+PASS getComputedStyle(test).width is "400px"
+PASS getComputedStyle(testpseudo, ':after').marginLeft is "120px"
+PASS getComputedStyle(testpseudo, ':after').paddingRight is "200px"
+PASS innerWidth is 900
+PASS innerHeight is 600
+PASS getComputedStyle(test).fontSize is "30px"
+PASS getComputedStyle(test).width is "450px"
+PASS getComputedStyle(testpseudo, ':after').marginLeft is "120px"
+FAIL getComputedStyle(testpseudo, ':after').paddingRight should be 225px. Was 200px.
+PASS innerWidth is 900
+PASS innerHeight is 640
+PASS getComputedStyle(test).fontSize is "32px"
+PASS getComputedStyle(test).width is "450px"
+FAIL getComputedStyle(testpseudo, ':after').marginLeft should be 128px. Was 120px.
+FAIL getComputedStyle(testpseudo, ':after').paddingRight should be 225px. Was 200px.
+PASS innerWidth is 500
+PASS innerHeight is 640
+PASS getComputedStyle(test).fontSize is "32px"
+PASS getComputedStyle(test).width is "250px"
+FAIL getComputedStyle(testpseudo, ':after').marginLeft should be 100px. Was 120px.
+FAIL getComputedStyle(testpseudo, ':after').paddingRight should be 160px. Was 200px.
+PASS innerWidth is 800
+PASS innerHeight is 600
+PASS getComputedStyle(test).fontSize is "30px"
+PASS getComputedStyle(test).width is "400px"
+PASS getComputedStyle(testpseudo, ':after').marginLeft is "120px"
+PASS getComputedStyle(testpseudo, ':after').paddingRight is "200px"
 
index b5810df..b029f23 100644 (file)
 <script src="resources/resize-test.js"></script>
 <script>
 description("Test that viewport lengths and font sizes properly resize with the viewport.");
-standardResizeTest(function (size) {
-        var min = Math.min(window.innerWidth, window.innerHeight);
-        var max = Math.max(window.innerWidth, window.innerHeight);
-        shouldBe("getComputedStyle(test).fontSize", "'" + window.innerHeight/20 + "px'");
-        shouldBe("getComputedStyle(test).width", "'" + window.innerWidth/2 + "px'");
-        shouldBe("getComputedStyle(testpseudo, ':after').marginLeft", "'" + min/5 + "px'");
-        shouldBe("getComputedStyle(testpseudo, ':after').paddingRight", "'" + max/4 + "px'");
+standardResizeTest(function () {
+    var min = Math.min(innerWidth, innerHeight);
+    var max = Math.max(innerWidth, innerHeight);
+    shouldBeEqualToString("getComputedStyle(test).fontSize", innerHeight / 20 + "px");
+    shouldBeEqualToString("getComputedStyle(test).width", innerWidth / 2 + "px");
+    shouldBeEqualToString("getComputedStyle(testpseudo, ':after').marginLeft", min / 5 + "px");
+    shouldBeEqualToString("getComputedStyle(testpseudo, ':after').paddingRight", max / 4 + "px");
 });
 </script>
 <script src="../../resources/js-test-post.js"></script>
index fe09c95..8df1550 100644 (file)
@@ -1,6 +1,6 @@
-CONSOLE MESSAGE: line 18: Initial reference node dimensions 800 x 600
-CONSOLE MESSAGE: line 20: Increasing window size by 10 x 10
-CONSOLE MESSAGE: line 22: Post-resize reference node dimensions 800 x 600
+CONSOLE MESSAGE: line 20: Initial reference node dimensions 800 x 600
+CONSOLE MESSAGE: line 22: Increasing window size by 10 x 10
+CONSOLE MESSAGE: line 29: Post-resize reference node dimensions 810 x 610
 This test checks that the yellow reference DOM node (which should be as big as the window) gets resized when the window is resized.
 
 To avoid relayouts and repaints caused by DOM-based logging, it doesn't output anything. Please check the console for confirmation that the node dimensions increase by 10x10.
index 0ac7819..9ed7373 100644 (file)
     dimensions increase by 10x10.</p>
 </div>
 <script>
-    if (window.testRunner)
+    if (window.testRunner) {
         testRunner.dumpAsText();
+        testRunner.waitUntilDone();
+    }
     var referenceNode = document.getElementById('reference');
     console.log('Initial reference node dimensions ' +
         referenceNode.offsetWidth + ' x ' + referenceNode.offsetHeight);
     console.log('Increasing window size by 10 x 10');
-    window.resizeBy(10, 10);
-    console.log('Post-resize reference node dimensions ' +
-        referenceNode.offsetWidth + ' x ' + referenceNode.offsetHeight);
+    addEventListener('resize', finishTest);
+    var widthBefore = innerWidth;
+    resizeBy(10, 10);
+    function finishTest() {
+        if (innerWidth != widthBefore + 10)
+            return;
+        console.log('Post-resize reference node dimensions ' +
+            referenceNode.offsetWidth + ' x ' + referenceNode.offsetHeight);
+        if (window.testRunner)
+            testRunner.notifyDone();
+    }
 </script>
 
 </body>
index f07bb28..8ef2243 100644 (file)
@@ -4,9 +4,21 @@
 <script type="text/javascript">
 onload = function()
 {
-    window.resizeTo(250, window.innerHeight);
-    window.scrollTo(-100000, 0);
-    window.resizeTo(350, window.innerHeight);
+    if (window.testRunner)
+        testRunner.waitUntilDone();
+    // FIXME: For predictable results, we need to resize to a known value for innerWidth,
+    // rather than assuming that innerWidth and outerWidth are the same.
+    resizeTo(250, outerHeight);
+    scrollTo(-100000, 0);
+    addEventListener('resize', finishTest);
+    resizeTo(350, outerHeight);
+    function finishTest()
+    {
+        if (outerWidth != 350)
+            return;
+        if (window.testRunner)
+            testRunner.notifyDone();
+    }
 }
 </script>
 </head>
@@ -16,4 +28,3 @@ onload = function()
         </div>
     </body>
 </html>
-
index 528ecf6..f52137c 100755 (executable)
@@ -1372,3 +1372,7 @@ webkit.org/b/132491 [ MountainLion ] http/tests/media/hls/video-controls-live-st
 [ MountainLion Mavericks ] http/tests/misc/webtiming-ssl.php [ Skip ]
 [ MountainLion Mavericks ] http/tests/misc/webtiming-two-redirects.php [ Skip ]
 [ MountainLion Mavericks ] fast/performance [ Skip ]
+
+# This test, originally written for Chromium, historically was not testing anything on Mac because
+# resizing didn't work. Now the test fails. I believe this bug was never fixed for the Mac port.
+fast/dom/rtl-scroll-to-leftmost-and-resize.html [ Failure ]
index fba95a9..2a12c69 100644 (file)
Binary files a/LayoutTests/platform/mac/fast/dynamic/window-resize-scrollbars-test-expected.png and b/LayoutTests/platform/mac/fast/dynamic/window-resize-scrollbars-test-expected.png differ
index 4cfa1e1..441f83b 100644 (file)
@@ -1,8 +1,8 @@
-layer at (0,0) size 800x600
-  RenderView at (0,0) size 800x600
+layer at (0,0) size 776x576
+  RenderView at (0,0) size 776x576
 layer at (0,0) size 768x568
   RenderBlock {HTML} at (0,0) size 768x568
-    RenderBody {BODY} at (8,8) size 752x584
+    RenderBody {BODY} at (8,8) size 752x560
       RenderText {#text} at (0,0) size 484x18
         text run at (0,0) width 484: "This window should not have scroll bars. If it has scroll bars, try to use them."
       RenderText {#text} at (0,0) size 0x0
index b258404..18ef37b 100644 (file)
@@ -1,3 +1,20 @@
+2014-05-31  Darin Adler  <darin@apple.com>
+
+        Viewport percentage tests that resize the viewport are flaky
+        https://bugs.webkit.org/show_bug.cgi?id=133351
+
+        Reviewed by Anders Carlsson.
+
+        * page/FrameView.cpp:
+        (WebCore::FrameView::setFrameRect): Removed code that explicitly sends a resize event here.
+        The resize event will be sent as a side effect of layout instead.
+        (WebCore::FrameView::sendResizeEventIfNeeded): Don't send a resize event until layout is done,
+        since this is what propagates the new geometry in so the JavaScript code can detect it. Also
+        simplified the logic and streamlined a little, and added a FIXME about the bad idea here where
+        the code enqueues an event for an unknown time in the future. Removed the unneeded code that
+        passes in the DOM window as the target to dispatchWindowEvent, since that gets filled in as the
+        target by default.
+
 2014-05-31  Anders Carlsson  <andersca@apple.com>
 
         Don't use std::mutex::try_lock to check if we own a mutex
index 39033f5..59707aa 100644 (file)
@@ -433,9 +433,6 @@ void FrameView::setFrameRect(const IntRect& newRect)
         if (renderView->usesCompositing())
             renderView->compositor().frameViewDidChangeSize();
     }
-
-    if (!frameFlatteningEnabled())
-        sendResizeEventIfNeeded();
 }
 
 #if ENABLE(REQUEST_ANIMATION_FRAME)
@@ -2819,20 +2816,26 @@ IntSize FrameView::sizeForResizeEvent() const
 
 void FrameView::sendResizeEventIfNeeded()
 {
+    if (isInLayout() || needsLayout())
+        return;
+
     RenderView* renderView = this->renderView();
     if (!renderView || renderView->printing())
         return;
+
     if (frame().page() && frame().page()->chrome().client().isSVGImageChromeClient())
         return;
 
     IntSize currentSize = sizeForResizeEvent();
     float currentZoomFactor = renderView->style().zoom();
-    bool shouldSendResizeEvent = !m_firstLayout && (currentSize != m_lastViewportSize || currentZoomFactor != m_lastZoomFactor);
+
+    if (currentSize == m_lastViewportSize && currentZoomFactor == m_lastZoomFactor)
+        return;
 
     m_lastViewportSize = currentSize;
     m_lastZoomFactor = currentZoomFactor;
 
-    if (!shouldSendResizeEvent)
+    if (m_firstLayout)
         return;
 
 #if PLATFORM(IOS)
@@ -2846,20 +2849,24 @@ void FrameView::sendResizeEventIfNeeded()
 #endif
 
     bool isMainFrame = frame().isMainFrame();
-    bool canSendResizeEventSynchronously = !m_shouldAutoSize && isMainFrame && !isInLayout();
+    bool canSendResizeEventSynchronously = isMainFrame && !m_shouldAutoSize;
 
-    // If we resized during layout, queue up a resize event for later, otherwise fire it right away.
     RefPtr<Event> resizeEvent = Event::create(eventNames().resizeEvent, false, false);
     if (canSendResizeEventSynchronously)
-        frame().document()->dispatchWindowEvent(resizeEvent.release(), frame().document()->domWindow());
-    else
+        frame().document()->dispatchWindowEvent(resizeEvent.release());
+    else {
+        // FIXME: Queueing this event for an unpredictable time in the future seems
+        // intrinsically racy. By the time this resize event fires, the frame might
+        // be resized again, so we could end up with two resize events for the same size.
         frame().document()->enqueueWindowEvent(resizeEvent.release());
+    }
 
 #if ENABLE(INSPECTOR)
-    Page* page = frame().page();
     if (InspectorInstrumentation::hasFrontends() && isMainFrame) {
-        if (InspectorClient* inspectorClient = page ? page->inspectorController().inspectorClient() : nullptr)
-            inspectorClient->didResizeMainFrame(&frame());
+        if (Page* page = frame().page()) {
+            if (InspectorClient* inspectorClient = page->inspectorController().inspectorClient())
+                inspectorClient->didResizeMainFrame(&frame());
+        }
     }
 #endif
 }
index c2af91d..ad16aa9 100644 (file)
@@ -1,3 +1,40 @@
+2014-05-31  Darin Adler  <darin@apple.com>
+
+        Viewport percentage tests that resize the viewport are flaky
+        https://bugs.webkit.org/show_bug.cgi?id=133351
+
+        Reviewed by Anders Carlsson.
+
+        * DumpRenderTree/mac/DumpRenderTree.mm:
+        (sizeWebViewForCurrentTest): Added a call to reset the window origin, which
+        happens to be stored in the UI delegate object. This is part of resetting the
+        window position.
+
+        * DumpRenderTree/mac/UIDelegate.h: Store the window origin rather than storing
+        a frame rectangle. The size is stored in the size of the web view itself.
+        * DumpRenderTree/mac/UIDelegate.mm:
+        (-[UIDelegate resetWindowOrigin]): Added.
+        (-[UIDelegate webView:setFrame:]): Changed to set the size of the web view. The
+        old version would store the frame, but not resize the web view!
+        (-[UIDelegate webViewFrame:]): Get the size from the web view.
+
+        * WebKitTestRunner/efl/PlatformWebViewEfl.cpp:
+        (WTR::PlatformWebView::setWindowFrame): Added code to resize the web view.
+
+        * WebKitTestRunner/gtk/PlatformWebViewGtk.cpp:
+        (WTR::PlatformWebView::resizeTo): Added a comment about missing code to resize
+        the window.
+
+        * WebKitTestRunner/ios/PlatformWebViewIOS.mm:
+        (WTR::PlatformWebView::resizeTo): Changed this to call setWindowFrame so the
+        window gets resized too, not just the web view.
+        (WTR::PlatformWebView::setWindowFrame): Added code to set the size of the web view.
+
+        * WebKitTestRunner/mac/PlatformWebViewMac.mm:
+        (WTR::PlatformWebView::resizeTo): Changed this to call setWindowFrame so the
+        window gets resized too, not just the web view.
+        (WTR::PlatformWebView::setWindowFrame): Added code to set the size of the web view.
+
 2014-05-30  Michael Saboff  <msaboff@apple.com>
 
         Change run-jsc-stress-tests to not resolve jsc path locally when creating a bundle
index 1b04f6a..543d642 100644 (file)
@@ -1452,6 +1452,8 @@ static void changeWindowScaleIfNeeded(const char* testPathOrUR)
 
 static void sizeWebViewForCurrentTest()
 {
+    [uiDelegate resetWindowOrigin];
+
     // W3C SVG tests expect to be 480x360
     bool isSVGW3CTest = (gTestRunner->testPathOrURL().find("svg/W3C-SVG-1.1") != string::npos);
     if (isSVGW3CTest)
index b5f129a..9b6484e 100644 (file)
 #endif
 
 @interface UIDelegate : NSObject {
-
 @private
-    NSRect m_frame;
+    NSPoint windowOrigin;
     NSMutableSet *m_pendingGeolocationPermissionListeners;
     NSTimer *m_timer;
 }
 
+- (void)resetWindowOrigin;
 - (void)didSetMockGeolocationPermission;
 - (int)numberOfPendingGeolocationPermissionRequests;
 
index 6769303..3c2897f 100644 (file)
@@ -52,14 +52,22 @@ DumpRenderTreeDraggingInfo *draggingInfo = nil;
 
 @implementation UIDelegate
 
+- (void)resetWindowOrigin
+{
+    windowOrigin = NSZeroPoint;
+}
+
 - (void)webView:(WebView *)sender setFrame:(NSRect)frame
 {
-    m_frame = frame;
+    // FIXME: Do we need to resize an NSWindow too?
+    windowOrigin = frame.origin;
+    [sender setFrameSize:frame.size];
 }
 
 - (NSRect)webViewFrame:(WebView *)sender
 {
-    return m_frame;
+    NSSize size = [sender frame].size;
+    return NSMakeRect(windowOrigin.x, windowOrigin.y, size.width, size.height);
 }
 
 - (void)webView:(WebView *)sender addMessageToConsole:(NSDictionary *)dictionary withSource:(NSString *)source
index f316e76..718f090 100644 (file)
@@ -83,6 +83,7 @@ PlatformWebView::~PlatformWebView()
 
 void PlatformWebView::resizeTo(unsigned width, unsigned height)
 {
+    // FIXME: Don't we need to resize the window too?
     evas_object_resize(m_view, width, height);
 }
 
@@ -113,6 +114,7 @@ WKRect PlatformWebView::windowFrame()
 void PlatformWebView::setWindowFrame(WKRect frame)
 {
     ecore_evas_move_resize(m_window, frame.origin.x, frame.origin.y, frame.size.width, frame.size.height);
+    evas_object_resize(m_view, frame.size.width, frame.size.height);
 }
 
 void PlatformWebView::addChromeInputField()
index 324287e..714ec65 100644 (file)
@@ -58,6 +58,8 @@ PlatformWebView::~PlatformWebView()
 
 void PlatformWebView::resizeTo(unsigned width, unsigned height)
 {
+    // FIXME: Don't we need to resize the window too?
+
     GtkAllocation size = { 0, 0, static_cast<int>(width), static_cast<int>(height) };
     gtk_widget_size_allocate(m_window, &size);
     gtk_window_resize(GTK_WINDOW(m_window), width, height);
index 469766f..e19979f 100644 (file)
@@ -133,11 +133,10 @@ PlatformWebView::PlatformWebView(WKContextRef contextRef, WKPageGroupRef pageGro
 
 void PlatformWebView::resizeTo(unsigned width, unsigned height)
 {
-    CGRect windowFrame = [m_window frame];
-    windowFrame.size.width = width;
-    windowFrame.size.height = height;
-    [m_window setFrame:windowFrame];
-    [m_view setFrame:CGRectMake(0, 0, width, height)];
+    WKRect frame = windowFrame();
+    frame.size.width = width;
+    frame.size.height = height;
+    setWindowFrame(frame);
 }
 
 PlatformWebView::~PlatformWebView()
@@ -174,6 +173,7 @@ WKRect PlatformWebView::windowFrame()
 void PlatformWebView::setWindowFrame(WKRect frame)
 {
     [m_window setFrame:CGRectMake(frame.origin.x, frame.origin.y, frame.size.width, frame.size.height)];
+    [m_view setFrame:CGRectMake(0, 0, frame.size.width, frame.size.height)];
 }
 
 void PlatformWebView::didInitializeClients()
index cd9ac1c..136f573 100644 (file)
@@ -153,16 +153,15 @@ PlatformWebView::PlatformWebView(WKContextRef contextRef, WKPageGroupRef pageGro
 
 void PlatformWebView::resizeTo(unsigned width, unsigned height)
 {
-    NSRect windowFrame = [m_window frame];
-    windowFrame.size.width = width;
-    windowFrame.size.height = height;
-    [m_window setFrame:windowFrame display:YES];
-    [m_view setFrame:NSMakeRect(0, 0, width, height)];
+    WKRect frame = windowFrame();
+    frame.size.width = width;
+    frame.size.height = height;
+    setWindowFrame(frame);
 }
 
 PlatformWebView::~PlatformWebView()
 {
-    m_window.platformWebView = 0;
+    m_window.platformWebView = nullptr;
     [m_window close];
     [m_window release];
     [m_view release];
@@ -194,6 +193,7 @@ WKRect PlatformWebView::windowFrame()
 void PlatformWebView::setWindowFrame(WKRect frame)
 {
     [m_window setFrame:NSMakeRect(frame.origin.x, frame.origin.y, frame.size.width, frame.size.height) display:YES];
+    [m_view setFrame:NSMakeRect(0, 0, frame.size.width, frame.size.height)];
 }
 
 void PlatformWebView::didInitializeClients()