⚠ Archived content — this site is no longer maintained.   Current WebKit documentation is at docs.webkit.org.

Changeset 187193 in webkit


Ignore:
Timestamp:
Jul 22, 2015, 4:23:02 PM (11 years ago)
Author:
timothy_horton@apple.com
Message:

[iOS] Adjust the preview architecture
https://bugs.webkit.org/show_bug.cgi?id=147203
<rdar://problem/21945775>

Reviewed by Beth Dakin.

  • Platform/spi/ios/UIKitSPI.h:
  • UIProcess/API/Cocoa/WKWebView.mm:

(-[WKWebView _setAllowsLinkPreview:]): Deleted.

  • UIProcess/ios/WKContentView.mm:

(-[WKContentView willMoveToWindow:]): Deleted.

  • UIProcess/ios/WKContentViewInteraction.h:
  • UIProcess/ios/WKContentViewInteraction.mm:

(-[WKContentView setupInteraction]):
(-[WKContentView cleanupInteraction]):
(-[WKContentView _registerPreview]):
(-[WKContentView _unregisterPreview]):
(-[WKContentView _interactionShouldBeginFromPreviewItemController:forPosition:]):
(-[WKContentView _dataForPreviewItemController:atPosition:type:]):
(-[WKContentView _presentationRectForPreviewItemController:]):
(-[WKContentView _presentedViewControllerForPreviewItemController:]):
(-[WKContentView _previewItemController:commitPreview:]):
(-[WKContentView _previewItemController:willPresentPreview:forPosition:inSourceView:]):
(-[WKContentView _previewItemController:didDismissPreview:committing:]):
(-[WKContentView _presentationSnapshotForPreviewItemController:]):
(-[WKContentView _presentationRectsForPreviewItemController:]):
(-[WKContentView gestureRecognizerShouldBegin:]): Deleted.
(-[WKContentView _registerPreviewInWindow:]): Deleted.
(-[WKContentView _unregisterPreviewInWindow:]): Deleted.
(-[WKContentView previewViewControllerForPosition:inSourceView:]): Deleted.
(-[WKContentView commitPreviewViewController:]): Deleted.
(-[WKContentView willPresentPreviewViewController:forPosition:inSourceView:]): Deleted.
(-[WKContentView didDismissPreviewViewController:committing:]): Deleted.
Register and unregister in setup/cleanupInteraction instead of when moving between windows.
Implement 'shouldBegin' instead of interacting directly with the recognizer.
Make use of system enums instead of our own.
Let UIPreviewItemController handle shrink-wrapping and the indicator view.

