diff options
Diffstat (limited to 'Tools/WebKitTestRunner/gtk')
-rw-r--r-- | Tools/WebKitTestRunner/gtk/EventSenderProxyGtk.cpp | 43 | ||||
-rw-r--r-- | Tools/WebKitTestRunner/gtk/PlatformWebViewGtk.cpp | 95 | ||||
-rw-r--r-- | Tools/WebKitTestRunner/gtk/TestControllerGtk.cpp | 83 | ||||
-rw-r--r-- | Tools/WebKitTestRunner/gtk/fonts/AHEM____.TTF | bin | 0 -> 12480 bytes | |||
-rw-r--r-- | Tools/WebKitTestRunner/gtk/fonts/FontWithNoValidEncoding.fon | bin | 0 -> 8368 bytes | |||
-rw-r--r-- | Tools/WebKitTestRunner/gtk/fonts/fonts.conf | 435 | ||||
-rw-r--r-- | Tools/WebKitTestRunner/gtk/main.cpp | 9 |
7 files changed, 615 insertions, 50 deletions
diff --git a/Tools/WebKitTestRunner/gtk/EventSenderProxyGtk.cpp b/Tools/WebKitTestRunner/gtk/EventSenderProxyGtk.cpp index d25320125..e93caf5aa 100644 --- a/Tools/WebKitTestRunner/gtk/EventSenderProxyGtk.cpp +++ b/Tools/WebKitTestRunner/gtk/EventSenderProxyGtk.cpp @@ -14,7 +14,7 @@ * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. - * 3. Neither the name of Apple Computer, Inc. ("Apple") nor the names of + * 3. Neither the name of Apple Inc. ("Apple") nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * @@ -39,7 +39,7 @@ #include <gdk/gdkkeysyms.h> #include <gtk/gtk.h> #include <wtf/StdLibExtras.h> -#include <wtf/gobject/GUniquePtr.h> +#include <wtf/glib/GUniquePtr.h> #include <wtf/text/WTFString.h> namespace WTR { @@ -122,6 +122,8 @@ static guint webkitModifiersToGDKModifiers(WKEventModifiers wkModifiers) modifiers |= GDK_MOD1_MASK; if (wkModifiers & kWKEventModifiersMetaKey) modifiers |= GDK_META_MASK; + if (wkModifiers & kWKEventModifiersCapsLockKey) + modifiers |= GDK_LOCK_MASK; return modifiers; } @@ -162,8 +164,9 @@ void EventSenderProxy::updateClickCountForButton(int button) m_clickButton = button; } -static void dispatchEvent(GdkEvent* event) +void EventSenderProxy::dispatchEvent(GdkEvent* event) { + ASSERT(m_testController->mainWebView()); gtk_main_do_event(event); gdk_event_free(event); } @@ -217,6 +220,18 @@ int getGDKKeySymForKeyRef(WKStringRef keyRef, unsigned location, guint* modifier return GDK_KEY_VoidSymbol; } + if (WKStringIsEqualToUTF8CString(keyRef, "leftControl")) + return GDK_KEY_Control_L; + if (WKStringIsEqualToUTF8CString(keyRef, "rightControl")) + return GDK_KEY_Control_R; + if (WKStringIsEqualToUTF8CString(keyRef, "leftShift")) + return GDK_KEY_Shift_L; + if (WKStringIsEqualToUTF8CString(keyRef, "rightShift")) + return GDK_KEY_Shift_R; + if (WKStringIsEqualToUTF8CString(keyRef, "leftAlt")) + return GDK_KEY_Alt_L; + if (WKStringIsEqualToUTF8CString(keyRef, "rightAlt")) + return GDK_KEY_Alt_R; if (WKStringIsEqualToUTF8CString(keyRef, "leftArrow")) return GDK_KEY_Left; if (WKStringIsEqualToUTF8CString(keyRef, "rightArrow")) @@ -277,6 +292,8 @@ int getGDKKeySymForKeyRef(WKStringRef keyRef, unsigned location, guint* modifier return GDK_KEY_Tab; if (charCode == '\x8') return GDK_KEY_BackSpace; + if (charCode == 0x001B) + return GDK_KEY_Escape; if (WTF::isASCIIUpper(charCode)) *modifiers |= GDK_SHIFT_MASK; @@ -416,7 +433,10 @@ void EventSenderProxy::mouseScrollBy(int horizontal, int vertical) void EventSenderProxy::continuousMouseScrollBy(int horizontal, int vertical, bool paged) { // Gtk+ does not support paged scroll events. - g_return_if_fail(!paged); + if (paged) { + WTFLogAlways("EventSenderProxy::continuousMouseScrollBy not implemented for paged scroll events"); + return; + } GdkEvent* event = gdk_event_new(GDK_SCROLL); event->scroll.x = m_position.x; @@ -433,6 +453,18 @@ void EventSenderProxy::continuousMouseScrollBy(int horizontal, int vertical, boo sendOrQueueEvent(event); } +void EventSenderProxy::mouseScrollByWithWheelAndMomentumPhases(int x, int y, int /*phase*/, int /*momentum*/) +{ + // Gtk+ does not have the concept of wheel gesture phases or momentum. Just relay to + // the mouse wheel handler. + mouseScrollBy(x, y); +} + +void EventSenderProxy::swipeGestureWithWheelAndMomentumPhases(int, int, int, int) +{ + notImplemented(); +} + void EventSenderProxy::leapForward(int milliseconds) { if (m_eventQueue.isEmpty()) @@ -466,6 +498,7 @@ GUniquePtr<GdkEvent> EventSenderProxy::createTouchEvent(GdkEventType eventType, return touchEvent; } +#if ENABLE(TOUCH_EVENTS) void EventSenderProxy::addTouchPoint(int x, int y) { // Touch ID is array index plus one, so 0 is skipped. @@ -556,6 +589,6 @@ void EventSenderProxy::setTouchModifier(WKEventModifiers modifier, bool enable) m_updatedTouchEvents.add(GPOINTER_TO_INT(event->touch.sequence)); } } - +#endif // ENABLE(TOUCH_EVENTS) } // namespace WTR diff --git a/Tools/WebKitTestRunner/gtk/PlatformWebViewGtk.cpp b/Tools/WebKitTestRunner/gtk/PlatformWebViewGtk.cpp index fd6f8466b..eb0a08d74 100644 --- a/Tools/WebKitTestRunner/gtk/PlatformWebViewGtk.cpp +++ b/Tools/WebKitTestRunner/gtk/PlatformWebViewGtk.cpp @@ -28,13 +28,17 @@ #include "config.h" #include "PlatformWebView.h" -#include <WebKit2/WKViewPrivate.h> +#include <WebKit/WKImageCairo.h> +#include <WebKit/WKPageConfigurationRef.h> +#include <WebKit/WKView.h> +#include <WebKit/WKViewPrivate.h> #include <gtk/gtk.h> +#include <wtf/Assertions.h> namespace WTR { -PlatformWebView::PlatformWebView(WKContextRef context, WKPageGroupRef pageGroup, WKPageRef /* relatedPage */, WKDictionaryRef options) - : m_view(WKViewCreate(context, pageGroup)) +PlatformWebView::PlatformWebView(WKPageConfigurationRef configuration, const TestOptions& options) + : m_view(WKViewCreate(configuration)) , m_window(gtk_window_new(GTK_WINDOW_POPUP)) , m_windowIsKey(true) , m_options(options) @@ -42,7 +46,7 @@ PlatformWebView::PlatformWebView(WKContextRef context, WKPageGroupRef pageGroup, gtk_container_add(GTK_CONTAINER(m_window), GTK_WIDGET(m_view)); GtkAllocation size = { 0, 0, 800, 600 }; - gtk_widget_size_allocate(m_window, &size); + gtk_widget_size_allocate(GTK_WIDGET(m_view), &size); gtk_window_resize(GTK_WINDOW(m_window), 800, 600); gtk_widget_show_all(m_window); @@ -55,14 +59,17 @@ PlatformWebView::~PlatformWebView() gtk_widget_destroy(m_window); } -void PlatformWebView::resizeTo(unsigned width, unsigned height) +void PlatformWebView::setWindowIsKey(bool isKey) { - GtkAllocation size = { 0, 0, static_cast<int>(width), static_cast<int>(height) }; - gtk_widget_size_allocate(m_window, &size); - gtk_window_resize(GTK_WINDOW(m_window), width, height); + m_windowIsKey = isKey; +} - while (gtk_events_pending()) - gtk_main_iteration(); +void PlatformWebView::resizeTo(unsigned width, unsigned height, WebViewSizingMode sizingMode) +{ + WKRect frame = windowFrame(); + frame.size.width = width; + frame.size.height = height; + setWindowFrame(frame, sizingMode); } WKPageRef PlatformWebView::page() @@ -79,14 +86,8 @@ void PlatformWebView::focus() WKRect PlatformWebView::windowFrame() { GtkAllocation geometry; -#ifdef GTK_API_VERSION_2 - gint depth; - gdk_window_get_geometry(gtk_widget_get_window(GTK_WIDGET(m_window)), - &geometry.x, &geometry.y, &geometry.width, &geometry.height, &depth); -#else gdk_window_get_geometry(gtk_widget_get_window(GTK_WIDGET(m_window)), &geometry.x, &geometry.y, &geometry.width, &geometry.height); -#endif WKRect frame; frame.origin.x = geometry.x; @@ -96,10 +97,15 @@ WKRect PlatformWebView::windowFrame() return frame; } -void PlatformWebView::setWindowFrame(WKRect frame) +void PlatformWebView::setWindowFrame(WKRect frame, WebViewSizingMode) { - gtk_window_move(GTK_WINDOW(m_window), frame.origin.x, frame.origin.y); - resizeTo(frame.size.width, frame.size.height); + gdk_window_move_resize(gtk_widget_get_window(GTK_WIDGET(m_window)), + frame.origin.x, frame.origin.y, frame.size.width, frame.size.height); + GtkAllocation size = { 0, 0, static_cast<int>(frame.size.width), static_cast<int>(frame.size.height) }; + gtk_widget_size_allocate(GTK_WIDGET(m_view), &size); + + while (gtk_events_pending()) + gtk_main_iteration(); } void PlatformWebView::addChromeInputField() @@ -110,20 +116,65 @@ void PlatformWebView::removeChromeInputField() { } +void PlatformWebView::addToWindow() +{ +} + +void PlatformWebView::removeFromWindow() +{ +} + void PlatformWebView::makeWebViewFirstResponder() { } +void PlatformWebView::changeWindowScaleIfNeeded(float) +{ +} + WKRetainPtr<WKImageRef> PlatformWebView::windowSnapshotImage() { - // FIXME: implement to capture pixels in the UI process, - // which may be necessary to capture things like 3D transforms. - return 0; + int width = gtk_widget_get_allocated_width(GTK_WIDGET(m_view)); + int height = gtk_widget_get_allocated_height(GTK_WIDGET(m_view)); + + while (gtk_events_pending()) + gtk_main_iteration(); + + cairo_surface_t* imageSurface = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, width, height); + + cairo_t* context = cairo_create(imageSurface); + gtk_widget_draw(GTK_WIDGET(m_view), context); + cairo_destroy(context); + + WKRetainPtr<WKImageRef> wkImage = adoptWK(WKImageCreateFromCairoSurface(imageSurface, 0 /* options */)); + + cairo_surface_destroy(imageSurface); + return wkImage; } void PlatformWebView::didInitializeClients() { } +bool PlatformWebView::viewSupportsOptions(const TestOptions&) const +{ + return true; +} + +void PlatformWebView::dismissAllPopupMenus() +{ + // gtk_menu_popdown doesn't modify the GList of attached menus, so it should + // be safe to walk this list while calling it. + GList* attachedMenusList = gtk_menu_get_for_attach_widget(GTK_WIDGET(m_view)); + g_list_foreach(attachedMenusList, [] (void* data, void*) { + ASSERT(data); + gtk_menu_popdown(GTK_MENU(data)); + }, nullptr); +} + +void PlatformWebView::setNavigationGesturesEnabled(bool) +{ +} + } // namespace WTR diff --git a/Tools/WebKitTestRunner/gtk/TestControllerGtk.cpp b/Tools/WebKitTestRunner/gtk/TestControllerGtk.cpp index d8fb9f728..62d031a87 100644 --- a/Tools/WebKitTestRunner/gtk/TestControllerGtk.cpp +++ b/Tools/WebKitTestRunner/gtk/TestControllerGtk.cpp @@ -27,52 +27,68 @@ #include "config.h" #include "TestController.h" +#include "PlatformWebView.h" #include <gtk/gtk.h> #include <wtf/Platform.h> -#include <wtf/gobject/GUniquePtr.h> +#include <wtf/RunLoop.h> +#include <wtf/glib/GRefPtr.h> +#include <wtf/glib/GUniquePtr.h> #include <wtf/text/WTFString.h> namespace WTR { -static guint gTimeoutSourceId = 0; - -static void cancelTimeout() +static GSource* timeoutSource() { - if (!gTimeoutSourceId) - return; - g_source_remove(gTimeoutSourceId); - gTimeoutSourceId = 0; + static GRefPtr<GSource> source = nullptr; + if (!source) { + source = adoptGRef(g_timeout_source_new(0)); + g_source_set_ready_time(source.get(), -1); + g_source_set_name(source.get(), "[WTR] Test timeout source"); + g_source_set_callback(source.get(), [](gpointer userData) -> gboolean { + g_source_set_ready_time(static_cast<GSource*>(userData), -1); + fprintf(stderr, "FAIL: TestControllerRunLoop timed out.\n"); + RunLoop::main().stop(); + return G_SOURCE_REMOVE; + }, source.get(), nullptr); + g_source_attach(source.get(), nullptr); + } + return source.get(); } void TestController::notifyDone() { - gtk_main_quit(); - cancelTimeout(); + g_source_set_ready_time(timeoutSource(), -1); + RunLoop::main().stop(); } void TestController::platformInitialize() { } -void TestController::platformDestroy() +WKPreferencesRef TestController::platformPreferences() { + return WKPageGroupGetPreferences(m_pageGroup.get()); } -static gboolean timeoutCallback(gpointer) +void TestController::platformDestroy() { - fprintf(stderr, "FAIL: TestControllerRunLoop timed out.\n"); - gtk_main_quit(); - return FALSE; } void TestController::platformRunUntil(bool&, double timeout) { - cancelTimeout(); - if (timeout != m_noTimeout) { - gTimeoutSourceId = g_timeout_add(timeout * 1000, timeoutCallback, 0); - g_source_set_name_by_id(gTimeoutSourceId, "[WebKit] timeoutCallback"); - } - gtk_main(); + if (timeout > 0) { + // FIXME: This conversion is now repeated in several places, it should be moved to a common place in WTF and used everywhere. + auto timeoutDuration = std::chrono::duration<double>(timeout); + auto safeDuration = std::chrono::microseconds::max(); + if (timeoutDuration < safeDuration) + safeDuration = std::chrono::duration_cast<std::chrono::microseconds>(timeoutDuration); + gint64 currentTime = g_get_monotonic_time(); + gint64 targetTime = currentTime + std::min<gint64>(G_MAXINT64 - currentTime, safeDuration.count()); + ASSERT(targetTime >= currentTime); + g_source_set_ready_time(timeoutSource(), targetTime); + } else + g_source_set_ready_time(timeoutSource(), -1); + RunLoop::main().run(); } static char* getEnvironmentVariableAsUTF8String(const char* variableName) @@ -102,9 +118,14 @@ void TestController::platformInitializeContext() { } -void TestController::setHidden(bool) +void TestController::setHidden(bool hidden) { - // FIXME: Need to implement this to test visibilityState. + if (!m_mainWebView) + return; + if (hidden) + gtk_widget_unmap(GTK_WIDGET(m_mainWebView->platformView())); + else + gtk_widget_map(GTK_WIDGET(m_mainWebView->platformView())); } void TestController::runModal(PlatformWebView*) @@ -117,4 +138,20 @@ const char* TestController::platformLibraryPathForTesting() return 0; } +void TestController::platformConfigureViewForTest(const TestInvocation&) +{ + WKPageSetApplicationNameForUserAgent(mainWebView()->page(), WKStringCreateWithUTF8CString("WebKitTestRunnerGTK")); +} + +void TestController::platformResetPreferencesToConsistentValues() +{ + if (!m_mainWebView) + return; + m_mainWebView->dismissAllPopupMenus(); +} + +void TestController::updatePlatformSpecificTestOptionsForTest(TestOptions&, const std::string&) const +{ +} + } // namespace WTR diff --git a/Tools/WebKitTestRunner/gtk/fonts/AHEM____.TTF b/Tools/WebKitTestRunner/gtk/fonts/AHEM____.TTF Binary files differnew file mode 100644 index 000000000..ac81cb031 --- /dev/null +++ b/Tools/WebKitTestRunner/gtk/fonts/AHEM____.TTF diff --git a/Tools/WebKitTestRunner/gtk/fonts/FontWithNoValidEncoding.fon b/Tools/WebKitTestRunner/gtk/fonts/FontWithNoValidEncoding.fon Binary files differnew file mode 100644 index 000000000..8fff7d9c1 --- /dev/null +++ b/Tools/WebKitTestRunner/gtk/fonts/FontWithNoValidEncoding.fon diff --git a/Tools/WebKitTestRunner/gtk/fonts/fonts.conf b/Tools/WebKitTestRunner/gtk/fonts/fonts.conf new file mode 100644 index 000000000..2387e9581 --- /dev/null +++ b/Tools/WebKitTestRunner/gtk/fonts/fonts.conf @@ -0,0 +1,435 @@ +<?xml version="1.0"?> +<!DOCTYPE fontconfig SYSTEM "fonts.dtd"> +<fontconfig> + + <!-- Due to patent (http://freetype.sourceforge.net/patents.html) + issues hinting gives different results depending on the + freetype version of the linux distribution, avoiding hinting + gives more consistent results. When all the distributions + release freetype the 2.4, which enables by default the + hinting method that was patented, we could undo this change + and try the hinting again. --> + <match target="font"> + <edit name="hinting" mode="assign"> + <bool>false</bool> + </edit> + </match> + + <!-- This system may have turned off selection of bitmap fonts, but + we must turn it on again, because we want to be able to test that + bitmap fonts with no valid encodings are *never* selected regardless + of the Fontconfig settings. So force Fontconfig to select our cruddy + bitmap font --> + <selectfont> + <acceptfont> + <pattern> + <patelt name="family"> + <string>FontWithNoValidEncoding</string> + </patelt> + </pattern> + </acceptfont> + </selectfont> + + <!-- The sans-serif font should be Liberation Serif --> + <match target="pattern"> + <test qual="any" name="family"> + <string>serif</string> + </test> + <edit name="family" mode="assign"> + <string>Liberation Serif</string> + </edit> + </match> + <match target="pattern"> + <test qual="any" name="family"> + <string>Times</string> + </test> + <edit name="family" mode="assign"> + <string>Liberation Serif</string> + </edit> + </match> + <match target="pattern"> + <test qual="any" name="family"> + <string>Times New Roman</string> + </test> + <edit name="family" mode="assign"> + <string>Liberation Serif</string> + </edit> + </match> + + <!-- Until we find good fonts to use for cursive and fantasy + just use our serif font. --> + <match target="pattern"> + <test qual="any" name="family"> + <string>cursive</string> + </test> + <edit name="family" mode="assign"> + <string>Liberation Serif</string> + </edit> + </match> + <match target="pattern"> + <test qual="any" name="family"> + <string>fantasy</string> + </test> + <edit name="family" mode="assign"> + <string>Liberation Serif</string> + </edit> + </match> + + <!-- The sans-serif font should be Liberation Sans --> + <match target="pattern"> + <test qual="any" name="family"> + <string>sans serif</string> + </test> + <edit name="family" mode="assign"> + <string>Liberation Sans</string> + </edit> + </match> + <match target="pattern"> + <test qual="any" name="family"> + <string>sans</string> + </test> + <edit name="family" mode="assign"> + <string>Liberation Sans</string> + </edit> + </match> + <!-- We need to ensure that layout tests that use "Helvetica" don't + fall back to the default serif font --> + <match target="pattern"> + <test qual="any" name="family"> + <string>Helvetica</string> + </test> + <edit name="family" mode="assign"> + <string>Liberation Sans</string> + </edit> + </match> + <match target="pattern"> + <test qual="any" name="family"> + <string>Arial</string> + </test> + <edit name="family" mode="assign"> + <string>Liberation Sans</string> + </edit> + </match> + <match target="pattern"> + <test qual="any" name="family"> + <string>Lucida Grande</string> + </test> + <edit name="family" mode="assign"> + <string>Liberation Sans</string> + </edit> + </match> + + <!-- The Monospace font should be Liberation Mono --> + <match target="pattern"> + <test qual="any" name="family"> + <string>monospace</string> + </test> + <edit name="family" mode="assign"> + <string>Liberation Mono</string> + </edit> + </match> + <match target="pattern"> + <test qual="any" name="family"> + <string>mono</string> + </test> + <edit name="family" mode="assign"> + <string>Liberation Mono</string> + </edit> + </match> + <!-- We need to ensure that layout tests that use "Courier", "Courier New", + and "Monaco" (all monospace fonts) don't fall back to the default + serif font --> + <match target="pattern"> + <test qual="any" name="family"> + <string>Courier</string> + </test> + <edit name="family" mode="assign"> + <string>Liberation Mono</string> + </edit> + </match> + <match target="pattern"> + <test qual="any" name="family"> + <string>Courier New</string> + </test> + <edit name="family" mode="assign"> + <string>Liberation Mono</string> + </edit> + </match> + <match target="pattern"> + <test qual="any" name="family"> + <string>Monaco</string> + </test> + <edit name="family" mode="assign"> + <string>Liberation Mono</string> + </edit> + </match> + + <!-- The following hinting specializations are adapted from those in the + Chromium test_shell. We try to duplicate their incredibly thorough + testing here --> + <match target="pattern"> + <test name="family" compare="eq"> + <string>NonAntiAliasedSans</string> + </test> + <edit name="family" mode="assign"> + <string>Liberation Sans</string> + </edit> + <edit name="antialias" mode="assign"> + <bool>false</bool> + </edit> + </match> + + <match target="pattern"> + <test name="family" compare="eq"> + <string>SlightHintedSerif</string> + </test> + <edit name="family" mode="assign"> + <string>Liberation Serif</string> + </edit> + <edit name="hinting" mode="assign"> + <bool>true</bool> + </edit> + <edit name="hintstyle" mode="assign"> + <const>hintslight</const> + </edit> + </match> + + <match target="pattern"> + <test name="family" compare="eq"> + <string>NonHintedSans</string> + </test> + <edit name="family" mode="assign"> + <string>Liberation Sans</string> + </edit> + <!-- These deliberately contradict each other. The 'hinting' preference + should take priority --> + <edit name="hintstyle" mode="assign"> + <const>hintfull</const> + </edit> + <edit name="hinting" mode="assign"> + <bool>false</bool> + </edit> + </match> + + <match target="pattern"> + <test name="family" compare="eq"> + <string>AutohintedSerif</string> + </test> + <edit name="family" mode="assign"> + <string>Liberation Serif</string> + </edit> + <edit name="hinting" mode="assign"> + <bool>true</bool> + </edit> + <edit name="autohint" mode="assign"> + <bool>true</bool> + </edit> + <edit name="hintstyle" mode="assign"> + <const>hintmedium</const> + </edit> + </match> + + <match target="pattern"> + <test name="family" compare="eq"> + <string>HintedSerif</string> + </test> + <edit name="family" mode="assign"> + <string>Liberation Serif</string> + </edit> + <edit name="hinting" mode="assign"> + <bool>true</bool> + </edit> + <edit name="autohint" mode="assign"> + <bool>false</bool> + </edit> + <edit name="hintstyle" mode="assign"> + <const>hintmedium</const> + </edit> + </match> + + <match target="pattern"> + <test name="family" compare="eq"> + <string>FullAndAutoHintedSerif</string> + </test> + <edit name="family" mode="assign"> + <string>Liberation Serif</string> + </edit> + <edit name="hinting" mode="assign"> + <bool>true</bool> + </edit> + <edit name="autohint" mode="assign"> + <bool>true</bool> + </edit> + <edit name="hintstyle" mode="assign"> + <const>hintfull</const> + </edit> + </match> + + <match target="pattern"> + <test name="family" compare="eq"> + <string>SubpixelEnabledSans</string> + </test> + <edit name="family" mode="assign"> + <string>Liberation Sans</string> + </edit> + <edit name="rgba" mode="assign"> + <const>rgb</const> + </edit> + </match> + + <match target="pattern"> + <test name="family" compare="eq"> + <string>SubpixelDisabledSans</string> + </test> + <edit name="family" mode="assign"> + <string>Liberation Sans</string> + </edit> + <edit name="rgba" mode="assign"> + <const>none</const> + </edit> + </match> + + <!-- We need to enable simulated bold to for DejaVu Serif to ensure that we interpret + this property correctly in: platform/gtk/fonts/fontconfig-synthetic-bold.html --> + <match target="font"> + <test qual="any" name="family"> + <string>DejaVu Serif</string> + </test> + <test name="weight" compare="less_eq"> + <const>medium</const> + </test> + <test target="pattern" name="weight" compare="more"> + <const>medium</const> + </test> + <edit name="embolden" mode="assign"> + <bool>true</bool> + </edit> + <edit name="weight" mode="assign"> + <const>bold</const> + </edit> + </match> + + <!-- We need to enable simulated oblique to for DejaVu Serif to ensure that we interpret + this property correctly in: platform/gtk/fonts/fontconfig-synthetic-oblique.html --> + <match target="font"> + <test qual="any" name="family"> + <string>DejaVu Serif</string> + </test> + <test name="slant"> + <const>roman</const> + </test> + <test target="pattern" name="slant" compare="not_eq"> + <const>roman</const> + </test> + <edit name="matrix" mode="assign"> + <times> + <name>matrix</name> + <matrix><double>1</double><double>0.2</double> + <double>0</double><double>1</double> + </matrix> + </times> + </edit> + <edit name="slant" mode="assign"> + <const>oblique</const> + </edit> + <edit name="embeddedbitmap" mode="assign"> + <bool>false</bool> + </edit> + </match> + + <!-- These fonts should be treated as identical by CSS font fallback. --> + <alias binding="same"> + <family>FamilyStrongAliasedToFreeMono</family> + <accept> + <family>FreeMono</family> + </accept> + </alias> + + <!-- These fonts should NOT be treated as identical by CSS font fallback. --> + <alias> + <family>FamilyWeakAliasedToFreeMono</family> + <accept> + <family>FreeMono</family> + </accept> + </alias> + + <!-- If this font doesn't have a family name we are falling back. The fallback + font will certainly be one of the DejaVu fonts that we have in our + collection since they have a wide range of characters. Fontconfig might + choose DejaVu Sans or DejaVu Serif depending on the system, so we force + the use of DejaVu Sans in these situations to maintain consistency. --> + <match target="pattern"> + <test qual="all" name="family" compare="eq"> + <string></string> + </test> + <edit name="family" mode="append_last"> + <string>DejaVu Sans</string> + </edit> + </match> + + <config> + <!-- These are the default Unicode chars that are expected to be blank + in fonts. All other blank chars are assumed to be broken and won't + appear in the resulting charsets --> + <blank> + <int>0x0020</int> <!-- SPACE --> + <int>0x00A0</int> <!-- NO-BREAK SPACE --> + <int>0x00AD</int> <!-- SOFT HYPHEN --> + <int>0x034F</int> <!-- COMBINING GRAPHEME JOINER --> + <int>0x0600</int> <!-- ARABIC NUMBER SIGN --> + <int>0x0601</int> <!-- ARABIC SIGN SANAH --> + <int>0x0602</int> <!-- ARABIC FOOTNOTE MARKER --> + <int>0x0603</int> <!-- ARABIC SIGN SAFHA --> + <int>0x06DD</int> <!-- ARABIC END OF AYAH --> + <int>0x070F</int> <!-- SYRIAC ABBREVIATION MARK --> + <int>0x115F</int> <!-- HANGUL CHOSEONG FILLER --> + <int>0x1160</int> <!-- HANGUL JUNGSEONG FILLER --> + <int>0x1680</int> <!-- OGHAM SPACE MARK --> + <int>0x17B4</int> <!-- KHMER VOWEL INHERENT AQ --> + <int>0x17B5</int> <!-- KHMER VOWEL INHERENT AA --> + <int>0x180E</int> <!-- MONGOLIAN VOWEL SEPARATOR --> + <int>0x2000</int> <!-- EN QUAD --> + <int>0x2001</int> <!-- EM QUAD --> + <int>0x2002</int> <!-- EN SPACE --> + <int>0x2003</int> <!-- EM SPACE --> + <int>0x2004</int> <!-- THREE-PER-EM SPACE --> + <int>0x2005</int> <!-- FOUR-PER-EM SPACE --> + <int>0x2006</int> <!-- SIX-PER-EM SPACE --> + <int>0x2007</int> <!-- FIGURE SPACE --> + <int>0x2008</int> <!-- PUNCTUATION SPACE --> + <int>0x2009</int> <!-- THIN SPACE --> + <int>0x200A</int> <!-- HAIR SPACE --> + <int>0x200B</int> <!-- ZERO WIDTH SPACE --> + <int>0x200C</int> <!-- ZERO WIDTH NON-JOINER --> + <int>0x200D</int> <!-- ZERO WIDTH JOINER --> + <int>0x200E</int> <!-- LEFT-TO-RIGHT MARK --> + <int>0x200F</int> <!-- RIGHT-TO-LEFT MARK --> + <int>0x2028</int> <!-- LINE SEPARATOR --> + <int>0x2029</int> <!-- PARAGRAPH SEPARATOR --> + <int>0x202A</int> <!-- LEFT-TO-RIGHT EMBEDDING --> + <int>0x202B</int> <!-- RIGHT-TO-LEFT EMBEDDING --> + <int>0x202C</int> <!-- POP DIRECTIONAL FORMATTING --> + <int>0x202D</int> <!-- LEFT-TO-RIGHT override --> + <int>0x202E</int> <!-- RIGHT-TO-LEFT override --> + <int>0x202F</int> <!-- NARROW NO-BREAK SPACE --> + <int>0x205F</int> <!-- MEDIUM MATHEMATICAL SPACE --> + <int>0x2060</int> <!-- WORD JOINER --> + <int>0x2061</int> <!-- FUNCTION APPLICATION --> + <int>0x2062</int> <!-- INVISIBLE TIMES --> + <int>0x2063</int> <!-- INVISIBLE SEPARATOR --> + <int>0x206A</int> <!-- INHIBIT SYMMETRIC SWAPPING --> + <int>0x206B</int> <!-- ACTIVATE SYMMETRIC SWAPPING --> + <int>0x206C</int> <!-- INHIBIT ARABIC FORM SHAPING --> + <int>0x206D</int> <!-- ACTIVATE ARABIC FORM SHAPING --> + <int>0x206E</int> <!-- NATIONAL DIGIT SHAPES --> + <int>0x206F</int> <!-- NOMINAL DIGIT SHAPES --> + <int>0x3000</int> <!-- IDEOGRAPHIC SPACE --> + <int>0x3164</int> <!-- HANGUL FILLER --> + <int>0xFEFF</int> <!-- ZERO WIDTH NO-BREAK SPACE --> + <int>0xFFA0</int> <!-- HALFWIDTH HANGUL FILLER --> + <int>0xFFF9</int> <!-- INTERLINEAR ANNOTATION ANCHOR --> + <int>0xFFFA</int> <!-- INTERLINEAR ANNOTATION SEPARATOR --> + <int>0xFFFB</int> <!-- INTERLINEAR ANNOTATION TERMINATOR --> + </blank> + </config> +</fontconfig> diff --git a/Tools/WebKitTestRunner/gtk/main.cpp b/Tools/WebKitTestRunner/gtk/main.cpp index d53c6248a..7947ce55c 100644 --- a/Tools/WebKitTestRunner/gtk/main.cpp +++ b/Tools/WebKitTestRunner/gtk/main.cpp @@ -26,12 +26,21 @@ #include "config.h" #include "TestController.h" +#include <WebKit/WKTextCheckerGtk.h> #include <gtk/gtk.h> +#include <wtf/glib/GRefPtr.h> int main(int argc, char** argv) { gtk_init(&argc, &argv); + + GRefPtr<GPtrArray> languages = adoptGRef(g_ptr_array_new()); + g_ptr_array_add(languages.get(), const_cast<gpointer>(static_cast<const void*>("en_US"))); + g_ptr_array_add(languages.get(), nullptr); + WKTextCheckerSetSpellCheckingLanguages(reinterpret_cast<const char* const*>(languages->pdata)); + // Prefer the not installed web and plugin processes. WTR::TestController controller(argc, const_cast<const char**>(argv)); + return 0; } |