WebKit Bugzilla
Attachment 361342 Details for
Bug 191446
: [iOS] Mouse/Touch/Pointer events are missing modifier keys
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Requests
|
Help
|
New Account
|
Log In
Remember
[x]
|
Forgot Password
Login:
[x]
[patch]
Work-in-progress patch
WIP.patch (text/plain), 39.30 KB, created by
Daniel Bates
on 2019-02-06 16:08:07 PST
(
hide
)
Description:
Work-in-progress patch
Filename:
MIME Type:
Creator:
Daniel Bates
Created:
2019-02-06 16:08:07 PST
Size:
39.30 KB
patch
obsolete
>From bde5e81bc227bc0dd2064e58eb31a1ada4c8e33f Mon Sep 17 00:00:00 2001 >From: Daniel Bates <dabates@apple.com> >Date: Mon, 4 Feb 2019 17:28:15 -0800 >Subject: [PATCH] First pass at supporting modifiers flags on touch > >--- > LayoutTests/resources/ui-helper.js | 22 ++++++---- > .../platform/ios/PlatformEventFactoryIOS.mm | 1 + > Source/WebKit/Platform/spi/ios/UIKitSPI.h | 4 ++ > Source/WebKit/Shared/NativeWebTouchEvent.h | 18 +++++--- > .../Shared/ios/NativeWebTouchEventIOS.mm | 20 ++++++++- > Source/WebKit/Shared/ios/WebIOSEventFactory.h | 8 ++-- > .../WebKit/Shared/ios/WebIOSEventFactory.mm | 16 +++++++ > .../UIProcess/API/Cocoa/WKNavigationAction.mm | 13 ++++++ > .../API/Cocoa/WKNavigationActionPrivate.h | 4 ++ > Source/WebKit/UIProcess/WebPageProxy.h | 7 +-- > .../UIProcess/ios/WKContentViewInteraction.h | 2 +- > .../UIProcess/ios/WKContentViewInteraction.mm | 14 +++--- > .../WebKit/UIProcess/ios/WebPageProxyIOS.mm | 12 ++--- > Source/WebKit/WebProcess/WebPage/WebPage.h | 11 ++--- > .../WebProcess/WebPage/WebPage.messages.in | 6 +-- > .../WebProcess/WebPage/ios/WebPageIOS.mm | 44 ++++++++++++------- > .../ios/UIScriptControllerIOS.mm | 4 ++ > .../Bindings/UIScriptController.idl | 2 + > .../UIScriptContext/UIScriptController.cpp | 4 ++ > .../UIScriptContext/UIScriptController.h | 1 + > .../ios/UIScriptControllerIOS.mm | 21 +++++++++ > 21 files changed, 174 insertions(+), 60 deletions(-) > >diff --git a/LayoutTests/resources/ui-helper.js b/LayoutTests/resources/ui-helper.js >index fe546a8c865..17b5cb63a77 100644 >--- a/LayoutTests/resources/ui-helper.js >+++ b/LayoutTests/resources/ui-helper.js >@@ -29,11 +29,12 @@ window.UIHelper = class UIHelper { > eventSender.mouseUp(); > } > >- static tapAt(x, y) >+ static tapAt(x, y, modifiers=[]) > { > console.assert(this.isIOS()); > > if (!this.isWebKit2()) { >+ console.assert(!modifiers || !modifiers.length); > eventSender.addTouchPoint(x, y); > eventSender.touchStart(); > eventSender.releaseTouchPoint(0); >@@ -43,17 +44,20 @@ window.UIHelper = class UIHelper { > > return new Promise((resolve) => { > testRunner.runUIScript(` >- uiController.singleTapAtPoint(${x}, ${y}, function() { >- uiController.uiScriptComplete(); >- });`, resolve); >+ uiController.performWithModifiers(() => { >+ uiController.singleTapAtPoint(${x}, ${y}, function() { >+ uiController.uiScriptComplete(); >+ }); >+ }, ${JSON.stringify(modifiers)});`, resolve); > }); > } > >- static doubleTapAt(x, y) >+ static doubleTapAt(x, y, modifiers=[]) > { > console.assert(this.isIOS()); > > if (!this.isWebKit2()) { >+ console.assert(!modifiers || !modifiers.length); > eventSender.addTouchPoint(x, y); > eventSender.touchStart(); > eventSender.releaseTouchPoint(0); >@@ -67,9 +71,11 @@ window.UIHelper = class UIHelper { > > return new Promise((resolve) => { > testRunner.runUIScript(` >- uiController.doubleTapAtPoint(${x}, ${y}, function() { >- uiController.uiScriptComplete(); >- });`, resolve); >+ uiController.performWithModifiers(() => { >+ uiController.doubleTapAtPoint(${x}, ${y}, function() { >+ uiController.uiScriptComplete(); >+ }); >+ }, ${JSON.stringify(modifiers)});`, resolve); > }); > } > >diff --git a/Source/WebCore/platform/ios/PlatformEventFactoryIOS.mm b/Source/WebCore/platform/ios/PlatformEventFactoryIOS.mm >index be23f54c059..a171b9db1fd 100644 >--- a/Source/WebCore/platform/ios/PlatformEventFactoryIOS.mm >+++ b/Source/WebCore/platform/ios/PlatformEventFactoryIOS.mm >@@ -95,6 +95,7 @@ public: > m_globalPosition = globalPointForEvent(event); > m_button = LeftButton; // This has always been the LeftButton on iOS. > m_clickCount = 1; // This has always been 1 on iOS. >+ m_modifiers = modifiersForEvent(event); > } > }; > >diff --git a/Source/WebKit/Platform/spi/ios/UIKitSPI.h b/Source/WebKit/Platform/spi/ios/UIKitSPI.h >index 1190812e718..d9fef253458 100644 >--- a/Source/WebKit/Platform/spi/ios/UIKitSPI.h >+++ b/Source/WebKit/Platform/spi/ios/UIKitSPI.h >@@ -358,6 +358,10 @@ typedef NS_ENUM(NSInteger, UIScrollViewIndicatorInsetAdjustmentBehavior) { > - (CGSize)_legacy_sizeWithFont:(UIFont *)font minFontSize:(CGFloat)minFontSize actualFontSize:(CGFloat *)actualFontSize forWidth:(CGFloat)width lineBreakMode:(NSLineBreakMode)lineBreakMode; > @end > >+@interface UIGestureRecognizer () >+@property (nonatomic, readonly, getter=_modifierFlags) UIKeyModifierFlags modifierFlags; >+@end >+ > @interface UITapGestureRecognizer () > @property (nonatomic, getter=_allowableSeparation, setter=_setAllowableSeparation:) CGFloat allowableSeparation; > @property (nonatomic, readonly) CGPoint location; >diff --git a/Source/WebKit/Shared/NativeWebTouchEvent.h b/Source/WebKit/Shared/NativeWebTouchEvent.h >index 3b7cedb15f6..f1b6016b21f 100644 >--- a/Source/WebKit/Shared/NativeWebTouchEvent.h >+++ b/Source/WebKit/Shared/NativeWebTouchEvent.h >@@ -23,15 +23,17 @@ > * THE POSSIBILITY OF SUCH DAMAGE. > */ > >-#ifndef NativeWebTouchEvent_h >-#define NativeWebTouchEvent_h >+#pragma once > > #if ENABLE(TOUCH_EVENTS) > > #include "WebEvent.h" > > #if PLATFORM(IOS_FAMILY) >+#if defined(__OBJC__) >+#include <UIKit/UIKit.h> > struct _UIWebTouchEvent; >+#endif > #elif PLATFORM(GTK) > #include <WebCore/GUniquePtrGtk.h> > #elif USE(LIBWPE) >@@ -43,7 +45,9 @@ namespace WebKit { > class NativeWebTouchEvent : public WebTouchEvent { > public: > #if PLATFORM(IOS_FAMILY) >- explicit NativeWebTouchEvent(const _UIWebTouchEvent*); >+#if defined(__OBJC__) >+ explicit NativeWebTouchEvent(const _UIWebTouchEvent*, UIKeyModifierFlags); >+#endif > #elif PLATFORM(GTK) > NativeWebTouchEvent(GdkEvent*, Vector<WebPlatformTouchPoint>&&); > NativeWebTouchEvent(const NativeWebTouchEvent&); >@@ -56,7 +60,7 @@ public: > #endif > > private: >-#if PLATFORM(IOS_FAMILY) >+#if PLATFORM(IOS_FAMILY) && defined(__OBJC__) > Vector<WebPlatformTouchPoint> extractWebTouchPoint(const _UIWebTouchEvent*); > #endif > >@@ -67,8 +71,10 @@ private: > #endif > }; > >+#if PLATFORM(IOS_FAMILY) && defined(__OBJC__) >+OptionSet<WebEvent::Modifier> webEventModifierFlags(UIKeyModifierFlags); >+#endif >+ > } // namespace WebKit > > #endif // ENABLE(TOUCH_EVENTS) >- >-#endif // NativeWebTouchEvent_h >diff --git a/Source/WebKit/Shared/ios/NativeWebTouchEventIOS.mm b/Source/WebKit/Shared/ios/NativeWebTouchEventIOS.mm >index 995f640cf73..cc5fd3103aa 100644 >--- a/Source/WebKit/Shared/ios/NativeWebTouchEventIOS.mm >+++ b/Source/WebKit/Shared/ios/NativeWebTouchEventIOS.mm >@@ -89,6 +89,22 @@ static inline WebCore::IntPoint positionForCGPoint(CGPoint position) > return WebCore::IntPoint(position); > } > >+OptionSet<WebEvent::Modifier> webEventModifierFlags(UIKeyModifierFlags flags) >+{ >+ OptionSet<WebEvent::Modifier> modifiers; >+ if (flags & UIKeyModifierShift) >+ modifiers.add(WebEvent::Modifier::ShiftKey); >+ if (flags & UIKeyModifierControl) >+ modifiers.add(WebEvent::Modifier::ControlKey); >+ if (flags & UIKeyModifierAlternate) >+ modifiers.add(WebEvent::Modifier::AltKey); >+ if (flags & UIKeyModifierCommand) >+ modifiers.add(WebEvent::Modifier::MetaKey); >+ if (flags & UIKeyModifierAlphaShift) >+ modifiers.add(WebEvent::Modifier::CapsLockKey); >+ return modifiers; >+} >+ > Vector<WebPlatformTouchPoint> NativeWebTouchEvent::extractWebTouchPoint(const _UIWebTouchEvent* event) > { > unsigned touchCount = event->touchPointCount; >@@ -117,10 +133,10 @@ Vector<WebPlatformTouchPoint> NativeWebTouchEvent::extractWebTouchPoint(const _U > return touchPointList; > } > >-NativeWebTouchEvent::NativeWebTouchEvent(const _UIWebTouchEvent* event) >+NativeWebTouchEvent::NativeWebTouchEvent(const _UIWebTouchEvent* event, UIKeyModifierFlags flags) > : WebTouchEvent( > webEventTypeForUIWebTouchEventType(event->type), >- OptionSet<Modifier> { }, >+ webEventModifierFlags(flags), > WallTime::fromRawSeconds(event->timestamp), > extractWebTouchPoint(event), > positionForCGPoint(event->locationInDocumentCoordinates), >diff --git a/Source/WebKit/Shared/ios/WebIOSEventFactory.h b/Source/WebKit/Shared/ios/WebIOSEventFactory.h >index ab98d8fc0d8..8579c334fac 100644 >--- a/Source/WebKit/Shared/ios/WebIOSEventFactory.h >+++ b/Source/WebKit/Shared/ios/WebIOSEventFactory.h >@@ -23,20 +23,20 @@ > * THE POSSIBILITY OF SUCH DAMAGE. > */ > >-#ifndef WebIOSEventFactory_h >-#define WebIOSEventFactory_h >+#pragma once > > #if PLATFORM(IOS_FAMILY) > > #import "WebEvent.h" >+#import <UIKit/UIKit.h> > #import <WebCore/WebEvent.h> > > class WebIOSEventFactory { > public: > static WebKit::WebKeyboardEvent createWebKeyboardEvent(::WebEvent *); > static WebKit::WebMouseEvent createWebMouseEvent(::WebEvent *); >+ >+ static UIKeyModifierFlags toUIKeyModifierFlags(OptionSet<WebKit::WebEvent::Modifier>); > }; > > #endif // PLATFORM(IOS_FAMILY) >- >-#endif // WebIOSEventFactory_h >diff --git a/Source/WebKit/Shared/ios/WebIOSEventFactory.mm b/Source/WebKit/Shared/ios/WebIOSEventFactory.mm >index 84a7a5a4dbf..25c16ec2252 100644 >--- a/Source/WebKit/Shared/ios/WebIOSEventFactory.mm >+++ b/Source/WebKit/Shared/ios/WebIOSEventFactory.mm >@@ -31,6 +31,22 @@ > #import <WebCore/KeyEventCodesIOS.h> > #import <WebCore/PlatformEventFactoryIOS.h> > >+UIKeyModifierFlags WebIOSEventFactory::toUIKeyModifierFlags(OptionSet<WebKit::WebEvent::Modifier> modifiers) >+{ >+ UIKeyModifierFlags modifierFlags = 0; >+ if (modifiers.contains(WebKit::WebEvent::Modifier::ShiftKey)) >+ modifierFlags |= UIKeyModifierShift; >+ if (modifiers.contains(WebKit::WebEvent::Modifier::ControlKey)) >+ modifierFlags |= UIKeyModifierControl; >+ if (modifiers.contains(WebKit::WebEvent::Modifier::AltKey)) >+ modifierFlags |= UIKeyModifierAlternate; >+ if (modifiers.contains(WebKit::WebEvent::Modifier::MetaKey)) >+ modifierFlags |= UIKeyModifierCommand; >+ if (modifiers.contains(WebKit::WebEvent::Modifier::CapsLockKey)) >+ modifierFlags |= UIKeyModifierAlphaShift; >+ return modifierFlags; >+} >+ > static OptionSet<WebKit::WebEvent::Modifier> modifiersForEvent(::WebEvent *event) > { > OptionSet<WebKit::WebEvent::Modifier> modifiers; >diff --git a/Source/WebKit/UIProcess/API/Cocoa/WKNavigationAction.mm b/Source/WebKit/UIProcess/API/Cocoa/WKNavigationAction.mm >index 44c8bb6092e..8ebba1f5bc5 100644 >--- a/Source/WebKit/UIProcess/API/Cocoa/WKNavigationAction.mm >+++ b/Source/WebKit/UIProcess/API/Cocoa/WKNavigationAction.mm >@@ -36,6 +36,10 @@ > #import <WebCore/FloatPoint.h> > #import <wtf/RetainPtr.h> > >+#if PLATFORM(IOS_FAMILY) >+#import "WebIOSEventFactory.h" >+#endif >+ > @implementation WKNavigationAction > > static WKNavigationType toWKNavigationType(WebCore::NavigationType navigationType) >@@ -127,6 +131,7 @@ - (CGPoint)_clickLocationInRootViewCoordinates > #endif > > #if PLATFORM(MAC) >+ > - (NSEventModifierFlags)modifierFlags > { > return WebKit::WebEventFactory::toNSEventModifierFlags(_navigationAction->modifiers()); >@@ -136,6 +141,14 @@ - (NSInteger)buttonNumber > { > return WebKit::WebEventFactory::toNSButtonNumber(_navigationAction->mouseButton()); > } >+ >+#else >+ >+- (UIKeyModifierFlags)modifierFlags >+{ >+ return WebIOSEventFactory::toUIKeyModifierFlags(_navigationAction->modifiers()); >+} >+ > #endif > > #pragma mark WKObject protocol implementation >diff --git a/Source/WebKit/UIProcess/API/Cocoa/WKNavigationActionPrivate.h b/Source/WebKit/UIProcess/API/Cocoa/WKNavigationActionPrivate.h >index 5df7ae0d509..ad7422f2b75 100644 >--- a/Source/WebKit/UIProcess/API/Cocoa/WKNavigationActionPrivate.h >+++ b/Source/WebKit/UIProcess/API/Cocoa/WKNavigationActionPrivate.h >@@ -31,6 +31,8 @@ > @class _WKUserInitiatedAction; > > #if TARGET_OS_IPHONE >+#include <UIKit/UIKit.h> >+ > typedef NS_ENUM(NSInteger, WKSyntheticClickType) { > WKSyntheticClickTypeNoTap, > WKSyntheticClickTypeOneFingerTap, >@@ -53,6 +55,8 @@ typedef NS_ENUM(NSInteger, WKSyntheticClickType) { > #if TARGET_OS_IPHONE > @property (nonatomic, readonly) WKSyntheticClickType _syntheticClickType WK_API_AVAILABLE(ios(10.0)); > @property (nonatomic, readonly) CGPoint _clickLocationInRootViewCoordinates WK_API_AVAILABLE(ios(11.0)); >+ >+@property (nonatomic, readonly) UIKeyModifierFlags modifierFlags WK_API_AVAILABLE(ios(WK_IOS_TBA)); > #endif > > @property (nonatomic, readonly) BOOL _isRedirect WK_API_AVAILABLE(macosx(10.13), ios(11.0)); >diff --git a/Source/WebKit/UIProcess/WebPageProxy.h b/Source/WebKit/UIProcess/WebPageProxy.h >index 7be91943890..6cf3469c3b3 100644 >--- a/Source/WebKit/UIProcess/WebPageProxy.h >+++ b/Source/WebKit/UIProcess/WebPageProxy.h >@@ -80,6 +80,7 @@ > #include <WebCore/LayoutSize.h> > #include <WebCore/MediaPlaybackTargetContext.h> > #include <WebCore/MediaProducer.h> >+#include <WebCore/PlatformEvent.h> > #include <WebCore/PlatformScreen.h> > #include <WebCore/PointerID.h> > #include <WebCore/ScrollTypes.h> >@@ -666,7 +667,7 @@ public: > void disableDoubleTapGesturesDuringTapIfNecessary(uint64_t requestID); > void contentSizeCategoryDidChange(const String& contentSizeCategory); > void getSelectionContext(WTF::Function<void(const String&, const String&, const String&, CallbackBase::Error)>&&); >- void handleTwoFingerTapAtPoint(const WebCore::IntPoint&, uint64_t requestID); >+ void handleTwoFingerTapAtPoint(const WebCore::IntPoint&, OptionSet<WebKit::WebEvent::Modifier>, uint64_t requestID); > void handleStylusSingleTapAtPoint(const WebCore::IntPoint&, uint64_t requestID); > void setForceAlwaysUserScalable(bool); > bool forceAlwaysUserScalable() const { return m_forceAlwaysUserScalable; } >@@ -1165,10 +1166,10 @@ public: > void willStartUserTriggeredZooming(); > > void potentialTapAtPosition(const WebCore::FloatPoint&, uint64_t& requestID); >- void commitPotentialTap(uint64_t layerTreeTransactionIdAtLastTouchStart); >+ void commitPotentialTap(OptionSet<WebKit::WebEvent::Modifier>, uint64_t layerTreeTransactionIdAtLastTouchStart); > void cancelPotentialTap(); > void tapHighlightAtPosition(const WebCore::FloatPoint&, uint64_t& requestID); >- void handleTap(const WebCore::FloatPoint&, uint64_t layerTreeTransactionIdAtLastTouchStart); >+ void handleTap(const WebCore::FloatPoint&, OptionSet<WebKit::WebEvent::Modifier>, uint64_t layerTreeTransactionIdAtLastTouchStart); > > void inspectorNodeSearchMovedToPosition(const WebCore::FloatPoint&); > void inspectorNodeSearchEndedAtPosition(const WebCore::FloatPoint&); >diff --git a/Source/WebKit/UIProcess/ios/WKContentViewInteraction.h b/Source/WebKit/UIProcess/ios/WKContentViewInteraction.h >index 38be0d0e2ac..e6ce727156a 100644 >--- a/Source/WebKit/UIProcess/ios/WKContentViewInteraction.h >+++ b/Source/WebKit/UIProcess/ios/WKContentViewInteraction.h >@@ -408,7 +408,7 @@ FOR_EACH_PRIVATE_WKCONTENTVIEW_ACTION(DECLARE_WKCONTENTVIEW_ACTION_FOR_WEB_VIEW) > - (void)_updateChangedSelection; > - (BOOL)_interpretKeyEvent:(::WebEvent *)theEvent isCharEvent:(BOOL)isCharEvent; > - (void)_positionInformationDidChange:(const WebKit::InteractionInformationAtPosition&)info; >-- (void)_attemptClickAtLocation:(CGPoint)location; >+- (void)_attemptClickAtLocation:(CGPoint)location modifierFlags:(UIKeyModifierFlags)modifierFlags; > - (void)_willStartScrollingOrZooming; > - (void)_didScroll; > - (void)_didEndScrollingOrZooming; >diff --git a/Source/WebKit/UIProcess/ios/WKContentViewInteraction.mm b/Source/WebKit/UIProcess/ios/WKContentViewInteraction.mm >index 4d8e3604a8e..0cb2c76d5ab 100644 >--- a/Source/WebKit/UIProcess/ios/WKContentViewInteraction.mm >+++ b/Source/WebKit/UIProcess/ios/WKContentViewInteraction.mm >@@ -1171,7 +1171,7 @@ - (void)_webTouchEventsRecognized:(UIWebTouchEventsGestureRecognizer *)gestureRe > _layerTreeTransactionIdAtLastTouchStart = downcast<WebKit::RemoteLayerTreeDrawingAreaProxy>(*_page->drawingArea()).lastCommittedLayerTreeTransactionID(); > > #if ENABLE(TOUCH_EVENTS) >- WebKit::NativeWebTouchEvent nativeWebTouchEvent(lastTouchEvent); >+ WebKit::NativeWebTouchEvent nativeWebTouchEvent { lastTouchEvent, gestureRecognizer.modifierFlags }; > nativeWebTouchEvent.setCanPreventNativeGestures(!_canSendTouchEventsAsynchronously || [gestureRecognizer isDefaultPrevented]); > > #if ENABLE(POINTER_EVENTS) >@@ -2051,7 +2051,7 @@ - (void)_highlightLongPressRecognized:(UILongPressGestureRecognizer *)gestureRec > break; > case UIGestureRecognizerStateEnded: > if (_highlightLongPressCanClick && _positionInformation.isElement) { >- [self _attemptClickAtLocation:[gestureRecognizer startPoint]]; >+ [self _attemptClickAtLocation:gestureRecognizer.startPoint modifierFlags:gestureRecognizer.modifierFlags]; > [self _finishInteraction]; > } else > [self _cancelInteraction]; >@@ -2070,7 +2070,7 @@ - (void)_twoFingerSingleTapGestureRecognized:(UITapGestureRecognizer *)gestureRe > { > _isTapHighlightIDValid = YES; > _isExpectingFastSingleTapCommit = YES; >- _page->handleTwoFingerTapAtPoint(WebCore::roundedIntPoint(gestureRecognizer.centroid), ++_latestTapID); >+ _page->handleTwoFingerTapAtPoint(WebCore::roundedIntPoint(gestureRecognizer.centroid), WebKit::webEventModifierFlags(gestureRecognizer.modifierFlags), ++_latestTapID); > } > > - (void)_stylusSingleTapRecognized:(UITapGestureRecognizer *)gestureRecognizer >@@ -2194,7 +2194,7 @@ - (void)_singleTapCommited:(UITapGestureRecognizer *)gestureRecognizer > } > > [_inputPeripheral endEditing]; >- _page->commitPotentialTap(_layerTreeTransactionIdAtLastTouchStart); >+ _page->commitPotentialTap(WebKit::webEventModifierFlags(gestureRecognizer.modifierFlags), _layerTreeTransactionIdAtLastTouchStart); > > if (!_isExpectingFastSingleTapCommit) > [self _finishInteraction]; >@@ -2227,7 +2227,7 @@ - (void)_twoFingerDoubleTapRecognized:(UITapGestureRecognizer *)gestureRecognize > _smartMagnificationController->handleResetMagnificationGesture(gestureRecognizer.location); > } > >-- (void)_attemptClickAtLocation:(CGPoint)location >+- (void)_attemptClickAtLocation:(CGPoint)location modifierFlags:(UIKeyModifierFlags)modifierFlags > { > if (![self isFirstResponder]) { > if (!_inputViewUpdateDeferrer) >@@ -2236,7 +2236,7 @@ - (void)_attemptClickAtLocation:(CGPoint)location > } > > [_inputPeripheral endEditing]; >- _page->handleTap(location, _layerTreeTransactionIdAtLastTouchStart); >+ _page->handleTap(location, WebKit::webEventModifierFlags(modifierFlags), _layerTreeTransactionIdAtLastTouchStart); > } > > - (void)setUpTextSelectionAssistant >@@ -5424,7 +5424,7 @@ - (void)actionSheetAssistant:(WKActionSheetAssistant *)assistant performAction:( > > - (void)actionSheetAssistant:(WKActionSheetAssistant *)assistant openElementAtLocation:(CGPoint)location > { >- [self _attemptClickAtLocation:location]; >+ [self _attemptClickAtLocation:location modifierFlags:0]; > } > > - (void)actionSheetAssistant:(WKActionSheetAssistant *)assistant shareElementWithURL:(NSURL *)url rect:(CGRect)boundingRect >diff --git a/Source/WebKit/UIProcess/ios/WebPageProxyIOS.mm b/Source/WebKit/UIProcess/ios/WebPageProxyIOS.mm >index 4726894a93a..4c1a087eef0 100644 >--- a/Source/WebKit/UIProcess/ios/WebPageProxyIOS.mm >+++ b/Source/WebKit/UIProcess/ios/WebPageProxyIOS.mm >@@ -593,9 +593,9 @@ void WebPageProxy::getSelectionContext(WTF::Function<void(const String&, const S > m_process->send(Messages::WebPage::GetSelectionContext(callbackID), m_pageID); > } > >-void WebPageProxy::handleTwoFingerTapAtPoint(const WebCore::IntPoint& point, uint64_t requestID) >+void WebPageProxy::handleTwoFingerTapAtPoint(const WebCore::IntPoint& point, OptionSet<WebEvent::Modifier> modifiers, uint64_t requestID) > { >- process().send(Messages::WebPage::HandleTwoFingerTapAtPoint(point, requestID), m_pageID); >+ process().send(Messages::WebPage::HandleTwoFingerTapAtPoint(point, modifiers, requestID), m_pageID); > } > > void WebPageProxy::handleStylusSingleTapAtPoint(const WebCore::IntPoint& point, uint64_t requestID) >@@ -824,9 +824,9 @@ void WebPageProxy::potentialTapAtPosition(const WebCore::FloatPoint& position, u > process().send(Messages::WebPage::PotentialTapAtPosition(requestID, position), m_pageID); > } > >-void WebPageProxy::commitPotentialTap(uint64_t layerTreeTransactionIdAtLastTouchStart) >+void WebPageProxy::commitPotentialTap(OptionSet<WebEvent::Modifier> modifiers, uint64_t layerTreeTransactionIdAtLastTouchStart) > { >- process().send(Messages::WebPage::CommitPotentialTap(layerTreeTransactionIdAtLastTouchStart), m_pageID); >+ process().send(Messages::WebPage::CommitPotentialTap(modifiers, layerTreeTransactionIdAtLastTouchStart), m_pageID); > } > > void WebPageProxy::cancelPotentialTap() >@@ -839,9 +839,9 @@ void WebPageProxy::tapHighlightAtPosition(const WebCore::FloatPoint& position, u > process().send(Messages::WebPage::TapHighlightAtPosition(requestID, position), m_pageID); > } > >-void WebPageProxy::handleTap(const FloatPoint& location, uint64_t layerTreeTransactionIdAtLastTouchStart) >+void WebPageProxy::handleTap(const FloatPoint& location, OptionSet<WebEvent::Modifier> modifiers, uint64_t layerTreeTransactionIdAtLastTouchStart) > { >- process().send(Messages::WebPage::HandleTap(roundedIntPoint(location), layerTreeTransactionIdAtLastTouchStart), m_pageID); >+ process().send(Messages::WebPage::HandleTap(roundedIntPoint(location), modifiers, layerTreeTransactionIdAtLastTouchStart), m_pageID); > } > > void WebPageProxy::inspectorNodeSearchMovedToPosition(const WebCore::FloatPoint& position) >diff --git a/Source/WebKit/WebProcess/WebPage/WebPage.h b/Source/WebKit/WebProcess/WebPage/WebPage.h >index a1a0294aa5a..0659a0758d3 100644 >--- a/Source/WebKit/WebProcess/WebPage/WebPage.h >+++ b/Source/WebKit/WebProcess/WebPage/WebPage.h >@@ -613,9 +613,9 @@ public: > bool allowsUserScaling() const; > bool hasStablePageScaleFactor() const { return m_hasStablePageScaleFactor; } > >- void handleTap(const WebCore::IntPoint&, uint64_t lastLayerTreeTransactionId); >+ void handleTap(const WebCore::IntPoint&, OptionSet<WebKit::WebEvent::Modifier>, uint64_t lastLayerTreeTransactionId); > void potentialTapAtPosition(uint64_t requestID, const WebCore::FloatPoint&); >- void commitPotentialTap(uint64_t lastLayerTreeTransactionId); >+ void commitPotentialTap(OptionSet<WebKit::WebEvent::Modifier>, uint64_t lastLayerTreeTransactionId); > void commitPotentialTapFailed(); > void cancelPotentialTap(); > void cancelPotentialTapInFrame(WebFrame&); >@@ -661,7 +661,7 @@ public: > WebCore::IntRect rectForElementAtInteractionLocation(); > void updateSelectionAppearance(); > void getSelectionContext(CallbackID); >- void handleTwoFingerTapAtPoint(const WebCore::IntPoint&, uint64_t requestID); >+ void handleTwoFingerTapAtPoint(const WebCore::IntPoint&, OptionSet<WebKit::WebEvent::Modifier>, uint64_t requestID); > void handleStylusSingleTapAtPoint(const WebCore::IntPoint&, uint64_t requestID); > void getRectsForGranularityWithSelectionOffset(uint32_t, int32_t, CallbackID); > void getRectsAtSelectionOffsetWithText(int32_t, const String&, CallbackID); >@@ -1180,8 +1180,8 @@ private: > RefPtr<WebCore::Range> rangeForWebSelectionAtPosition(const WebCore::IntPoint&, const WebCore::VisiblePosition&, SelectionFlags&); > void getFocusedElementInformation(FocusedElementInformation&); > void platformInitializeAccessibility(); >- void handleSyntheticClick(WebCore::Node* nodeRespondingToClick, const WebCore::FloatPoint& location); >- void completeSyntheticClick(WebCore::Node* nodeRespondingToClick, const WebCore::FloatPoint& location, WebCore::SyntheticClickType); >+ void handleSyntheticClick(WebCore::Node* nodeRespondingToClick, const WebCore::FloatPoint& location, OptionSet<WebKit::WebEvent::Modifier>); >+ void completeSyntheticClick(WebCore::Node* nodeRespondingToClick, const WebCore::FloatPoint& location, OptionSet<WebKit::WebEvent::Modifier>, WebCore::SyntheticClickType); > void sendTapHighlightForNodeIfNecessary(uint64_t requestID, WebCore::Node*); > void resetTextAutosizing(); > WebCore::VisiblePosition visiblePositionInFocusedNodeForPoint(const WebCore::Frame&, const WebCore::IntPoint&, bool isInteractingWithFocusedElement); >@@ -1757,6 +1757,7 @@ private: > RefPtr<WebCore::Node> m_pendingSyntheticClickNode; > WebCore::FloatPoint m_pendingSyntheticClickLocation; > WebCore::FloatRect m_previousExposedContentRect; >+ OptionSet<WebKit::WebEvent::Modifier> m_pendingSyntheticClickModifiers; > FocusedElementIdentifier m_currentFocusedElementIdentifier { 0 }; > Optional<DynamicViewportSizeUpdateID> m_pendingDynamicViewportSizeUpdateID; > double m_lastTransactionPageScaleFactor { 0 }; >diff --git a/Source/WebKit/WebProcess/WebPage/WebPage.messages.in b/Source/WebKit/WebProcess/WebPage/WebPage.messages.in >index 776ed755639..608a6c2aa27 100644 >--- a/Source/WebKit/WebProcess/WebPage/WebPage.messages.in >+++ b/Source/WebKit/WebProcess/WebPage/WebPage.messages.in >@@ -51,9 +51,9 @@ messages -> WebPage LegacyReceiver { > SetOverrideViewportArguments(Optional<WebCore::ViewportArguments> arguments) > DynamicViewportSizeUpdate(WebCore::FloatSize viewLayoutSize, WebCore::FloatSize maximumUnobscuredSize, WebCore::FloatRect targetExposedContentRect, WebCore::FloatRect targetUnobscuredRect, WebCore::FloatRect targetUnobscuredRectInScrollViewCoordinates, WebCore::RectEdges<float> targetUnobscuredSafeAreaInsets, double scale, int32_t deviceOrientation, uint64_t dynamicViewportSizeUpdateID) > >- HandleTap(WebCore::IntPoint point, uint64_t lastLayerTreeTransactionId) >+ HandleTap(WebCore::IntPoint point, OptionSet<WebKit::WebEvent::Modifier> modifiers, uint64_t lastLayerTreeTransactionId) > PotentialTapAtPosition(uint64_t requestID, WebCore::FloatPoint point) >- CommitPotentialTap(uint64_t lastLayerTreeTransactionId) >+ CommitPotentialTap(OptionSet<WebKit::WebEvent::Modifier> modifiers, uint64_t lastLayerTreeTransactionId) > CancelPotentialTap() > TapHighlightAtPosition(uint64_t requestID, WebCore::FloatPoint point) > InspectorNodeSearchMovedToPosition(WebCore::FloatPoint point) >@@ -98,7 +98,7 @@ messages -> WebPage LegacyReceiver { > ContentSizeCategoryDidChange(String contentSizeCategory) > GetSelectionContext(WebKit::CallbackID callbackID) > SetAllowsMediaDocumentInlinePlayback(bool allows) >- HandleTwoFingerTapAtPoint(WebCore::IntPoint point, uint64_t requestID) >+ HandleTwoFingerTapAtPoint(WebCore::IntPoint point, OptionSet<WebKit::WebEvent::Modifier> modifiers, uint64_t requestID) > HandleStylusSingleTapAtPoint(WebCore::IntPoint point, uint64_t requestID) > SetForceAlwaysUserScalable(bool userScalable) > GetRectsForGranularityWithSelectionOffset(uint32_t granularity, int32_t offset, WebKit::CallbackID callbackID) >diff --git a/Source/WebKit/WebProcess/WebPage/ios/WebPageIOS.mm b/Source/WebKit/WebProcess/WebPage/ios/WebPageIOS.mm >index 5d1b1dd9069..8e473030c21 100644 >--- a/Source/WebKit/WebProcess/WebPage/ios/WebPageIOS.mm >+++ b/Source/WebKit/WebProcess/WebPage/ios/WebPageIOS.mm >@@ -533,7 +533,7 @@ void WebPage::updateSelectionAppearance() > didChangeSelection(); > } > >-void WebPage::handleSyntheticClick(Node* nodeRespondingToClick, const WebCore::FloatPoint& location) >+void WebPage::handleSyntheticClick(Node* nodeRespondingToClick, const WebCore::FloatPoint& location, OptionSet<WebEvent::Modifier> modifiers) > { > IntPoint roundedAdjustedPoint = roundedIntPoint(location); > Frame& mainframe = m_page->mainFrame(); >@@ -542,7 +542,12 @@ void WebPage::handleSyntheticClick(Node* nodeRespondingToClick, const WebCore::F > WKStartObservingContentChanges(); > WKStartObservingDOMTimerScheduling(); > >- mainframe.eventHandler().mouseMoved(PlatformMouseEvent(roundedAdjustedPoint, roundedAdjustedPoint, NoButton, PlatformEvent::MouseMoved, 0, false, false, false, false, WallTime::now(), WebCore::ForceAtClick, WebCore::NoTap)); >+ // FIXME: Pass caps lock state. >+ bool shiftKey = modifiers.contains(WebEvent::Modifier::ShiftKey); >+ bool ctrlKey = modifiers.contains(WebEvent::Modifier::ControlKey); >+ bool altKey = modifiers.contains(WebEvent::Modifier::AltKey); >+ bool metaKey = modifiers.contains(WebEvent::Modifier::MetaKey); >+ mainframe.eventHandler().mouseMoved(PlatformMouseEvent(roundedAdjustedPoint, roundedAdjustedPoint, NoButton, PlatformEvent::MouseMoved, 0, shiftKey, ctrlKey, altKey, metaKey, WallTime::now(), WebCore::ForceAtClick, WebCore::NoTap)); > mainframe.document()->updateStyleIfNeeded(); > > WKStopObservingDOMTimerScheduling(); >@@ -550,6 +555,7 @@ void WebPage::handleSyntheticClick(Node* nodeRespondingToClick, const WebCore::F > > m_pendingSyntheticClickNode = nullptr; > m_pendingSyntheticClickLocation = FloatPoint(); >+ m_pendingSyntheticClickModifiers = { }; > > if (m_isClosed) > return; >@@ -559,15 +565,16 @@ void WebPage::handleSyntheticClick(Node* nodeRespondingToClick, const WebCore::F > // The move event caused new contents to appear. Don't send the click event. > LOG(ContentObservation, "handleSyntheticClick: Observed meaningful visible change -> hover."); > return; >- case WKContentIndeterminateChange: >+ case WKContentIndeterminateChange: { > // Wait for callback to completePendingSyntheticClickForContentChangeObserver() to decide whether to send the click event. > m_pendingSyntheticClickNode = nodeRespondingToClick; > m_pendingSyntheticClickLocation = location; >+ m_pendingSyntheticClickModifiers = modifiers; > LOG(ContentObservation, "handleSyntheticClick: Observed some change, but can't decide it yet -> wait."); > return; >- case WKContentNoChange: >+ } case WKContentNoChange: > LOG(ContentObservation, "handleSyntheticClick: No change was observed -> click."); >- completeSyntheticClick(nodeRespondingToClick, location, WebCore::OneFingerTap); >+ completeSyntheticClick(nodeRespondingToClick, location, modifiers, WebCore::OneFingerTap); > return; > } > ASSERT_NOT_REACHED(); >@@ -581,15 +588,16 @@ void WebPage::completePendingSyntheticClickForContentChangeObserver() > // Only dispatch the click if the document didn't get changed by any timers started by the move event. > if (WKObservedContentChange() == WKContentNoChange) { > LOG(ContentObservation, "No chage was observed -> click."); >- completeSyntheticClick(m_pendingSyntheticClickNode.get(), m_pendingSyntheticClickLocation, WebCore::OneFingerTap); >+ completeSyntheticClick(m_pendingSyntheticClickNode.get(), m_pendingSyntheticClickLocation, m_pendingSyntheticClickModifiers, WebCore::OneFingerTap); > } else > LOG(ContentObservation, "Observed meaningful visible change -> hover."); > > m_pendingSyntheticClickNode = nullptr; > m_pendingSyntheticClickLocation = FloatPoint(); >+ m_pendingSyntheticClickModifiers = { }; > } > >-void WebPage::completeSyntheticClick(Node* nodeRespondingToClick, const WebCore::FloatPoint& location, SyntheticClickType syntheticClickType) >+void WebPage::completeSyntheticClick(Node* nodeRespondingToClick, const WebCore::FloatPoint& location, OptionSet<WebEvent::Modifier> modifiers, SyntheticClickType syntheticClickType) > { > IntPoint roundedAdjustedPoint = roundedIntPoint(location); > Frame& mainframe = m_page->mainFrame(); >@@ -602,11 +610,17 @@ void WebPage::completeSyntheticClick(Node* nodeRespondingToClick, const WebCore: > bool tapWasHandled = false; > m_lastInteractionLocation = roundedAdjustedPoint; > >- tapWasHandled |= mainframe.eventHandler().handleMousePressEvent(PlatformMouseEvent(roundedAdjustedPoint, roundedAdjustedPoint, LeftButton, PlatformEvent::MousePressed, 1, false, false, false, false, WallTime::now(), WebCore::ForceAtClick, syntheticClickType)); >+ // FIXME: Pass caps lock state. >+ bool shiftKey = modifiers.contains(WebEvent::Modifier::ShiftKey); >+ bool ctrlKey = modifiers.contains(WebEvent::Modifier::ControlKey); >+ bool altKey = modifiers.contains(WebEvent::Modifier::AltKey); >+ bool metaKey = modifiers.contains(WebEvent::Modifier::MetaKey); >+ >+ tapWasHandled |= mainframe.eventHandler().handleMousePressEvent(PlatformMouseEvent(roundedAdjustedPoint, roundedAdjustedPoint, LeftButton, PlatformEvent::MousePressed, 1, shiftKey, ctrlKey, altKey, metaKey, WallTime::now(), WebCore::ForceAtClick, syntheticClickType)); > if (m_isClosed) > return; > >- tapWasHandled |= mainframe.eventHandler().handleMouseReleaseEvent(PlatformMouseEvent(roundedAdjustedPoint, roundedAdjustedPoint, LeftButton, PlatformEvent::MouseReleased, 1, false, false, false, false, WallTime::now(), WebCore::ForceAtClick, syntheticClickType)); >+ tapWasHandled |= mainframe.eventHandler().handleMouseReleaseEvent(PlatformMouseEvent(roundedAdjustedPoint, roundedAdjustedPoint, LeftButton, PlatformEvent::MouseReleased, 1, shiftKey, ctrlKey, altKey, metaKey, WallTime::now(), WebCore::ForceAtClick, syntheticClickType)); > if (m_isClosed) > return; > >@@ -626,7 +640,7 @@ void WebPage::completeSyntheticClick(Node* nodeRespondingToClick, const WebCore: > send(Messages::WebPageProxy::DidCompleteSyntheticClick()); > } > >-void WebPage::handleTap(const IntPoint& point, uint64_t lastLayerTreeTransactionId) >+void WebPage::handleTap(const IntPoint& point, OptionSet<WebEvent::Modifier> modifiers, uint64_t lastLayerTreeTransactionId) > { > FloatPoint adjustedPoint; > Node* nodeRespondingToClick = m_page->mainFrame().nodeRespondingToClickEvents(point, adjustedPoint); >@@ -643,7 +657,7 @@ void WebPage::handleTap(const IntPoint& point, uint64_t lastLayerTreeTransaction > } > #endif > else >- handleSyntheticClick(nodeRespondingToClick, adjustedPoint); >+ handleSyntheticClick(nodeRespondingToClick, adjustedPoint, modifiers); > } > > void WebPage::requestFocusedElementInformation(WebKit::CallbackID callbackID) >@@ -738,7 +752,7 @@ void WebPage::sendTapHighlightForNodeIfNecessary(uint64_t requestID, Node* node) > #endif > } > >-void WebPage::handleTwoFingerTapAtPoint(const WebCore::IntPoint& point, uint64_t requestID) >+void WebPage::handleTwoFingerTapAtPoint(const WebCore::IntPoint& point, OptionSet<WebKit::WebEvent::Modifier> modifiers, uint64_t requestID) > { > FloatPoint adjustedPoint; > Node* nodeRespondingToClick = m_page->mainFrame().nodeRespondingToClickEvents(point, adjustedPoint); >@@ -754,7 +768,7 @@ void WebPage::handleTwoFingerTapAtPoint(const WebCore::IntPoint& point, uint64_t > send(Messages::WebPageProxy::DidNotHandleTapAsClick(roundedIntPoint(adjustedPoint))); > } else > #endif >- completeSyntheticClick(nodeRespondingToClick, adjustedPoint, WebCore::TwoFingerTap); >+ completeSyntheticClick(nodeRespondingToClick, adjustedPoint, modifiers, WebCore::TwoFingerTap); > } > > void WebPage::handleStylusSingleTapAtPoint(const WebCore::IntPoint& point, uint64_t requestID) >@@ -799,7 +813,7 @@ void WebPage::potentialTapAtPosition(uint64_t requestID, const WebCore::FloatPoi > #endif > } > >-void WebPage::commitPotentialTap(uint64_t lastLayerTreeTransactionId) >+void WebPage::commitPotentialTap(OptionSet<WebEvent::Modifier> modifiers, uint64_t lastLayerTreeTransactionId) > { > if (!m_potentialTapNode || (!m_potentialTapNode->renderer() && !is<HTMLAreaElement>(m_potentialTapNode.get()))) { > commitPotentialTapFailed(); >@@ -823,7 +837,7 @@ void WebPage::commitPotentialTap(uint64_t lastLayerTreeTransactionId) > commitPotentialTapFailed(); > } else > #endif >- handleSyntheticClick(nodeRespondingToClick, adjustedPoint); >+ handleSyntheticClick(nodeRespondingToClick, adjustedPoint, modifiers); > } else > commitPotentialTapFailed(); > >diff --git a/Tools/DumpRenderTree/ios/UIScriptControllerIOS.mm b/Tools/DumpRenderTree/ios/UIScriptControllerIOS.mm >index db11ad64156..9fc83b84447 100644 >--- a/Tools/DumpRenderTree/ios/UIScriptControllerIOS.mm >+++ b/Tools/DumpRenderTree/ios/UIScriptControllerIOS.mm >@@ -155,6 +155,10 @@ void UIScriptController::typeCharacterUsingHardwareKeyboard(JSStringRef characte > { > } > >+void UIScriptController::performWithModifiers(JSValueRef, JSValueRef) >+{ >+} >+ > void UIScriptController::keyDown(JSStringRef, JSValueRef) > { > } >diff --git a/Tools/TestRunnerShared/UIScriptContext/Bindings/UIScriptController.idl b/Tools/TestRunnerShared/UIScriptContext/Bindings/UIScriptController.idl >index e54467ff448..d565f7ff1f6 100644 >--- a/Tools/TestRunnerShared/UIScriptContext/Bindings/UIScriptController.idl >+++ b/Tools/TestRunnerShared/UIScriptContext/Bindings/UIScriptController.idl >@@ -66,6 +66,8 @@ interface UIScriptController { > void stylusUpAtPoint(long x, long y, object callback); > void stylusTapAtPoint(long x, long y, float azimuthAngle, float altitudeAngle, float pressure, object callback); > >+ void performWithModifiers(object callback, object modifierArray); >+ > void enterText(DOMString text); > void typeCharacterUsingHardwareKeyboard(DOMString character, object callback); > >diff --git a/Tools/TestRunnerShared/UIScriptContext/UIScriptController.cpp b/Tools/TestRunnerShared/UIScriptContext/UIScriptController.cpp >index 4b45d56fdc2..0ecb0483cc2 100644 >--- a/Tools/TestRunnerShared/UIScriptContext/UIScriptController.cpp >+++ b/Tools/TestRunnerShared/UIScriptContext/UIScriptController.cpp >@@ -305,6 +305,10 @@ void UIScriptController::typeCharacterUsingHardwareKeyboard(JSStringRef, JSValue > { > } > >+void UIScriptContext::performWithModifiers(JSValueRef, JSValueRef) >+{ >+} >+ > void UIScriptController::keyDown(JSStringRef, JSValueRef) > { > } >diff --git a/Tools/TestRunnerShared/UIScriptContext/UIScriptController.h b/Tools/TestRunnerShared/UIScriptContext/UIScriptController.h >index 956c345c32f..aedb014ac3a 100644 >--- a/Tools/TestRunnerShared/UIScriptContext/UIScriptController.h >+++ b/Tools/TestRunnerShared/UIScriptContext/UIScriptController.h >@@ -93,6 +93,7 @@ public: > void enterText(JSStringRef); > void typeCharacterUsingHardwareKeyboard(JSStringRef character, JSValueRef callback); > >+ void performWithModifiers(JSValueRef callback, JSValueRef modifierArray); > void keyDown(JSStringRef character, JSValueRef modifierArray); > void toggleCapsLock(JSValueRef callback); > >diff --git a/Tools/WebKitTestRunner/ios/UIScriptControllerIOS.mm b/Tools/WebKitTestRunner/ios/UIScriptControllerIOS.mm >index 4952765a0ac..8f5330c3b1e 100644 >--- a/Tools/WebKitTestRunner/ios/UIScriptControllerIOS.mm >+++ b/Tools/WebKitTestRunner/ios/UIScriptControllerIOS.mm >@@ -387,6 +387,27 @@ static Vector<String> parseModifierArray(JSContextRef context, JSValueRef arrayV > return modifiers; > } > >+void UIScriptController::performWithModifiers(JSValueRef callback, JSValueRef modifierArray) >+{ >+ if (JSValueIsUndefined(m_context->jsContext(), callback)) >+ return; >+ >+ auto modifierFlags = parseModifierArray(m_context->jsContext(), modifierArray); >+ for (auto& modifierFlag : modifierFlags) >+ [[HIDEventGenerator sharedHIDEventGenerator] keyDown:modifierFlag]; >+ >+ // Invoke the callback >+ JSValueRef exception = nullptr; >+ JSObjectRef callbackObject = JSValueToObject(m_context->jsContext(), callback, &exception); >+ if (!exception) >+ JSObjectCallAsFunction(m_context->jsContext(), callbackObject, JSContextGetGlobalObject(m_context->jsContext()), 0, nullptr /* arguments */, &exception); >+ >+ for (size_t i = modifierFlags.size(); i; ) { >+ --i; >+ [[HIDEventGenerator sharedHIDEventGenerator] keyUp:modifierFlags[i]]; >+ } >+} >+ > static UIPhysicalKeyboardEvent *createUIPhysicalKeyboardEvent(NSString *hidInputString, NSString *uiEventInputString, UIKeyModifierFlags modifierFlags, UIKeyboardInputFlags inputFlags, bool isKeyDown) > { > auto* keyboardEvent = [getUIPhysicalKeyboardEventClass() _eventWithInput:uiEventInputString inputFlags:inputFlags]; >-- >2.20.0 (Apple Git-115) >
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Formatted Diff
|
Diff
Attachments on
bug 191446
:
361342
|
361421
|
361427
|
361435
|
361447
|
361455
|
361456
|
361458
|
361538
|
361551
|
361553
|
361556
|
361575
|
361637
|
361639
|
361641
|
361642
|
361646
|
361696