Title: [131725] trunk
Revision
131725
Author
kbal...@webkit.org
Date
2012-10-18 04:26:07 -0700 (Thu, 18 Oct 2012)

Log Message

Do a forced repaint before generating pixel results https://bugs.webkit.org/show_bug.cgi?id=98654

Reviewed by Jocelyn Turcotte.

Source/WebKit2:

Added API to convert a QImage to a WKImage so we can
pass it to cross-platform code.

* Shared/API/c/qt/WKImageQt.cpp:
(WKImageCreateFromQImage):
* Shared/API/c/qt/WKImageQt.h:

Tools:

Do a forced repaint before grabbing the pixel snapshot. This extra
synchronisation is necessary with the CoordinatedGraphics rendering
backend because it has a fully asynchronous nature. This patch make
us using the window snapshot for pixel results which is necessary to
capture animations and other dynamic content. The actual grabbing of
the window has not been implemented in this patch. It will come in
a follow-up.

* WebKitTestRunner/TestInvocation.cpp:
(WTR::TestInvocation::invoke):
(WTR::TestInvocation::dump): Store results in member variables.
Don't close output channels yet.
(WTR::TestInvocation::dumpResults): Added. This is where we dump
the results if no error happened.
(WTR):
(WTR::TestInvocation::didReceiveMessageFromInjectedBundle):
* WebKitTestRunner/TestInvocation.h:
(TestInvocation):
* WebKitTestRunner/qt/PlatformWebViewQt.cpp:
(WTR::PlatformWebView::windowSnapshotImage):
* WebKitTestRunner/qt/TestInvocationQt.cpp:
(WTR::TestInvocation::forceRepaintDoneCallback):
(WTR):
(WTR::TestInvocation::dumpPixelsAndCompareWithExpected):

Modified Paths

Diff

Modified: trunk/Source/WebKit2/ChangeLog (131724 => 131725)


--- trunk/Source/WebKit2/ChangeLog	2012-10-18 10:41:25 UTC (rev 131724)
+++ trunk/Source/WebKit2/ChangeLog	2012-10-18 11:26:07 UTC (rev 131725)
@@ -1,3 +1,17 @@
+2012-10-15  Balazs Kelemen  <kbal...@webkit.org>
+
+        [Qt][WTR] Do a forced repaint before generating pixel results
+        https://bugs.webkit.org/show_bug.cgi?id=98654
+
+        Reviewed by Jocelyn Turcotte.
+
+        Added API to convert a QImage to a WKImage so we can
+        pass it to cross-platform code.
+
+        * Shared/API/c/qt/WKImageQt.cpp:
+        (WKImageCreateFromQImage):
+        * Shared/API/c/qt/WKImageQt.h:
+
 2012-10-18  Raphael Kubo da Costa  <raphael.kubo.da.co...@intel.com>
 
         [CMake] Depend on the Python scripts in WebKit2/Scripts/webkit2 when regenerating messages.

Modified: trunk/Source/WebKit2/Shared/API/c/qt/WKImageQt.cpp (131724 => 131725)


--- trunk/Source/WebKit2/Shared/API/c/qt/WKImageQt.cpp	2012-10-18 10:41:25 UTC (rev 131724)
+++ trunk/Source/WebKit2/Shared/API/c/qt/WKImageQt.cpp	2012-10-18 11:26:07 UTC (rev 131725)
@@ -25,10 +25,30 @@
 #include "ShareableBitmap.h"
 #include "WKSharedAPICast.h"
 #include "WebImage.h"
+#include <QPainter>
+#include <WebCore/GraphicsContext.h>
+#include <WebCore/IntSize.h>
 
+using namespace WebCore;
 using namespace WebKit;
 
 QImage WKImageCreateQImage(WKImageRef imageRef)
 {
     return toImpl(imageRef)->bitmap()->createQImage().copy();
 }
+
+WKImageRef WKImageCreateFromQImage(const QImage& image)
+{
+    if (image.isNull())
+        return 0;
+
+    ASSERT(image.bytesPerLine() == image.width() * 4);
+
+    RefPtr<WebImage> webImage = WebImage::create(image.size(), static_cast<ImageOptions>(0));
+    if (!webImage->bitmap())
+        return 0;
+    OwnPtr<GraphicsContext> graphicsContext = webImage->bitmap()->createGraphicsContext();
+    QPainter* painter = graphicsContext->platformContext();
+    painter->drawImage(QPoint(0, 0), image);
+    return toAPI(webImage.release().leakRef());
+}

Modified: trunk/Source/WebKit2/Shared/API/c/qt/WKImageQt.h (131724 => 131725)


--- trunk/Source/WebKit2/Shared/API/c/qt/WKImageQt.h	2012-10-18 10:41:25 UTC (rev 131724)
+++ trunk/Source/WebKit2/Shared/API/c/qt/WKImageQt.h	2012-10-18 11:26:07 UTC (rev 131725)
@@ -27,5 +27,6 @@
 #include <WebKit2/WKImage.h>
 
 WK_EXPORT QImage WKImageCreateQImage(WKImageRef image);
