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