[CSSOM View] Handle the scrollingElement in Element::scroll(Left/Top/Width/Height/To)
authorcommit-queue@webkit.org <commit-queue@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 7 Sep 2018 21:12:41 +0000 (21:12 +0000)
committercommit-queue@webkit.org <commit-queue@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 7 Sep 2018 21:12:41 +0000 (21:12 +0000)
https://bugs.webkit.org/show_bug.cgi?id=182230

Patch by Frederic Wang <fwang@igalia.com> on 2018-09-07
Reviewed by Simon Fraser.

LayoutTests/imported/w3c:

This commit updates expectations for some WPT tests so that they have only PASS results.
Note that css/cssom-view/scrollingElement-quirks-dynamic-*.html still fail for now (bug 182292).

* web-platform-tests/css/cssom-view/HTMLBody-ScrollArea_quirksmode-expected.txt:
* web-platform-tests/css/cssom-view/scrolling-quirks-vs-nonquirks-expected.txt:
* web-platform-tests/css/cssom-view/scrollingElement-expected.txt: Added.

Source/WebCore:

This commit moves the special logic for "scrolling element" body from the
HtmlBodyElement::scroll(Left/Top/Width/Height/To) functions to the Element class. The code
is executed when the element is the scrolling element which includes the case of body
in Quirks mode and of documentElement in standard mode. This makes the behavior closer to
the CSSOM View spec (bug 5991) while not deviating too much from the current implementation.
Finally, CSSOMViewScrollingAPI is now enabled for running tests and some adjustments are made
to existing tests. Further improvements will be performed in dependencies of bug 5991.

No new tests, already covered by existing tests.

* dom/Document.cpp: Split scrollingElement into two functions so that one can be called
internally without updating the layout.
(WebCore::Document::scrollingElement):
(WebCore::Document::scrollingElementForAPI):
* dom/Document.h: Ditto.
* dom/Document.idl: Use the version updating the layout for API calls.
* dom/Element.cpp: Add include to call DOMWindow::ScrollTo
(WebCore::Element::scrollTo): Moved some logic from HtmlBodyElement to handle the case of
the scrolling element. Also skip special handling of documentElement() when
CSSOMViewScrollingAPI is disabled.
(WebCore::adjustContentsScrollPositionOrSizeForZoom): Moved some logic from HtmlBodyElement
to handle the case of the scrolling element. Also add a FIXME for improving these kinds of
helper functions. Renamed to make more explicit the semantic of the value argument.
(WebCore::Element::scrollLeft): Moved some logic from HtmlBodyElement to handle the case of
the scrolling element. Use the new documentFrameWithNonNullView() helper function.
(WebCore::Element::scrollTop): Ditto.
(WebCore::Element::setScrollLeft): Ditto
(WebCore::Element::setScrollTop): Ditto.
(WebCore::Element::scrollWidth): Ditto.
(WebCore::Element::scrollHeight): Ditto.
* dom/Element.h:
(WebCore::Document::documentFrameWithNonNullView): New helper function to retrieve the
frame and ensure a view is available.
* html/HTMLBodyElement.cpp: Remove code that is now in Element.
* html/HTMLBodyElement.h: Ditto.

Source/WebKit:

* WebProcess/InjectedBundle/API/gtk/DOM/WebKitDOMDocumentGtk.cpp:
(webkit_dom_document_get_scrolling_element): Use the new name.

Source/WebKitLegacy/mac:

* DOM/DOMDocument.mm:
(-[DOMDocument scrollingElement]): Use the new name.

Tools:

This patch enables CSSOMViewScrollingAPI during test execution.

* DumpRenderTree/mac/DumpRenderTree.mm:
(enableExperimentalFeatures):
(resetWebPreferencesToConsistentValues):
* DumpRenderTree/win/DumpRenderTree.cpp:
(enableExperimentalFeatures):
* WebKitTestRunner/TestController.cpp:
(WTR::TestController::resetPreferencesToConsistentValues):

LayoutTests:

This commit updates some tests to work when CSSOMViewScrollingAPI is enabled.

* TestExpectations: Enable web-platform-tests/cssom-view/scrollingElement.html.
* fast/dom/Document/scrollingElement-quirks-mode.html: Do not enable explictly enable
CSSOMViewScrollingAPI.
* fast/dom/Document/scrollingElement-standards-mode.html: Ditto.
* fast/dom/Element/body-scrollLeft-expected.txt: Updated to follow the CSSOMView spec.
* fast/dom/Element/body-scrollLeft.html: Ditto.
* fast/dom/Element/body-scrollTop-expected.txt: Ditto.
* fast/dom/Element/body-scrollTop.html: Ditto.
* fast/dom/Element/documentElement-scrollLeft-expected.txt: Ditto.
* fast/dom/Element/documentElement-scrollLeft.html: Ditto.
* fast/dom/Element/documentElement-scrollTop-expected.txt: Ditto.
* fast/dom/Element/documentElement-scrollTop.html: Ditto.
* fast/dom/Element/scrollLeft-expected.txt: Ditto.
* fast/dom/Element/scrollLeft.html: Ditto.
* fast/dom/Element/scrollTop-expected.txt: Ditto.
* fast/dom/Element/scrollTop.html: Ditto.
* fast/dom/Element/scrolling-funtions-on-body-expected.txt: Ditto.
* fast/dom/Element/scrolling-funtions-on-body.html: Ditto.
* platform/ios/TestExpectations: Add expectation for one WPT test that was already failing
on iOS.
* platform/ios/ios/fast/coordinates/page-offsets-expected.txt: Use documentElement instead
of body for this test when running in standard mode.
* platform/ios/ios/fast/coordinates/resources/helpers.js: Ditto.
(verifyScrollOffsets):
* tiled-drawing/scrolling/fast-scroll-div-latched-mainframe.html: Use
document.scrollingElement instead of document.body to access viewport scroll offset.

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

