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

Changeset 244368 in webkit


Ignore:
Timestamp:
Apr 16, 2019, 6:41:00 PM (7 years ago)
Author:
Megan Gardner
Message:

Allow sharing from imageSheet on an image document
https://bugs.webkit.org/show_bug.cgi?id=196891
<rdar://problem/25377386>

Reviewed by Tim Horton.

Source/WebKit:

Allow sharing from an image sheet generated from an image document
by storing the image URL and using it as a fallback for the URL.
Store it as an image on WKElementAction to not accidentally trigger
any actions that should actually be associated with pure URLs.

  • UIProcess/API/Cocoa/_WKActivatedElementInfo.h:
  • UIProcess/API/Cocoa/_WKActivatedElementInfo.mm:

(-[_WKActivatedElementInfo _initWithInteractionInformationAtPosition:]):
(-[_WKActivatedElementInfo _initWithType:URL:imageURL:location:title:ID:rect:image:]):
(-[_WKActivatedElementInfo _initWithType:URL:imageURL:location:title:ID:rect:image:userInfo:]):
(-[_WKActivatedElementInfo imageURL]):
(-[_WKActivatedElementInfo _initWithType:URL:location:title:ID:rect:image:]): Deleted.
(-[_WKActivatedElementInfo _initWithType:URL:location:title:ID:rect:image:userInfo:]): Deleted.

  • UIProcess/API/Cocoa/_WKActivatedElementInfoInternal.h:
  • UIProcess/API/Cocoa/_WKElementAction.mm:

(+[_WKElementAction _elementActionWithType:customTitle:assistant:]):

  • UIProcess/ios/WKActionSheetAssistant.mm:

(-[WKActionSheetAssistant showImageSheet]):
(-[WKActionSheetAssistant defaultActionsForImageSheet:]):
(-[WKActionSheetAssistant showLinkSheet]):

  • UIProcess/ios/WKContentViewInteraction.mm:

(-[WKContentView _showAttachmentSheet]):
(-[WKContentView _dataForPreviewItemController:atPosition:type:]):
(-[WKContentView _presentedViewControllerForPreviewItemController:]):

Tools:

Test to make sure that the correct imageURL is extracted from an image element.

  • TestWebKitAPI/Tests/WebKitCocoa/WKRequestActivatedElementInfo.mm:

(TestWebKitAPI::TEST):

