Changeset 187193 in webkit
- Timestamp:
- Jul 22, 2015, 4:23:02 PM (11 years ago)
- Location:
- trunk/Source/WebKit2
- Files:
-
- 6 edited
-
ChangeLog (modified) (1 diff)
-
Platform/spi/ios/UIKitSPI.h (modified) (1 diff)
-
UIProcess/API/Cocoa/WKWebView.mm (modified) (1 diff)
-
UIProcess/ios/WKContentView.mm (modified) (2 diffs)
-
UIProcess/ios/WKContentViewInteraction.h (modified) (4 diffs)
-
UIProcess/ios/WKContentViewInteraction.mm (modified) (10 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebKit2/ChangeLog
r187191 r187193 1 2015-07-22 Tim Horton <timothy_horton@apple.com> 2 3 [iOS] Adjust the preview architecture 4 https://bugs.webkit.org/show_bug.cgi?id=147203 5 <rdar://problem/21945775> 6 7 Reviewed by Beth Dakin. 8 9 * Platform/spi/ios/UIKitSPI.h: 10 * UIProcess/API/Cocoa/WKWebView.mm: 11 (-[WKWebView _setAllowsLinkPreview:]): Deleted. 12 * UIProcess/ios/WKContentView.mm: 13 (-[WKContentView willMoveToWindow:]): Deleted. 14 * UIProcess/ios/WKContentViewInteraction.h: 15 * UIProcess/ios/WKContentViewInteraction.mm: 16 (-[WKContentView setupInteraction]): 17 (-[WKContentView cleanupInteraction]): 18 (-[WKContentView _registerPreview]): 19 (-[WKContentView _unregisterPreview]): 20 (-[WKContentView _interactionShouldBeginFromPreviewItemController:forPosition:]): 21 (-[WKContentView _dataForPreviewItemController:atPosition:type:]): 22 (-[WKContentView _presentationRectForPreviewItemController:]): 23 (-[WKContentView _presentedViewControllerForPreviewItemController:]): 24 (-[WKContentView _previewItemController:commitPreview:]): 25 (-[WKContentView _previewItemController:willPresentPreview:forPosition:inSourceView:]): 26 (-[WKContentView _previewItemController:didDismissPreview:committing:]): 27 (-[WKContentView _presentationSnapshotForPreviewItemController:]): 28 (-[WKContentView _presentationRectsForPreviewItemController:]): 29 (-[WKContentView gestureRecognizerShouldBegin:]): Deleted. 30 (-[WKContentView _registerPreviewInWindow:]): Deleted. 31 (-[WKContentView _unregisterPreviewInWindow:]): Deleted. 32 (-[WKContentView previewViewControllerForPosition:inSourceView:]): Deleted. 33 (-[WKContentView commitPreviewViewController:]): Deleted. 34 (-[WKContentView willPresentPreviewViewController:forPosition:inSourceView:]): Deleted. 35 (-[WKContentView didDismissPreviewViewController:committing:]): Deleted. 36 Register and unregister in setup/cleanupInteraction instead of when moving between windows. 37 Implement 'shouldBegin' instead of interacting directly with the recognizer. 38 Make use of system enums instead of our own. 39 Let UIPreviewItemController handle shrink-wrapping and the indicator view. 40 1 41 2015-07-22 Gyuyoung Kim <gyuyoung.kim@webkit.org> 2 42 -
trunk/Source/WebKit2/Platform/spi/ios/UIKitSPI.h
r186648 r187193 49 49 #import <UIKit/UIPickerView_Private.h> 50 50 #import <UIKit/UIPresentationController_Private.h> 51 #import <UIKit/UIPreviewItemController.h> 51 52 #import <UIKit/UIResponder_Private.h> 52 53 #import <UIKit/UIScrollView_Private.h> -
trunk/Source/WebKit2/UIProcess/API/Cocoa/WKWebView.mm
r187131 r187193 2999 2999 3000 3000 _allowsLinkPreview = allowsLinkPreview; 3001 #if HAVE(LINK_PREVIEW)3002 if (_allowsLinkPreview)3003 [_contentView _registerPreviewInWindow:[_contentView window]];3004 else3005 [_contentView _unregisterPreviewInWindow:[_contentView window]];3006 #endif3007 3001 } 3008 3002 -
trunk/Source/WebKit2/UIProcess/ios/WKContentView.mm
r186712 r187193 269 269 if (window) { 270 270 [defaultCenter removeObserver:self name:UIWindowDidMoveToScreenNotification object:window]; 271 #if HAVE(LINK_PREVIEW)272 if (_webView._allowsLinkPreview)273 [self _unregisterPreviewInWindow:window];274 #endif275 271 276 272 if (!newWindow) { … … 282 278 if (newWindow) { 283 279 [defaultCenter addObserver:self selector:@selector(_windowDidMoveToScreenNotification:) name:UIWindowDidMoveToScreenNotification object:newWindow]; 284 #if HAVE(LINK_PREVIEW)285 if (_webView._allowsLinkPreview)286 [self _registerPreviewInWindow:newWindow];287 #endif288 280 289 281 [self _updateForScreen:newWindow.screen]; -
trunk/Source/WebKit2/UIProcess/ios/WKContentViewInteraction.h
r186916 r187193 95 95 }; 96 96 97 enum class PreviewElementType {98 None = 0,99 Link,100 Image101 };102 103 97 } 104 98 … … 128 122 RetainPtr<WKFileUploadPanel> _fileUploadPanel; 129 123 RetainPtr<UIGestureRecognizer> _previewGestureRecognizer; 130 WebKit::PreviewElementType _previewType;124 RetainPtr<UIPreviewItemController> _previewItemController; 131 125 132 126 std::unique_ptr<WebKit::SmartMagnificationController> _smartMagnificationController; … … 153 147 154 148 WebKit::WKSelectionDrawingInfo _lastSelectionDrawingInfo; 155 #if HAVE(LINK_PREVIEW)156 id <UIViewControllerPreviewing> _previewing;157 #endif158 159 RetainPtr<UIImageView> _previewIndicatorView;160 149 161 150 BOOL _isEditable; … … 219 208 220 209 #if HAVE(LINK_PREVIEW) 221 @interface WKContentView (WKInteractionPreview) <UI ViewControllerPreviewingDelegate>222 223 - (void)_registerPreview InWindow:(UIWindow *)window;224 - (void)_unregisterPreview InWindow:(UIWindow *)window;210 @interface WKContentView (WKInteractionPreview) <UIPreviewItemDelegate> 211 212 - (void)_registerPreview; 213 - (void)_unregisterPreview; 225 214 @end 226 215 #endif -
trunk/Source/WebKit2/UIProcess/ios/WKContentViewInteraction.mm
r187173 r187193 342 342 [self addGestureRecognizer:_longPressGestureRecognizer.get()]; 343 343 344 [self _registerPreview]; 345 344 346 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(_resetShowingTextStyle:) name:UIMenuControllerDidHideMenuNotification object:nil]; 345 347 _showingTextStyleOptions = NO; … … 397 399 } 398 400 401 [self _unregisterPreview]; 399 402 if (_fileUploadPanel) { 400 403 [_fileUploadPanel setDelegate:nil]; … … 964 967 return [self _actionForLongPress] != nil; 965 968 } 966 }967 968 if (gestureRecognizer == _previewGestureRecognizer) {969 [self ensurePositionInformationIsUpToDate:point];970 if (_positionInformation.clickableElementName != "A" && _positionInformation.clickableElementName != "IMG")971 return NO;972 973 String absoluteLinkURL = _positionInformation.url;974 if (_positionInformation.clickableElementName == "A" && (absoluteLinkURL.isEmpty() || !WebCore::protocolIsInHTTPFamily(absoluteLinkURL)))975 return NO;976 969 } 977 970 … … 3204 3197 @implementation WKContentView (WKInteractionPreview) 3205 3198 3206 - (void)_registerPreviewInWindow:(UIWindow *)window 3207 { 3208 _previewing = [[window.rootViewController registerForPreviewingWithSourceView:self] retain]; 3209 _previewing.delegate = self; 3210 _previewGestureRecognizer = _previewing.presentationGestureRecognizer; 3211 [_previewGestureRecognizer setDelegate:self]; 3212 } 3213 3214 - (void)_unregisterPreviewInWindow:(UIWindow *)window 3215 { 3216 [window.rootViewController unregisterPreviewing:_previewing]; 3217 _previewing.delegate = nil; 3218 [_previewGestureRecognizer setDelegate:nil]; 3199 - (void)_registerPreview 3200 { 3201 _previewItemController = adoptNS([[UIPreviewItemController alloc] initWithView:self]); 3202 [_previewItemController setDelegate:self]; 3203 _previewGestureRecognizer = _previewItemController.get().presentationGestureRecognizer; 3204 } 3205 3206 - (void)_unregisterPreview 3207 { 3208 [_previewItemController setDelegate:nil]; 3219 3209 _previewGestureRecognizer = nil; 3220 [_previewing release]; 3221 _previewing = nil; 3222 } 3223 3224 - (UIViewController *)previewViewControllerForPosition:(CGPoint)position inSourceView:(UIView *)sourceView 3225 { 3226 ASSERT(self == sourceView); 3227 3228 _previewType = PreviewElementType::None; 3229 3230 BOOL canShowImagePreview = _positionInformation.clickableElementName == "IMG"; 3210 _previewItemController = nil; 3211 } 3212 3213 - (BOOL)_interactionShouldBeginFromPreviewItemController:(UIPreviewItemController *)controller forPosition:(CGPoint)position 3214 { 3215 [self ensurePositionInformationIsUpToDate:position]; 3216 if (_positionInformation.clickableElementName != "A" && _positionInformation.clickableElementName != "IMG") 3217 return NO; 3218 3219 String absoluteLinkURL = _positionInformation.url; 3220 if (_positionInformation.clickableElementName == "A") { 3221 if (absoluteLinkURL.isEmpty()) 3222 return NO; 3223 if (WebCore::protocolIsInHTTPFamily(absoluteLinkURL)) 3224 return YES; 3225 NSURL *targetURL = [NSURL _web_URLWithWTFString:_positionInformation.url]; 3226 if ([[getDDDetectionControllerClass() tapAndHoldSchemes] containsObject:[targetURL scheme]]) 3227 return YES; 3228 return NO; 3229 } 3230 return YES; 3231 } 3232 3233 - (NSDictionary *)_dataForPreviewItemController:(UIPreviewItemController *)controller atPosition:(CGPoint)position type:(UIPreviewItemType *)type 3234 { 3235 *type = UIPreviewItemTypeNone; 3236 3237 id <WKUIDelegatePrivate> uiDelegate = static_cast<id <WKUIDelegatePrivate>>([_webView UIDelegate]); 3238 BOOL supportsImagePreview = [uiDelegate respondsToSelector:@selector(_webView:commitPreviewedImageWithURL:)]; 3239 BOOL canShowImagePreview = _positionInformation.clickableElementName == "IMG" && supportsImagePreview; 3231 3240 BOOL canShowLinkPreview = _positionInformation.clickableElementName == "A" || canShowImagePreview; 3241 BOOL useImageURLForLink = NO; 3242 3243 if (canShowImagePreview && _positionInformation.isAnimatedImage) { 3244 canShowImagePreview = NO; 3245 canShowLinkPreview = YES; 3246 useImageURLForLink = YES; 3247 } 3232 3248 3233 3249 if (!canShowLinkPreview && !canShowImagePreview) … … 3235 3251 3236 3252 String absoluteLinkURL = _positionInformation.url; 3237 if ( absoluteLinkURL.isEmpty() || !WebCore::protocolIsInHTTPFamily(absoluteLinkURL)) {3253 if (!useImageURLForLink && (absoluteLinkURL.isEmpty() || !WebCore::protocolIsInHTTPFamily(absoluteLinkURL))) { 3238 3254 if (canShowLinkPreview && !canShowImagePreview) 3239 3255 return nil; … … 3241 3257 } 3242 3258 3259 NSMutableDictionary *dataForPreview = [[[NSMutableDictionary alloc] init] autorelease]; 3260 if (canShowLinkPreview) { 3261 *type = UIPreviewItemTypeLink; 3262 if (useImageURLForLink) 3263 dataForPreview[UIPreviewDataLink] = [NSURL _web_URLWithWTFString:_positionInformation.imageURL]; 3264 else 3265 dataForPreview[UIPreviewDataLink] = [NSURL _web_URLWithWTFString:_positionInformation.url]; 3266 } 3267 if (canShowImagePreview) { 3268 *type = UIPreviewItemTypeImage; 3269 dataForPreview[UIPreviewDataLink] = [NSURL _web_URLWithWTFString:_positionInformation.imageURL]; 3270 } 3271 3272 return dataForPreview; 3273 } 3274 3275 - (CGRect)_presentationRectForPreviewItemController:(UIPreviewItemController *)controller 3276 { 3277 return _positionInformation.bounds; 3278 } 3279 3280 - (UIViewController *)_presentedViewControllerForPreviewItemController:(UIPreviewItemController *)controller 3281 { 3243 3282 id <WKUIDelegatePrivate> uiDelegate = static_cast<id <WKUIDelegatePrivate>>([_webView UIDelegate]); 3244 3283 3245 if (canShowLinkPreview) { 3246 _previewType = PreviewElementType::Link; 3247 NSURL *targetURL = [NSURL _web_URLWithWTFString:_positionInformation.url]; 3284 NSURL *targetURL = controller.previewData[UIPreviewDataLink]; 3285 URL coreTargetURL = targetURL; 3286 bool isValidURLForImagePreview = !coreTargetURL.isEmpty() && (WebCore::protocolIsInHTTPFamily(coreTargetURL) || WebCore::protocolIs(coreTargetURL, "data")); 3287 3288 if ([_previewItemController type] == UIPreviewItemTypeLink) { 3289 // Treat animated images like a link preview 3290 if (isValidURLForImagePreview && _positionInformation.isAnimatedImage) { 3291 RetainPtr<_WKActivatedElementInfo> animatedImageElementInfo = adoptNS([[_WKActivatedElementInfo alloc] _initWithType:_WKActivatedElementTypeImage URL:targetURL location:_positionInformation.point title:_positionInformation.title rect:_positionInformation.bounds image:_positionInformation.image.get()]); 3292 3293 if ([uiDelegate respondsToSelector:@selector(_webView:previewViewControllerForAnimatedImageAtURL:defaultActions:elementInfo:imageSize:)]) { 3294 RetainPtr<NSArray> actions = [_actionSheetAssistant defaultActionsForImageSheet:animatedImageElementInfo.get()]; 3295 _highlightLongPressCanClick = NO; 3296 return [uiDelegate _webView:_webView previewViewControllerForAnimatedImageAtURL:targetURL defaultActions:actions.get() elementInfo:animatedImageElementInfo.get() imageSize:_positionInformation.image->size()]; 3297 } 3298 } 3299 3248 3300 RetainPtr<_WKActivatedElementInfo> elementInfo = adoptNS([[_WKActivatedElementInfo alloc] _initWithType:_WKActivatedElementTypeLink URL:targetURL location:_positionInformation.point title:_positionInformation.title rect:_positionInformation.bounds image:_positionInformation.image.get()]); 3301 3249 3302 RetainPtr<NSArray> actions = [_actionSheetAssistant defaultActionsForLinkSheet:elementInfo.get()]; 3250 3303 if ([uiDelegate respondsToSelector:@selector(_webView:previewViewControllerForURL:defaultActions:elementInfo:)]) { … … 3258 3311 return [uiDelegate _webView:_webView previewViewControllerForURL:targetURL]; 3259 3312 } 3260 #if HAVE(SAFARI_SERVICES_FRAMEWORK)3261 SFSafariViewController *previewViewController = [allocSFSafariViewControllerInstance() initWithURL:targetURL];3262 previewViewController._showingLinkPreview = YES;3263 previewViewController._activatedElementInfo = elementInfo.get();3264 previewViewController._previewActions = actions.get();3265 _highlightLongPressCanClick = NO;3266 _page->startInteractionWithElementAtPosition(_positionInformation.point);3267 return [previewViewController autorelease];3268 #else3269 3313 return nil; 3270 #endif 3271 } 3272 3273 if (canShowImagePreview) { 3274 if (![uiDelegate respondsToSelector:@selector(_webView:commitPreviewedImageWithURL:)]) 3314 } 3315 3316 if ([_previewItemController type] == UIPreviewItemTypeImage) { 3317 if (!isValidURLForImagePreview) 3275 3318 return nil; 3276 3319 3277 String absoluteImageURL = _positionInformation.imageURL;3278 if (absoluteImageURL.isEmpty() || !(WebCore::protocolIsInHTTPFamily(absoluteImageURL) || WebCore::protocolIs(absoluteImageURL, "data")))3279 return nil;3280 3281 NSURL *targetURL = [NSURL _web_URLWithWTFString:_positionInformation.imageURL];3282 3320 RetainPtr<_WKActivatedElementInfo> elementInfo = adoptNS([[_WKActivatedElementInfo alloc] _initWithType:_WKActivatedElementTypeImage URL:targetURL location:_positionInformation.point title:_positionInformation.title rect:_positionInformation.bounds image:_positionInformation.image.get()]); 3283 3321 _page->startInteractionWithElementAtPosition(_positionInformation.point); 3284 3322 3285 // Treat animated images like a link preview3286 if (_positionInformation.isAnimatedImage) {3287 if ([uiDelegate respondsToSelector:@selector(_webView:previewViewControllerForAnimatedImageAtURL:defaultActions:elementInfo:imageSize:)]) {3288 _previewType = PreviewElementType::Link;3289 RetainPtr<NSArray> actions = [_actionSheetAssistant defaultActionsForImageSheet:elementInfo.get()];3290 _highlightLongPressCanClick = NO;3291 return [uiDelegate _webView:_webView previewViewControllerForAnimatedImageAtURL:targetURL defaultActions:actions.get() elementInfo:elementInfo.get() imageSize:_positionInformation.image->size()];3292 }3293 }3294 3295 _previewType = PreviewElementType::Image;3296 3323 if ([uiDelegate respondsToSelector:@selector(_webView:willPreviewImageWithURL:)]) 3297 3324 [uiDelegate _webView:_webView willPreviewImageWithURL:targetURL]; … … 3302 3329 } 3303 3330 3304 - (void) commitPreviewViewController:(UIViewController *)viewController3331 - (void)_previewItemController:(UIPreviewItemController *)controller commitPreview:(UIViewController *)viewController 3305 3332 { 3306 3333 id <WKUIDelegatePrivate> uiDelegate = static_cast<id <WKUIDelegatePrivate>>([_webView UIDelegate]); 3307 if ( _previewType == PreviewElementType::Image) {3334 if ([_previewItemController type] == UIPreviewItemTypeImage) { 3308 3335 if ([uiDelegate respondsToSelector:@selector(_webView:commitPreviewedImageWithURL:)]) { 3309 3336 String absoluteImageURL = _positionInformation.imageURL; … … 3321 3348 } 3322 3349 3323 #if HAVE(SAFARI_SERVICES_FRAMEWORK) 3324 if (![viewController isKindOfClass:getSFSafariViewControllerClass()]) 3325 return; 3326 3327 SFSafariViewController *safariViewController = (SFSafariViewController *)viewController; 3328 safariViewController._showingLinkPreview = NO; 3329 3330 viewController.transitioningDelegate = nil; 3331 viewController.modalPresentationStyle = UIModalPresentationFullScreen; 3332 3333 UIViewController *presentingViewController = viewController.presentingViewController ?: self.window.rootViewController; 3334 [presentingViewController presentViewController:viewController animated:NO completion:nil]; 3335 #endif 3336 } 3337 3338 - (void)willPresentPreviewViewController:(UIViewController *)viewController forPosition:(CGPoint)position inSourceView:(UIView *)sourceView 3350 } 3351 3352 - (void)_previewItemController:(UIPreviewItemController *)controller willPresentPreview:(UIViewController *)viewController forPosition:(CGPoint)position inSourceView:(UIView *)sourceView 3339 3353 { 3340 3354 [self _removeDefaultGestureRecognizers]; 3341 3355 3342 3356 [self _cancelInteraction]; 3343 3344 [_previewIndicatorView removeFromSuperview]; 3345 3346 float deviceScaleFactor = _page->deviceScaleFactor(); 3347 3348 RefPtr<Image> image = _positionInformation.linkIndicator.contentImage; 3349 if (!image) { 3350 IntRect sourceRect = _positionInformation.bounds; 3351 const float marginInPoints = 4; 3352 sourceRect.inflate(marginInPoints * deviceScaleFactor); 3353 [[viewController presentationController] setSourceRect:sourceRect]; 3354 [[viewController presentationController] setSourceView:self]; 3355 return; 3356 } 3357 3358 RetainPtr<UIImage> indicatorImage = adoptNS([[UIImage alloc] initWithCGImage:image->getCGImageRef()]); 3359 _previewIndicatorView = adoptNS([[UIImageView alloc] initWithImage:indicatorImage.get()]); 3360 3361 const float cornerRadiusInPoints = 5; 3362 Path path = PathUtilities::pathWithShrinkWrappedRects(_positionInformation.linkIndicator.textRectsInBoundingRectCoordinates, cornerRadiusInPoints * deviceScaleFactor); 3363 RetainPtr<CAShapeLayer> maskLayer = adoptNS([[CAShapeLayer alloc] init]); 3364 [maskLayer setPath:path.ensurePlatformPath()]; 3365 3366 [_previewIndicatorView layer].mask = maskLayer.get(); 3367 [_previewIndicatorView setFrame:_positionInformation.linkIndicator.textBoundingRectInRootViewCoordinates]; 3368 [self addSubview:_previewIndicatorView.get()]; 3369 3370 [[viewController presentationController] setSourceRect:[_previewIndicatorView bounds]]; 3371 [[viewController presentationController] setSourceView:_previewIndicatorView.get()]; 3372 } 3373 3374 - (void)didDismissPreviewViewController:(UIViewController *)viewController committing:(BOOL)committing 3357 } 3358 3359 - (void)_previewItemController:(UIPreviewItemController *)controller didDismissPreview:(UIViewController *)viewController committing:(BOOL)committing 3375 3360 { 3376 3361 [self _addDefaultGestureRecognizers]; … … 3380 3365 if ([uiDelegate respondsToSelector:@selector(_webView:didDismissPreviewViewController:)]) 3381 3366 [uiDelegate _webView:_webView didDismissPreviewViewController:viewController]; 3382 3383 [_previewIndicatorView removeFromSuperview]; 3384 _previewIndicatorView = nil; 3367 } 3368 3369 - (UIImage *)_presentationSnapshotForPreviewItemController:(UIPreviewItemController *)controller 3370 { 3371 if (!_positionInformation.linkIndicator.contentImage) 3372 return nullptr; 3373 return [[[UIImage alloc] initWithCGImage:_positionInformation.linkIndicator.contentImage->getCGImageRef()] autorelease]; 3374 } 3375 3376 - (NSArray *)_presentationRectsForPreviewItemController:(UIPreviewItemController *)controller 3377 { 3378 RetainPtr<NSMutableArray> rectArray = adoptNS([[NSMutableArray alloc] init]); 3379 3380 if (_positionInformation.linkIndicator.contentImage) { 3381 FloatPoint origin = _positionInformation.linkIndicator.textBoundingRectInRootViewCoordinates.location(); 3382 for (FloatRect& rect : _positionInformation.linkIndicator.textRectsInBoundingRectCoordinates) { 3383 CGRect cgRect = rect; 3384 cgRect.origin.x += origin.x(); 3385 cgRect.origin.y += origin.y(); 3386 [rectArray addObject:[NSValue valueWithCGRect:cgRect]]; 3387 } 3388 } else { 3389 const float marginInPx = 4 * _page->deviceScaleFactor(); 3390 CGRect cgRect = CGRectInset(_positionInformation.bounds, -marginInPx, -marginInPx); 3391 [rectArray addObject:[NSValue valueWithCGRect:cgRect]]; 3392 } 3393 3394 return rectArray.autorelease(); 3385 3395 } 3386 3396
Note:
See TracChangeset
for help on using the changeset viewer.