Title: [255337] trunk
Revision
255337
Author
[email protected]
Date
2020-01-28 22:46:53 -0800 (Tue, 28 Jan 2020)

Log Message

macCatalyst: Right clicking on a link follows it immediately
https://bugs.webkit.org/show_bug.cgi?id=206919
<rdar://problem/58936679>

Reviewed by Wenson Hsieh.

Source/WebKit:

* UIProcess/ios/WKMouseGestureRecognizer.mm:
(-[WKMouseGestureRecognizer createMouseEventWithType:forEvent:]):
(-[WKMouseGestureRecognizer touchesBegan:withEvent:]):
(-[WKMouseGestureRecognizer touchesEnded:withEvent:]):
UIKit's _buttonMask does not include the currently-released button,
so in order to correctly identify the released button in touchesEnded,
store the mask for the length of the click.

Tools:

* TestWebKitAPI/Tests/WebKitCocoa/MacCatalystMouseSupport.mm:
(TEST):
Add a test ensuring that mouseup is still called with the secondary button,
even if the event's buttonmask is 0.

Modified Paths

Diff

Modified: trunk/Source/WebKit/ChangeLog (255336 => 255337)


--- trunk/Source/WebKit/ChangeLog	2020-01-29 03:17:13 UTC (rev 255336)
+++ trunk/Source/WebKit/ChangeLog	2020-01-29 06:46:53 UTC (rev 255337)
@@ -1,5 +1,21 @@
 2020-01-28  Tim Horton  <[email protected]>
 
+        macCatalyst: Right clicking on a link follows it immediately
+        https://bugs.webkit.org/show_bug.cgi?id=206919
+        <rdar://problem/58936679>
+
+        Reviewed by Wenson Hsieh.
+
+        * UIProcess/ios/WKMouseGestureRecognizer.mm:
+        (-[WKMouseGestureRecognizer createMouseEventWithType:forEvent:]):
+        (-[WKMouseGestureRecognizer touchesBegan:withEvent:]):
+        (-[WKMouseGestureRecognizer touchesEnded:withEvent:]):
+        UIKit's _buttonMask does not include the currently-released button,
+        so in order to correctly identify the released button in touchesEnded,
+        store the mask for the length of the click.
+
+2020-01-28  Tim Horton  <[email protected]>
+
         macCatalyst: Triple clicking to select a sentence results in an empty selection
         https://bugs.webkit.org/show_bug.cgi?id=206863
         <rdar://problem/58776993>

Modified: trunk/Source/WebKit/UIProcess/ios/WKMouseGestureRecognizer.mm (255336 => 255337)


--- trunk/Source/WebKit/UIProcess/ios/WKMouseGestureRecognizer.mm	2020-01-29 03:17:13 UTC (rev 255336)
+++ trunk/Source/WebKit/UIProcess/ios/WKMouseGestureRecognizer.mm	2020-01-29 06:46:53 UTC (rev 255337)
@@ -56,6 +56,7 @@
 
     std::unique_ptr<WebKit::NativeWebMouseEvent> _lastEvent;
     Optional<CGPoint> _lastLocation;
+    Optional<UIEventButtonMask> _pressedButtonMask;
 }
 
 - (instancetype)initWithTarget:(id)target action:(SEL)action
@@ -119,10 +120,10 @@
     return NO;
 }
 
