Changeset 168145 in webkit


Ignore:
Timestamp:
May 1, 2014 8:31:43 PM (10 years ago)
Author:
beidson@apple.com
Message:

Update service picker API usage.
<rdar://problem/16772674> and https://bugs.webkit.org/show_bug.cgi?id=132452

Reviewed by Tim Horton.

  • Misc/WebSharingServicePickerController.h:
  • Misc/WebSharingServicePickerController.mm:

(-[WebSharingServicePickerController didShareImageData:confirmDataIsValidTIFFData:]):

Factor out a common "didShare" handler that optionally validates whether the data represents an image.

(-[WebSharingServicePickerController sharingService:didShareItems:]): Update API usage, including marshalling

on off-main thread call back to the main thread.

  • WebCoreSupport/WebContextMenuClient.mm:

(WebContextMenuClient::contextMenuForEvent): Update API usage.

Location:
trunk/Source/WebKit/mac
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebKit/mac/ChangeLog

    r168138 r168145  
     12014-05-01  Brady Eidson  <beidson@apple.com>
     2
     3        Update service picker API usage.
     4        <rdar://problem/16772674> and https://bugs.webkit.org/show_bug.cgi?id=132452
     5
     6        Reviewed by Tim Horton.
     7
     8        * Misc/WebSharingServicePickerController.h:
     9        * Misc/WebSharingServicePickerController.mm:
     10        (-[WebSharingServicePickerController didShareImageData:confirmDataIsValidTIFFData:]):
     11          Factor out a common "didShare" handler that optionally validates whether the data represents an image.
     12        (-[WebSharingServicePickerController sharingService:didShareItems:]): Update API usage, including marshalling
     13          on off-main thread call back to the main thread.
     14
     15        * WebCoreSupport/WebContextMenuClient.mm:
     16        (WebContextMenuClient::contextMenuForEvent): Update API usage.
     17
    1182014-05-01  Anders Carlsson  <andersca@apple.com>
    219
  • trunk/Source/WebKit/mac/Misc/WebSharingServicePickerController.h

    r167786 r168145  
    4040}
    4141
    42 - (instancetype)initWithImage:(NSImage *)image includeEditorServices:(BOOL)includeEditorServices menuClient:(WebContextMenuClient*)menuClient;
     42- (instancetype)initWithData:(NSData *)data includeEditorServices:(BOOL)includeEditorServices menuClient:(WebContextMenuClient*)menuClient;
    4343- (NSMenu *)menu;
     44- (void)didShareImageData:(NSData *)data confirmDataIsValidTIFFData:(BOOL)confirmData;
    4445
    4546@end
  • trunk/Source/WebKit/mac/Misc/WebSharingServicePickerController.mm

    r167956 r168145  
    5050- (NSMenu *)menu;
    5151@end
    52 
    5352#endif
    5453
     54#if __has_include(<AppKit/NSItemProvider.h>)
     55#import <AppKit/NSItemProvider.h>
     56#else
     57@interface NSItemProvider : NSObject
     58@property (copy, readonly) NSArray *registeredTypeIdentifiers;
     59- (instancetype)initWithItem:(id <NSSecureCoding>)item typeIdentifier:(NSString *)typeIdentifier;
     60- (void)loadItemForTypeIdentifier:(NSString *)typeIdentifier options:(NSDictionary *)options completionHandler:(void (^)(id <NSSecureCoding> item, NSError *error))completionHandler;
     61@end
     62#endif
     63
    5564static NSString *serviceControlsPasteboardName = @"WebKitServiceControlsPasteboard";
    5665
     
    5968@implementation WebSharingServicePickerController
    6069
    61 - (instancetype)initWithImage:(NSImage *)image includeEditorServices:(BOOL)includeEditorServices menuClient:(WebContextMenuClient*)menuClient
     70- (instancetype)initWithData:(NSData *)data includeEditorServices:(BOOL)includeEditorServices menuClient:(WebContextMenuClient*)menuClient
    6271{
    6372    if (!(self = [super init]))
    6473        return nil;
    6574
    66     _picker = adoptNS([[NSSharingServicePicker alloc] initWithItems:@[ image ]]);
     75    RetainPtr<NSItemProvider> itemProvider = adoptNS([[NSItemProvider alloc] initWithItem:data typeIdentifier:@"public.data"]);
     76
     77    _picker = adoptNS([[NSSharingServicePicker alloc] initWithItems:@[ itemProvider.get() ]]);
    6778    [_picker setStyle:NSSharingServicePickerStyleRollover];
    6879    [_picker setDelegate:self];
     
    8798}
    8899
     100- (void)didShareImageData:(NSData *)data confirmDataIsValidTIFFData:(BOOL)confirmData
     101{
     102    Page* page = [_menuClient->webView() page];
     103    if (!page)
     104        return;
     105
     106    if (confirmData) {
     107        RetainPtr<NSImage> nsImage = adoptNS([[NSImage alloc] initWithData:data]);
     108        if (!nsImage) {
     109            LOG_ERROR("Shared image data cannot create a valid NSImage");
     110            return;
     111        }
     112
     113        data = [nsImage TIFFRepresentation];
     114    }
     115
     116    NSPasteboard *pasteboard = [NSPasteboard pasteboardWithName:serviceControlsPasteboardName];
     117    [pasteboard declareTypes:@[ NSPasteboardTypeTIFF ] owner:nil];
     118    [pasteboard setData:data forType:NSPasteboardTypeTIFF];
     119
     120    Frame& frame = page->focusController().focusedOrMainFrame();
     121    if (!frame.selection().isNone())
     122        frame.editor().readSelectionFromPasteboard(serviceControlsPasteboardName);
     123
     124    [self clear];
     125}
     126
    89127#pragma mark NSSharingServicePickerDelegate methods
    90 
    91128
    92129- (NSArray *)sharingServicePicker:(NSSharingServicePicker *)sharingServicePicker sharingServicesForItems:(NSArray *)items mask:(NSSharingServiceMask)mask proposedSharingServices:(NSArray *)proposedServices
     
    124161        return;
    125162
    126     RetainPtr<CGImageSourceRef> source = adoptCF(CGImageSourceCreateWithData((CFDataRef)[items objectAtIndex:0], NULL));
    127     RetainPtr<CGImageRef> cgImage = adoptCF(CGImageSourceCreateImageAtIndex(source.get(), 0, NULL));
    128 
    129     if (!cgImage)
    130         return;
    131 
    132     Page* page = [_menuClient->webView() page];
    133     if (!page)
    134         return;
    135 
    136     NSPasteboard *pasteboard = [NSPasteboard pasteboardWithName:serviceControlsPasteboardName];
    137     [pasteboard declareTypes:@[ NSPasteboardTypeTIFF ] owner:nil];
    138     [pasteboard setData:[items objectAtIndex:0] forType:NSPasteboardTypeTIFF];
    139 
    140     Frame& frame = page->focusController().focusedOrMainFrame();
    141     if (!frame.selection().isNone())
    142         frame.editor().readSelectionFromPasteboard(serviceControlsPasteboardName);
    143 
     163    id item = [items objectAtIndex:0];
     164
     165    if ([item isKindOfClass:[NSImage class]])
     166        [self didShareImageData:[item TIFFRepresentation] confirmDataIsValidTIFFData:NO];
     167    else if ([item isKindOfClass:[NSItemProvider class]]) {
     168        NSItemProvider *itemProvider = (NSItemProvider *)item;
     169        NSString *itemUTI = itemProvider.registeredTypeIdentifiers.firstObject;
     170       
     171        [itemProvider loadItemForTypeIdentifier:itemUTI options:nil completionHandler:^(id receivedData, NSError *dataError) {
     172            if (!receivedData) {
     173                LOG_ERROR("Did not receive data from NSItemProvider");
     174                return;
     175            }
     176
     177            if (![receivedData isKindOfClass:[NSData class]]) {
     178                LOG_ERROR("Data received from NSItemProvider is not of type NSData");
     179                return;
     180            }
     181
     182            [[NSOperationQueue mainQueue] addOperationWithBlock:^{
     183                [self didShareImageData:receivedData confirmDataIsValidTIFFData:YES];
     184            }];
     185
     186        }];
     187    } else
     188        LOG_ERROR("sharingService:didShareItems: - Unknown item type returned");
     189}
     190
     191- (void)sharingService:(NSSharingService *)sharingService didFailToShareItems:(NSArray *)items error:(NSError *)error
     192{
    144193    [self clear];
    145194}
    146195
    147 - (void)sharingService:(NSSharingService *)sharingService didFailToShareItems:(NSArray *)items error:(NSError *)error
    148 {
    149     [self clear];
    150 }
    151 
    152196- (NSWindow *)sharingService:(NSSharingService *)sharingService sourceWindowForShareItems:(NSArray *)items sharingContentScope:(NSSharingContentScope *)sharingContentScope
    153197{
  • trunk/Source/WebKit/mac/WebCoreSupport/WebContextMenuClient.mm

    r168047 r168145  
    5151#import <WebCore/LocalizedStrings.h>
    5252#import <WebCore/Page.h>
     53#import <WebCore/SharedBuffer.h>
    5354#import <WebCore/Frame.h>
    5455#import <WebCore/FrameView.h>
     
    364365    if (Image* image = page->contextMenuController().context().controlledImage()) {
    365366        ASSERT(page->contextMenuController().context().hitTestResult().innerNode());
     367
     368        RefPtr<SharedBuffer> data = image->data();
     369        ASSERT(data);
     370        RetainPtr<CFDataRef> cfData = data->createCFData();
     371
    366372        bool isContentEditable = page->contextMenuController().context().hitTestResult().innerNode()->isContentEditable();
    367         m_sharingServicePickerController = adoptNS([[WebSharingServicePickerController alloc] initWithImage:image->getNSImage() includeEditorServices:isContentEditable menuClient:this]);
     373        m_sharingServicePickerController = adoptNS([[WebSharingServicePickerController alloc] initWithData:(NSData *)cfData.get() includeEditorServices:isContentEditable menuClient:this]);
    368374       
    369375        return [m_sharingServicePickerController menu];
Note: See TracChangeset for help on using the changeset viewer.