DumpRenderTree.cpp revision 81bc750723a18f21cd17d1b173cd2a4dda9cea6e
1563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark/*
2563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * Copyright (C) 2007 Eric Seidel <eric@webkit.org>
3563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * Copyright (C) 2008 Alp Toker <alp@nuanti.com>
4563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * Copyright (C) 2009 Jan Alonzo <jmalonzo@gmail.com>
506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen * Copyright (C) 2010 Igalia S.L.
6563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark *
7563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * Redistribution and use in source and binary forms, with or without
8563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * modification, are permitted provided that the following conditions
9563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * are met:
10563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark *
11563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * 1.  Redistributions of source code must retain the above copyright
12563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark *     notice, this list of conditions and the following disclaimer.
13563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * 2.  Redistributions in binary form must reproduce the above copyright
14563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark *     notice, this list of conditions and the following disclaimer in the
15563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark *     documentation and/or other materials provided with the distribution.
16563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
17563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark *     its contributors may be used to endorse or promote products derived
18563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark *     from this software without specific prior written permission.
19563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark *
20563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
21563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
22563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
23563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
24563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
25563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
26563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
27563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
28563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
29563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark */
31563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
32563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark#include "config.h"
33563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark#include "DumpRenderTree.h"
34563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
350bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#include "AccessibilityController.h"
364576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang#include "EditingCallbacks.h"
37231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#include "EventSender.h"
380bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#include "GCController.h"
39bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen#include "GOwnPtr.h"
40563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark#include "LayoutTestController.h"
41e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke#include "PixelDumpSupport.h"
422fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#include "TextInputController.h"
43e14391e94c850b8bd03680c23b38978db68687a8John Reck#include "WebCoreSupport/DumpRenderTreeSupportGtk.h"
44563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark#include "WorkQueue.h"
45563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark#include "WorkQueueItem.h"
46e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke#include <JavaScriptCore/JavaScript.h>
47e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke#include <cassert>
48e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke#include <cstdlib>
49e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke#include <cstring>
50e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke#include <getopt.h>
51563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark#include <gtk/gtk.h>
52563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark#include <webkit/webkit.h>
53563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark#include <wtf/Assertions.h>
54563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
55231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#if PLATFORM(X11)
56231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#include <fontconfig/fontconfig.h>
57231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#endif
58231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
59563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
60563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkusing namespace std;
61563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
62563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkextern "C" {
63563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark// This API is not yet public.
64563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkextern G_CONST_RETURN gchar* webkit_web_history_item_get_target(WebKitWebHistoryItem*);
65563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkextern gboolean webkit_web_history_item_is_target_item(WebKitWebHistoryItem*);
66563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkextern GList* webkit_web_history_item_get_children(WebKitWebHistoryItem*);
67563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkextern void webkit_web_settings_add_extra_plugin_directory(WebKitWebView* view, const gchar* directory);
68563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkextern gchar* webkit_web_frame_get_response_mime_type(WebKitWebFrame* frame);
69563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark}
70563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
71563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkvolatile bool done;
72563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkstatic bool printSeparators;
73563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkstatic int dumpPixels;
74563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkstatic int dumpTree = 1;
75563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
760bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben MurdochAccessibilityController* axController = 0;
7706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian MonsenRefPtr<LayoutTestController> gLayoutTestController;
780bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochstatic GCController* gcController = 0;
79563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkstatic WebKitWebView* webView;
80231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blockstatic GtkWidget* window;
810bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochstatic GtkWidget* container;
82643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockstatic GtkWidget* webInspectorWindow;
83563af33bc48281d19dce701398dbb88cb54fd7ecCary ClarkWebKitWebFrame* mainFrame = 0;
84563af33bc48281d19dce701398dbb88cb54fd7ecCary ClarkWebKitWebFrame* topLoadingFrame = 0;
85563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkguint waitToDumpWatchdog = 0;
860bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochbool waitForPolicy = false;
870bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
880bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch// This is a list of opened webviews
890bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben MurdochGSList* webViewList = 0;
90563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
91563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark// current b/f item at the end of the previous test
92563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkstatic WebKitWebHistoryItem* prevTestBFItem = NULL;
93563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
94563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkconst unsigned historyItemIndent = 8;
95563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
965abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrickstatic void runTest(const string& testPathOrURL);
975abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
9806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsenstatic bool shouldLogFrameLoadDelegates(const string& pathOrURL)
99563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{
10006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    return pathOrURL.find("loading/") != string::npos;
101563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark}
102563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
10306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsenstatic bool shouldOpenWebInspector(const string& pathOrURL)
104643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
10506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    return pathOrURL.find("inspector/") != string::npos;
106643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
107643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
10881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochstatic bool shouldDumpAsText(const string& pathOrURL)
10981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch{
11081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    return pathOrURL.find("dumpAsText/") != string::npos;
11181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch}
11281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
11306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsenstatic bool shouldEnableDeveloperExtras(const string& pathOrURL)
114dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
1154576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    return true;
116dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
117dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
118563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkvoid dumpFrameScrollPosition(WebKitWebFrame* frame)
119563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{
120563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
121563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark}
122563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
123563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkvoid displayWebView()
124563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{
125643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    gtk_widget_queue_draw(GTK_WIDGET(webView));
126563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark}
127563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
128563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkstatic void appendString(gchar*& target, gchar* string)
129563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{
130563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    gchar* oldString = target;
131563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    target = g_strconcat(target, string, NULL);
132563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    g_free(oldString);
133563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark}
134563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
135a94275402997c11dd2e778633dacf4b7e630a35dBen Murdochstatic void initializeGtkFontSettings(const char* testURL)
136a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch{
137a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    GtkSettings* settings = gtk_settings_get_default();
138a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    if (!settings)
139a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        return;
14028040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    g_object_set(settings, "gtk-xft-antialias", 1,
14128040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu                 "gtk-xft-hinting", 0,
14228040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu                 "gtk-font-name", "Liberation Sans 16", NULL);
143a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
144a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    // One test needs subpixel anti-aliasing turned on, but generally we
145a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    // want all text in other tests to use to grayscale anti-aliasing.
146a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    if (testURL && strstr(testURL, "xsettings_antialias_settings.html"))
147a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        g_object_set(settings, "gtk-xft-rgba", "rgb", NULL);
148a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    else
149a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        g_object_set(settings, "gtk-xft-rgba", "none", NULL);
150a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch}
151a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
152a94275402997c11dd2e778633dacf4b7e630a35dBen Murdochstatic void initializeFonts(const char* testURL = 0)
153231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block{
1545abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick#if PLATFORM(X11)
155a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    initializeGtkFontSettings(testURL);
156a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
1575abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    FcInit();
1585abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
159bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    // If a test resulted a font being added or removed via the @font-face rule, then
160bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    // we want to reset the FontConfig configuration to prevent it from affecting other tests.
161bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    static int numFonts = 0;
162231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    FcFontSet* appFontSet = FcConfigGetFonts(0, FcSetApplication);
163bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    if (appFontSet && numFonts && appFontSet->nfont == numFonts)
164231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        return;
165231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
166bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    // Load our configuration file, which sets up proper aliases for family
167bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    // names like sans, serif and monospace.
168bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    FcConfig* config = FcConfigCreate();
169bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    GOwnPtr<gchar> fontConfigFilename(g_build_filename(FONTS_CONF_DIR, "fonts.conf", NULL));
170bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    if (!FcConfigParseAndLoad(config, reinterpret_cast<FcChar8*>(fontConfigFilename.get()), true))
171bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        g_error("Couldn't load font configuration file from: %s", fontConfigFilename.get());
172bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
173bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    static const char *const fontPaths[][2] = {
174bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        { "/usr/share/fonts/truetype/ttf-liberation/LiberationMono-BoldItalic.ttf",
175bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen          "/usr/share/fonts/liberation/LiberationMono-BoldItalic.ttf", },
176bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        { "/usr/share/fonts/truetype/ttf-liberation/LiberationMono-Bold.ttf",
177bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen          "/usr/share/fonts/liberation/LiberationMono-Bold.ttf", },
178bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        { "/usr/share/fonts/truetype/ttf-liberation/LiberationMono-Italic.ttf",
179bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen          "/usr/share/fonts/liberation/LiberationMono-Italic.ttf", },
180bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        { "/usr/share/fonts/truetype/ttf-liberation/LiberationMono-Regular.ttf",
181bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen          "/usr/share/fonts/liberation/LiberationMono-Regular.ttf", },
182bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        { "/usr/share/fonts/truetype/ttf-liberation/LiberationSans-BoldItalic.ttf",
183bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen          "/usr/share/fonts/liberation/LiberationSans-BoldItalic.ttf", },
184bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        { "/usr/share/fonts/truetype/ttf-liberation/LiberationSans-Bold.ttf",
185bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen          "/usr/share/fonts/liberation/LiberationSans-Bold.ttf", },
186bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        { "/usr/share/fonts/truetype/ttf-liberation/LiberationSans-Italic.ttf",
187bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen          "/usr/share/fonts/liberation/LiberationSans-Italic.ttf", },
188bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        { "/usr/share/fonts/truetype/ttf-liberation/LiberationSans-Regular.ttf",
189bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen          "/usr/share/fonts/liberation/LiberationSans-Regular.ttf", },
190bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        { "/usr/share/fonts/truetype/ttf-liberation/LiberationSerif-BoldItalic.ttf",
191bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen          "/usr/share/fonts/liberation/LiberationSerif-BoldItalic.ttf", },
192bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        { "/usr/share/fonts/truetype/ttf-liberation/LiberationSerif-Bold.ttf",
193bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen          "/usr/share/fonts/liberation/LiberationSerif-Bold.ttf", },
194bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        { "/usr/share/fonts/truetype/ttf-liberation/LiberationSerif-Italic.ttf",
195bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen          "/usr/share/fonts/liberation/LiberationSerif-Italic.ttf", },
196bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        { "/usr/share/fonts/truetype/ttf-liberation/LiberationSerif-Regular.ttf",
197bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen          "/usr/share/fonts/liberation/LiberationSerif-Regular.ttf", },
198bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        { "/usr/share/fonts/truetype/ttf-dejavu/DejaVuSans.ttf",
199bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen          "/usr/share/fonts/dejavu/DejaVuSans.ttf", },
200a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        { "/usr/share/fonts/truetype/ttf-dejavu/DejaVuSerif.ttf",
201a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch          "/usr/share/fonts/dejavu/DejaVuSerif.ttf", },
202e14391e94c850b8bd03680c23b38978db68687a8John Reck
203e14391e94c850b8bd03680c23b38978db68687a8John Reck        // MathML tests require the STIX fonts.
204e14391e94c850b8bd03680c23b38978db68687a8John Reck        { "/usr/share/fonts/opentype/stix/STIXGeneral.otf",
205e14391e94c850b8bd03680c23b38978db68687a8John Reck          "/usr/share/fonts/stix/STIXGeneral.otf" },
206e14391e94c850b8bd03680c23b38978db68687a8John Reck        { "/usr/share/fonts/opentype/stix/STIXGeneralBolIta.otf",
207e14391e94c850b8bd03680c23b38978db68687a8John Reck          "/usr/share/fonts/stix/STIXGeneralBolIta.otf" },
208e14391e94c850b8bd03680c23b38978db68687a8John Reck        { "/usr/share/fonts/opentype/stix/STIXGeneralBol.otf",
209e14391e94c850b8bd03680c23b38978db68687a8John Reck          "/usr/share/fonts/stix/STIXGeneralBol.otf" },
210e14391e94c850b8bd03680c23b38978db68687a8John Reck        { "/usr/share/fonts/opentype/stix/STIXGeneralItalic.otf",
211e14391e94c850b8bd03680c23b38978db68687a8John Reck          "/usr/share/fonts/stix/STIXGeneralItalic.otf" }
212bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    };
213bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
214bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    // TODO: Some tests use Lucida. We should load these as well, once it becomes
215bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    // clear how to install these fonts easily on Fedora.
216bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    for (size_t font = 0; font < G_N_ELEMENTS(fontPaths); font++) {
217bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        bool found = false;
218bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        for (size_t path = 0; path < 2; path++) {
219bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
220bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            if (g_file_test(fontPaths[font][path], G_FILE_TEST_EXISTS)) {
221bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen                found = true;
222bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen                if (!FcConfigAppFontAddFile(config, reinterpret_cast<const FcChar8*>(fontPaths[font][path])))
223bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen                    g_error("Could not load font at %s!", fontPaths[font][path]);
224bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen                else
225bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen                    break;
226bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            }
227bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        }
228bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
229bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        if (!found)
230bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            g_error("Could not find font at %s. Either install this font or file a bug "
231bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen                    "at http://bugs.webkit.org if it is installed in another location.",
232bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen                    fontPaths[font][0]);
233bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    }
234231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
235bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    // Ahem is used by many layout tests.
236bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    GOwnPtr<gchar> ahemFontFilename(g_build_filename(FONTS_CONF_DIR, "AHEM____.TTF", NULL));
237bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    if (!FcConfigAppFontAddFile(config, reinterpret_cast<FcChar8*>(ahemFontFilename.get())))
238bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        g_error("Could not load font at %s!", ahemFontFilename.get());
239231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
24081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    for (int i = 1; i <= 9; i++) {
24181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        GOwnPtr<gchar> fontFilename(g_strdup_printf("WebKitWeightWatcher%i00.ttf", i));
24281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        GOwnPtr<gchar> fontPath(g_build_filename(FONTS_CONF_DIR, "..", "..", "fonts", fontFilename.get(), NULL));
24381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        if (!FcConfigAppFontAddFile(config, reinterpret_cast<FcChar8*>(fontPath.get())))
24481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            g_error("Could not load font at %s!", fontPath.get());
24581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    }
24681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
247f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    // A font with no valid Fontconfig encoding to test https://bugs.webkit.org/show_bug.cgi?id=47452
248f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    GOwnPtr<gchar> fontWithNoValidEncodingFilename(g_build_filename(FONTS_CONF_DIR, "FontWithNoValidEncoding.fon", NULL));
249f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    if (!FcConfigAppFontAddFile(config, reinterpret_cast<FcChar8*>(fontWithNoValidEncodingFilename.get())))
250f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        g_error("Could not load font at %s!", fontWithNoValidEncodingFilename.get());
251f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
252bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    if (!FcConfigSetCurrent(config))
253bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        g_error("Could not set the current font configuration!");
254231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
255bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    numFonts = FcConfigGetFonts(config, FcSetApplication)->nfont;
256231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#endif
2575abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick}
258231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
259563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkstatic gchar* dumpFramesAsText(WebKitWebFrame* frame)
260563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{
261563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    gchar* result = 0;
262563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
263563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    // Add header for all but the main frame.
264563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    bool isMainFrame = (webkit_web_view_get_main_frame(webView) == frame);
265563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
266f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    CString innerText = DumpRenderTreeSupportGtk::getInnerText(frame);
267563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    if (isMainFrame)
268f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        result = g_strdup_printf("%s\n", innerText.data());
269563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    else {
270563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        const gchar* frameName = webkit_web_frame_get_name(frame);
271f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        result = g_strdup_printf("\n--------\nFrame: '%s'\n--------\n%s\n", frameName, innerText.data());
272563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    }
273563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
274563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    if (gLayoutTestController->dumpChildFramesAsText()) {
275f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        GSList* children = DumpRenderTreeSupportGtk::getFrameChildren(frame);
276563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        for (GSList* child = children; child; child = g_slist_next(child))
2770bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            appendString(result, dumpFramesAsText(static_cast<WebKitWebFrame* >(child->data)));
278563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        g_slist_free(children);
279563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    }
280563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
281563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    return result;
282563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark}
283563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
284563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkstatic gint compareHistoryItems(gpointer* item1, gpointer* item2)
285563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{
286563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    return g_ascii_strcasecmp(webkit_web_history_item_get_target(WEBKIT_WEB_HISTORY_ITEM(item1)),
287563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark                              webkit_web_history_item_get_target(WEBKIT_WEB_HISTORY_ITEM(item2)));
288563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark}
289563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
290563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkstatic void dumpHistoryItem(WebKitWebHistoryItem* item, int indent, bool current)
291563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{
292563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    ASSERT(item != NULL);
293563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    int start = 0;
294563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    g_object_ref(item);
295563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    if (current) {
296563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        printf("curr->");
297563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        start = 6;
298563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    }
299563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    for (int i = start; i < indent; i++)
300563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        putchar(' ');
3010bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
3020bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    // normalize file URLs.
3030bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    const gchar* uri = webkit_web_history_item_get_uri(item);
3040bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    gchar* uriScheme = g_uri_parse_scheme(uri);
3050bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (g_strcmp0(uriScheme, "file") == 0) {
3060bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        gchar* pos = g_strstr_len(uri, -1, "/LayoutTests/");
3070bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        if (!pos)
3080bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            return;
3090bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
3100bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        GString* result = g_string_sized_new(strlen(uri));
3110bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        result = g_string_append(result, "(file test):");
3120bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        result = g_string_append(result, pos + strlen("/LayoutTests/"));
3130bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        printf("%s", result->str);
3140bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        g_string_free(result, TRUE);
3150bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    } else
3160bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        printf("%s", uri);
3170bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
3180bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    g_free(uriScheme);
3190bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
320563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    const gchar* target = webkit_web_history_item_get_target(item);
3210bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (target && strlen(target) > 0)
322563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        printf(" (in frame \"%s\")", target);
323563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    if (webkit_web_history_item_is_target_item(item))
324563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        printf("  **nav target**");
325563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    putchar('\n');
326563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    GList* kids = webkit_web_history_item_get_children(item);
327563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    if (kids) {
328563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        // must sort to eliminate arbitrary result ordering which defeats reproducible testing
329563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        kids = g_list_sort(kids, (GCompareFunc) compareHistoryItems);
330563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        for (unsigned i = 0; i < g_list_length(kids); i++)
331563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark            dumpHistoryItem(WEBKIT_WEB_HISTORY_ITEM(g_list_nth_data(kids, i)), indent+4, FALSE);
332563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    }
333563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    g_object_unref(item);
334563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark}
335563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
336563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkstatic void dumpBackForwardListForWebView(WebKitWebView* view)
337563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{
338563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    printf("\n============== Back Forward List ==============\n");
339563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    WebKitWebBackForwardList* bfList = webkit_web_view_get_back_forward_list(view);
340563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
341563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    // Print out all items in the list after prevTestBFItem, which was from the previous test
342563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    // Gather items from the end of the list, the print them out from oldest to newest
343563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    GList* itemsToPrint = NULL;
344563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    gint forwardListCount = webkit_web_back_forward_list_get_forward_length(bfList);
345563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    for (int i = forwardListCount; i > 0; i--) {
346563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        WebKitWebHistoryItem* item = webkit_web_back_forward_list_get_nth_item(bfList, i);
347563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        // something is wrong if the item from the last test is in the forward part of the b/f list
348563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        ASSERT(item != prevTestBFItem);
349563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        g_object_ref(item);
350563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        itemsToPrint = g_list_append(itemsToPrint, item);
351563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    }
352563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
353563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    WebKitWebHistoryItem* currentItem = webkit_web_back_forward_list_get_current_item(bfList);
354563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
355563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    g_object_ref(currentItem);
356563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    itemsToPrint = g_list_append(itemsToPrint, currentItem);
357563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
358563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    gint currentItemIndex = g_list_length(itemsToPrint) - 1;
359563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    gint backListCount = webkit_web_back_forward_list_get_back_length(bfList);
360563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    for (int i = -1; i >= -(backListCount); i--) {
361563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        WebKitWebHistoryItem* item = webkit_web_back_forward_list_get_nth_item(bfList, i);
362563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        if (item == prevTestBFItem)
363563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark            break;
364563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        g_object_ref(item);
365563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        itemsToPrint = g_list_append(itemsToPrint, item);
366563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    }
367563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
368563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    for (int i = g_list_length(itemsToPrint) - 1; i >= 0; i--) {
369563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        WebKitWebHistoryItem* item = WEBKIT_WEB_HISTORY_ITEM(g_list_nth_data(itemsToPrint, i));
370563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        dumpHistoryItem(item, historyItemIndent, i == currentItemIndex);
371563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        g_object_unref(item);
372563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    }
373563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    g_list_free(itemsToPrint);
374563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    printf("===============================================\n");
375563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark}
376563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
3770bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochstatic void dumpBackForwardListForAllWebViews()
3780bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
3790bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    // Dump the back forward list of the main WebView first
3800bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    dumpBackForwardListForWebView(webView);
3810bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
3820bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    // The view list is prepended. Reverse the list so we get the order right.
3830bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    GSList* viewList = g_slist_reverse(webViewList);
3840bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    for (unsigned i = 0; i < g_slist_length(viewList); ++i)
3850bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        dumpBackForwardListForWebView(WEBKIT_WEB_VIEW(g_slist_nth_data(viewList, i)));
3860bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
3870bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
388563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkstatic void invalidateAnyPreviousWaitToDumpWatchdog()
389563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{
390563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    if (waitToDumpWatchdog) {
391563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        g_source_remove(waitToDumpWatchdog);
392563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        waitToDumpWatchdog = 0;
393563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    }
3940bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
3950bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    waitForPolicy = false;
396563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark}
397563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
398231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blockstatic void resetDefaultsToConsistentValues()
399563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{
400563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    WebKitWebSettings* settings = webkit_web_view_get_settings(webView);
401563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    g_object_set(G_OBJECT(settings),
402563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark                 "enable-private-browsing", FALSE,
403563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark                 "enable-developer-extras", FALSE,
4040bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                 "enable-spell-checking", TRUE,
4050bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                 "enable-html5-database", TRUE,
4060bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                 "enable-html5-local-storage", TRUE,
4070bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                 "enable-xss-auditor", FALSE,
408dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                 "enable-spatial-navigation", FALSE,
409a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch                 "enable-frame-flattening", FALSE,
41021939df44de1705786c545cd1bf519d47250322dBen Murdoch                 "javascript-can-access-clipboard", TRUE,
4110bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                 "javascript-can-open-windows-automatically", TRUE,
4120bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                 "enable-offline-web-application-cache", TRUE,
413231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block                 "enable-universal-access-from-file-uris", TRUE,
414231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block                 "enable-scripts", TRUE,
415cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block                 "enable-dom-paste", TRUE,
416231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block                 "default-font-family", "Times",
417231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block                 "monospace-font-family", "Courier",
418231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block                 "serif-font-family", "Times",
419231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block                 "sans-serif-font-family", "Helvetica",
420a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch                 "cursive-font-family", "cursive",
421a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch                 "fantasy-font-family", "fantasy",
422231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block                 "default-font-size", 16,
423231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block                 "default-monospace-font-size", 13,
42465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch                 "minimum-font-size", 0,
425d0825bca7fe65beaee391d30da42e937db621564Steve Block                 "enable-caret-browsing", FALSE,
426d0825bca7fe65beaee391d30da42e937db621564Steve Block                 "enable-page-cache", FALSE,
427692e5dbf12901edacf14812a6fae25462920af42Steve Block                 "auto-resize-window", TRUE,
428692e5dbf12901edacf14812a6fae25462920af42Steve Block                 "enable-java-applet", FALSE,
429dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                 "enable-plugins", TRUE,
430bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen                 "enable-hyperlink-auditing", FALSE,
431f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch                 "editing-behavior", WEBKIT_EDITING_BEHAVIOR_UNIX,
432f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch                 "enable-fullscreen", TRUE,
433563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark                 NULL);
434f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    webkit_web_view_set_settings(webView, settings);
4352fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    webkit_set_cache_model(WEBKIT_CACHE_MODEL_DOCUMENT_BROWSER);
436563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
437f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    DumpRenderTreeSupportGtk::clearMainFrameName(mainFrame);
4380bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
439563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    WebKitWebInspector* inspector = webkit_web_view_get_inspector(webView);
440563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    g_object_set(G_OBJECT(inspector), "javascript-profiling-enabled", FALSE, NULL);
441231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
442d0825bca7fe65beaee391d30da42e937db621564Steve Block    webkit_web_view_set_zoom_level(webView, 1.0);
44381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    DumpRenderTreeSupportGtk::setMinimumTimerInterval(webView, DumpRenderTreeSupportGtk::defaultMinimumTimerInterval());
444d0825bca7fe65beaee391d30da42e937db621564Steve Block
445f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    DumpRenderTreeSupportGtk::resetOriginAccessWhiteLists();
446231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
447a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    WebKitWebBackForwardList* list = webkit_web_view_get_back_forward_list(webView);
448a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    webkit_web_back_forward_list_clear(list);
449a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
450dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    SoupSession* session = webkit_get_default_session();
451dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    SoupCookieJar* jar = reinterpret_cast<SoupCookieJar*>(soup_session_get_feature(session, SOUP_TYPE_COOKIE_JAR));
452dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
453dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    // We only create the jar when the soup backend needs to do
454dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    // HTTP. Should we initialize it earlier, perhaps?
455dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (jar)
456dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        g_object_set(G_OBJECT(jar), SOUP_COOKIE_JAR_ACCEPT_POLICY, SOUP_COOKIE_JAR_ACCEPT_NO_THIRD_PARTY, NULL);
457dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
458231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    setlocale(LC_ALL, "");
459e14391e94c850b8bd03680c23b38978db68687a8John Reck
460e14391e94c850b8bd03680c23b38978db68687a8John Reck    DumpRenderTreeSupportGtk::setLinksIncludedInFocusChain(true);
4612fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    DumpRenderTreeSupportGtk::setIconDatabaseEnabled(false);
46281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    DumpRenderTreeSupportGtk::setSelectTrailingWhitespaceEnabled(false);
4632fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
4642fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (axController)
4652fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        axController->resetToConsistentState();
46681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
46781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    DumpRenderTreeSupportGtk::clearOpener(mainFrame);
468563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark}
469563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
4705abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrickstatic bool useLongRunningServerMode(int argc, char *argv[])
4715abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick{
4725abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    // This assumes you've already called getopt_long
4735abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    return (argc == optind+1 && !strcmp(argv[optind], "-"));
4745abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick}
4755abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
4765abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrickstatic void runTestingServerLoop()
4775abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick{
4785abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    // When DumpRenderTree runs in server mode, we just wait around for file names
4795abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    // to be passed to us and read each in turn, passing the results back to the client
4805abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    char filenameBuffer[2048];
4815abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    while (fgets(filenameBuffer, sizeof(filenameBuffer), stdin)) {
4825abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        char* newLineCharacter = strchr(filenameBuffer, '\n');
4835abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        if (newLineCharacter)
4845abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick            *newLineCharacter = '\0';
4855abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
4865abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        if (!strlen(filenameBuffer))
4875abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick            continue;
4885abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
4895abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        runTest(filenameBuffer);
4905abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    }
4915abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick}
4925abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
4935abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrickstatic void initializeGlobalsFromCommandLineOptions(int argc, char *argv[])
4945abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick{
4955abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    struct option options[] = {
4965abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        {"notree", no_argument, &dumpTree, false},
4975abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        {"pixel-tests", no_argument, &dumpPixels, true},
4985abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        {"tree", no_argument, &dumpTree, true},
4995abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        {NULL, 0, NULL, 0}
5005abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    };
5015abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
5025abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    int option;
5035abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    while ((option = getopt_long(argc, (char * const *)argv, "", options, NULL)) != -1) {
5045abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        switch (option) {
5055abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        case '?': // unknown or ambiguous option
5065abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        case ':': // missing argument
5075abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick            exit(1);
5085abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick            break;
5095abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        }
5105abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    }
5115abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick}
5125abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
5135abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
514563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkvoid dump()
515563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{
516563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    invalidateAnyPreviousWaitToDumpWatchdog();
517563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
518563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    if (dumpTree) {
519563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        char* result = 0;
520563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        gchar* responseMimeType = webkit_web_frame_get_response_mime_type(mainFrame);
521563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
5224576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        if (g_str_equal(responseMimeType, "text/plain")) {
52381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            gLayoutTestController->setDumpAsText(true);
5244576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang            gLayoutTestController->setGeneratePixelResults(false);
5254576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        }
526563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        g_free(responseMimeType);
527563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
528563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        if (gLayoutTestController->dumpAsText())
529563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark            result = dumpFramesAsText(mainFrame);
530545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        else {
531545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            // Widget resizing is done asynchronously in GTK+. We pump the main
532545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            // loop here, to flush any pending resize requests. This prevents
533545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            // timing issues which affect the size of elements in the output.
534545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            // We only enable this workaround for tests that print the render tree
535545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            // because this seems to break some dumpAsText tests: see bug 39988
536545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            // After fixing that test, we should apply this approach to all dumps.
537545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            while (gtk_events_pending())
538545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch                gtk_main_iteration();
539545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch
540f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch            result = g_strdup(DumpRenderTreeSupportGtk::dumpRenderTree(mainFrame).data());
541545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        }
542563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
543563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        if (!result) {
544563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark            const char* errorMessage;
545563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark            if (gLayoutTestController->dumpAsText())
546563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark                errorMessage = "[documentElement innerText]";
547563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark            else if (gLayoutTestController->dumpDOMAsWebArchive())
548563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark                errorMessage = "[[mainFrame DOMDocument] webArchive]";
549563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark            else if (gLayoutTestController->dumpSourceAsWebArchive())
550563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark                errorMessage = "[[mainFrame dataSource] webArchive]";
551563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark            else
552563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark                errorMessage = "[mainFrame renderTreeAsExternalRepresentation]";
553563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark            printf("ERROR: nil result from %s", errorMessage);
554563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        } else {
555563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark            printf("%s", result);
556563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark            g_free(result);
557563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark            if (!gLayoutTestController->dumpAsText() && !gLayoutTestController->dumpDOMAsWebArchive() && !gLayoutTestController->dumpSourceAsWebArchive())
558563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark                dumpFrameScrollPosition(mainFrame);
559563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
5600bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            if (gLayoutTestController->dumpBackForwardList())
5610bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                dumpBackForwardListForAllWebViews();
562563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        }
563563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
564563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        if (printSeparators) {
565563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark            puts("#EOF"); // terminate the content block
566563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark            fputs("#EOF\n", stderr);
567563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark            fflush(stdout);
568563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark            fflush(stderr);
569563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        }
570563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    }
571563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
572967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    if (dumpPixels
573967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch     && gLayoutTestController->generatePixelResults()
574967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch     && !gLayoutTestController->dumpDOMAsWebArchive()
575967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch     && !gLayoutTestController->dumpSourceAsWebArchive())
576967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch        dumpWebViewAsPixelsAndCompareWithExpected(gLayoutTestController->expectedPixelHash());
577563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
578563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    // FIXME: call displayWebView here when we support --paint
579563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
580563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    done = true;
581643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    gtk_main_quit();
582563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark}
583563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
584563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkstatic void setDefaultsToConsistentStateValuesForTesting()
585563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{
586563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    gdk_screen_set_resolution(gdk_screen_get_default(), 72.0);
587563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
588231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    resetDefaultsToConsistentValues();
5890bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
5900bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    /* Disable the default auth dialog for testing */
5910bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    SoupSession* session = webkit_get_default_session();
5920bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    soup_session_remove_feature_by_type(session, WEBKIT_TYPE_SOUP_AUTH_DIALOG);
5930bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
594563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark#if PLATFORM(X11)
595563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    webkit_web_settings_add_extra_plugin_directory(webView, TEST_PLUGIN_DIR);
596563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark#endif
597231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
598231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    gchar* databaseDirectory = g_build_filename(g_get_user_data_dir(), "gtkwebkitdrt", "databases", NULL);
599231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    webkit_set_web_database_directory_path(databaseDirectory);
600231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    g_free(databaseDirectory);
601563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark}
602563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
603643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockstatic void sendPixelResultsEOF()
604643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
605643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    puts("#EOF");
606643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
607643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    fflush(stdout);
608643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    fflush(stderr);
609643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
610643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
611563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkstatic void runTest(const string& testPathOrURL)
612563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{
613563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    ASSERT(!testPathOrURL.empty());
614563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
615563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    // Look for "'" as a separator between the path or URL, and the pixel dump hash that follows.
61606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    string testURL(testPathOrURL);
617563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    string expectedPixelHash;
61806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    size_t separatorPos = testURL.find("'");
619563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    if (separatorPos != string::npos) {
62006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        testURL = string(testPathOrURL, 0, separatorPos);
621563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        expectedPixelHash = string(testPathOrURL, separatorPos + 1);
622563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    }
623563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
62406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    // Convert the path into a full file URL if it does not look
62506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    // like an HTTP/S URL (doesn't start with http:// or https://).
62606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    if (testURL.find("http://") && testURL.find("https://")) {
62706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        GFile* testFile = g_file_new_for_path(testURL.c_str());
62806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        gchar* testURLCString = g_file_get_uri(testFile);
62906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        testURL = testURLCString;
63006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        g_free(testURLCString);
63106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        g_object_unref(testFile);
63206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    }
633563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
634231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    resetDefaultsToConsistentValues();
635563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
63606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    gLayoutTestController = LayoutTestController::create(testURL, expectedPixelHash);
637563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    topLoadingFrame = 0;
638563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    done = false;
639563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
640563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    gLayoutTestController->setIconDatabaseEnabled(false);
641563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
64206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    if (shouldLogFrameLoadDelegates(testURL))
643563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        gLayoutTestController->setDumpFrameLoadCallbacks(true);
644563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
64506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    if (shouldEnableDeveloperExtras(testURL)) {
646dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        gLayoutTestController->setDeveloperExtrasEnabled(true);
64706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        if (shouldOpenWebInspector(testURL))
648dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            gLayoutTestController->showWebInspector();
64981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        if (shouldDumpAsText(testURL)) {
65081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            gLayoutTestController->setDumpAsText(true);
65181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            gLayoutTestController->setGeneratePixelResults(false);
65281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        }
653dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    }
654643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
655563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    WorkQueue::shared()->clear();
656563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    WorkQueue::shared()->setFrozen(false);
657563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
65806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    bool isSVGW3CTest = (testURL.find("svg/W3C-SVG-1.1") != string::npos);
659563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    GtkAllocation size;
660231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    size.x = size.y = 0;
661692e5dbf12901edacf14812a6fae25462920af42Steve Block    size.width = isSVGW3CTest ? 480 : LayoutTestController::maxViewWidth;
662692e5dbf12901edacf14812a6fae25462920af42Steve Block    size.height = isSVGW3CTest ? 360 : LayoutTestController::maxViewHeight;
663231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    gtk_window_resize(GTK_WINDOW(window), size.width, size.height);
6640bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    gtk_widget_size_allocate(container, &size);
665563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
666563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    if (prevTestBFItem)
667563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        g_object_unref(prevTestBFItem);
668563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    WebKitWebBackForwardList* bfList = webkit_web_view_get_back_forward_list(webView);
669563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    prevTestBFItem = webkit_web_back_forward_list_get_current_item(bfList);
670563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    if (prevTestBFItem)
671563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        g_object_ref(prevTestBFItem);
672563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
673a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    initializeFonts(testURL.c_str());
674563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
675231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    // Focus the web view before loading the test to avoid focusing problems
676231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    gtk_widget_grab_focus(GTK_WIDGET(webView));
67706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    webkit_web_view_open(webView, testURL.c_str());
678563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
679643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    gtk_main();
680563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
681dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    // If developer extras enabled Web Inspector may have been open by the test.
68206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    if (shouldEnableDeveloperExtras(testURL)) {
683643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        gLayoutTestController->closeWebInspector();
684545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        gLayoutTestController->setDeveloperExtrasEnabled(false);
685545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    }
6860bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
6870bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    // Also check if we still have opened webViews and free them.
6880bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (gLayoutTestController->closeRemainingWindowsWhenComplete() || webViewList) {
6890bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        while (webViewList) {
6900bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            g_object_unref(WEBKIT_WEB_VIEW(webViewList->data));
6910bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            webViewList = g_slist_next(webViewList);
6920bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        }
6930bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        g_slist_free(webViewList);
6940bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        webViewList = 0;
6950bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    }
6960bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
697563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    // A blank load seems to be necessary to reset state after certain tests.
698563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    webkit_web_view_open(webView, "about:blank");
699563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
70006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    gLayoutTestController.clear();
701643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
702643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    // terminate the (possibly empty) pixels block after all the state reset
703643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    sendPixelResultsEOF();
704563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark}
705563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
706563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkvoid webViewLoadStarted(WebKitWebView* view, WebKitWebFrame* frame, void*)
707563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{
708563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    // Make sure we only set this once per test.  If it gets cleared, and then set again, we might
709563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    // end up doing two dumps for one test.
710563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    if (!topLoadingFrame && !done)
711563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        topLoadingFrame = frame;
712563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark}
713563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
714563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkstatic gboolean processWork(void* data)
715563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{
7160bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    // if we finish all the commands, we're ready to dump state
7170bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (WorkQueue::shared()->processWork() && !gLayoutTestController->waitToDump())
718563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        dump();
719563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
720563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    return FALSE;
721563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark}
722563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
723231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blockstatic char* getFrameNameSuitableForTestResult(WebKitWebView* view, WebKitWebFrame* frame)
724231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block{
725231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    char* frameName = g_strdup(webkit_web_frame_get_name(frame));
726231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
727231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    if (frame == webkit_web_view_get_main_frame(view)) {
728231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        // This is a bit strange. Shouldn't web_frame_get_name return NULL?
729231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        if (frameName && (frameName[0] != '\0')) {
730231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            char* tmp = g_strdup_printf("main frame \"%s\"", frameName);
731dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            g_free(frameName);
732231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            frameName = tmp;
733231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        } else {
734231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            g_free(frameName);
735231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            frameName = g_strdup("main frame");
736231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        }
737231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    } else if (!frameName || (frameName[0] == '\0')) {
738231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        g_free(frameName);
739231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        frameName = g_strdup("frame (anonymous)");
740dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    } else {
741dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        char* tmp = g_strdup_printf("frame \"%s\"", frameName);
742dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        g_free(frameName);
743dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        frameName = tmp;
744231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    }
745231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
746231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    return frameName;
747231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block}
748231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
749563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkstatic void webViewLoadFinished(WebKitWebView* view, WebKitWebFrame* frame, void*)
750563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{
751563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    if (frame != topLoadingFrame)
752563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        return;
753563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
754563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    topLoadingFrame = 0;
755563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    WorkQueue::shared()->setFrozen(true); // first complete load freezes the queue for the rest of this test
756563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    if (gLayoutTestController->waitToDump())
757563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        return;
758563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
759563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    if (WorkQueue::shared()->count())
760563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        g_timeout_add(0, processWork, 0);
761643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    else
762563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        dump();
763563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark}
764563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
7652fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockstatic gboolean webViewLoadError(WebKitWebView*, WebKitWebFrame*, gchar*, gpointer, gpointer)
7662fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
7672fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    return TRUE; // Return true here to disable the default error page.
7682fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
7692fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
770dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockstatic void webViewDocumentLoadFinished(WebKitWebView* view, WebKitWebFrame* frame, void*)
771dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
772dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (!done && gLayoutTestController->dumpFrameLoadCallbacks()) {
773dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        char* frameName = getFrameNameSuitableForTestResult(view, frame);
774dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        printf("%s - didFinishDocumentLoadForFrame\n", frameName);
775dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        g_free(frameName);
776dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    } else if (!done) {
777f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        guint pendingFrameUnloadEvents = DumpRenderTreeSupportGtk::getPendingUnloadEventCount(frame);
778dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        if (pendingFrameUnloadEvents) {
779dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            char* frameName = getFrameNameSuitableForTestResult(view, frame);
780dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            printf("%s - has %u onunload handler(s)\n", frameName, pendingFrameUnloadEvents);
781dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            g_free(frameName);
782dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        }
783dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    }
784dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
785dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
786dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockstatic void webViewOnloadEvent(WebKitWebView* view, WebKitWebFrame* frame, void*)
787dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
788dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (!done && gLayoutTestController->dumpFrameLoadCallbacks()) {
789dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        char* frameName = getFrameNameSuitableForTestResult(view, frame);
790dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        printf("%s - didHandleOnloadEventsForFrame\n", frameName);
791dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        g_free(frameName);
792dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    }
793dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
794dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
795563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkstatic void webViewWindowObjectCleared(WebKitWebView* view, WebKitWebFrame* frame, JSGlobalContextRef context, JSObjectRef windowObject, gpointer data)
796563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{
797563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    JSValueRef exception = 0;
7980bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    ASSERT(gLayoutTestController);
799563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
800563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    gLayoutTestController->makeWindowObject(context, windowObject, &exception);
8010bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    ASSERT(!exception);
8020bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
8030bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    gcController->makeWindowObject(context, windowObject, &exception);
8040bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    ASSERT(!exception);
8050bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
8060bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    axController->makeWindowObject(context, windowObject, &exception);
8070bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    ASSERT(!exception);
8080bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
809231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    JSStringRef eventSenderStr = JSStringCreateWithUTF8CString("eventSender");
810545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    JSValueRef eventSender = makeEventSender(context, !webkit_web_frame_get_parent(frame));
811231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    JSObjectSetProperty(context, windowObject, eventSenderStr, eventSender, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete, 0);
812231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    JSStringRelease(eventSenderStr);
8132fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
8142fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    JSStringRef textInputControllerStr = JSStringCreateWithUTF8CString("textInputController");
8152fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    JSValueRef textInputController = makeTextInputController(context);
8162fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    JSObjectSetProperty(context, windowObject, textInputControllerStr, textInputController, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete, 0);
8172fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    JSStringRelease(textInputControllerStr);
818563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark}
819563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
820563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkstatic gboolean webViewConsoleMessage(WebKitWebView* view, const gchar* message, unsigned int line, const gchar* sourceId, gpointer data)
821563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{
822dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    gchar* testMessage = 0;
823dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    const gchar* uriScheme;
824dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
825dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    // Tests expect only the filename part of local URIs
826dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    uriScheme = g_strstr_len(message, -1, "file://");
827dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (uriScheme) {
828dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        GString* tempString = g_string_sized_new(strlen(message));
829dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        gchar* filename = g_strrstr(uriScheme, G_DIR_SEPARATOR_S);
830dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
831dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        if (filename) {
832dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            filename += strlen(G_DIR_SEPARATOR_S);
833dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            tempString = g_string_append_len(tempString, message, (uriScheme - message));
834dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            tempString = g_string_append_len(tempString, filename, strlen(filename));
835dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            testMessage = g_string_free(tempString, FALSE);
836dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        }
837dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    }
838dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
839dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    fprintf(stdout, "CONSOLE MESSAGE: line %d: %s\n", line, testMessage ? testMessage : message);
840dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    g_free(testMessage);
841dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
842563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    return TRUE;
843563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark}
844563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
845563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
846563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkstatic gboolean webViewScriptAlert(WebKitWebView* view, WebKitWebFrame* frame, const gchar* message, gpointer data)
847563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{
848563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    fprintf(stdout, "ALERT: %s\n", message);
849563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    return TRUE;
850563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark}
851563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
852563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkstatic gboolean webViewScriptPrompt(WebKitWebView* webView, WebKitWebFrame* frame, const gchar* message, const gchar* defaultValue, gchar** value, gpointer data)
853563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{
854563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    fprintf(stdout, "PROMPT: %s, default text: %s\n", message, defaultValue);
855563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    *value = g_strdup(defaultValue);
856563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    return TRUE;
857563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark}
858563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
859563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkstatic gboolean webViewScriptConfirm(WebKitWebView* view, WebKitWebFrame* frame, const gchar* message, gboolean* didConfirm, gpointer data)
860563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{
861563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    fprintf(stdout, "CONFIRM: %s\n", message);
862563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    *didConfirm = TRUE;
863563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    return TRUE;
864563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark}
865563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
866563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkstatic void webViewTitleChanged(WebKitWebView* view, WebKitWebFrame* frame, const gchar* title, gpointer data)
867563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{
868563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    if (gLayoutTestController->dumpTitleChanges() && !done)
869563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        printf("TITLE CHANGED: %s\n", title ? title : "");
870563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark}
871563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
8720bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochstatic bool webViewNavigationPolicyDecisionRequested(WebKitWebView* view, WebKitWebFrame* frame,
8730bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                                                     WebKitNetworkRequest* request,
8740bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                                                     WebKitWebNavigationAction* navAction,
8750bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                                                     WebKitWebPolicyDecision* policyDecision)
8760bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
8770bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    // Use the default handler if we're not waiting for policy,
8780bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    // i.e., LayoutTestController::waitForPolicyDelegate
8790bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (!waitForPolicy)
8800bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        return FALSE;
8810bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
8820bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    gchar* typeDescription;
8830bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    WebKitWebNavigationReason reason;
8840bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    g_object_get(G_OBJECT(navAction), "reason", &reason, NULL);
8850bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
8860bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    switch(reason) {
8870bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        case WEBKIT_WEB_NAVIGATION_REASON_LINK_CLICKED:
8880bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            typeDescription = g_strdup("link clicked");
8890bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            break;
8900bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        case WEBKIT_WEB_NAVIGATION_REASON_FORM_SUBMITTED:
8910bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            typeDescription = g_strdup("form submitted");
8920bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            break;
8930bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        case WEBKIT_WEB_NAVIGATION_REASON_BACK_FORWARD:
8940bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            typeDescription = g_strdup("back/forward");
8950bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            break;
8960bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        case WEBKIT_WEB_NAVIGATION_REASON_RELOAD:
8970bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            typeDescription = g_strdup("reload");
8980bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            break;
8990bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        case WEBKIT_WEB_NAVIGATION_REASON_FORM_RESUBMITTED:
9000bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            typeDescription = g_strdup("form resubmitted");
9010bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            break;
9020bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        case WEBKIT_WEB_NAVIGATION_REASON_OTHER:
9030bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            typeDescription = g_strdup("other");
9040bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            break;
9050bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        default:
9060bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            typeDescription = g_strdup("illegal value");
9070bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    }
9080bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
9090bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    printf("Policy delegate: attempt to load %s with navigation type '%s'\n", webkit_network_request_get_uri(request), typeDescription);
9100bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    g_free(typeDescription);
9110bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
9120bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    webkit_web_policy_decision_ignore(policyDecision);
9130bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    gLayoutTestController->notifyDone();
9140bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
9150bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    return TRUE;
9160bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
9170bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
9180bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochstatic void webViewStatusBarTextChanged(WebKitWebView* view, const gchar* message, gpointer data)
9190bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
9200bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    // Are we doing anything wrong? One test that does not call
9210bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    // dumpStatusCallbacks gets true here
9220bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (gLayoutTestController->dumpStatusCallbacks()) {
9230bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        if (message && strcmp(message, ""))
9240bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            printf("UI DELEGATE STATUS CALLBACK: setStatusText:%s\n", message);
9250bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    }
9260bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
9270bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
9280bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochstatic gboolean webViewClose(WebKitWebView* view)
9290bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
9300bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    ASSERT(view);
9310bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
9320bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    webViewList = g_slist_remove(webViewList, view);
9330bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    g_object_unref(view);
9340bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
9350bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    return TRUE;
9360bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
9370bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
938231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blockstatic void databaseQuotaExceeded(WebKitWebView* view, WebKitWebFrame* frame, WebKitWebDatabase *database)
939231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block{
940231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    ASSERT(view);
941231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    ASSERT(frame);
942231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    ASSERT(database);
943231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
944231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    WebKitSecurityOrigin* origin = webkit_web_database_get_security_origin(database);
945231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    if (gLayoutTestController->dumpDatabaseCallbacks()) {
946231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        printf("UI DELEGATE DATABASE CALLBACK: exceededDatabaseQuotaForSecurityOrigin:{%s, %s, %i} database:%s\n",
947231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            webkit_security_origin_get_protocol(origin),
948231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            webkit_security_origin_get_host(origin),
949231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            webkit_security_origin_get_port(origin),
950231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            webkit_web_database_get_name(database));
951231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    }
952231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    webkit_security_origin_set_web_database_quota(origin, 5 * 1024 * 1024);
953231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block}
954231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
955dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockstatic bool
956dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve BlockgeolocationPolicyDecisionRequested(WebKitWebView*, WebKitWebFrame*, WebKitGeolocationPolicyDecision* decision)
957dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
958dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (!gLayoutTestController->isGeolocationPermissionSet())
959dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return FALSE;
960dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (gLayoutTestController->geolocationPermission())
961dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        webkit_geolocation_policy_allow(decision);
962dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    else
963dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        webkit_geolocation_policy_deny(decision);
964dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
965dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return TRUE;
966dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
967dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
9680bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
9690bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochstatic WebKitWebView* webViewCreate(WebKitWebView*, WebKitWebFrame*);
9700bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
971643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockstatic gboolean webInspectorShowWindow(WebKitWebInspector*, gpointer data)
972643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
973643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    gtk_window_set_default_size(GTK_WINDOW(webInspectorWindow), 800, 600);
974643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    gtk_widget_show_all(webInspectorWindow);
975643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    return TRUE;
976643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
977643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
978643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockstatic gboolean webInspectorCloseWindow(WebKitWebInspector*, gpointer data)
979643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
980643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    gtk_widget_destroy(webInspectorWindow);
981643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    webInspectorWindow = 0;
982643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    return TRUE;
983643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
984643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
985cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Blockstatic WebKitWebView* webInspectorInspectWebView(WebKitWebInspector*, gpointer data)
986cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block{
987643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    webInspectorWindow = gtk_window_new(GTK_WINDOW_TOPLEVEL);
988643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
989643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    GtkWidget* webView = webkit_web_view_new();
990643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    gtk_container_add(GTK_CONTAINER(webInspectorWindow),
991643ca7872b450ea4efacab6188849e5aac2ba161Steve Block                      webView);
992643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
993643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    return WEBKIT_WEB_VIEW(webView);
994cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block}
995cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
996e14391e94c850b8bd03680c23b38978db68687a8John Reckstatic void webFrameLoadStatusNotified(WebKitWebFrame* frame, gpointer user_data)
9976c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen{
998e14391e94c850b8bd03680c23b38978db68687a8John Reck    WebKitLoadStatus loadStatus = webkit_web_frame_get_load_status(frame);
9996c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen
10006c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    if (gLayoutTestController->dumpFrameLoadCallbacks()) {
1001e14391e94c850b8bd03680c23b38978db68687a8John Reck        GOwnPtr<char> frameName(getFrameNameSuitableForTestResult(webkit_web_frame_get_web_view(frame), frame));
1002e14391e94c850b8bd03680c23b38978db68687a8John Reck
1003e14391e94c850b8bd03680c23b38978db68687a8John Reck        switch (loadStatus) {
1004e14391e94c850b8bd03680c23b38978db68687a8John Reck        case WEBKIT_LOAD_PROVISIONAL:
1005e14391e94c850b8bd03680c23b38978db68687a8John Reck            if (!done)
1006e14391e94c850b8bd03680c23b38978db68687a8John Reck                printf("%s - didStartProvisionalLoadForFrame\n", frameName.get());
1007e14391e94c850b8bd03680c23b38978db68687a8John Reck            break;
1008e14391e94c850b8bd03680c23b38978db68687a8John Reck        case WEBKIT_LOAD_COMMITTED:
1009e14391e94c850b8bd03680c23b38978db68687a8John Reck            if (!done)
1010e14391e94c850b8bd03680c23b38978db68687a8John Reck                printf("%s - didCommitLoadForFrame\n", frameName.get());
1011e14391e94c850b8bd03680c23b38978db68687a8John Reck            break;
1012e14391e94c850b8bd03680c23b38978db68687a8John Reck        case WEBKIT_LOAD_FINISHED:
1013e14391e94c850b8bd03680c23b38978db68687a8John Reck            if (frame != topLoadingFrame || !done)
1014e14391e94c850b8bd03680c23b38978db68687a8John Reck                printf("%s - didFinishLoadForFrame\n", frameName.get());
1015e14391e94c850b8bd03680c23b38978db68687a8John Reck            break;
1016e14391e94c850b8bd03680c23b38978db68687a8John Reck        default:
1017e14391e94c850b8bd03680c23b38978db68687a8John Reck            break;
10186c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen        }
10196c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    }
10206c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen}
10216c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen
1022e14391e94c850b8bd03680c23b38978db68687a8John Reckstatic void frameCreatedCallback(WebKitWebView* webView, WebKitWebFrame* webFrame, gpointer user_data)
1023e14391e94c850b8bd03680c23b38978db68687a8John Reck{
1024e14391e94c850b8bd03680c23b38978db68687a8John Reck    g_signal_connect(webFrame, "notify::load-status", G_CALLBACK(webFrameLoadStatusNotified), NULL);
1025e14391e94c850b8bd03680c23b38978db68687a8John Reck}
1026e14391e94c850b8bd03680c23b38978db68687a8John Reck
102781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochstatic void willSendRequestCallback(WebKitWebView* webView, WebKitWebFrame*, WebKitWebResource*, WebKitNetworkRequest* request, WebKitNetworkResponse*)
102881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch{
102981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    SoupMessage* soupMessage = webkit_network_request_get_message(request);
103081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
103181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    if (soupMessage) {
103281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        const set<string>& clearHeaders = gLayoutTestController->willSendRequestClearHeaders();
103381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        for (set<string>::const_iterator header = clearHeaders.begin(); header != clearHeaders.end(); ++header)
103481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            soup_message_headers_remove(soupMessage->request_headers, header->c_str());
103581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    }
103681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch}
103781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
10380bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochstatic WebKitWebView* createWebView()
10390bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
10400bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    WebKitWebView* view = WEBKIT_WEB_VIEW(webkit_web_view_new());
10410bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
1042e14391e94c850b8bd03680c23b38978db68687a8John Reck    DumpRenderTreeSupportGtk::setDumpRenderTreeModeEnabled(true);
1043e14391e94c850b8bd03680c23b38978db68687a8John Reck
10440bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    g_object_connect(G_OBJECT(view),
10450bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                     "signal::load-started", webViewLoadStarted, 0,
10460bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                     "signal::load-finished", webViewLoadFinished, 0,
10472fc2651226baac27029e38c9d6ef883fa32084dbSteve Block                     "signal::load-error", webViewLoadError, 0,
10480bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                     "signal::window-object-cleared", webViewWindowObjectCleared, 0,
10490bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                     "signal::console-message", webViewConsoleMessage, 0,
10500bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                     "signal::script-alert", webViewScriptAlert, 0,
10510bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                     "signal::script-prompt", webViewScriptPrompt, 0,
10520bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                     "signal::script-confirm", webViewScriptConfirm, 0,
10530bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                     "signal::title-changed", webViewTitleChanged, 0,
10540bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                     "signal::navigation-policy-decision-requested", webViewNavigationPolicyDecisionRequested, 0,
10550bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                     "signal::status-bar-text-changed", webViewStatusBarTextChanged, 0,
10560bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                     "signal::create-web-view", webViewCreate, 0,
10570bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                     "signal::close-web-view", webViewClose, 0,
1058231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block                     "signal::database-quota-exceeded", databaseQuotaExceeded, 0,
1059dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                     "signal::document-load-finished", webViewDocumentLoadFinished, 0,
1060dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                     "signal::geolocation-policy-decision-requested", geolocationPolicyDecisionRequested, 0,
1061dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                     "signal::onload-event", webViewOnloadEvent, 0,
10620617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen                     "signal::drag-begin", dragBeginCallback, 0,
10630617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen                     "signal::drag-end", dragEndCallback, 0,
10640617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen                     "signal::drag-failed", dragFailedCallback, 0,
1065e14391e94c850b8bd03680c23b38978db68687a8John Reck                     "signal::frame-created", frameCreatedCallback, 0,
106681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                     "signal::resource-request-starting", willSendRequestCallback, 0,
10670617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen
10680bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                     NULL);
10694576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    connectEditingCallbacks(view);
10700bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
1071cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    WebKitWebInspector* inspector = webkit_web_view_get_inspector(view);
1072643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    g_object_connect(G_OBJECT(inspector),
1073643ca7872b450ea4efacab6188849e5aac2ba161Steve Block                     "signal::inspect-web-view", webInspectorInspectWebView, 0,
1074643ca7872b450ea4efacab6188849e5aac2ba161Steve Block                     "signal::show-window", webInspectorShowWindow, 0,
1075643ca7872b450ea4efacab6188849e5aac2ba161Steve Block                     "signal::close-window", webInspectorCloseWindow, 0,
1076643ca7872b450ea4efacab6188849e5aac2ba161Steve Block                     NULL);
1077cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
1078d0825bca7fe65beaee391d30da42e937db621564Steve Block    if (webView) {
1079d0825bca7fe65beaee391d30da42e937db621564Steve Block        WebKitWebSettings* settings = webkit_web_view_get_settings(webView);
1080d0825bca7fe65beaee391d30da42e937db621564Steve Block        webkit_web_view_set_settings(view, settings);
1081d0825bca7fe65beaee391d30da42e937db621564Steve Block    }
1082d0825bca7fe65beaee391d30da42e937db621564Steve Block
1083e14391e94c850b8bd03680c23b38978db68687a8John Reck    // frame-created is not issued for main frame. That's why we must do this here
1084e14391e94c850b8bd03680c23b38978db68687a8John Reck    WebKitWebFrame* frame = webkit_web_view_get_main_frame(view);
1085e14391e94c850b8bd03680c23b38978db68687a8John Reck    g_signal_connect(frame, "notify::load-status", G_CALLBACK(webFrameLoadStatusNotified), NULL);
1086e14391e94c850b8bd03680c23b38978db68687a8John Reck
10870bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    return view;
10880bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
10890bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
10900bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochstatic WebKitWebView* webViewCreate(WebKitWebView* view, WebKitWebFrame* frame)
10910bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
10920bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (!gLayoutTestController->canOpenWindows())
10930bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        return 0;
10940bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
10950bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    // Make sure that waitUntilDone has been called.
10960bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    ASSERT(gLayoutTestController->waitToDump());
10970bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
10980bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    WebKitWebView* newWebView = createWebView();
10990bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    g_object_ref_sink(G_OBJECT(newWebView));
11000bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    webViewList = g_slist_prepend(webViewList, newWebView);
11010bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    return newWebView;
11020bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
11030bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
1104dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockstatic void logHandler(const gchar* domain, GLogLevelFlags level, const gchar* message, gpointer data)
1105dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
1106dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (level < G_LOG_LEVEL_DEBUG)
1107dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        fprintf(stderr, "%s\n", message);
1108dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
1109dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1110563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkint main(int argc, char* argv[])
1111563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{
1112563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    g_thread_init(NULL);
1113563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    gtk_init(&argc, &argv);
1114563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
1115dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    // Some plugins might try to use the GLib logger for printing debug
1116dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    // messages. This will cause tests to fail because of unexpected output.
1117dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    // We squelch all debug messages sent to the logger.
1118dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    g_log_set_default_handler(logHandler, 0);
1119dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
11205abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    initializeGlobalsFromCommandLineOptions(argc, argv);
1121231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    initializeFonts();
1122563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
1123231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    window = gtk_window_new(GTK_WINDOW_POPUP);
11240bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    container = GTK_WIDGET(gtk_scrolled_window_new(NULL, NULL));
11250bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(container), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
11260bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    gtk_container_add(GTK_CONTAINER(window), container);
1127231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    gtk_widget_show_all(window);
1128563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
11290bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    webView = createWebView();
11300bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    gtk_container_add(GTK_CONTAINER(container), GTK_WIDGET(webView));
1131563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    gtk_widget_realize(GTK_WIDGET(webView));
11320bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    gtk_widget_show_all(container);
1133643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    gtk_widget_grab_focus(GTK_WIDGET(webView));
1134563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    mainFrame = webkit_web_view_get_main_frame(webView);
1135563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
1136563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    setDefaultsToConsistentStateValuesForTesting();
1137563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
11380bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    gcController = new GCController();
11390bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    axController = new AccessibilityController();
11400bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
11415abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    if (useLongRunningServerMode(argc, argv)) {
1142563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        printSeparators = true;
11435abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        runTestingServerLoop();
1144563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    } else {
1145563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        printSeparators = (optind < argc-1 || (dumpPixels && dumpTree));
1146563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        for (int i = optind; i != argc; ++i)
1147563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark            runTest(argv[i]);
1148563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    }
1149563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
11500bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    delete gcController;
11510bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    gcController = 0;
11520bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
11530bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    delete axController;
11540bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    axController = 0;
11550bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
1156231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    gtk_widget_destroy(window);
11570bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
1158563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    return 0;
1159563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark}
1160