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