Make WebEvent::Modifiers an OptionSet
authordbates@webkit.org <dbates@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 6 Feb 2019 00:21:21 +0000 (00:21 +0000)
committerdbates@webkit.org <dbates@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 6 Feb 2019 00:21:21 +0000 (00:21 +0000)
https://bugs.webkit.org/show_bug.cgi?id=194241

Reviewed by Simon Fraser.

Use an OptionSet to represent the bitmask of keyboard modifier flags. This improves type safety
and makes debugging more enjoyable because our LLDB pretty-printers have built-in support for
OptionSet.

While I am at it, make WebEvent::Modifier an enum class. It is currently an enum. This makes
this enum more closely match WebCore::PlatformEvent::Modifier.

* Shared/API/c/WKSharedAPICast.h:
(WebKit::toAPI):
* Shared/NavigationActionData.cpp:
(WebKit::NavigationActionData::encode const):
(WebKit::NavigationActionData::decode):
* Shared/NavigationActionData.h:
* Shared/WebEvent.cpp:
(WebKit::WebEvent::WebEvent):
* Shared/WebEvent.h:
(WebKit::WebEvent::shiftKey const):
(WebKit::WebEvent::controlKey const):
(WebKit::WebEvent::altKey const):
(WebKit::WebEvent::metaKey const):
(WebKit::WebEvent::capsLockKey const):
(WebKit::WebEvent::modifiers const):
(WebKit::WebTouchEvent::WebTouchEvent):
* Shared/WebEventConversion.cpp:
(WebKit::WebKit2PlatformMouseEvent::WebKit2PlatformMouseEvent):
* Shared/WebKeyboardEvent.cpp:
(WebKit::WebKeyboardEvent::WebKeyboardEvent):
* Shared/WebMouseEvent.cpp:
(WebKit::WebMouseEvent::WebMouseEvent):
* Shared/WebTouchEvent.cpp:
(WebKit::WebTouchEvent::WebTouchEvent):
* Shared/WebWheelEvent.cpp:
(WebKit::WebWheelEvent::WebWheelEvent):
* Shared/gtk/WebEventFactory.cpp:
(WebKit::modifiersForEvent):
* Shared/ios/NativeWebTouchEventIOS.mm:
(WebKit::NativeWebTouchEvent::NativeWebTouchEvent):
* Shared/ios/WebIOSEventFactory.mm:
(modifiersForEvent):
(WebIOSEventFactory::createWebKeyboardEvent):
(WebIOSEventFactory::createWebMouseEvent):
* Shared/libwpe/WebEventFactory.cpp:
(WebKit::modifiersForEventModifiers):
(WebKit::WebEventFactory::createWebWheelEvent):
(WebKit::WebEventFactory::createWebTouchEvent):
* Shared/mac/WebEventFactory.mm:
(WebKit::modifiersForEvent):
(WebKit::WebEventFactory::createWebMouseEvent):
(WebKit::WebEventFactory::createWebWheelEvent):
(WebKit::WebEventFactory::createWebKeyboardEvent):
* Shared/win/WebEventFactory.cpp:
(WebKit::modifiersForEvent):
(WebKit::modifiersForCurrentKeyState):
(WebKit::WebEventFactory::createWebMouseEvent):
(WebKit::WebEventFactory::createWebWheelEvent):
(WebKit::WebEventFactory::createWebKeyboardEvent):
* UIProcess/API/APINavigationAction.h:
* UIProcess/API/APIUIClient.h:
(API::UIClient::mouseDidMoveOverElement):
* UIProcess/API/C/WKPage.cpp:
(WKPageSetPageUIClient):
* UIProcess/API/Cocoa/WKNavigationAction.mm:
(toNSEventModifierFlags):
* UIProcess/API/glib/WebKitPrivate.cpp:
(toPlatformModifiers):
* UIProcess/API/glib/WebKitPrivate.h:
* UIProcess/API/glib/WebKitUIClient.cpp:
* UIProcess/API/glib/WebKitWebView.cpp:
(webkitWebViewMouseTargetChanged):
* UIProcess/API/glib/WebKitWebViewPrivate.h:
* UIProcess/Automation/WebAutomationSession.cpp:
(WebKit::WebAutomationSession::simulateMouseInteraction):
(WebKit::protocolModifierToWebEventModifier):
(WebKit::WebAutomationSession::performMouseInteraction):
* UIProcess/Automation/WebAutomationSession.h:
* UIProcess/Automation/gtk/WebAutomationSessionGtk.cpp:
(WebKit::modifiersToEventState):
(WebKit::WebAutomationSession::platformSimulateMouseInteraction):
* UIProcess/Automation/mac/WebAutomationSessionMac.mm:
(WebKit::WebAutomationSession::platformSimulateMouseInteraction):
* UIProcess/Automation/wpe/WebAutomationSessionWPE.cpp:
(WebKit::modifiersToEventState):
(WebKit::WebAutomationSession::platformSimulateMouseInteraction):
* UIProcess/Cocoa/UIDelegate.h:
* UIProcess/Cocoa/UIDelegate.mm:
(WebKit::toNSEventModifierFlags):
(WebKit::UIDelegate::UIClient::mouseDidMoveOverElement):
* UIProcess/WebPageProxy.cpp:
(WebKit::WebPageProxy::mouseDidMoveOverElement):
* WebProcess/InjectedBundle/API/APIInjectedBundlePageUIClient.h:
(API::InjectedBundle::PageUIClient::mouseDidMoveOverElement):
* WebProcess/InjectedBundle/InjectedBundleNavigationAction.cpp:
(WebKit::InjectedBundleNavigationAction::modifiersForNavigationAction):
* WebProcess/InjectedBundle/InjectedBundleNavigationAction.h:
(WebKit::InjectedBundleNavigationAction::modifiers const):
* WebProcess/InjectedBundle/InjectedBundlePageUIClient.cpp:
(WebKit::InjectedBundlePageUIClient::mouseDidMoveOverElement):
* WebProcess/InjectedBundle/InjectedBundlePageUIClient.h:
* WebProcess/Plugins/PDF/PDFPlugin.mm:
(WebKit::PDFPlugin::showContextMenuAtPoint):
* WebProcess/Plugins/PluginView.cpp:
(WebKit::PluginView::createWebEvent const):
* WebProcess/WebCoreSupport/WebChromeClient.cpp:
(WebKit::WebChromeClient::mouseDidMoveOverElement):
* WebProcess/WebPage/WebPage.cpp:
(WebKit::WebPage::simulateMouseDown):
(WebKit::WebPage::simulateMouseUp):
(WebKit::WebPage::simulateMouseMotion):

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@241000 268f45cc-cd09-0410-ab3c-d52691b4dbfc

43 files changed:
Source/WebKit/ChangeLog
Source/WebKit/Shared/API/c/WKSharedAPICast.h
Source/WebKit/Shared/NavigationActionData.cpp
Source/WebKit/Shared/NavigationActionData.h
Source/WebKit/Shared/WebEvent.cpp
Source/WebKit/Shared/WebEvent.h
Source/WebKit/Shared/WebEventConversion.cpp
Source/WebKit/Shared/WebKeyboardEvent.cpp
Source/WebKit/Shared/WebMouseEvent.cpp
Source/WebKit/Shared/WebTouchEvent.cpp
Source/WebKit/Shared/WebWheelEvent.cpp
Source/WebKit/Shared/gtk/WebEventFactory.cpp
Source/WebKit/Shared/ios/NativeWebTouchEventIOS.mm
Source/WebKit/Shared/ios/WebIOSEventFactory.mm
Source/WebKit/Shared/libwpe/WebEventFactory.cpp
Source/WebKit/Shared/mac/WebEventFactory.mm
Source/WebKit/Shared/win/WebEventFactory.cpp
Source/WebKit/UIProcess/API/APINavigationAction.h
Source/WebKit/UIProcess/API/APIUIClient.h
Source/WebKit/UIProcess/API/C/WKPage.cpp
Source/WebKit/UIProcess/API/Cocoa/WKNavigationAction.mm
Source/WebKit/UIProcess/API/glib/WebKitPrivate.cpp
Source/WebKit/UIProcess/API/glib/WebKitPrivate.h
Source/WebKit/UIProcess/API/glib/WebKitUIClient.cpp
Source/WebKit/UIProcess/API/glib/WebKitWebView.cpp
Source/WebKit/UIProcess/API/glib/WebKitWebViewPrivate.h
Source/WebKit/UIProcess/Automation/WebAutomationSession.cpp
Source/WebKit/UIProcess/Automation/WebAutomationSession.h
Source/WebKit/UIProcess/Automation/gtk/WebAutomationSessionGtk.cpp
Source/WebKit/UIProcess/Automation/mac/WebAutomationSessionMac.mm
Source/WebKit/UIProcess/Automation/wpe/WebAutomationSessionWPE.cpp
Source/WebKit/UIProcess/Cocoa/UIDelegate.h
Source/WebKit/UIProcess/Cocoa/UIDelegate.mm
Source/WebKit/UIProcess/WebPageProxy.cpp
Source/WebKit/WebProcess/InjectedBundle/API/APIInjectedBundlePageUIClient.h
Source/WebKit/WebProcess/InjectedBundle/InjectedBundleNavigationAction.cpp
Source/WebKit/WebProcess/InjectedBundle/InjectedBundleNavigationAction.h
Source/WebKit/WebProcess/InjectedBundle/InjectedBundlePageUIClient.cpp
Source/WebKit/WebProcess/InjectedBundle/InjectedBundlePageUIClient.h
Source/WebKit/WebProcess/Plugins/PDF/PDFPlugin.mm
Source/WebKit/WebProcess/Plugins/PluginView.cpp
Source/WebKit/WebProcess/WebCoreSupport/WebChromeClient.cpp
Source/WebKit/WebProcess/WebPage/WebPage.cpp

