[Qt] WKTR: Use a software rendering pipiline when running tests.
authorjocelyn.turcotte@nokia.com <jocelyn.turcotte@nokia.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 27 Jan 2012 12:46:18 +0000 (12:46 +0000)
committerjocelyn.turcotte@nokia.com <jocelyn.turcotte@nokia.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 27 Jan 2012 12:46:18 +0000 (12:46 +0000)
https://bugs.webkit.org/show_bug.cgi?id=76708

Reviewed by Kenneth Rohde Christiansen.

Source/WebCore:

* platform/graphics/qt/TextureMapperQt.cpp: Allow setting the context to null.
(WebCore::TextureMapperQt::setGraphicsContext):
* platform/graphics/qt/TextureMapperQt.h:
(WebCore::TextureMapperQt::initialize):

Source/WebKit2:

Animation layout tests require the graphics layers tree to be updated
to pass. WebkitTestRunner doesn't show its wrapping QQuickView, which
prevents the rendering pipeline to run and then in turn blocks the web
process from processing further graphics layer updates.

This allows the tests to use a TextureMapperQt to empty the LayerTreeHost's
message queue and render the layers in software on an offscreen buffer.

* UIProcess/API/qt/qquickwebpage.cpp:
(QQuickWebPagePrivate::paint):
* UIProcess/API/qt/qquickwebview.cpp:
(QQuickWebViewPrivate::QQuickWebViewPrivate):
(QQuickWebViewPrivate::setNeedsDisplay):
(QQuickWebViewExperimental::setRenderToOffscreenBuffer):
(QQuickWebViewExperimental::renderToOffscreenBuffer):
* UIProcess/API/qt/qquickwebview_p.h:
* UIProcess/API/qt/qquickwebview_p_p.h:
(QQuickWebViewPrivate::setRenderToOffscreenBuffer):
(QQuickWebViewPrivate::renderToOffscreenBuffer):
* UIProcess/qt/LayerTreeHostProxyQt.cpp:
(WebKit::LayerTreeHostProxy::paintToGraphicsContext):

Tools:

* WebKitTestRunner/qt/PlatformWebViewQt.cpp:
(WTR::WrapperWindow::WrapperWindow):
(WTR::PlatformWebView::PlatformWebView): Use software rendering of layers since the wrapping QQuickView isn't shown.

LayoutTests:

* platform/qt-wk2/Skipped:

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

19 files changed:
LayoutTests/ChangeLog
LayoutTests/platform/qt-wk2/Skipped
Source/WebCore/ChangeLog
Source/WebCore/platform/graphics/qt/TextureMapperQt.cpp
Source/WebCore/platform/graphics/qt/TextureMapperQt.h
Source/WebKit2/ChangeLog
Source/WebKit2/UIProcess/API/qt/qquickwebpage.cpp
Source/WebKit2/UIProcess/API/qt/qquickwebpage_p_p.h
Source/WebKit2/UIProcess/API/qt/qquickwebview.cpp
Source/WebKit2/UIProcess/API/qt/qquickwebview_p.h
Source/WebKit2/UIProcess/API/qt/qquickwebview_p_p.h
Source/WebKit2/UIProcess/DrawingAreaProxy.h
Source/WebKit2/UIProcess/DrawingAreaProxyImpl.cpp
Source/WebKit2/UIProcess/DrawingAreaProxyImpl.h
Source/WebKit2/UIProcess/LayerTreeHostProxy.h
Source/WebKit2/UIProcess/qt/LayerTreeHostProxyQt.cpp
Source/WebKit2/UIProcess/qt/QtPageClient.cpp
Tools/ChangeLog
Tools/WebKitTestRunner/qt/PlatformWebViewQt.cpp

