Changeset 290743 in webkit
- Timestamp:
- Mar 2, 2022 11:39:49 AM (5 months ago)
- Location:
- trunk
- Files:
-
- 13 edited
-
Source/WebKit/ChangeLog (modified) (1 diff)
-
Source/WebKit/UIProcess/API/Cocoa/WKViewPrivate.h (modified) (1 diff)
-
Source/WebKit/UIProcess/API/mac/WKView.mm (modified) (3 diffs)
-
Source/WebKit/UIProcess/API/mac/WKWebViewMac.mm (modified) (2 diffs)
-
Source/WebKit/UIProcess/API/mac/WKWebViewPrivateForTestingMac.h (modified) (1 diff)
-
Source/WebKit/UIProcess/API/mac/WKWebViewTestingMac.mm (modified) (1 diff)
-
Source/WebKit/UIProcess/Cocoa/WebViewImpl.h (modified) (3 diffs)
-
Source/WebKit/UIProcess/Cocoa/WebViewImpl.mm (modified) (3 diffs)
-
Source/WebKit/UIProcess/mac/PageClientImplMac.mm (modified) (1 diff)
-
Tools/ChangeLog (modified) (1 diff)
-
Tools/TestWebKitAPI/cocoa/TestWKWebView.mm (modified) (1 diff)
-
Tools/TestWebKitAPI/mac/PlatformWebViewMac.mm (modified) (1 diff)
-
Tools/WebKitTestRunner/mac/EventSenderProxy.mm (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebKit/ChangeLog
r290739 r290743 1 2022-03-02 Chris Dumez <cdumez@apple.com> 2 3 Mousemove events double-firing in Safari 4 https://bugs.webkit.org/show_bug.cgi?id=237342 5 <rdar://88025610> 6 7 Reviewed by Wenson Hsieh. 8 9 When we constructed a WebViewImpl, we would add a mouse tracking area to the view, 10 so that mouseMoved/mouseEntered/mouseExited would get called and we would be able 11 to forward these mouse events to the WebContent process. However, when the view 12 becomes first responder, an implicit mouse tracking area also gets added. As a 13 result, we would get duplicate calls to mouseMoved/mouseEntered/mouseExited. 14 15 We consulted with the AppKit team and their recommendation was to use a different 16 owner object for our mouse tracking area and have that object forward the 17 mouseMoved/mouseEntered/mouseExited calls to our WebViewImpl. In doing so, we 18 can stop forwarding mouseMoved/mouseEntered/mouseExited calls from WKWebView & 19 WKView, which are NOT for our mouse tracking area. 20 21 No new tests, I tried but wasn't able to write an API test for this. 22 I had trouble making the test window key so that the view would receive 23 the (duplicate) mousemove events. I validated via logging that we are no longer 24 getting duplicate mousemove events. I also checked on 25 https://www.vsynctester.com/testing/mouse.html that the output now looks correct. 26 27 * UIProcess/API/Cocoa/WKViewPrivate.h: 28 * UIProcess/API/Cocoa/WKWebViewPrivate.h: 29 * UIProcess/API/mac/WKView.mm: 30 (-[WKView _simulateMouseMove:]): 31 (-[WKView mouseMoved:]): Deleted. 32 (-[WKView mouseEntered:]): Deleted. 33 (-[WKView mouseExited:]): Deleted. 34 * UIProcess/API/mac/WKWebViewMac.mm: 35 (-[WKWebView _simulateMouseMove:]): 36 (-[WKWebView mouseMoved:]): Deleted. 37 (-[WKWebView mouseEntered:]): Deleted. 38 (-[WKWebView mouseExited:]): Deleted. 39 * UIProcess/Cocoa/WebViewImpl.h: 40 * UIProcess/Cocoa/WebViewImpl.mm: 41 (-[WKMouseTrackingObserver initWithViewImpl:]): 42 (-[WKMouseTrackingObserver mouseMoved:]): 43 (-[WKMouseTrackingObserver mouseEntered:]): 44 (-[WKMouseTrackingObserver mouseExited:]): 45 (WebKit::WebViewImpl::WebViewImpl): 46 (WebKit::WebViewImpl::updatePrimaryTrackingAreaOptions): 47 (WebKit::WebViewImpl::setPrimaryTrackingArea): Deleted. 48 * UIProcess/mac/PageClientImplMac.mm: 49 (WebKit::PageClientImpl::recommendedScrollbarStyleDidChange): 50 1 51 2022-03-02 Sihui Liu <sihui_liu@apple.com> 2 52 -
trunk/Source/WebKit/UIProcess/API/Cocoa/WKViewPrivate.h
r282375 r290743 132 132 133 133 - (void)_gestureEventWasNotHandledByWebCore:(NSEvent *)event; 134 - (void)_simulateMouseMove:(NSEvent *)event; 134 135 135 136 - (void)_setShouldSuppressFirstResponderChanges:(BOOL)shouldSuppress WK_API_AVAILABLE(macos(10.13.4)); -
trunk/Source/WebKit/UIProcess/API/mac/WKView.mm
r286894 r290743 517 517 } 518 518 519 - (void)mouseMoved:(NSEvent *)event520 {521 _data->_impl->mouseMoved(event);522 }523 524 519 - (void)mouseDown:(NSEvent *)event 525 520 { … … 535 530 { 536 531 _data->_impl->mouseDragged(event); 537 }538 539 - (void)mouseEntered:(NSEvent *)event540 {541 _data->_impl->mouseEntered(event);542 }543 544 - (void)mouseExited:(NSEvent *)event545 {546 _data->_impl->mouseExited(event);547 532 } 548 533 … … 1547 1532 } 1548 1533 1534 - (void)_simulateMouseMove:(NSEvent *)event 1535 { 1536 _data->_impl->mouseMoved(event); 1537 } 1538 1549 1539 - (void)smartMagnifyWithEvent:(NSEvent *)event 1550 1540 { -
trunk/Source/WebKit/UIProcess/API/mac/WKWebViewMac.mm
r287737 r290743 475 475 } 476 476 477 - (void)mouseMoved:(NSEvent *)event478 {479 _impl->mouseMoved(event);480 }481 482 477 - (void)mouseDown:(NSEvent *)event 483 478 { … … 493 488 { 494 489 _impl->mouseDragged(event); 495 }496 497 - (void)mouseEntered:(NSEvent *)event498 {499 _impl->mouseEntered(event);500 }501 502 - (void)mouseExited:(NSEvent *)event503 {504 _impl->mouseExited(event);505 490 } 506 491 -
trunk/Source/WebKit/UIProcess/API/mac/WKWebViewPrivateForTestingMac.h
r266654 r290743 53 53 - (NSSet<NSView *> *)_pdfHUDs; 54 54 55 - (void)_simulateMouseMove:(NSEvent *)event; 56 55 57 @end 56 58 -
trunk/Source/WebKit/UIProcess/API/mac/WKWebViewTestingMac.mm
r290712 r290743 122 122 } 123 123 124 - (void)_simulateMouseMove:(NSEvent *)event 125 { 126 return _impl->mouseMoved(event); 127 } 128 124 129 @end 125 130 -
trunk/Source/WebKit/UIProcess/Cocoa/WebViewImpl.h
r288961 r290743 63 63 OBJC_CLASS WKFullScreenWindowController; 64 64 OBJC_CLASS WKImmediateActionController; 65 OBJC_CLASS WKMouseTrackingObserver; 65 66 OBJC_CLASS WKRevealItemPresenter; 66 67 OBJC_CLASS WKSafeBrowsingWarning; … … 447 448 448 449 NSTrackingArea *primaryTrackingArea() const { return m_primaryTrackingArea.get(); } 449 void setPrimaryTrackingArea(NSTrackingArea *);450 void updatePrimaryTrackingAreaOptions(NSTrackingAreaOptions); 450 451 451 452 NSTrackingRectTag addTrackingRect(CGRect, id owner, void* userData, bool assumeInside); … … 816 817 bool m_allowsLinkPreview { true }; 817 818 819 RetainPtr<WKMouseTrackingObserver> m_mouseTrackingObserver; 818 820 RetainPtr<NSTrackingArea> m_primaryTrackingArea; 819 821 -
trunk/Source/WebKit/UIProcess/Cocoa/WebViewImpl.mm
r290712 r290743 182 182 #endif 183 183 184 // We use a WKMouseTrackingObserver as tracking area owner instead of the WKWebView. This is because WKWebView 185 // gets an implicit tracking area when it is first responder and we only want to process mouse events from our 186 // tracking area. Otherwise, it would lead to duplicate mouse events (rdar://88025610). 187 @interface WKMouseTrackingObserver : NSObject 188 @end 189 190 @implementation WKMouseTrackingObserver { 191 WeakPtr<WebKit::WebViewImpl> _impl; 192 } 193 194 - (instancetype)initWithViewImpl:(WebKit::WebViewImpl&)impl 195 { 196 if ((self = [super init])) 197 _impl = impl; 198 return self; 199 } 200 201 - (void)mouseMoved:(NSEvent *)event 202 { 203 if (_impl) 204 _impl->mouseMoved(event); 205 } 206 207 - (void)mouseEntered:(NSEvent *)event 208 { 209 if (_impl) 210 _impl->mouseEntered(event); 211 } 212 213 - (void)mouseExited:(NSEvent *)event 214 { 215 if (_impl) 216 _impl->mouseExited(event); 217 } 218 219 @end 220 184 221 #if ENABLE(IMAGE_ANALYSIS) 185 222 … … 1488 1525 , m_windowVisibilityObserver(adoptNS([[WKWindowVisibilityObserver alloc] initWithView:view impl:*this])) 1489 1526 , m_accessibilitySettingsObserver(adoptNS([[WKAccessibilitySettingsObserver alloc] initWithImpl:*this])) 1490 , m_primaryTrackingArea(adoptNS([[NSTrackingArea alloc] initWithRect:view.frame options:trackingAreaOptions() owner:view userInfo:nil])) 1527 , m_mouseTrackingObserver(adoptNS([[WKMouseTrackingObserver alloc] initWithViewImpl:*this])) 1528 , m_primaryTrackingArea(adoptNS([[NSTrackingArea alloc] initWithRect:view.frame options:trackingAreaOptions() owner:m_mouseTrackingObserver.get() userInfo:nil])) 1491 1529 { 1492 1530 static_cast<PageClientImpl&>(*m_pageClient).setImpl(*this); … … 3832 3870 } 3833 3871 3834 void WebViewImpl::setPrimaryTrackingArea(NSTrackingArea *trackingArea) 3835 { 3872 void WebViewImpl::updatePrimaryTrackingAreaOptions(NSTrackingAreaOptions options) 3873 { 3874 auto trackingArea = adoptNS([[NSTrackingArea alloc] initWithRect:[m_view frame] options:options owner:m_mouseTrackingObserver.get() userInfo:nil]); 3836 3875 [m_view removeTrackingArea:m_primaryTrackingArea.get()]; 3837 3876 m_primaryTrackingArea = trackingArea; 3838 [m_view addTrackingArea:trackingArea]; 3877 [m_view addTrackingArea:trackingArea.get()]; 3878 3839 3879 } 3840 3880 -
trunk/Source/WebKit/UIProcess/mac/PageClientImplMac.mm
r287163 r290743 720 720 options |= NSTrackingActiveInKeyWindow; 721 721 722 RetainPtr<NSTrackingArea> trackingArea = adoptNS([[NSTrackingArea alloc] initWithRect:[m_view frame] options:options owner:m_view userInfo:nil]); 723 m_impl->setPrimaryTrackingArea(trackingArea.get()); 722 m_impl->updatePrimaryTrackingAreaOptions(options); 724 723 } 725 724 -
trunk/Tools/ChangeLog
r290739 r290743 1 2022-03-02 Chris Dumez <cdumez@apple.com> 2 3 Mousemove events double-firing in Safari 4 https://bugs.webkit.org/show_bug.cgi?id=237342 5 <rdar://88025610> 6 7 Reviewed by Wenson Hsieh. 8 9 Call [WKWebView _simulateMouseMove:] SPI instead of calling [WKWebView mouseMoved:] 10 since the latter calls are now being ignored. 11 12 * TestWebKitAPI/cocoa/TestWKWebView.mm: 13 (-[TestWKWebView mouseMoveToPoint:withFlags:]): 14 * TestWebKitAPI/mac/PlatformWebViewMac.mm: 15 (TestWebKitAPI::PlatformWebView::simulateMouseMove): 16 * WebKitTestRunner/mac/EventSenderProxy.mm: 17 (WTR::EventSenderProxy::mouseMoveTo): 18 1 19 2022-03-02 Sihui Liu <sihui_liu@apple.com> 2 20 -
trunk/Tools/TestWebKitAPI/cocoa/TestWKWebView.mm
r290620 r290743 838 838 - (void)mouseMoveToPoint:(NSPoint)pointInWindow withFlags:(NSEventModifierFlags)flags 839 839 { 840 [self mouseMoved:[self _mouseEventWithType:NSEventTypeMouseMoved atLocation:pointInWindow flags:flags timestamp:self.eventTimestamp clickCount:0]];840 [self _simulateMouseMove:[self _mouseEventWithType:NSEventTypeMouseMoved atLocation:pointInWindow flags:flags timestamp:self.eventTimestamp clickCount:0]]; 841 841 } 842 842 -
trunk/Tools/TestWebKitAPI/mac/PlatformWebViewMac.mm
r249327 r290743 196 196 { 197 197 NSEvent *event = [NSEvent mouseEventWithType:NSEventTypeMouseMoved location:NSMakePoint(x, y) modifierFlags:modifierFlagsForWKModifiers(modifiers) timestamp:GetCurrentEventTime() windowNumber:[m_window windowNumber] context:[NSGraphicsContext currentContext] eventNumber:0 clickCount:0 pressure:0]; 198 [m_view mouseMoved:event];198 [m_view _simulateMouseMove:event]; 199 199 } 200 200 -
trunk/Tools/WebKitTestRunner/mac/EventSenderProxy.mm
r285409 r290743 39 39 #import <WebKit/WKPagePrivate.h> 40 40 #import <WebKit/WKWebView.h> 41 #import <WebKit/WKWebViewPrivateForTestingMac.h> 41 42 #import <pal/spi/cocoa/IOKitSPI.h> 42 43 #import <wtf/RetainPtr.h> … … 614 615 [targetView mouseDragged:event]; 615 616 else 616 [ targetView mouseMoved:event];617 [static_cast<WKWebView*>(targetView) _simulateMouseMove:event]; 617 618 [NSApp _setCurrentEvent:nil]; 618 619 } else
Note: See TracChangeset
for help on using the changeset viewer.