summaryrefslogtreecommitdiffstats
path: root/WebKitTools/DumpRenderTree/gtk/EventSender.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'WebKitTools/DumpRenderTree/gtk/EventSender.cpp')
-rw-r--r--WebKitTools/DumpRenderTree/gtk/EventSender.cpp42
1 files changed, 37 insertions, 5 deletions
diff --git a/WebKitTools/DumpRenderTree/gtk/EventSender.cpp b/WebKitTools/DumpRenderTree/gtk/EventSender.cpp
index 63a4b81..fc118bc 100644
--- a/WebKitTools/DumpRenderTree/gtk/EventSender.cpp
+++ b/WebKitTools/DumpRenderTree/gtk/EventSender.cpp
@@ -110,7 +110,7 @@ static JSValueRef leapForwardCallback(JSContextRef context, JSObjectRef function
return JSValueMakeUndefined(context);
}
-bool prepareMouseButtonEvent(GdkEvent* event, int eventSenderButtonNumber)
+bool prepareMouseButtonEvent(GdkEvent* event, int eventSenderButtonNumber, guint modifiers)
{
WebKitWebView* view = webkit_web_frame_get_web_view(mainFrame);
if (!view)
@@ -133,7 +133,7 @@ bool prepareMouseButtonEvent(GdkEvent* event, int eventSenderButtonNumber)
event->button.window = gtk_widget_get_window(GTK_WIDGET(view));
g_object_ref(event->button.window);
event->button.device = getDefaultGDKPointerDevice(event->button.window);
- event->button.state = getStateFlags();
+ event->button.state = modifiers | getStateFlags();
event->button.time = GDK_CURRENT_TIME;
event->button.axes = 0;
@@ -148,7 +148,7 @@ bool prepareMouseButtonEvent(GdkEvent* event, int eventSenderButtonNumber)
static JSValueRef contextClickCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
{
GdkEvent* pressEvent = gdk_event_new(GDK_BUTTON_PRESS);
- if (!prepareMouseButtonEvent(pressEvent, 2))
+ if (!prepareMouseButtonEvent(pressEvent, 2, 0))
return JSValueMakeUndefined(context);
GdkEvent* releaseEvent = gdk_event_copy(pressEvent);
@@ -170,6 +170,36 @@ static void updateClickCount(int button)
clickCount++;
}
+static guint gdkModifersFromJSValue(JSContextRef context, const JSValueRef modifiers)
+{
+ JSObjectRef modifiersArray = JSValueToObject(context, modifiers, 0);
+ if (!modifiersArray)
+ return 0;
+
+ guint gdkModifiers = 0;
+ int modifiersCount = JSValueToNumber(context, JSObjectGetProperty(context, modifiersArray, JSStringCreateWithUTF8CString("length"), 0), 0);
+ for (int i = 0; i < modifiersCount; ++i) {
+ JSValueRef value = JSObjectGetPropertyAtIndex(context, modifiersArray, i, 0);
+ JSStringRef string = JSValueToStringCopy(context, value, 0);
+ if (JSStringIsEqualToUTF8CString(string, "ctrlKey")
+ || JSStringIsEqualToUTF8CString(string, "addSelectionKey"))
+ gdkModifiers |= GDK_CONTROL_MASK;
+ else if (JSStringIsEqualToUTF8CString(string, "shiftKey")
+ || JSStringIsEqualToUTF8CString(string, "rangeSelectionKey"))
+ gdkModifiers |= GDK_SHIFT_MASK;
+ else if (JSStringIsEqualToUTF8CString(string, "altKey"))
+ gdkModifiers |= GDK_MOD1_MASK;
+
+ // Currently the metaKey as defined in WebCore/platform/gtk/MouseEventGtk.cpp
+ // is GDK_MOD2_MASK. This code must be kept in sync with that file.
+ else if (JSStringIsEqualToUTF8CString(string, "metaKey"))
+ gdkModifiers |= GDK_MOD2_MASK;
+
+ JSStringRelease(string);
+ }
+ return gdkModifiers;
+}
+
static JSValueRef mouseDownCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
{
int button = 0;
@@ -177,9 +207,10 @@ static JSValueRef mouseDownCallback(JSContextRef context, JSObjectRef function,
button = static_cast<int>(JSValueToNumber(context, arguments[0], exception));
g_return_val_if_fail((!exception || !*exception), JSValueMakeUndefined(context));
}
+ guint modifiers = argumentCount >= 2 ? gdkModifersFromJSValue(context, arguments[1]) : 0;
GdkEvent* event = gdk_event_new(GDK_BUTTON_PRESS);
- if (!prepareMouseButtonEvent(event, button))
+ if (!prepareMouseButtonEvent(event, button, modifiers))
return JSValueMakeUndefined(context);
buttonCurrentlyDown = event->button.button;
@@ -220,9 +251,10 @@ static JSValueRef mouseUpCallback(JSContextRef context, JSObjectRef function, JS
button = static_cast<int>(JSValueToNumber(context, arguments[0], exception));
g_return_val_if_fail((!exception || !*exception), JSValueMakeUndefined(context));
}
+ guint modifiers = argumentCount >= 2 ? gdkModifersFromJSValue(context, arguments[1]) : 0;
GdkEvent* event = gdk_event_new(GDK_BUTTON_RELEASE);
- if (!prepareMouseButtonEvent(event, button))
+ if (!prepareMouseButtonEvent(event, button, modifiers))
return JSValueMakeUndefined(context);
lastClickPositionX = lastMousePositionX;