diff options
Diffstat (limited to 'Tools/WebKitTestRunner/InjectedBundle/EventSendingController.cpp')
-rw-r--r-- | Tools/WebKitTestRunner/InjectedBundle/EventSendingController.cpp | 332 |
1 files changed, 277 insertions, 55 deletions
diff --git a/Tools/WebKitTestRunner/InjectedBundle/EventSendingController.cpp b/Tools/WebKitTestRunner/InjectedBundle/EventSendingController.cpp index 65e355652..6bd165288 100644 --- a/Tools/WebKitTestRunner/InjectedBundle/EventSendingController.cpp +++ b/Tools/WebKitTestRunner/InjectedBundle/EventSendingController.cpp @@ -1,5 +1,5 @@ /* - * Copyright (C) 2010, 2011 Apple Inc. All rights reserved. + * Copyright (C) 2010, 2011, 2014-2015 Apple Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -30,13 +30,13 @@ #include "InjectedBundlePage.h" #include "JSEventSendingController.h" #include "StringFunctions.h" -#include <WebKit2/WKBundle.h> -#include <WebKit2/WKBundleFrame.h> -#include <WebKit2/WKBundlePagePrivate.h> -#include <WebKit2/WKBundlePrivate.h> -#include <WebKit2/WKContextMenuItem.h> -#include <WebKit2/WKMutableDictionary.h> -#include <WebKit2/WKNumber.h> +#include <WebKit/WKBundle.h> +#include <WebKit/WKBundleFrame.h> +#include <WebKit/WKBundlePagePrivate.h> +#include <WebKit/WKBundlePrivate.h> +#include <WebKit/WKContextMenuItem.h> +#include <WebKit/WKMutableDictionary.h> +#include <WebKit/WKNumber.h> #include <wtf/StdLibExtras.h> namespace WTR { @@ -116,6 +116,8 @@ static WKEventModifiers parseModifier(JSStringRef modifier) return kWKEventModifiersAltKey; if (JSStringIsEqualToUTF8CString(modifier, "metaKey")) return kWKEventModifiersMetaKey; + if (JSStringIsEqualToUTF8CString(modifier, "capsLockKey")) + return kWKEventModifiersCapsLockKey; if (JSStringIsEqualToUTF8CString(modifier, "addSelectionKey")) { #if OS(MAC_OS_X) return kWKEventModifiersMetaKey; @@ -164,9 +166,9 @@ static WKEventModifiers parseModifierArray(JSContextRef context, JSValueRef arra return modifiers; } -PassRefPtr<EventSendingController> EventSendingController::create() +Ref<EventSendingController> EventSendingController::create() { - return adoptRef(new EventSendingController); + return adoptRef(*new EventSendingController); } EventSendingController::EventSendingController() @@ -208,7 +210,8 @@ static WKMutableDictionaryRef createMouseMessageBody(MouseState state, int butto void EventSendingController::mouseDown(int button, JSValueRef modifierArray) { - WKBundlePageRef page = InjectedBundle::shared().page()->page(); + auto& injectedBundle = InjectedBundle::singleton(); + WKBundlePageRef page = injectedBundle.page()->page(); WKBundleFrameRef frame = WKBundlePageGetMainFrame(page); JSContextRef context = WKBundleFrameGetJavaScriptContext(frame); WKEventModifiers modifiers = parseModifierArray(context, modifierArray); @@ -216,12 +219,12 @@ void EventSendingController::mouseDown(int button, JSValueRef modifierArray) WKRetainPtr<WKStringRef> EventSenderMessageName(AdoptWK, WKStringCreateWithUTF8CString("EventSender")); WKRetainPtr<WKMutableDictionaryRef> EventSenderMessageBody(AdoptWK, createMouseMessageBody(MouseDown, button, modifiers)); - WKBundlePostSynchronousMessage(InjectedBundle::shared().bundle(), EventSenderMessageName.get(), EventSenderMessageBody.get(), 0); + WKBundlePagePostSynchronousMessageForTesting(page, EventSenderMessageName.get(), EventSenderMessageBody.get(), 0); } void EventSendingController::mouseUp(int button, JSValueRef modifierArray) { - WKBundlePageRef page = InjectedBundle::shared().page()->page(); + WKBundlePageRef page = InjectedBundle::singleton().page()->page(); WKBundleFrameRef frame = WKBundlePageGetMainFrame(page); JSContextRef context = WKBundleFrameGetJavaScriptContext(frame); WKEventModifiers modifiers = parseModifierArray(context, modifierArray); @@ -229,7 +232,7 @@ void EventSendingController::mouseUp(int button, JSValueRef modifierArray) WKRetainPtr<WKStringRef> EventSenderMessageName(AdoptWK, WKStringCreateWithUTF8CString("EventSender")); WKRetainPtr<WKMutableDictionaryRef> EventSenderMessageBody(AdoptWK, createMouseMessageBody(MouseUp, button, modifiers)); - WKBundlePostSynchronousMessage(InjectedBundle::shared().bundle(), EventSenderMessageName.get(), EventSenderMessageBody.get(), 0); + WKBundlePagePostSynchronousMessageForTesting(InjectedBundle::singleton().page()->page(), EventSenderMessageName.get(), EventSenderMessageBody.get(), 0); } void EventSendingController::mouseMoveTo(int x, int y) @@ -249,7 +252,73 @@ void EventSendingController::mouseMoveTo(int x, int y) WKRetainPtr<WKDoubleRef> yRef(AdoptWK, WKDoubleCreate(y)); WKDictionarySetItem(EventSenderMessageBody.get(), yKey.get(), yRef.get()); - WKBundlePostSynchronousMessage(InjectedBundle::shared().bundle(), EventSenderMessageName.get(), EventSenderMessageBody.get(), 0); + m_position = WKPointMake(x, y); + + WKBundlePagePostSynchronousMessageForTesting(InjectedBundle::singleton().page()->page(), EventSenderMessageName.get(), EventSenderMessageBody.get(), 0); +} + +void EventSendingController::mouseForceClick() +{ + WKRetainPtr<WKStringRef> EventSenderMessageName(AdoptWK, WKStringCreateWithUTF8CString("EventSender")); + WKRetainPtr<WKMutableDictionaryRef> EventSenderMessageBody(AdoptWK, WKMutableDictionaryCreate()); + + WKRetainPtr<WKStringRef> subMessageKey(AdoptWK, WKStringCreateWithUTF8CString("SubMessage")); + WKRetainPtr<WKStringRef> subMessageName(AdoptWK, WKStringCreateWithUTF8CString("MouseForceClick")); + WKDictionarySetItem(EventSenderMessageBody.get(), subMessageKey.get(), subMessageName.get()); + + WKBundlePagePostSynchronousMessageForTesting(InjectedBundle::singleton().page()->page(), EventSenderMessageName.get(), EventSenderMessageBody.get(), 0); +} + +void EventSendingController::startAndCancelMouseForceClick() +{ + WKRetainPtr<WKStringRef> EventSenderMessageName(AdoptWK, WKStringCreateWithUTF8CString("EventSender")); + WKRetainPtr<WKMutableDictionaryRef> EventSenderMessageBody(AdoptWK, WKMutableDictionaryCreate()); + + WKRetainPtr<WKStringRef> subMessageKey(AdoptWK, WKStringCreateWithUTF8CString("SubMessage")); + WKRetainPtr<WKStringRef> subMessageName(AdoptWK, WKStringCreateWithUTF8CString("StartAndCancelMouseForceClick")); + WKDictionarySetItem(EventSenderMessageBody.get(), subMessageKey.get(), subMessageName.get()); + + WKBundlePagePostSynchronousMessageForTesting(InjectedBundle::singleton().page()->page(), EventSenderMessageName.get(), EventSenderMessageBody.get(), 0); +} + +void EventSendingController::mouseForceDown() +{ + WKRetainPtr<WKStringRef> EventSenderMessageName(AdoptWK, WKStringCreateWithUTF8CString("EventSender")); + WKRetainPtr<WKMutableDictionaryRef> EventSenderMessageBody(AdoptWK, WKMutableDictionaryCreate()); + + WKRetainPtr<WKStringRef> subMessageKey(AdoptWK, WKStringCreateWithUTF8CString("SubMessage")); + WKRetainPtr<WKStringRef> subMessageName(AdoptWK, WKStringCreateWithUTF8CString("MouseForceDown")); + WKDictionarySetItem(EventSenderMessageBody.get(), subMessageKey.get(), subMessageName.get()); + + WKBundlePagePostSynchronousMessageForTesting(InjectedBundle::singleton().page()->page(), EventSenderMessageName.get(), EventSenderMessageBody.get(), 0); +} + +void EventSendingController::mouseForceUp() +{ + WKRetainPtr<WKStringRef> EventSenderMessageName(AdoptWK, WKStringCreateWithUTF8CString("EventSender")); + WKRetainPtr<WKMutableDictionaryRef> EventSenderMessageBody(AdoptWK, WKMutableDictionaryCreate()); + + WKRetainPtr<WKStringRef> subMessageKey(AdoptWK, WKStringCreateWithUTF8CString("SubMessage")); + WKRetainPtr<WKStringRef> subMessageName(AdoptWK, WKStringCreateWithUTF8CString("MouseForceUp")); + WKDictionarySetItem(EventSenderMessageBody.get(), subMessageKey.get(), subMessageName.get()); + + WKBundlePagePostSynchronousMessageForTesting(InjectedBundle::singleton().page()->page(), EventSenderMessageName.get(), EventSenderMessageBody.get(), 0); +} + +void EventSendingController::mouseForceChanged(double force) +{ + WKRetainPtr<WKStringRef> EventSenderMessageName(AdoptWK, WKStringCreateWithUTF8CString("EventSender")); + WKRetainPtr<WKMutableDictionaryRef> EventSenderMessageBody(AdoptWK, WKMutableDictionaryCreate()); + + WKRetainPtr<WKStringRef> subMessageKey(AdoptWK, WKStringCreateWithUTF8CString("SubMessage")); + WKRetainPtr<WKStringRef> subMessageName(AdoptWK, WKStringCreateWithUTF8CString("MouseForceChanged")); + WKDictionarySetItem(EventSenderMessageBody.get(), subMessageKey.get(), subMessageName.get()); + + WKRetainPtr<WKStringRef> forceKey(AdoptWK, WKStringCreateWithUTF8CString("Force")); + WKRetainPtr<WKDoubleRef> forceRef(AdoptWK, WKDoubleCreate(force)); + WKDictionarySetItem(EventSenderMessageBody.get(), forceKey.get(), forceRef.get()); + + WKBundlePagePostSynchronousMessageForTesting(InjectedBundle::singleton().page()->page(), EventSenderMessageName.get(), EventSenderMessageBody.get(), 0); } void EventSendingController::leapForward(int milliseconds) @@ -265,7 +334,7 @@ void EventSendingController::leapForward(int milliseconds) WKRetainPtr<WKUInt64Ref> timeRef(AdoptWK, WKUInt64Create(milliseconds)); WKDictionarySetItem(EventSenderMessageBody.get(), timeKey.get(), timeRef.get()); - WKBundlePostSynchronousMessage(InjectedBundle::shared().bundle(), EventSenderMessageName.get(), EventSenderMessageBody.get(), 0); + WKBundlePagePostSynchronousMessageForTesting(InjectedBundle::singleton().page()->page(), EventSenderMessageName.get(), EventSenderMessageBody.get(), 0); } void EventSendingController::scheduleAsynchronousClick() @@ -277,11 +346,11 @@ void EventSendingController::scheduleAsynchronousClick() // Asynchronous mouse down. WKRetainPtr<WKMutableDictionaryRef> mouseDownMessageBody(AdoptWK, createMouseMessageBody(MouseDown, button, modifiers)); - WKBundlePostMessage(InjectedBundle::shared().bundle(), EventSenderMessageName.get(), mouseDownMessageBody.get()); + WKBundlePagePostMessage(InjectedBundle::singleton().page()->page(), EventSenderMessageName.get(), mouseDownMessageBody.get()); // Asynchronous mouse up. WKRetainPtr<WKMutableDictionaryRef> mouseUpMessageBody(AdoptWK, createMouseMessageBody(MouseUp, button, modifiers)); - WKBundlePostMessage(InjectedBundle::shared().bundle(), EventSenderMessageName.get(), mouseUpMessageBody.get()); + WKBundlePagePostMessage(InjectedBundle::singleton().page()->page(), EventSenderMessageName.get(), mouseUpMessageBody.get()); } static WKRetainPtr<WKMutableDictionaryRef> createKeyDownMessageBody(JSStringRef key, WKEventModifiers modifiers, int location) @@ -308,7 +377,7 @@ static WKRetainPtr<WKMutableDictionaryRef> createKeyDownMessageBody(JSStringRef void EventSendingController::keyDown(JSStringRef key, JSValueRef modifierArray, int location) { - WKBundlePageRef page = InjectedBundle::shared().page()->page(); + WKBundlePageRef page = InjectedBundle::singleton().page()->page(); WKBundleFrameRef frame = WKBundlePageGetMainFrame(page); JSContextRef context = WKBundleFrameGetJavaScriptContext(frame); WKEventModifiers modifiers = parseModifierArray(context, modifierArray); @@ -316,7 +385,7 @@ void EventSendingController::keyDown(JSStringRef key, JSValueRef modifierArray, WKRetainPtr<WKStringRef> EventSenderMessageName(AdoptWK, WKStringCreateWithUTF8CString("EventSender")); WKRetainPtr<WKMutableDictionaryRef> keyDownMessageBody = createKeyDownMessageBody(key, modifiers, location); - WKBundlePostSynchronousMessage(InjectedBundle::shared().bundle(), EventSenderMessageName.get(), keyDownMessageBody.get(), 0); + WKBundlePagePostSynchronousMessageForTesting(InjectedBundle::singleton().page()->page(), EventSenderMessageName.get(), keyDownMessageBody.get(), 0); } void EventSendingController::scheduleAsynchronousKeyDown(JSStringRef key) @@ -324,7 +393,7 @@ void EventSendingController::scheduleAsynchronousKeyDown(JSStringRef key) WKRetainPtr<WKStringRef> EventSenderMessageName(AdoptWK, WKStringCreateWithUTF8CString("EventSender")); WKRetainPtr<WKMutableDictionaryRef> keyDownMessageBody = createKeyDownMessageBody(key, 0 /* modifiers */, 0 /* location */); - WKBundlePostMessage(InjectedBundle::shared().bundle(), EventSenderMessageName.get(), keyDownMessageBody.get()); + WKBundlePagePostMessage(InjectedBundle::singleton().page()->page(), EventSenderMessageName.get(), keyDownMessageBody.get()); } void EventSendingController::mouseScrollBy(int x, int y) @@ -344,7 +413,106 @@ void EventSendingController::mouseScrollBy(int x, int y) WKRetainPtr<WKDoubleRef> yRef(AdoptWK, WKDoubleCreate(y)); WKDictionarySetItem(EventSenderMessageBody.get(), yKey.get(), yRef.get()); - WKBundlePostSynchronousMessage(InjectedBundle::shared().bundle(), EventSenderMessageName.get(), EventSenderMessageBody.get(), 0); + WKBundlePageForceRepaint(InjectedBundle::singleton().page()->page()); // Triggers a scrolling tree commit. + WKBundlePagePostMessage(InjectedBundle::singleton().page()->page(), EventSenderMessageName.get(), EventSenderMessageBody.get()); +} + +static uint64_t cgEventPhaseFromString(JSStringRef phaseStr) +{ + if (JSStringIsEqualToUTF8CString(phaseStr, "none")) + return 0; + if (JSStringIsEqualToUTF8CString(phaseStr, "began")) + return 1; // kCGScrollPhaseBegan + if (JSStringIsEqualToUTF8CString(phaseStr, "changed")) + return 2; // kCGScrollPhaseChanged + if (JSStringIsEqualToUTF8CString(phaseStr, "ended")) + return 4; // kCGScrollPhaseEnded + if (JSStringIsEqualToUTF8CString(phaseStr, "cancelled")) + return 8; // kCGScrollPhaseCancelled + if (JSStringIsEqualToUTF8CString(phaseStr, "maybegin")) + return 128; // kCGScrollPhaseMayBegin + + ASSERT_NOT_REACHED(); + return 0; +} + +static uint64_t cgEventMomentumPhaseFromString(JSStringRef phaseStr) +{ + if (JSStringIsEqualToUTF8CString(phaseStr, "none")) + return 0; // kCGMomentumScrollPhaseNone + if (JSStringIsEqualToUTF8CString(phaseStr, "begin")) + return 1; // kCGMomentumScrollPhaseBegin + if (JSStringIsEqualToUTF8CString(phaseStr, "continue")) + return 2; // kCGMomentumScrollPhaseContinue + if (JSStringIsEqualToUTF8CString(phaseStr, "end")) + return 3; // kCGMomentumScrollPhaseEnd + + ASSERT_NOT_REACHED(); + return 0; +} + +void EventSendingController::mouseScrollByWithWheelAndMomentumPhases(int x, int y, JSStringRef phaseStr, JSStringRef momentumStr) +{ + WKRetainPtr<WKStringRef> EventSenderMessageName(AdoptWK, WKStringCreateWithUTF8CString("EventSender")); + WKRetainPtr<WKMutableDictionaryRef> EventSenderMessageBody(AdoptWK, WKMutableDictionaryCreate()); + + WKRetainPtr<WKStringRef> subMessageKey(AdoptWK, WKStringCreateWithUTF8CString("SubMessage")); + WKRetainPtr<WKStringRef> subMessageName(AdoptWK, WKStringCreateWithUTF8CString("MouseScrollByWithWheelAndMomentumPhases")); + WKDictionarySetItem(EventSenderMessageBody.get(), subMessageKey.get(), subMessageName.get()); + + WKRetainPtr<WKStringRef> xKey(AdoptWK, WKStringCreateWithUTF8CString("X")); + WKRetainPtr<WKDoubleRef> xRef(AdoptWK, WKDoubleCreate(x)); + WKDictionarySetItem(EventSenderMessageBody.get(), xKey.get(), xRef.get()); + + WKRetainPtr<WKStringRef> yKey(AdoptWK, WKStringCreateWithUTF8CString("Y")); + WKRetainPtr<WKDoubleRef> yRef(AdoptWK, WKDoubleCreate(y)); + WKDictionarySetItem(EventSenderMessageBody.get(), yKey.get(), yRef.get()); + + uint64_t phase = cgEventPhaseFromString(phaseStr); + uint64_t momentum = cgEventMomentumPhaseFromString(momentumStr); + + WKRetainPtr<WKStringRef> phaseKey(AdoptWK, WKStringCreateWithUTF8CString("Phase")); + WKRetainPtr<WKUInt64Ref> phaseRef(AdoptWK, WKUInt64Create(phase)); + WKDictionarySetItem(EventSenderMessageBody.get(), phaseKey.get(), phaseRef.get()); + + WKRetainPtr<WKStringRef> momentumKey(AdoptWK, WKStringCreateWithUTF8CString("Momentum")); + WKRetainPtr<WKUInt64Ref> momentumRef(AdoptWK, WKUInt64Create(momentum)); + WKDictionarySetItem(EventSenderMessageBody.get(), momentumKey.get(), momentumRef.get()); + + WKBundlePageForceRepaint(InjectedBundle::singleton().page()->page()); // Triggers a scrolling tree commit. + WKBundlePagePostMessage(InjectedBundle::singleton().page()->page(), EventSenderMessageName.get(), EventSenderMessageBody.get()); +} + +void EventSendingController::swipeGestureWithWheelAndMomentumPhases(int x, int y, JSStringRef phaseStr, JSStringRef momentumStr) +{ + WKRetainPtr<WKStringRef> EventSenderMessageName(AdoptWK, WKStringCreateWithUTF8CString("EventSender")); + WKRetainPtr<WKMutableDictionaryRef> EventSenderMessageBody(AdoptWK, WKMutableDictionaryCreate()); + + WKRetainPtr<WKStringRef> subMessageKey(AdoptWK, WKStringCreateWithUTF8CString("SubMessage")); + WKRetainPtr<WKStringRef> subMessageName(AdoptWK, WKStringCreateWithUTF8CString("SwipeGestureWithWheelAndMomentumPhases")); + WKDictionarySetItem(EventSenderMessageBody.get(), subMessageKey.get(), subMessageName.get()); + + WKRetainPtr<WKStringRef> xKey(AdoptWK, WKStringCreateWithUTF8CString("X")); + WKRetainPtr<WKDoubleRef> xRef(AdoptWK, WKDoubleCreate(x)); + WKDictionarySetItem(EventSenderMessageBody.get(), xKey.get(), xRef.get()); + + WKRetainPtr<WKStringRef> yKey(AdoptWK, WKStringCreateWithUTF8CString("Y")); + WKRetainPtr<WKDoubleRef> yRef(AdoptWK, WKDoubleCreate(y)); + WKDictionarySetItem(EventSenderMessageBody.get(), yKey.get(), yRef.get()); + + uint64_t phase = cgEventPhaseFromString(phaseStr); + uint64_t momentum = cgEventMomentumPhaseFromString(momentumStr); + + WKRetainPtr<WKStringRef> phaseKey(AdoptWK, WKStringCreateWithUTF8CString("Phase")); + WKRetainPtr<WKUInt64Ref> phaseRef(AdoptWK, WKUInt64Create(phase)); + WKDictionarySetItem(EventSenderMessageBody.get(), phaseKey.get(), phaseRef.get()); + + WKRetainPtr<WKStringRef> momentumKey(AdoptWK, WKStringCreateWithUTF8CString("Momentum")); + WKRetainPtr<WKUInt64Ref> momentumRef(AdoptWK, WKUInt64Create(momentum)); + WKDictionarySetItem(EventSenderMessageBody.get(), momentumKey.get(), momentumRef.get()); + + WKBundlePageForceRepaint(InjectedBundle::singleton().page()->page()); // Triggers a scrolling tree commit. + WKBundlePagePostMessage(InjectedBundle::singleton().page()->page(), EventSenderMessageName.get(), EventSenderMessageBody.get()); } void EventSendingController::continuousMouseScrollBy(int x, int y, bool paged) @@ -368,31 +536,33 @@ void EventSendingController::continuousMouseScrollBy(int x, int y, bool paged) WKRetainPtr<WKUInt64Ref> pagedRef(AdoptWK, WKUInt64Create(paged)); WKDictionarySetItem(EventSenderMessageBody.get(), pagedKey.get(), pagedRef.get()); - WKBundlePostSynchronousMessage(InjectedBundle::shared().bundle(), EventSenderMessageName.get(), EventSenderMessageBody.get(), 0); + // FIXME: This message should be asynchronous, as scrolling is intrinsically asynchronous. + // See also: <https://bugs.webkit.org/show_bug.cgi?id=148256>. + WKBundlePagePostSynchronousMessageForTesting(InjectedBundle::singleton().page()->page(), EventSenderMessageName.get(), EventSenderMessageBody.get(), 0); } JSValueRef EventSendingController::contextClick() { - WKBundlePageRef page = InjectedBundle::shared().page()->page(); + WKBundlePageRef page = InjectedBundle::singleton().page()->page(); WKBundleFrameRef mainFrame = WKBundlePageGetMainFrame(page); JSContextRef context = WKBundleFrameGetJavaScriptContext(mainFrame); #if ENABLE(CONTEXT_MENUS) - // Do mouse context click. - mouseDown(2, 0); - mouseUp(2, 0); + WKRetainPtr<WKArrayRef> menuEntries = adoptWK(WKBundlePageCopyContextMenuAtPointInWindow(page, m_position)); + JSValueRef arrayResult = JSObjectMakeArray(context, 0, 0, 0); + if (!menuEntries) + return arrayResult; - WKRetainPtr<WKArrayRef> menuEntries = adoptWK(WKBundlePageCopyContextMenuItems(page)); + JSObjectRef arrayObj = JSValueToObject(context, arrayResult, 0); size_t entriesSize = WKArrayGetSize(menuEntries.get()); - auto jsValuesArray = std::make_unique<JSValueRef[]>(entriesSize); for (size_t i = 0; i < entriesSize; ++i) { ASSERT(WKGetTypeID(WKArrayGetItemAtIndex(menuEntries.get(), i)) == WKContextMenuItemGetTypeID()); WKContextMenuItemRef item = static_cast<WKContextMenuItemRef>(WKArrayGetItemAtIndex(menuEntries.get(), i)); MenuItemPrivateData* privateData = new MenuItemPrivateData(page, item); - jsValuesArray[i] = JSObjectMake(context, getMenuItemClass(), privateData); + JSObjectSetPropertyAtIndex(context, arrayObj, i, JSObjectMake(context, getMenuItemClass(), privateData), 0); } - return JSObjectMakeArray(context, entriesSize, jsValuesArray.get(), 0); + return arrayResult; #else return JSValueMakeUndefined(context); #endif @@ -400,44 +570,96 @@ JSValueRef EventSendingController::contextClick() void EventSendingController::textZoomIn() { + auto& injectedBundle = InjectedBundle::singleton(); // Ensure page zoom is reset. - WKBundlePageSetPageZoomFactor(InjectedBundle::shared().page()->page(), 1); + WKBundlePageSetPageZoomFactor(injectedBundle.page()->page(), 1); - double zoomFactor = WKBundlePageGetTextZoomFactor(InjectedBundle::shared().page()->page()); - WKBundlePageSetTextZoomFactor(InjectedBundle::shared().page()->page(), zoomFactor * ZoomMultiplierRatio); + double zoomFactor = WKBundlePageGetTextZoomFactor(injectedBundle.page()->page()); + WKBundlePageSetTextZoomFactor(injectedBundle.page()->page(), zoomFactor * ZoomMultiplierRatio); } void EventSendingController::textZoomOut() { + auto& injectedBundle = InjectedBundle::singleton(); // Ensure page zoom is reset. - WKBundlePageSetPageZoomFactor(InjectedBundle::shared().page()->page(), 1); + WKBundlePageSetPageZoomFactor(injectedBundle.page()->page(), 1); - double zoomFactor = WKBundlePageGetTextZoomFactor(InjectedBundle::shared().page()->page()); - WKBundlePageSetTextZoomFactor(InjectedBundle::shared().page()->page(), zoomFactor / ZoomMultiplierRatio); + double zoomFactor = WKBundlePageGetTextZoomFactor(injectedBundle.page()->page()); + WKBundlePageSetTextZoomFactor(injectedBundle.page()->page(), zoomFactor / ZoomMultiplierRatio); } void EventSendingController::zoomPageIn() { + auto& injectedBundle = InjectedBundle::singleton(); // Ensure text zoom is reset. - WKBundlePageSetTextZoomFactor(InjectedBundle::shared().page()->page(), 1); + WKBundlePageSetTextZoomFactor(injectedBundle.page()->page(), 1); - double zoomFactor = WKBundlePageGetPageZoomFactor(InjectedBundle::shared().page()->page()); - WKBundlePageSetPageZoomFactor(InjectedBundle::shared().page()->page(), zoomFactor * ZoomMultiplierRatio); + double zoomFactor = WKBundlePageGetPageZoomFactor(injectedBundle.page()->page()); + WKBundlePageSetPageZoomFactor(injectedBundle.page()->page(), zoomFactor * ZoomMultiplierRatio); } void EventSendingController::zoomPageOut() { + auto& injectedBundle = InjectedBundle::singleton(); // Ensure text zoom is reset. - WKBundlePageSetTextZoomFactor(InjectedBundle::shared().page()->page(), 1); + WKBundlePageSetTextZoomFactor(injectedBundle.page()->page(), 1); - double zoomFactor = WKBundlePageGetPageZoomFactor(InjectedBundle::shared().page()->page()); - WKBundlePageSetPageZoomFactor(InjectedBundle::shared().page()->page(), zoomFactor / ZoomMultiplierRatio); + double zoomFactor = WKBundlePageGetPageZoomFactor(injectedBundle.page()->page()); + WKBundlePageSetPageZoomFactor(injectedBundle.page()->page(), zoomFactor / ZoomMultiplierRatio); } void EventSendingController::scalePageBy(double scale, double x, double y) { WKPoint origin = { x, y }; - WKBundlePageSetScaleAtOrigin(InjectedBundle::shared().page()->page(), scale, origin); + WKBundlePageSetScaleAtOrigin(InjectedBundle::singleton().page()->page(), scale, origin); +} + +void EventSendingController::monitorWheelEvents() +{ + WKBundlePageRef page = InjectedBundle::singleton().page()->page(); + + WKBundlePageStartMonitoringScrollOperations(page); +} + +struct ScrollCompletionCallbackData { + JSContextRef m_context; + JSObjectRef m_function; + + ScrollCompletionCallbackData(JSContextRef context, JSObjectRef function) + : m_context(context), m_function(function) + { + } +}; + +static void executeCallback(void* context) +{ + if (!context) + return; + + std::unique_ptr<ScrollCompletionCallbackData> callBackData(reinterpret_cast<ScrollCompletionCallbackData*>(context)); + + JSObjectCallAsFunction(callBackData->m_context, callBackData->m_function, nullptr, 0, nullptr, nullptr); + JSValueUnprotect(callBackData->m_context, callBackData->m_function); +} + +void EventSendingController::callAfterScrollingCompletes(JSValueRef functionCallback) +{ + if (!functionCallback) + return; + + WKBundlePageRef page = InjectedBundle::singleton().page()->page(); + WKBundleFrameRef mainFrame = WKBundlePageGetMainFrame(page); + JSContextRef context = WKBundleFrameGetJavaScriptContext(mainFrame); + + JSObjectRef functionCallbackObject = JSValueToObject(context, functionCallback, nullptr); + if (!functionCallbackObject) + return; + + JSValueProtect(context, functionCallbackObject); + + auto scrollCompletionCallbackData = std::make_unique<ScrollCompletionCallbackData>(context, functionCallbackObject); + + WKBundlePageRegisterScrollOperationCompletionCallback(page, executeCallback, scrollCompletionCallbackData.release()); } #if ENABLE(TOUCH_EVENTS) @@ -458,7 +680,7 @@ void EventSendingController::addTouchPoint(int x, int y) WKRetainPtr<WKUInt64Ref> yRef(AdoptWK, WKUInt64Create(y)); WKDictionarySetItem(EventSenderMessageBody.get(), yKey.get(), yRef.get()); - WKBundlePostSynchronousMessage(InjectedBundle::shared().bundle(), EventSenderMessageName.get(), EventSenderMessageBody.get(), 0); + WKBundlePagePostSynchronousMessageForTesting(InjectedBundle::singleton().page()->page(), EventSenderMessageName.get(), EventSenderMessageBody.get(), 0); } void EventSendingController::updateTouchPoint(int index, int x, int y) @@ -482,7 +704,7 @@ void EventSendingController::updateTouchPoint(int index, int x, int y) WKRetainPtr<WKUInt64Ref> yRef(AdoptWK, WKUInt64Create(y)); WKDictionarySetItem(EventSenderMessageBody.get(), yKey.get(), yRef.get()); - WKBundlePostSynchronousMessage(InjectedBundle::shared().bundle(), EventSenderMessageName.get(), EventSenderMessageBody.get(), 0); + WKBundlePagePostSynchronousMessageForTesting(InjectedBundle::singleton().page()->page(), EventSenderMessageName.get(), EventSenderMessageBody.get(), 0); } void EventSendingController::setTouchModifier(const JSStringRef &modifier, bool enable) @@ -512,7 +734,7 @@ void EventSendingController::setTouchModifier(const JSStringRef &modifier, bool WKRetainPtr<WKUInt64Ref> enableRef(AdoptWK, WKUInt64Create(enable)); WKDictionarySetItem(EventSenderMessageBody.get(), enableKey.get(), enableRef.get()); - WKBundlePostSynchronousMessage(InjectedBundle::shared().bundle(), EventSenderMessageName.get(), EventSenderMessageBody.get(), 0); + WKBundlePagePostSynchronousMessageForTesting(InjectedBundle::singleton().page()->page(), EventSenderMessageName.get(), EventSenderMessageBody.get(), 0); } @@ -533,7 +755,7 @@ void EventSendingController::setTouchPointRadius(int radiusX, int radiusY) WKRetainPtr<WKUInt64Ref> yRef(AdoptWK, WKUInt64Create(radiusY)); WKDictionarySetItem(EventSenderMessageBody.get(), yKey.get(), yRef.get()); - WKBundlePostSynchronousMessage(InjectedBundle::shared().bundle(), EventSenderMessageName.get(), EventSenderMessageBody.get(), 0); + WKBundlePagePostSynchronousMessageForTesting(InjectedBundle::singleton().page()->page(), EventSenderMessageName.get(), EventSenderMessageBody.get(), 0); } void EventSendingController::touchStart() @@ -545,7 +767,7 @@ void EventSendingController::touchStart() WKRetainPtr<WKStringRef> subMessageName(AdoptWK, WKStringCreateWithUTF8CString("TouchStart")); WKDictionarySetItem(EventSenderMessageBody.get(), subMessageKey.get(), subMessageName.get()); - WKBundlePostSynchronousMessage(InjectedBundle::shared().bundle(), EventSenderMessageName.get(), EventSenderMessageBody.get(), 0); + WKBundlePagePostSynchronousMessageForTesting(InjectedBundle::singleton().page()->page(), EventSenderMessageName.get(), EventSenderMessageBody.get(), 0); } void EventSendingController::touchMove() @@ -557,7 +779,7 @@ void EventSendingController::touchMove() WKRetainPtr<WKStringRef> subMessageName(AdoptWK, WKStringCreateWithUTF8CString("TouchMove")); WKDictionarySetItem(EventSenderMessageBody.get(), subMessageKey.get(), subMessageName.get()); - WKBundlePostSynchronousMessage(InjectedBundle::shared().bundle(), EventSenderMessageName.get(), EventSenderMessageBody.get(), 0); + WKBundlePagePostSynchronousMessageForTesting(InjectedBundle::singleton().page()->page(), EventSenderMessageName.get(), EventSenderMessageBody.get(), 0); } void EventSendingController::touchEnd() @@ -569,7 +791,7 @@ void EventSendingController::touchEnd() WKRetainPtr<WKStringRef> subMessageName(AdoptWK, WKStringCreateWithUTF8CString("TouchEnd")); WKDictionarySetItem(EventSenderMessageBody.get(), subMessageKey.get(), subMessageName.get()); - WKBundlePostSynchronousMessage(InjectedBundle::shared().bundle(), EventSenderMessageName.get(), EventSenderMessageBody.get(), 0); + WKBundlePagePostSynchronousMessageForTesting(InjectedBundle::singleton().page()->page(), EventSenderMessageName.get(), EventSenderMessageBody.get(), 0); } void EventSendingController::touchCancel() @@ -581,7 +803,7 @@ void EventSendingController::touchCancel() WKRetainPtr<WKStringRef> subMessageName(AdoptWK, WKStringCreateWithUTF8CString("TouchCancel")); WKDictionarySetItem(EventSenderMessageBody.get(), subMessageKey.get(), subMessageName.get()); - WKBundlePostSynchronousMessage(InjectedBundle::shared().bundle(), EventSenderMessageName.get(), EventSenderMessageBody.get(), 0); + WKBundlePagePostSynchronousMessageForTesting(InjectedBundle::singleton().page()->page(), EventSenderMessageName.get(), EventSenderMessageBody.get(), 0); } void EventSendingController::clearTouchPoints() @@ -593,7 +815,7 @@ void EventSendingController::clearTouchPoints() WKRetainPtr<WKStringRef> subMessageName(AdoptWK, WKStringCreateWithUTF8CString("ClearTouchPoints")); WKDictionarySetItem(EventSenderMessageBody.get(), subMessageKey.get(), subMessageName.get()); - WKBundlePostSynchronousMessage(InjectedBundle::shared().bundle(), EventSenderMessageName.get(), EventSenderMessageBody.get(), 0); + WKBundlePagePostSynchronousMessageForTesting(InjectedBundle::singleton().page()->page(), EventSenderMessageName.get(), EventSenderMessageBody.get(), 0); } void EventSendingController::releaseTouchPoint(int index) @@ -609,7 +831,7 @@ void EventSendingController::releaseTouchPoint(int index) WKRetainPtr<WKUInt64Ref> indexRef(AdoptWK, WKUInt64Create(index)); WKDictionarySetItem(EventSenderMessageBody.get(), indexKey.get(), indexRef.get()); - WKBundlePostSynchronousMessage(InjectedBundle::shared().bundle(), EventSenderMessageName.get(), EventSenderMessageBody.get(), 0); + WKBundlePagePostSynchronousMessageForTesting(InjectedBundle::singleton().page()->page(), EventSenderMessageName.get(), EventSenderMessageBody.get(), 0); } void EventSendingController::cancelTouchPoint(int index) @@ -625,7 +847,7 @@ void EventSendingController::cancelTouchPoint(int index) WKRetainPtr<WKUInt64Ref> indexRef(AdoptWK, WKUInt64Create(index)); WKDictionarySetItem(EventSenderMessageBody.get(), indexKey.get(), indexRef.get()); - WKBundlePostSynchronousMessage(InjectedBundle::shared().bundle(), EventSenderMessageName.get(), EventSenderMessageBody.get(), 0); + WKBundlePagePostSynchronousMessageForTesting(InjectedBundle::singleton().page()->page(), EventSenderMessageName.get(), EventSenderMessageBody.get(), 0); } #endif |