index 94514b0..ec68dad 100644 (file)
@@ -1,3 +1,12 @@
+2012-01-26  Jocelyn Turcotte  <jocelyn.turcotte@nokia.com>
+
+        [Qt] WKTR: Use a software rendering pipiline when running tests.
+        https://bugs.webkit.org/show_bug.cgi?id=76708
+
+        Reviewed by Kenneth Rohde Christiansen.
+
+        * platform/qt-wk2/Skipped:
+
 2012-01-27 Branimir Lambov <blambov@google.com>
 
         SVG filters incorrectly move elements
index b785630..45756de 100644 (file)
@@ -439,58 +439,6 @@ tables/mozilla_expected_failures/marvin/backgr_border-table-row-group.html
 tables/mozilla_expected_failures/marvin/backgr_layers-show.html
 tables/mozilla_expected_failures/marvin/backgr_position-table-column.html
 
-# [Qt][WK2] REGRESSION(r105517): It made 49 tests timeout
-# https://bugs.webkit.org/show_bug.cgi?id=76708
-animations/3d/change-transform-in-end-event.html
-animations/3d/replace-filling-transform.html
-animations/3d/state-at-end-event-transform.html
-animations/3d/transform-perspective.html
-animations/additive-transform-animations.html
-animations/animation-direction-normal.html
-animations/animation-end-event-destroy-renderer.html
-animations/animation-hit-test-transform.html
-animations/animation-iteration-event-destroy-renderer.html
-animations/animation-matrix-negative-scale-unmatrix.html
-animations/animation-start-event-destroy-renderer.html
-animations/big-rotation.html
-animations/combo-transform-rotate+scale.html
-animations/combo-transform-translate+scale.html
-animations/dynamic-stylesheet-loading.html
-animations/fill-mode-transform.html
-animations/keyframe-timing-functions-transform.html
-animations/matrix-anim.html
-animations/missing-from-to-transforms.html
-animations/missing-keyframe-properties-repeating.html
-animations/missing-keyframe-properties-timing-function.html
-animations/missing-keyframe-properties.html
-animations/missing-values-first-keyframe.html
-animations/missing-values-last-keyframe.html
-animations/negative-delay.html
-animations/opacity-transform-animation.html
-animations/pause-crash.html
-animations/play-state-paused.html
-animations/play-state-suspend.html
-animations/simultaneous-start-transform.html
-animations/stop-animation-on-suspend.html
-animations/suspend-resume-animation.html
-animations/suspend-transform-animation.html
-animations/transition-and-animation-1.html
-animations/transition-and-animation-2.html
-fast/css/getComputedStyle/getComputedStyle-with-pseudo-element.html
-tables/mozilla/marvin/backgr_simple-table-cell.html
-transitions/3d/interrupted-transition.html
-transitions/cancel-transition.html
-transitions/extra-transition.html
-transitions/interrupt-transform-transition.html
-transitions/interrupted-accelerated-transition.html
-transitions/move-after-transition.html
-transitions/start-transform-transition.html
-transitions/transition-end-event-destroy-iframe.html
-transitions/transition-end-event-destroy-renderer.html
-transitions/transition-end-event-multiple-04.html
-transitions/transition-end-event-rendering.html
-transitions/transition-end-event-transform.html
-
 # [Qt][WK2] http/tests/history/replacestate-post-to-get-2.html fails with timeout
 # https://bugs.webkit.org/show_bug.cgi?id=76784
 http/tests/history/replacestate-post-to-get-2.html
index 25849c7..17524f9 100644 (file)
@@ -1,3 +1,15 @@
+2012-01-26  Jocelyn Turcotte  <jocelyn.turcotte@nokia.com>
+
+        [Qt] WKTR: Use a software rendering pipiline when running tests.
+        https://bugs.webkit.org/show_bug.cgi?id=76708
+
+        Reviewed by Kenneth Rohde Christiansen.
+
+        * platform/graphics/qt/TextureMapperQt.cpp: Allow setting the context to null.
+        (WebCore::TextureMapperQt::setGraphicsContext):
+        * platform/graphics/qt/TextureMapperQt.h:
+        (WebCore::TextureMapperQt::initialize):
+
 2012-01-27  Branimir Lambov  <blambov@google.com>
 
         SVG filters incorrectly move elements
