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