Location:
trunk/Source/WebKit2
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebKit2/ChangeLog

    r187191 r187193  
     12015-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
    1412015-07-22  Gyuyoung Kim  <gyuyoung.kim@webkit.org>
    242
  • trunk/Source/WebKit2/Platform/spi/ios/UIKitSPI.h

    r186648 r187193  
    4949#import <UIKit/UIPickerView_Private.h>
    5050#import <UIKit/UIPresentationController_Private.h>
     51#import <UIKit/UIPreviewItemController.h>
    5152#import <UIKit/UIResponder_Private.h>
    5253#import <UIKit/UIScrollView_Private.h>
  • trunk/Source/WebKit2/UIProcess/API/Cocoa/WKWebView.mm

    r187131 r187193  
    29992999
    30003000    _allowsLinkPreview = allowsLinkPreview;
    3001 #if HAVE(LINK_PREVIEW)
    3002     if (_allowsLinkPreview)
    3003         [_contentView _registerPreviewInWindow:[_contentView window]];
    3004     else
    3005         [_contentView _unregisterPreviewInWindow:[_contentView window]];
    3006 #endif
    30073001}
    30083002
  • trunk/Source/WebKit2/UIProcess/ios/WKContentView.mm

    r186712 r187193  
    269269    if (window) {
    270270        [defaultCenter removeObserver:self name:UIWindowDidMoveToScreenNotification object:window];
    271 #if HAVE(LINK_PREVIEW)
    272         if (_webView._allowsLinkPreview)
    273             [self _unregisterPreviewInWindow:window];
    274 #endif
    275271
    276272        if (!newWindow) {
     
    282278    if (newWindow) {
    283279        [defaultCenter addObserver:self selector:@selector(_windowDidMoveToScreenNotification:) name:UIWindowDidMoveToScreenNotification object:newWindow];
    284 #if HAVE(LINK_PREVIEW)
    285         if (_webView._allowsLinkPreview)
    286             [self _registerPreviewInWindow:newWindow];
    287 #endif
    288280
    289281        [self _updateForScreen:newWindow.screen];
  • trunk/Source/WebKit2/UIProcess/ios/WKContentViewInteraction.h

    r186916 r187193  
    9595};
    9696
    97 enum class PreviewElementType {
    98     None = 0,
    99     Link,
    100     Image
    101 };
    102 
    10397}
    10498
     
    128122    RetainPtr<WKFileUploadPanel> _fileUploadPanel;
    129123    RetainPtr<UIGestureRecognizer> _previewGestureRecognizer;
    130     WebKit::PreviewElementType _previewType;
     124    RetainPtr<UIPreviewItemController> _previewItemController;
    131125
    132126    std::unique_ptr<WebKit::SmartMagnificationController> _smartMagnificationController;
     
    153147
    154148    WebKit::WKSelectionDrawingInfo _lastSelectionDrawingInfo;
    155 #if HAVE(LINK_PREVIEW)
    156     id <UIViewControllerPreviewing> _previewing;
    157 #endif
    158 
    159     RetainPtr<UIImageView> _previewIndicatorView;
    160149
    161150    BOOL _isEditable;
     
    219208
    220209#if HAVE(LINK_PREVIEW)
    221 @interface WKContentView (WKInteractionPreview) <UIViewControllerPreviewingDelegate>
    222 
    223 - (void)_registerPreviewInWindow:(UIWindow *)window;
    224 - (void)_unregisterPreviewInWindow:(UIWindow *)window;
     210@interface WKContentView (WKInteractionPreview) <UIPreviewItemDelegate>
     211
     212- (void)_registerPreview;
     213- (void)_unregisterPreview;
    225214@end
    226215#endif
  • trunk/Source/WebKit2/UIProcess/ios/WKContentViewInteraction.mm

    r187173 r187193  
    342342    [self addGestureRecognizer:_longPressGestureRecognizer.get()];
    343343
     344    [self _registerPreview];
     345
    344346    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(_resetShowingTextStyle:) name:UIMenuControllerDidHideMenuNotification object:nil];
    345347    _showingTextStyleOptions = NO;
     
    397399    }
    398400
     401    [self _unregisterPreview];
    399402    if (_fileUploadPanel) {
    400403        [_fileUploadPanel setDelegate:nil];
     
    964967            return [self _actionForLongPress] != nil;
    965968        }
    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;
    976969    }
    977970
     
    32043197@implementation WKContentView (WKInteractionPreview)
    32053198
    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];
    32193209    _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;
    32313240    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    }
    32323248
    32333249    if (!canShowLinkPreview && !canShowImagePreview)
     
    32353251
    32363252    String absoluteLinkURL = _positionInformation.url;
    3237     if (absoluteLinkURL.isEmpty() || !WebCore::protocolIsInHTTPFamily(absoluteLinkURL)) {
     3253    if (!useImageURLForLink && (absoluteLinkURL.isEmpty() || !WebCore::protocolIsInHTTPFamily(absoluteLinkURL))) {
    32383254        if (canShowLinkPreview && !canShowImagePreview)
    32393255            return nil;
     
    32413257    }
    32423258
     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{
    32433282    id <WKUIDelegatePrivate> uiDelegate = static_cast<id <WKUIDelegatePrivate>>([_webView UIDelegate]);
    32443283
    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
    32483300        RetainPtr<_WKActivatedElementInfo> elementInfo = adoptNS([[_WKActivatedElementInfo alloc] _initWithType:_WKActivatedElementTypeLink URL:targetURL location:_positionInformation.point title:_positionInformation.title rect:_positionInformation.bounds image:_positionInformation.image.get()]);
     3301
    32493302        RetainPtr<NSArray> actions = [_actionSheetAssistant defaultActionsForLinkSheet:elementInfo.get()];
    32503303        if ([uiDelegate respondsToSelector:@selector(_webView:previewViewControllerForURL:defaultActions:elementInfo:)]) {
     
    32583311            return [uiDelegate _webView:_webView previewViewControllerForURL:targetURL];
    32593312        }
    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 #else
    32693313        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)
    32753318            return nil;
    32763319
    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];
    32823320        RetainPtr<_WKActivatedElementInfo> elementInfo = adoptNS([[_WKActivatedElementInfo alloc] _initWithType:_WKActivatedElementTypeImage URL:targetURL location:_positionInformation.point title:_positionInformation.title rect:_positionInformation.bounds image:_positionInformation.image.get()]);
    32833321        _page->startInteractionWithElementAtPosition(_positionInformation.point);
    32843322
    3285         // Treat animated images like a link preview
    3286         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;
    32963323        if ([uiDelegate respondsToSelector:@selector(_webView:willPreviewImageWithURL:)])
    32973324            [uiDelegate _webView:_webView willPreviewImageWithURL:targetURL];
     
    33023329}
    33033330
    3304 - (void)commitPreviewViewController:(UIViewController *)viewController
     3331- (void)_previewItemController:(UIPreviewItemController *)controller commitPreview:(UIViewController *)viewController
    33053332{
    33063333    id <WKUIDelegatePrivate> uiDelegate = static_cast<id <WKUIDelegatePrivate>>([_webView UIDelegate]);
    3307     if (_previewType == PreviewElementType::Image) {
     3334    if ([_previewItemController type] == UIPreviewItemTypeImage) {
    33083335        if ([uiDelegate respondsToSelector:@selector(_webView:commitPreviewedImageWithURL:)]) {
    33093336            String absoluteImageURL = _positionInformation.imageURL;
     
    33213348    }
    33223349
    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
    33393353{
    33403354    [self _removeDefaultGestureRecognizers];
    33413355
    33423356    [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
    33753360{
    33763361    [self _addDefaultGestureRecognizers];
     
    33803365    if ([uiDelegate respondsToSelector:@selector(_webView:didDismissPreviewViewController:)])
    33813366        [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();
    33853395}
    33863396
Note: See TracChangeset for help on using the changeset viewer.