43 files changed:
LayoutTests/ChangeLog
LayoutTests/TestExpectations
LayoutTests/fast/dom/Document/scrollingElement-quirks-mode.html
LayoutTests/fast/dom/Document/scrollingElement-standards-mode.html
LayoutTests/fast/dom/Element/body-scrollLeft-expected.txt
LayoutTests/fast/dom/Element/body-scrollLeft.html
LayoutTests/fast/dom/Element/body-scrollTop-expected.txt
LayoutTests/fast/dom/Element/body-scrollTop.html
LayoutTests/fast/dom/Element/documentElement-scrollLeft-expected.txt
LayoutTests/fast/dom/Element/documentElement-scrollLeft.html
LayoutTests/fast/dom/Element/documentElement-scrollTop-expected.txt
LayoutTests/fast/dom/Element/documentElement-scrollTop.html
LayoutTests/fast/dom/Element/scrollLeft-expected.txt
LayoutTests/fast/dom/Element/scrollLeft.html
LayoutTests/fast/dom/Element/scrollTop-expected.txt
LayoutTests/fast/dom/Element/scrollTop.html
LayoutTests/fast/dom/Element/scrolling-funtions-on-body-expected.txt
LayoutTests/fast/dom/Element/scrolling-funtions-on-body.html
LayoutTests/imported/w3c/ChangeLog
LayoutTests/imported/w3c/web-platform-tests/css/cssom-view/HTMLBody-ScrollArea_quirksmode-expected.txt
LayoutTests/imported/w3c/web-platform-tests/css/cssom-view/scrolling-quirks-vs-nonquirks-expected.txt
LayoutTests/imported/w3c/web-platform-tests/css/cssom-view/scrollingElement-expected.txt [new file with mode: 0644]
LayoutTests/platform/ios-wk2/imported/w3c/web-platform-tests/css/cssom-view/scrolling-quirks-vs-nonquirks-expected.txt [deleted file]
LayoutTests/platform/ios/TestExpectations
LayoutTests/platform/ios/ios/fast/coordinates/page-offsets-expected.txt
LayoutTests/platform/ios/ios/fast/coordinates/resources/helpers.js
LayoutTests/tiled-drawing/scrolling/fast-scroll-div-latched-mainframe.html
Source/WebCore/ChangeLog
Source/WebCore/dom/Document.cpp
Source/WebCore/dom/Document.h
Source/WebCore/dom/Document.idl
Source/WebCore/dom/Element.cpp
Source/WebCore/dom/Element.h
Source/WebCore/html/HTMLBodyElement.cpp
Source/WebCore/html/HTMLBodyElement.h
Source/WebKit/ChangeLog
Source/WebKit/WebProcess/InjectedBundle/API/gtk/DOM/WebKitDOMDocumentGtk.cpp
Source/WebKitLegacy/mac/ChangeLog
Source/WebKitLegacy/mac/DOM/DOMDocument.mm
Tools/ChangeLog
Tools/DumpRenderTree/mac/DumpRenderTree.mm
Tools/DumpRenderTree/win/DumpRenderTree.cpp
Tools/WebKitTestRunner/TestController.cpp

index 08bc975..e77b3bf 100644 (file)
@@ -1,3 +1,39 @@
+2018-09-07  Frederic Wang  <fwang@igalia.com>
+
+        [CSSOM View] Handle the scrollingElement in Element::scroll(Left/Top/Width/Height/To)
+        https://bugs.webkit.org/show_bug.cgi?id=182230
+
+        Reviewed by Simon Fraser.
+
+        This commit updates some tests to work when CSSOMViewScrollingAPI is enabled.
+
+        * TestExpectations: Enable web-platform-tests/cssom-view/scrollingElement.html.
+        * fast/dom/Document/scrollingElement-quirks-mode.html: Do not enable explictly enable
+        CSSOMViewScrollingAPI.
+        * fast/dom/Document/scrollingElement-standards-mode.html: Ditto.
+        * fast/dom/Element/body-scrollLeft-expected.txt: Updated to follow the CSSOMView spec.
+        * fast/dom/Element/body-scrollLeft.html: Ditto.
+        * fast/dom/Element/body-scrollTop-expected.txt: Ditto.
+        * fast/dom/Element/body-scrollTop.html: Ditto.
+        * fast/dom/Element/documentElement-scrollLeft-expected.txt: Ditto.
+        * fast/dom/Element/documentElement-scrollLeft.html: Ditto.
+        * fast/dom/Element/documentElement-scrollTop-expected.txt: Ditto.
+        * fast/dom/Element/documentElement-scrollTop.html: Ditto.
+        * fast/dom/Element/scrollLeft-expected.txt: Ditto.
+        * fast/dom/Element/scrollLeft.html: Ditto.
+        * fast/dom/Element/scrollTop-expected.txt: Ditto.
+        * fast/dom/Element/scrollTop.html: Ditto.
+        * fast/dom/Element/scrolling-funtions-on-body-expected.txt: Ditto.
+        * fast/dom/Element/scrolling-funtions-on-body.html: Ditto.
+        * platform/ios/TestExpectations: Add expectation for one WPT test that was already failing
+        on iOS.
+        * platform/ios/ios/fast/coordinates/page-offsets-expected.txt: Use documentElement instead
+        of body for this test when running in standard mode.
+        * platform/ios/ios/fast/coordinates/resources/helpers.js: Ditto.
+        (verifyScrollOffsets):
+        * tiled-drawing/scrolling/fast-scroll-div-latched-mainframe.html: Use
+        document.scrollingElement instead of document.body to access viewport scroll offset.
+
 2018-09-07  Zalan Bujtas  <zalan@apple.com>
 
         [iOS] Unreviewed test gardening.
index 05e2948..cb40aa5 100644 (file)
@@ -1892,9 +1892,6 @@ fast/table/colspanMinWidth-vertical.html [ Skip ]
 # Test only works on iOS WK2. webkit.org/b/165535
 fast/forms/range/range-remove-on-drag.html [ Skip ]
 
-# CSSOM View module
-webkit.org/b/5991 imported/w3c/web-platform-tests/css/cssom-view/scrollingElement.html [ Skip ]
-
 # FileAPI
 webkit.org/b/172099 imported/w3c/web-platform-tests/FileAPI/url/url_xmlhttprequest_img.html [ ImageOnlyFailure ]
 imported/w3c/web-platform-tests/FileAPI/url/sandboxed-iframe.html [ Failure ]
index 56492a0..8cfc3e9 100644 (file)
@@ -5,8 +5,6 @@
 </head>
 <body>
 <script>
-if (window.internals)
-    internals.settings.setCSSOMViewScrollingAPIEnabled(true);
 
 description("Tests the behavior of document.scrollingElement in quirks mode.");
 
index 89012f7..bf8bff3 100644 (file)
@@ -6,8 +6,6 @@
 </head>
 <body>
 <script>
-if (window.internals)
-    internals.settings.setCSSOMViewScrollingAPIEnabled(true);
 
 description("Tests the behavior of document.scrollingElement in standards mode.");
 
index cfae951..98e6898 100644 (file)
@@ -6,7 +6,7 @@ On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE
 PASS successfullyParsed is true
 
 TEST COMPLETE
-PASS document.body.scrollLeft is 500
+PASS document.body.scrollLeft is 0
 PASS successfullyParsed is true
 
 TEST COMPLETE
index a7174bb..ad0018e 100644 (file)
@@ -12,8 +12,8 @@
             function runTest() {
                 description('Tests that for non-standard mode document.body.scrollLeft returns the scroll left value as 0');
 
-                document.body.scrollLeft = 500;
-                shouldBe("document.body.scrollLeft","500");
+                document.body.scrollLeft = 0;
+                shouldBe("document.body.scrollLeft","0");
                 isSuccessfullyParsed();
                        }
         </script>
index 3b23a4b..9849308 100644 (file)
@@ -6,7 +6,7 @@ On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE
 PASS successfullyParsed is true
 
 TEST COMPLETE
-PASS document.body.scrollTop is 500
+PASS document.body.scrollTop is 0
 PASS successfullyParsed is true
 
 TEST COMPLETE
index aa35737..d1a194d 100644 (file)
@@ -13,7 +13,7 @@
                 description('Tests that for non-standard mode document.body.scrollTop returns the scroll top value as 0');
 
                 document.body.scrollTop = 500;
-                shouldBe("document.body.scrollTop","500");
+                shouldBe("document.body.scrollTop","0");
                                isSuccessfullyParsed();
             }
         </script>
