Diff
Modified: branches/safari-608.1.31.0-branch/Source/WebKit/ChangeLog (246885 => 246886)
--- branches/safari-608.1.31.0-branch/Source/WebKit/ChangeLog 2019-06-27 17:14:53 UTC (rev 246885)
+++ branches/safari-608.1.31.0-branch/Source/WebKit/ChangeLog 2019-06-27 17:42:34 UTC (rev 246886)
@@ -1,3 +1,7 @@
+2019-06-27 Alan Coon <[email protected]>
+
+ Revert r246853. rdar://problem/51554509
+
2019-06-26 Alan Coon <[email protected]>
Revert r246834. rdar://problem/51554509
Modified: branches/safari-608.1.31.0-branch/Source/WebKit/UIProcess/ios/DragDropInteractionState.mm (246885 => 246886)
--- branches/safari-608.1.31.0-branch/Source/WebKit/UIProcess/ios/DragDropInteractionState.mm 2019-06-27 17:14:53 UTC (rev 246885)
+++ branches/safari-608.1.31.0-branch/Source/WebKit/UIProcess/ios/DragDropInteractionState.mm 2019-06-27 17:42:34 UTC (rev 246886)
@@ -46,7 +46,7 @@
static RetainPtr<UITargetedDragPreview> createTargetedDragPreview(UIImage *image, UIView *rootView, UIView *previewContainer, const FloatRect& frameInRootViewCoordinates, const Vector<FloatRect>& clippingRectsInFrameCoordinates, UIColor *backgroundColor, UIBezierPath *visiblePath)
{
- if (frameInRootViewCoordinates.isEmpty() || !image)
+ if (frameInRootViewCoordinates.isEmpty() || !image || !previewContainer.window)
return nullptr;
NSMutableArray *clippingRectValuesInFrameCoordinates = [NSMutableArray arrayWithCapacity:clippingRectsInFrameCoordinates.size()];
Modified: branches/safari-608.1.31.0-branch/Source/WebKit/UIProcess/ios/WKContentViewInteraction.mm (246885 => 246886)
--- branches/safari-608.1.31.0-branch/Source/WebKit/UIProcess/ios/WKContentViewInteraction.mm 2019-06-27 17:14:53 UTC (rev 246885)
+++ branches/safari-608.1.31.0-branch/Source/WebKit/UIProcess/ios/WKContentViewInteraction.mm 2019-06-27 17:42:34 UTC (rev 246886)
@@ -6189,6 +6189,11 @@
completion(nil, nil);
}
+- (UIView *)containerViewForTargetedPreviews
+{
+ return self.unscaledView ?: self;
+}
+
#if ENABLE(DRAG_SUPPORT)
static BOOL shouldEnableDragInteractionForPolicy(_WKDragInteractionPolicy policy)
@@ -6421,7 +6426,7 @@
[_unselectedContentSnapshot setFrame:data->contentImageWithoutSelectionRectInRootViewCoordinates];
[self insertSubview:_unselectedContentSnapshot.get() belowSubview:_visibleContentViewSnapshot.get()];
- _dragDropInteractionState.deliverDelayedDropPreview(self, self.unscaledView, data.value());
+ _dragDropInteractionState.deliverDelayedDropPreview(self, self.containerViewForTargetedPreviews, data.value());
}
- (void)_didPerformDragOperation:(BOOL)handled
@@ -6767,7 +6772,7 @@
if (overriddenPreview)
return overriddenPreview;
}
- return _dragDropInteractionState.previewForDragItem(item, self, self.unscaledView);
+ return _dragDropInteractionState.previewForDragItem(item, self, self.containerViewForTargetedPreviews);
}
- (void)dragInteraction:(UIDragInteraction *)interaction willAnimateLiftWithAnimator:(id <UIDragAnimating>)animator session:(id <UIDragSession>)session
@@ -7865,7 +7870,7 @@
// FIXME: This should be merged with createTargetedDragPreview in DragDropInteractionState.
static RetainPtr<UITargetedPreview> createTargetedPreview(UIImage *image, UIView *rootView, UIView *previewContainer, const WebCore::FloatRect& frameInRootViewCoordinates, const Vector<WebCore::FloatRect>& clippingRectsInFrameCoordinates, UIColor *backgroundColor)
{
- if (frameInRootViewCoordinates.isEmpty() || !image)
+ if (frameInRootViewCoordinates.isEmpty() || !image || !previewContainer.window)
return nil;
WebCore::FloatRect frameInContainerCoordinates = [rootView convertRect:frameInRootViewCoordinates toView:previewContainer];
@@ -7921,15 +7926,15 @@
if (_positionInformation.isLink && _positionInformation.linkIndicator.contentImage) {
auto indicator = _positionInformation.linkIndicator;
auto textIndicatorImage = uiImageForImage(indicator.contentImage.get());
- targetedPreview = createTargetedPreview(textIndicatorImage.get(), self, self.unscaledView, indicator.textBoundingRectInRootViewCoordinates, indicator.textRectsInBoundingRectCoordinates, [UIColor colorWithCGColor:cachedCGColor(indicator.estimatedBackgroundColor)]);
+ targetedPreview = createTargetedPreview(textIndicatorImage.get(), self, self.containerViewForTargetedPreviews, indicator.textBoundingRectInRootViewCoordinates, indicator.textRectsInBoundingRectCoordinates, [UIColor colorWithCGColor:cachedCGColor(indicator.estimatedBackgroundColor)]);
} else if ((_positionInformation.isAttachment || _positionInformation.isImage) && _positionInformation.image) {
auto cgImage = _positionInformation.image->makeCGImageCopy();
auto image = adoptNS([[UIImage alloc] initWithCGImage:cgImage.get()]);
- targetedPreview = createTargetedPreview(image.get(), self, self.unscaledView, _positionInformation.bounds, { }, nil);
+ targetedPreview = createTargetedPreview(image.get(), self, self.containerViewForTargetedPreviews, _positionInformation.bounds, { }, nil);
}
if (!targetedPreview)
- targetedPreview = createFallbackTargetedPreview(self, self.unscaledView, _positionInformation.bounds);
+ targetedPreview = createFallbackTargetedPreview(self, self.containerViewForTargetedPreviews, _positionInformation.bounds);
_contextMenuInteractionTargetedPreview = WTFMove(targetedPreview);
return _contextMenuInteractionTargetedPreview.get();
Modified: branches/safari-608.1.31.0-branch/Tools/ChangeLog (246885 => 246886)
--- branches/safari-608.1.31.0-branch/Tools/ChangeLog 2019-06-27 17:14:53 UTC (rev 246885)
+++ branches/safari-608.1.31.0-branch/Tools/ChangeLog 2019-06-27 17:42:34 UTC (rev 246886)
@@ -1,3 +1,7 @@
+2019-06-27 Alan Coon <[email protected]>
+
+ Revert r246853. rdar://problem/51554509
+
2019-06-26 Alan Coon <[email protected]>
Revert r246834. rdar://problem/51554509
Modified: branches/safari-608.1.31.0-branch/Tools/TestWebKitAPI/Tests/ios/DragAndDropTestsIOS.mm (246885 => 246886)
--- branches/safari-608.1.31.0-branch/Tools/TestWebKitAPI/Tests/ios/DragAndDropTestsIOS.mm 2019-06-27 17:14:53 UTC (rev 246885)
+++ branches/safari-608.1.31.0-branch/Tools/TestWebKitAPI/Tests/ios/DragAndDropTestsIOS.mm 2019-06-27 17:42:34 UTC (rev 246886)
@@ -1445,6 +1445,30 @@
checkStringArraysAreEqual(@[@"dragstart", @"dragend"], [outputText componentsSeparatedByString:@" "]);
}
+TEST(DragAndDropTests, WebProcessTerminationDuringDrag)
+{
+ auto webView = adoptNS([[TestWKWebView alloc] initWithFrame:CGRectMake(0, 0, 320, 500)]);
+ [webView synchronouslyLoadTestPageNamed:@"link-and-target-div"];
+ auto simulator = adoptNS([[DragAndDropSimulator alloc] initWithWebView:webView.get()]);
+ [simulator setSessionWillBeginBlock:^{
+ [webView _killWebContentProcessAndResetState];
+ }];
+ [simulator runFrom:CGPointMake(100, 50) to:CGPointMake(300, 50)];
+}
+
+TEST(DragAndDropTests, WebViewRemovedFromViewHierarchyDuringDrag)
+{
+ auto webView = adoptNS([[TestWKWebView alloc] initWithFrame:CGRectMake(0, 0, 320, 500)]);
+ [webView synchronouslyLoadTestPageNamed:@"link-and-target-div"];
+ auto simulator = adoptNS([[DragAndDropSimulator alloc] initWithWebView:webView.get()]);
+ [simulator setConvertItemProvidersBlock:[webView] (NSItemProvider *item, NSArray *, NSDictionary *) -> NSArray * {
+ [webView removeFromSuperview];
+ return @[ item ];
+ }];
+ [simulator runFrom:CGPointMake(100, 50) to:CGPointMake(300, 50)];
+ EXPECT_EQ([simulator cancellationPreviews].firstObject, nil);
+}
+
static void testDragAndDropOntoTargetElements(TestWKWebView *webView)
{
auto simulator = adoptNS([[DragAndDropSimulator alloc] initWithWebView:webView]);
Modified: branches/safari-608.1.31.0-branch/Tools/TestWebKitAPI/cocoa/DragAndDropSimulator.h (246885 => 246886)
--- branches/safari-608.1.31.0-branch/Tools/TestWebKitAPI/cocoa/DragAndDropSimulator.h 2019-06-27 17:14:53 UTC (rev 246885)
+++ branches/safari-608.1.31.0-branch/Tools/TestWebKitAPI/cocoa/DragAndDropSimulator.h 2019-06-27 17:42:34 UTC (rev 246886)
@@ -104,6 +104,7 @@
@property (nonatomic, copy) NSArray *(^convertItemProvidersBlock)(NSItemProvider *, NSArray *, NSDictionary *);
@property (nonatomic, copy) NSArray *(^overridePerformDropBlock)(id <UIDropSession>);
@property (nonatomic, copy) void(^dropCompletionBlock)(BOOL, NSArray *);
+@property (nonatomic, copy) dispatch_block_t sessionWillBeginBlock;
@property (nonatomic, copy) UIDropOperation(^overrideDragUpdateBlock)(UIDropOperation, id <UIDropSession>);
@property (nonatomic, readonly) NSArray *sourceItemProviders;
@@ -111,6 +112,7 @@
@property (nonatomic, readonly) CGRect finalSelectionStartRect;
@property (nonatomic, readonly) CGRect lastKnownDragCaretRect;
@property (nonatomic, readonly) NSArray<UITargetedDragPreview *> *liftPreviews;
+@property (nonatomic, readonly) NSArray<UITargetedDragPreview *> *cancellationPreviews;
@property (nonatomic, readonly) NSArray *dropPreviews;
@property (nonatomic, readonly) NSArray *delayedDropPreviews;
Modified: branches/safari-608.1.31.0-branch/Tools/TestWebKitAPI/ios/DragAndDropSimulatorIOS.mm (246885 => 246886)
--- branches/safari-608.1.31.0-branch/Tools/TestWebKitAPI/ios/DragAndDropSimulatorIOS.mm 2019-06-27 17:14:53 UTC (rev 246885)
+++ branches/safari-608.1.31.0-branch/Tools/TestWebKitAPI/ios/DragAndDropSimulatorIOS.mm 2019-06-27 17:42:34 UTC (rev 246886)
@@ -310,7 +310,8 @@
RetainPtr<NSMutableDictionary<NSNumber *, NSValue *>>_remainingAdditionalItemRequestLocationsByProgress;
RetainPtr<NSMutableArray<NSValue *>>_queuedAdditionalItemRequestLocations;
- RetainPtr<NSMutableArray<UITargetedDragPreview *>> _liftPreviews;
+ RetainPtr<NSMutableArray> _liftPreviews;
+ RetainPtr<NSMutableArray<UITargetedDragPreview *>> _cancellationPreviews;
RetainPtr<NSMutableArray> _dropPreviews;
RetainPtr<NSMutableArray> _delayedDropPreviews;
@@ -330,6 +331,7 @@
BlockPtr<NSArray *(id <UIDropSession>)> _overridePerformDropBlock;
BlockPtr<UIDropOperation(UIDropOperation, id)> _overrideDragUpdateBlock;
BlockPtr<void(BOOL, NSArray *)> _dropCompletionBlock;
+ BlockPtr<void()> _sessionWillBeginBlock;
}
- (instancetype)initWithWebViewFrame:(CGRect)frame
@@ -388,6 +390,7 @@
_queuedAdditionalItemRequestLocations = adoptNS([[NSMutableArray alloc] init]);
_liftPreviews = adoptNS([[NSMutableArray alloc] init]);
_dropPreviews = adoptNS([[NSMutableArray alloc] init]);
+ _cancellationPreviews = adoptNS([[NSMutableArray alloc] init]);
_delayedDropPreviews = adoptNS([[NSMutableArray alloc] init]);
_hasStartedInputSession = false;
}
@@ -497,6 +500,15 @@
} else {
_isDoneWithCurrentRun = true;
_phase = DragAndDropPhaseCancelled;
+ [[_dropSession items] enumerateObjectsUsingBlock:^(UIDragItem *item, NSUInteger index, BOOL *) {
+ UITargetedDragPreview *defaultPreview = nil;
+ if ([_liftPreviews count] && [[_liftPreviews objectAtIndex:index] isEqual:NSNull.null])
+ defaultPreview = [_liftPreviews objectAtIndex:index];
+
+ UITargetedDragPreview *preview = [[_webView dragInteractionDelegate] dragInteraction:[_webView dragInteraction] previewForCancellingItem:item withDefault:defaultPreview];
+ if (preview)
+ [_cancellationPreviews addObject:preview];
+ }];
[[_webView dropInteractionDelegate] dropInteraction:[_webView dropInteraction] concludeDrop:_dropSession.get()];
}
@@ -576,9 +588,8 @@
for (UIDragItem *item in items) {
[itemProviders addObject:item.itemProvider];
UITargetedDragPreview *liftPreview = [[_webView dragInteractionDelegate] dragInteraction:[_webView dragInteraction] previewForLiftingItem:item session:_dragSession.get()];
- EXPECT_TRUE(!!liftPreview);
- if (liftPreview)
- [_liftPreviews addObject:liftPreview];
+ EXPECT_TRUE(liftPreview || ![_webView window]);
+ [_liftPreviews addObject:liftPreview ?: NSNull.null];
}
_dropSession = adoptNS([[MockDropSession alloc] initWithProviders:itemProviders location:self._currentLocation window:[_webView window] allowMove:self.shouldAllowMoveOperation]);
@@ -662,11 +673,16 @@
return _phase;
}
-- (NSArray<UITargetedDragPreview *> *)liftPreviews
+- (NSArray *)liftPreviews
{
return _liftPreviews.get();
}
+- (NSArray<UITargetedDragPreview *> *)cancellationPreviews
+{
+ return _cancellationPreviews.get();
+}
+
- (NSArray<UITargetedDragPreview *> *)dropPreviews
{
return _dropPreviews.get();
@@ -757,8 +773,24 @@
return _dropCompletionBlock.get();
}
+- (void)setSessionWillBeginBlock:(dispatch_block_t)block
+{
+ _sessionWillBeginBlock = block;
+}
+
+- (dispatch_block_t)sessionWillBeginBlock
+{
+ return _sessionWillBeginBlock.get();
+}
+
#pragma mark - WKUIDelegatePrivate
+- (void)_webView:(WKWebView *)webView dataInteraction:(UIDragInteraction *)interaction sessionWillBegin:(id <UIDragSession>)session
+{
+ if (_sessionWillBeginBlock)
+ _sessionWillBeginBlock();
+}
+
- (void)_webView:(WKWebView *)webView dataInteractionOperationWasHandled:(BOOL)handled forSession:(id)session itemProviders:(NSArray<NSItemProvider *> *)itemProviders
{
if (self.dropCompletionBlock)