Title: [122321] trunk/Source/WebKit2
Revision
122321
Author
[email protected]
Date
2012-07-11 02:49:25 -0700 (Wed, 11 Jul 2012)

Log Message

[Qt][WK2] Fix wheel scrolling for simple pages
https://bugs.webkit.org/show_bug.cgi?id=90793

Reviewed by Kenneth Rohde Christiansen.

Call WebPage::setFixedLayoutSize in setResizesToContentsUsingLayoutSize
instead of setting the view size manually and scheduling a relayout.
Since setFixedLayoutSize forces a relayout it also updates the scrollbars
after the visible rect is available.
This fixes scrolling with wheel events for a QML WebView loading a simple
local page which previously ended up in a state where scrolling was disabled
because the scrollbar update happened before the correct visible rect size was
available.

Add a QML test and infrastructure to QWebKitTest to cover this case.

* UIProcess/API/qt/qwebkittest.cpp:
(QWebKitTest::wheelEvent):
* UIProcess/API/qt/qwebkittest_p.h:
* UIProcess/API/qt/tests/qmltests/WebView/tst_wheelEventHandling.qml: Added.
* UIProcess/API/qt/tests/qmltests/common/test4.html: Added.
* WebProcess/WebPage/WebPage.cpp:
(WebKit::WebPage::setResizesToContentsUsingLayoutSize):

Modified Paths

Added Paths

Diff

Modified: trunk/Source/WebKit2/ChangeLog (122320 => 122321)


--- trunk/Source/WebKit2/ChangeLog	2012-07-11 09:44:03 UTC (rev 122320)
+++ trunk/Source/WebKit2/ChangeLog	2012-07-11 09:49:25 UTC (rev 122321)
@@ -1,5 +1,31 @@
 2012-07-11  Andras Becsi  <[email protected]>
 
+        [Qt][WK2] Fix wheel scrolling for simple pages
+        https://bugs.webkit.org/show_bug.cgi?id=90793
+
+        Reviewed by Kenneth Rohde Christiansen.
+
+        Call WebPage::setFixedLayoutSize in setResizesToContentsUsingLayoutSize
+        instead of setting the view size manually and scheduling a relayout.
+        Since setFixedLayoutSize forces a relayout it also updates the scrollbars
+        after the visible rect is available.
+        This fixes scrolling with wheel events for a QML WebView loading a simple
+        local page which previously ended up in a state where scrolling was disabled
+        because the scrollbar update happened before the correct visible rect size was
+        available.
+
+        Add a QML test and infrastructure to QWebKitTest to cover this case.
+
+        * UIProcess/API/qt/qwebkittest.cpp:
+        (QWebKitTest::wheelEvent):
+        * UIProcess/API/qt/qwebkittest_p.h:
+        * UIProcess/API/qt/tests/qmltests/WebView/tst_wheelEventHandling.qml: Added.
+        * UIProcess/API/qt/tests/qmltests/common/test4.html: Added.
+        * WebProcess/WebPage/WebPage.cpp:
+        (WebKit::WebPage::setResizesToContentsUsingLayoutSize):
+
+2012-07-11  Andras Becsi  <[email protected]>
+
         [Qt][WK2] ASSERT: "!m_viewportItem->isMoving()" in QtViewportHandler::flickMoveEnded()
         https://bugs.webkit.org/show_bug.cgi?id=90875
 

Modified: trunk/Source/WebKit2/UIProcess/API/qt/qwebkittest.cpp (122320 => 122321)


--- trunk/Source/WebKit2/UIProcess/API/qt/qwebkittest.cpp	2012-07-11 09:44:03 UTC (rev 122320)
+++ trunk/Source/WebKit2/UIProcess/API/qt/qwebkittest.cpp	2012-07-11 09:49:25 UTC (rev 122321)
@@ -25,6 +25,7 @@
 #include "qquickwebview_p_p.h"
 #include <QMutableListIterator>
 #include <QTouchEvent>
+#include <QWheelEvent>
 #include <qpa/qwindowsysteminterface.h>
 
 using namespace WebKit;
@@ -113,6 +114,24 @@
     return true;
 }
 