+WK_EXPORT WKImageRef WKImageCreateFromQImage(const QImage& image);
 
 #endif

Modified: trunk/Tools/ChangeLog (131724 => 131725)


--- trunk/Tools/ChangeLog	2012-10-18 10:41:25 UTC (rev 131724)
+++ trunk/Tools/ChangeLog	2012-10-18 11:26:07 UTC (rev 131725)
@@ -1,3 +1,35 @@
+2012-10-15  Balazs Kelemen  <kbal...@webkit.org>
+
+        [Qt][WTR] Do a forced repaint before generating pixel results
+        https://bugs.webkit.org/show_bug.cgi?id=98654
+
+        Reviewed by Jocelyn Turcotte.
+
+        Do a forced repaint before grabbing the pixel snapshot. This extra
+        synchronisation is necessary with the CoordinatedGraphics rendering
+        backend because it has a fully asynchronous nature. This patch make
+        us using the window snapshot for pixel results which is necessary to
+        capture animations and other dynamic content. The actual grabbing of
+        the window has not been implemented in this patch. It will come in
+        a follow-up.
+
+        * WebKitTestRunner/TestInvocation.cpp:
+        (WTR::TestInvocation::invoke):
+        (WTR::TestInvocation::dump): Store results in member variables.
+        Don't close output channels yet.
+        (WTR::TestInvocation::dumpResults): Added. This is where we dump
+        the results if no error happened.
+        (WTR):
+        (WTR::TestInvocation::didReceiveMessageFromInjectedBundle):
+        * WebKitTestRunner/TestInvocation.h:
+        (TestInvocation):
+        * WebKitTestRunner/qt/PlatformWebViewQt.cpp:
+        (WTR::PlatformWebView::windowSnapshotImage):
+        * WebKitTestRunner/qt/TestInvocationQt.cpp:
+        (WTR::TestInvocation::forceRepaintDoneCallback):
+        (WTR):
+        (WTR::TestInvocation::dumpPixelsAndCompareWithExpected):
+
 2012-10-18  Simon Hausmann  <simon.hausm...@digia.com>
 
         [Qt] Clean up variables controlling Qt module creation/handling

Modified: trunk/Tools/WebKitTestRunner/TestInvocation.cpp (131724 => 131725)


--- trunk/Tools/WebKitTestRunner/TestInvocation.cpp	2012-10-18 10:41:25 UTC (rev 131724)
+++ trunk/Tools/WebKitTestRunner/TestInvocation.cpp	2012-10-18 11:26:07 UTC (rev 131725)
@@ -192,6 +192,8 @@
         goto end;
     }
 
+    dumpResults();
+
 end:
 #if ENABLE(INSPECTOR)
     if (m_gotInitialResponse)
@@ -235,6 +237,17 @@
     fflush(stderr);
 }
 