index 1dacc16..8fcd8f7 100644 (file)
@@ -6,7 +6,7 @@ On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE
 PASS successfullyParsed is true
 
 TEST COMPLETE
-PASS document.documentElement.scrollLeft is 0
+PASS document.documentElement.scrollLeft is 500
 PASS successfullyParsed is true
 
 TEST COMPLETE
index 1239692..40f8dc1 100644 (file)
@@ -13,7 +13,7 @@
                 description('Tests that for standard mode document.documentElement.scrollLeft returns the scroll left value');
 
                 document.documentElement.scrollLeft = 500;
-                shouldBe("document.documentElement.scrollLeft","0");
+                shouldBe("document.documentElement.scrollLeft","500");
                 isSuccessfullyParsed();
             }
         </script>
index 664e7ae..671d84b 100644 (file)
@@ -3,7 +3,7 @@ Tests that for standard mode document.documentElement.scrollTop returns the scro
 On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
 
 
-PASS document.documentElement.scrollTop is 0
+PASS document.documentElement.scrollTop is 500
 PASS successfullyParsed is true
 
 TEST COMPLETE
index fcfeade..03adca5 100644 (file)
@@ -13,7 +13,7 @@
                 description('Tests that for standard mode document.documentElement.scrollTop returns the scroll top value');
 
                 document.documentElement.scrollTop = 500;
-                shouldBe("document.documentElement.scrollTop","0");
+                shouldBe("document.documentElement.scrollTop","500");
                 isSuccessfullyParsed();
             }
         </script>
index 99bc52c..0a23454 100644 (file)
@@ -4,8 +4,8 @@ On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE
 
 
 PASS window.pageXOffset is 500
-PASS document.body.scrollLeft is 500
-PASS document.documentElement.scrollLeft is 0
+PASS document.body.scrollLeft is 0
+PASS document.documentElement.scrollLeft is 500
 PASS successfullyParsed is true
 
 TEST COMPLETE
index f8d39bd..4d9d68e 100644 (file)
@@ -15,8 +15,8 @@
                 setTimeout(function() {\r
                     window.scrollTo(500,0);\r
                     shouldBe("window.pageXOffset","500");\r
-                    shouldBe("document.body.scrollLeft","500");\r
-                    shouldBe("document.documentElement.scrollLeft","0");\r
+                    shouldBe("document.body.scrollLeft","0");\r
+                    shouldBe("document.documentElement.scrollLeft","500");\r
                     finishJSTest();\r
                 }, 0);\r
             }\r
index 0f7716c..405aed5 100644 (file)
@@ -4,8 +4,8 @@ On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE
 
 
 PASS window.pageYOffset is 500
-PASS document.body.scrollTop is 500
-PASS document.documentElement.scrollTop is 0
+PASS document.body.scrollTop is 0
+PASS document.documentElement.scrollTop is 500
 PASS successfullyParsed is true
 
 TEST COMPLETE
index 0a5631a..f0e5c37 100644 (file)
@@ -15,8 +15,8 @@
                 setTimeout(function() {\r
                     window.scrollTo(0,500);\r
                     shouldBe("window.pageYOffset","500");\r
-                    shouldBe("document.body.scrollTop","500");\r
-                    shouldBe("document.documentElement.scrollTop","0");\r
+                    shouldBe("document.body.scrollTop","0");\r
+                    shouldBe("document.documentElement.scrollTop","500");\r
                     finishJSTest();\r
                 }, 0);\r
             }\r
index 077fb9a..4a1dcbb 100644 (file)
@@ -1,20 +1,20 @@
-Tests scrollTo/By(x,y) and scrollTo/By(scrollOptions) on the body. WebKit always uses quirks mode for body scrolling behavior, so this scrolls the window.
+Tests scrollTo/By(x,y) and scrollTo/By(scrollOptions) on the body in standard mode.
 
 On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
 
 
-PASS scroller.scrollLeft is 20
-PASS scroller.scrollTop is 500
-PASS window.scrollX is 20
-PASS window.scrollY is 500
-PASS scroller.scrollLeft is 70
-PASS scroller.scrollTop is 560
-PASS window.scrollX is 70
-PASS window.scrollY is 560
-PASS scroller.scrollLeft is 100
-PASS scroller.scrollTop is 400
-PASS window.scrollX is 100
-PASS window.scrollY is 400
+PASS scroller.scrollLeft is 0
+PASS scroller.scrollTop is 0
+PASS window.scrollX is 0
+PASS window.scrollY is 0
+PASS scroller.scrollLeft is 0
+PASS scroller.scrollTop is 0
+PASS window.scrollX is 0
+PASS window.scrollY is 0
+PASS scroller.scrollLeft is 0
+PASS scroller.scrollTop is 0
+PASS window.scrollX is 0
+PASS window.scrollY is 0
 PASS successfullyParsed is true
 
 TEST COMPLETE