Location:
trunk
Files:
9 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebKit/ChangeLog

    r244367 r244368  
     12019-04-16  Megan Gardner  <megan_gardner@apple.com>
     2
     3        Allow sharing from imageSheet on an image document
     4        https://bugs.webkit.org/show_bug.cgi?id=196891
     5        <rdar://problem/25377386>
     6
     7        Reviewed by Tim Horton.
     8
     9        Allow sharing from an image sheet generated from an image document
     10        by storing the image URL and using it as a fallback for the URL.
     11        Store it as an image on WKElementAction to not accidentally trigger
     12        any actions that should actually be associated with pure URLs.
     13
     14        * UIProcess/API/Cocoa/_WKActivatedElementInfo.h:
     15        * UIProcess/API/Cocoa/_WKActivatedElementInfo.mm:
     16        (-[_WKActivatedElementInfo _initWithInteractionInformationAtPosition:]):
     17        (-[_WKActivatedElementInfo _initWithType:URL:imageURL:location:title:ID:rect:image:]):
     18        (-[_WKActivatedElementInfo _initWithType:URL:imageURL:location:title:ID:rect:image:userInfo:]):
     19        (-[_WKActivatedElementInfo imageURL]):
     20        (-[_WKActivatedElementInfo _initWithType:URL:location:title:ID:rect:image:]): Deleted.
     21        (-[_WKActivatedElementInfo _initWithType:URL:location:title:ID:rect:image:userInfo:]): Deleted.
     22        * UIProcess/API/Cocoa/_WKActivatedElementInfoInternal.h:
     23        * UIProcess/API/Cocoa/_WKElementAction.mm:
     24        (+[_WKElementAction _elementActionWithType:customTitle:assistant:]):
     25        * UIProcess/ios/WKActionSheetAssistant.mm:
     26        (-[WKActionSheetAssistant showImageSheet]):
     27        (-[WKActionSheetAssistant defaultActionsForImageSheet:]):
     28        (-[WKActionSheetAssistant showLinkSheet]):
     29        * UIProcess/ios/WKContentViewInteraction.mm:
     30        (-[WKContentView _showAttachmentSheet]):
     31        (-[WKContentView _dataForPreviewItemController:atPosition:type:]):
     32        (-[WKContentView _presentedViewControllerForPreviewItemController:]):
     33
    1342019-04-16  Wenson Hsieh  <wenson_hsieh@apple.com>
    235
  • trunk/Source/WebKit/UIProcess/API/Cocoa/_WKActivatedElementInfo.h

    r243376 r244368  
    4343
    4444@property (nonatomic, readonly) NSURL *URL;
     45@property (nonatomic, readonly) NSURL *imageURL;
    4546@property (nonatomic, readonly) NSString *title;
    4647@property (nonatomic, readonly) _WKActivatedElementType type;
  • trunk/Source/WebKit/UIProcess/API/Cocoa/_WKActivatedElementInfo.mm

    r242339 r244368  
    4040@implementation _WKActivatedElementInfo  {
    4141    RetainPtr<NSURL> _URL;
     42    RetainPtr<NSURL> _imageURL;
    4243    RetainPtr<NSString> _title;
    4344    CGPoint _interactionLocation;
     
    6566   
    6667    _URL = information.url;
     68    _imageURL = information.imageURL;
    6769    _interactionLocation = information.request.point;
    6870    _title = information.title;
     
    8587#endif
    8688
    87 - (instancetype)_initWithType:(_WKActivatedElementType)type URL:(NSURL *)url location:(CGPoint)location title:(NSString *)title ID:(NSString *)ID rect:(CGRect)rect image:(WebKit::ShareableBitmap*)image
     89- (instancetype)_initWithType:(_WKActivatedElementType)type URL:(NSURL *)url imageURL:(NSURL *)imageURL location:(CGPoint)location title:(NSString *)title ID:(NSString *)ID rect:(CGRect)rect image:(WebKit::ShareableBitmap*)image
    8890{
    89     return [self _initWithType:type URL:url location:location title:title ID:ID rect:rect image:image userInfo:nil];
     91    return [self _initWithType:type URL:url imageURL:imageURL location:location title:title ID:ID rect:rect image:image userInfo:nil];
    9092}
    9193
    92 - (instancetype)_initWithType:(_WKActivatedElementType)type URL:(NSURL *)url location:(CGPoint)location title:(NSString *)title ID:(NSString *)ID rect:(CGRect)rect image:(WebKit::ShareableBitmap*)image userInfo:(NSDictionary *)userInfo
     94- (instancetype)_initWithType:(_WKActivatedElementType)type URL:(NSURL *)url imageURL:(NSURL *)imageURL location:(CGPoint)location title:(NSString *)title ID:(NSString *)ID rect:(CGRect)rect image:(WebKit::ShareableBitmap*)image userInfo:(NSDictionary *)userInfo
    9395{
    9496    if (!(self = [super init]))
     
    9698
    9799    _URL = adoptNS([url copy]);
     100    _imageURL = adoptNS([imageURL copy]);
    98101    _interactionLocation = location;
    99102    _title = adoptNS([title copy]);
     
    112115{
    113116    return _URL.get();
     117}
     118
     119- (NSURL *)imageURL
     120{
     121    return _imageURL.get();
    114122}
    115123
  • trunk/Source/WebKit/UIProcess/API/Cocoa/_WKActivatedElementInfoInternal.h

    r242339 r244368  
    3939- (instancetype)_initWithInteractionInformationAtPosition:(const WebKit::InteractionInformationAtPosition&)information;
    4040#endif
    41 - (instancetype)_initWithType:(_WKActivatedElementType)type URL:(NSURL *)url location:(CGPoint)location title:(NSString *)title ID:(NSString *)ID rect:(CGRect)rect image:(WebKit::ShareableBitmap*)image;
    42 - (instancetype)_initWithType:(_WKActivatedElementType)type URL:(NSURL *)url location:(CGPoint)location title:(NSString *)title ID:(NSString *)ID rect:(CGRect)rect image:(WebKit::ShareableBitmap*)image userInfo:(NSDictionary *)userInfo;
     41- (instancetype)_initWithType:(_WKActivatedElementType)type URL:(NSURL *)url imageURL:(NSURL *)imageURL location:(CGPoint)location title:(NSString *)title ID:(NSString *)ID rect:(CGRect)rect image:(WebKit::ShareableBitmap*)image;
     42- (instancetype)_initWithType:(_WKActivatedElementType)type URL:(NSURL *)url imageURL:(NSURL *)imageURL location:(CGPoint)location title:(NSString *)title ID:(NSString *)ID rect:(CGRect)rect image:(WebKit::ShareableBitmap*)image userInfo:(NSDictionary *)userInfo;
    4343
    4444@property (nonatomic, readonly) CGPoint _interactionLocation;
  • trunk/Source/WebKit/UIProcess/API/Cocoa/_WKElementAction.mm

    r244205 r244368  
    130130        title = WEB_UI_STRING("Share…", "Title for Share action button");
    131131        handler = ^(WKActionSheetAssistant *assistant, _WKActivatedElementInfo *actionInfo) {
    132             [assistant.delegate actionSheetAssistant:assistant shareElementWithURL:actionInfo.URL rect:actionInfo.boundingRect];
     132            [assistant.delegate actionSheetAssistant:assistant shareElementWithURL:actionInfo.URL ?: actionInfo.imageURL rect:actionInfo.boundingRect];
    133133        };
    134134        break;
  • trunk/Source/WebKit/UIProcess/ios/WKActionSheetAssistant.mm

    r243618 r244368  
    393393    void (^showImageSheetWithAlternateURLBlock)(NSURL*, NSDictionary *userInfo) = ^(NSURL *alternateURL, NSDictionary *userInfo) {
    394394        NSURL *targetURL = _positionInformation->url;
     395        NSURL *imageURL = _positionInformation->imageURL;
    395396        if (!targetURL)
    396397            targetURL = alternateURL;
    397398        auto elementBounds = _positionInformation->bounds;
    398         auto elementInfo = adoptNS([[_WKActivatedElementInfo alloc] _initWithType:_WKActivatedElementTypeImage URL:targetURL location:_positionInformation->request.point title:_positionInformation->title ID:_positionInformation->idAttribute rect:elementBounds image:_positionInformation->image.get() userInfo:userInfo]);
     399        auto elementInfo = adoptNS([[_WKActivatedElementInfo alloc] _initWithType:_WKActivatedElementTypeImage URL:targetURL imageURL:imageURL location:_positionInformation->request.point title:_positionInformation->title ID:_positionInformation->idAttribute rect:elementBounds image:_positionInformation->image.get() userInfo:userInfo]);
    399400        if ([delegate respondsToSelector:@selector(actionSheetAssistant:showCustomSheetForElement:)] && [delegate actionSheetAssistant:self showCustomSheetForElement:elementInfo.get()])
    400401            return;
     
    537538        [self _appendOpenActionsForURL:targetURL actions:defaultActions.get() elementInfo:elementInfo];
    538539        [defaultActions addObject:[_WKElementAction _elementActionWithType:_WKElementActionTypeShare assistant:self]];
    539     }
     540    } else if ([elementInfo imageURL])
     541        [defaultActions addObject:[_WKElementAction _elementActionWithType:_WKElementActionTypeShare assistant:self]];
    540542
    541543#if HAVE(SAFARI_SERVICES_FRAMEWORK)
     
    572574    }
    573575
    574     auto elementInfo = adoptNS([[_WKActivatedElementInfo alloc] _initWithType:_WKActivatedElementTypeLink URL:targetURL location:_positionInformation->request.point title:_positionInformation->title ID:_positionInformation->idAttribute rect:_positionInformation->bounds image:_positionInformation->image.get()]);
     576    auto elementInfo = adoptNS([[_WKActivatedElementInfo alloc] _initWithType:_WKActivatedElementTypeLink URL:targetURL imageURL:(NSURL*)_positionInformation->imageURL location:_positionInformation->request.point title:_positionInformation->title ID:_positionInformation->idAttribute rect:_positionInformation->bounds image:_positionInformation->image.get()]);
    575577    if ([_delegate respondsToSelector:@selector(actionSheetAssistant:showCustomSheetForElement:)] && [_delegate actionSheetAssistant:self showCustomSheetForElement:elementInfo.get()]) {
    576578        _needsLinkIndicator = NO;
  • trunk/Source/WebKit/UIProcess/ios/WKContentViewInteraction.mm

    r244302 r244368  
    18001800        return;
    18011801
    1802     auto element = adoptNS([[_WKActivatedElementInfo alloc] _initWithType:_WKActivatedElementTypeAttachment URL:(NSURL *)_positionInformation.url location:_positionInformation.request.point title:_positionInformation.title ID:_positionInformation.idAttribute rect:_positionInformation.bounds image:nil]);
     1802    auto element = adoptNS([[_WKActivatedElementInfo alloc] _initWithType:_WKActivatedElementTypeAttachment URL:(NSURL *)_positionInformation.url imageURL:(NSURL *)_positionInformation.imageURL location:_positionInformation.request.point title:_positionInformation.title ID:_positionInformation.idAttribute rect:_positionInformation.bounds image:nil]);
    18031803    [uiDelegate _webView:_webView showCustomSheetForElement:element.get()];
    18041804}
     
    72727272    } else if (canShowAttachmentPreview) {
    72737273        *type = UIPreviewItemTypeAttachment;
    7274         auto element = adoptNS([[_WKActivatedElementInfo alloc] _initWithType:_WKActivatedElementTypeAttachment URL:(NSURL *)linkURL location:_positionInformation.request.point title:_positionInformation.title ID:_positionInformation.idAttribute rect:_positionInformation.bounds image:nil]);
     7274        auto element = adoptNS([[_WKActivatedElementInfo alloc] _initWithType:_WKActivatedElementTypeAttachment URL:(NSURL *)linkURL imageURL:(NSURL *)_positionInformation.imageURL location:_positionInformation.request.point title:_positionInformation.title ID:_positionInformation.idAttribute rect:_positionInformation.bounds image:nil]);
    72757275        NSUInteger index = [uiDelegate _webView:_webView indexIntoAttachmentListForElement:element.get()];
    72767276        if (index != NSNotFound) {
     
    73347334        // Treat animated images like a link preview
    73357335        if (isValidURLForImagePreview && _positionInformation.isAnimatedImage) {
    7336             RetainPtr<_WKActivatedElementInfo> animatedImageElementInfo = adoptNS([[_WKActivatedElementInfo alloc] _initWithType:_WKActivatedElementTypeImage URL:targetURL location:_positionInformation.request.point title:_positionInformation.title ID:_positionInformation.idAttribute rect:_positionInformation.bounds image:_positionInformation.image.get()]);
     7336            RetainPtr<_WKActivatedElementInfo> animatedImageElementInfo = adoptNS([[_WKActivatedElementInfo alloc] _initWithType:_WKActivatedElementTypeImage URL:targetURL imageURL:nil location:_positionInformation.request.point title:_positionInformation.title ID:_positionInformation.idAttribute rect:_positionInformation.bounds image:_positionInformation.image.get()]);
    73377337
    73387338            if ([uiDelegate respondsToSelector:@selector(_webView:previewViewControllerForAnimatedImageAtURL:defaultActions:elementInfo:imageSize:)]) {
     
    73427342        }
    73437343
    7344         RetainPtr<_WKActivatedElementInfo> elementInfo = adoptNS([[_WKActivatedElementInfo alloc] _initWithType:_WKActivatedElementTypeLink URL:targetURL location:_positionInformation.request.point title:_positionInformation.title ID:_positionInformation.idAttribute rect:_positionInformation.bounds image:_positionInformation.image.get()]);
     7344        RetainPtr<_WKActivatedElementInfo> elementInfo = adoptNS([[_WKActivatedElementInfo alloc] _initWithType:_WKActivatedElementTypeLink URL:targetURL imageURL:nil location:_positionInformation.request.point title:_positionInformation.title ID:_positionInformation.idAttribute rect:_positionInformation.bounds image:_positionInformation.image.get()]);
    73457345
    73467346        auto actions = [_actionSheetAssistant defaultActionsForLinkSheet:elementInfo.get()];
     
    73807380        }
    73817381
    7382         RetainPtr<_WKActivatedElementInfo> elementInfo = adoptNS([[_WKActivatedElementInfo alloc] _initWithType:_WKActivatedElementTypeImage URL:alternateURL.get() location:_positionInformation.request.point title:_positionInformation.title ID:_positionInformation.idAttribute rect:_positionInformation.bounds image:_positionInformation.image.get() userInfo:imageInfo.get()]);
     7382        RetainPtr<_WKActivatedElementInfo> elementInfo = adoptNS([[_WKActivatedElementInfo alloc] _initWithType:_WKActivatedElementTypeImage URL:alternateURL.get() imageURL:nil location:_positionInformation.request.point title:_positionInformation.title ID:_positionInformation.idAttribute rect:_positionInformation.bounds image:_positionInformation.image.get() userInfo:imageInfo.get()]);
    73837383        _page->startInteractionWithElementAtPosition(_positionInformation.request.point);
    73847384
  • trunk/Tools/ChangeLog

    r244364 r244368  
     12019-04-16  Megan Gardner  <megan_gardner@apple.com>
     2
     3        Allow sharing from imageSheet on an image document
     4        https://bugs.webkit.org/show_bug.cgi?id=196891
     5        <rdar://problem/25377386>
     6
     7        Reviewed by Tim Horton.
     8
     9        Test to make sure that the correct imageURL is extracted from an image element.
     10
     11        * TestWebKitAPI/Tests/WebKitCocoa/WKRequestActivatedElementInfo.mm:
     12        (TestWebKitAPI::TEST):
     13
    1142019-04-16  Alex Christensen  <achristensen@webkit.org>
    215
  • trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/WKRequestActivatedElementInfo.mm

    r242339 r244368  
    6666        EXPECT_EQ(elementInfo.image.size.width, 320);
    6767        EXPECT_EQ(elementInfo.image.size.height, 500);
     68       
     69        finished = true;
     70    }];
     71   
     72    TestWebKitAPI::Util::run(&finished);
     73}
     74   
     75TEST(WebKit, RequestActivatedElementInfoForImage)
     76{
     77    auto webView = adoptNS([[TestWKWebView alloc] initWithFrame:CGRectMake(0, 0, 215, 174)]);
     78    NSURLRequest *request = [NSURLRequest requestWithURL:[[NSBundle mainBundle] URLForResource:@"icon" withExtension:@"png" subdirectory:@"TestWebKitAPI.resources"]];
     79    [webView loadRequest:request];
     80    [webView _test_waitForDidFinishNavigation];
     81   
     82    __block bool finished = false;
     83    [webView _requestActivatedElementAtPosition:CGPointMake(50, 50) completionBlock: ^(_WKActivatedElementInfo *elementInfo) {
     84       
     85        EXPECT_TRUE(elementInfo.type == _WKActivatedElementTypeImage);
     86        EXPECT_WK_STREQ(elementInfo.imageURL.lastPathComponent, "icon.png");
     87        EXPECT_NOT_NULL(elementInfo.image);
     88        EXPECT_EQ(elementInfo.boundingRect.size.width, 215);
     89        EXPECT_EQ(elementInfo.boundingRect.size.height, 174);
     90        EXPECT_EQ(elementInfo.image.size.width, 215);
     91        EXPECT_EQ(elementInfo.image.size.height, 174);
    6892       
    6993        finished = true;
Note: See TracChangeset for help on using the changeset viewer.