index 4688d54..1269c69 100644 (file)
@@ -1,3 +1,119 @@
+2019-02-05  Daniel Bates  <dabates@apple.com>
+
+        Make WebEvent::Modifiers an OptionSet
+        https://bugs.webkit.org/show_bug.cgi?id=194241
+
+        Reviewed by Simon Fraser.
+
+        Use an OptionSet to represent the bitmask of keyboard modifier flags. This improves type safety
+        and makes debugging more enjoyable because our LLDB pretty-printers have built-in support for
+        OptionSet.
+
+        While I am at it, make WebEvent::Modifier an enum class. It is currently an enum. This makes
+        this enum more closely match WebCore::PlatformEvent::Modifier.
+
+        * Shared/API/c/WKSharedAPICast.h:
+        (WebKit::toAPI):
+        * Shared/NavigationActionData.cpp:
+        (WebKit::NavigationActionData::encode const):
+        (WebKit::NavigationActionData::decode):
+        * Shared/NavigationActionData.h:
+        * Shared/WebEvent.cpp:
+        (WebKit::WebEvent::WebEvent):
+        * Shared/WebEvent.h:
+        (WebKit::WebEvent::shiftKey const):
+        (WebKit::WebEvent::controlKey const):
+        (WebKit::WebEvent::altKey const):
+        (WebKit::WebEvent::metaKey const):
+        (WebKit::WebEvent::capsLockKey const):
+        (WebKit::WebEvent::modifiers const):
+        (WebKit::WebTouchEvent::WebTouchEvent):
+        * Shared/WebEventConversion.cpp:
+        (WebKit::WebKit2PlatformMouseEvent::WebKit2PlatformMouseEvent):
+        * Shared/WebKeyboardEvent.cpp:
+        (WebKit::WebKeyboardEvent::WebKeyboardEvent):
+        * Shared/WebMouseEvent.cpp:
+        (WebKit::WebMouseEvent::WebMouseEvent):
+        * Shared/WebTouchEvent.cpp:
+        (WebKit::WebTouchEvent::WebTouchEvent):
+        * Shared/WebWheelEvent.cpp:
+        (WebKit::WebWheelEvent::WebWheelEvent):
+        * Shared/gtk/WebEventFactory.cpp:
+        (WebKit::modifiersForEvent):
+        * Shared/ios/NativeWebTouchEventIOS.mm:
+        (WebKit::NativeWebTouchEvent::NativeWebTouchEvent):
+        * Shared/ios/WebIOSEventFactory.mm:
+        (modifiersForEvent):
+        (WebIOSEventFactory::createWebKeyboardEvent):
+        (WebIOSEventFactory::createWebMouseEvent):
+        * Shared/libwpe/WebEventFactory.cpp:
+        (WebKit::modifiersForEventModifiers):
+        (WebKit::WebEventFactory::createWebWheelEvent):
+        (WebKit::WebEventFactory::createWebTouchEvent):
+        * Shared/mac/WebEventFactory.mm:
+        (WebKit::modifiersForEvent):
+        (WebKit::WebEventFactory::createWebMouseEvent):
+        (WebKit::WebEventFactory::createWebWheelEvent):
+        (WebKit::WebEventFactory::createWebKeyboardEvent):
+        * Shared/win/WebEventFactory.cpp:
+        (WebKit::modifiersForEvent):
+        (WebKit::modifiersForCurrentKeyState):
+        (WebKit::WebEventFactory::createWebMouseEvent):
+        (WebKit::WebEventFactory::createWebWheelEvent):
+        (WebKit::WebEventFactory::createWebKeyboardEvent):
+        * UIProcess/API/APINavigationAction.h:
+        * UIProcess/API/APIUIClient.h:
+        (API::UIClient::mouseDidMoveOverElement):
+        * UIProcess/API/C/WKPage.cpp:
+        (WKPageSetPageUIClient):
+        * UIProcess/API/Cocoa/WKNavigationAction.mm:
+        (toNSEventModifierFlags):
+        * UIProcess/API/glib/WebKitPrivate.cpp:
+        (toPlatformModifiers):
+        * UIProcess/API/glib/WebKitPrivate.h:
+        * UIProcess/API/glib/WebKitUIClient.cpp:
+        * UIProcess/API/glib/WebKitWebView.cpp:
+        (webkitWebViewMouseTargetChanged):
+        * UIProcess/API/glib/WebKitWebViewPrivate.h:
+        * UIProcess/Automation/WebAutomationSession.cpp:
+        (WebKit::WebAutomationSession::simulateMouseInteraction):
+        (WebKit::protocolModifierToWebEventModifier):
+        (WebKit::WebAutomationSession::performMouseInteraction):
+        * UIProcess/Automation/WebAutomationSession.h:
+        * UIProcess/Automation/gtk/WebAutomationSessionGtk.cpp:
+        (WebKit::modifiersToEventState):
+        (WebKit::WebAutomationSession::platformSimulateMouseInteraction):
+        * UIProcess/Automation/mac/WebAutomationSessionMac.mm:
+        (WebKit::WebAutomationSession::platformSimulateMouseInteraction):
+        * UIProcess/Automation/wpe/WebAutomationSessionWPE.cpp:
+        (WebKit::modifiersToEventState):
+        (WebKit::WebAutomationSession::platformSimulateMouseInteraction):
+        * UIProcess/Cocoa/UIDelegate.h:
+        * UIProcess/Cocoa/UIDelegate.mm:
+        (WebKit::toNSEventModifierFlags):
+        (WebKit::UIDelegate::UIClient::mouseDidMoveOverElement):
+        * UIProcess/WebPageProxy.cpp:
+        (WebKit::WebPageProxy::mouseDidMoveOverElement):
+        * WebProcess/InjectedBundle/API/APIInjectedBundlePageUIClient.h:
+        (API::InjectedBundle::PageUIClient::mouseDidMoveOverElement):
+        * WebProcess/InjectedBundle/InjectedBundleNavigationAction.cpp:
+        (WebKit::InjectedBundleNavigationAction::modifiersForNavigationAction):
+        * WebProcess/InjectedBundle/InjectedBundleNavigationAction.h:
+        (WebKit::InjectedBundleNavigationAction::modifiers const):
+        * WebProcess/InjectedBundle/InjectedBundlePageUIClient.cpp:
+        (WebKit::InjectedBundlePageUIClient::mouseDidMoveOverElement):
+        * WebProcess/InjectedBundle/InjectedBundlePageUIClient.h:
+        * WebProcess/Plugins/PDF/PDFPlugin.mm:
+        (WebKit::PDFPlugin::showContextMenuAtPoint):
+        * WebProcess/Plugins/PluginView.cpp:
+        (WebKit::PluginView::createWebEvent const):
+        * WebProcess/WebCoreSupport/WebChromeClient.cpp:
+        (WebKit::WebChromeClient::mouseDidMoveOverElement):
+        * WebProcess/WebPage/WebPage.cpp:
+        (WebKit::WebPage::simulateMouseDown):
+        (WebKit::WebPage::simulateMouseUp):
+        (WebKit::WebPage::simulateMouseMotion):
+
 2019-02-05  Tim Horton  <timothy_horton@apple.com>
 
         Reproducible crash under WKShareSheet presentWithParameters when cancelling a share
index 06f9744..0d87e96 100644 (file)
@@ -281,18 +281,18 @@ inline WKTypeID toAPI(API::Object::Type type)
     return static_cast<WKTypeID>(type);
 }
 
-inline WKEventModifiers toAPI(WebEvent::Modifiers modifiers)
+inline WKEventModifiers toAPI(OptionSet<WebEvent::Modifier> modifiers)
 {
     WKEventModifiers wkModifiers = 0;
-    if (modifiers & WebEvent::ShiftKey)
+    if (modifiers.contains(WebEvent::Modifier::ShiftKey))
         wkModifiers |= kWKEventModifiersShiftKey;
-    if (modifiers & WebEvent::ControlKey)
+    if (modifiers.contains(WebEvent::Modifier::ControlKey))
         wkModifiers |= kWKEventModifiersControlKey;
-    if (modifiers & WebEvent::AltKey)
+    if (modifiers.contains(WebEvent::Modifier::AltKey))
         wkModifiers |= kWKEventModifiersAltKey;
-    if (modifiers & WebEvent::MetaKey)
+    if (modifiers.contains(WebEvent::Modifier::MetaKey))
         wkModifiers |= kWKEventModifiersMetaKey;
-    if (modifiers & WebEvent::CapsLockKey)
+    if (modifiers.contains(WebEvent::Modifier::CapsLockKey))
         wkModifiers |= kWKEventModifiersCapsLockKey;
     return wkModifiers;
 }
