Flesh out DumpRenderTree for Gtk. After these changes, the majority of the tests...
authormrowe@apple.com <mrowe@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sat, 15 Dec 2007 11:00:11 +0000 (11:00 +0000)
committermrowe@apple.com <mrowe@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sat, 15 Dec 2007 11:00:11 +0000 (11:00 +0000)
Reviewed by Alp Toker.

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

WebKitTools/ChangeLog
WebKitTools/DumpRenderTree/gtk/DumpRenderTree.cpp
WebKitTools/DumpRenderTree/gtk/DumpRenderTreeGtk.h
WebKitTools/DumpRenderTree/gtk/LayoutTestControllerGtk.cpp
WebKitTools/Scripts/build-dumprendertree
WebKitTools/Scripts/run-webkit-tests

index 6593b52f42e90e14e8f711fe68ae5529c8da70cd..b21f57f8f835d42098fd6c2a3671dea317a0fa67 100644 (file)
@@ -1,3 +1,25 @@
+2007-12-05  Mark Rowe  <mrowe@apple.com>
+
+        Reviewed by Alp Toker.
+
+        Flesh out DumpRenderTree for Gtk.  After these changes, the majority of the tests in fast/js pass.
+
+        * DumpRenderTree/gtk/DumpRenderTree.cpp:
+        (dumpFramesAsText): Don't print the frame name when dumping the main frame as text.
+        (dump):
+        (runTest):
+        (webViewLoadStarted): Store the top frame when it starts loading so we can use it to determine when to dump.
+        (webViewLoadFinished): Dump when the top frame load completes if we're not waiting for a JS callback and the
+        work queue is empty.
+        (webViewWindowObjectCleared): Set up window.layoutTestController.
+        (webViewConsoleMessage): Match the console message format expected by the layout test results.
+        (main): Hook up the new signals.
+        * DumpRenderTree/gtk/DumpRenderTreeGtk.h:
+        * DumpRenderTree/gtk/LayoutTestControllerGtk.cpp: Only notify done if the top frame has completed loading to avoid
+        dumping multiple times.
+        * Scripts/build-dumprendertree: Ensure build-dumprendertree is a no-op for Gtk too.
+        * Scripts/run-webkit-tests: Teach run-webkit-tests that Gtk is like Qt in many ways.  Use run-launcher to open test results.
+
 2007-12-14  Anders Carlsson  <andersca@apple.com>
 
         Reviewed by Brady.
index 24f81b9e1f30c1600e25bf9c6b21bd441c2c4734..733cc116544b787120633dce2cafb201489092b2 100644 (file)
@@ -39,6 +39,7 @@
 #include <JavaScriptCore/JSStringRef.h>
 #include <JavaScriptCore/JSValueRef.h>
 
+#include <cassert>
 #include <getopt.h>
 #include <stdlib.h>
 #include <string.h>
@@ -54,12 +55,13 @@ static bool printSeparators;
 static int testRepaintDefault;
 static int repaintSweepHorizontallyDefault;
 static int dumpPixels;
-static int dumpTree;
+static int dumpTree = 1;
 static gchar* currentTest;
 
 LayoutTestController* layoutTestController = 0;
-static WebKitWebView* view;
+static WebKitWebView* webView;
 WebKitWebFrame* mainFrame = 0;
+WebKitWebFrame* topLoadingFrame = 0;
 
 const unsigned maxViewHeight = 600;
 const unsigned maxViewWidth = 800;
@@ -102,13 +104,17 @@ static gchar* dumpFramesAsText(WebKitWebFrame* frame)
     gchar* result = 0;
 
     // Add header for all but the main frame.
-    bool isMainFrame = (webkit_web_view_get_main_frame(view) == frame);
+    bool isMainFrame = (webkit_web_view_get_main_frame(webView) == frame);
 
     if (isMainFrame) {
+        gchar* innerText = webkit_web_frame_get_inner_text(frame);
+        result = g_strdup_printf("%s\n", innerText);
+        g_free(innerText);
+    } else {
         const gchar* frameName = webkit_web_frame_get_name(frame);
         gchar* innerText = webkit_web_frame_get_inner_text(frame);
 
-        result = g_strdup_printf("\n--------\nFrame: '%s'\n--------\n%s", frameName, innerText);
+        result = g_strdup_printf("\n--------\nFrame: '%s'\n--------\n%s\n", frameName, innerText);
 
         g_free(innerText);
     }
