Changeset 275562 in webkit
- Timestamp:
- Apr 6, 2021, 3:29:15 PM (5 years ago)
- Location:
- trunk/Source/WebKit
- Files:
-
- 8 edited
-
ChangeLog (modified) (1 diff)
-
Platform/spi/ios/UIKitSPI.h (modified) (1 diff)
-
UIProcess/RemoteLayerTree/ios/RemoteScrollingCoordinatorProxyIOS.mm (modified) (2 diffs)
-
UIProcess/RemoteLayerTree/ios/ScrollingTreeFrameScrollingNodeRemoteIOS.h (modified) (1 diff)
-
UIProcess/RemoteLayerTree/ios/ScrollingTreeFrameScrollingNodeRemoteIOS.mm (modified) (1 diff)
-
UIProcess/ios/WKContentView.mm (modified) (1 diff)
-
UIProcess/ios/WKContentViewInteraction.h (modified) (2 diffs)
-
UIProcess/ios/WKContentViewInteraction.mm (modified) (15 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebKit/ChangeLog
r275560 r275562 1 2021-04-06 Devin Rousso <drousso@apple.com> 2 3 [iOS] contextmenu hints can be clipped by the WKWebView 4 https://bugs.webkit.org/show_bug.cgi?id=224204 5 <rdar://problem/75504620> 6 7 Reviewed by Wenson Hsieh. 8 9 * UIProcess/ios/WKContentViewInteraction.h: 10 * UIProcess/ios/WKContentViewInteraction.mm: 11 (-[WKContentView cleanUpInteraction]): 12 (-[WKContentView cleanUpRelatedViews]): Added. 13 (-[WKContentView _didScroll]): 14 (-[WKContentView textEffectsWindow]): 15 (-[WKContentView _createPreviewContainerWithLayerName:]): 16 (-[WKContentView containerForDropPreviews]): 17 (-[WKContentView containerForDragPreviews]): 18 (-[WKContentView containerForContextMenuHintPreviews]): 19 (-[WKContentView _hideTargetedPreviewContainerViews]): 20 (-[WKContentView _updateTargetedPreviewViewsContainerViewFrameIfNeeded]): Added. 21 (-[WKContentView _removeTargetedPreviewViewsContainerViewIfPossible]): Added. 22 (-[WKContentView _updateTargetedPreviewScrollViewUsingContainerScrollingNodeID:]): Added. 23 (-[WKContentView cleanUpDragSourceSessionState]): 24 (-[WKContentView _createTargetedContextMenuHintPreviewForFocusedElement]): 25 (-[WKContentView _createTargetedContextMenuHintPreviewIfPossible]): 26 (-[WKContentView _removeContextMenuViewIfPossible]): 27 (-[WKContentView dropInteraction:concludeDrop:]): 28 (-[WKContentView overridePositionTrackingViewForTargetedPreviewIfNecessary:containerScrollingNodeID:]): Deleted. 29 Instead of attaching the contextmenu hint container (`_contextMenuHintContainerView`) to 30 the `WKWebView` (via the `_interactionViewsContainerView`), attach it to a new container 31 (`_targetedPreviewViewsContainerView`) under the `UITextEffectsWindow` so that if the 32 contextmenu target is near the edge of the `WKWebView` then the shadow of the contextmenu 33 hint will not be clipped by the `WKWebView`. Whenever any view is scrolled, adjust the 34 `frame` of the `_targetedPreviewViewsContainerView` so that the contextmenu hint moves. 35 36 * UIProcess/ios/WKContentView.mm: 37 (-[WKContentView didMoveToWindow]): 38 Call `-cleanUpRelatedViews` if no longer attached to a `window` so that the 39 `_targetedPreviewViewsContainerView` is not left behind if the `WKWebView` is moved. 40 41 * UIProcess/RemoteLayerTree/ios/RemoteScrollingCoordinatorProxyIOS.mm: 42 (WebKit::RemoteScrollingCoordinatorProxy::scrollViewForScrollingNodeID const): 43 * UIProcess/RemoteLayerTree/ios/ScrollingTreeFrameScrollingNodeRemoteIOS.h: 44 * UIProcess/RemoteLayerTree/ios/ScrollingTreeFrameScrollingNodeRemoteIOS.mm: 45 (WebKit::ScrollingTreeFrameScrollingNodeRemoteIOS::scrollView const): Added. 46 `ScrollingTreeFrameScrollingNodeRemoteIOS` also has a corresponding `UIScrollView`. 47 48 * Platform/spi/ios/UIKitSPI.h: 49 Remove no longer needed SPI now that WebKit manages the position of the contextmenu hint. 50 1 51 2021-04-06 Patrick Angle <pangle@apple.com> 2 52 -
trunk/Source/WebKit/Platform/spi/ios/UIKitSPI.h
r275532 r275562 1219 1219 1220 1220 #if USE(UICONTEXTMENU) 1221 @interface UITargetedPreview ()1222 @property (nonatomic, strong, setter=_setOverridePositionTrackingView:) UIView *overridePositionTrackingView;1223 @end1224 1225 1221 @interface UIContextMenuInteraction () 1226 1222 @property (nonatomic, readonly) UIGestureRecognizer *gestureRecognizerForFailureRelationships; -
trunk/Source/WebKit/UIProcess/RemoteLayerTree/ios/RemoteScrollingCoordinatorProxyIOS.mm
r272610 r275562 32 32 #import "RemoteLayerTreeHost.h" 33 33 #import "RemoteLayerTreeNode.h" 34 #import "ScrollingTreeFrameScrollingNodeRemoteIOS.h" 34 35 #import "ScrollingTreeOverflowScrollingNodeIOS.h" 35 36 #import "WebPageProxy.h" … … 57 58 { 58 59 auto* treeNode = m_scrollingTree->nodeForID(nodeID); 59 if (!is<ScrollingTreeOverflowScrollingNode>(treeNode)) 60 return nil; 61 62 auto* scrollingNode = downcast<ScrollingTreeOverflowScrollingNode>(treeNode); 63 // All ScrollingTreeOverflowScrollingNodes are ScrollingTreeOverflowScrollingNodeIOS on iOS. 64 return static_cast<ScrollingTreeOverflowScrollingNodeIOS*>(scrollingNode)->scrollView(); 60 61 if (is<ScrollingTreeOverflowScrollingNode>(treeNode)) { 62 auto* overflowScrollingNode = downcast<ScrollingTreeOverflowScrollingNode>(treeNode); 63 64 // All ScrollingTreeOverflowScrollingNodes are ScrollingTreeOverflowScrollingNodeIOS on iOS. 65 return static_cast<ScrollingTreeOverflowScrollingNodeIOS*>(overflowScrollingNode)->scrollView(); 66 } 67 68 if (is<ScrollingTreeFrameScrollingNode>(treeNode)) { 69 auto* frameScrollingNode = downcast<ScrollingTreeFrameScrollingNode>(treeNode); 70 71 // All ScrollingTreeFrameScrollingNodes are ScrollingTreeFrameScrollingNodeRemoteIOS on iOS. 72 return static_cast<ScrollingTreeFrameScrollingNodeRemoteIOS*>(frameScrollingNode)->scrollView(); 73 } 74 75 return nil; 65 76 } 66 77 -
trunk/Source/WebKit/UIProcess/RemoteLayerTree/ios/ScrollingTreeFrameScrollingNodeRemoteIOS.h
r242356 r275562 39 39 virtual ~ScrollingTreeFrameScrollingNodeRemoteIOS(); 40 40 41 UIScrollView *scrollView() const; 42 41 43 private: 42 44 ScrollingTreeFrameScrollingNodeRemoteIOS(WebCore::ScrollingTree&, WebCore::ScrollingNodeType, WebCore::ScrollingNodeID); -
trunk/Source/WebKit/UIProcess/RemoteLayerTree/ios/ScrollingTreeFrameScrollingNodeRemoteIOS.mm
r269184 r275562 50 50 ScrollingTreeFrameScrollingNodeRemoteIOS::~ScrollingTreeFrameScrollingNodeRemoteIOS() 51 51 { 52 } 53 54 UIScrollView *ScrollingTreeFrameScrollingNodeRemoteIOS::scrollView() const 55 { 56 return m_scrollingNodeDelegate ? m_scrollingNodeDelegate->scrollView() : nil; 52 57 } 53 58 -
trunk/Source/WebKit/UIProcess/ios/WKContentView.mm
r275297 r275562 337 337 if (self.window) 338 338 [self setUpInteraction]; 339 else 340 [self cleanUpRelatedViews]; 339 341 } 340 342 -
trunk/Source/WebKit/UIProcess/ios/WKContentViewInteraction.h
r275546 r275562 299 299 RetainPtr<_UIHighlightView> _highlightView; 300 300 RetainPtr<UIView> _interactionViewsContainerView; 301 RetainPtr<UIView> _targetedPreviewViewsContainerView; 302 WeakObjCPtr<UIScrollView> _scrollViewForTargetedPreview; 301 303 RetainPtr<UIView> _contextMenuHintContainerView; 302 304 RetainPtr<UIView> _dragPreviewContainerView; … … 526 528 - (void)setUpInteraction; 527 529 - (void)cleanUpInteraction; 530 - (void)cleanUpRelatedViews; 528 531 529 532 - (void)scrollViewWillStartPanOrPinchGesture; -
trunk/Source/WebKit/UIProcess/ios/WKContentViewInteraction.mm
r275546 r275562 1047 1047 _layerTreeTransactionIdAtLastInteractionStart = { }; 1048 1048 1049 #if USE(UICONTEXTMENU) 1050 [self _removeContextMenuViewIfPossible]; 1051 #endif // USE(UICONTEXTMENU) 1052 1049 1053 #if ENABLE(DRAG_SUPPORT) 1050 1054 [existingLocalDragSessionContext(_dragDropInteractionState.dragSession()) cleanUpTemporaryDirectories]; … … 1101 1105 #endif 1102 1106 1107 [std::exchange(_targetedPreviewViewsContainerView, nil) removeFromSuperview]; 1108 1103 1109 _hasSetUpInteractions = NO; 1104 1110 _suppressSelectionAssistantReasons = { }; … … 1109 1115 1110 1116 _cachedSelectedTextRange = nil; 1117 } 1118 1119 - (void)cleanUpRelatedViews 1120 { 1121 [std::exchange(_targetedPreviewViewsContainerView, nil) removeFromSuperview]; 1111 1122 } 1112 1123 … … 2033 2044 - (void)_didScroll 2034 2045 { 2046 [self _updateTargetedPreviewViewsContainerViewFrameIfNeeded]; 2047 2035 2048 [self _cancelLongPressGestureRecognizer]; 2036 2049 [self _cancelInteraction]; … … 7568 7581 #endif // HAVE(PASTEBOARD_DATA_OWNER) 7569 7582 7583 - (UIView *)textEffectsWindow 7584 { 7585 return [UITextEffectsWindow sharedTextEffectsWindowForWindowScene:self.window.windowScene]; 7586 } 7587 7570 7588 - (RetainPtr<UIView>)_createPreviewContainerWithLayerName:(NSString *)layerName 7571 7589 { 7590 if (!_targetedPreviewViewsContainerView) { 7591 _targetedPreviewViewsContainerView = adoptNS([[UIView alloc] init]); 7592 [_targetedPreviewViewsContainerView layer].name = @"Preview Views Container"; 7593 [_targetedPreviewViewsContainerView layer].anchorPoint = CGPointZero; 7594 [self _updateTargetedPreviewViewsContainerViewFrameIfNeeded]; 7595 [self.textEffectsWindow addSubview:_targetedPreviewViewsContainerView.get()]; 7596 } 7597 7572 7598 auto container = adoptNS([[UIView alloc] init]); 7573 7599 [container layer].anchorPoint = CGPointZero; 7574 7600 [container layer].name = layerName; 7575 [_ interactionViewsContainerView addSubview:container.get()];7601 [_targetedPreviewViewsContainerView addSubview:container.get()]; 7576 7602 return container; 7577 7603 } … … 7581 7607 if (!_dropPreviewContainerView) 7582 7608 _dropPreviewContainerView = [self _createPreviewContainerWithLayerName:@"Drop Preview Container"]; 7609 7610 [_targetedPreviewViewsContainerView setHidden:NO]; 7583 7611 7584 7612 ASSERT([_dropPreviewContainerView superview]); … … 7592 7620 _dragPreviewContainerView = [self _createPreviewContainerWithLayerName:@"Drag Preview Container"]; 7593 7621 7622 [_targetedPreviewViewsContainerView setHidden:NO]; 7623 7594 7624 ASSERT([_dragPreviewContainerView superview]); 7595 7625 [_dragPreviewContainerView setHidden:NO]; … … 7602 7632 _contextMenuHintContainerView = [self _createPreviewContainerWithLayerName:@"Context Menu Hint Preview Container"]; 7603 7633 7634 [_targetedPreviewViewsContainerView setHidden:NO]; 7635 7604 7636 ASSERT([_contextMenuHintContainerView superview]); 7605 7637 [_contextMenuHintContainerView setHidden:NO]; … … 7609 7641 - (void)_hideTargetedPreviewContainerViews 7610 7642 { 7643 [_targetedPreviewViewsContainerView setHidden:YES]; 7611 7644 [_dropPreviewContainerView setHidden:YES]; 7612 7645 [_dragPreviewContainerView setHidden:YES]; 7613 7646 [_contextMenuHintContainerView setHidden:YES]; 7647 } 7648 7649 - (void)_updateTargetedPreviewViewsContainerViewFrameIfNeeded 7650 { 7651 if (!_targetedPreviewViewsContainerView || [_targetedPreviewViewsContainerView isHidden]) 7652 return; 7653 7654 auto scrollView = _scrollViewForTargetedPreview.get() ?: retainPtr(self._scroller); 7655 7656 CGRect frame = [_targetedPreviewViewsContainerView frame]; 7657 frame.origin = [scrollView convertPoint:CGPointZero toView:[_targetedPreviewViewsContainerView superview]]; 7658 [_targetedPreviewViewsContainerView setFrame:frame]; 7659 } 7660 7661 - (void)_removeTargetedPreviewViewsContainerViewIfPossible 7662 { 7663 if (!_targetedPreviewViewsContainerView || [_targetedPreviewViewsContainerView subviews].count) 7664 return; 7665 7666 [std::exchange(_targetedPreviewViewsContainerView, nil) removeFromSuperview]; 7667 _scrollViewForTargetedPreview = nil; 7668 } 7669 7670 - (void)_updateTargetedPreviewScrollViewUsingContainerScrollingNodeID:(WebCore::ScrollingNodeID)scrollingNodeID 7671 { 7672 if (scrollingNodeID) { 7673 if (auto* scrollingCoordinator = _page->scrollingCoordinatorProxy()) { 7674 if (UIScrollView *scrollViewForScrollingNode = scrollingCoordinator->scrollViewForScrollingNodeID(scrollingNodeID)) { 7675 _scrollViewForTargetedPreview = scrollViewForScrollingNode; 7676 return; 7677 } 7678 } 7679 } 7680 7681 _scrollViewForTargetedPreview = self.webView.scrollView; 7614 7682 } 7615 7683 … … 7933 8001 7934 8002 [std::exchange(_dragPreviewContainerView, nil) removeFromSuperview]; 8003 [self _removeTargetedPreviewViewsContainerViewIfPossible]; 7935 8004 [std::exchange(_visibleContentViewSnapshot, nil) removeFromSuperview]; 7936 8005 [_editDropCaretView remove]; … … 8186 8255 } 8187 8256 8188 - (UIView *)textEffectsWindow8189 {8190 return [UITextEffectsWindow sharedTextEffectsWindowForWindowScene:self.window.windowScene];8191 }8192 8193 8257 - (NSDictionary *)_autofillContext 8194 8258 { … … 8286 8350 } 8287 8351 8288 - (void)overridePositionTrackingViewForTargetedPreviewIfNecessary:(UITargetedPreview *)targetedPreview containerScrollingNodeID:(WebCore::ScrollingNodeID)scrollingNodeID8289 {8290 if (!scrollingNodeID)8291 return;8292 8293 UIScrollView *positionTrackingView = self.webView.scrollView;8294 if (auto* scrollingCoordinator = _page->scrollingCoordinatorProxy())8295 positionTrackingView = scrollingCoordinator->scrollViewForScrollingNodeID(scrollingNodeID);8296 8297 if ([targetedPreview respondsToSelector:@selector(_setOverridePositionTrackingView:)])8298 [targetedPreview _setOverridePositionTrackingView:positionTrackingView];8299 }8300 8301 8352 - (UITargetedPreview *)_createTargetedContextMenuHintPreviewForFocusedElement 8302 8353 { 8303 8354 RetainPtr<UITargetedPreview> targetedPreview = createFallbackTargetedPreview(self, self.containerForContextMenuHintPreviews, _focusedElementInformation.interactionRect); 8304 8355 8305 [self overridePositionTrackingViewForTargetedPreviewIfNecessary:targetedPreview.get() containerScrollingNodeID:_focusedElementInformation.containerScrollingNodeID];8356 [self _updateTargetedPreviewScrollViewUsingContainerScrollingNodeID:_focusedElementInformation.containerScrollingNodeID]; 8306 8357 8307 8358 _contextMenuInteractionTargetedPreview = WTFMove(targetedPreview); … … 8326 8377 targetedPreview = createFallbackTargetedPreview(self, self.containerForContextMenuHintPreviews, _positionInformation.bounds); 8327 8378 8328 [self overridePositionTrackingViewForTargetedPreviewIfNecessary:targetedPreview.get() containerScrollingNodeID:_positionInformation.containerScrollingNodeID];8379 [self _updateTargetedPreviewScrollViewUsingContainerScrollingNodeID:_positionInformation.containerScrollingNodeID]; 8329 8380 8330 8381 _contextMenuInteractionTargetedPreview = WTFMove(targetedPreview); … … 8357 8408 8358 8409 [std::exchange(_contextMenuHintContainerView, nil) removeFromSuperview]; 8410 [self _removeTargetedPreviewViewsContainerViewIfPossible]; 8359 8411 } 8360 8412 … … 8854 8906 { 8855 8907 [std::exchange(_dropPreviewContainerView, nil) removeFromSuperview]; 8908 [self _removeTargetedPreviewViewsContainerViewIfPossible]; 8856 8909 [std::exchange(_visibleContentViewSnapshot, nil) removeFromSuperview]; 8857 8910 [std::exchange(_unselectedContentSnapshot, nil) removeFromSuperview];
Note:
See TracChangeset
for help on using the changeset viewer.