Diff
Modified: trunk/Source/WebKit/ChangeLog (221418 => 221419)
--- trunk/Source/WebKit/ChangeLog 2017-08-31 12:57:51 UTC (rev 221418)
+++ trunk/Source/WebKit/ChangeLog 2017-08-31 14:07:11 UTC (rev 221419)
@@ -1,3 +1,19 @@
+2017-08-31 Carlos Garcia Campos <cgar...@igalia.com>
+
+ [GTK][Wayland] Crash when gdk_keymap_get_entries_for_keyval returns TRUE but n_keys=0
+ https://bugs.webkit.org/show_bug.cgi?id=176154
+
+ Reviewed by Carlos Alberto Lopez Perez.
+
+ In Wayland gdk_keymap_get_entries_for_keyval() can return TRUE with n_keys=0. We have several places in WebKit
+ where we just check the return value of gdk_keymap_get_entries_for_keyval() and then use the returned array to
+ get the first position assuming it has at least one item. This has always worked in X11 because the GDK X11
+ backend does the right thing, but it's crashing in Wayland now. It should be fixed in GTK+ but in the meantime
+ it's easy to workaround by also checking n_keys > 0.
+
+ * UIProcess/Automation/gtk/WebAutomationSessionGtk.cpp:
+ (WebKit::doKeyStrokeEvent):
+
2017-08-30 Dan Bernstein <m...@apple.com>
[iOS] REGRESSION (r218144) -[WKContentView targetForAction:withSender:] returns the content view for actions implemented only by the WKWebView, causing a crash
Modified: trunk/Source/WebKit/UIProcess/Automation/gtk/WebAutomationSessionGtk.cpp (221418 => 221419)
--- trunk/Source/WebKit/UIProcess/Automation/gtk/WebAutomationSessionGtk.cpp 2017-08-31 12:57:51 UTC (rev 221418)
+++ trunk/Source/WebKit/UIProcess/Automation/gtk/WebAutomationSessionGtk.cpp 2017-08-31 14:07:11 UTC (rev 221419)
@@ -145,7 +145,7 @@
// When synthesizing an event, an invalid hardware_keycode value can cause it to be badly processed by GTK+.
GUniqueOutPtr<GdkKeymapKey> keys;
int keysCount;
- if (gdk_keymap_get_entries_for_keyval(gdk_keymap_get_default(), keyVal, &keys.outPtr(), &keysCount))
+ if (gdk_keymap_get_entries_for_keyval(gdk_keymap_get_default(), keyVal, &keys.outPtr(), &keysCount) && keysCount)
event->key.hardware_keycode = keys.get()[0].keycode;
gtk_main_do_event(event.get());
Modified: trunk/Tools/ChangeLog (221418 => 221419)
--- trunk/Tools/ChangeLog 2017-08-31 12:57:51 UTC (rev 221418)
+++ trunk/Tools/ChangeLog 2017-08-31 14:07:11 UTC (rev 221419)
@@ -1,5 +1,24 @@
2017-08-31 Carlos Garcia Campos <cgar...@igalia.com>
+ [GTK][Wayland] Crash when gdk_keymap_get_entries_for_keyval returns TRUE but n_keys=0
+ https://bugs.webkit.org/show_bug.cgi?id=176154
+
+ Reviewed by Carlos Alberto Lopez Perez.
+
+ Also check the n_keys > 0 when using gdk_keymap_get_entries_for_keyval().
+
+ * TestWebKitAPI/Tests/WebKit/gtk/InputMethodFilter.cpp:
+ (TestWebKitAPI::TestInputMethodFilter::sendKeyEventToFilter):
+ * TestWebKitAPI/Tests/WebKitGtk/TestPrinting.cpp: Remove duplicated code and use WebViewTest::keyStroke instead.
+ * TestWebKitAPI/glib/WebKitGLib/gtk/WebViewTestGtk.cpp:
+ (WebViewTest::keyStroke):
+ * TestWebKitAPI/gtk/PlatformWebViewGtk.cpp:
+ (TestWebKitAPI::doKeyStroke):
+ * WebKitTestRunner/gtk/EventSenderProxyGtk.cpp:
+ (WTR::EventSenderProxy::keyDown):
+
+2017-08-31 Carlos Garcia Campos <cgar...@igalia.com>
+
Unreviewed. Fix GTK+ test /webkit2/WebKitAutomationSession/request-session.
It fails when comparing the browser version if micro version is 0 (or if both micro and minor are 0 too).
Modified: trunk/Tools/TestWebKitAPI/Tests/WebKit/gtk/InputMethodFilter.cpp (221418 => 221419)
--- trunk/Tools/TestWebKitAPI/Tests/WebKit/gtk/InputMethodFilter.cpp 2017-08-31 12:57:51 UTC (rev 221418)
+++ trunk/Tools/TestWebKitAPI/Tests/WebKit/gtk/InputMethodFilter.cpp 2017-08-31 14:07:11 UTC (rev 221419)
@@ -67,7 +67,7 @@
GUniqueOutPtr<GdkKeymapKey> keys;
gint nKeys;
- if (gdk_keymap_get_entries_for_keyval(gdk_keymap_get_default(), gdkKeyValue, &keys.outPtr(), &nKeys))
+ if (gdk_keymap_get_entries_for_keyval(gdk_keymap_get_default(), gdkKeyValue, &keys.outPtr(), &nKeys) && nKeys)
event->key.hardware_keycode = keys.get()[0].keycode;
filterKeyEvent(&event->key);
Modified: trunk/Tools/TestWebKitAPI/Tests/WebKitGtk/TestPrinting.cpp (221418 => 221419)
--- trunk/Tools/TestWebKitAPI/Tests/WebKitGtk/TestPrinting.cpp 2017-08-31 12:57:51 UTC (rev 221418)
+++ trunk/Tools/TestWebKitAPI/Tests/WebKitGtk/TestPrinting.cpp 2017-08-31 14:07:11 UTC (rev 221419)
@@ -365,32 +365,6 @@
g_main_loop_quit(m_mainLoop);
}
- void sendKeyEvent(unsigned gdkKeyValue, GdkEventType type, unsigned modifiers)
- {
- GdkEvent* event = gdk_event_new(type);
- event->key.keyval = gdkKeyValue;
- event->key.state = modifiers;
- event->key.window = gtk_widget_get_window(GTK_WIDGET(m_webView));
- event->key.time = GDK_CURRENT_TIME;
- g_object_ref(event->key.window);
- gdk_event_set_device(event, gdk_device_manager_get_client_pointer(gdk_display_get_device_manager(gdk_display_get_default())));
-
- GUniqueOutPtr<GdkKeymapKey> keys;
- gint nKeys;
- if (gdk_keymap_get_entries_for_keyval(gdk_keymap_get_default(), gdkKeyValue, &keys.outPtr(), &nKeys))
- event->key.hardware_keycode = keys.get()[0].keycode;
-
- gtk_main_do_event(event);
-
- gdk_event_free(event);
- }
-
- void sendKeyPressAndReleaseEvent(unsigned gdkKeyValue, unsigned modifiers = 0)
- {
- sendKeyEvent(gdkKeyValue, GDK_KEY_PRESS, modifiers);
- sendKeyEvent(gdkKeyValue, GDK_KEY_RELEASE, modifiers);
- }
-
void createWebKitPrintOperation()
{
m_printOperation = adoptGRef(webkit_print_operation_new(m_webView));
@@ -410,7 +384,7 @@
void startPrinting()
{
// To start printing it is enough to press the Return key
- sendKeyPressAndReleaseEvent(GDK_KEY_Return);
+ keyStroke(GDK_KEY_Return);
}
void jumpToFirstPrinter()
@@ -417,16 +391,16 @@
{
// Initially the GtkNotebook has focus, so we just need to press the Tab
// key to jump to the first printer
- sendKeyPressAndReleaseEvent(GDK_KEY_Tab);
+ keyStroke(GDK_KEY_Tab);
}
void jumpToCustomWidget()
{
// Jump back to the GtkNotebook
- sendKeyPressAndReleaseEvent(GDK_KEY_Tab, GDK_SHIFT_MASK);
+ keyStroke(GDK_KEY_Tab, GDK_SHIFT_MASK);
// Custom widget is on the third tab
- sendKeyPressAndReleaseEvent(GDK_KEY_Right);
- sendKeyPressAndReleaseEvent(GDK_KEY_Right);
+ keyStroke(GDK_KEY_Right);
+ keyStroke(GDK_KEY_Right);
}
void openDialogMoveThroughItAndWaitUntilClosed()
Modified: trunk/Tools/TestWebKitAPI/glib/WebKitGLib/gtk/WebViewTestGtk.cpp (221418 => 221419)
--- trunk/Tools/TestWebKitAPI/glib/WebKitGLib/gtk/WebViewTestGtk.cpp 2017-08-31 12:57:51 UTC (rev 221418)
+++ trunk/Tools/TestWebKitAPI/glib/WebKitGLib/gtk/WebViewTestGtk.cpp 2017-08-31 14:07:11 UTC (rev 221419)
@@ -148,7 +148,7 @@
// When synthesizing an event, an invalid hardware_keycode value can cause it to be badly processed by GTK+.
GUniqueOutPtr<GdkKeymapKey> keys;
int keysCount;
- if (gdk_keymap_get_entries_for_keyval(gdk_keymap_get_default(), keyVal, &keys.outPtr(), &keysCount))
+ if (gdk_keymap_get_entries_for_keyval(gdk_keymap_get_default(), keyVal, &keys.outPtr(), &keysCount) && keysCount)
event->key.hardware_keycode = keys.get()[0].keycode;
gtk_main_do_event(event.get());
Modified: trunk/Tools/TestWebKitAPI/gtk/PlatformWebViewGtk.cpp (221418 => 221419)
--- trunk/Tools/TestWebKitAPI/gtk/PlatformWebViewGtk.cpp 2017-08-31 12:57:51 UTC (rev 221418)
+++ trunk/Tools/TestWebKitAPI/gtk/PlatformWebViewGtk.cpp 2017-08-31 14:07:11 UTC (rev 221419)
@@ -95,7 +95,7 @@
// When synthesizing an event, an invalid hardware_keycode value can cause it to be badly processed by GTK+.
GUniqueOutPtr<GdkKeymapKey> keys;
int keysCount;
- if (gdk_keymap_get_entries_for_keyval(gdk_keymap_get_default(), keyVal, &keys.outPtr(), &keysCount))
+ if (gdk_keymap_get_entries_for_keyval(gdk_keymap_get_default(), keyVal, &keys.outPtr(), &keysCount) && keysCount)
event->key.hardware_keycode = keys.get()[0].keycode;
gtk_main_do_event(event.get());
Modified: trunk/Tools/WebKitTestRunner/gtk/EventSenderProxyGtk.cpp (221418 => 221419)
--- trunk/Tools/WebKitTestRunner/gtk/EventSenderProxyGtk.cpp 2017-08-31 12:57:51 UTC (rev 221418)
+++ trunk/Tools/WebKitTestRunner/gtk/EventSenderProxyGtk.cpp 2017-08-31 14:07:11 UTC (rev 221419)
@@ -315,7 +315,7 @@
GUniqueOutPtr<GdkKeymapKey> keys;
gint nKeys;
- if (gdk_keymap_get_entries_for_keyval(gdk_keymap_get_default(), gdkKeySym, &keys.outPtr(), &nKeys))
+ if (gdk_keymap_get_entries_for_keyval(gdk_keymap_get_default(), gdkKeySym, &keys.outPtr(), &nKeys) && nKeys)
pressEvent->key.hardware_keycode = keys.get()[0].keycode;
GdkEvent* releaseEvent = gdk_event_copy(pressEvent);