@@ -141,9 +147,9 @@ void dump()
         else {
             bool isSVGW3CTest = (g_strrstr(currentTest, "svg/W3C-SVG-1.1"));
             if (isSVGW3CTest)
-                gtk_widget_set_size_request(GTK_WIDGET(view), 480, 360);
+                gtk_widget_set_size_request(GTK_WIDGET(webView), 480, 360);
             else
-                gtk_widget_set_size_request(GTK_WIDGET(view), maxViewWidth, maxViewHeight);
+                gtk_widget_set_size_request(GTK_WIDGET(webView), maxViewWidth, maxViewHeight);
             result = dumpRenderTreeAsText(mainFrame);
         }
 
@@ -160,7 +166,7 @@ void dump()
             printf("ERROR: nil result from %s", errorMessage);
         } else {
             printf("%s", result);
-        g_free(result);
+            g_free(result);
             if (!layoutTestController->dumpAsText() && !layoutTestController->dumpDOMAsWebArchive() && !layoutTestController->dumpSourceAsWebArchive())
                 dumpFrameScrollPosition(mainFrame);
         }
@@ -193,6 +199,7 @@ static void runTest(const char* pathOrURL)
     layoutTestController = new LayoutTestController(testRepaintDefault, repaintSweepHorizontallyDefault);
 
     done = false;
+    topLoadingFrame = 0;
 
     if (shouldLogFrameLoadDelegates(pathOrURL))
         layoutTestController->setDumpFrameLoadCallbacks(true);
@@ -204,7 +211,7 @@ static void runTest(const char* pathOrURL)
     WorkQueue::shared()->clear();
     WorkQueue::shared()->setFrozen(false);
 
-    webkit_web_view_open(view, url);
+    webkit_web_view_open(webView, url);
 
     while (!done)
         g_main_context_iteration(NULL, true);
@@ -215,9 +222,46 @@ static void runTest(const char* pathOrURL)
     layoutTestController = 0;
 }
 
-int main(int argc, char* argv[])
+void webViewLoadStarted(WebKitWebView* view, WebKitWebFrame* frame, void*)
+{
+    // Make sure we only set this once per test.  If it gets cleared, and then set again, we might
+    // end up doing two dumps for one test.
+    if (!topLoadingFrame && !done)
+        topLoadingFrame = frame;
+}
+
+void webViewLoadFinished(WebKitWebView* view, WebKitWebFrame* frame, void*)
+{
+    if (frame != topLoadingFrame)
+        return;
+
+    topLoadingFrame = 0;
+    WorkQueue::shared()->setFrozen(true); // first complete load freezes the queue for the rest of this test
+    if (layoutTestController->waitToDump())
+        return;
+
+    if (WorkQueue::shared()->count())
+        fprintf(stderr, "FIXME: [self performSelector:@selector(processWork:) withObject:nil afterDelay:0];\n");
+     else
+        dump();
+}
+
+void webViewWindowObjectCleared(WebKitWebView* view, WebKitWebFrame* frame, JSGlobalContextRef context, JSObjectRef globalObject)
 {
+    JSValueRef exception = 0;
+    assert(layoutTestController);
+    layoutTestController->makeWindowObject(context, globalObject, &exception);
+    assert(!exception);
+}
+
+gboolean webViewConsoleMessage(WebKitWebView* view, const gchar* message, unsigned int line, const gchar* sourceId)
+{
+    fprintf(stdout, "CONSOLE MESSAGE: line %d: %s\n", line, message);
+    return TRUE;
+}
 
