DumpRenderTree.cpp revision f05b935882198ccf7d81675736e3aeb089c5113a
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"
42e14391e94c850b8bd03680c23b38978db68687a8John Reck#include "WebCoreSupport/DumpRenderTreeSupportGtk.h"
43563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark#include "WorkQueue.h"
44563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark#include "WorkQueueItem.h"
45e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke#include <JavaScriptCore/JavaScript.h>
46e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke#include <cassert>
47e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke#include <cstdlib>
48e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke#include <cstring>
49e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke#include <getopt.h>
50563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark#include <gtk/gtk.h>
51563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark#include <webkit/webkit.h>
52563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark#include <wtf/Assertions.h>
53563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
54231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#if PLATFORM(X11)
55231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#include <fontconfig/fontconfig.h>
56231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#endif
57231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
58563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
59563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkusing namespace std;
60563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
61563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkextern "C" {
62563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark// This API is not yet public.
63563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkextern G_CONST_RETURN gchar* webkit_web_history_item_get_target(WebKitWebHistoryItem*);
64563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkextern gboolean webkit_web_history_item_is_target_item(WebKitWebHistoryItem*);
65563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkextern GList* webkit_web_history_item_get_children(WebKitWebHistoryItem*);
66563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkextern void webkit_web_settings_add_extra_plugin_directory(WebKitWebView* view, const gchar* directory);
67563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkextern gchar* webkit_web_frame_get_response_mime_type(WebKitWebFrame* frame);
68563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark}
69563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
70563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkvolatile bool done;
71563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkstatic bool printSeparators;
72563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkstatic int dumpPixels;
73563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkstatic int dumpTree = 1;
74563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
750bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben MurdochAccessibilityController* axController = 0;
7606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian MonsenRefPtr<LayoutTestController> gLayoutTestController;
770bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochstatic GCController* gcController = 0;
78563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkstatic WebKitWebView* webView;
79231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blockstatic GtkWidget* window;
800bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochstatic GtkWidget* container;
81643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockstatic GtkWidget* webInspectorWindow;
82563af33bc48281d19dce701398dbb88cb54fd7ecCary ClarkWebKitWebFrame* mainFrame = 0;
83563af33bc48281d19dce701398dbb88cb54fd7ecCary ClarkWebKitWebFrame* topLoadingFrame = 0;
84563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkguint waitToDumpWatchdog = 0;
850bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochbool waitForPolicy = false;
860bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
870bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch// This is a list of opened webviews
880bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben MurdochGSList* webViewList = 0;
89563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
90563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark// current b/f item at the end of the previous test
91563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkstatic WebKitWebHistoryItem* prevTestBFItem = NULL;
92563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
93563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkconst unsigned historyItemIndent = 8;
94563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
955abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrickstatic void runTest(const string& testPathOrURL);
965abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
9706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsenstatic bool shouldLogFrameLoadDelegates(const string& pathOrURL)
98563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{
9906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    return pathOrURL.find("loading/") != string::npos;
100563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark}
101563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
10206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsenstatic bool shouldOpenWebInspector(const string& pathOrURL)
103643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
10406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    return pathOrURL.find("inspector/") != string::npos;
105643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
106643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
10706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsenstatic bool shouldEnableDeveloperExtras(const string& pathOrURL)
108dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
1094576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    return true;
110dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
111dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
112563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkvoid dumpFrameScrollPosition(WebKitWebFrame* frame)
113563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{
114563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
115563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark}
116563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
117563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkvoid displayWebView()
118563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{
119643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    gtk_widget_queue_draw(GTK_WIDGET(webView));
120563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark}
121563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
122563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkstatic void appendString(gchar*& target, gchar* string)
123563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{
124563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    gchar* oldString = target;
125563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    target = g_strconcat(target, string, NULL);
126563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    g_free(oldString);
127563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark}
128563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
129a94275402997c11dd2e778633dacf4b7e630a35dBen Murdochstatic void initializeGtkFontSettings(const char* testURL)
130a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch{
131a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    GtkSettings* settings = gtk_settings_get_default();
132a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    if (!settings)
133a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        return;
13428040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    g_object_set(settings, "gtk-xft-antialias", 1,
13528040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu                 "gtk-xft-hinting", 0,
13628040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu                 "gtk-font-name", "Liberation Sans 16", NULL);
137a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
138a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    // One test needs subpixel anti-aliasing turned on, but generally we
139a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    // want all text in other tests to use to grayscale anti-aliasing.
140a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    if (testURL && strstr(testURL, "xsettings_antialias_settings.html"))
141a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        g_object_set(settings, "gtk-xft-rgba", "rgb", NULL);
142a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    else
143a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        g_object_set(settings, "gtk-xft-rgba", "none", NULL);
144a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch}
145a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
146a94275402997c11dd2e778633dacf4b7e630a35dBen Murdochstatic void initializeFonts(const char* testURL = 0)
147231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block{
1485abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick#if PLATFORM(X11)
149a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    initializeGtkFontSettings(testURL);
150a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
1515abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    FcInit();
1525abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
153bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    // If a test resulted a font being added or removed via the @font-face rule, then
154bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    // we want to reset the FontConfig configuration to prevent it from affecting other tests.
155bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    static int numFonts = 0;
156231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    FcFontSet* appFontSet = FcConfigGetFonts(0, FcSetApplication);
157bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    if (appFontSet && numFonts && appFontSet->nfont == numFonts)
158231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        return;
159231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
160bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    // Load our configuration file, which sets up proper aliases for family
161bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    // names like sans, serif and monospace.
162bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    FcConfig* config = FcConfigCreate();
163bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    GOwnPtr<gchar> fontConfigFilename(g_build_filename(FONTS_CONF_DIR, "fonts.conf", NULL));
164bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    if (!FcConfigParseAndLoad(config, reinterpret_cast<FcChar8*>(fontConfigFilename.get()), true))
165bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        g_error("Couldn't load font configuration file from: %s", fontConfigFilename.get());
166bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
167bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    static const char *const fontPaths[][2] = {
168bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        { "/usr/share/fonts/truetype/ttf-liberation/LiberationMono-BoldItalic.ttf",
169bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen          "/usr/share/fonts/liberation/LiberationMono-BoldItalic.ttf", },
170bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        { "/usr/share/fonts/truetype/ttf-liberation/LiberationMono-Bold.ttf",
171bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen          "/usr/share/fonts/liberation/LiberationMono-Bold.ttf", },
172bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        { "/usr/share/fonts/truetype/ttf-liberation/LiberationMono-Italic.ttf",
173bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen          "/usr/share/fonts/liberation/LiberationMono-Italic.ttf", },
174bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        { "/usr/share/fonts/truetype/ttf-liberation/LiberationMono-Regular.ttf",
175bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen          "/usr/share/fonts/liberation/LiberationMono-Regular.ttf", },
176bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        { "/usr/share/fonts/truetype/ttf-liberation/LiberationSans-BoldItalic.ttf",
177bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen          "/usr/share/fonts/liberation/LiberationSans-BoldItalic.ttf", },
178bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        { "/usr/share/fonts/truetype/ttf-liberation/LiberationSans-Bold.ttf",
179bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen          "/usr/share/fonts/liberation/LiberationSans-Bold.ttf", },
180bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        { "/usr/share/fonts/truetype/ttf-liberation/LiberationSans-Italic.ttf",
181bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen          "/usr/share/fonts/liberation/LiberationSans-Italic.ttf", },
182bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        { "/usr/share/fonts/truetype/ttf-liberation/LiberationSans-Regular.ttf",
183bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen          "/usr/share/fonts/liberation/LiberationSans-Regular.ttf", },
184bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        { "/usr/share/fonts/truetype/ttf-liberation/LiberationSerif-BoldItalic.ttf",
185bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen          "/usr/share/fonts/liberation/LiberationSerif-BoldItalic.ttf", },
186bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        { "/usr/share/fonts/truetype/ttf-liberation/LiberationSerif-Bold.ttf",
187bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen          "/usr/share/fonts/liberation/LiberationSerif-Bold.ttf", },
188bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        { "/usr/share/fonts/truetype/ttf-liberation/LiberationSerif-Italic.ttf",
189bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen          "/usr/share/fonts/liberation/LiberationSerif-Italic.ttf", },
190bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        { "/usr/share/fonts/truetype/ttf-liberation/LiberationSerif-Regular.ttf",
191bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen          "/usr/share/fonts/liberation/LiberationSerif-Regular.ttf", },
192bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        { "/usr/share/fonts/truetype/ttf-dejavu/DejaVuSans.ttf",
193bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen          "/usr/share/fonts/dejavu/DejaVuSans.ttf", },
194a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        { "/usr/share/fonts/truetype/ttf-dejavu/DejaVuSerif.ttf",
195a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch          "/usr/share/fonts/dejavu/DejaVuSerif.ttf", },
196e14391e94c850b8bd03680c23b38978db68687a8John Reck
197e14391e94c850b8bd03680c23b38978db68687a8John Reck        // MathML tests require the STIX fonts.
198e14391e94c850b8bd03680c23b38978db68687a8John Reck        { "/usr/share/fonts/opentype/stix/STIXGeneral.otf",
199e14391e94c850b8bd03680c23b38978db68687a8John Reck          "/usr/share/fonts/stix/STIXGeneral.otf" },
200e14391e94c850b8bd03680c23b38978db68687a8John Reck        { "/usr/share/fonts/opentype/stix/STIXGeneralBolIta.otf",
201e14391e94c850b8bd03680c23b38978db68687a8John Reck          "/usr/share/fonts/stix/STIXGeneralBolIta.otf" },
202e14391e94c850b8bd03680c23b38978db68687a8John Reck        { "/usr/share/fonts/opentype/stix/STIXGeneralBol.otf",
203e14391e94c850b8bd03680c23b38978db68687a8John Reck          "/usr/share/fonts/stix/STIXGeneralBol.otf" },
204e14391e94c850b8bd03680c23b38978db68687a8John Reck        { "/usr/share/fonts/opentype/stix/STIXGeneralItalic.otf",
205e14391e94c850b8bd03680c23b38978db68687a8John Reck          "/usr/share/fonts/stix/STIXGeneralItalic.otf" }
206bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    };
207bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
208bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    // TODO: Some tests use Lucida. We should load these as well, once it becomes
209bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    // clear how to install these fonts easily on Fedora.
210bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    for (size_t font = 0; font < G_N_ELEMENTS(fontPaths); font++) {
211bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        bool found = false;
212bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        for (size_t path = 0; path < 2; path++) {
213bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
214bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            if (g_file_test(fontPaths[font][path], G_FILE_TEST_EXISTS)) {
215bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen                found = true;
216bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen                if (!FcConfigAppFontAddFile(config, reinterpret_cast<const FcChar8*>(fontPaths[font][path])))
217bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen                    g_error("Could not load font at %s!", fontPaths[font][path]);
218bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen                else
219bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen                    break;
220bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            }
221bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        }
222bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
223bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        if (!found)
224bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            g_error("Could not find font at %s. Either install this font or file a bug "
225bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen                    "at http://bugs.webkit.org if it is installed in another location.",
226bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen                    fontPaths[font][0]);
227bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    }
228231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
229bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    // Ahem is used by many layout tests.
230bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    GOwnPtr<gchar> ahemFontFilename(g_build_filename(FONTS_CONF_DIR, "AHEM____.TTF", NULL));
231bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    if (!FcConfigAppFontAddFile(config, reinterpret_cast<FcChar8*>(ahemFontFilename.get())))
232bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        g_error("Could not load font at %s!", ahemFontFilename.get());
233231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
234f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    // A font with no valid Fontconfig encoding to test https://bugs.webkit.org/show_bug.cgi?id=47452
235f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    GOwnPtr<gchar> fontWithNoValidEncodingFilename(g_build_filename(FONTS_CONF_DIR, "FontWithNoValidEncoding.fon", NULL));
236f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    if (!FcConfigAppFontAddFile(config, reinterpret_cast<FcChar8*>(fontWithNoValidEncodingFilename.get())))
237f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        g_error("Could not load font at %s!", fontWithNoValidEncodingFilename.get());
238f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
239bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    if (!FcConfigSetCurrent(config))
240bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        g_error("Could not set the current font configuration!");
241231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
242bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    numFonts = FcConfigGetFonts(config, FcSetApplication)->nfont;
243231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#endif
2445abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick}
245231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
246563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkstatic gchar* dumpFramesAsText(WebKitWebFrame* frame)
247563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{
248563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    gchar* result = 0;
249563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
250563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    // Add header for all but the main frame.
251563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    bool isMainFrame = (webkit_web_view_get_main_frame(webView) == frame);
252563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
253f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    CString innerText = DumpRenderTreeSupportGtk::getInnerText(frame);
254563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    if (isMainFrame)
255f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        result = g_strdup_printf("%s\n", innerText.data());
256563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    else {
257563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        const gchar* frameName = webkit_web_frame_get_name(frame);
258f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        result = g_strdup_printf("\n--------\nFrame: '%s'\n--------\n%s\n", frameName, innerText.data());
259563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    }
260563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
261563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    if (gLayoutTestController->dumpChildFramesAsText()) {
262f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        GSList* children = DumpRenderTreeSupportGtk::getFrameChildren(frame);
263563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        for (GSList* child = children; child; child = g_slist_next(child))
2640bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            appendString(result, dumpFramesAsText(static_cast<WebKitWebFrame* >(child->data)));
265563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        g_slist_free(children);
266563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    }
267563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
268563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    return result;
269563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark}
270563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
271563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkstatic gint compareHistoryItems(gpointer* item1, gpointer* item2)
272563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{
273563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    return g_ascii_strcasecmp(webkit_web_history_item_get_target(WEBKIT_WEB_HISTORY_ITEM(item1)),
274563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark                              webkit_web_history_item_get_target(WEBKIT_WEB_HISTORY_ITEM(item2)));
275563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark}
276563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
277563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkstatic void dumpHistoryItem(WebKitWebHistoryItem* item, int indent, bool current)
278563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{
279563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    ASSERT(item != NULL);
280563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    int start = 0;
281563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    g_object_ref(item);
282563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    if (current) {
283563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        printf("curr->");
284563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        start = 6;
285563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    }
286563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    for (int i = start; i < indent; i++)
287563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        putchar(' ');
2880bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
2890bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    // normalize file URLs.
2900bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    const gchar* uri = webkit_web_history_item_get_uri(item);
2910bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    gchar* uriScheme = g_uri_parse_scheme(uri);
2920bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (g_strcmp0(uriScheme, "file") == 0) {
2930bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        gchar* pos = g_strstr_len(uri, -1, "/LayoutTests/");
2940bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        if (!pos)
2950bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            return;
2960bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
2970bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        GString* result = g_string_sized_new(strlen(uri));
2980bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        result = g_string_append(result, "(file test):");
2990bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        result = g_string_append(result, pos + strlen("/LayoutTests/"));
3000bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        printf("%s", result->str);
3010bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        g_string_free(result, TRUE);
3020bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    } else
3030bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        printf("%s", uri);
3040bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
3050bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    g_free(uriScheme);
3060bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
307563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    const gchar* target = webkit_web_history_item_get_target(item);
3080bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (target && strlen(target) > 0)
309563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        printf(" (in frame \"%s\")", target);
310563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    if (webkit_web_history_item_is_target_item(item))
311563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        printf("  **nav target**");
312563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    putchar('\n');
313563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    GList* kids = webkit_web_history_item_get_children(item);
314563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    if (kids) {
315563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        // must sort to eliminate arbitrary result ordering which defeats reproducible testing
316563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        kids = g_list_sort(kids, (GCompareFunc) compareHistoryItems);
317563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        for (unsigned i = 0; i < g_list_length(kids); i++)
318563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark            dumpHistoryItem(WEBKIT_WEB_HISTORY_ITEM(g_list_nth_data(kids, i)), indent+4, FALSE);
319563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    }
320563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    g_object_unref(item);
321563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark}
322563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
323563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkstatic void dumpBackForwardListForWebView(WebKitWebView* view)
324563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{
325563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    printf("\n============== Back Forward List ==============\n");
326563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    WebKitWebBackForwardList* bfList = webkit_web_view_get_back_forward_list(view);
327563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
328563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    // Print out all items in the list after prevTestBFItem, which was from the previous test
329563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    // Gather items from the end of the list, the print them out from oldest to newest
330563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    GList* itemsToPrint = NULL;
331563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    gint forwardListCount = webkit_web_back_forward_list_get_forward_length(bfList);
332563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    for (int i = forwardListCount; i > 0; i--) {
333563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        WebKitWebHistoryItem* item = webkit_web_back_forward_list_get_nth_item(bfList, i);
334563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        // something is wrong if the item from the last test is in the forward part of the b/f list
335563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        ASSERT(item != prevTestBFItem);
336563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        g_object_ref(item);
337563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        itemsToPrint = g_list_append(itemsToPrint, item);
338563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    }
339563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
340563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    WebKitWebHistoryItem* currentItem = webkit_web_back_forward_list_get_current_item(bfList);
341563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
342563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    g_object_ref(currentItem);
343563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    itemsToPrint = g_list_append(itemsToPrint, currentItem);
344563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
345563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    gint currentItemIndex = g_list_length(itemsToPrint) - 1;
346563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    gint backListCount = webkit_web_back_forward_list_get_back_length(bfList);
347563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    for (int i = -1; i >= -(backListCount); i--) {
348563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        WebKitWebHistoryItem* item = webkit_web_back_forward_list_get_nth_item(bfList, i);
349563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        if (item == prevTestBFItem)
350563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark            break;
351563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        g_object_ref(item);
352563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        itemsToPrint = g_list_append(itemsToPrint, item);
353563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    }
354563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
355563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    for (int i = g_list_length(itemsToPrint) - 1; i >= 0; i--) {
356563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        WebKitWebHistoryItem* item = WEBKIT_WEB_HISTORY_ITEM(g_list_nth_data(itemsToPrint, i));
357563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        dumpHistoryItem(item, historyItemIndent, i == currentItemIndex);
358563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        g_object_unref(item);
359563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    }
360563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    g_list_free(itemsToPrint);
361563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    printf("===============================================\n");
362563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark}
363563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
3640bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochstatic void dumpBackForwardListForAllWebViews()
3650bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
3660bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    // Dump the back forward list of the main WebView first
3670bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    dumpBackForwardListForWebView(webView);
3680bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
3690bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    // The view list is prepended. Reverse the list so we get the order right.
3700bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    GSList* viewList = g_slist_reverse(webViewList);
3710bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    for (unsigned i = 0; i < g_slist_length(viewList); ++i)
3720bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        dumpBackForwardListForWebView(WEBKIT_WEB_VIEW(g_slist_nth_data(viewList, i)));
3730bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
3740bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
375563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkstatic void invalidateAnyPreviousWaitToDumpWatchdog()
376563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{
377563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    if (waitToDumpWatchdog) {
378563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        g_source_remove(waitToDumpWatchdog);
379563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        waitToDumpWatchdog = 0;
380563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    }
3810bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
3820bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    waitForPolicy = false;
383563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark}
384563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
385231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blockstatic void resetDefaultsToConsistentValues()
386563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{
387563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    WebKitWebSettings* settings = webkit_web_view_get_settings(webView);
388563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    g_object_set(G_OBJECT(settings),
389563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark                 "enable-private-browsing", FALSE,
390563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark                 "enable-developer-extras", FALSE,
3910bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                 "enable-spell-checking", TRUE,
3920bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                 "enable-html5-database", TRUE,
3930bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                 "enable-html5-local-storage", TRUE,
3940bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                 "enable-xss-auditor", FALSE,
395dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                 "enable-spatial-navigation", FALSE,
396a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch                 "enable-frame-flattening", FALSE,
39721939df44de1705786c545cd1bf519d47250322dBen Murdoch                 "javascript-can-access-clipboard", TRUE,
3980bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                 "javascript-can-open-windows-automatically", TRUE,
3990bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                 "enable-offline-web-application-cache", TRUE,
400231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block                 "enable-universal-access-from-file-uris", TRUE,
401231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block                 "enable-scripts", TRUE,
402cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block                 "enable-dom-paste", TRUE,
403231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block                 "default-font-family", "Times",
404231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block                 "monospace-font-family", "Courier",
405231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block                 "serif-font-family", "Times",
406231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block                 "sans-serif-font-family", "Helvetica",
407a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch                 "cursive-font-family", "cursive",
408a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch                 "fantasy-font-family", "fantasy",
409231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block                 "default-font-size", 16,
410231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block                 "default-monospace-font-size", 13,
411231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block                 "minimum-font-size", 1,
412d0825bca7fe65beaee391d30da42e937db621564Steve Block                 "enable-caret-browsing", FALSE,
413d0825bca7fe65beaee391d30da42e937db621564Steve Block                 "enable-page-cache", FALSE,
414692e5dbf12901edacf14812a6fae25462920af42Steve Block                 "auto-resize-window", TRUE,
415692e5dbf12901edacf14812a6fae25462920af42Steve Block                 "enable-java-applet", FALSE,
416dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                 "enable-plugins", TRUE,
417bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen                 "enable-hyperlink-auditing", FALSE,
418f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch                 "editing-behavior", WEBKIT_EDITING_BEHAVIOR_UNIX,
419f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch                 "enable-fullscreen", TRUE,
420563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark                 NULL);
421f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    webkit_web_view_set_settings(webView, settings);
422563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
423f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    DumpRenderTreeSupportGtk::clearMainFrameName(mainFrame);
4240bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
425563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    WebKitWebInspector* inspector = webkit_web_view_get_inspector(webView);
426563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    g_object_set(G_OBJECT(inspector), "javascript-profiling-enabled", FALSE, NULL);
427231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
428d0825bca7fe65beaee391d30da42e937db621564Steve Block    webkit_web_view_set_zoom_level(webView, 1.0);
429d0825bca7fe65beaee391d30da42e937db621564Steve Block
430f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    DumpRenderTreeSupportGtk::resetOriginAccessWhiteLists();
431231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
432a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    WebKitWebBackForwardList* list = webkit_web_view_get_back_forward_list(webView);
433a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    webkit_web_back_forward_list_clear(list);
434a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
435dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#ifdef HAVE_LIBSOUP_2_29_90
436dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    SoupSession* session = webkit_get_default_session();
437dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    SoupCookieJar* jar = reinterpret_cast<SoupCookieJar*>(soup_session_get_feature(session, SOUP_TYPE_COOKIE_JAR));
438dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
439dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    // We only create the jar when the soup backend needs to do
440dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    // HTTP. Should we initialize it earlier, perhaps?
441dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (jar)
442dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        g_object_set(G_OBJECT(jar), SOUP_COOKIE_JAR_ACCEPT_POLICY, SOUP_COOKIE_JAR_ACCEPT_NO_THIRD_PARTY, NULL);
443dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#endif
444dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
445231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    setlocale(LC_ALL, "");
446e14391e94c850b8bd03680c23b38978db68687a8John Reck
447e14391e94c850b8bd03680c23b38978db68687a8John Reck    DumpRenderTreeSupportGtk::setLinksIncludedInFocusChain(true);
448563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark}
449563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
4505abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrickstatic bool useLongRunningServerMode(int argc, char *argv[])
4515abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick{
4525abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    // This assumes you've already called getopt_long
4535abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    return (argc == optind+1 && !strcmp(argv[optind], "-"));
4545abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick}
4555abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
4565abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrickstatic void runTestingServerLoop()
4575abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick{
4585abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    // When DumpRenderTree runs in server mode, we just wait around for file names
4595abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    // to be passed to us and read each in turn, passing the results back to the client
4605abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    char filenameBuffer[2048];
4615abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    while (fgets(filenameBuffer, sizeof(filenameBuffer), stdin)) {
4625abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        char* newLineCharacter = strchr(filenameBuffer, '\n');
4635abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        if (newLineCharacter)
4645abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick            *newLineCharacter = '\0';
4655abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
4665abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        if (!strlen(filenameBuffer))
4675abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick            continue;
4685abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
4695abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        runTest(filenameBuffer);
4705abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    }
4715abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick}
4725abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
4735abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrickstatic void initializeGlobalsFromCommandLineOptions(int argc, char *argv[])
4745abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick{
4755abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    struct option options[] = {
4765abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        {"notree", no_argument, &dumpTree, false},
4775abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        {"pixel-tests", no_argument, &dumpPixels, true},
4785abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        {"tree", no_argument, &dumpTree, true},
4795abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        {NULL, 0, NULL, 0}
4805abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    };
4815abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
4825abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    int option;
4835abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    while ((option = getopt_long(argc, (char * const *)argv, "", options, NULL)) != -1) {
4845abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        switch (option) {
4855abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        case '?': // unknown or ambiguous option
4865abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        case ':': // missing argument
4875abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick            exit(1);
4885abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick            break;
4895abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        }
4905abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    }
4915abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick}
4925abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
4935abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
494563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkvoid dump()
495563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{
496563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    invalidateAnyPreviousWaitToDumpWatchdog();
497563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
498563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    if (dumpTree) {
499563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        char* result = 0;
500563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        gchar* responseMimeType = webkit_web_frame_get_response_mime_type(mainFrame);
501563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
5024576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        if (g_str_equal(responseMimeType, "text/plain")) {
5034576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang            gLayoutTestController->setDumpAsText(true);
5044576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang            gLayoutTestController->setGeneratePixelResults(false);
5054576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        }
506563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        g_free(responseMimeType);
507563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
508563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        if (gLayoutTestController->dumpAsText())
509563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark            result = dumpFramesAsText(mainFrame);
510545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        else {
511545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            // Widget resizing is done asynchronously in GTK+. We pump the main
512545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            // loop here, to flush any pending resize requests. This prevents
513545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            // timing issues which affect the size of elements in the output.
514545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            // We only enable this workaround for tests that print the render tree
515545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            // because this seems to break some dumpAsText tests: see bug 39988
516545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            // After fixing that test, we should apply this approach to all dumps.
517545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            while (gtk_events_pending())
518545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch                gtk_main_iteration();
519545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch
520f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch            result = g_strdup(DumpRenderTreeSupportGtk::dumpRenderTree(mainFrame).data());
521545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        }
522563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
523563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        if (!result) {
524563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark            const char* errorMessage;
525563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark            if (gLayoutTestController->dumpAsText())
526563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark                errorMessage = "[documentElement innerText]";
527563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark            else if (gLayoutTestController->dumpDOMAsWebArchive())
528563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark                errorMessage = "[[mainFrame DOMDocument] webArchive]";
529563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark            else if (gLayoutTestController->dumpSourceAsWebArchive())
530563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark                errorMessage = "[[mainFrame dataSource] webArchive]";
531563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark            else
532563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark                errorMessage = "[mainFrame renderTreeAsExternalRepresentation]";
533563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark            printf("ERROR: nil result from %s", errorMessage);
534563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        } else {
535563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark            printf("%s", result);
536563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark            g_free(result);
537563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark            if (!gLayoutTestController->dumpAsText() && !gLayoutTestController->dumpDOMAsWebArchive() && !gLayoutTestController->dumpSourceAsWebArchive())
538563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark                dumpFrameScrollPosition(mainFrame);
539563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
5400bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            if (gLayoutTestController->dumpBackForwardList())
5410bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                dumpBackForwardListForAllWebViews();
542563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        }
543563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
544563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        if (printSeparators) {
545563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark            puts("#EOF"); // terminate the content block
546563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark            fputs("#EOF\n", stderr);
547563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark            fflush(stdout);
548563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark            fflush(stderr);
549563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        }
550563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    }
551563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
552967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    if (dumpPixels
553967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch     && gLayoutTestController->generatePixelResults()
554967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch     && !gLayoutTestController->dumpDOMAsWebArchive()
555967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch     && !gLayoutTestController->dumpSourceAsWebArchive())
556967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch        dumpWebViewAsPixelsAndCompareWithExpected(gLayoutTestController->expectedPixelHash());
557563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
558563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    // FIXME: call displayWebView here when we support --paint
559563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
560563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    done = true;
561643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    gtk_main_quit();
562563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark}
563563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
564563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkstatic void setDefaultsToConsistentStateValuesForTesting()
565563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{
566563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    gdk_screen_set_resolution(gdk_screen_get_default(), 72.0);
567563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
568231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    resetDefaultsToConsistentValues();
5690bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
5700bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    /* Disable the default auth dialog for testing */
5710bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    SoupSession* session = webkit_get_default_session();
5720bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    soup_session_remove_feature_by_type(session, WEBKIT_TYPE_SOUP_AUTH_DIALOG);
5730bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
574563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark#if PLATFORM(X11)
575563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    webkit_web_settings_add_extra_plugin_directory(webView, TEST_PLUGIN_DIR);
576563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark#endif
577231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
578231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    gchar* databaseDirectory = g_build_filename(g_get_user_data_dir(), "gtkwebkitdrt", "databases", NULL);
579231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    webkit_set_web_database_directory_path(databaseDirectory);
580231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    g_free(databaseDirectory);
581563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark}
582563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
583643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockstatic void sendPixelResultsEOF()
584643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
585643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    puts("#EOF");
586643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
587643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    fflush(stdout);
588643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    fflush(stderr);
589643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
590643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
591563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkstatic void runTest(const string& testPathOrURL)
592563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{
593563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    ASSERT(!testPathOrURL.empty());
594563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
595563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    // Look for "'" as a separator between the path or URL, and the pixel dump hash that follows.
59606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    string testURL(testPathOrURL);
597563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    string expectedPixelHash;
59806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    size_t separatorPos = testURL.find("'");
599563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    if (separatorPos != string::npos) {
60006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        testURL = string(testPathOrURL, 0, separatorPos);
601563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        expectedPixelHash = string(testPathOrURL, separatorPos + 1);
602563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    }
603563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
60406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    // Convert the path into a full file URL if it does not look
60506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    // like an HTTP/S URL (doesn't start with http:// or https://).
60606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    if (testURL.find("http://") && testURL.find("https://")) {
60706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        GFile* testFile = g_file_new_for_path(testURL.c_str());
60806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        gchar* testURLCString = g_file_get_uri(testFile);
60906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        testURL = testURLCString;
61006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        g_free(testURLCString);
61106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        g_object_unref(testFile);
61206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    }
613563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
614231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    resetDefaultsToConsistentValues();
615563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
61606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    gLayoutTestController = LayoutTestController::create(testURL, expectedPixelHash);
617563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    topLoadingFrame = 0;
618563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    done = false;
619563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
620563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    gLayoutTestController->setIconDatabaseEnabled(false);
621563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
62206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    if (shouldLogFrameLoadDelegates(testURL))
623563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        gLayoutTestController->setDumpFrameLoadCallbacks(true);
624563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
62506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    if (shouldEnableDeveloperExtras(testURL)) {
626dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        gLayoutTestController->setDeveloperExtrasEnabled(true);
62706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        if (shouldOpenWebInspector(testURL))
628dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            gLayoutTestController->showWebInspector();
629dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    }
630643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
631563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    WorkQueue::shared()->clear();
632563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    WorkQueue::shared()->setFrozen(false);
633563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
63406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    bool isSVGW3CTest = (testURL.find("svg/W3C-SVG-1.1") != string::npos);
635563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    GtkAllocation size;
636231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    size.x = size.y = 0;
637692e5dbf12901edacf14812a6fae25462920af42Steve Block    size.width = isSVGW3CTest ? 480 : LayoutTestController::maxViewWidth;
638692e5dbf12901edacf14812a6fae25462920af42Steve Block    size.height = isSVGW3CTest ? 360 : LayoutTestController::maxViewHeight;
639231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    gtk_window_resize(GTK_WINDOW(window), size.width, size.height);
6400bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    gtk_widget_size_allocate(container, &size);
641563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
642563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    if (prevTestBFItem)
643563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        g_object_unref(prevTestBFItem);
644563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    WebKitWebBackForwardList* bfList = webkit_web_view_get_back_forward_list(webView);
645563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    prevTestBFItem = webkit_web_back_forward_list_get_current_item(bfList);
646563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    if (prevTestBFItem)
647563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        g_object_ref(prevTestBFItem);
648563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
649a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    initializeFonts(testURL.c_str());
650563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
651231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    // Focus the web view before loading the test to avoid focusing problems
652231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    gtk_widget_grab_focus(GTK_WIDGET(webView));
65306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    webkit_web_view_open(webView, testURL.c_str());
654563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
655643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    gtk_main();
656563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
657dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    // If developer extras enabled Web Inspector may have been open by the test.
65806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    if (shouldEnableDeveloperExtras(testURL)) {
659643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        gLayoutTestController->closeWebInspector();
660545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        gLayoutTestController->setDeveloperExtrasEnabled(false);
661545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    }
6620bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
6630bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    // Also check if we still have opened webViews and free them.
6640bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (gLayoutTestController->closeRemainingWindowsWhenComplete() || webViewList) {
6650bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        while (webViewList) {
6660bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            g_object_unref(WEBKIT_WEB_VIEW(webViewList->data));
6670bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            webViewList = g_slist_next(webViewList);
6680bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        }
6690bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        g_slist_free(webViewList);
6700bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        webViewList = 0;
6710bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    }
6720bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
673563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    // A blank load seems to be necessary to reset state after certain tests.
674563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    webkit_web_view_open(webView, "about:blank");
675563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
67606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    gLayoutTestController.clear();
677643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
678643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    // terminate the (possibly empty) pixels block after all the state reset
679643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    sendPixelResultsEOF();
680563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark}
681563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
682563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkvoid webViewLoadStarted(WebKitWebView* view, WebKitWebFrame* frame, void*)
683563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{
684563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    // Make sure we only set this once per test.  If it gets cleared, and then set again, we might
685563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    // end up doing two dumps for one test.
686563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    if (!topLoadingFrame && !done)
687563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        topLoadingFrame = frame;
688563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark}
689563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
690563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkstatic gboolean processWork(void* data)
691563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{
6920bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    // if we finish all the commands, we're ready to dump state
6930bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (WorkQueue::shared()->processWork() && !gLayoutTestController->waitToDump())
694563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        dump();
695563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
696563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    return FALSE;
697563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark}
698563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
699231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blockstatic char* getFrameNameSuitableForTestResult(WebKitWebView* view, WebKitWebFrame* frame)
700231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block{
701231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    char* frameName = g_strdup(webkit_web_frame_get_name(frame));
702231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
703231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    if (frame == webkit_web_view_get_main_frame(view)) {
704231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        // This is a bit strange. Shouldn't web_frame_get_name return NULL?
705231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        if (frameName && (frameName[0] != '\0')) {
706231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            char* tmp = g_strdup_printf("main frame \"%s\"", frameName);
707dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            g_free(frameName);
708231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            frameName = tmp;
709231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        } else {
710231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            g_free(frameName);
711231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            frameName = g_strdup("main frame");
712231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        }
713231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    } else if (!frameName || (frameName[0] == '\0')) {
714231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        g_free(frameName);
715231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        frameName = g_strdup("frame (anonymous)");
716dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    } else {
717dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        char* tmp = g_strdup_printf("frame \"%s\"", frameName);
718dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        g_free(frameName);
719dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        frameName = tmp;
720231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    }
721231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
722231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    return frameName;
723231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block}
724231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
725563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkstatic void webViewLoadFinished(WebKitWebView* view, WebKitWebFrame* frame, void*)
726563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{
727563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    if (frame != topLoadingFrame)
728563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        return;
729563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
730563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    topLoadingFrame = 0;
731563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    WorkQueue::shared()->setFrozen(true); // first complete load freezes the queue for the rest of this test
732563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    if (gLayoutTestController->waitToDump())
733563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        return;
734563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
735563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    if (WorkQueue::shared()->count())
736563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        g_timeout_add(0, processWork, 0);
737643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    else
738563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        dump();
739563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark}
740563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
741dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockstatic void webViewDocumentLoadFinished(WebKitWebView* view, WebKitWebFrame* frame, void*)
742dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
743dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (!done && gLayoutTestController->dumpFrameLoadCallbacks()) {
744dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        char* frameName = getFrameNameSuitableForTestResult(view, frame);
745dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        printf("%s - didFinishDocumentLoadForFrame\n", frameName);
746dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        g_free(frameName);
747dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    } else if (!done) {
748f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        guint pendingFrameUnloadEvents = DumpRenderTreeSupportGtk::getPendingUnloadEventCount(frame);
749dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        if (pendingFrameUnloadEvents) {
750dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            char* frameName = getFrameNameSuitableForTestResult(view, frame);
751dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            printf("%s - has %u onunload handler(s)\n", frameName, pendingFrameUnloadEvents);
752dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            g_free(frameName);
753dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        }
754dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    }
755dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
756dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
757dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockstatic void webViewOnloadEvent(WebKitWebView* view, WebKitWebFrame* frame, void*)
758dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
759dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (!done && gLayoutTestController->dumpFrameLoadCallbacks()) {
760dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        char* frameName = getFrameNameSuitableForTestResult(view, frame);
761dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        printf("%s - didHandleOnloadEventsForFrame\n", frameName);
762dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        g_free(frameName);
763dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    }
764dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
765dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
766563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkstatic void webViewWindowObjectCleared(WebKitWebView* view, WebKitWebFrame* frame, JSGlobalContextRef context, JSObjectRef windowObject, gpointer data)
767563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{
768563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    JSValueRef exception = 0;
7690bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    ASSERT(gLayoutTestController);
770563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
771563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    gLayoutTestController->makeWindowObject(context, windowObject, &exception);
7720bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    ASSERT(!exception);
7730bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
7740bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    gcController->makeWindowObject(context, windowObject, &exception);
7750bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    ASSERT(!exception);
7760bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
7770bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    axController->makeWindowObject(context, windowObject, &exception);
7780bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    ASSERT(!exception);
7790bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
780231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    JSStringRef eventSenderStr = JSStringCreateWithUTF8CString("eventSender");
781545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    JSValueRef eventSender = makeEventSender(context, !webkit_web_frame_get_parent(frame));
782231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    JSObjectSetProperty(context, windowObject, eventSenderStr, eventSender, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete, 0);
783231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    JSStringRelease(eventSenderStr);
784563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark}
785563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
786563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkstatic gboolean webViewConsoleMessage(WebKitWebView* view, const gchar* message, unsigned int line, const gchar* sourceId, gpointer data)
787563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{
788dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    gchar* testMessage = 0;
789dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    const gchar* uriScheme;
790dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
791dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    // Tests expect only the filename part of local URIs
792dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    uriScheme = g_strstr_len(message, -1, "file://");
793dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (uriScheme) {
794dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        GString* tempString = g_string_sized_new(strlen(message));
795dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        gchar* filename = g_strrstr(uriScheme, G_DIR_SEPARATOR_S);
796dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
797dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        if (filename) {
798dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            filename += strlen(G_DIR_SEPARATOR_S);
799dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            tempString = g_string_append_len(tempString, message, (uriScheme - message));
800dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            tempString = g_string_append_len(tempString, filename, strlen(filename));
801dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            testMessage = g_string_free(tempString, FALSE);
802dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        }
803dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    }
804dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
805dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    fprintf(stdout, "CONSOLE MESSAGE: line %d: %s\n", line, testMessage ? testMessage : message);
806dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    g_free(testMessage);
807dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
808563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    return TRUE;
809563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark}
810563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
811563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
812563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkstatic gboolean webViewScriptAlert(WebKitWebView* view, WebKitWebFrame* frame, const gchar* message, gpointer data)
813563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{
814563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    fprintf(stdout, "ALERT: %s\n", message);
815563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    return TRUE;
816563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark}
817563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
818563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkstatic gboolean webViewScriptPrompt(WebKitWebView* webView, WebKitWebFrame* frame, const gchar* message, const gchar* defaultValue, gchar** value, gpointer data)
819563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{
820563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    fprintf(stdout, "PROMPT: %s, default text: %s\n", message, defaultValue);
821563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    *value = g_strdup(defaultValue);
822563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    return TRUE;
823563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark}
824563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
825563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkstatic gboolean webViewScriptConfirm(WebKitWebView* view, WebKitWebFrame* frame, const gchar* message, gboolean* didConfirm, gpointer data)
826563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{
827563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    fprintf(stdout, "CONFIRM: %s\n", message);
828563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    *didConfirm = TRUE;
829563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    return TRUE;
830563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark}
831563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
832563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkstatic void webViewTitleChanged(WebKitWebView* view, WebKitWebFrame* frame, const gchar* title, gpointer data)
833563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{
834563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    if (gLayoutTestController->dumpTitleChanges() && !done)
835563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        printf("TITLE CHANGED: %s\n", title ? title : "");
836563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark}
837563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
8380bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochstatic bool webViewNavigationPolicyDecisionRequested(WebKitWebView* view, WebKitWebFrame* frame,
8390bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                                                     WebKitNetworkRequest* request,
8400bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                                                     WebKitWebNavigationAction* navAction,
8410bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                                                     WebKitWebPolicyDecision* policyDecision)
8420bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
8430bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    // Use the default handler if we're not waiting for policy,
8440bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    // i.e., LayoutTestController::waitForPolicyDelegate
8450bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (!waitForPolicy)
8460bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        return FALSE;
8470bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
8480bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    gchar* typeDescription;
8490bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    WebKitWebNavigationReason reason;
8500bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    g_object_get(G_OBJECT(navAction), "reason", &reason, NULL);
8510bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
8520bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    switch(reason) {
8530bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        case WEBKIT_WEB_NAVIGATION_REASON_LINK_CLICKED:
8540bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            typeDescription = g_strdup("link clicked");
8550bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            break;
8560bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        case WEBKIT_WEB_NAVIGATION_REASON_FORM_SUBMITTED:
8570bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            typeDescription = g_strdup("form submitted");
8580bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            break;
8590bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        case WEBKIT_WEB_NAVIGATION_REASON_BACK_FORWARD:
8600bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            typeDescription = g_strdup("back/forward");
8610bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            break;
8620bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        case WEBKIT_WEB_NAVIGATION_REASON_RELOAD:
8630bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            typeDescription = g_strdup("reload");
8640bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            break;
8650bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        case WEBKIT_WEB_NAVIGATION_REASON_FORM_RESUBMITTED:
8660bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            typeDescription = g_strdup("form resubmitted");
8670bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            break;
8680bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        case WEBKIT_WEB_NAVIGATION_REASON_OTHER:
8690bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            typeDescription = g_strdup("other");
8700bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            break;
8710bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        default:
8720bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            typeDescription = g_strdup("illegal value");
8730bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    }
8740bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
8750bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    printf("Policy delegate: attempt to load %s with navigation type '%s'\n", webkit_network_request_get_uri(request), typeDescription);
8760bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    g_free(typeDescription);
8770bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
8780bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    webkit_web_policy_decision_ignore(policyDecision);
8790bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    gLayoutTestController->notifyDone();
8800bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
8810bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    return TRUE;
8820bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
8830bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
8840bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochstatic void webViewStatusBarTextChanged(WebKitWebView* view, const gchar* message, gpointer data)
8850bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
8860bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    // Are we doing anything wrong? One test that does not call
8870bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    // dumpStatusCallbacks gets true here
8880bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (gLayoutTestController->dumpStatusCallbacks()) {
8890bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        if (message && strcmp(message, ""))
8900bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            printf("UI DELEGATE STATUS CALLBACK: setStatusText:%s\n", message);
8910bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    }
8920bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
8930bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
8940bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochstatic gboolean webViewClose(WebKitWebView* view)
8950bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
8960bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    ASSERT(view);
8970bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
8980bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    webViewList = g_slist_remove(webViewList, view);
8990bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    g_object_unref(view);
9000bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
9010bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    return TRUE;
9020bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
9030bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
904231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blockstatic void databaseQuotaExceeded(WebKitWebView* view, WebKitWebFrame* frame, WebKitWebDatabase *database)
905231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block{
906231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    ASSERT(view);
907231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    ASSERT(frame);
908231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    ASSERT(database);
909231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
910231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    WebKitSecurityOrigin* origin = webkit_web_database_get_security_origin(database);
911231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    if (gLayoutTestController->dumpDatabaseCallbacks()) {
912231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        printf("UI DELEGATE DATABASE CALLBACK: exceededDatabaseQuotaForSecurityOrigin:{%s, %s, %i} database:%s\n",
913231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            webkit_security_origin_get_protocol(origin),
914231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            webkit_security_origin_get_host(origin),
915231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            webkit_security_origin_get_port(origin),
916231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            webkit_web_database_get_name(database));
917231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    }
918231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    webkit_security_origin_set_web_database_quota(origin, 5 * 1024 * 1024);
919231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block}
920231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
921dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockstatic bool
922dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve BlockgeolocationPolicyDecisionRequested(WebKitWebView*, WebKitWebFrame*, WebKitGeolocationPolicyDecision* decision)
923dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
924dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (!gLayoutTestController->isGeolocationPermissionSet())
925dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return FALSE;
926dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (gLayoutTestController->geolocationPermission())
927dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        webkit_geolocation_policy_allow(decision);
928dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    else
929dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        webkit_geolocation_policy_deny(decision);
930dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
931dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return TRUE;
932dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
933dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
9340bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
9350bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochstatic WebKitWebView* webViewCreate(WebKitWebView*, WebKitWebFrame*);
9360bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
937643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockstatic gboolean webInspectorShowWindow(WebKitWebInspector*, gpointer data)
938643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
939643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    gtk_window_set_default_size(GTK_WINDOW(webInspectorWindow), 800, 600);
940643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    gtk_widget_show_all(webInspectorWindow);
941643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    return TRUE;
942643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
943643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
944643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockstatic gboolean webInspectorCloseWindow(WebKitWebInspector*, gpointer data)
945643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
946643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    gtk_widget_destroy(webInspectorWindow);
947643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    webInspectorWindow = 0;
948643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    return TRUE;
949643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
950643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
951cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Blockstatic WebKitWebView* webInspectorInspectWebView(WebKitWebInspector*, gpointer data)
952cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block{
953643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    webInspectorWindow = gtk_window_new(GTK_WINDOW_TOPLEVEL);
954643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
955643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    GtkWidget* webView = webkit_web_view_new();
956643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    gtk_container_add(GTK_CONTAINER(webInspectorWindow),
957643ca7872b450ea4efacab6188849e5aac2ba161Steve Block                      webView);
958643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
959643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    return WEBKIT_WEB_VIEW(webView);
960cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block}
961cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
962e14391e94c850b8bd03680c23b38978db68687a8John Reckstatic void webFrameLoadStatusNotified(WebKitWebFrame* frame, gpointer user_data)
9636c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen{
964e14391e94c850b8bd03680c23b38978db68687a8John Reck    WebKitLoadStatus loadStatus = webkit_web_frame_get_load_status(frame);
9656c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen
9666c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    if (gLayoutTestController->dumpFrameLoadCallbacks()) {
967e14391e94c850b8bd03680c23b38978db68687a8John Reck        GOwnPtr<char> frameName(getFrameNameSuitableForTestResult(webkit_web_frame_get_web_view(frame), frame));
968e14391e94c850b8bd03680c23b38978db68687a8John Reck
969e14391e94c850b8bd03680c23b38978db68687a8John Reck        switch (loadStatus) {
970e14391e94c850b8bd03680c23b38978db68687a8John Reck        case WEBKIT_LOAD_PROVISIONAL:
971e14391e94c850b8bd03680c23b38978db68687a8John Reck            if (!done)
972e14391e94c850b8bd03680c23b38978db68687a8John Reck                printf("%s - didStartProvisionalLoadForFrame\n", frameName.get());
973e14391e94c850b8bd03680c23b38978db68687a8John Reck            break;
974e14391e94c850b8bd03680c23b38978db68687a8John Reck        case WEBKIT_LOAD_COMMITTED:
975e14391e94c850b8bd03680c23b38978db68687a8John Reck            if (!done)
976e14391e94c850b8bd03680c23b38978db68687a8John Reck                printf("%s - didCommitLoadForFrame\n", frameName.get());
977e14391e94c850b8bd03680c23b38978db68687a8John Reck            break;
978e14391e94c850b8bd03680c23b38978db68687a8John Reck        case WEBKIT_LOAD_FINISHED:
979e14391e94c850b8bd03680c23b38978db68687a8John Reck            if (frame != topLoadingFrame || !done)
980e14391e94c850b8bd03680c23b38978db68687a8John Reck                printf("%s - didFinishLoadForFrame\n", frameName.get());
981e14391e94c850b8bd03680c23b38978db68687a8John Reck            break;
982e14391e94c850b8bd03680c23b38978db68687a8John Reck        default:
983e14391e94c850b8bd03680c23b38978db68687a8John Reck            break;
9846c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen        }
9856c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    }
9866c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen}
9876c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen
988e14391e94c850b8bd03680c23b38978db68687a8John Reckstatic void frameCreatedCallback(WebKitWebView* webView, WebKitWebFrame* webFrame, gpointer user_data)
989e14391e94c850b8bd03680c23b38978db68687a8John Reck{
990e14391e94c850b8bd03680c23b38978db68687a8John Reck    g_signal_connect(webFrame, "notify::load-status", G_CALLBACK(webFrameLoadStatusNotified), NULL);
991e14391e94c850b8bd03680c23b38978db68687a8John Reck}
992e14391e94c850b8bd03680c23b38978db68687a8John Reck
9930bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochstatic WebKitWebView* createWebView()
9940bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
9950bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    WebKitWebView* view = WEBKIT_WEB_VIEW(webkit_web_view_new());
9960bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
997e14391e94c850b8bd03680c23b38978db68687a8John Reck    DumpRenderTreeSupportGtk::setDumpRenderTreeModeEnabled(true);
998e14391e94c850b8bd03680c23b38978db68687a8John Reck
9990bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    g_object_connect(G_OBJECT(view),
10000bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                     "signal::load-started", webViewLoadStarted, 0,
10010bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                     "signal::load-finished", webViewLoadFinished, 0,
10020bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                     "signal::window-object-cleared", webViewWindowObjectCleared, 0,
10030bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                     "signal::console-message", webViewConsoleMessage, 0,
10040bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                     "signal::script-alert", webViewScriptAlert, 0,
10050bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                     "signal::script-prompt", webViewScriptPrompt, 0,
10060bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                     "signal::script-confirm", webViewScriptConfirm, 0,
10070bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                     "signal::title-changed", webViewTitleChanged, 0,
10080bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                     "signal::navigation-policy-decision-requested", webViewNavigationPolicyDecisionRequested, 0,
10090bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                     "signal::status-bar-text-changed", webViewStatusBarTextChanged, 0,
10100bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                     "signal::create-web-view", webViewCreate, 0,
10110bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                     "signal::close-web-view", webViewClose, 0,
1012231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block                     "signal::database-quota-exceeded", databaseQuotaExceeded, 0,
1013dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                     "signal::document-load-finished", webViewDocumentLoadFinished, 0,
1014dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                     "signal::geolocation-policy-decision-requested", geolocationPolicyDecisionRequested, 0,
1015dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                     "signal::onload-event", webViewOnloadEvent, 0,
10160617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen                     "signal::drag-begin", dragBeginCallback, 0,
10170617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen                     "signal::drag-end", dragEndCallback, 0,
10180617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen                     "signal::drag-failed", dragFailedCallback, 0,
1019e14391e94c850b8bd03680c23b38978db68687a8John Reck                     "signal::frame-created", frameCreatedCallback, 0,
10200617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen
10210bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                     NULL);
10224576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    connectEditingCallbacks(view);
10230bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
1024cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    WebKitWebInspector* inspector = webkit_web_view_get_inspector(view);
1025643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    g_object_connect(G_OBJECT(inspector),
1026643ca7872b450ea4efacab6188849e5aac2ba161Steve Block                     "signal::inspect-web-view", webInspectorInspectWebView, 0,
1027643ca7872b450ea4efacab6188849e5aac2ba161Steve Block                     "signal::show-window", webInspectorShowWindow, 0,
1028643ca7872b450ea4efacab6188849e5aac2ba161Steve Block                     "signal::close-window", webInspectorCloseWindow, 0,
1029643ca7872b450ea4efacab6188849e5aac2ba161Steve Block                     NULL);
1030cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
1031d0825bca7fe65beaee391d30da42e937db621564Steve Block    if (webView) {
1032d0825bca7fe65beaee391d30da42e937db621564Steve Block        WebKitWebSettings* settings = webkit_web_view_get_settings(webView);
1033d0825bca7fe65beaee391d30da42e937db621564Steve Block        webkit_web_view_set_settings(view, settings);
1034d0825bca7fe65beaee391d30da42e937db621564Steve Block    }
1035d0825bca7fe65beaee391d30da42e937db621564Steve Block
1036e14391e94c850b8bd03680c23b38978db68687a8John Reck    // frame-created is not issued for main frame. That's why we must do this here
1037e14391e94c850b8bd03680c23b38978db68687a8John Reck    WebKitWebFrame* frame = webkit_web_view_get_main_frame(view);
1038e14391e94c850b8bd03680c23b38978db68687a8John Reck    g_signal_connect(frame, "notify::load-status", G_CALLBACK(webFrameLoadStatusNotified), NULL);
1039e14391e94c850b8bd03680c23b38978db68687a8John Reck
10400bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    return view;
10410bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
10420bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
10430bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochstatic WebKitWebView* webViewCreate(WebKitWebView* view, WebKitWebFrame* frame)
10440bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
10450bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (!gLayoutTestController->canOpenWindows())
10460bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        return 0;
10470bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
10480bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    // Make sure that waitUntilDone has been called.
10490bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    ASSERT(gLayoutTestController->waitToDump());
10500bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
10510bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    WebKitWebView* newWebView = createWebView();
10520bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    g_object_ref_sink(G_OBJECT(newWebView));
10530bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    webViewList = g_slist_prepend(webViewList, newWebView);
10540bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    return newWebView;
10550bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
10560bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
1057dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockstatic void logHandler(const gchar* domain, GLogLevelFlags level, const gchar* message, gpointer data)
1058dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
1059dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (level < G_LOG_LEVEL_DEBUG)
1060dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        fprintf(stderr, "%s\n", message);
1061dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
1062dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1063563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkint main(int argc, char* argv[])
1064563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{
1065563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    g_thread_init(NULL);
1066563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    gtk_init(&argc, &argv);
1067563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
1068dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    // Some plugins might try to use the GLib logger for printing debug
1069dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    // messages. This will cause tests to fail because of unexpected output.
1070dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    // We squelch all debug messages sent to the logger.
1071dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    g_log_set_default_handler(logHandler, 0);
1072dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
10735abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    initializeGlobalsFromCommandLineOptions(argc, argv);
1074231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    initializeFonts();
1075563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
1076231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    window = gtk_window_new(GTK_WINDOW_POPUP);
10770bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    container = GTK_WIDGET(gtk_scrolled_window_new(NULL, NULL));
10780bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(container), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
10790bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    gtk_container_add(GTK_CONTAINER(window), container);
1080231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    gtk_widget_show_all(window);
1081563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
10820bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    webView = createWebView();
10830bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    gtk_container_add(GTK_CONTAINER(container), GTK_WIDGET(webView));
1084563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    gtk_widget_realize(GTK_WIDGET(webView));
10850bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    gtk_widget_show_all(container);
1086643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    gtk_widget_grab_focus(GTK_WIDGET(webView));
1087563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    mainFrame = webkit_web_view_get_main_frame(webView);
1088563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
1089563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    setDefaultsToConsistentStateValuesForTesting();
1090563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
10910bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    gcController = new GCController();
10920bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    axController = new AccessibilityController();
10930bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
10945abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    if (useLongRunningServerMode(argc, argv)) {
1095563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        printSeparators = true;
10965abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        runTestingServerLoop();
1097563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    } else {
1098563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        printSeparators = (optind < argc-1 || (dumpPixels && dumpTree));
1099563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        for (int i = optind; i != argc; ++i)
1100563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark            runTest(argv[i]);
1101563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    }
1102563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
11030bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    delete gcController;
11040bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    gcController = 0;
11050bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
11060bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    delete axController;
11070bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    axController = 0;
11080bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
1109231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    gtk_widget_destroy(window);
11100bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
1111563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    return 0;
1112563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark}
1113