index 98cc827..44641ce 100644 (file)
@@ -141,7 +141,7 @@ TextureMapperQt::TextureMapperQt()
 void TextureMapperQt::setGraphicsContext(GraphicsContext* context)
 {
     m_context = context;
-    m_painter = context->platformContext();
+    m_painter = context ? context->platformContext() : 0;
     initialize(m_painter);
 }
 
index de57197..08fee03 100644 (file)
@@ -70,7 +70,8 @@ public:
 
     static void initialize(QPainter* painter)
     {
-        painter->setRenderHints(QPainter::Antialiasing | QPainter::SmoothPixmapTransform, false);
+        if (painter)
+            painter->setRenderHints(QPainter::Antialiasing | QPainter::SmoothPixmapTransform, false);
     }
 
     static PassOwnPtr<TextureMapper> create() { return adoptPtr(new TextureMapperQt); }
index 757634c..11c450e 100644 (file)
@@ -1,3 +1,32 @@
+2012-01-26  No'am Rosenthal  <noam.rosenthal@nokia.com> and Jocelyn Turcotte  <jocelyn.turcotte@nokia.com>
+
+        [Qt] WKTR: Use a software rendering pipiline when running tests.
+        https://bugs.webkit.org/show_bug.cgi?id=76708
+
+        Reviewed by Kenneth Rohde Christiansen.
+
+        Animation layout tests require the graphics layers tree to be updated
+        to pass. WebkitTestRunner doesn't show its wrapping QQuickView, which
+        prevents the rendering pipeline to run and then in turn blocks the web
+        process from processing further graphics layer updates.
+
+        This allows the tests to use a TextureMapperQt to empty the LayerTreeHost's
+        message queue and render the layers in software on an offscreen buffer.
+
+        * UIProcess/API/qt/qquickwebpage.cpp:
+        (QQuickWebPagePrivate::paint):
+        * UIProcess/API/qt/qquickwebview.cpp:
+        (QQuickWebViewPrivate::QQuickWebViewPrivate):
+        (QQuickWebViewPrivate::setNeedsDisplay):
+        (QQuickWebViewExperimental::setRenderToOffscreenBuffer):
+        (QQuickWebViewExperimental::renderToOffscreenBuffer):
+        * UIProcess/API/qt/qquickwebview_p.h:
+        * UIProcess/API/qt/qquickwebview_p_p.h:
+        (QQuickWebViewPrivate::setRenderToOffscreenBuffer):
+        (QQuickWebViewPrivate::renderToOffscreenBuffer):
+        * UIProcess/qt/LayerTreeHostProxyQt.cpp:
+        (WebKit::LayerTreeHostProxy::paintToGraphicsContext):
+
 2012-01-27  Simon Hausmann  <simon.hausmann@nokia.com>
 
         [Qt] Re-creating QQuickWebView starts new web process every time
index a8c1718..6976f87 100644 (file)
@@ -100,6 +100,12 @@ void QQuickWebPagePrivate::setDrawingAreaSize(const QSize& size)
     drawingArea->setSize(WebCore::IntSize(size), WebCore::IntSize());
 }
 