index 3191d0e..3f23eb2 100644 (file)
         <script>\r
             var scroller;\r
             function runTest() {\r
-                description('Tests scrollTo/By(x,y) and scrollTo/By(scrollOptions) on the body. WebKit always uses quirks mode for body scrolling behavior, so this scrolls the window.');\r
+                description('Tests scrollTo/By(x,y) and scrollTo/By(scrollOptions) on the body in standard mode.');\r
                 \r
                 scroller = document.body;\r
                 setTimeout(function() {\r
                     scroller.scrollTo(20, 500);\r
-                    shouldBe("scroller.scrollLeft", "20");\r
-                    shouldBe("scroller.scrollTop", "500");\r
-                    shouldBe("window.scrollX", "20");\r
-                    shouldBe("window.scrollY", "500");\r
+                    shouldBe("scroller.scrollLeft", "0");\r
+                    shouldBe("scroller.scrollTop", "0");\r
+                    shouldBe("window.scrollX", "0");\r
+                    shouldBe("window.scrollY", "0");\r
 \r
                     scroller.scrollBy(50, 60);\r
-                    shouldBe("scroller.scrollLeft", "70");\r
-                    shouldBe("scroller.scrollTop", "560");\r
-                    shouldBe("window.scrollX", "70");\r
-                    shouldBe("window.scrollY", "560");\r
+                    shouldBe("scroller.scrollLeft", "0");\r
+                    shouldBe("scroller.scrollTop", "0");\r
+                    shouldBe("window.scrollX", "0");\r
+                    shouldBe("window.scrollY", "0");\r
 \r
                     scroller.scrollTo({ 'left' : 100, 'top' : 400 });\r
-                    shouldBe("scroller.scrollLeft", "100");\r
-                    shouldBe("scroller.scrollTop", "400");\r
-                    shouldBe("window.scrollX", "100");\r
-                    shouldBe("window.scrollY", "400");\r
+                    shouldBe("scroller.scrollLeft", "0");\r
+                    shouldBe("scroller.scrollTop", "0");\r
+                    shouldBe("window.scrollX", "0");\r
+                    shouldBe("window.scrollY", "0");\r
 \r
                     scroller.scrollTo(0, 0);\r
 \r
index 2eccbd8..7d84421 100644 (file)
@@ -1,3 +1,17 @@
+2018-09-07  Frederic Wang  <fwang@igalia.com>
+
+        [CSSOM View] Handle the scrollingElement in Element::scroll(Left/Top/Width/Height/To)
+        https://bugs.webkit.org/show_bug.cgi?id=182230
+
+        Reviewed by Simon Fraser.
+
+        This commit updates expectations for some WPT tests so that they have only PASS results.
+        Note that css/cssom-view/scrollingElement-quirks-dynamic-*.html still fail for now (bug 182292).
+
+        * web-platform-tests/css/cssom-view/HTMLBody-ScrollArea_quirksmode-expected.txt:
+        * web-platform-tests/css/cssom-view/scrolling-quirks-vs-nonquirks-expected.txt:
+        * web-platform-tests/css/cssom-view/scrollingElement-expected.txt: Added.
+
 2018-09-05  Youenn Fablet  <youenn@apple.com>
 
         Expose RTCRtpSender.setParameters
index 45e53bb..402333d 100644 (file)
@@ -3,10 +3,9 @@ PASS Ensure that body element is loaded.
 PASS Ensure that style.overflowY can be set properly. 
 PASS document.compatMode should be BackCompat in quirks. 
 PASS document.scrollingElement should be body element in quirks. 
-FAIL scrollingElement in quirks should be null when body is potentially scrollable. assert_equals: In quirks, we would expect null here (because of potentially scrollable body) expected null but got Element node <body id="thebody" style="overflow-y: scroll;">
-    <div ...
+PASS scrollingElement in quirks should be null when body is potentially scrollable. 
 PASS scrollingElement in quirks should be body if any of document and body has a visible overflow. 
-FAIL When body potentially scrollable, document.body.scrollHeight changes when changing the height of the body content in quirks. assert_not_equals: got disallowed value 600
+PASS When body potentially scrollable, document.body.scrollHeight changes when changing the height of the body content in quirks. 
 PASS When body not potentially scrollable, document.body.scrollHeight always equals window.innerHeight in quirks. (cond. visible, scroll) 
 PASS When body not potentially scrollable, document.body.scrollHeight always equals window.innerHeight in quirks. (cond. scroll, visible) 
 PASS When body not potentially scrollable, document.body.scrollHeight always equals window.innerHeight in quirks. (cond. visible, visible) 
index 284af1f..8f5148d 100644 (file)
@@ -16,16 +16,16 @@ PASS clientWidth/clientHeight on the HTML body element in quirks mode
 PASS scrollLeft/scrollRight of the content in quirks mode 
 PASS scrollWidth/scrollHeight of the content in quirks mode 
 PASS clientWidth/clientHeight of the content in quirks mode 
-FAIL scrollingElement in non-quirks mode assert_equals: scrollingElement should be documentElement expected Element node <html><head></head><body style="overflow: hidden; margin:... but got Element node <body style="overflow: hidden; margin: 0px; border-width:...
-FAIL scroll() on the root element in non-quirks mode assert_equals: scrollLeft should be 50 expected 50 but got 0
-FAIL scrollBy() on the root element in non-quirks mode assert_equals: scrollLeft should be 60 expected 60 but got 0
-FAIL scrollLeft/scrollTop on the root element in non-quirks mode assert_equals: scrollLeft should be 70 expected 70 but got 0
+PASS scrollingElement in non-quirks mode 
+PASS scroll() on the root element in non-quirks mode 
+PASS scrollBy() on the root element in non-quirks mode 
+PASS scrollLeft/scrollTop on the root element in non-quirks mode 
 PASS scrollWidth/scrollHeight on the root element in non-quirks mode 
 PASS clientWidth/clientHeight on the root element in non-quirks mode 
-FAIL scroll() on the HTML body element in non-quirks mode assert_equals: scrollLeft should be 0 expected 0 but got 90
-FAIL scrollBy() on the HTML body element in non-quirks mode assert_equals: scrollLeft should be 0 expected 0 but got 100
-FAIL scrollLeft/scrollTop on the HTML body element in non-quirks mode assert_equals: scrollLeft should be 0 expected 0 but got 120
-FAIL scrollWidth/scrollHeight on the HTML body element in non-quirks mode assert_equals: scrollWidth should be 700 expected 700 but got 720
+PASS scroll() on the HTML body element in non-quirks mode 
+PASS scrollBy() on the HTML body element in non-quirks mode 
+PASS scrollLeft/scrollTop on the HTML body element in non-quirks mode 
+PASS scrollWidth/scrollHeight on the HTML body element in non-quirks mode 
 PASS clientWidth/clientHeight on the HTML body element in non-quirks mode 
 PASS scrollLeft/scrollRight of the content in non-quirks mode 
 PASS scrollWidth/scrollHeight of the content in non-quirks mode 
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/cssom-view/scrollingElement-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/css/cssom-view/scrollingElement-expected.txt
new file mode 100644 (file)
index 0000000..627259a
--- /dev/null
@@ -0,0 +1,5 @@
+
+PASS scrollingElement in quirks mode 
+PASS scrollingElement in no-quirks mode 
+
diff --git a/LayoutTests/platform/ios-wk2/imported/w3c/web-platform-tests/css/cssom-view/scrolling-quirks-vs-nonquirks-expected.txt b/LayoutTests/platform/ios-wk2/imported/w3c/web-platform-tests/css/cssom-view/scrolling-quirks-vs-nonquirks-expected.txt
deleted file mode 100644 (file)
index 605dd36..0000000
+++ /dev/null
@@ -1,33 +0,0 @@
-
-PASS Execution of tests in quirks mode 
-PASS Execution of tests in non-quirks mode 
-PASS scrollingElement in quirks mode 
-PASS scroll() on the root element in quirks mode 
-PASS scrollBy() on the root element in quirks mode 
-PASS scrollLeft/scrollTop on the root element in quirks mode 
-PASS scrollWidth/scrollHeight on the root element in quirks mode 
-PASS clientWidth/clientHeight on the root element in quirks mode 
-FAIL scroll() on the HTML body element in quirks mode assert_equals: scrollLeft should be 90 expected 90 but got 0
-FAIL scrollBy() on the HTML body element in quirks mode assert_equals: scrollLeft should be 100 expected 100 but got 0
-FAIL scrollLeft/scrollTop on the HTML body element in quirks mode assert_equals: scrollLeft should be 120 expected 120 but got 0
-PASS scrollWidth/scrollHeight on the HTML body element in quirks mode 
-PASS clientWidth/clientHeight on the HTML body element in quirks mode 
-PASS scrollLeft/scrollRight of the content in quirks mode 
-PASS scrollWidth/scrollHeight of the content in quirks mode 
-PASS clientWidth/clientHeight of the content in quirks mode 
-FAIL scrollingElement in non-quirks mode assert_equals: scrollingElement should be documentElement expected Element node <html><head></head><body style="overflow: hidden; margin:... but got Element node <body style="overflow: hidden; margin: 0px; border-width:...
-FAIL scroll() on the root element in non-quirks mode assert_equals: scrollLeft should be 50 expected 50 but got 0
-FAIL scrollBy() on the root element in non-quirks mode assert_equals: scrollLeft should be 60 expected 60 but got 0
-FAIL scrollLeft/scrollTop on the root element in non-quirks mode assert_equals: scrollLeft should be 70 expected 70 but got 0
-PASS scrollWidth/scrollHeight on the root element in non-quirks mode 
-PASS clientWidth/clientHeight on the root element in non-quirks mode 
-PASS scroll() on the HTML body element in non-quirks mode 
-PASS scrollBy() on the HTML body element in non-quirks mode 
-PASS scrollLeft/scrollTop on the HTML body element in non-quirks mode 
-FAIL scrollWidth/scrollHeight on the HTML body element in non-quirks mode assert_equals: scrollWidth should be 700 expected 700 but got 720
-PASS clientWidth/clientHeight on the HTML body element in non-quirks mode 
-PASS scrollLeft/scrollRight of the content in non-quirks mode 
-PASS scrollWidth/scrollHeight of the content in non-quirks mode 
-PASS clientWidth/clientHeight of the content in non-quirks mode 
-
index 2e0b41f..2b39100 100644 (file)
@@ -2648,6 +2648,8 @@ webkit.org/b/163291 media/video-play-require-user-gesture.html
 
 webkit.org/b/163755 imported/w3c/web-platform-tests/css/css-shapes [ Skip ]
 
+webkit.org/b/5991 imported/w3c/web-platform-tests/css/cssom-view/scrolling-quirks-vs-nonquirks.html [ Failure ]
+
 # Variation fonts are not implemented earlier than iOS 11.
 fast/text/variations [ Pass Failure ImageOnlyFailure ]
 animations/font-variations [ Pass Failure ImageOnlyFailure Timeout ]
index 8983034..7daee5e 100644 (file)
@@ -3,18 +3,18 @@ On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE
 unscaled
 PASS window.scrollX is 0
 PASS window.pageXOffset is 0
-PASS document.body.scrollLeft is 0
+PASS document.documentElement.scrollLeft is 0
 PASS window.scrollY is 0
 PASS window.pageYOffset is 0
-PASS document.body.scrollTop is 0
+PASS document.documentElement.scrollTop is 0
 
 scaled and panned
 PASS window.scrollX is 10
 PASS window.pageXOffset is 10
-PASS document.body.scrollLeft is 10
+PASS document.documentElement.scrollLeft is 10
 PASS window.scrollY is 10
 PASS window.pageYOffset is 10
-PASS document.body.scrollTop is 10
+PASS document.documentElement.scrollTop is 10
 PASS successfullyParsed is true
 
 TEST COMPLETE
index cdd75b9..d1b9695 100644 (file)
@@ -51,10 +51,10 @@ function setExpectedScrollOffsets(x, y) {
 function verifyScrollOffsets() {
     shouldBe('window.scrollX', expectedScrollX.toString());
     shouldBe('window.pageXOffset', expectedScrollX.toString());
-    shouldBe('document.body.scrollLeft', expectedScrollX.toString());
+    shouldBe('document.documentElement.scrollLeft', expectedScrollX.toString());
     shouldBe('window.scrollY', expectedScrollY.toString());
     shouldBe('window.pageYOffset', expectedScrollY.toString());
-    shouldBe('document.body.scrollTop', expectedScrollY.toString());
+    shouldBe('document.documentElement.scrollTop', expectedScrollY.toString());
 }
 
 // To verify visible window sizes.
index 5783f7a..1b3dfe0 100644 (file)
@@ -43,14 +43,14 @@ var continueCount = 5;
 
 function onPageScroll()
 {
-    if (document.body.scrollTop >= 70)
+    if (document.scrollingElement.scrollTop >= 70)
         checkForScroll();
 }
 
 function checkForScroll()
 {
     // The div should not have scrolled at all.
-    var pageScrollPositionAfter = document.body.scrollTop;
+    var pageScrollPositionAfter = document.scrollingElement.scrollTop;
     var divScrollPositionAfter = divTarget.scrollTop;
 
     if (divScrollPositionBefore != divScrollPositionAfter)
@@ -68,7 +68,7 @@ function checkForScroll()
 
 function scrollTest()
 {
-    pageScrollPositionBefore = document.body.scrollTop;
+    pageScrollPositionBefore = document.scrollingElement.scrollTop;
 
     divTarget = document.getElementById('target');
 
index a5b2fbb..15df530 100644 (file)
@@ -1,3 +1,46 @@
+2018-09-07  Frederic Wang  <fwang@igalia.com>
+
+        [CSSOM View] Handle the scrollingElement in Element::scroll(Left/Top/Width/Height/To)
+        https://bugs.webkit.org/show_bug.cgi?id=182230
+
+        Reviewed by Simon Fraser.
+
+        This commit moves the special logic for "scrolling element" body from the
+        HtmlBodyElement::scroll(Left/Top/Width/Height/To) functions to the Element class. The code
+        is executed when the element is the scrolling element which includes the case of body
+        in Quirks mode and of documentElement in standard mode. This makes the behavior closer to
+        the CSSOM View spec (bug 5991) while not deviating too much from the current implementation.
+        Finally, CSSOMViewScrollingAPI is now enabled for running tests and some adjustments are made
+        to existing tests. Further improvements will be performed in dependencies of bug 5991.
+
+        No new tests, already covered by existing tests.
+
+        * dom/Document.cpp: Split scrollingElement into two functions so that one can be called
+        internally without updating the layout.
+        (WebCore::Document::scrollingElement):
+        (WebCore::Document::scrollingElementForAPI):
+        * dom/Document.h: Ditto.
+        * dom/Document.idl: Use the version updating the layout for API calls.
+        * dom/Element.cpp: Add include to call DOMWindow::ScrollTo
+        (WebCore::Element::scrollTo): Moved some logic from HtmlBodyElement to handle the case of
+        the scrolling element. Also skip special handling of documentElement() when
+        CSSOMViewScrollingAPI is disabled.
+        (WebCore::adjustContentsScrollPositionOrSizeForZoom): Moved some logic from HtmlBodyElement
+        to handle the case of the scrolling element. Also add a FIXME for improving these kinds of
+        helper functions. Renamed to make more explicit the semantic of the value argument.
+        (WebCore::Element::scrollLeft): Moved some logic from HtmlBodyElement to handle the case of
+        the scrolling element. Use the new documentFrameWithNonNullView() helper function.
+        (WebCore::Element::scrollTop): Ditto.
+        (WebCore::Element::setScrollLeft): Ditto
+        (WebCore::Element::setScrollTop): Ditto.
+        (WebCore::Element::scrollWidth): Ditto.
+        (WebCore::Element::scrollHeight): Ditto.
+        * dom/Element.h:
+        (WebCore::Document::documentFrameWithNonNullView): New helper function to retrieve the
+        frame and ensure a view is available.
+        * html/HTMLBodyElement.cpp: Remove code that is now in Element.
+        * html/HTMLBodyElement.h: Ditto.
+
 2018-09-07  Don Olmstead  <don.olmstead@sony.com>
 
         [AX] Fix compile error in AXObjectCache constructor when !HAVE(ACCESSIBILITY)
index 12cbbe7..a9ab459 100644 (file)
@@ -1461,6 +1461,13 @@ bool Document::isBodyPotentiallyScrollable(HTMLBodyElement& body)
         && !body.computedStyle()->isOverflowVisible();
 }
 
+Element* Document::scrollingElementForAPI()
+{
+    if (inQuirksMode() && settings().CSSOMViewScrollingAPIEnabled())
+        updateLayoutIgnorePendingStylesheets();
+    return scrollingElement();
+}
+
 Element* Document::scrollingElement()
 {
     if (settings().CSSOMViewScrollingAPIEnabled()) {
@@ -1468,7 +1475,6 @@ Element* Document::scrollingElement()
         // The scrollingElement attribute, on getting, must run these steps:
         // 1. If the Document is in quirks mode, follow these substeps:
         if (inQuirksMode()) {
-            updateLayoutIgnorePendingStylesheets();
             auto* firstBody = body();
             // 1. If the HTML body element exists, and it is not potentially scrollable, return the
             // HTML body element and abort these steps.
index d6e24f5..b64973d 100644 (file)
@@ -448,7 +448,8 @@ public:
     WEBCORE_EXPORT RefPtr<Range> caretRangeFromPoint(int x, int y);
     RefPtr<Range> caretRangeFromPoint(const LayoutPoint& clientPoint);
 
-    WEBCORE_EXPORT Element* scrollingElement();
+    WEBCORE_EXPORT Element* scrollingElementForAPI();
+    Element* scrollingElement();
 
     enum ReadyState {
         Loading,
index 35ff9c0..d54d8c7 100644 (file)
@@ -132,7 +132,7 @@ typedef (
     readonly attribute StyleSheetList styleSheets; // FIXME: Should be [SameObject].
 
     // Extensions from the CSSOM-View specification (https://drafts.csswg.org/cssom-view/#extensions-to-the-document-interface).
-    readonly attribute Element? scrollingElement;
+    [ImplementedAs=scrollingElementForAPI] readonly attribute Element? scrollingElement;
 
     // Extensions from Selection API (https://www.w3.org/TR/selection-api/#extensions-to-document-interface).
     // FIXME: Should likely be moved to DocumentOrShadowRoot.
index 1b3bcac..14e3c07 100644 (file)
@@ -41,6 +41,7 @@
 #include "DOMRect.h"
 #include "DOMRectList.h"
 #include "DOMTokenList.h"
+#include "DOMWindow.h"
 #include "DocumentSharedObjectPool.h"
 #include "DocumentTimeline.h"
 #include "Editing.h"
@@ -756,13 +757,27 @@ void Element::scrollBy(double x, double y)
 
 void Element::scrollTo(const ScrollToOptions& options, ScrollClamping clamping)
 {
-    // If the element is the root element and document is in quirks mode, terminate these steps.
-    // Note that WebKit always uses quirks mode document scrolling behavior. See Document::scrollingElement().
-    if (this == document().documentElement())
-        return;
+    if (!document().settings().CSSOMViewScrollingAPIEnabled()) {
+        // If the element is the root element and document is in quirks mode, terminate these steps.
+        // Note that WebKit always uses quirks mode document scrolling behavior. See Document::scrollingElement().
+        if (this == document().documentElement())
+            return;
+    }
 
     document().updateLayoutIgnorePendingStylesheets();
 
+    if (document().scrollingElement() == this) {
+        // If the element is the scrolling element and is not potentially scrollable,
+        // invoke scroll() on window with options as the only argument, and terminate these steps.
+        // FIXME: Scrolling an independently scrollable body is broken: webkit.org/b/161612.
+        auto window = makeRefPtr(document().domWindow());
+        if (!window)
+            return;
+
+        window->scrollTo(options);
+        return;
+    }
+
     // If the element does not have any associated CSS layout box, the element has no associated scrolling box,
     // or the element has no overflow, terminate these steps.
     RenderBox* renderer = renderBox();
@@ -843,6 +858,18 @@ static double adjustForLocalZoom(LayoutUnit value, const RenderElement& renderer
     return value.toDouble() / zoomFactor;
 }
 
+static int adjustContentsScrollPositionOrSizeForZoom(int value, const Frame& frame)
+{
+    double zoomFactor = frame.pageZoomFactor() * frame.frameScaleFactor();
+    if (zoomFactor == 1)
+        return value;
+    // FIXME (webkit.org/b/189397): Why can't we just ceil/floor?
+    // Needed because of truncation (rather than rounding) when scaling up.
+    if (zoomFactor > 1)
+        value++;
+    return static_cast<int>(value / zoomFactor);
+}
+
 enum LegacyCSSOMElementMetricsRoundingStrategy { Round, Floor };
 
 static bool subpixelMetricsEnabled(const Document& document)
@@ -984,10 +1011,22 @@ double Element::clientHeight()
     return 0;
 }
 
+ALWAYS_INLINE Frame* Element::documentFrameWithNonNullView() const
+{
+    auto* frame = document().frame();
+    return frame && frame->view() ? frame : nullptr;
+}
+
 int Element::scrollLeft()
 {
     document().updateLayoutIgnorePendingStylesheets();
 
+    if (document().scrollingElement() == this) {
+        if (auto* frame = documentFrameWithNonNullView())
+            return adjustContentsScrollPositionOrSizeForZoom(frame->view()->contentsScrollPosition().x(), *frame);
+        return 0;
+    }
+
     if (auto* renderer = renderBox())
         return adjustForAbsoluteZoom(renderer->scrollLeft(), *renderer);
     return 0;
@@ -997,6 +1036,12 @@ int Element::scrollTop()
 {
     document().updateLayoutIgnorePendingStylesheets();
 
+    if (document().scrollingElement() == this) {
+        if (auto* frame = documentFrameWithNonNullView())
+            return adjustContentsScrollPositionOrSizeForZoom(frame->view()->contentsScrollPosition().y(), *frame);
+        return 0;
+    }
+
     if (RenderBox* renderer = renderBox())
         return adjustForAbsoluteZoom(renderer->scrollTop(), *renderer);
     return 0;
@@ -1006,6 +1051,12 @@ void Element::setScrollLeft(int newLeft)
 {
     document().updateLayoutIgnorePendingStylesheets();
 
+    if (document().scrollingElement() == this) {
+        if (auto* frame = documentFrameWithNonNullView())
+            frame->view()->setScrollPosition(IntPoint(static_cast<int>(newLeft * frame->pageZoomFactor() * frame->frameScaleFactor()), frame->view()->scrollY()));
+        return;
+    }
+
     if (auto* renderer = renderBox()) {
         renderer->setScrollLeft(static_cast<int>(newLeft * renderer->style().effectiveZoom()));
         if (auto* scrollableArea = renderer->layer())
@@ -1017,6 +1068,12 @@ void Element::setScrollTop(int newTop)
 {
     document().updateLayoutIgnorePendingStylesheets();
 
+    if (document().scrollingElement() == this) {
+        if (auto* frame = documentFrameWithNonNullView())
+            frame->view()->setScrollPosition(IntPoint(frame->view()->scrollX(), static_cast<int>(newTop * frame->pageZoomFactor() * frame->frameScaleFactor())));
+        return;
+    }
+
     if (auto* renderer = renderBox()) {
         renderer->setScrollTop(static_cast<int>(newTop * renderer->style().effectiveZoom()));
         if (auto* scrollableArea = renderer->layer())
@@ -1027,6 +1084,15 @@ void Element::setScrollTop(int newTop)
 int Element::scrollWidth()
 {
     document().updateLayoutIfDimensionsOutOfDate(*this, WidthDimensionsCheck);
+
+    if (document().scrollingElement() == this) {
+        // FIXME (webkit.org/b/182289): updateLayoutIfDimensionsOutOfDate seems to ignore zoom level change.
+        document().updateLayoutIgnorePendingStylesheets();
+        if (auto* frame = documentFrameWithNonNullView())
+            return adjustContentsScrollPositionOrSizeForZoom(frame->view()->contentsWidth(), *frame);
+        return 0;
+    }
+
     if (auto* renderer = renderBox())
         return adjustForAbsoluteZoom(renderer->scrollWidth(), *renderer);
     return 0;
@@ -1035,6 +1101,15 @@ int Element::scrollWidth()
 int Element::scrollHeight()
 {
     document().updateLayoutIfDimensionsOutOfDate(*this, HeightDimensionsCheck);
+
+    if (document().scrollingElement() == this) {
+        // FIXME (webkit.org/b/182289): updateLayoutIfDimensionsOutOfDate seems to ignore zoom level change.
+        document().updateLayoutIgnorePendingStylesheets();
+        if (auto* frame = documentFrameWithNonNullView())
+            return adjustContentsScrollPositionOrSizeForZoom(frame->view()->contentsHeight(), *frame);
+        return 0;
+    }
+
     if (auto* renderer = renderBox())
         return adjustForAbsoluteZoom(renderer->scrollHeight(), *renderer);
     return 0;
index c83f508..8321393 100644 (file)
@@ -43,6 +43,7 @@ class DOMRect;
 class DOMRectList;
 class DOMTokenList;
 class ElementRareData;
+class Frame;
 class HTMLDocument;
 class IntSize;
 class JSCustomElementInterface;
@@ -605,6 +606,8 @@ protected:
     static ExceptionOr<void> mergeWithNextTextNode(Text&);
 
 private:
+    Frame* documentFrameWithNonNullView() const;
+
     bool isTextNode() const;
 
     bool isUserActionElementInActiveChain() const;
index 8442ac9..bbaf073 100644 (file)
@@ -30,8 +30,6 @@
 #include "DOMWindow.h"
 #include "DOMWrapperWorld.h"
 #include "EventNames.h"
-#include "Frame.h"
-#include "FrameView.h"
 #include "HTMLFrameElement.h"
 #include "HTMLIFrameElement.h"
 #include "HTMLNames.h"
@@ -52,13 +50,6 @@ HTMLBodyElement::HTMLBodyElement(const QualifiedName& tagName, Document& documen
     ASSERT(hasTagName(bodyTag));
 }
 
-bool HTMLBodyElement::isFirstBodyElementOfDocument() const
-{
-    // By spec http://dev.w3.org/csswg/cssom-view/#the-html-body-element
-    // "The HTML body element is the first body HTML element child of the root HTML element html."
-    return document().body() == this;
-}
-
 Ref<HTMLBodyElement> HTMLBodyElement::create(Document& document)
 {
     return adoptRef(*new HTMLBodyElement(bodyTag, document));
@@ -231,126 +222,6 @@ bool HTMLBodyElement::supportsFocus() const
     return hasEditableStyle() || HTMLElement::supportsFocus();
 }
 
-static int adjustForZoom(int value, const Frame& frame)
-{
-    double zoomFactor = frame.pageZoomFactor() * frame.frameScaleFactor();
-    if (zoomFactor == 1)
-        return value;
-    // Needed because of truncation (rather than rounding) when scaling up.
-    if (zoomFactor > 1)
-        value++;
-    return static_cast<int>(value / zoomFactor);
-}
-
-int HTMLBodyElement::scrollLeft()
-{
-    if (isFirstBodyElementOfDocument()) {
-        document().updateLayoutIgnorePendingStylesheets();
-        RefPtr<Frame> frame = document().frame();
-        if (!frame)
-            return 0;
-        RefPtr<FrameView> view = frame->view();
-        if (!view)
-            return 0;
-        return adjustForZoom(view->contentsScrollPosition().x(), *frame);
-    }
-    return HTMLElement::scrollLeft();
-}
-
-void HTMLBodyElement::setScrollLeft(int scrollLeft)
-{
-    if (isFirstBodyElementOfDocument()) {
-        document().updateLayoutIgnorePendingStylesheets();
-        RefPtr<Frame> frame = document().frame();
-        if (!frame)
-            return;
-        RefPtr<FrameView> view = frame->view();
-        if (!view)
-            return;
-        view->setScrollPosition(IntPoint(static_cast<int>(scrollLeft * frame->pageZoomFactor() * frame->frameScaleFactor()), view->scrollY()));
-    }
-    HTMLElement::setScrollLeft(scrollLeft);
-}
-
-int HTMLBodyElement::scrollTop()
-{
-    if (isFirstBodyElementOfDocument()) {
-        document().updateLayoutIgnorePendingStylesheets();
-        RefPtr<Frame> frame = document().frame();
-        if (!frame)
-            return 0;
-        RefPtr<FrameView> view = frame->view();
-        if (!view)
-            return 0;
-        return adjustForZoom(view->contentsScrollPosition().y(), *frame);
-    }
-    return HTMLElement::scrollTop();
-}
-
-void HTMLBodyElement::setScrollTop(int scrollTop)
-{
-    if (isFirstBodyElementOfDocument()) {
-        document().updateLayoutIgnorePendingStylesheets();
-        RefPtr<Frame> frame = document().frame();
-        if (!frame)
-            return;
-        RefPtr<FrameView> view = frame->view();
-        if (!view)
-            return;
-        view->setScrollPosition(IntPoint(view->scrollX(), static_cast<int>(scrollTop * frame->pageZoomFactor() * frame->frameScaleFactor())));
-    }
-    return HTMLElement::setScrollTop(scrollTop);
-}
-
-void HTMLBodyElement::scrollTo(const ScrollToOptions& options, ScrollClamping clamping)
-{
-    if (isFirstBodyElementOfDocument()) {
-        // If the element is the HTML body element, document is in quirks mode, and the element is not potentially scrollable,
-        // invoke scroll() on window with options as the only argument, and terminate these steps.
-        // Note that WebKit always uses quirks mode document scrolling behavior. See Document::scrollingElement().
-        // FIXME: Scrolling an independently scrollable body is broken: webkit.org/b/161612.
-        auto window = makeRefPtr(document().domWindow());
-        if (!window)
-            return;
-
-        window->scrollTo(options);
-        return;
-    }
-    return HTMLElement::scrollTo(options, clamping);
-}
-
-int HTMLBodyElement::scrollHeight()
-{
-    if (isFirstBodyElementOfDocument()) {
-        // Update the document's layout.
-        document().updateLayoutIgnorePendingStylesheets();
-        RefPtr<Frame> frame = document().frame();
-        if (!frame)
-            return 0;
-        RefPtr<FrameView> view = frame->view();
-        if (!view)
-            return 0;
-        return adjustForZoom(view->contentsHeight(), *frame);
-    }
-    return HTMLElement::scrollHeight();
-}
-
-int HTMLBodyElement::scrollWidth()
-{
-    if (isFirstBodyElementOfDocument()) {
-        // Update the document's layout.
-        document().updateLayoutIgnorePendingStylesheets();
-        RefPtr<Frame> frame = document().frame();
-        if (!frame)
-            return 0;
-        RefPtr<FrameView> view = frame->view();
-        if (!view)
-            return 0;
-        return adjustForZoom(view->contentsWidth(), *frame);
-    }
-    return HTMLElement::scrollWidth();
-}
-
 void HTMLBodyElement::addSubresourceAttributeURLs(ListHashSet<URL>& urls) const
 {
     HTMLElement::addSubresourceAttributeURLs(urls);
index 9197ecc..45b0fbc 100644 (file)
@@ -39,8 +39,6 @@ public:
 private:
     HTMLBodyElement(const QualifiedName&, Document&);
 
-    bool isFirstBodyElementOfDocument() const;
-
     void parseAttribute(const QualifiedName&, const AtomicString&) final;
     bool isPresentationAttribute(const QualifiedName&) const final;
     void collectStyleForPresentationAttribute(const QualifiedName&, const AtomicString&, MutableStyleProperties&) final;
@@ -52,17 +50,6 @@ private:
     
     bool supportsFocus() const final;
 
-    int scrollLeft() final;
-    void setScrollLeft(int) final;
-    
-    int scrollTop() final;
-    void setScrollTop(int) final;
-
-    void scrollTo(const ScrollToOptions&, ScrollClamping) final;
-    
-    int scrollHeight() final;
-    int scrollWidth() final;
-    
     void addSubresourceAttributeURLs(ListHashSet<URL>&) const final;
 
     static EventHandlerNameMap createWindowEventHandlerNameMap();
index f263257..a331c4a 100644 (file)
@@ -1,3 +1,13 @@
+2018-09-07  Frederic Wang  <fwang@igalia.com>
+
+        [CSSOM View] Handle the scrollingElement in Element::scroll(Left/Top/Width/Height/To)
+        https://bugs.webkit.org/show_bug.cgi?id=182230
+
+        Reviewed by Simon Fraser.
+
+        * WebProcess/InjectedBundle/API/gtk/DOM/WebKitDOMDocumentGtk.cpp:
+        (webkit_dom_document_get_scrolling_element): Use the new name.
+
 2018-09-07  Brent Fulgham  <bfulgham@apple.com>
 
         [macOS] Remove unused XPC service from sandbox
index f6997ef..1b7e0dc 100644 (file)
@@ -1929,7 +1929,7 @@ WebKitDOMElement* webkit_dom_document_get_scrolling_element(WebKitDOMDocument* s
     WebCore::JSMainThreadNullState state;
     g_return_val_if_fail(WEBKIT_DOM_IS_DOCUMENT(self), 0);
     WebCore::Document* item = WebKit::core(self);
-    RefPtr<WebCore::Element> gobjectResult = WTF::getPtr(item->scrollingElement());
+    RefPtr<WebCore::Element> gobjectResult = WTF::getPtr(item->scrollingElementForAPI());
     return WebKit::kit(gobjectResult.get());
 }
 
index 0ebf8f8..cea5ca9 100644 (file)
@@ -1,3 +1,13 @@
+2018-09-07  Frederic Wang  <fwang@igalia.com>
+
+        [CSSOM View] Handle the scrollingElement in Element::scroll(Left/Top/Width/Height/To)
+        https://bugs.webkit.org/show_bug.cgi?id=182230
+
+        Reviewed by Simon Fraser.
+
+        * DOM/DOMDocument.mm:
+        (-[DOMDocument scrollingElement]): Use the new name.
+
 2018-09-06  Wenson Hsieh  <wenson_hsieh@apple.com>
 
         Refactor WebCore::EditAction to be an 8-bit enum class
index cf30561..ad55852 100644 (file)
 - (DOMElement *)scrollingElement
 {
     WebCore::JSMainThreadNullState state;
-    return kit(WTF::getPtr(IMPL->scrollingElement()));
+    return kit(WTF::getPtr(IMPL->scrollingElementForAPI()));
 }
 
 - (DOMHTMLCollection *)children
index 9df85ec..3ad2b21 100644 (file)
@@ -1,3 +1,20 @@
+2018-09-07  Frederic Wang  <fwang@igalia.com>
+
+        [CSSOM View] Handle the scrollingElement in Element::scroll(Left/Top/Width/Height/To)
+        https://bugs.webkit.org/show_bug.cgi?id=182230
+
+        Reviewed by Simon Fraser.
+
+        This patch enables CSSOMViewScrollingAPI during test execution.
+
+        * DumpRenderTree/mac/DumpRenderTree.mm:
+        (enableExperimentalFeatures):
+        (resetWebPreferencesToConsistentValues):
+        * DumpRenderTree/win/DumpRenderTree.cpp:
+        (enableExperimentalFeatures):
+        * WebKitTestRunner/TestController.cpp:
+        (WTR::TestController::resetPreferencesToConsistentValues):
+
 2018-09-07  Simon Fraser  <simon.fraser@apple.com>
 
         resultsjsonparser needs to handle leak failures
index 4341388..efb43c1 100644 (file)
@@ -869,7 +869,7 @@ static void enableExperimentalFeatures(WebPreferences* preferences)
     [preferences setServerTimingEnabled:YES];
     [preferences setIntersectionObserverEnabled:YES];
     preferences.sourceBufferChangeTypeEnabled = YES;
-    // FIXME: CSSOMViewScrollingAPIEnabled
+    [preferences setCSSOMViewScrollingAPIEnabled:YES];
 }
 
 // Called before each test.
@@ -922,7 +922,6 @@ static void resetWebPreferencesToConsistentValues()
     [preferences setLoadsSiteIconsIgnoringImageLoadingPreference:NO];
     [preferences setFrameFlattening:WebKitFrameFlatteningDisabled];
     [preferences setAsyncFrameScrollingEnabled:NO];
-    [preferences setCSSOMViewScrollingAPIEnabled:NO];
     [preferences setSpatialNavigationEnabled:NO];
     [preferences setMetaRefreshEnabled:YES];
 
index 6c53051..52f788b 100644 (file)
@@ -785,7 +785,7 @@ static void enableExperimentalFeatures(IWebPreferences* preferences)
     // FIXME: InputEvents
     // FIXME: SubtleCrypto
     prefsPrivate->setVisualViewportAPIEnabled(TRUE);
-    // FIXME: CSSOMViewScrollingAPI
+    prefsPrivate->setCSSOMViewScrollingAPIEnabled(TRUE);
     prefsPrivate->setWebAnimationsEnabled(TRUE);
     prefsPrivate->setServerTimingEnabled(TRUE);
     // FIXME: WebGL2
index 9ee06be..00cc0ea 100644 (file)
@@ -791,7 +791,7 @@ void TestController::resetPreferencesToConsistentValues(const TestOptions& optio
     
     WKPreferencesSetAccessibilityObjectModelEnabled(preferences, true);
     WKPreferencesSetAriaReflectionEnabled(preferences, true);
-    WKPreferencesSetCSSOMViewScrollingAPIEnabled(preferences, false);
+    WKPreferencesSetCSSOMViewScrollingAPIEnabled(preferences, true);
     WKPreferencesSetMediaCapabilitiesEnabled(preferences, true);
 
     WKPreferencesSetCrossOriginWindowPolicyEnabled(preferences, true);