+void TestInvocation::dumpResults()
+{
+    dump(toWTFString(m_textOutput.get()).utf8().data());
+
+    if (m_dumpPixels && m_pixelResult)
+        dumpPixelsAndCompareWithExpected(m_pixelResult.get(), m_repaintRects.get());
+
+    fputs("#EOF\n", stdout);
+    fflush(stdout);
+}
+
 bool TestInvocation::compareActualHashToExpectedAndDumpResults(const char actualHash[33])
 {
     // Compute the hash of the bitmap context pixels
@@ -278,26 +291,15 @@
         WKDictionaryRef messageBodyDictionary = static_cast<WKDictionaryRef>(messageBody);
 
         WKRetainPtr<WKStringRef> textOutputKey(AdoptWK, WKStringCreateWithUTF8CString("TextOutput"));
-        WKStringRef textOutput = static_cast<WKStringRef>(WKDictionaryGetItemForKey(messageBodyDictionary, textOutputKey.get()));
+        m_textOutput = static_cast<WKStringRef>(WKDictionaryGetItemForKey(messageBodyDictionary, textOutputKey.get()));
 
         WKRetainPtr<WKStringRef> pixelResultKey = adoptWK(WKStringCreateWithUTF8CString("PixelResult"));
-        WKImageRef pixelResult = static_cast<WKImageRef>(WKDictionaryGetItemForKey(messageBodyDictionary, pixelResultKey.get()));
-        ASSERT(!pixelResult || m_dumpPixels);
-        
+        m_pixelResult = static_cast<WKImageRef>(WKDictionaryGetItemForKey(messageBodyDictionary, pixelResultKey.get()));
+        ASSERT(!m_pixelResult || m_dumpPixels);
+
         WKRetainPtr<WKStringRef> repaintRectsKey = adoptWK(WKStringCreateWithUTF8CString("RepaintRects"));
-        WKArrayRef repaintRects = static_cast<WKArrayRef>(WKDictionaryGetItemForKey(messageBodyDictionary, repaintRectsKey.get()));        
+        m_repaintRects = static_cast<WKArrayRef>(WKDictionaryGetItemForKey(messageBodyDictionary, repaintRectsKey.get()));
 
-        // Dump text.
-        dump(toWTFString(textOutput).utf8().data());
-
-        // Dump pixels (if necessary).
-        if (m_dumpPixels && pixelResult)
-            dumpPixelsAndCompareWithExpected(pixelResult, repaintRects);
-
-        fputs("#EOF\n", stdout);
-        fflush(stdout);
-        fflush(stderr);
-        
         m_gotFinalMessage = true;
         TestController::shared().notifyDone();
         return;

Modified: trunk/Tools/WebKitTestRunner/TestInvocation.h (131724 => 131725)


--- trunk/Tools/WebKitTestRunner/TestInvocation.h	2012-10-18 10:41:25 UTC (rev 131724)
+++ trunk/Tools/WebKitTestRunner/TestInvocation.h	2012-10-18 11:26:07 UTC (rev 131725)
@@ -46,9 +46,15 @@
 
     static void dumpWebProcessUnresponsiveness(const char* textToStdout);
 private:
+    void dumpResults();
     static void dump(const char* textToStdout, const char* textToStderr = 0, bool seenError = false);
     void dumpPixelsAndCompareWithExpected(WKImageRef, WKArrayRef repaintRects);
     bool compareActualHashToExpectedAndDumpResults(const char[33]);
+
+#if PLATFORM(QT)
+    static void forceRepaintDoneCallback(WKErrorRef, void* context);
+    void forceRepaintDone();
+#endif
     
     WKRetainPtr<WKURLRef> m_url;
     std::string m_pathOrURL;
@@ -61,6 +67,10 @@
     bool m_gotFinalMessage;
     bool m_gotRepaint;
     bool m_error;
+
+    WKRetainPtr<WKStringRef> m_textOutput;
+    WKRetainPtr<WKImageRef> m_pixelResult;
+    WKRetainPtr<WKArrayRef> m_repaintRects;
 };
 
 } // namespace WTR

Modified: trunk/Tools/WebKitTestRunner/qt/PlatformWebViewQt.cpp (131724 => 131725)


--- trunk/Tools/WebKitTestRunner/qt/PlatformWebViewQt.cpp	2012-10-18 10:41:25 UTC (rev 131724)
+++ trunk/Tools/WebKitTestRunner/qt/PlatformWebViewQt.cpp	2012-10-18 11:26:07 UTC (rev 131725)
@@ -154,7 +154,7 @@
 {
     // FIXME: implement to capture pixels in the UI process,
     // which may be necessary to capture things like 3D transforms.
-    return 0;
+    return adoptWK(WKImageCreateFromQImage(QImage()));
 }
 
 } // namespace WTR

Modified: trunk/Tools/WebKitTestRunner/qt/TestInvocationQt.cpp (131724 => 131725)


--- trunk/Tools/WebKitTestRunner/qt/TestInvocationQt.cpp	2012-10-18 10:41:25 UTC (rev 131724)
+++ trunk/Tools/WebKitTestRunner/qt/TestInvocationQt.cpp	2012-10-18 11:26:07 UTC (rev 131725)
@@ -27,6 +27,8 @@
 
 #include "TestInvocation.h"
 
+#include "PlatformWebView.h"
+#include "TestController.h"
 #include <QBuffer>
 #include <QCryptographicHash>
 #include <QtGui/QPainter>
@@ -63,10 +65,29 @@
     fflush(stdout);
 }
 
+void TestInvocation::forceRepaintDoneCallback(WKErrorRef, void *context)
+{
+    static_cast<TestInvocation*>(context)->m_gotRepaint = true;
+    TestController::shared().notifyDone();
+}
+
 void TestInvocation::dumpPixelsAndCompareWithExpected(WKImageRef imageRef, WKArrayRef repaintRects)
 {
-    QImage image = WKImageCreateQImage(imageRef);
+    WKPageRef page = TestController::shared().mainWebView()->page();
+    WKPageForceRepaint(page, this, &forceRepaintDoneCallback);
 
+    TestController::shared().runUntil(m_gotRepaint, TestController::ShortTimeout);
+
+    QImage image;
+    if (m_gotRepaint)
+        image = WKImageCreateQImage(TestController::shared().mainWebView()->windowSnapshotImage().get());
+    else {
+        // The test harness expects an image so we output an empty one.
+        WKRect windowRect = TestController::shared().mainWebView()->windowFrame();
+        image = QImage(QSize(windowRect.size.width, windowRect.size.height), QImage::Format_ARGB32_Premultiplied);
+        image.fill(Qt::red);
+    }
+
     if (repaintRects) {
         QImage mask(image.size(), image.format());
         mask.fill(QColor(0, 0, 0, 0.66 * 255));
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
http://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to