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)