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>
52bde8e466a4451c7319e3a072d118917957d6554Steve Block * Copyright (C) 2010, 2011 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"
422daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#include "PlainTextController.h"
432fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#include "TextInputController.h"
44e14391e94c850b8bd03680c23b38978db68687a8John Reck#include "WebCoreSupport/DumpRenderTreeSupportGtk.h"
45563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark#include "WorkQueue.h"
46563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark#include "WorkQueueItem.h"
47e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke#include <JavaScriptCore/JavaScript.h>
48e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke#include <cassert>
49e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke#include <cstdlib>
50e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke#include <cstring>
51e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke#include <getopt.h>
52563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark#include <gtk/gtk.h>
53563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark#include <webkit/webkit.h>
54563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark#include <wtf/Assertions.h>
55563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
56231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#if PLATFORM(X11)
57231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#include <fontconfig/fontconfig.h>
58231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#endif
59231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
60563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
61563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkusing namespace std;
62563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
63563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkextern "C" {
64563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark// This API is not yet public.
65563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkextern G_CONST_RETURN gchar* webkit_web_history_item_get_target(WebKitWebHistoryItem*);
66563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkextern gboolean webkit_web_history_item_is_target_item(WebKitWebHistoryItem*);
67563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkextern GList* webkit_web_history_item_get_children(WebKitWebHistoryItem*);
68563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkextern void webkit_web_settings_add_extra_plugin_directory(WebKitWebView* view, const gchar* directory);
69563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkextern gchar* webkit_web_frame_get_response_mime_type(WebKitWebFrame* frame);
70563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark}
71563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
72563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkvolatile bool done;
73563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkstatic bool printSeparators;
74563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkstatic int dumpPixels;
75563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkstatic int dumpTree = 1;
76563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
770bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben MurdochAccessibilityController* axController = 0;
7806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian MonsenRefPtr<LayoutTestController> gLayoutTestController;
790bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochstatic GCController* gcController = 0;
80563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkstatic WebKitWebView* webView;
81231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blockstatic GtkWidget* window;
820bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochstatic GtkWidget* container;
83643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockstatic GtkWidget* webInspectorWindow;
84563af33bc48281d19dce701398dbb88cb54fd7ecCary ClarkWebKitWebFrame* mainFrame = 0;
85563af33bc48281d19dce701398dbb88cb54fd7ecCary ClarkWebKitWebFrame* topLoadingFrame = 0;
86563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkguint waitToDumpWatchdog = 0;
870bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochbool waitForPolicy = false;
880bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
890bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch// This is a list of opened webviews
900bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben MurdochGSList* webViewList = 0;
91563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
92563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark// current b/f item at the end of the previous test
93563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkstatic WebKitWebHistoryItem* prevTestBFItem = NULL;
94563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
95563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkconst unsigned historyItemIndent = 8;
96563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
975abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrickstatic void runTest(const string& testPathOrURL);
985abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
9906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsenstatic bool shouldLogFrameLoadDelegates(const string& pathOrURL)
100563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{
10106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    return pathOrURL.find("loading/") != string::npos;
102563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark}
103563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
10406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsenstatic bool shouldOpenWebInspector(const string& pathOrURL)
105643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
10606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    return pathOrURL.find("inspector/") != string::npos;
107643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
108643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
10981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochstatic bool shouldDumpAsText(const string& pathOrURL)
11081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch{
11181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    return pathOrURL.find("dumpAsText/") != string::npos;
11281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch}
11381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
11406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsenstatic bool shouldEnableDeveloperExtras(const string& pathOrURL)
115dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
1164576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    return true;
117dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
118dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
119563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkvoid dumpFrameScrollPosition(WebKitWebFrame* frame)
120563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{
121563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
122563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark}
123563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
124563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkvoid displayWebView()
125563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{
126643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    gtk_widget_queue_draw(GTK_WIDGET(webView));
127563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark}
128563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
129563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkstatic void appendString(gchar*& target, gchar* string)
130563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{
131563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    gchar* oldString = target;
132563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    target = g_strconcat(target, string, NULL);
133563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    g_free(oldString);
134563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark}
135563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
136a94275402997c11dd2e778633dacf4b7e630a35dBen Murdochstatic void initializeGtkFontSettings(const char* testURL)
137a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch{
138a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    GtkSettings* settings = gtk_settings_get_default();
139a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    if (!settings)
140a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        return;
1412bde8e466a4451c7319e3a072d118917957d6554Steve Block    g_object_set(settings,
1422bde8e466a4451c7319e3a072d118917957d6554Steve Block                 "gtk-xft-dpi", 98304, // This is 96 * 1024 or 96 DPI according to the GTK+ docs.
1432bde8e466a4451c7319e3a072d118917957d6554Steve Block                 "gtk-xft-antialias", 1,
14428040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu                 "gtk-xft-hinting", 0,
1452bde8e466a4451c7319e3a072d118917957d6554Steve Block                 "gtk-font-name", "Liberation Sans 12",
1462bde8e466a4451c7319e3a072d118917957d6554Steve Block                 NULL);
1472bde8e466a4451c7319e3a072d118917957d6554Steve Block    gdk_screen_set_resolution(gdk_screen_get_default(), 96.0);
148a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
149a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    // One test needs subpixel anti-aliasing turned on, but generally we
150a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    // want all text in other tests to use to grayscale anti-aliasing.
151a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    if (testURL && strstr(testURL, "xsettings_antialias_settings.html"))
152a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        g_object_set(settings, "gtk-xft-rgba", "rgb", NULL);
153a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    else
154a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        g_object_set(settings, "gtk-xft-rgba", "none", NULL);
155a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch}
156a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
157a94275402997c11dd2e778633dacf4b7e630a35dBen Murdochstatic void initializeFonts(const char* testURL = 0)
158231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block{
1595abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick#if PLATFORM(X11)
160a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    initializeGtkFontSettings(testURL);
161a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
1625abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    FcInit();
1635abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
164bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    // If a test resulted a font being added or removed via the @font-face rule, then
165bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    // we want to reset the FontConfig configuration to prevent it from affecting other tests.
166bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    static int numFonts = 0;
167231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    FcFontSet* appFontSet = FcConfigGetFonts(0, FcSetApplication);
168bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    if (appFontSet && numFonts && appFontSet->nfont == numFonts)
169231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        return;
170231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
171bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    // Load our configuration file, which sets up proper aliases for family
172bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    // names like sans, serif and monospace.
173bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    FcConfig* config = FcConfigCreate();
174bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    GOwnPtr<gchar> fontConfigFilename(g_build_filename(FONTS_CONF_DIR, "fonts.conf", NULL));
175bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    if (!FcConfigParseAndLoad(config, reinterpret_cast<FcChar8*>(fontConfigFilename.get()), true))
176bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        g_error("Couldn't load font configuration file from: %s", fontConfigFilename.get());
177bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
178bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    static const char *const fontPaths[][2] = {
179bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        { "/usr/share/fonts/truetype/ttf-liberation/LiberationMono-BoldItalic.ttf",
180bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen          "/usr/share/fonts/liberation/LiberationMono-BoldItalic.ttf", },
181bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        { "/usr/share/fonts/truetype/ttf-liberation/LiberationMono-Bold.ttf",
182bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen          "/usr/share/fonts/liberation/LiberationMono-Bold.ttf", },
183bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        { "/usr/share/fonts/truetype/ttf-liberation/LiberationMono-Italic.ttf",
184bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen          "/usr/share/fonts/liberation/LiberationMono-Italic.ttf", },
185bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        { "/usr/share/fonts/truetype/ttf-liberation/LiberationMono-Regular.ttf",
186bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen          "/usr/share/fonts/liberation/LiberationMono-Regular.ttf", },
187bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        { "/usr/share/fonts/truetype/ttf-liberation/LiberationSans-BoldItalic.ttf",
188bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen          "/usr/share/fonts/liberation/LiberationSans-BoldItalic.ttf", },
189bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        { "/usr/share/fonts/truetype/ttf-liberation/LiberationSans-Bold.ttf",
190bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen          "/usr/share/fonts/liberation/LiberationSans-Bold.ttf", },
191bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        { "/usr/share/fonts/truetype/ttf-liberation/LiberationSans-Italic.ttf",
192bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen          "/usr/share/fonts/liberation/LiberationSans-Italic.ttf", },
193bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        { "/usr/share/fonts/truetype/ttf-liberation/LiberationSans-Regular.ttf",
194bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen          "/usr/share/fonts/liberation/LiberationSans-Regular.ttf", },
195bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        { "/usr/share/fonts/truetype/ttf-liberation/LiberationSerif-BoldItalic.ttf",
196bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen          "/usr/share/fonts/liberation/LiberationSerif-BoldItalic.ttf", },
197bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        { "/usr/share/fonts/truetype/ttf-liberation/LiberationSerif-Bold.ttf",
198bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen          "/usr/share/fonts/liberation/LiberationSerif-Bold.ttf", },
199bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        { "/usr/share/fonts/truetype/ttf-liberation/LiberationSerif-Italic.ttf",
200bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen          "/usr/share/fonts/liberation/LiberationSerif-Italic.ttf", },
201bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        { "/usr/share/fonts/truetype/ttf-liberation/LiberationSerif-Regular.ttf",
202bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen          "/usr/share/fonts/liberation/LiberationSerif-Regular.ttf", },
203bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        { "/usr/share/fonts/truetype/ttf-dejavu/DejaVuSans.ttf",
204bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen          "/usr/share/fonts/dejavu/DejaVuSans.ttf", },
205a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        { "/usr/share/fonts/truetype/ttf-dejavu/DejaVuSerif.ttf",
206a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch          "/usr/share/fonts/dejavu/DejaVuSerif.ttf", },
207e14391e94c850b8bd03680c23b38978db68687a8John Reck
208e14391e94c850b8bd03680c23b38978db68687a8John Reck        // MathML tests require the STIX fonts.
209e14391e94c850b8bd03680c23b38978db68687a8John Reck        { "/usr/share/fonts/opentype/stix/STIXGeneral.otf",
210e14391e94c850b8bd03680c23b38978db68687a8John Reck          "/usr/share/fonts/stix/STIXGeneral.otf" },
211e14391e94c850b8bd03680c23b38978db68687a8John Reck        { "/usr/share/fonts/opentype/stix/STIXGeneralBolIta.otf",
212e14391e94c850b8bd03680c23b38978db68687a8John Reck          "/usr/share/fonts/stix/STIXGeneralBolIta.otf" },
213e14391e94c850b8bd03680c23b38978db68687a8John Reck        { "/usr/share/fonts/opentype/stix/STIXGeneralBol.otf",
214e14391e94c850b8bd03680c23b38978db68687a8John Reck          "/usr/share/fonts/stix/STIXGeneralBol.otf" },
215e14391e94c850b8bd03680c23b38978db68687a8John Reck        { "/usr/share/fonts/opentype/stix/STIXGeneralItalic.otf",
216e14391e94c850b8bd03680c23b38978db68687a8John Reck          "/usr/share/fonts/stix/STIXGeneralItalic.otf" }
217bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    };
218bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
219bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    // TODO: Some tests use Lucida. We should load these as well, once it becomes
220bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    // clear how to install these fonts easily on Fedora.
221bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    for (size_t font = 0; font < G_N_ELEMENTS(fontPaths); font++) {
222bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        bool found = false;
223bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        for (size_t path = 0; path < 2; path++) {
224bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
225bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            if (g_file_test(fontPaths[font][path], G_FILE_TEST_EXISTS)) {
226bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen                found = true;
227bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen                if (!FcConfigAppFontAddFile(config, reinterpret_cast<const FcChar8*>(fontPaths[font][path])))
228bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen                    g_error("Could not load font at %s!", fontPaths[font][path]);
229bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen                else
230bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen                    break;
231bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            }
232bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        }
233bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
234bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        if (!found)
235bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            g_error("Could not find font at %s. Either install this font or file a bug "
236bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen                    "at http://bugs.webkit.org if it is installed in another location.",
237bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen                    fontPaths[font][0]);
238bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    }
239231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
240bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    // Ahem is used by many layout tests.
241bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    GOwnPtr<gchar> ahemFontFilename(g_build_filename(FONTS_CONF_DIR, "AHEM____.TTF", NULL));
242bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    if (!FcConfigAppFontAddFile(config, reinterpret_cast<FcChar8*>(ahemFontFilename.get())))
243bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        g_error("Could not load font at %s!", ahemFontFilename.get());
244231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
24581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    for (int i = 1; i <= 9; i++) {
24681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        GOwnPtr<gchar> fontFilename(g_strdup_printf("WebKitWeightWatcher%i00.ttf", i));
24781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        GOwnPtr<gchar> fontPath(g_build_filename(FONTS_CONF_DIR, "..", "..", "fonts", fontFilename.get(), NULL));
24881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        if (!FcConfigAppFontAddFile(config, reinterpret_cast<FcChar8*>(fontPath.get())))
24981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            g_error("Could not load font at %s!", fontPath.get());
25081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    }
25181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
252f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    // A font with no valid Fontconfig encoding to test https://bugs.webkit.org/show_bug.cgi?id=47452
253f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    GOwnPtr<gchar> fontWithNoValidEncodingFilename(g_build_filename(FONTS_CONF_DIR, "FontWithNoValidEncoding.fon", NULL));
254f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    if (!FcConfigAppFontAddFile(config, reinterpret_cast<FcChar8*>(fontWithNoValidEncodingFilename.get())))
255f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        g_error("Could not load font at %s!", fontWithNoValidEncodingFilename.get());
256f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
257bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    if (!FcConfigSetCurrent(config))
258bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        g_error("Could not set the current font configuration!");
259231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
260bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    numFonts = FcConfigGetFonts(config, FcSetApplication)->nfont;
261231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#endif
2625abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick}
263231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
264563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkstatic gchar* dumpFramesAsText(WebKitWebFrame* frame)
265563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{
266563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    gchar* result = 0;
267563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
268563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    // Add header for all but the main frame.
269563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    bool isMainFrame = (webkit_web_view_get_main_frame(webView) == frame);
270563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
271f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    CString innerText = DumpRenderTreeSupportGtk::getInnerText(frame);
272563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    if (isMainFrame)
273f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        result = g_strdup_printf("%s\n", innerText.data());
274563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    else {
275563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        const gchar* frameName = webkit_web_frame_get_name(frame);
276f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        result = g_strdup_printf("\n--------\nFrame: '%s'\n--------\n%s\n", frameName, innerText.data());
277563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    }
278563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
279563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    if (gLayoutTestController->dumpChildFramesAsText()) {
280f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        GSList* children = DumpRenderTreeSupportGtk::getFrameChildren(frame);
281563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        for (GSList* child = children; child; child = g_slist_next(child))
2820bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            appendString(result, dumpFramesAsText(static_cast<WebKitWebFrame* >(child->data)));
283563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        g_slist_free(children);
284563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    }
285563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
286563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    return result;
287563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark}
288563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
289563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkstatic gint compareHistoryItems(gpointer* item1, gpointer* item2)
290563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{
291563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    return g_ascii_strcasecmp(webkit_web_history_item_get_target(WEBKIT_WEB_HISTORY_ITEM(item1)),
292563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark                              webkit_web_history_item_get_target(WEBKIT_WEB_HISTORY_ITEM(item2)));
293563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark}
294563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
295563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkstatic void dumpHistoryItem(WebKitWebHistoryItem* item, int indent, bool current)
296563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{
297563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    ASSERT(item != NULL);
298563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    int start = 0;
299563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    g_object_ref(item);
300563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    if (current) {
301563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        printf("curr->");
302563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        start = 6;
303563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    }
304563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    for (int i = start; i < indent; i++)
305563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        putchar(' ');
3060bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
3070bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    // normalize file URLs.
3080bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    const gchar* uri = webkit_web_history_item_get_uri(item);
3090bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    gchar* uriScheme = g_uri_parse_scheme(uri);
3100bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (g_strcmp0(uriScheme, "file") == 0) {
3110bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        gchar* pos = g_strstr_len(uri, -1, "/LayoutTests/");
3120bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        if (!pos)
3130bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            return;
3140bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
3150bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        GString* result = g_string_sized_new(strlen(uri));
3160bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        result = g_string_append(result, "(file test):");
3170bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        result = g_string_append(result, pos + strlen("/LayoutTests/"));
3180bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        printf("%s", result->str);
3190bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        g_string_free(result, TRUE);
3200bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    } else
3210bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        printf("%s", uri);
3220bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
3230bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    g_free(uriScheme);
3240bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
325563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    const gchar* target = webkit_web_history_item_get_target(item);
3260bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (target && strlen(target) > 0)
327563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        printf(" (in frame \"%s\")", target);
328563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    if (webkit_web_history_item_is_target_item(item))
329563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        printf("  **nav target**");
330563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    putchar('\n');
331563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    GList* kids = webkit_web_history_item_get_children(item);
332563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    if (kids) {
333563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        // must sort to eliminate arbitrary result ordering which defeats reproducible testing
334563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        kids = g_list_sort(kids, (GCompareFunc) compareHistoryItems);
335563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        for (unsigned i = 0; i < g_list_length(kids); i++)
336563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark            dumpHistoryItem(WEBKIT_WEB_HISTORY_ITEM(g_list_nth_data(kids, i)), indent+4, FALSE);
337563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    }
338563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    g_object_unref(item);
339563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark}
340563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
341563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkstatic void dumpBackForwardListForWebView(WebKitWebView* view)
342563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{
343563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    printf("\n============== Back Forward List ==============\n");
344563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    WebKitWebBackForwardList* bfList = webkit_web_view_get_back_forward_list(view);
345563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
346563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    // Print out all items in the list after prevTestBFItem, which was from the previous test
347563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    // Gather items from the end of the list, the print them out from oldest to newest
348563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    GList* itemsToPrint = NULL;
349563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    gint forwardListCount = webkit_web_back_forward_list_get_forward_length(bfList);
350563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    for (int i = forwardListCount; i > 0; i--) {
351563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        WebKitWebHistoryItem* item = webkit_web_back_forward_list_get_nth_item(bfList, i);
352563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        // something is wrong if the item from the last test is in the forward part of the b/f list
353563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        ASSERT(item != prevTestBFItem);
354563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        g_object_ref(item);
355563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        itemsToPrint = g_list_append(itemsToPrint, item);
356563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    }
357563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
358563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    WebKitWebHistoryItem* currentItem = webkit_web_back_forward_list_get_current_item(bfList);
359563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
360563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    g_object_ref(currentItem);
361563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    itemsToPrint = g_list_append(itemsToPrint, currentItem);
362563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
363563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    gint currentItemIndex = g_list_length(itemsToPrint) - 1;
364563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    gint backListCount = webkit_web_back_forward_list_get_back_length(bfList);
365563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    for (int i = -1; i >= -(backListCount); i--) {
366563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        WebKitWebHistoryItem* item = webkit_web_back_forward_list_get_nth_item(bfList, i);
367563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        if (item == prevTestBFItem)
368563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark            break;
369563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        g_object_ref(item);
370563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        itemsToPrint = g_list_append(itemsToPrint, item);
371563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    }
372563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
373563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    for (int i = g_list_length(itemsToPrint) - 1; i >= 0; i--) {
374563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        WebKitWebHistoryItem* item = WEBKIT_WEB_HISTORY_ITEM(g_list_nth_data(itemsToPrint, i));
375563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        dumpHistoryItem(item, historyItemIndent, i == currentItemIndex);
376563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        g_object_unref(item);
377563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    }
378563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    g_list_free(itemsToPrint);
379563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    printf("===============================================\n");
380563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark}
381563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
3820bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochstatic void dumpBackForwardListForAllWebViews()
3830bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
3840bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    // Dump the back forward list of the main WebView first
3850bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    dumpBackForwardListForWebView(webView);
3860bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
3870bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    // The view list is prepended. Reverse the list so we get the order right.
3880bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    GSList* viewList = g_slist_reverse(webViewList);
3890bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    for (unsigned i = 0; i < g_slist_length(viewList); ++i)
3900bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        dumpBackForwardListForWebView(WEBKIT_WEB_VIEW(g_slist_nth_data(viewList, i)));
3910bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
3920bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
393563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkstatic void invalidateAnyPreviousWaitToDumpWatchdog()
394563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{
395563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    if (waitToDumpWatchdog) {
396563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        g_source_remove(waitToDumpWatchdog);
397563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        waitToDumpWatchdog = 0;
398563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    }
3990bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
4000bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    waitForPolicy = false;
401563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark}
402563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
403231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blockstatic void resetDefaultsToConsistentValues()
404563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{
405563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    WebKitWebSettings* settings = webkit_web_view_get_settings(webView);
406563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    g_object_set(G_OBJECT(settings),
407563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark                 "enable-private-browsing", FALSE,
408563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark                 "enable-developer-extras", FALSE,
4090bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                 "enable-spell-checking", TRUE,
4100bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                 "enable-html5-database", TRUE,
4110bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                 "enable-html5-local-storage", TRUE,
4120bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                 "enable-xss-auditor", FALSE,
413dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                 "enable-spatial-navigation", FALSE,
414a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch                 "enable-frame-flattening", FALSE,
41521939df44de1705786c545cd1bf519d47250322dBen Murdoch                 "javascript-can-access-clipboard", TRUE,
4160bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                 "javascript-can-open-windows-automatically", TRUE,
4170bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                 "enable-offline-web-application-cache", TRUE,
418231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block                 "enable-universal-access-from-file-uris", TRUE,
419231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block                 "enable-scripts", TRUE,
420cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block                 "enable-dom-paste", TRUE,
421231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block                 "default-font-family", "Times",
422231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block                 "monospace-font-family", "Courier",
423231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block                 "serif-font-family", "Times",
424231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block                 "sans-serif-font-family", "Helvetica",
425a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch                 "cursive-font-family", "cursive",
426a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch                 "fantasy-font-family", "fantasy",
4272bde8e466a4451c7319e3a072d118917957d6554Steve Block                 "default-font-size", 12,
4282bde8e466a4451c7319e3a072d118917957d6554Steve Block                 "default-monospace-font-size", 10,
42965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch                 "minimum-font-size", 0,
430d0825bca7fe65beaee391d30da42e937db621564Steve Block                 "enable-caret-browsing", FALSE,
431d0825bca7fe65beaee391d30da42e937db621564Steve Block                 "enable-page-cache", FALSE,
432692e5dbf12901edacf14812a6fae25462920af42Steve Block                 "auto-resize-window", TRUE,
433692e5dbf12901edacf14812a6fae25462920af42Steve Block                 "enable-java-applet", FALSE,
434dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                 "enable-plugins", TRUE,
435bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen                 "enable-hyperlink-auditing", FALSE,
436f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch                 "editing-behavior", WEBKIT_EDITING_BEHAVIOR_UNIX,
437f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch                 "enable-fullscreen", TRUE,
438563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark                 NULL);
439f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    webkit_web_view_set_settings(webView, settings);
4402fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    webkit_set_cache_model(WEBKIT_CACHE_MODEL_DOCUMENT_BROWSER);
441563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
442f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    DumpRenderTreeSupportGtk::clearMainFrameName(mainFrame);
4430bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
444563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    WebKitWebInspector* inspector = webkit_web_view_get_inspector(webView);
445563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    g_object_set(G_OBJECT(inspector), "javascript-profiling-enabled", FALSE, NULL);
446231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
447d0825bca7fe65beaee391d30da42e937db621564Steve Block    webkit_web_view_set_zoom_level(webView, 1.0);
44881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    DumpRenderTreeSupportGtk::setMinimumTimerInterval(webView, DumpRenderTreeSupportGtk::defaultMinimumTimerInterval());
449d0825bca7fe65beaee391d30da42e937db621564Steve Block
450f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    DumpRenderTreeSupportGtk::resetOriginAccessWhiteLists();
451231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
452a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    WebKitWebBackForwardList* list = webkit_web_view_get_back_forward_list(webView);
453a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    webkit_web_back_forward_list_clear(list);
454a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
455dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    SoupSession* session = webkit_get_default_session();
456dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    SoupCookieJar* jar = reinterpret_cast<SoupCookieJar*>(soup_session_get_feature(session, SOUP_TYPE_COOKIE_JAR));
457dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
458dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    // We only create the jar when the soup backend needs to do
459dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    // HTTP. Should we initialize it earlier, perhaps?
460dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (jar)
461dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        g_object_set(G_OBJECT(jar), SOUP_COOKIE_JAR_ACCEPT_POLICY, SOUP_COOKIE_JAR_ACCEPT_NO_THIRD_PARTY, NULL);
462dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
463231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    setlocale(LC_ALL, "");
464e14391e94c850b8bd03680c23b38978db68687a8John Reck
465e14391e94c850b8bd03680c23b38978db68687a8John Reck    DumpRenderTreeSupportGtk::setLinksIncludedInFocusChain(true);
4662bde8e466a4451c7319e3a072d118917957d6554Steve Block    webkit_icon_database_set_path(webkit_get_icon_database(), 0);
46781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    DumpRenderTreeSupportGtk::setSelectTrailingWhitespaceEnabled(false);
4682fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
4692fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (axController)
4702fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        axController->resetToConsistentState();
47181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
47281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    DumpRenderTreeSupportGtk::clearOpener(mainFrame);
473563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark}
474563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
4755abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrickstatic bool useLongRunningServerMode(int argc, char *argv[])
4765abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick{
4775abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    // This assumes you've already called getopt_long
4785abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    return (argc == optind+1 && !strcmp(argv[optind], "-"));
4795abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick}
4805abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
4815abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrickstatic void runTestingServerLoop()
4825abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick{
4835abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    // When DumpRenderTree runs in server mode, we just wait around for file names
4845abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    // to be passed to us and read each in turn, passing the results back to the client
4855abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    char filenameBuffer[2048];
4865abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    while (fgets(filenameBuffer, sizeof(filenameBuffer), stdin)) {
4875abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        char* newLineCharacter = strchr(filenameBuffer, '\n');
4885abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        if (newLineCharacter)
4895abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick            *newLineCharacter = '\0';
4905abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
4915abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        if (!strlen(filenameBuffer))
4925abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick            continue;
4935abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
4945abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        runTest(filenameBuffer);
4955abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    }
4965abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick}
4975abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
4985abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrickstatic void initializeGlobalsFromCommandLineOptions(int argc, char *argv[])
4995abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick{
5005abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    struct option options[] = {
5015abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        {"notree", no_argument, &dumpTree, false},
5025abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        {"pixel-tests", no_argument, &dumpPixels, true},
5035abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        {"tree", no_argument, &dumpTree, true},
5045abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        {NULL, 0, NULL, 0}
5055abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    };
5065abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
5075abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    int option;
5085abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    while ((option = getopt_long(argc, (char * const *)argv, "", options, NULL)) != -1) {
5095abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        switch (option) {
5105abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        case '?': // unknown or ambiguous option
5115abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        case ':': // missing argument
5125abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick            exit(1);
5135abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick            break;
5145abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        }
5155abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    }
5165abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick}
5175abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
5185abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
519563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkvoid dump()
520563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{
521563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    invalidateAnyPreviousWaitToDumpWatchdog();
522563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
523563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    if (dumpTree) {
524563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        char* result = 0;
525563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        gchar* responseMimeType = webkit_web_frame_get_response_mime_type(mainFrame);
526563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
5274576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        if (g_str_equal(responseMimeType, "text/plain")) {
52881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            gLayoutTestController->setDumpAsText(true);
5294576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang            gLayoutTestController->setGeneratePixelResults(false);
5304576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        }
531563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        g_free(responseMimeType);
532563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
533563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        if (gLayoutTestController->dumpAsText())
534563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark            result = dumpFramesAsText(mainFrame);
535545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        else {
536545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            // Widget resizing is done asynchronously in GTK+. We pump the main
537545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            // loop here, to flush any pending resize requests. This prevents
538545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            // timing issues which affect the size of elements in the output.
539545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            // We only enable this workaround for tests that print the render tree
540545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            // because this seems to break some dumpAsText tests: see bug 39988
541545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            // After fixing that test, we should apply this approach to all dumps.
542545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            while (gtk_events_pending())
543545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch                gtk_main_iteration();
544545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch
545f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch            result = g_strdup(DumpRenderTreeSupportGtk::dumpRenderTree(mainFrame).data());
546545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        }
547563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
548563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        if (!result) {
549563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark            const char* errorMessage;
550563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark            if (gLayoutTestController->dumpAsText())
551563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark                errorMessage = "[documentElement innerText]";
552563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark            else if (gLayoutTestController->dumpDOMAsWebArchive())
553563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark                errorMessage = "[[mainFrame DOMDocument] webArchive]";
554563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark            else if (gLayoutTestController->dumpSourceAsWebArchive())
555563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark                errorMessage = "[[mainFrame dataSource] webArchive]";
556563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark            else
557563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark                errorMessage = "[mainFrame renderTreeAsExternalRepresentation]";
558563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark            printf("ERROR: nil result from %s", errorMessage);
559563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        } else {
560563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark            printf("%s", result);
561563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark            g_free(result);
562563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark            if (!gLayoutTestController->dumpAsText() && !gLayoutTestController->dumpDOMAsWebArchive() && !gLayoutTestController->dumpSourceAsWebArchive())
563563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark                dumpFrameScrollPosition(mainFrame);
564563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
5650bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            if (gLayoutTestController->dumpBackForwardList())
5660bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                dumpBackForwardListForAllWebViews();
567563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        }
568563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
569563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        if (printSeparators) {
570563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark            puts("#EOF"); // terminate the content block
571563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark            fputs("#EOF\n", stderr);
572563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark            fflush(stdout);
573563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark            fflush(stderr);
574563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        }
575563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    }
576563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
577967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    if (dumpPixels
578967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch     && gLayoutTestController->generatePixelResults()
579967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch     && !gLayoutTestController->dumpDOMAsWebArchive()
580967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch     && !gLayoutTestController->dumpSourceAsWebArchive())
581967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch        dumpWebViewAsPixelsAndCompareWithExpected(gLayoutTestController->expectedPixelHash());
582563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
583563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    // FIXME: call displayWebView here when we support --paint
584563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
585563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    done = true;
586643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    gtk_main_quit();
587563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark}
588563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
589563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkstatic void setDefaultsToConsistentStateValuesForTesting()
590563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{
591231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    resetDefaultsToConsistentValues();
5920bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
5930bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    /* Disable the default auth dialog for testing */
5940bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    SoupSession* session = webkit_get_default_session();
5950bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    soup_session_remove_feature_by_type(session, WEBKIT_TYPE_SOUP_AUTH_DIALOG);
5960bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
597563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark#if PLATFORM(X11)
598563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    webkit_web_settings_add_extra_plugin_directory(webView, TEST_PLUGIN_DIR);
599563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark#endif
600231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
601231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    gchar* databaseDirectory = g_build_filename(g_get_user_data_dir(), "gtkwebkitdrt", "databases", NULL);
602231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    webkit_set_web_database_directory_path(databaseDirectory);
603231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    g_free(databaseDirectory);
6042bde8e466a4451c7319e3a072d118917957d6554Steve Block
6052bde8e466a4451c7319e3a072d118917957d6554Steve Block#if defined(GTK_API_VERSION_2)
6062bde8e466a4451c7319e3a072d118917957d6554Steve Block    gtk_rc_parse_string("style \"nix_scrollbar_spacing\"                    "
6072bde8e466a4451c7319e3a072d118917957d6554Steve Block                        "{                                                  "
6082bde8e466a4451c7319e3a072d118917957d6554Steve Block                        "    GtkScrolledWindow::scrollbar-spacing = 0       "
6092bde8e466a4451c7319e3a072d118917957d6554Steve Block                        "}                                                  "
6102bde8e466a4451c7319e3a072d118917957d6554Steve Block                        "class \"GtkWidget\" style \"nix_scrollbar_spacing\"");
6112bde8e466a4451c7319e3a072d118917957d6554Steve Block
6122bde8e466a4451c7319e3a072d118917957d6554Steve Block#else
6132bde8e466a4451c7319e3a072d118917957d6554Steve Block    GtkCssProvider* cssProvider = gtk_css_provider_new();
6142bde8e466a4451c7319e3a072d118917957d6554Steve Block    gtk_css_provider_load_from_data(cssProvider,
6152bde8e466a4451c7319e3a072d118917957d6554Steve Block                                    " * {                                       "
6162bde8e466a4451c7319e3a072d118917957d6554Steve Block                                    "   -GtkScrolledWindow-scrollbar-spacing: 0;"
6172bde8e466a4451c7319e3a072d118917957d6554Steve Block                                    "}                                          ",
6182bde8e466a4451c7319e3a072d118917957d6554Steve Block                                    -1, 0);
6192bde8e466a4451c7319e3a072d118917957d6554Steve Block    gtk_style_context_add_provider_for_screen(gdk_display_get_default_screen(gdk_display_get_default()),
6202bde8e466a4451c7319e3a072d118917957d6554Steve Block                                              GTK_STYLE_PROVIDER(cssProvider),
6212bde8e466a4451c7319e3a072d118917957d6554Steve Block                                              GTK_STYLE_PROVIDER_PRIORITY_APPLICATION);
6222bde8e466a4451c7319e3a072d118917957d6554Steve Block    g_object_unref(cssProvider);
6232bde8e466a4451c7319e3a072d118917957d6554Steve Block#endif
624563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark}
625563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
626643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockstatic void sendPixelResultsEOF()
627643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
628643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    puts("#EOF");
629643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
630643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    fflush(stdout);
631643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    fflush(stderr);
632643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
633643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
634563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkstatic void runTest(const string& testPathOrURL)
635563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{
636563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    ASSERT(!testPathOrURL.empty());
637563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
638563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    // Look for "'" as a separator between the path or URL, and the pixel dump hash that follows.
63906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    string testURL(testPathOrURL);
640563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    string expectedPixelHash;
64106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    size_t separatorPos = testURL.find("'");
642563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    if (separatorPos != string::npos) {
64306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        testURL = string(testPathOrURL, 0, separatorPos);
644563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        expectedPixelHash = string(testPathOrURL, separatorPos + 1);
645563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    }
646563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
64706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    // Convert the path into a full file URL if it does not look
64806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    // like an HTTP/S URL (doesn't start with http:// or https://).
64906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    if (testURL.find("http://") && testURL.find("https://")) {
65006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        GFile* testFile = g_file_new_for_path(testURL.c_str());
65106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        gchar* testURLCString = g_file_get_uri(testFile);
65206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        testURL = testURLCString;
65306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        g_free(testURLCString);
65406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        g_object_unref(testFile);
65506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    }
656563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
657231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    resetDefaultsToConsistentValues();
658563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
65906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    gLayoutTestController = LayoutTestController::create(testURL, expectedPixelHash);
660563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    topLoadingFrame = 0;
661563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    done = false;
662563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
663563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    gLayoutTestController->setIconDatabaseEnabled(false);
664563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
66506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    if (shouldLogFrameLoadDelegates(testURL))
666563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        gLayoutTestController->setDumpFrameLoadCallbacks(true);
667563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
66806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    if (shouldEnableDeveloperExtras(testURL)) {
669dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        gLayoutTestController->setDeveloperExtrasEnabled(true);
67006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        if (shouldOpenWebInspector(testURL))
671dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            gLayoutTestController->showWebInspector();
67281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        if (shouldDumpAsText(testURL)) {
67381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            gLayoutTestController->setDumpAsText(true);
67481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            gLayoutTestController->setGeneratePixelResults(false);
67581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        }
676dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    }
677643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
678563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    WorkQueue::shared()->clear();
679563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    WorkQueue::shared()->setFrozen(false);
680563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
68106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    bool isSVGW3CTest = (testURL.find("svg/W3C-SVG-1.1") != string::npos);
682563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    GtkAllocation size;
683231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    size.x = size.y = 0;
684692e5dbf12901edacf14812a6fae25462920af42Steve Block    size.width = isSVGW3CTest ? 480 : LayoutTestController::maxViewWidth;
685692e5dbf12901edacf14812a6fae25462920af42Steve Block    size.height = isSVGW3CTest ? 360 : LayoutTestController::maxViewHeight;
686231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    gtk_window_resize(GTK_WINDOW(window), size.width, size.height);
6870bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    gtk_widget_size_allocate(container, &size);
688563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
689563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    if (prevTestBFItem)
690563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        g_object_unref(prevTestBFItem);
691563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    WebKitWebBackForwardList* bfList = webkit_web_view_get_back_forward_list(webView);
692563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    prevTestBFItem = webkit_web_back_forward_list_get_current_item(bfList);
693563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    if (prevTestBFItem)
694563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        g_object_ref(prevTestBFItem);
695563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
696a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    initializeFonts(testURL.c_str());
697563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
698231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    // Focus the web view before loading the test to avoid focusing problems
699231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    gtk_widget_grab_focus(GTK_WIDGET(webView));
70006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    webkit_web_view_open(webView, testURL.c_str());
701563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
702643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    gtk_main();
703563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
704dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    // If developer extras enabled Web Inspector may have been open by the test.
70506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    if (shouldEnableDeveloperExtras(testURL)) {
706643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        gLayoutTestController->closeWebInspector();
707545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        gLayoutTestController->setDeveloperExtrasEnabled(false);
708545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    }
7090bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
7100bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    // Also check if we still have opened webViews and free them.
7110bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (gLayoutTestController->closeRemainingWindowsWhenComplete() || webViewList) {
7120bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        while (webViewList) {
7130bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            g_object_unref(WEBKIT_WEB_VIEW(webViewList->data));
7140bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            webViewList = g_slist_next(webViewList);
7150bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        }
7160bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        g_slist_free(webViewList);
7170bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        webViewList = 0;
7180bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    }
7190bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
720563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    // A blank load seems to be necessary to reset state after certain tests.
721563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    webkit_web_view_open(webView, "about:blank");
722563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
72306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    gLayoutTestController.clear();
724643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
725643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    // terminate the (possibly empty) pixels block after all the state reset
726643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    sendPixelResultsEOF();
727563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark}
728563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
729563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkvoid webViewLoadStarted(WebKitWebView* view, WebKitWebFrame* frame, void*)
730563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{
731563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    // Make sure we only set this once per test.  If it gets cleared, and then set again, we might
732563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    // end up doing two dumps for one test.
733563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    if (!topLoadingFrame && !done)
734563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        topLoadingFrame = frame;
735563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark}
736563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
737563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkstatic gboolean processWork(void* data)
738563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{
7390bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    // if we finish all the commands, we're ready to dump state
7400bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (WorkQueue::shared()->processWork() && !gLayoutTestController->waitToDump())
741563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        dump();
742563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
743563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    return FALSE;
744563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark}
745563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
746231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blockstatic char* getFrameNameSuitableForTestResult(WebKitWebView* view, WebKitWebFrame* frame)
747231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block{
748231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    char* frameName = g_strdup(webkit_web_frame_get_name(frame));
749231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
750231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    if (frame == webkit_web_view_get_main_frame(view)) {
751231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        // This is a bit strange. Shouldn't web_frame_get_name return NULL?
752231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        if (frameName && (frameName[0] != '\0')) {
753231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            char* tmp = g_strdup_printf("main frame \"%s\"", frameName);
754dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            g_free(frameName);
755231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            frameName = tmp;
756231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        } else {
757231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            g_free(frameName);
758231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            frameName = g_strdup("main frame");
759231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        }
760231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    } else if (!frameName || (frameName[0] == '\0')) {
761231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        g_free(frameName);
762231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        frameName = g_strdup("frame (anonymous)");
763dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    } else {
764dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        char* tmp = g_strdup_printf("frame \"%s\"", frameName);
765dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        g_free(frameName);
766dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        frameName = tmp;
767231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    }
768231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
769231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    return frameName;
770231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block}
771231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
772563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkstatic void webViewLoadFinished(WebKitWebView* view, WebKitWebFrame* frame, void*)
773563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{
774563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    if (frame != topLoadingFrame)
775563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        return;
776563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
777563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    topLoadingFrame = 0;
778563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    WorkQueue::shared()->setFrozen(true); // first complete load freezes the queue for the rest of this test
779563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    if (gLayoutTestController->waitToDump())
780563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        return;
781563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
782563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    if (WorkQueue::shared()->count())
783563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        g_timeout_add(0, processWork, 0);
784643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    else
785563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        dump();
786563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark}
787563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
7882fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockstatic gboolean webViewLoadError(WebKitWebView*, WebKitWebFrame*, gchar*, gpointer, gpointer)
7892fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
7902fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    return TRUE; // Return true here to disable the default error page.
7912fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
7922fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
793dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockstatic void webViewDocumentLoadFinished(WebKitWebView* view, WebKitWebFrame* frame, void*)
794dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
795dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (!done && gLayoutTestController->dumpFrameLoadCallbacks()) {
796dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        char* frameName = getFrameNameSuitableForTestResult(view, frame);
797dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        printf("%s - didFinishDocumentLoadForFrame\n", frameName);
798dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        g_free(frameName);
799dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    } else if (!done) {
800f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        guint pendingFrameUnloadEvents = DumpRenderTreeSupportGtk::getPendingUnloadEventCount(frame);
801dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        if (pendingFrameUnloadEvents) {
802dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            char* frameName = getFrameNameSuitableForTestResult(view, frame);
803dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            printf("%s - has %u onunload handler(s)\n", frameName, pendingFrameUnloadEvents);
804dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            g_free(frameName);
805dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        }
806dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    }
807dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
808dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
809dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockstatic void webViewOnloadEvent(WebKitWebView* view, WebKitWebFrame* frame, void*)
810dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
811dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (!done && gLayoutTestController->dumpFrameLoadCallbacks()) {
812dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        char* frameName = getFrameNameSuitableForTestResult(view, frame);
813dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        printf("%s - didHandleOnloadEventsForFrame\n", frameName);
814dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        g_free(frameName);
815dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    }
816dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
817dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
8182daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdochstatic void addControllerToWindow(JSContextRef context, JSObjectRef windowObject, const char* controllerName, JSValueRef controller)
8192daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch{
8202daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    JSStringRef controllerNameStr = JSStringCreateWithUTF8CString(controllerName);
8212daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    JSObjectSetProperty(context, windowObject, controllerNameStr, controller, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete, 0);
8222daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    JSStringRelease(controllerNameStr);
8232daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch}
8242daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
825563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkstatic void webViewWindowObjectCleared(WebKitWebView* view, WebKitWebFrame* frame, JSGlobalContextRef context, JSObjectRef windowObject, gpointer data)
826563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{
827563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    JSValueRef exception = 0;
8280bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    ASSERT(gLayoutTestController);
829563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
830563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    gLayoutTestController->makeWindowObject(context, windowObject, &exception);
8310bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    ASSERT(!exception);
8320bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
8330bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    gcController->makeWindowObject(context, windowObject, &exception);
8340bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    ASSERT(!exception);
8350bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
8360bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    axController->makeWindowObject(context, windowObject, &exception);
8370bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    ASSERT(!exception);
8380bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
8392daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    addControllerToWindow(context, windowObject, "eventSender", makeEventSender(context, !webkit_web_frame_get_parent(frame)));
8402daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    addControllerToWindow(context, windowObject, "plainText", makePlainTextController(context));
8412daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    addControllerToWindow(context, windowObject, "textInputController", makeTextInputController(context));
842563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark}
843563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
844563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkstatic gboolean webViewConsoleMessage(WebKitWebView* view, const gchar* message, unsigned int line, const gchar* sourceId, gpointer data)
845563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{
846dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    gchar* testMessage = 0;
847dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    const gchar* uriScheme;
848dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
849dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    // Tests expect only the filename part of local URIs
850dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    uriScheme = g_strstr_len(message, -1, "file://");
851dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (uriScheme) {
852dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        GString* tempString = g_string_sized_new(strlen(message));
853dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        gchar* filename = g_strrstr(uriScheme, G_DIR_SEPARATOR_S);
854dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
855dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        if (filename) {
856dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            filename += strlen(G_DIR_SEPARATOR_S);
857dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            tempString = g_string_append_len(tempString, message, (uriScheme - message));
858dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            tempString = g_string_append_len(tempString, filename, strlen(filename));
859dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            testMessage = g_string_free(tempString, FALSE);
860dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        }
861dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    }
862dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
863dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    fprintf(stdout, "CONSOLE MESSAGE: line %d: %s\n", line, testMessage ? testMessage : message);
864dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    g_free(testMessage);
865dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
866563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    return TRUE;
867563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark}
868563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
869563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
870563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkstatic gboolean webViewScriptAlert(WebKitWebView* view, WebKitWebFrame* frame, const gchar* message, gpointer data)
871563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{
872563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    fprintf(stdout, "ALERT: %s\n", message);
873563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    return TRUE;
874563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark}
875563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
876563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkstatic gboolean webViewScriptPrompt(WebKitWebView* webView, WebKitWebFrame* frame, const gchar* message, const gchar* defaultValue, gchar** value, gpointer data)
877563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{
878563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    fprintf(stdout, "PROMPT: %s, default text: %s\n", message, defaultValue);
879563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    *value = g_strdup(defaultValue);
880563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    return TRUE;
881563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark}
882563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
883563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkstatic gboolean webViewScriptConfirm(WebKitWebView* view, WebKitWebFrame* frame, const gchar* message, gboolean* didConfirm, gpointer data)
884563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{
885563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    fprintf(stdout, "CONFIRM: %s\n", message);
886563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    *didConfirm = TRUE;
887563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    return TRUE;
888563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark}
889563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
890563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkstatic void webViewTitleChanged(WebKitWebView* view, WebKitWebFrame* frame, const gchar* title, gpointer data)
891563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{
892563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    if (gLayoutTestController->dumpTitleChanges() && !done)
893563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        printf("TITLE CHANGED: %s\n", title ? title : "");
894563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark}
895563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
8960bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochstatic bool webViewNavigationPolicyDecisionRequested(WebKitWebView* view, WebKitWebFrame* frame,
8970bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                                                     WebKitNetworkRequest* request,
8980bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                                                     WebKitWebNavigationAction* navAction,
8990bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                                                     WebKitWebPolicyDecision* policyDecision)
9000bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
9010bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    // Use the default handler if we're not waiting for policy,
9020bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    // i.e., LayoutTestController::waitForPolicyDelegate
9030bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (!waitForPolicy)
9040bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        return FALSE;
9050bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
9060bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    gchar* typeDescription;
9070bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    WebKitWebNavigationReason reason;
9080bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    g_object_get(G_OBJECT(navAction), "reason", &reason, NULL);
9090bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
9100bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    switch(reason) {
9110bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        case WEBKIT_WEB_NAVIGATION_REASON_LINK_CLICKED:
9120bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            typeDescription = g_strdup("link clicked");
9130bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            break;
9140bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        case WEBKIT_WEB_NAVIGATION_REASON_FORM_SUBMITTED:
9150bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            typeDescription = g_strdup("form submitted");
9160bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            break;
9170bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        case WEBKIT_WEB_NAVIGATION_REASON_BACK_FORWARD:
9180bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            typeDescription = g_strdup("back/forward");
9190bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            break;
9200bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        case WEBKIT_WEB_NAVIGATION_REASON_RELOAD:
9210bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            typeDescription = g_strdup("reload");
9220bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            break;
9230bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        case WEBKIT_WEB_NAVIGATION_REASON_FORM_RESUBMITTED:
9240bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            typeDescription = g_strdup("form resubmitted");
9250bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            break;
9260bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        case WEBKIT_WEB_NAVIGATION_REASON_OTHER:
9270bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            typeDescription = g_strdup("other");
9280bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            break;
9290bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        default:
9300bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            typeDescription = g_strdup("illegal value");
9310bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    }
9320bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
9330bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    printf("Policy delegate: attempt to load %s with navigation type '%s'\n", webkit_network_request_get_uri(request), typeDescription);
9340bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    g_free(typeDescription);
9350bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
9360bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    webkit_web_policy_decision_ignore(policyDecision);
9370bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    gLayoutTestController->notifyDone();
9380bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
9390bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    return TRUE;
9400bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
9410bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
9420bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochstatic void webViewStatusBarTextChanged(WebKitWebView* view, const gchar* message, gpointer data)
9430bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
9440bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    // Are we doing anything wrong? One test that does not call
9450bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    // dumpStatusCallbacks gets true here
9462daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    if (gLayoutTestController->dumpStatusCallbacks())
9472daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        printf("UI DELEGATE STATUS CALLBACK: setStatusText:%s\n", message);
9480bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
9490bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
9500bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochstatic gboolean webViewClose(WebKitWebView* view)
9510bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
9520bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    ASSERT(view);
9530bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
9540bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    webViewList = g_slist_remove(webViewList, view);
9550bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    g_object_unref(view);
9560bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
9570bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    return TRUE;
9580bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
9590bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
960231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blockstatic void databaseQuotaExceeded(WebKitWebView* view, WebKitWebFrame* frame, WebKitWebDatabase *database)
961231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block{
962231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    ASSERT(view);
963231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    ASSERT(frame);
964231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    ASSERT(database);
965231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
966231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    WebKitSecurityOrigin* origin = webkit_web_database_get_security_origin(database);
967231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    if (gLayoutTestController->dumpDatabaseCallbacks()) {
968231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        printf("UI DELEGATE DATABASE CALLBACK: exceededDatabaseQuotaForSecurityOrigin:{%s, %s, %i} database:%s\n",
969231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            webkit_security_origin_get_protocol(origin),
970231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            webkit_security_origin_get_host(origin),
971231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            webkit_security_origin_get_port(origin),
972231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            webkit_web_database_get_name(database));
973231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    }
974231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    webkit_security_origin_set_web_database_quota(origin, 5 * 1024 * 1024);
975231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block}
976231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
977dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockstatic bool
978dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve BlockgeolocationPolicyDecisionRequested(WebKitWebView*, WebKitWebFrame*, WebKitGeolocationPolicyDecision* decision)
979dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
980dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (!gLayoutTestController->isGeolocationPermissionSet())
981dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return FALSE;
982dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (gLayoutTestController->geolocationPermission())
983dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        webkit_geolocation_policy_allow(decision);
984dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    else
985dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        webkit_geolocation_policy_deny(decision);
986dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
987dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return TRUE;
988dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
989dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
9900bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
9910bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochstatic WebKitWebView* webViewCreate(WebKitWebView*, WebKitWebFrame*);
9920bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
993643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockstatic gboolean webInspectorShowWindow(WebKitWebInspector*, gpointer data)
994643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
995643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    gtk_window_set_default_size(GTK_WINDOW(webInspectorWindow), 800, 600);
996643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    gtk_widget_show_all(webInspectorWindow);
997643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    return TRUE;
998643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
999643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
1000643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockstatic gboolean webInspectorCloseWindow(WebKitWebInspector*, gpointer data)
1001643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
1002643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    gtk_widget_destroy(webInspectorWindow);
1003643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    webInspectorWindow = 0;
1004643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    return TRUE;
1005643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
1006643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
1007cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Blockstatic WebKitWebView* webInspectorInspectWebView(WebKitWebInspector*, gpointer data)
1008cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block{
1009643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    webInspectorWindow = gtk_window_new(GTK_WINDOW_TOPLEVEL);
1010643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
1011643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    GtkWidget* webView = webkit_web_view_new();
1012643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    gtk_container_add(GTK_CONTAINER(webInspectorWindow),
1013643ca7872b450ea4efacab6188849e5aac2ba161Steve Block                      webView);
1014643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
1015643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    return WEBKIT_WEB_VIEW(webView);
1016cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block}
1017cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
1018e14391e94c850b8bd03680c23b38978db68687a8John Reckstatic void webFrameLoadStatusNotified(WebKitWebFrame* frame, gpointer user_data)
10196c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen{
1020e14391e94c850b8bd03680c23b38978db68687a8John Reck    WebKitLoadStatus loadStatus = webkit_web_frame_get_load_status(frame);
10216c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen
10226c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    if (gLayoutTestController->dumpFrameLoadCallbacks()) {
1023e14391e94c850b8bd03680c23b38978db68687a8John Reck        GOwnPtr<char> frameName(getFrameNameSuitableForTestResult(webkit_web_frame_get_web_view(frame), frame));
1024e14391e94c850b8bd03680c23b38978db68687a8John Reck
1025e14391e94c850b8bd03680c23b38978db68687a8John Reck        switch (loadStatus) {
1026e14391e94c850b8bd03680c23b38978db68687a8John Reck        case WEBKIT_LOAD_PROVISIONAL:
1027e14391e94c850b8bd03680c23b38978db68687a8John Reck            if (!done)
1028e14391e94c850b8bd03680c23b38978db68687a8John Reck                printf("%s - didStartProvisionalLoadForFrame\n", frameName.get());
1029e14391e94c850b8bd03680c23b38978db68687a8John Reck            break;
1030e14391e94c850b8bd03680c23b38978db68687a8John Reck        case WEBKIT_LOAD_COMMITTED:
1031e14391e94c850b8bd03680c23b38978db68687a8John Reck            if (!done)
1032e14391e94c850b8bd03680c23b38978db68687a8John Reck                printf("%s - didCommitLoadForFrame\n", frameName.get());
1033e14391e94c850b8bd03680c23b38978db68687a8John Reck            break;
1034e14391e94c850b8bd03680c23b38978db68687a8John Reck        case WEBKIT_LOAD_FINISHED:
1035e14391e94c850b8bd03680c23b38978db68687a8John Reck            if (frame != topLoadingFrame || !done)
1036e14391e94c850b8bd03680c23b38978db68687a8John Reck                printf("%s - didFinishLoadForFrame\n", frameName.get());
1037e14391e94c850b8bd03680c23b38978db68687a8John Reck            break;
1038e14391e94c850b8bd03680c23b38978db68687a8John Reck        default:
1039e14391e94c850b8bd03680c23b38978db68687a8John Reck            break;
10406c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen        }
10416c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    }
10426c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen}
10436c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen
1044e14391e94c850b8bd03680c23b38978db68687a8John Reckstatic void frameCreatedCallback(WebKitWebView* webView, WebKitWebFrame* webFrame, gpointer user_data)
1045e14391e94c850b8bd03680c23b38978db68687a8John Reck{
1046e14391e94c850b8bd03680c23b38978db68687a8John Reck    g_signal_connect(webFrame, "notify::load-status", G_CALLBACK(webFrameLoadStatusNotified), NULL);
1047e14391e94c850b8bd03680c23b38978db68687a8John Reck}
1048e14391e94c850b8bd03680c23b38978db68687a8John Reck
104981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochstatic void willSendRequestCallback(WebKitWebView* webView, WebKitWebFrame*, WebKitWebResource*, WebKitNetworkRequest* request, WebKitNetworkResponse*)
105081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch{
10512daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    if (!done && gLayoutTestController->willSendRequestReturnsNull())
10522daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        return;
10532daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
105481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    SoupMessage* soupMessage = webkit_network_request_get_message(request);
10552bde8e466a4451c7319e3a072d118917957d6554Steve Block    SoupURI* uri = soup_uri_new(webkit_network_request_get_uri(request));
10562bde8e466a4451c7319e3a072d118917957d6554Steve Block
10572bde8e466a4451c7319e3a072d118917957d6554Steve Block    if (SOUP_URI_VALID_FOR_HTTP(uri) && g_strcmp0(uri->host, "127.0.0.1")
10582bde8e466a4451c7319e3a072d118917957d6554Steve Block        && g_strcmp0(uri->host, "255.255.255.255")
10592bde8e466a4451c7319e3a072d118917957d6554Steve Block        && g_ascii_strncasecmp(uri->host, "localhost", 9)) {
10602bde8e466a4451c7319e3a072d118917957d6554Steve Block        printf("Blocked access to external URL %s\n", soup_uri_to_string(uri, FALSE));
10612bde8e466a4451c7319e3a072d118917957d6554Steve Block        soup_uri_free(uri);
10622bde8e466a4451c7319e3a072d118917957d6554Steve Block        return;
10632bde8e466a4451c7319e3a072d118917957d6554Steve Block    }
10642daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    if (uri)
10652daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        soup_uri_free(uri);
106681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
106781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    if (soupMessage) {
106881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        const set<string>& clearHeaders = gLayoutTestController->willSendRequestClearHeaders();
106981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        for (set<string>::const_iterator header = clearHeaders.begin(); header != clearHeaders.end(); ++header)
107081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            soup_message_headers_remove(soupMessage->request_headers, header->c_str());
107181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    }
107281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch}
107381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
10740bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochstatic WebKitWebView* createWebView()
10750bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
10760bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    WebKitWebView* view = WEBKIT_WEB_VIEW(webkit_web_view_new());
10770bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
1078e14391e94c850b8bd03680c23b38978db68687a8John Reck    DumpRenderTreeSupportGtk::setDumpRenderTreeModeEnabled(true);
1079e14391e94c850b8bd03680c23b38978db68687a8John Reck
10800bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    g_object_connect(G_OBJECT(view),
10810bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                     "signal::load-started", webViewLoadStarted, 0,
10820bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                     "signal::load-finished", webViewLoadFinished, 0,
10832fc2651226baac27029e38c9d6ef883fa32084dbSteve Block                     "signal::load-error", webViewLoadError, 0,
10840bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                     "signal::window-object-cleared", webViewWindowObjectCleared, 0,
10850bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                     "signal::console-message", webViewConsoleMessage, 0,
10860bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                     "signal::script-alert", webViewScriptAlert, 0,
10870bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                     "signal::script-prompt", webViewScriptPrompt, 0,
10880bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                     "signal::script-confirm", webViewScriptConfirm, 0,
10890bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                     "signal::title-changed", webViewTitleChanged, 0,
10900bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                     "signal::navigation-policy-decision-requested", webViewNavigationPolicyDecisionRequested, 0,
10910bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                     "signal::status-bar-text-changed", webViewStatusBarTextChanged, 0,
10920bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                     "signal::create-web-view", webViewCreate, 0,
10930bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                     "signal::close-web-view", webViewClose, 0,
1094231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block                     "signal::database-quota-exceeded", databaseQuotaExceeded, 0,
1095dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                     "signal::document-load-finished", webViewDocumentLoadFinished, 0,
1096dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                     "signal::geolocation-policy-decision-requested", geolocationPolicyDecisionRequested, 0,
1097dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                     "signal::onload-event", webViewOnloadEvent, 0,
10980617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen                     "signal::drag-begin", dragBeginCallback, 0,
10990617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen                     "signal::drag-end", dragEndCallback, 0,
11000617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen                     "signal::drag-failed", dragFailedCallback, 0,
1101e14391e94c850b8bd03680c23b38978db68687a8John Reck                     "signal::frame-created", frameCreatedCallback, 0,
110281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                     "signal::resource-request-starting", willSendRequestCallback, 0,
11030617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen
11040bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                     NULL);
11054576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    connectEditingCallbacks(view);
11060bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
1107cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    WebKitWebInspector* inspector = webkit_web_view_get_inspector(view);
1108643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    g_object_connect(G_OBJECT(inspector),
1109643ca7872b450ea4efacab6188849e5aac2ba161Steve Block                     "signal::inspect-web-view", webInspectorInspectWebView, 0,
1110643ca7872b450ea4efacab6188849e5aac2ba161Steve Block                     "signal::show-window", webInspectorShowWindow, 0,
1111643ca7872b450ea4efacab6188849e5aac2ba161Steve Block                     "signal::close-window", webInspectorCloseWindow, 0,
1112643ca7872b450ea4efacab6188849e5aac2ba161Steve Block                     NULL);
1113cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
1114d0825bca7fe65beaee391d30da42e937db621564Steve Block    if (webView) {
1115d0825bca7fe65beaee391d30da42e937db621564Steve Block        WebKitWebSettings* settings = webkit_web_view_get_settings(webView);
1116d0825bca7fe65beaee391d30da42e937db621564Steve Block        webkit_web_view_set_settings(view, settings);
1117d0825bca7fe65beaee391d30da42e937db621564Steve Block    }
1118d0825bca7fe65beaee391d30da42e937db621564Steve Block
1119e14391e94c850b8bd03680c23b38978db68687a8John Reck    // frame-created is not issued for main frame. That's why we must do this here
1120e14391e94c850b8bd03680c23b38978db68687a8John Reck    WebKitWebFrame* frame = webkit_web_view_get_main_frame(view);
1121e14391e94c850b8bd03680c23b38978db68687a8John Reck    g_signal_connect(frame, "notify::load-status", G_CALLBACK(webFrameLoadStatusNotified), NULL);
1122e14391e94c850b8bd03680c23b38978db68687a8John Reck
11230bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    return view;
11240bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
11250bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
11260bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochstatic WebKitWebView* webViewCreate(WebKitWebView* view, WebKitWebFrame* frame)
11270bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
11280bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (!gLayoutTestController->canOpenWindows())
11290bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        return 0;
11300bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
11310bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    // Make sure that waitUntilDone has been called.
11320bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    ASSERT(gLayoutTestController->waitToDump());
11330bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
11340bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    WebKitWebView* newWebView = createWebView();
11350bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    g_object_ref_sink(G_OBJECT(newWebView));
11360bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    webViewList = g_slist_prepend(webViewList, newWebView);
11370bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    return newWebView;
11380bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
11390bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
1140dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockstatic void logHandler(const gchar* domain, GLogLevelFlags level, const gchar* message, gpointer data)
1141dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
1142dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (level < G_LOG_LEVEL_DEBUG)
1143dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        fprintf(stderr, "%s\n", message);
1144dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
1145dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1146563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkint main(int argc, char* argv[])
1147563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{
1148563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    g_thread_init(NULL);
1149563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    gtk_init(&argc, &argv);
1150563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
1151dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    // Some plugins might try to use the GLib logger for printing debug
1152dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    // messages. This will cause tests to fail because of unexpected output.
1153dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    // We squelch all debug messages sent to the logger.
1154dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    g_log_set_default_handler(logHandler, 0);
1155dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
11565abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    initializeGlobalsFromCommandLineOptions(argc, argv);
1157231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    initializeFonts();
1158563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
1159231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    window = gtk_window_new(GTK_WINDOW_POPUP);
11600bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    container = GTK_WIDGET(gtk_scrolled_window_new(NULL, NULL));
11610bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(container), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
11620bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    gtk_container_add(GTK_CONTAINER(window), container);
1163231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    gtk_widget_show_all(window);
1164563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
11650bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    webView = createWebView();
11660bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    gtk_container_add(GTK_CONTAINER(container), GTK_WIDGET(webView));
1167563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    gtk_widget_realize(GTK_WIDGET(webView));
11680bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    gtk_widget_show_all(container);
1169643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    gtk_widget_grab_focus(GTK_WIDGET(webView));
1170563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    mainFrame = webkit_web_view_get_main_frame(webView);
1171563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
1172563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    setDefaultsToConsistentStateValuesForTesting();
1173563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
11740bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    gcController = new GCController();
11750bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    axController = new AccessibilityController();
11760bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
11775abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    if (useLongRunningServerMode(argc, argv)) {
1178563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        printSeparators = true;
11795abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        runTestingServerLoop();
1180563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    } else {
1181563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        printSeparators = (optind < argc-1 || (dumpPixels && dumpTree));
1182563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        for (int i = optind; i != argc; ++i)
1183563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark            runTest(argv[i]);
1184563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    }
1185563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
11860bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    delete gcController;
11870bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    gcController = 0;
11880bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
11890bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    delete axController;
11900bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    axController = 0;
11910bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
1192231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    gtk_widget_destroy(window);
11930bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
1194563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    return 0;
1195563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark}
1196