+bool QWebKitTest::wheelEvent(QObject* item, qreal x, qreal y, int delta, Qt::Orientation orient)
+{
+    QQuickWebView* window = qobject_cast<QQuickWebView*>(item);
+
+    if (!window) {
+        qWarning("Wheel event not accepted by receiving item");
+        return false;
+    }
+
+    QWheelEvent event(QPointF(x, y), delta, Qt::NoButton, Qt::NoModifier, orient);
+    event.setTimestamp(QDateTime::currentMSecsSinceEpoch());
+    event.setAccepted(false);
+
+    window->wheelEvent(&event);
+
+    return event.isAccepted();
+}
+
 QSize QWebKitTest::contentsSize() const
 {
     return QSize(m_webViewPrivate->pageView->contentsSize().toSize());

Modified: trunk/Source/WebKit2/UIProcess/API/qt/qwebkittest_p.h (122320 => 122321)


--- trunk/Source/WebKit2/UIProcess/API/qt/qwebkittest_p.h	2012-07-11 09:44:03 UTC (rev 122320)
+++ trunk/Source/WebKit2/UIProcess/API/qt/qwebkittest_p.h	2012-07-11 09:49:25 UTC (rev 122321)
@@ -56,6 +56,7 @@
 public slots:
     bool touchTap(QObject* item, qreal x, qreal y, int delay = -1);
     bool touchDoubleTap(QObject* item, qreal x, qreal y, int delay = -1);
+    bool wheelEvent(QObject* item, qreal x, qreal y, int delta, Qt::Orientation orient = Qt::Vertical);
 
 public:
     QWebKitTest(QQuickWebViewPrivate* webviewPrivate, QObject* parent = 0);

Added: trunk/Source/WebKit2/UIProcess/API/qt/tests/qmltests/WebView/tst_wheelEventHandling.qml (0 => 122321)


--- trunk/Source/WebKit2/UIProcess/API/qt/tests/qmltests/WebView/tst_wheelEventHandling.qml	                        (rev 0)
+++ trunk/Source/WebKit2/UIProcess/API/qt/tests/qmltests/WebView/tst_wheelEventHandling.qml	2012-07-11 09:49:25 UTC (rev 122321)
@@ -0,0 +1,46 @@
+import QtQuick 2.0
+import QtTest 1.0
+import QtWebKit 3.0
+import QtWebKit.experimental 1.0
+import Test 1.0
+import "../common"
+
+Item {
+    TestWebView {
+        id: webView
+        width: 800
+        height: 600
+        url: Qt.resolvedUrl("../common/test4.html")
+    }
+
+    SignalSpy {
+        id: scrollSpy
+        target: webView
+        signalName: "contentYChanged"
+    }
+
+    TestCase {
+        name: "WheelEventHandling"
+
+        property variant test: webView.experimental.test
+
+        function init() {
+            webView.url = ""
+            verify(webView.waitForLoadSucceeded())
+            webView.contentY = 0
+        }
+
+        function test_wheelScrollEvent() {
+            scrollSpy.clear()
+            var centerPoint = Qt.point(webView.width / 2, webView.height / 2)
+            test.wheelEvent(webView, centerPoint.x, centerPoint.y, -500);
+            // The signal spy below will time out if the wheel event did not scroll the content.
+            scrollSpy.wait()
+            var position = webView.contentY
+            webView.reload()
+            verify(webView.waitForLoadSucceeded())
+            // The check below will fail if the previous position was not restored after reload.
+            verify(position == webView.contentY)
+        }
+    }
+}

Added: trunk/Source/WebKit2/UIProcess/API/qt/tests/qmltests/common/test4.html (0 => 122321)


--- trunk/Source/WebKit2/UIProcess/API/qt/tests/qmltests/common/test4.html	                        (rev 0)
+++ trunk/Source/WebKit2/UIProcess/API/qt/tests/qmltests/common/test4.html	2012-07-11 09:49:25 UTC (rev 122321)
@@ -0,0 +1,117 @@
+<html>
+    <head>
+        <title>Long Page To Scroll</title>
+        <style>
+            #content {
+                 margin: auto;
+                 width:  100%;
+                 background: #eeeeee;
+                 font-size: 50px;
+            }
+        </style>
+    </head>
+    <body>
+        <div id="content">
+            bla00<br/>
+            bla01<br/>
+            bla02<br/>
+            bla03<br/>
+            bla04<br/>
+            bla05<br/>
+            bla06<br/>
+            bla07<br/>
+            bla08<br/>
+            bla09<br/>
+            bla10<br/>
+            bla11<br/>
+            bla12<br/>
+            bla13<br/>
+            bla14<br/>
+            bla15<br/>
+            bla16<br/>
+            bla17<br/>
+            bla18<br/>
+            bla19<br/>
+            bla20<br/>
+            bla21<br/>
+            bla22<br/>
+            bla23<br/>
+            bla24<br/>
+            bla25<br/>
+            bla26<br/>
+            bla27<br/>
+            bla28<br/>
+            bla29<br/>
+            bla30<br/>
+            bla31<br/>
+            bla32<br/>
+            bla33<br/>
+            bla34<br/>
+            bla35<br/>
+            bla36<br/>
+            bla37<br/>
+            bla38<br/>
+            bla39<br/>
+            bla40<br/>
+            bla41<br/>
+            bla42<br/>
+            bla43<br/>
+            bla44<br/>
+            bla45<br/>
+            bla46<br/>
+            bla47<br/>
+            bla48<br/>
+            bla49<br/>
+            bla50<br/>
+            bla51<br/>
+            bla52<br/>
+            bla53<br/>
+            bla54<br/>
+            bla55<br/>
+            bla56<br/>
+            bla57<br/>
+            bla58<br/>
+            bla59<br/>
+            bla60<br/>
+            bla61<br/>
+            bla62<br/>
+            bla63<br/>
+            bla64<br/>
+            bla65<br/>
+            bla66<br/>
+            bla67<br/>
+            bla68<br/>
+            bla69<br/>
+            bla70<br/>
+            bla71<br/>
+            bla72<br/>
+            bla73<br/>
+            bla74<br/>
+            bla75<br/>
+            bla76<br/>
+            bla77<br/>
+            bla78<br/>
+            bla79<br/>
+            bla80<br/>
+            bla81<br/>
+            bla82<br/>
+            bla83<br/>
+            bla84<br/>
+            bla85<br/>
+            bla86<br/>
+            bla87<br/>
+            bla88<br/>
+            bla89<br/>
+            bla90<br/>
+            bla91<br/>
+            bla92<br/>
+            bla93<br/>
+            bla94<br/>
+            bla95<br/>
+            bla96<br/>
+            bla97<br/>
+            bla98<br/>
+            bla99<br/>
+        </div>
+    </body>
+</html>