+int main(int argc, char* argv[])
+{
     struct option options[] = {
         {"horizontal-sweep", no_argument, &repaintSweepHorizontallyDefault, true},
         {"notree", no_argument, &dumpTree, false},
@@ -239,8 +283,20 @@ int main(int argc, char* argv[])
     gtk_init(&argc, &argv);
     webkit_init();
 
-    view = WEBKIT_WEB_VIEW(webkit_web_view_new());
-    mainFrame = webkit_web_view_get_main_frame(view);
+    GtkWidget* window = gtk_window_new(GTK_WINDOW_POPUP);
+    GtkContainer* container = GTK_CONTAINER(gtk_fixed_new());
+    gtk_container_add(GTK_CONTAINER(window), GTK_WIDGET(container));
+    gtk_widget_realize(window);
+
+    webView = WEBKIT_WEB_VIEW(webkit_web_view_new());
+    gtk_container_add(container, GTK_WIDGET(webView));
+    gtk_widget_realize(GTK_WIDGET(webView));
+    mainFrame = webkit_web_view_get_main_frame(webView);
+
+    g_signal_connect(G_OBJECT(webView), "load-started", G_CALLBACK(webViewLoadStarted), 0);
+    g_signal_connect(G_OBJECT(webView), "load-finished", G_CALLBACK(webViewLoadFinished), 0);
+    g_signal_connect(G_OBJECT(webView), "window-object-cleared", G_CALLBACK(webViewWindowObjectCleared), 0);
+    g_signal_connect(G_OBJECT(webView), "console-message", G_CALLBACK(webViewConsoleMessage), 0);
 
     if (argc == optind+1 && strcmp(argv[optind], "-") == 0) {
         char filenameBuffer[2048];
index fb690e3732b4a8b9b8f173a62bd489f1cb6c7088..1b9b4022b1af7f98523e045a4281c78d46d3ab98 100644 (file)
@@ -32,5 +32,6 @@
 #include "webkitdefines.h"
 
 extern WebKitWebFrame* mainFrame;
+extern WebKitWebFrame* topLoadingFrame;
 
 #endif // DumpRenderTreeGtk_h 
index 16f6f3d82c99ed5f239913708c0e2f3e2c09421d..6e18da9aac8631e1247d4a6881489ddb0ecdcf9c 100644 (file)
@@ -74,8 +74,7 @@ void LayoutTestController::keepWebHistory()
 
 void LayoutTestController::notifyDone()
 {
-    // FIXME: The frame might not be finished loading yet
-    if (m_waitToDump && !WorkQueue::shared()->count())
+    if (m_waitToDump && !topLoadingFrame && !WorkQueue::shared()->count())
         dump();
     m_waitToDump = false;
 }
index e2510dc9f64171b6eed747713270091e92993614..7f48a59f54e85cd27d4035041f3ffdaba66821cb 100755 (executable)
@@ -45,8 +45,8 @@ if (isOSX()) {
     $result = system "xcodebuild", "-project", "DumpRenderTree.xcodeproj", @options;
 } elsif (isCygwin()) {
     $result = buildVisualStudioProject("DumpRenderTree.sln");
-} elsif (isQt()) {
-    # Qt/Linux builds everything in one-shot. No need to build anything here.
+} elsif (isQt() || isGtk()) {
+    # Qt and Gtk build everything in one shot. No need to build anything here.
     $result = 0;
 } else {
     die "Building not defined for this platform!\n";
index af65109c9970f27b8cef420ca02b739c77ab1b59..d096f4594ac35ae4069bfef3e26901bb4bac9f91 100755 (executable)
@@ -242,7 +242,7 @@ if ($shouldCheckLeaks && $testsPerDumpTool > 1000) {
 }
 
 # Force --no-http for Qt/Linux, for now.
-$testHTTP = 0 if isQt();
+$testHTTP = 0 if (isQt() || isGtk());
 
 # Stack logging does not play well with QuickTime on Tiger (rdar://problem/5537157)
 $testMedia = 0 if $shouldCheckLeaks && isTiger();
@@ -250,6 +250,7 @@ $testMedia = 0 if $shouldCheckLeaks && isTiger();
 setConfigurationProductDir(Cwd::abs_path($root)) if (defined($root));
 my $productDir = productDir();
 $productDir .= "/bin" if (isQt());
+$productDir .= "/WebKitTools/DumpRenderTree/gtk" if isGtk();
 
 chdirWebKit();
 
@@ -958,6 +959,8 @@ close HTML;
 
 if (isQt()) {
   system "konqueror", $testResults if $launchSafari;
+} elsif (isGtk()) {
+  system "WebKitTools/Scripts/run-launcher", "--gtk", $configurationOption, $testResults if $launchSafari;
 } elsif (isCygwin()) {
   system "cygstart", $testResults if $launchSafari;
 } else {
@@ -1137,13 +1140,13 @@ sub openDumpTool()
     my $homePath = $ENV{'HOMEPATH'};
         
     local %ENV;
-    if (isQt()) {
+    if (isQt() || isGtk()) {
         if (defined $display) {
             $ENV{DISPLAY} = $display;
         } else {
             $ENV{DISPLAY} = ":1";
         }
-        $ENV{'WEBKIT_TESTFONTS'} = $testfonts;
+        $ENV{'WEBKIT_TESTFONTS'} = $testfonts if defined($testfonts);
         $ENV{HOME} = $homeDir;
         if (defined $libraryPath) {
             $ENV{LD_LIBRARY_PATH} = $libraryPath;