index f5e5abf..b9e6625 100644 (file)
@@ -36,7 +36,7 @@ namespace WebKit {
 void NavigationActionData::encode(IPC::Encoder& encoder) const
 {
     encoder.encodeEnum(navigationType);
-    encoder.encodeEnum(modifiers);
+    encoder << modifiers;
     encoder.encodeEnum(mouseButton);
     encoder.encodeEnum(syntheticClickType);
     encoder << userGestureTokenIdentifier;
@@ -61,10 +61,10 @@ Optional<NavigationActionData> NavigationActionData::decode(IPC::Decoder& decode
     if (!decoder.decodeEnum(navigationType))
         return WTF::nullopt;
     
-    WebEvent::Modifiers modifiers;
-    if (!decoder.decodeEnum(modifiers))
+    OptionSet<WebEvent::Modifier> modifiers;
+    if (!decoder.decode(modifiers))
         return WTF::nullopt;
-    
+
     WebMouseEvent::Button mouseButton;
     if (!decoder.decodeEnum(mouseButton))
         return WTF::nullopt;
@@ -139,7 +139,7 @@ Optional<NavigationActionData> NavigationActionData::decode(IPC::Decoder& decode
     if (!clientRedirectSourceForHistory)
         return WTF::nullopt;
 
-    return {{ WTFMove(navigationType), WTFMove(modifiers), WTFMove(mouseButton), WTFMove(syntheticClickType), WTFMove(*userGestureTokenIdentifier),
+    return {{ WTFMove(navigationType), modifiers, WTFMove(mouseButton), WTFMove(syntheticClickType), WTFMove(*userGestureTokenIdentifier),
         WTFMove(*canHandleRequest), WTFMove(shouldOpenExternalURLsPolicy), WTFMove(*downloadAttribute), WTFMove(clickLocationInRootViewCoordinates),
         WTFMove(*isRedirect), *treatAsSameOriginNavigation, *hasOpenedFrames, *openedByDOMWithOpener, WTFMove(*requesterOrigin),
         WTFMove(*targetBackForwardItemIdentifier), lockHistory, lockBackForwardList, WTFMove(*clientRedirectSourceForHistory) }};
index 06fff84..693b917 100644 (file)
@@ -43,7 +43,7 @@ struct NavigationActionData {
     static Optional<NavigationActionData> decode(IPC::Decoder&);
 
     WebCore::NavigationType navigationType { WebCore::NavigationType::Other };
-    WebEvent::Modifiers modifiers { };
+    OptionSet<WebEvent::Modifier> modifiers;
     WebMouseEvent::Button mouseButton { WebMouseEvent::NoButton };
     WebMouseEvent::SyntheticClickType syntheticClickType { WebMouseEvent::NoTap };
     uint64_t userGestureTokenIdentifier;
index 5a086f9..db7de39 100644 (file)
@@ -34,11 +34,10 @@ namespace WebKit {
 
 WebEvent::WebEvent()
     : m_type(static_cast<uint32_t>(NoType))
-    , m_modifiers(0)
 {
 }
 
-WebEvent::WebEvent(Type type, Modifiers modifiers, WallTime timestamp)
+WebEvent::WebEvent(Type type, OptionSet<Modifier> modifiers, WallTime timestamp)
     : m_type(type)
     , m_modifiers(modifiers)
     , m_timestamp(timestamp)
index ff38638..96572c5 100644 (file)
@@ -34,6 +34,7 @@
 #include <WebCore/FloatSize.h>
 #include <WebCore/IntPoint.h>
 #include <WebCore/IntSize.h>
+#include <wtf/OptionSet.h>
 #include <wtf/WallTime.h>
 #include <wtf/text/WTFString.h>
 
@@ -87,7 +88,7 @@ public:
 #endif
     };
 
-    enum Modifiers {
+    enum class Modifier : uint8_t {
         ShiftKey    = 1 << 0,
         ControlKey  = 1 << 1,
         AltKey      = 1 << 2,
@@ -97,27 +98,27 @@ public:
 
     Type type() const { return static_cast<Type>(m_type); }
 
-    bool shiftKey() const { return m_modifiers & ShiftKey; }
-    bool controlKey() const { return m_modifiers & ControlKey; }
-    bool altKey() const { return m_modifiers & AltKey; }
-    bool metaKey() const { return m_modifiers & MetaKey; }
-    bool capsLockKey() const { return m_modifiers & CapsLockKey; }
+    bool shiftKey() const { return m_modifiers.contains(Modifier::ShiftKey); }
+    bool controlKey() const { return m_modifiers.contains(Modifier::ControlKey); }
+    bool altKey() const { return m_modifiers.contains(Modifier::AltKey); }
+    bool metaKey() const { return m_modifiers.contains(Modifier::MetaKey); }
+    bool capsLockKey() const { return m_modifiers.contains(Modifier::CapsLockKey); }
 
-    Modifiers modifiers() const { return static_cast<Modifiers>(m_modifiers); }
+    OptionSet<Modifier> modifiers() const { return m_modifiers; }
 
     WallTime timestamp() const { return m_timestamp; }
 
 protected:
     WebEvent();
 
-    WebEvent(Type, Modifiers, WallTime timestamp);
+    WebEvent(Type, OptionSet<Modifier>, WallTime timestamp);
 
     void encode(IPC::Encoder&) const;
     static bool decode(IPC::Decoder&, WebEvent&);
 
 private:
-    uint32_t m_type; // Type
-    uint32_t m_modifiers; // Modifiers
+    uint32_t m_type;
+    OptionSet<Modifier> m_modifiers;
     WallTime m_timestamp;
 };
 
@@ -136,9 +137,9 @@ public:
     WebMouseEvent();
 
 #if PLATFORM(MAC)
-    WebMouseEvent(Type, Button, unsigned short buttons, const WebCore::IntPoint& position, const WebCore::IntPoint& globalPosition, float deltaX, float deltaY, float deltaZ, int clickCount, Modifiers, WallTime timestamp, double force, SyntheticClickType = NoTap, int eventNumber = -1, int menuType = 0);
+    WebMouseEvent(Type, Button, unsigned short buttons, const WebCore::IntPoint& position, const WebCore::IntPoint& globalPosition, float deltaX, float deltaY, float deltaZ, int clickCount, OptionSet<Modifier>, WallTime timestamp, double force, SyntheticClickType = NoTap, int eventNumber = -1, int menuType = 0);
 #else
-    WebMouseEvent(Type, Button, unsigned short buttons, const WebCore::IntPoint& position, const WebCore::IntPoint& globalPosition, float deltaX, float deltaY, float deltaZ, int clickCount, Modifiers, WallTime timestamp, double force = 0, SyntheticClickType = NoTap);
+    WebMouseEvent(Type, Button, unsigned short buttons, const WebCore::IntPoint& position, const WebCore::IntPoint& globalPosition, float deltaX, float deltaY, float deltaZ, int clickCount, OptionSet<Modifier>, WallTime timestamp, double force = 0, SyntheticClickType = NoTap);
 #endif
 
     Button button() const { return static_cast<Button>(m_button); }
@@ -200,11 +201,11 @@ public:
 
     WebWheelEvent() { }
 
-    WebWheelEvent(Type, const WebCore::IntPoint& position, const WebCore::IntPoint& globalPosition, const WebCore::FloatSize& delta, const WebCore::FloatSize& wheelTicks, Granularity, Modifiers, WallTime timestamp);
+    WebWheelEvent(Type, const WebCore::IntPoint& position, const WebCore::IntPoint& globalPosition, const WebCore::FloatSize& delta, const WebCore::FloatSize& wheelTicks, Granularity, OptionSet<Modifier>, WallTime timestamp);
 #if PLATFORM(COCOA)
-    WebWheelEvent(Type, const WebCore::IntPoint& position, const WebCore::IntPoint& globalPosition, const WebCore::FloatSize& delta, const WebCore::FloatSize& wheelTicks, Granularity, bool directionInvertedFromDevice, Phase, Phase momentumPhase, bool hasPreciseScrollingDeltas, uint32_t scrollCount, const WebCore::FloatSize& unacceleratedScrollingDelta, Modifiers, WallTime timestamp);
+    WebWheelEvent(Type, const WebCore::IntPoint& position, const WebCore::IntPoint& globalPosition, const WebCore::FloatSize& delta, const WebCore::FloatSize& wheelTicks, Granularity, bool directionInvertedFromDevice, Phase, Phase momentumPhase, bool hasPreciseScrollingDeltas, uint32_t scrollCount, const WebCore::FloatSize& unacceleratedScrollingDelta, OptionSet<Modifier>, WallTime timestamp);
 #elif PLATFORM(GTK)
-    WebWheelEvent(Type, const WebCore::IntPoint& position, const WebCore::IntPoint& globalPosition, const WebCore::FloatSize& delta, const WebCore::FloatSize& wheelTicks, Phase, Phase momentumPhase, Granularity, Modifiers, WallTime timestamp);
+    WebWheelEvent(Type, const WebCore::IntPoint& position, const WebCore::IntPoint& globalPosition, const WebCore::FloatSize& delta, const WebCore::FloatSize& wheelTicks, Phase, Phase momentumPhase, Granularity, OptionSet<Modifier>, WallTime timestamp);
 #endif
 
     const WebCore::IntPoint position() const { return m_position; }
@@ -253,15 +254,15 @@ public:
     ~WebKeyboardEvent();
 
 #if USE(APPKIT)
-    WebKeyboardEvent(Type, const String& text, const String& unmodifiedText, const String& key, const String& code, const String& keyIdentifier, int windowsVirtualKeyCode, int nativeVirtualKeyCode, int macCharCode, bool handledByInputMethod, const Vector<WebCore::KeypressCommand>&, bool isAutoRepeat, bool isKeypad, bool isSystemKey, Modifiers, WallTime timestamp);
+    WebKeyboardEvent(Type, const String& text, const String& unmodifiedText, const String& key, const String& code, const String& keyIdentifier, int windowsVirtualKeyCode, int nativeVirtualKeyCode, int macCharCode, bool handledByInputMethod, const Vector<WebCore::KeypressCommand>&, bool isAutoRepeat, bool isKeypad, bool isSystemKey, OptionSet<Modifier>, WallTime timestamp);
 #elif PLATFORM(GTK)
-    WebKeyboardEvent(Type, const String& text, const String& key, const String& code, const String& keyIdentifier, int windowsVirtualKeyCode, int nativeVirtualKeyCode, bool handledByInputMethod, Vector<String>&& commands, bool isKeypad, Modifiers, WallTime timestamp);
+    WebKeyboardEvent(Type, const String& text, const String& key, const String& code, const String& keyIdentifier, int windowsVirtualKeyCode, int nativeVirtualKeyCode, bool handledByInputMethod, Vector<String>&& commands, bool isKeypad, OptionSet<Modifier>, WallTime timestamp);
 #elif PLATFORM(IOS_FAMILY)
-    WebKeyboardEvent(Type, const String& text, const String& unmodifiedText, const String& key, const String& code, const String& keyIdentifier, int windowsVirtualKeyCode, int nativeVirtualKeyCode, int macCharCode, bool isAutoRepeat, bool isKeypad, bool isSystemKey, Modifiers, WallTime timestamp);
+    WebKeyboardEvent(Type, const String& text, const String& unmodifiedText, const String& key, const String& code, const String& keyIdentifier, int windowsVirtualKeyCode, int nativeVirtualKeyCode, int macCharCode, bool isAutoRepeat, bool isKeypad, bool isSystemKey, OptionSet<Modifier>, WallTime timestamp);
 #elif USE(LIBWPE)
-    WebKeyboardEvent(Type, const String& text, const String& key, const String& code, const String& keyIdentifier, int windowsVirtualKeyCode, int nativeVirtualKeyCode, bool isKeypad, Modifiers, WallTime timestamp);
+    WebKeyboardEvent(Type, const String& text, const String& key, const String& code, const String& keyIdentifier, int windowsVirtualKeyCode, int nativeVirtualKeyCode, bool isKeypad, OptionSet<Modifier>, WallTime timestamp);
 #else
-    WebKeyboardEvent(Type, const String& text, const String& unmodifiedText, const String& keyIdentifier, int windowsVirtualKeyCode, int nativeVirtualKeyCode, int macCharCode, bool isAutoRepeat, bool isKeypad, bool isSystemKey, Modifiers, WallTime timestamp);
+    WebKeyboardEvent(Type, const String& text, const String& unmodifiedText, const String& keyIdentifier, int windowsVirtualKeyCode, int nativeVirtualKeyCode, int macCharCode, bool isAutoRepeat, bool isKeypad, bool isSystemKey, OptionSet<Modifier>, WallTime timestamp);
 #endif
 
     const String& text() const { return m_text; }
@@ -387,7 +388,7 @@ private:
 class WebTouchEvent : public WebEvent {
 public:
     WebTouchEvent() { }
-    WebTouchEvent(WebEvent::Type type, Modifiers modifiers, WallTime timestamp, const Vector<WebPlatformTouchPoint>& touchPoints, WebCore::IntPoint position, bool isPotentialTap, bool isGesture, float gestureScale, float gestureRotation)
+    WebTouchEvent(WebEvent::Type type, OptionSet<Modifier> modifiers, WallTime timestamp, const Vector<WebPlatformTouchPoint>& touchPoints, WebCore::IntPoint position, bool isPotentialTap, bool isGesture, float gestureScale, float gestureRotation)
         : WebEvent(type, modifiers, timestamp)
         , m_touchPoints(touchPoints)
         , m_position(position)
@@ -476,7 +477,7 @@ private:
 class WebTouchEvent : public WebEvent {
 public:
     WebTouchEvent() { }
-    WebTouchEvent(Type, Vector<WebPlatformTouchPoint>&&, Modifiers, WallTime timestamp);
+    WebTouchEvent(Type, Vector<WebPlatformTouchPoint>&&, OptionSet<Modifier>, WallTime timestamp);
 
     const Vector<WebPlatformTouchPoint>& touchPoints() const { return m_touchPoints; }
 
index cf27bff..3859985 100644 (file)
@@ -113,13 +113,13 @@ public:
 #endif
         m_modifierFlags = 0;
         if (webEvent.shiftKey())
-            m_modifierFlags |= WebEvent::ShiftKey;
+            m_modifierFlags |= static_cast<unsigned>(WebEvent::Modifier::ShiftKey);
         if (webEvent.controlKey())
-            m_modifierFlags |= WebEvent::ControlKey;
+            m_modifierFlags |= static_cast<unsigned>(WebEvent::Modifier::ControlKey);
         if (webEvent.altKey())
-            m_modifierFlags |= WebEvent::AltKey;
+            m_modifierFlags |= static_cast<unsigned>(WebEvent::Modifier::AltKey);
         if (webEvent.metaKey())
-            m_modifierFlags |= WebEvent::MetaKey;
+            m_modifierFlags |= static_cast<unsigned>(WebEvent::Modifier::MetaKey);
     }
 };
 
index e9c05d3..30b3f68 100644 (file)
@@ -37,7 +37,7 @@ WebKeyboardEvent::WebKeyboardEvent()
 
 #if USE(APPKIT)
 
-WebKeyboardEvent::WebKeyboardEvent(Type type, const String& text, const String& unmodifiedText, const String& key, const String& code, const String& keyIdentifier, int windowsVirtualKeyCode, int nativeVirtualKeyCode, int macCharCode, bool handledByInputMethod, const Vector<WebCore::KeypressCommand>& commands, bool isAutoRepeat, bool isKeypad, bool isSystemKey, Modifiers modifiers, WallTime timestamp)
+WebKeyboardEvent::WebKeyboardEvent(Type type, const String& text, const String& unmodifiedText, const String& key, const String& code, const String& keyIdentifier, int windowsVirtualKeyCode, int nativeVirtualKeyCode, int macCharCode, bool handledByInputMethod, const Vector<WebCore::KeypressCommand>& commands, bool isAutoRepeat, bool isKeypad, bool isSystemKey, OptionSet<Modifier> modifiers, WallTime timestamp)
     : WebEvent(type, modifiers, timestamp)
     , m_text(text)
     , m_unmodifiedText(unmodifiedText)
@@ -62,7 +62,7 @@ WebKeyboardEvent::WebKeyboardEvent(Type type, const String& text, const String&
 
 #elif PLATFORM(GTK)
 
-WebKeyboardEvent::WebKeyboardEvent(Type type, const String& text, const String& key, const String& code, const String& keyIdentifier, int windowsVirtualKeyCode, int nativeVirtualKeyCode, bool handledByInputMethod, Vector<String>&& commands, bool isKeypad, Modifiers modifiers, WallTime timestamp)
+WebKeyboardEvent::WebKeyboardEvent(Type type, const String& text, const String& key, const String& code, const String& keyIdentifier, int windowsVirtualKeyCode, int nativeVirtualKeyCode, bool handledByInputMethod, Vector<String>&& commands, bool isKeypad, OptionSet<Modifier> modifiers, WallTime timestamp)
     : WebEvent(type, modifiers, timestamp)
     , m_text(text)
     , m_unmodifiedText(text)
@@ -83,7 +83,7 @@ WebKeyboardEvent::WebKeyboardEvent(Type type, const String& text, const String&
 
 #elif PLATFORM(IOS_FAMILY)
 
-WebKeyboardEvent::WebKeyboardEvent(Type type, const String& text, const String& unmodifiedText, const String& key, const String& code, const String& keyIdentifier, int windowsVirtualKeyCode, int nativeVirtualKeyCode, int macCharCode, bool isAutoRepeat, bool isKeypad, bool isSystemKey, Modifiers modifiers, WallTime timestamp)
+WebKeyboardEvent::WebKeyboardEvent(Type type, const String& text, const String& unmodifiedText, const String& key, const String& code, const String& keyIdentifier, int windowsVirtualKeyCode, int nativeVirtualKeyCode, int macCharCode, bool isAutoRepeat, bool isKeypad, bool isSystemKey, OptionSet<Modifier> modifiers, WallTime timestamp)
     : WebEvent(type, modifiers, timestamp)
     , m_text(text)
     , m_unmodifiedText(unmodifiedText)
@@ -106,7 +106,7 @@ WebKeyboardEvent::WebKeyboardEvent(Type type, const String& text, const String&
 
 #elif USE(LIBWPE)
 
-WebKeyboardEvent::WebKeyboardEvent(Type type, const String& text, const String& key, const String& code, const String& keyIdentifier, int windowsVirtualKeyCode, int nativeVirtualKeyCode, bool isKeypad, Modifiers modifiers, WallTime timestamp)
+WebKeyboardEvent::WebKeyboardEvent(Type type, const String& text, const String& key, const String& code, const String& keyIdentifier, int windowsVirtualKeyCode, int nativeVirtualKeyCode, bool isKeypad, OptionSet<Modifier> modifiers, WallTime timestamp)
     : WebEvent(type, modifiers, timestamp)
     , m_text(text)
     , m_unmodifiedText(text)
@@ -129,7 +129,7 @@ WebKeyboardEvent::WebKeyboardEvent(Type type, const String& text, const String&
 
 #else
 
-WebKeyboardEvent::WebKeyboardEvent(Type type, const String& text, const String& unmodifiedText, const String& keyIdentifier, int windowsVirtualKeyCode, int nativeVirtualKeyCode, int macCharCode, bool isAutoRepeat, bool isKeypad, bool isSystemKey, Modifiers modifiers, WallTime timestamp)
+WebKeyboardEvent::WebKeyboardEvent(Type type, const String& text, const String& unmodifiedText, const String& keyIdentifier, int windowsVirtualKeyCode, int nativeVirtualKeyCode, int macCharCode, bool isAutoRepeat, bool isKeypad, bool isSystemKey, OptionSet<Modifier> modifiers, WallTime timestamp)
     : WebEvent(type, modifiers, timestamp)
     , m_text(text)
     , m_unmodifiedText(unmodifiedText)
index 62ae732..17a3e1c 100644 (file)
@@ -46,9 +46,9 @@ WebMouseEvent::WebMouseEvent()
 }
 
 #if PLATFORM(MAC)
-WebMouseEvent::WebMouseEvent(Type type, Button button, unsigned short buttons, const IntPoint& position, const IntPoint& globalPosition, float deltaX, float deltaY, float deltaZ, int clickCount, Modifiers modifiers, WallTime timestamp, double force, SyntheticClickType syntheticClickType, int eventNumber, int menuType)
+WebMouseEvent::WebMouseEvent(Type type, Button button, unsigned short buttons, const IntPoint& position, const IntPoint& globalPosition, float deltaX, float deltaY, float deltaZ, int clickCount, OptionSet<Modifier> modifiers, WallTime timestamp, double force, SyntheticClickType syntheticClickType, int eventNumber, int menuType)
 #else
-WebMouseEvent::WebMouseEvent(Type type, Button button, unsigned short buttons, const IntPoint& position, const IntPoint& globalPosition, float deltaX, float deltaY, float deltaZ, int clickCount, Modifiers modifiers, WallTime timestamp, double force, SyntheticClickType syntheticClickType)
+WebMouseEvent::WebMouseEvent(Type type, Button button, unsigned short buttons, const IntPoint& position, const IntPoint& globalPosition, float deltaX, float deltaY, float deltaZ, int clickCount, OptionSet<Modifier> modifiers, WallTime timestamp, double force, SyntheticClickType syntheticClickType)
 #endif
     : WebEvent(type, modifiers, timestamp)
     , m_button(button)
index 16823f1..82ada77 100644 (file)
@@ -32,7 +32,7 @@
 
 namespace WebKit {
 
-WebTouchEvent::WebTouchEvent(WebEvent::Type type, Vector<WebPlatformTouchPoint>&& touchPoints, Modifiers modifiers, WallTime timestamp)
+WebTouchEvent::WebTouchEvent(WebEvent::Type type, Vector<WebPlatformTouchPoint>&& touchPoints, OptionSet<Modifier> modifiers, WallTime timestamp)
     : WebEvent(type, modifiers, timestamp)
     , m_touchPoints(WTFMove(touchPoints))
 {
index 9ec7575..495aad9 100644 (file)
@@ -32,7 +32,7 @@ namespace WebKit {
 
 using namespace WebCore;
 
-WebWheelEvent::WebWheelEvent(Type type, const IntPoint& position, const IntPoint& globalPosition, const FloatSize& delta, const FloatSize& wheelTicks, Granularity granularity, Modifiers modifiers, WallTime timestamp)
+WebWheelEvent::WebWheelEvent(Type type, const IntPoint& position, const IntPoint& globalPosition, const FloatSize& delta, const FloatSize& wheelTicks, Granularity granularity, OptionSet<Modifier> modifiers, WallTime timestamp)
     : WebEvent(type, modifiers, timestamp)
     , m_position(position)
     , m_globalPosition(globalPosition)
@@ -50,7 +50,7 @@ WebWheelEvent::WebWheelEvent(Type type, const IntPoint& position, const IntPoint
 }
 
 #if PLATFORM(COCOA)
-WebWheelEvent::WebWheelEvent(Type type, const IntPoint& position, const IntPoint& globalPosition, const FloatSize& delta, const FloatSize& wheelTicks, Granularity granularity, bool directionInvertedFromDevice, Phase phase, Phase momentumPhase, bool hasPreciseScrollingDeltas, uint32_t scrollCount, const WebCore::FloatSize& unacceleratedScrollingDelta, Modifiers modifiers, WallTime timestamp)
+WebWheelEvent::WebWheelEvent(Type type, const IntPoint& position, const IntPoint& globalPosition, const FloatSize& delta, const FloatSize& wheelTicks, Granularity granularity, bool directionInvertedFromDevice, Phase phase, Phase momentumPhase, bool hasPreciseScrollingDeltas, uint32_t scrollCount, const WebCore::FloatSize& unacceleratedScrollingDelta, OptionSet<Modifier> modifiers, WallTime timestamp)
     : WebEvent(type, modifiers, timestamp)
     , m_position(position)
     , m_globalPosition(globalPosition)
@@ -67,7 +67,7 @@ WebWheelEvent::WebWheelEvent(Type type, const IntPoint& position, const IntPoint
     ASSERT(isWheelEventType(type));
 }
 #elif PLATFORM(GTK)
-WebWheelEvent::WebWheelEvent(Type type, const IntPoint& position, const IntPoint& globalPosition, const FloatSize& delta, const FloatSize& wheelTicks, Phase phase, Phase momentumPhase, Granularity granularity, Modifiers modifiers, WallTime timestamp)
+WebWheelEvent::WebWheelEvent(Type type, const IntPoint& position, const IntPoint& globalPosition, const FloatSize& delta, const FloatSize& wheelTicks, Phase phase, Phase momentumPhase, Granularity granularity, OptionSet<Modifier> modifiers, WallTime timestamp)
     : WebEvent(type, modifiers, timestamp)
     , m_position(position)
     , m_globalPosition(globalPosition)
index 6c297f5..be07321 100644 (file)
@@ -45,27 +45,27 @@ static inline bool isGdkKeyCodeFromKeyPad(unsigned keyval)
     return keyval >= GDK_KP_Space && keyval <= GDK_KP_9;
 }
 
-static inline WebEvent::Modifiers modifiersForEvent(const GdkEvent* event)
+static inline OptionSet<WebEvent::Modifier> modifiersForEvent(const GdkEvent* event)
 {
-    unsigned modifiers = 0;
+    OptionSet<WebEvent::Modifier> modifiers;
     GdkModifierType state;
 
     // Check for a valid state in GdkEvent.
     if (!gdk_event_get_state(event, &state))
-        return static_cast<WebEvent::Modifiers>(0);
+        return modifiers;
 
     if (state & GDK_CONTROL_MASK)
-        modifiers |= WebEvent::ControlKey;
+        modifiers.add(WebEvent::Modifier::ControlKey);
     if (state & GDK_SHIFT_MASK)
-        modifiers |= WebEvent::ShiftKey;
+        modifiers.add(WebEvent::Modifier::ShiftKey);
     if (state & GDK_MOD1_MASK)
-        modifiers |= WebEvent::AltKey;
+        modifiers.add(WebEvent::Modifier::AltKey);
     if (state & GDK_META_MASK)
-        modifiers |= WebEvent::MetaKey;
+        modifiers.add(WebEvent::Modifier::MetaKey);
     if (PlatformKeyboardEvent::modifiersContainCapsLock(state))
-        modifiers |= WebEvent::CapsLockKey;
+        modifiers.add(WebEvent::CapsLockKey);
 
-    return static_cast<WebEvent::Modifiers>(modifiers);
+    return modifiers;
 }
 
 static inline WebMouseEvent::Button buttonForEvent(const GdkEvent* event)
index 086406c..995f640 100644 (file)
@@ -120,7 +120,7 @@ Vector<WebPlatformTouchPoint> NativeWebTouchEvent::extractWebTouchPoint(const _U
 NativeWebTouchEvent::NativeWebTouchEvent(const _UIWebTouchEvent* event)
     : WebTouchEvent(
         webEventTypeForUIWebTouchEventType(event->type),
-        static_cast<Modifiers>(0),
+        OptionSet<Modifier> { },
         WallTime::fromRawSeconds(event->timestamp),
         extractWebTouchPoint(event),
         positionForCGPoint(event->locationInDocumentCoordinates),
index 4a9584e..84a7a5a 100644 (file)
 #import <WebCore/KeyEventCodesIOS.h>
 #import <WebCore/PlatformEventFactoryIOS.h>
 
-static WebKit::WebEvent::Modifiers modifiersForEvent(::WebEvent *event)
+static OptionSet<WebKit::WebEvent::Modifier> modifiersForEvent(::WebEvent *event)
 {
-    unsigned modifiers = 0;
+    OptionSet<WebKit::WebEvent::Modifier> modifiers;
     WebEventFlags eventModifierFlags = event.modifierFlags;
-
     if (eventModifierFlags & WebEventFlagMaskShiftKey)
-        modifiers |= WebKit::WebEvent::ShiftKey;
+        modifiers.add(WebKit::WebEvent::Modifier::ShiftKey);
     if (eventModifierFlags & WebEventFlagMaskControlKey)
-        modifiers |= WebKit::WebEvent::ControlKey;
+        modifiers.add(WebKit::WebEvent::Modifier::ControlKey);
     if (eventModifierFlags & WebEventFlagMaskOptionKey)
-        modifiers |= WebKit::WebEvent::AltKey;
+        modifiers.add(WebKit::WebEvent::Modifier::AltKey);
     if (eventModifierFlags & WebEventFlagMaskCommandKey)
-        modifiers |= WebKit::WebEvent::MetaKey;
+        modifiers.add(WebKit::WebEvent::Modifier::MetaKey);
     if (eventModifierFlags & WebEventFlagMaskLeftCapsLockKey)
-        modifiers |= WebKit::WebEvent::CapsLockKey;
-
-    return static_cast<WebKit::WebEvent::Modifiers>(modifiers);
+        modifiers.add(WebKit::WebEvent::Modifier::CapsLockKey);
+    return modifiers;
 }
 
 WebKit::WebKeyboardEvent WebIOSEventFactory::createWebKeyboardEvent(::WebEvent *event)
@@ -74,7 +72,7 @@ WebKit::WebKeyboardEvent WebIOSEventFactory::createWebKeyboardEvent(::WebEvent *
     int macCharCode = 0;
     bool isKeypad = false;
     bool isSystemKey = false;
-    WebKit::WebEvent::Modifiers modifiers = modifiersForEvent(event);
+    auto modifiers = modifiersForEvent(event);
     double timestamp = event.timestamp;
 
     if (windowsVirtualKeyCode == '\r') {
@@ -111,10 +109,9 @@ WebKit::WebMouseEvent WebIOSEventFactory::createWebMouseEvent(::WebEvent *event)
     float deltaY = 0;
     float deltaZ = 0;
     int clickCount = 0;
-    auto modifiers = static_cast<WebKit::WebEvent::Modifiers>(0);
     double timestamp = event.timestamp;
 
-    return WebKit::WebMouseEvent(type, button, buttons, position, position, deltaX, deltaY, deltaZ, clickCount, modifiers, WallTime::fromRawSeconds(timestamp));
+    return WebKit::WebMouseEvent(type, button, buttons, position, position, deltaX, deltaY, deltaZ, clickCount, OptionSet<WebKit::WebEvent::Modifier> { }, WallTime::fromRawSeconds(timestamp));
 }
 
 #endif // PLATFORM(IOS_FAMILY)
index e37fc14..864d01e 100644 (file)
@@ -38,20 +38,18 @@ static inline bool isWPEKeyCodeFromKeyPad(unsigned keyCode)
     return keyCode >= WPE_KEY_KP_Space && keyCode <= WPE_KEY_KP_9;
 }
 
-static WebEvent::Modifiers modifiersForEventModifiers(unsigned eventModifiers)
+static OptionSet<WebEvent::Modifier> modifiersForEventModifiers(unsigned eventModifiers)
 {
-    unsigned modifiers = 0;
-
+    OptionSet<WebEvent::Modifier> modifiers;
     if (eventModifiers & wpe_input_keyboard_modifier_control)
-        modifiers |= WebEvent::ControlKey;
+        modifiers.add(WebEvent::Modifier::ControlKey);
     if (eventModifiers & wpe_input_keyboard_modifier_shift)
-        modifiers |= WebEvent::ShiftKey;
+        modifiers.add(WebEvent::Modifier::ShiftKey);
     if (eventModifiers & wpe_input_keyboard_modifier_alt)
-        modifiers |= WebEvent::AltKey;
+        modifiers.add(WebEvent::Modifier::AltKey);
     if (eventModifiers & wpe_input_keyboard_modifier_meta)
-        modifiers |= WebEvent::MetaKey;
-
-    return static_cast<WebEvent::Modifiers>(modifiers);
+        modifiers.add(WebEvent::Modifier::MetaKey);
+    return modifiers;
 }
 
 WallTime wallTimeForEventTime(uint64_t timestamp)
@@ -176,7 +174,7 @@ WebWheelEvent WebEventFactory::createWebWheelEvent(struct wpe_input_axis_event*
     WebCore::IntPoint position(event->x, event->y);
     position.scale(1 / deviceScaleFactor);
     return WebWheelEvent(WebEvent::Wheel, position, position,
-        delta, wheelTicks, WebWheelEvent::ScrollByPixelWheelEvent, static_cast<WebEvent::Modifiers>(0), wallTimeForEventTime(event->time));
+        delta, wheelTicks, WebWheelEvent::ScrollByPixelWheelEvent, OptionSet<WebEvent::Modifier> { }, wallTimeForEventTime(event->time));
 }
 
 #if ENABLE(TOUCH_EVENTS)
@@ -232,7 +230,7 @@ WebTouchEvent WebEventFactory::createWebTouchEvent(struct wpe_input_touch_event*
                 pointCoordinates, pointCoordinates));
     }
 
-    return WebTouchEvent(type, WTFMove(touchPoints), WebEvent::Modifiers(0), wallTimeForEventTime(event->time));
+    return WebTouchEvent(type, WTFMove(touchPoints), OptionSet<WebEvent::Modifier> { }, wallTimeForEventTime(event->time));
 }
 #endif // ENABLE(TOUCH_EVENTS)
 
index ed85d68..bfd17e9 100644 (file)
@@ -309,22 +309,20 @@ static inline bool isKeyUpEvent(NSEvent *event)
     return false;
 }
 
-static inline WebEvent::Modifiers modifiersForEvent(NSEvent *event)
+static inline OptionSet<WebEvent::Modifier> modifiersForEvent(NSEvent *event)
 {
-    unsigned modifiers = 0;
-
+    OptionSet<WebEvent::Modifier> modifiers;
     if ([event modifierFlags] & NSEventModifierFlagCapsLock)
-        modifiers |= WebEvent::CapsLockKey;
+        modifiers.add(WebEvent::CapsLockKey);
     if ([event modifierFlags] & NSEventModifierFlagShift)
-        modifiers |= WebEvent::ShiftKey;
+        modifiers.add(WebEvent::Modifier::ShiftKey);
     if ([event modifierFlags] & NSEventModifierFlagControl)
-        modifiers |= WebEvent::ControlKey;
+        modifiers.add(WebEvent::Modifier::ControlKey);
     if ([event modifierFlags] & NSEventModifierFlagOption)
-        modifiers |= WebEvent::AltKey;
+        modifiers.add(WebEvent::Modifier::AltKey);
     if ([event modifierFlags] & NSEventModifierFlagCommand)
-        modifiers |= WebEvent::MetaKey;
-
-    return (WebEvent::Modifiers)modifiers;
+        modifiers.add(WebEvent::Modifier::MetaKey);
+    return modifiers;
 }
 
 static int typeForEvent(NSEvent *event)
@@ -362,7 +360,7 @@ WebMouseEvent WebEventFactory::createWebMouseEvent(NSEvent *event, NSEvent *last
     float deltaY = [event deltaY];
     float deltaZ = [event deltaZ];
     int clickCount = clickCountForEvent(event);
-    WebEvent::Modifiers modifiers = modifiersForEvent(event);
+    auto modifiers = modifiersForEvent(event);
     auto timestamp = WebCore::eventTimeStampSince1970(event);
     int eventNumber = [event eventNumber];
     int menuTypeForEvent = typeForEvent(event);
@@ -420,9 +418,9 @@ WebWheelEvent WebEventFactory::createWebWheelEvent(NSEvent *event, NSView *windo
         unacceleratedScrollingDelta = WebCore::FloatSize(deltaX, deltaY);
     }
 
-    WebEvent::Modifiers modifiers           = modifiersForEvent(event);
-    auto timestamp                          = WebCore::eventTimeStampSince1970(event);
-    
+    auto modifiers = modifiersForEvent(event);
+    auto timestamp = WebCore::eventTimeStampSince1970(event);
+
     return WebWheelEvent(WebEvent::Wheel, WebCore::IntPoint(position), WebCore::IntPoint(globalPosition), WebCore::FloatSize(deltaX, deltaY), WebCore::FloatSize(wheelTicksX, wheelTicksY), granularity, directionInvertedFromDevice, phase, momentumPhase, hasPreciseScrollingDeltas, scrollCount, unacceleratedScrollingDelta, modifiers, timestamp);
 }
 
@@ -440,7 +438,7 @@ WebKeyboardEvent WebEventFactory::createWebKeyboardEvent(NSEvent *event, bool ha
     bool autoRepeat                 = [event type] != NSEventTypeFlagsChanged && [event isARepeat];
     bool isKeypad                   = isKeypadEvent(event);
     bool isSystemKey                = false; // SystemKey is always false on the Mac.
-    WebEvent::Modifiers modifiers   = modifiersForEvent(event);
+    auto modifiers = modifiersForEvent(event);
     auto timestamp                  = WebCore::eventTimeStampSince1970(event);
 
     // Always use 13 for Enter/Return -- we don't want to use AppKit's different character for Enter.
index 91e04fa..8e40d60 100644 (file)
@@ -105,28 +105,28 @@ static inline bool IsKeyInDownState(int vk)
     return ::GetKeyState(vk) & 0x8000;
 }
 
-static inline WebEvent::Modifiers modifiersForEvent(WPARAM wparam)
+static inline OptionSet<WebEvent::Modifier> modifiersForEvent(WPARAM wparam)
 {
-    unsigned modifiers = 0;
+    OptionSet<WebEvent::Modifier> modifiers;
     if (wparam & MK_CONTROL)
-        modifiers |= WebEvent::ControlKey;
+        modifiers.add(WebEvent::Modifier::ControlKey);
     if (wparam & MK_SHIFT)
-        modifiers |= WebEvent::ShiftKey;
+        modifiers.add(WebEvent::Modifier::ShiftKey);
     if (IsKeyInDownState(VK_MENU))
-        modifiers |= WebEvent::AltKey;
-    return static_cast<WebEvent::Modifiers>(modifiers);
+        modifiers.add(WebEvent::Modifier::AltKey);
+    return modifiers;
 }
 
-static inline WebEvent::Modifiers modifiersForCurrentKeyState()
+static inline OptionSet<WebEvent::Modifier> modifiersForCurrentKeyState()
 {
-    unsigned modifiers = 0;
+    OptionSet<WebEvent::Modifier> modifiers;
     if (IsKeyInDownState(VK_CONTROL))
-        modifiers |= WebEvent::ControlKey;
+        modifiers.add(WebEvent::Modifier::ControlKey);
     if (IsKeyInDownState(VK_SHIFT))
-        modifiers |= WebEvent::ShiftKey;
+        modifiers.add(WebEvent::Modifier::ShiftKey);
     if (IsKeyInDownState(VK_MENU))
-        modifiers |= WebEvent::AltKey;
-    return static_cast<WebEvent::Modifiers>(modifiers);
+        modifiers.add(WebEvent::Modifier::AltKey);
+    return modifiers;
 }
 
 static inline WebEvent::Type keyboardEventTypeForEvent(UINT message)
@@ -394,7 +394,7 @@ WebMouseEvent WebEventFactory::createWebMouseEvent(HWND hWnd, UINT message, WPAR
     double timestamp = ::GetTickCount() * 0.001; // ::GetTickCount returns milliseconds (Chrome uses GetMessageTime() / 1000.0)
 
     int clickCount = WebKit::clickCount(type, button, position, timestamp);
-    WebEvent::Modifiers modifiers = modifiersForEvent(wParam);
+    auto modifiers = modifiersForEvent(wParam);
 
     return WebMouseEvent(type, button, 0, position, globalPosition, 0, 0, 0, clickCount, modifiers, WallTime::now(), didActivateWebView);
 }
@@ -407,7 +407,7 @@ WebWheelEvent WebEventFactory::createWebWheelEvent(HWND hWnd, UINT message, WPAR
 
     WebWheelEvent::Granularity granularity = WebWheelEvent::ScrollByPixelWheelEvent;
 
-    WebEvent::Modifiers modifiers = modifiersForEvent(wParam);
+    auto modifiers = modifiersForEvent(wParam);
 
     int deltaX = 0;
     int deltaY = 0;
@@ -424,7 +424,7 @@ WebWheelEvent WebEventFactory::createWebWheelEvent(HWND hWnd, UINT message, WPAR
         wheelTicksX = 0;
         wheelTicksY = delta;
     }
-    if (isMouseHWheel || (modifiers & WebEvent::ShiftKey)) {
+    if (isMouseHWheel || (modifiers & WebEvent::Modifier::ShiftKey)) {
         deltaX = delta * static_cast<float>(horizontalScrollChars()) * WebCore::cScrollbarPixelsPerLine;
         deltaY = 0;
         granularity = WebWheelEvent::ScrollByPixelWheelEvent;
@@ -455,7 +455,7 @@ WebKeyboardEvent WebEventFactory::createWebKeyboardEvent(HWND hwnd, UINT message
     bool autoRepeat = HIWORD(lparam) & KF_REPEAT;
     bool isKeypad = isKeypadEvent(wparam, lparam, type);
     bool isSystemKey = isSystemKeyEvent(message);
-    WebEvent::Modifiers modifiers = modifiersForCurrentKeyState();
+    auto modifiers = modifiersForCurrentKeyState();
 
     return WebKeyboardEvent(type, text, unmodifiedText, keyIdentifier, windowsVirtualKeyCode, nativeVirtualKeyCode, macCharCode, autoRepeat, isKeypad, isSystemKey, modifiers, WallTime::now());
 }
index 182499c..e7cf081 100644 (file)
@@ -50,7 +50,7 @@ public:
     const WTF::URL& originalURL() const { return !m_originalURL.isNull() ? m_originalURL : m_request.url(); }
 
     WebCore::NavigationType navigationType() const { return m_navigationActionData.navigationType; }
-    WebKit::WebEvent::Modifiers modifiers() const { return m_navigationActionData.modifiers; }
+    OptionSet<WebKit::WebEvent::Modifier> modifiers() const { return m_navigationActionData.modifiers; }
     WebKit::WebMouseEvent::Button mouseButton() const { return m_navigationActionData.mouseButton; }
     WebKit::WebMouseEvent::SyntheticClickType syntheticClickType() const { return m_navigationActionData.syntheticClickType; }
     WebCore::FloatPoint clickLocationInRootViewCoordinates() const { return m_navigationActionData.clickLocationInRootViewCoordinates; }
index d788a50..97ab4cc 100644 (file)
@@ -90,7 +90,7 @@ public:
     virtual void runJavaScriptPrompt(WebKit::WebPageProxy*, const WTF::String&, const WTF::String&, WebKit::WebFrameProxy*, const WebCore::SecurityOriginData&, Function<void (const WTF::String&)>&& completionHandler) { completionHandler(WTF::String()); }
 
     virtual void setStatusText(WebKit::WebPageProxy*, const WTF::String&) { }
-    virtual void mouseDidMoveOverElement(WebKit::WebPageProxy&, const WebKit::WebHitTestResultData&, WebKit::WebEvent::Modifiers, Object*) { }
+    virtual void mouseDidMoveOverElement(WebKit::WebPageProxy&, const WebKit::WebHitTestResultData&, OptionSet<WebKit::WebEvent::Modifier>, Object*) { }
 #if ENABLE(NETSCAPE_PLUGIN_API)
     virtual void unavailablePluginButtonClicked(WebKit::WebPageProxy&, WKPluginUnavailabilityReason, Dictionary&) { }
 #endif // ENABLE(NETSCAPE_PLUGIN_API)
index 84104ac..f05bf0a 100644 (file)
@@ -1678,7 +1678,7 @@ void WKPageSetPageUIClient(WKPageRef pageRef, const WKPageUIClientBase* wkClient
             m_client.setStatusText(toAPI(page), toAPI(text.impl()), m_client.base.clientInfo);
         }
 
-        void mouseDidMoveOverElement(WebPageProxy& page, const WebHitTestResultData& data, WebKit::WebEvent::Modifiers modifiers, API::Object* userData) final
+        void mouseDidMoveOverElement(WebPageProxy& page, const WebHitTestResultData& data, OptionSet<WebKit::WebEvent::Modifier> modifiers, API::Object* userData) final
         {
             if (!m_client.mouseDidMoveOverElement && !m_client.mouseDidMoveOverElement_deprecatedForUseWithV0)
                 return;
index 47aacc3..981cdd8 100644 (file)
@@ -77,21 +77,19 @@ static WKSyntheticClickType toWKSyntheticClickType(WebKit::WebMouseEvent::Synthe
 #if PLATFORM(MAC)
 
 // FIXME: This really belongs in WebEventFactory.
-static NSEventModifierFlags toNSEventModifierFlags(WebKit::WebEvent::Modifiers modifiers)
+static NSEventModifierFlags toNSEventModifierFlags(OptionSet<WebKit::WebEvent::Modifier> modifiers)
 {
     NSEventModifierFlags modifierFlags = 0;
-
-    if (modifiers & WebKit::WebEvent::CapsLockKey)
+    if (modifiers.contains(WebKit::WebEvent::CapsLockKey))
         modifierFlags |= NSEventModifierFlagCapsLock;
-    if (modifiers & WebKit::WebEvent::ShiftKey)
+    if (modifiers.contains(WebKit::WebEvent::Modifier::ShiftKey))
         modifierFlags |= NSEventModifierFlagShift;
-    if (modifiers & WebKit::WebEvent::ControlKey)
+    if (modifiers.contains(WebKit::WebEvent::Modifier::ControlKey))
         modifierFlags |= NSEventModifierFlagControl;
-    if (modifiers & WebKit::WebEvent::AltKey)
+    if (modifiers.contains(WebKit::WebEvent::Modifier::AltKey))
         modifierFlags |= NSEventModifierFlagOption;
-    if (modifiers & WebKit::WebEvent::MetaKey)
+    if (modifiers.contains(WebKit::WebEvent::Modifier::MetaKey))
         modifierFlags |= NSEventModifierFlagCommand;
-
     return modifierFlags;
 }
 
index 159620a..85dd40e 100644 (file)
 #endif
 
 #if PLATFORM(GTK)
-unsigned toPlatformModifiers(WebKit::WebEvent::Modifiers wkModifiers)
+unsigned toPlatformModifiers(OptionSet<WebKit::WebEvent::Modifier> wkModifiers)
 {
     unsigned modifiers = 0;
-    if (wkModifiers & WebKit::WebEvent::Modifiers::ShiftKey)
+    if (wkModifiers.contains(WebKit::WebEvent::Modifier::ShiftKey))
         modifiers |= GDK_SHIFT_MASK;
-    if (wkModifiers & WebKit::WebEvent::Modifiers::ControlKey)
+    if (wkModifiers.contains(WebKit::WebEvent::Modifier::ControlKey))
         modifiers |= GDK_CONTROL_MASK;
-    if (wkModifiers & WebKit::WebEvent::Modifiers::AltKey)
+    if (wkModifiers.contains(WebKit::WebEvent::Modifier::AltKey))
         modifiers |= GDK_MOD1_MASK;
-    if (wkModifiers & WebKit::WebEvent::Modifiers::MetaKey)
+    if (wkModifiers.contains(WebKit::WebEvent::Modifier::MetaKey))
         modifiers |= GDK_META_MASK;
-    if (wkModifiers & WebKit::WebEvent::Modifiers::CapsLockKey)
+    if (wkModifiers.contains(WebKit::WebEvent::Modifier::CapsLockKey))
         modifiers |= GDK_LOCK_MASK;
     return modifiers;
 }
 #elif PLATFORM(WPE)
-unsigned toPlatformModifiers(WebKit::WebEvent::Modifiers wkModifiers)
+unsigned toPlatformModifiers(OptionSet<WebKit::WebEvent::Modifier> wkModifiers)
 {
     unsigned modifiers = 0;
-    if (wkModifiers & WebKit::WebEvent::Modifiers::ShiftKey)
+    if (wkModifiers.contains(WebKit::WebEvent::Modifier::ShiftKey))
         modifiers |= wpe_input_keyboard_modifier_shift;
-    if (wkModifiers & WebKit::WebEvent::Modifiers::ControlKey)
+    if (wkModifiers.contains(WebKit::WebEvent::Modifier::ControlKey))
         modifiers |= wpe_input_keyboard_modifier_control;
-    if (wkModifiers & WebKit::WebEvent::Modifiers::AltKey)
+    if (wkModifiers.contains(WebKit::WebEvent::Modifier::AltKey))
         modifiers |= wpe_input_keyboard_modifier_alt;
-    if (wkModifiers & WebKit::WebEvent::Modifiers::MetaKey)
+    if (wkModifiers.contains(WebKit::WebEvent::Modifier::MetaKey))
         modifiers |= wpe_input_keyboard_modifier_meta;
     return modifiers;
 }
index b771ec4..f9414b9 100644 (file)
@@ -29,7 +29,7 @@
 #include "WebKitNavigationAction.h"
 #include <WebCore/FrameLoaderTypes.h>
 
-unsigned toPlatformModifiers(WebKit::WebEvent::Modifiers);
+unsigned toPlatformModifiers(OptionSet<WebKit::WebEvent::Modifier>);
 WebKitNavigationType toWebKitNavigationType(WebCore::NavigationType);
 unsigned toWebKitMouseButton(WebKit::WebMouseEvent::Button);
 unsigned toWebKitError(unsigned webCoreError);
index 2e52a3e..c830f5a 100644 (file)
@@ -89,7 +89,7 @@ private:
         webkitWebViewRunJavaScriptBeforeUnloadConfirm(m_webView, message.utf8(), WTFMove(completionHandler));
     }
 
-    void mouseDidMoveOverElement(WebPageProxy&, const WebHitTestResultData& data, WebEvent::Modifiers modifiers, API::Object*) final
+    void mouseDidMoveOverElement(WebPageProxy&, const WebHitTestResultData& data, OptionSet<WebEvent::Modifier> modifiers, API::Object*) final
     {
         webkitWebViewMouseTargetChanged(m_webView, data, modifiers);
     }
index 67201d8..fafc803 100644 (file)
@@ -262,7 +262,7 @@ struct _WebKitWebViewPrivate {
     GRefPtr<GMainLoop> modalLoop;
 
     GRefPtr<WebKitHitTestResult> mouseTargetHitTestResult;
-    WebEvent::Modifiers mouseTargetModifiers;
+    OptionSet<WebEvent::Modifier> mouseTargetModifiers;
 
     GRefPtr<WebKitFindController> findController;
 
@@ -2278,7 +2278,7 @@ void webkitWebViewMakePermissionRequest(WebKitWebView* webView, WebKitPermission
     g_signal_emit(webView, signals[PERMISSION_REQUEST], 0, request, &returnValue);
 }
 
-void webkitWebViewMouseTargetChanged(WebKitWebView* webView, const WebHitTestResultData& hitTestResult, WebEvent::Modifiers modifiers)
+void webkitWebViewMouseTargetChanged(WebKitWebView* webView, const WebHitTestResultData& hitTestResult, OptionSet<WebEvent::Modifier> modifiers)
 {
 #if PLATFORM(GTK)
     webkitWebViewBaseSetTooltipArea(WEBKIT_WEB_VIEW_BASE(webView), hitTestResult.elementBoundingBox);
index e9ef60c..b5e14e1 100644 (file)
@@ -65,7 +65,7 @@ void webkitWebViewDismissCurrentScriptDialog(WebKitWebView*);
 Optional<WebKitScriptDialogType> webkitWebViewGetCurrentScriptDialogType(WebKitWebView*);
 void webkitWebViewMakePermissionRequest(WebKitWebView*, WebKitPermissionRequest*);
 void webkitWebViewMakePolicyDecision(WebKitWebView*, WebKitPolicyDecisionType, WebKitPolicyDecision*);
-void webkitWebViewMouseTargetChanged(WebKitWebView*, const WebKit::WebHitTestResultData&, WebKit::WebEvent::Modifiers);
+void webkitWebViewMouseTargetChanged(WebKitWebView*, const WebKit::WebHitTestResultData&, OptionSet<WebKit::WebEvent::Modifier>);
 void webkitWebViewHandleDownloadRequest(WebKitWebView*, WebKit::DownloadProxy*);
 void webkitWebViewPrintFrame(WebKitWebView*, WebKit::WebFrameProxy*);
 void webkitWebViewResourceLoadStarted(WebKitWebView*, WebKit::WebFrameProxy*, uint64_t resourceIdentifier, WebKitURIRequest*);
index 62a52da..593718e 100644 (file)
@@ -1531,7 +1531,7 @@ void WebAutomationSession::simulateMouseInteraction(WebPageProxy& page, MouseInt
             callbackInMap(AUTOMATION_COMMAND_ERROR_WITH_NAME(Timeout));
         callbackInMap = WTFMove(mouseEventsFlushedCallback);
 
-        platformSimulateMouseInteraction(page, interaction, mouseButton, locationInView, (WebEvent::Modifiers)m_currentModifiers);
+        platformSimulateMouseInteraction(page, interaction, mouseButton, locationInView, OptionSet<WebEvent::Modifier>::fromRaw(m_currentModifiers));
 
         // If the event does not hit test anything in the window, then it may not have been delivered.
         if (callbackInMap && !page->isProcessingMouseEvents()) {
@@ -1590,17 +1590,17 @@ void WebAutomationSession::simulateKeyboardInteraction(WebPageProxy& page, Keybo
 #endif // ENABLE(WEBDRIVER_ACTIONS_API)
 
 #if ENABLE(WEBDRIVER_MOUSE_INTERACTIONS)
-static WebEvent::Modifiers protocolModifierToWebEventModifier(Inspector::Protocol::Automation::KeyModifier modifier)
+static WebEvent::Modifier protocolModifierToWebEventModifier(Inspector::Protocol::Automation::KeyModifier modifier)
 {
     switch (modifier) {
     case Inspector::Protocol::Automation::KeyModifier::Alt:
-        return WebEvent::AltKey;
+        return WebEvent::Modifier::AltKey;
     case Inspector::Protocol::Automation::KeyModifier::Meta:
-        return WebEvent::MetaKey;
+        return WebEvent::Modifier::MetaKey;
     case Inspector::Protocol::Automation::KeyModifier::Control:
-        return WebEvent::ControlKey;
+        return WebEvent::Modifier::ControlKey;
     case Inspector::Protocol::Automation::KeyModifier::Shift:
-        return WebEvent::ShiftKey;
+        return WebEvent::Modifier::ShiftKey;
     case Inspector::Protocol::Automation::KeyModifier::CapsLock:
         return WebEvent::CapsLockKey;
     }
@@ -1644,7 +1644,7 @@ void WebAutomationSession::performMouseInteraction(const String& handle, const J
     if (!requestedPositionObject.getDouble("y"_s, y))
         ASYNC_FAIL_WITH_PREDEFINED_ERROR_AND_DETAILS(MissingParameter, "The parameter 'y' was not found.");
 
-    WebEvent::Modifiers keyModifiers = (WebEvent::Modifiers)0;
+    OptionSet<WebEvent::Modifier> keyModifiers;
     for (auto it = keyModifierStrings.begin(); it != keyModifierStrings.end(); ++it) {
         String modifierString;
         if (!it->get()->asString(modifierString))
@@ -1653,8 +1653,7 @@ void WebAutomationSession::performMouseInteraction(const String& handle, const J
         auto parsedModifier = Inspector::Protocol::AutomationHelpers::parseEnumValueFromString<Inspector::Protocol::Automation::KeyModifier>(modifierString);
         if (!parsedModifier)
             ASYNC_FAIL_WITH_PREDEFINED_ERROR_AND_DETAILS(InvalidParameter, "A modifier in the 'modifiers' array is invalid.");
-        WebEvent::Modifiers enumValue = protocolModifierToWebEventModifier(parsedModifier.value());
-        keyModifiers = (WebEvent::Modifiers)(enumValue | keyModifiers);
+        keyModifiers.add(protocolModifierToWebEventModifier(parsedModifier.value()));
     }
 
     page->getWindowFrameWithCallback([this, protectedThis = makeRef(*this), callback = WTFMove(callback), page = makeRef(*page), x, y, mouseInteractionString, mouseButtonString, keyModifiers](WebCore::FloatRect windowFrame) mutable {
index bad0702..5dfdc18 100644 (file)
@@ -247,7 +247,7 @@ private:
 
     // Platform-dependent implementations.
 #if ENABLE(WEBDRIVER_MOUSE_INTERACTIONS)
-    void platformSimulateMouseInteraction(WebPageProxy&, MouseInteraction, WebMouseEvent::Button, const WebCore::IntPoint& locationInView, WebEvent::Modifiers keyModifiers);
+    void platformSimulateMouseInteraction(WebPageProxy&, MouseInteraction, WebMouseEvent::Button, const WebCore::IntPoint& locationInView, OptionSet<WebEvent::Modifier>);
 #endif
 #if ENABLE(WEBDRIVER_TOUCH_INTERACTIONS)
     // Simulates a single touch point being pressed, moved, and released.
index 415a18a..0035a37 100644 (file)
 namespace WebKit {
 using namespace WebCore;
 
-static unsigned modifiersToEventState(WebEvent::Modifiers modifiers)
+static unsigned modifiersToEventState(OptionSet<WebEvent::Modifier> modifiers)
 {
     unsigned state = 0;
-
-    if (modifiers & WebEvent::ControlKey)
+    if (modifiers.contains(WebEvent::Modifier::ControlKey))
         state |= GDK_CONTROL_MASK;
-    if (modifiers & WebEvent::ShiftKey)
+    if (modifiers.contains(WebEvent::Modifier::ShiftKey))
         state |= GDK_SHIFT_MASK;
-    if (modifiers & WebEvent::AltKey)
+    if (modifiers.contains(WebEvent::Modifier::AltKey))
         state |= GDK_META_MASK;
-    if (modifiers & WebEvent::CapsLockKey)
+    if (modifiers.contains(WebEvent::CapsLockKey))
         state |= GDK_LOCK_MASK;
     return state;
 }
@@ -102,7 +101,7 @@ static void doMotionEvent(GtkWidget* widget, const WebCore::IntPoint& location,
     gtk_main_do_event(event.get());
 }
 
-void WebAutomationSession::platformSimulateMouseInteraction(WebPageProxy& page, MouseInteraction interaction, WebMouseEvent::Button button, const WebCore::IntPoint& locationInView, WebEvent::Modifiers keyModifiers)
+void WebAutomationSession::platformSimulateMouseInteraction(WebPageProxy& page, MouseInteraction interaction, WebMouseEvent::Button button, const WebCore::IntPoint& locationInView, OptionSet<WebEvent::Modifier> keyModifiers)
 {
     unsigned gdkButton = mouseButtonToGdkButton(button);
     auto modifier = stateModifierForGdkButton(gdkButton);
index b7f139f..b49ff39 100644 (file)
@@ -121,22 +121,22 @@ bool WebAutomationSession::wasEventSynthesizedForAutomation(NSEvent *event)
 #pragma mark Platform-dependent Implementations
 
 #if ENABLE(WEBDRIVER_MOUSE_INTERACTIONS)
-void WebAutomationSession::platformSimulateMouseInteraction(WebPageProxy& page, MouseInteraction interaction, WebMouseEvent::Button button, const WebCore::IntPoint& locationInView, WebEvent::Modifiers keyModifiers)
+void WebAutomationSession::platformSimulateMouseInteraction(WebPageProxy& page, MouseInteraction interaction, WebMouseEvent::Button button, const WebCore::IntPoint& locationInView, OptionSet<WebEvent::Modifier> keyModifiers)
 {
     IntRect windowRect;
     page.rootViewToWindow(IntRect(locationInView, IntSize()), windowRect);
     IntPoint locationInWindow = windowRect.location();
 
     NSEventModifierFlags modifiers = 0;
-    if (keyModifiers & WebEvent::MetaKey)
+    if (keyModifiers.contains(WebEvent::Modifier::MetaKey))
         modifiers |= NSEventModifierFlagCommand;
-    if (keyModifiers & WebEvent::AltKey)
+    if (keyModifiers.contains(WebEvent::Modifier::AltKey))
         modifiers |= NSEventModifierFlagOption;
-    if (keyModifiers & WebEvent::ControlKey)
+    if (keyModifiers.contains(WebEvent::Modifier::ControlKey))
         modifiers |= NSEventModifierFlagControl;
-    if (keyModifiers & WebEvent::ShiftKey)
+    if (keyModifiers.contains(WebEvent::Modifier::ShiftKey))
         modifiers |= NSEventModifierFlagShift;
-    if (keyModifiers & WebEvent::CapsLockKey)
+    if (keyModifiers.contains(WebEvent::CapsLockKey))
         modifiers |= NSEventModifierFlagCapsLock;
 
     NSTimeInterval timestamp = [NSDate timeIntervalSinceReferenceDate];
index f54c21e..d7f3b03 100644 (file)
 namespace WebKit {
 using namespace WebCore;
 
-static uint32_t modifiersToEventState(WebEvent::Modifiers modifiers)
+static uint32_t modifiersToEventState(OptionSet<WebEvent::Modifier> modifiers)
 {
     uint32_t state = 0;
-
-    if (modifiers & WebEvent::ControlKey)
+    if (modifiers.contains(WebEvent::Modifier::ControlKey))
         state |= wpe_input_keyboard_modifier_control;
-    if (modifiers & WebEvent::ShiftKey)
+    if (modifiers.contains(WebEvent::Modifier::ShiftKey))
         state |= wpe_input_keyboard_modifier_shift;
-    if (modifiers & WebEvent::AltKey)
+    if (modifiers.contains(WebEvent::Modifier::AltKey))
         state |= wpe_input_keyboard_modifier_alt;
-
     return state;
 }
 
@@ -93,7 +91,7 @@ static void doMotionEvent(struct wpe_view_backend* viewBackend, const WebCore::I
     wpe_view_backend_dispatch_pointer_event(viewBackend, &event);
 }
 
-void WebAutomationSession::platformSimulateMouseInteraction(WebPageProxy& page, MouseInteraction interaction, WebMouseEvent::Button button, const WebCore::IntPoint& locationInView, WebEvent::Modifiers keyModifiers)
+void WebAutomationSession::platformSimulateMouseInteraction(WebPageProxy& page, MouseInteraction interaction, WebMouseEvent::Button button, const WebCore::IntPoint& locationInView, OptionSet<WebEvent::Modifier> keyModifiers)
 {
     unsigned wpeButton = mouseButtonToWPEButton(button);
     auto modifier = stateModifierForWPEButton(wpeButton);
index f5a9473..cdc4faa 100644 (file)
@@ -114,7 +114,7 @@ private:
         void decidePolicyForNotificationPermissionRequest(WebPageProxy&, API::SecurityOrigin&, Function<void(bool)>&&) final;
         void handleAutoplayEvent(WebPageProxy&, WebCore::AutoplayEvent, OptionSet<WebCore::AutoplayEventFlags>) final;
         void unavailablePluginButtonClicked(WebPageProxy&, WKPluginUnavailabilityReason, API::Dictionary&) final;
-        void mouseDidMoveOverElement(WebPageProxy&, const WebHitTestResultData&, WebEvent::Modifiers, API::Object*);
+        void mouseDidMoveOverElement(WebPageProxy&, const WebHitTestResultData&, OptionSet<WebEvent::Modifier>, API::Object*);
         void didClickAutoFillButton(WebPageProxy&, API::Object*) final;
         void toolbarsAreVisible(WebPageProxy&, Function<void(bool)>&&) final;
         bool runOpenPanel(WebPageProxy*, WebFrameProxy*, const WebCore::SecurityOriginData&, API::OpenPanelParameters*, WebOpenPanelResultListenerProxy*) final;
index b8ab985..50cb081 100644 (file)
@@ -687,23 +687,23 @@ void UIDelegate::UIClient::windowFrame(WebKit::WebPageProxy&, Function<void(WebC
     }).get()];
 }
 
-static NSEventModifierFlags toNSEventModifierFlags(WebEvent::Modifiers modifiers)
+static NSEventModifierFlags toNSEventModifierFlags(OptionSet<WebEvent::Modifier> modifiers)
 {
     NSEventModifierFlags flags = 0;
-    if (modifiers & WebEvent::ShiftKey)
+    if (modifiers.contains(WebEvent::Modifier::ShiftKey))
         flags |= NSEventModifierFlagShift;
-    if (modifiers & WebEvent::ControlKey)
+    if (modifiers.contains(WebEvent::Modifier::ControlKey))
         flags |= NSEventModifierFlagControl;
-    if (modifiers & WebEvent::AltKey)
+    if (modifiers.contains(WebEvent::Modifier::AltKey))
         flags |= NSEventModifierFlagOption;
-    if (modifiers & WebEvent::MetaKey)
+    if (modifiers.contains(WebEvent::Modifier::MetaKey))
         flags |= NSEventModifierFlagCommand;
-    if (modifiers & WebEvent::CapsLockKey)
+    if (modifiers.contains(WebEvent::CapsLockKey))
         flags |= NSEventModifierFlagCapsLock;
     return flags;
 }
 
-void UIDelegate::UIClient::mouseDidMoveOverElement(WebPageProxy&, const WebHitTestResultData& data, WebEvent::Modifiers modifiers, API::Object* userInfo)
+void UIDelegate::UIClient::mouseDidMoveOverElement(WebPageProxy&, const WebHitTestResultData& data, OptionSet<WebEvent::Modifier> modifiers, API::Object* userInfo)
 {
     if (!m_uiDelegate.m_delegateMethods.webViewMouseDidMoveOverElementWithFlagsUserInfo)
         return;
index c8e0feb..7ab56f1 100644 (file)
@@ -4920,9 +4920,7 @@ void WebPageProxy::setStatusText(const String& text)
 void WebPageProxy::mouseDidMoveOverElement(WebHitTestResultData&& hitTestResultData, uint32_t opaqueModifiers, UserData&& userData)
 {
     m_lastMouseMoveHitTestResult = API::HitTestResult::create(hitTestResultData);
-
-    WebEvent::Modifiers modifiers = static_cast<WebEvent::Modifiers>(opaqueModifiers);
-
+    auto modifiers = OptionSet<WebEvent::Modifier>::fromRaw(opaqueModifiers);
     m_uiClient->mouseDidMoveOverElement(*this, hitTestResultData, modifiers, m_process->transformHandlesToObjects(userData.object()).get());
 }
 
index a09a93e..749d32d 100644 (file)
@@ -54,7 +54,7 @@ public:
     virtual void willRunJavaScriptAlert(WebKit::WebPage*, const WTF::String&, WebKit::WebFrame*) { }
     virtual void willRunJavaScriptConfirm(WebKit::WebPage*, const WTF::String&, WebKit::WebFrame*) { }
     virtual void willRunJavaScriptPrompt(WebKit::WebPage*, const WTF::String&, const WTF::String&, WebKit::WebFrame*) { }
-    virtual void mouseDidMoveOverElement(WebKit::WebPage*, const WebCore::HitTestResult&, WebKit::WebEvent::Modifiers, RefPtr<API::Object>& userData) { UNUSED_PARAM(userData); }
+    virtual void mouseDidMoveOverElement(WebKit::WebPage*, const WebCore::HitTestResult&, OptionSet<WebKit::WebEvent::Modifier>, RefPtr<API::Object>& userData) { UNUSED_PARAM(userData); }
     virtual void pageDidScroll(WebKit::WebPage*) { }
 
     virtual WTF::String shouldGenerateFileForUpload(WebKit::WebPage*, const WTF::String& originalFilePath) { UNUSED_PARAM(originalFilePath); return WTF::String(); }
index 822baaf..8ff4492 100644 (file)
@@ -58,21 +58,21 @@ static FloatPoint clickLocationInRootViewCoordinatesForMouseEventData(const Opti
     return { };
 }
 
-WebEvent::Modifiers InjectedBundleNavigationAction::modifiersForNavigationAction(const NavigationAction& navigationAction)
+OptionSet<WebEvent::Modifier> InjectedBundleNavigationAction::modifiersForNavigationAction(const NavigationAction& navigationAction)
 {
-    uint32_t modifiers = 0;
+    OptionSet<WebEvent::Modifier> modifiers;
     auto keyStateEventData = navigationAction.keyStateEventData();
     if (keyStateEventData && keyStateEventData->isTrusted) {
         if (keyStateEventData->shiftKey)
-            modifiers |= WebEvent::ShiftKey;
+            modifiers.add(WebEvent::Modifier::ShiftKey);
         if (keyStateEventData->ctrlKey)
-            modifiers |= WebEvent::ControlKey;
+            modifiers.add(WebEvent::Modifier::ControlKey);
         if (keyStateEventData->altKey)
-            modifiers |= WebEvent::AltKey;
+            modifiers.add(WebEvent::Modifier::AltKey);
         if (keyStateEventData->metaKey)
-            modifiers |= WebEvent::MetaKey;
+            modifiers.add(WebEvent::Modifier::MetaKey);
     }
-    return static_cast<WebEvent::Modifiers>(modifiers);
+    return modifiers;
 }
 
 WebMouseEvent::Button InjectedBundleNavigationAction::mouseButtonForNavigationAction(const NavigationAction& navigationAction)
index 504b409..9481bd8 100644 (file)
@@ -47,13 +47,13 @@ class InjectedBundleNavigationAction : public API::ObjectImpl<API::Object::Type:
 public:
     static Ref<InjectedBundleNavigationAction> create(WebFrame*, const WebCore::NavigationAction&, RefPtr<WebCore::FormState>&&);
 
-    static WebEvent::Modifiers modifiersForNavigationAction(const WebCore::NavigationAction&);
+    static OptionSet<WebEvent::Modifier> modifiersForNavigationAction(const WebCore::NavigationAction&);
     static WebMouseEvent::Button mouseButtonForNavigationAction(const WebCore::NavigationAction&);
     static WebMouseEvent::SyntheticClickType syntheticClickTypeForNavigationAction(const WebCore::NavigationAction&);
     static WebCore::FloatPoint clickLocationInRootViewCoordinatesForNavigationAction(const WebCore::NavigationAction&);
     
     WebCore::NavigationType navigationType() const { return m_navigationType; }
-    WebEvent::Modifiers modifiers() const { return m_modifiers; }
+    OptionSet<WebEvent::Modifier> modifiers() const { return m_modifiers; }
     WebMouseEvent::Button mouseButton() const { return m_mouseButton; }
     InjectedBundleHitTestResult* hitTestResult() const { return m_hitTestResult.get(); }
     InjectedBundleNodeHandle* formElement() const { return m_formElement.get(); }
@@ -68,7 +68,7 @@ private:
     InjectedBundleNavigationAction(WebFrame*, const WebCore::NavigationAction&, RefPtr<WebCore::FormState>&&);
 
     WebCore::NavigationType m_navigationType;
-    WebEvent::Modifiers m_modifiers;
+    OptionSet<WebEvent::Modifier> m_modifiers;
     WebMouseEvent::Button m_mouseButton;
     WebMouseEvent::SyntheticClickType m_syntheticClickType { WebMouseEvent::NoTap };
     WebCore::FloatPoint m_clickLocationInRootViewCoordinates;
index 6e282d9..58633d9 100644 (file)
@@ -73,7 +73,7 @@ void InjectedBundlePageUIClient::willRunJavaScriptPrompt(WebPage* page, const St
         m_client.willRunJavaScriptPrompt(toAPI(page), toAPI(message.impl()), toAPI(defaultValue.impl()), toAPI(frame), m_client.base.clientInfo);
 }
 
-void InjectedBundlePageUIClient::mouseDidMoveOverElement(WebPage* page, const HitTestResult& coreHitTestResult, WebEvent::Modifiers modifiers, RefPtr<API::Object>& userData)
+void InjectedBundlePageUIClient::mouseDidMoveOverElement(WebPage* page, const HitTestResult& coreHitTestResult, OptionSet<WebEvent::Modifier> modifiers, RefPtr<API::Object>& userData)
 {
     if (!m_client.mouseDidMoveOverElement)
         return;
index 0a33455..59f1b1c 100644 (file)
@@ -51,7 +51,7 @@ public:
     void willRunJavaScriptAlert(WebPage*, const String&, WebFrame*) override;
     void willRunJavaScriptConfirm(WebPage*, const String&, WebFrame*) override;
     void willRunJavaScriptPrompt(WebPage*, const String&, const String&, WebFrame*) override;
-    void mouseDidMoveOverElement(WebPage*, const WebCore::HitTestResult&, WebEvent::Modifiers, RefPtr<API::Object>& userData) override;
+    void mouseDidMoveOverElement(WebPage*, const WebCore::HitTestResult&, OptionSet<WebEvent::Modifier>, RefPtr<API::Object>& userData) override;
     void pageDidScroll(WebPage*) override;
 
     String shouldGenerateFileForUpload(WebPage*, const String& originalFilePath) override;
index 4af6660..79ced89 100644 (file)
@@ -1586,7 +1586,7 @@ bool PDFPlugin::showContextMenuAtPoint(const IntPoint& point)
 {
     FrameView* frameView = webFrame()->coreFrame()->view();
     IntPoint contentsPoint = frameView->contentsToRootView(point);
-    WebMouseEvent event(WebEvent::MouseDown, WebMouseEvent::RightButton, 0, contentsPoint, contentsPoint, 0, 0, 0, 1, static_cast<WebEvent::Modifiers>(0), WallTime::now(), WebCore::ForceAtClick);
+    WebMouseEvent event(WebEvent::MouseDown, WebMouseEvent::RightButton, 0, contentsPoint, contentsPoint, 0, 0, 0, 1, OptionSet<WebEvent::Modifier> { }, WallTime::now(), WebCore::ForceAtClick);
     return handleContextMenuEvent(event);
 }
 
index a301afb..7ab8966 100644 (file)
@@ -888,17 +888,17 @@ std::unique_ptr<WebEvent> PluginView::createWebEvent(MouseEvent& event) const
         break;
     }
 
-    unsigned modifiers = 0;
+    OptionSet<WebEvent::Modifier> modifiers;
     if (event.shiftKey())
-        modifiers |= WebEvent::ShiftKey;
+        modifiers.add(WebEvent::Modifier::ShiftKey);
     if (event.ctrlKey())
-        modifiers |= WebEvent::ControlKey;
+        modifiers.add(WebEvent::Modifier::ControlKey);
     if (event.altKey())
-        modifiers |= WebEvent::AltKey;
+        modifiers.add(WebEvent::Modifier::AltKey);
     if (event.metaKey())
-        modifiers |= WebEvent::MetaKey;
+        modifiers.add(WebEvent::Modifier::MetaKey);
 
-    return std::make_unique<WebMouseEvent>(type, button, event.buttons(), m_plugin->convertToRootView(IntPoint(event.offsetX(), event.offsetY())), event.screenLocation(), 0, 0, 0, clickCount, static_cast<WebEvent::Modifiers>(modifiers), WallTime { }, 0);
+    return std::make_unique<WebMouseEvent>(type, button, event.buttons(), m_plugin->convertToRootView(IntPoint(event.offsetX(), event.offsetY())), event.screenLocation(), 0, 0, 0, clickCount, modifiers, WallTime { }, 0);
 }
 
 void PluginView::handleEvent(Event& event)
index cc605ff..830cb44 100644 (file)
@@ -671,7 +671,7 @@ void WebChromeClient::mouseDidMoveOverElement(const HitTestResult& hitTestResult
     RefPtr<API::Object> userData;
 
     // Notify the bundle client.
-    m_page.injectedBundleUIClient().mouseDidMoveOverElement(&m_page, hitTestResult, static_cast<WebEvent::Modifiers>(modifierFlags), userData);
+    m_page.injectedBundleUIClient().mouseDidMoveOverElement(&m_page, hitTestResult, OptionSet<WebEvent::Modifier>::fromRaw(modifierFlags), userData);
 
     // Notify the UIProcess.
     WebHitTestResultData webHitTestResultData(hitTestResult);
index 999f87d..de34617 100644 (file)
@@ -4833,17 +4833,19 @@ void WebPage::handleAlternativeTextUIResult(const String& result)
 
 void WebPage::simulateMouseDown(int button, WebCore::IntPoint position, int clickCount, WKEventModifiers modifiers, WallTime time)
 {
-    mouseEvent(WebMouseEvent(WebMouseEvent::MouseDown, static_cast<WebMouseEvent::Button>(button), 0, position, position, 0, 0, 0, clickCount, static_cast<WebMouseEvent::Modifiers>(modifiers), time, WebCore::ForceAtClick, WebMouseEvent::NoTap));
+    static_assert(sizeof(WKEventModifiers) >= sizeof(WebEvent::Modifier), "WKEventModifiers must be greater than or equal to the size of WebEvent::Modifier");
+    mouseEvent(WebMouseEvent(WebMouseEvent::MouseDown, static_cast<WebMouseEvent::Button>(button), 0, position, position, 0, 0, 0, clickCount, OptionSet<WebEvent::Modifier>::fromRaw(modifiers), time, WebCore::ForceAtClick, WebMouseEvent::NoTap));
 }
 
 void WebPage::simulateMouseUp(int button, WebCore::IntPoint position, int clickCount, WKEventModifiers modifiers, WallTime time)
 {
-    mouseEvent(WebMouseEvent(WebMouseEvent::MouseUp, static_cast<WebMouseEvent::Button>(button), 0, position, position, 0, 0, 0, clickCount, static_cast<WebMouseEvent::Modifiers>(modifiers), time, WebCore::ForceAtClick, WebMouseEvent::NoTap));
+    static_assert(sizeof(WKEventModifiers) >= sizeof(WebEvent::Modifier), "WKEventModifiers must be greater than or equal to the size of WebEvent::Modifier");
+    mouseEvent(WebMouseEvent(WebMouseEvent::MouseUp, static_cast<WebMouseEvent::Button>(button), 0, position, position, 0, 0, 0, clickCount, OptionSet<WebEvent::Modifier>::fromRaw(modifiers), time, WebCore::ForceAtClick, WebMouseEvent::NoTap));
 }
 
 void WebPage::simulateMouseMotion(WebCore::IntPoint position, WallTime time)
 {
-    mouseEvent(WebMouseEvent(WebMouseEvent::MouseMove, WebMouseEvent::NoButton, 0, position, position, 0, 0, 0, 0, WebMouseEvent::Modifiers(), time, 0, WebMouseEvent::NoTap));
+    mouseEvent(WebMouseEvent(WebMouseEvent::MouseMove, WebMouseEvent::NoButton, 0, position, position, 0, 0, 0, 0, OptionSet<WebEvent::Modifier> { }, time, 0, WebMouseEvent::NoTap));
 }
 
 void WebPage::setCompositionForTesting(const String& compositionString, uint64_t from, uint64_t length, bool suppressUnderline)