Modified: trunk/Source/WebKit2/WebProcess/WebPage/WebPage.cpp (122320 => 122321)


--- trunk/Source/WebKit2/WebProcess/WebPage/WebPage.cpp	2012-07-11 09:44:03 UTC (rev 122320)
+++ trunk/Source/WebKit2/WebProcess/WebPage/WebPage.cpp	2012-07-11 09:49:25 UTC (rev 122321)
@@ -875,18 +875,12 @@
     if (view->fixedLayoutSize() == targetLayoutSize)
         return;
 
-    // Always reset even when empty.
-    view->setFixedLayoutSize(targetLayoutSize);
-
     m_page->settings()->setAcceleratedCompositingForFixedPositionEnabled(true);
     m_page->settings()->setFixedElementsLayoutRelativeToFrame(true);
     m_page->settings()->setFixedPositionCreatesStackingContext(true);
 
-    // Schedule a layout to use the new target size.
-    if (!view->layoutPending()) {
-        view->setNeedsLayout();
-        view->scheduleRelayout();
-    }
+    // Always reset even when empty. This also takes care of the relayout.
+    setFixedLayoutSize(targetLayoutSize);
 }
 
 void WebPage::resizeToContentsIfNeeded()
@@ -1087,7 +1081,7 @@
 
     view->setUseFixedLayout(fixed);
     if (!fixed)
-        view->setFixedLayoutSize(IntSize());
+        setFixedLayoutSize(IntSize());
 }
 
 void WebPage::setFixedLayoutSize(const IntSize& size)
_______________________________________________
webkit-changes mailing list
[email protected]
http://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to