-- (std::unique_ptr<WebKit::NativeWebMouseEvent>)createMouseEventWithType:(WebKit::WebEvent::Type)type forEvent:(UIEvent *)uiEvent
+- (std::unique_ptr<WebKit::NativeWebMouseEvent>)createMouseEventWithType:(WebKit::WebEvent::Type)type
 {
     auto modifiers = webEventModifiersForUIKeyModifierFlags(self.modifierFlags);
-    BOOL isRightButton = modifiers.contains(WebKit::WebEvent::Modifier::ControlKey) || ([uiEvent _buttonMask] & UIEventButtonMaskSecondary);
+    BOOL isRightButton = modifiers.contains(WebKit::WebEvent::Modifier::ControlKey) || (_pressedButtonMask && (*_pressedButtonMask & UIEventButtonMaskSecondary));
 
     auto button = [&] {
         if (!_touching)
@@ -151,8 +152,9 @@
 - (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
 {
     _touching = YES;
+    _pressedButtonMask = [event _buttonMask];
 
-    _lastEvent = [self createMouseEventWithType:WebKit::WebEvent::MouseDown forEvent:event];
+    _lastEvent = [self createMouseEventWithType:WebKit::WebEvent::MouseDown];
     _lastLocation = [self locationInView:self.view];
 
     self.state = UIGestureRecognizerStateChanged;
@@ -160,7 +162,7 @@
 
 - (void)touchesMoved:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
 {
-    _lastEvent = [self createMouseEventWithType:WebKit::WebEvent::MouseMove forEvent:event];
+    _lastEvent = [self createMouseEventWithType:WebKit::WebEvent::MouseMove];
     _lastLocation = [self locationInView:self.view];
 
     self.state = UIGestureRecognizerStateChanged;
@@ -168,10 +170,11 @@
 
 - (void)touchesEnded:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
 {
-    _lastEvent = [self createMouseEventWithType:WebKit::WebEvent::MouseUp forEvent:event];
+    _lastEvent = [self createMouseEventWithType:WebKit::WebEvent::MouseU];
     _lastLocation = [self locationInView:self.view];
 
     _touching = NO;
+    _pressedButtonMask = WTF::nullopt;
 
     self.state = UIGestureRecognizerStateChanged;
 }
@@ -183,7 +186,7 @@
 
 - (void)_hoverEntered:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
 {
-    _lastEvent = [self createMouseEventWithType:WebKit::WebEvent::MouseMove forEvent:event];
+    _lastEvent = [self createMouseEventWithType:WebKit::WebEvent::MouseMove];
 
     if (_currentHoverEvent == nil && touches.count == 1 && [event isKindOfClass:NSClassFromString(@"UIHoverEvent")]) {
         _currentHoverEvent = (UIHoverEvent *)event;
@@ -202,7 +205,7 @@
         return;
     }
 
-    _lastEvent = [self createMouseEventWithType:WebKit::WebEvent::MouseMove forEvent:event];
+    _lastEvent = [self createMouseEventWithType:WebKit::WebEvent::MouseMove];
     _lastLocation = [self locationInView:self.view];
 
     if (_currentHoverEvent == event && [touches containsObject:_currentTouch.get()])
@@ -213,7 +216,7 @@
 
 - (void)_hoverExited:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
 {
-    _lastEvent = [self createMouseEventWithType:WebKit::WebEvent::MouseMove forEvent:event];
+    _lastEvent = [self createMouseEventWithType:WebKit::WebEvent::MouseMove];
     _lastLocation = [self locationInView:self.view];
 
     if (_currentHoverEvent == event) {

Modified: trunk/Tools/ChangeLog (255336 => 255337)


--- trunk/Tools/ChangeLog	2020-01-29 03:17:13 UTC (rev 255336)
+++ trunk/Tools/ChangeLog	2020-01-29 06:46:53 UTC (rev 255337)
@@ -1,3 +1,16 @@
+2020-01-28  Tim Horton  <[email protected]>
+
+        macCatalyst: Right clicking on a link follows it immediately
+        https://bugs.webkit.org/show_bug.cgi?id=206919
+        <rdar://problem/58936679>
+
+        Reviewed by Wenson Hsieh.
+
+        * TestWebKitAPI/Tests/WebKitCocoa/MacCatalystMouseSupport.mm:
+        (TEST):
+        Add a test ensuring that mouseup is still called with the secondary button,
+        even if the event's buttonmask is 0.
+
 2020-01-28  Jonathan Bedard  <[email protected]>
 
         TestWebKitAPI: Conditionalize device orientation tests on ENABLE(DEVICE_ORIENTATION)

Modified: trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/MacCatalystMouseSupport.mm (255336 => 255337)


--- trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/MacCatalystMouseSupport.mm	2020-01-29 03:17:13 UTC (rev 255336)
+++ trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/MacCatalystMouseSupport.mm	2020-01-29 06:46:53 UTC (rev 255337)
@@ -141,4 +141,46 @@
     TestWebKitAPI::Util::run(&done);
 }
 
+TEST(MacCatalystMouseSupport, TrackButtonMaskFromTouchStart)
+{
+    auto webViewConfiguration = adoptNS([[WKWebViewConfiguration alloc] init]);
+    auto webView = adoptNS([[TestWKWebView alloc] initWithFrame:NSMakeRect(0, 0, 800, 600) configuration:webViewConfiguration.get()]);
+    [webView synchronouslyLoadHTMLString:@"<script>"
+    "window.didReleaseRightButton = false;"
+    "document.documentElement.addEventListener('mouseup', function (e) {"
+    "    if (e.button == 2)"
+    "        window.didReleaseRightButton = true;"
+    "});"
+    "</script>"];
+
+    auto contentView = [webView wkContentView];
+    auto gesture = mouseGesture(contentView);
+
+    RetainPtr<WKTestingTouch> touch = adoptNS([[WKTestingTouch alloc] init]);
+    RetainPtr<NSSet> touchSet = [NSSet setWithObject:touch.get()];
+
+    RetainPtr<WKTestingEvent> event = adoptNS([[WKTestingEvent alloc] init]);
+
+    [gesture _hoverEntered:touchSet.get() withEvent:event.get()];
+    [contentView _mouseGestureRecognizerChanged:gesture];
+    [touch setTapCount:1];
+    [event _setButtonMask:UIEventButtonMaskSecondary];
+    [gesture touchesBegan:touchSet.get() withEvent:event.get()];
+    [contentView _mouseGestureRecognizerChanged:gesture];
+    [event _setButtonMask:0];
+    [gesture touchesEnded:touchSet.get() withEvent:event.get()];
+    [contentView _mouseGestureRecognizerChanged:gesture];
+
+    __block bool done = false;
+
+    [webView _doAfterProcessingAllPendingMouseEvents:^{
+        NSNumber *result = [webView objectByEvaluatingJavaScript:@"window.didReleaseRightButton"];
+        EXPECT_TRUE([result boolValue]);
+        done = true;
+    }];
+
+    TestWebKitAPI::Util::run(&done);
+}
+
+
 #endif // PLATFORM(MACCATALYST)
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to