+void QQuickWebPagePrivate::paint(QPainter* painter)
+{
+    if (webPageProxy->drawingArea())
+        webPageProxy->drawingArea()->paintLayerTree(painter);
+}
+
 void QQuickWebPagePrivate::paintToCurrentGLContext()
 {
     if (!q->isVisible())
index 99cb2c2..0c17aa5 100644 (file)
@@ -43,6 +43,7 @@ public:
     void updateSize();
 
     void paintToCurrentGLContext();
+    void paint(QPainter*);
     void resetPaintNode();
 
     QScopedPointer<QtWebPageEventHandler> eventHandler;
index 618841c..25fc7d9 100644 (file)
@@ -67,6 +67,7 @@ QQuickWebViewPrivate::QQuickWebViewPrivate(QQuickWebView* viewport)
     , isTransitioningToNewPage(false)
     , pageIsSuspended(false)
     , m_navigatorQtObjectEnabled(false)
+    , m_renderToOffscreenBuffer(false)
 {
     viewport->setFlags(QQuickItem::ItemClipsChildrenToShape);
     QObject::connect(viewport, SIGNAL(visibleChanged()), viewport, SLOT(_q_onVisibleChanged()));
@@ -154,6 +155,20 @@ void QQuickWebViewPrivate::initializeTouch(QQuickWebView* viewport)
     updateTouchViewportSize();
 }
 
+void QQuickWebViewPrivate::setNeedsDisplay()
+{
+    Q_Q(QQuickWebView);
+    if (renderToOffscreenBuffer()) {
+        // TODO: we can maintain a real image here and use it for pixel tests. Right now this is used only for running the rendering code-path while running tests.
+        QImage dummyImage(1, 1, QImage::Format_ARGB32);
+        QPainter painter(&dummyImage);
+        q->page()->d->paint(&painter);
+        return;
+    }
+
+    q->page()->update();
+}
+
 void QQuickWebViewPrivate::loadDidCommit()
 {
     // Due to entering provisional load before committing, we
@@ -659,6 +674,18 @@ void QQuickWebViewExperimental::setUseTraditionalDesktopBehaviour(bool enable)
     d->setUseTraditionalDesktopBehaviour(enable);
 }
 
+void QQuickWebViewExperimental::setRenderToOffscreenBuffer(bool enable)
+{
+    Q_D(QQuickWebView);
+    d->setRenderToOffscreenBuffer(enable);
+}
+
+bool QQuickWebViewExperimental::renderToOffscreenBuffer() const
+{
+    Q_D(const QQuickWebView);
+    return d->renderToOffscreenBuffer();
+}
+
 void QQuickWebViewExperimental::postMessage(const QString& message)
 {
     Q_D(QQuickWebView);
index 3c70179..d5a4fa1 100644 (file)
@@ -237,11 +237,12 @@ public:
     void setCertificateVerificationDialog(QDeclarativeComponent*);
     QDeclarativeComponent* itemSelector() const;
     void setItemSelector(QDeclarativeComponent*);
-    
+    bool useTraditionalDesktopBehaviour() const;
+    void setUseTraditionalDesktopBehaviour(bool enable);
+
     QWebViewportInfo* viewportInfo();
 
     QWebPreferences* preferences() const;
-    bool useTraditionalDesktopBehaviour() const;
     QWebNavigationHistory* navigationHistory() const;
     QQuickWebPage* page();
 
@@ -253,8 +254,11 @@ public:
     void invokeApplicationSchemeHandler(WTF::PassRefPtr<WebKit::QtRefCountedNetworkRequestData>);
     void sendApplicationSchemeReply(QQuickNetworkReply*);
 
+    // C++ only
+    bool renderToOffscreenBuffer() const;
+    void setRenderToOffscreenBuffer(bool enable);
+
 public Q_SLOTS:
-    void setUseTraditionalDesktopBehaviour(bool enable);
     void goBackTo(int index);
     void goForwardTo(int index);
     void postMessage(const QString&);
index dc82301..9f28170 100644 (file)
@@ -77,6 +77,8 @@ public:
     void didChangeViewportProperties(const WebCore::ViewportArguments& args);
     void didChangeBackForwardList();
 
+    void setNeedsDisplay();
+
     void updateDesktopViewportSize();
     void updateTouchViewportSize();
     QtViewportInteractionEngine::Constraints computeViewportConstraints();
@@ -101,10 +103,12 @@ public:
     bool handleCertificateVerificationRequest(const QString& hostname);
 
     void setUseTraditionalDesktopBehaviour(bool enable);
+    void setRenderToOffscreenBuffer(bool enable) { m_renderToOffscreenBuffer = enable; }
     void setViewInAttachedProperties(QObject*);
     void setIcon(const QUrl&);
 
     bool navigatorQtObjectEnabled() const;
+    bool renderToOffscreenBuffer() const { return m_renderToOffscreenBuffer; }
     void setNavigatorQtObjectEnabled(bool);
 
     // PageClient.
@@ -166,6 +170,7 @@ private:
     bool isTransitioningToNewPage;
     bool pageIsSuspended;
     bool m_navigatorQtObjectEnabled;
+    bool m_renderToOffscreenBuffer;
     QUrl m_iconURL;
 };
 
index 2f58322..ac711f6 100644 (file)
@@ -27,6 +27,7 @@
 #ifndef DrawingAreaProxy_h
 #define DrawingAreaProxy_h
 
+#include "BackingStore.h"
 #include "DrawingAreaInfo.h"
 #include <WebCore/IntRect.h>
 #include <WebCore/IntSize.h>
@@ -88,6 +89,7 @@ public:
     virtual WebCore::IntRect contentsRect() const;
     virtual bool isBackingStoreReady() const { return true; }
     virtual void paintToCurrentGLContext(const WebCore::TransformationMatrix&, float opacity) { }
+    virtual void paintLayerTree(BackingStore::PlatformGraphicsContext) { }
     LayerTreeHostProxy* layerTreeHostProxy() const { return m_layerTreeHostProxy.get(); }
 
 #if USE(TILED_BACKING_STORE)
index eac3f00..0e3bdb6 100644 (file)
@@ -360,6 +360,12 @@ void DrawingAreaProxyImpl::setVisibleContentRectTrajectoryVector(const WebCore::
         m_layerTreeHostProxy->setVisibleContentRectTrajectoryVector(trajectoryVector);
 }
 
+void DrawingAreaProxyImpl::paintLayerTree(BackingStore::PlatformGraphicsContext context)
+{
+    if (m_layerTreeHostProxy)
+        m_layerTreeHostProxy->paintToGraphicsContext(context);
+}
+
 void DrawingAreaProxyImpl::paintToCurrentGLContext(const TransformationMatrix& matrix, float opacity)
 {
     if (m_layerTreeHostProxy)
index c1651f4..22f97a5 100644 (file)
@@ -81,6 +81,7 @@ private:
     virtual void setVisibleContentsRectAndScale(const WebCore::IntRect& visibleContentsRect, float scale);
     virtual void setVisibleContentRectTrajectoryVector(const WebCore::FloatPoint&);
     virtual void paintToCurrentGLContext(const WebCore::TransformationMatrix&, float opacity);
+    virtual void paintLayerTree(BackingStore::PlatformGraphicsContext);
     void didReceiveLayerTreeHostProxyMessage(CoreIPC::Connection*, CoreIPC::MessageID, CoreIPC::ArgumentDecoder*);
 #endif
 #else
index 163ba71..f5afa96 100644 (file)
@@ -53,6 +53,7 @@ public:
     void setRootCompositingLayer(WebLayerID);
     void didReceiveMessage(CoreIPC::Connection*, CoreIPC::MessageID, CoreIPC::ArgumentDecoder*);
     void paintToCurrentGLContext(const WebCore::TransformationMatrix&, float);
+    void paintToGraphicsContext(BackingStore::PlatformGraphicsContext);
     void purgeGLResources();
     void setVisibleContentsRectAndScale(const WebCore::IntRect&, float);
     void setVisibleContentRectTrajectoryVector(const WebCore::FloatPoint&);
index 45dc8ce..1f6065e 100644 (file)
@@ -27,6 +27,7 @@
 #include "MessageID.h"
 #include "ShareableBitmap.h"
 #include "TextureMapperGL.h"
+#include "TextureMapperQt.h"
 #include "UpdateInfo.h"
 #include "WebCoreArgumentCoders.h"
 #include "WebLayerTreeInfo.h"
@@ -171,6 +172,7 @@ void LayerTreeHostProxy::paintToCurrentGLContext(const TransformationMatrix& mat
 {
     if (!m_textureMapper)
         m_textureMapper = TextureMapperGL::create();
+    ASSERT(dynamic_cast<TextureMapperGL*>(m_textureMapper.get()));
 
     syncRemoteContent();
     GraphicsLayer* currentRootLayer = rootLayer();
@@ -204,6 +206,28 @@ void LayerTreeHostProxy::paintToCurrentGLContext(const TransformationMatrix& mat
     }
 }
 
+void LayerTreeHostProxy::paintToGraphicsContext(QPainter* painter)
+{
+    if (!m_textureMapper)
+        m_textureMapper = TextureMapperQt::create();
+    ASSERT(dynamic_cast<TextureMapperQt*>(m_textureMapper.get()));
+
+    syncRemoteContent();
+    TextureMapperNode* node = toTextureMapperNode(rootLayer());
+
+    if (!node)
+        return;
+
+    GraphicsContext graphicsContext(painter);
+    m_textureMapper->setGraphicsContext(&graphicsContext);
+    m_textureMapper->beginPainting();
+    m_textureMapper->bindSurface(0);
+    node->paint();
+    m_textureMapper->endPainting();
+    m_textureMapper->setGraphicsContext(0);
+}
+
+
 void LayerTreeHostProxy::didFireViewportUpdateTimer(Timer<LayerTreeHostProxy>*)
 {
     updateViewport();
index 3824e5d..cdc863b 100644 (file)
@@ -62,7 +62,7 @@ PassOwnPtr<DrawingAreaProxy> QtPageClient::createDrawingAreaProxy()
 
 void QtPageClient::setViewNeedsDisplay(const WebCore::IntRect& rect)
 {
-    m_webView->page()->update();
+    QQuickWebViewPrivate::get(m_webView)->setNeedsDisplay();
 }
 
 void QtPageClient::pageDidRequestScroll(const IntPoint& pos)
index 2190c9d..f835e4b 100644 (file)
@@ -1,3 +1,14 @@
+2012-01-26  No'am Rosenthal  <noam.rosenthal@nokia.com> and Jocelyn Turcotte  <jocelyn.turcotte@nokia.com>
+
+        [Qt] WKTR: Use a software rendering pipiline when running tests.
+        https://bugs.webkit.org/show_bug.cgi?id=76708
+
+        Reviewed by Kenneth Rohde Christiansen.
+
+        * WebKitTestRunner/qt/PlatformWebViewQt.cpp:
+        (WTR::WrapperWindow::WrapperWindow):
+        (WTR::PlatformWebView::PlatformWebView): Use software rendering of layers since the wrapping QQuickView isn't shown.
+
 2012-01-26  Kevin Ollivier  <kevino@theolliviers.com>
 
         [wx] Unreviewed. Build fix, add WebCore/testing/js
index 13a33f8..4259913 100644 (file)
@@ -45,7 +45,6 @@ public:
         : QQuickView(QUrl("data:text/plain,import QtQuick 2.0\nItem { objectName: 'root' }"))
         , m_view(view)
     {
-        QQuickWebViewExperimental(view).setUseTraditionalDesktopBehaviour(true);
         connect(this, SIGNAL(statusChanged(QQuickView::Status)), SLOT(handleStatusChanged(QQuickView::Status)));
     }
 
@@ -75,6 +74,9 @@ PlatformWebView::PlatformWebView(WKContextRef contextRef, WKPageGroupRef pageGro
     , m_windowIsKey(true)
     , m_modalEventLoop(0)
 {
+    QQuickWebViewExperimental experimental(m_view);
+    experimental.setUseTraditionalDesktopBehaviour(true);
+    experimental.setRenderToOffscreenBuffer(true);
 }
 
 PlatformWebView::~PlatformWebView()