Changeset 191699 in webkit


Ignore:
Timestamp:
Oct 28, 2015 3:53:29 PM (8 years ago)
Author:
andersca@apple.com
Message:

WebKit, not WebCore, should do context menu conversion
https://bugs.webkit.org/show_bug.cgi?id=150640

Reviewed by Tim Horton.

  • WebView/WebHTMLView.mm:

(createShareMenuItem):
(createMenuItem):
(createMenuItems):
(customMenuFromDefaultItems):

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

Legend:

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

    r191591 r191699  
     12015-10-28  Anders Carlsson  <andersca@apple.com>
     2
     3        WebKit, not WebCore, should do context menu conversion
     4        https://bugs.webkit.org/show_bug.cgi?id=150640
     5
     6        Reviewed by Tim Horton.
     7
     8        * WebView/WebHTMLView.mm:
     9        (createShareMenuItem):
     10        (createMenuItem):
     11        (createMenuItems):
     12        (customMenuFromDefaultItems):
     13
    1142015-10-26  Anders Carlsson  <andersca@apple.com>
    215
  • trunk/Source/WebKit/mac/WebView/WebHTMLView.mm

    r191520 r191699  
    35293529}
    35303530
     3531static RetainPtr<NSMenuItem> createShareMenuItem(const HitTestResult& hitTestResult)
     3532{
     3533    if (![[NSMenuItem class] respondsToSelector:@selector(standardShareMenuItemWithItems:)])
     3534        return nil;
     3535
     3536    auto items = adoptNS([[NSMutableArray alloc] init]);
     3537
     3538    if (!hitTestResult.absoluteLinkURL().isEmpty()) {
     3539        NSURL *absoluteLinkURL = hitTestResult.absoluteLinkURL();
     3540        [items addObject:absoluteLinkURL];
     3541    }
     3542
     3543    if (!hitTestResult.absoluteMediaURL().isEmpty() && hitTestResult.isDownloadableMedia()) {
     3544        NSURL *downloadableMediaURL = hitTestResult.absoluteMediaURL();
     3545        [items addObject:downloadableMediaURL];
     3546    }
     3547
     3548    if (Image* image = hitTestResult.image()) {
     3549        if (RefPtr<SharedBuffer> buffer = image->data())
     3550            [items addObject:adoptNS([[NSImage alloc] initWithData:[NSData dataWithBytes:buffer->data() length:buffer->size()]]).get()];
     3551    }
     3552
     3553    if (!hitTestResult.selectedText().isEmpty()) {
     3554        NSString *selectedText = hitTestResult.selectedText();
     3555        [items addObject:selectedText];
     3556    }
     3557
     3558    if (![items count])
     3559        return nil;
     3560
     3561    return [NSMenuItem standardShareMenuItemWithItems:items.get()];
     3562}
     3563
     3564static RetainPtr<NSMutableArray> createMenuItems(const HitTestResult&, const Vector<ContextMenuItem>&);
     3565
     3566static RetainPtr<NSMenuItem> createMenuItem(const HitTestResult& hitTestResult, const ContextMenuItem& item)
     3567{
     3568    if (item.action() == ContextMenuItemTagShareMenu)
     3569        return createShareMenuItem(hitTestResult);
     3570
     3571    switch (item.type()) {
     3572    case WebCore::ActionType:
     3573    case WebCore::CheckableActionType: {
     3574        auto menuItem = adoptNS([[NSMenuItem alloc] initWithTitle:item.title() action:@selector(forwardContextMenuAction:) keyEquivalent:@""]);
     3575
     3576        [menuItem setTag:item.action()];
     3577        [menuItem setEnabled:item.enabled()];
     3578        [menuItem setState:item.checked() ? NSOnState : NSOffState];
     3579        [menuItem setTarget:[WebMenuTarget sharedMenuTarget]];
     3580
     3581        return menuItem;
     3582    }
     3583
     3584    case SeparatorType:
     3585        return [NSMenuItem separatorItem];
     3586
     3587    case SubmenuType: {
     3588        auto menu = adoptNS([[NSMenu alloc] init]);
     3589
     3590        auto submenuItems = createMenuItems(hitTestResult, contextMenuItemVector(item.platformSubMenu()));
     3591        for (NSMenuItem *menuItem in submenuItems.get())
     3592            [menu addItem:menuItem];
     3593
     3594        auto menuItem = adoptNS([[NSMenuItem alloc] initWithTitle:item.title() action:nullptr keyEquivalent:@""]);
     3595        [menuItem setEnabled:item.enabled()];
     3596        [menuItem setSubmenu:menu.get()];
     3597
     3598        return menuItem;
     3599    }
     3600    }
     3601}
     3602
     3603static RetainPtr<NSMutableArray> createMenuItems(const HitTestResult& hitTestResult, const Vector<ContextMenuItem>& items)
     3604{
     3605    auto menuItems = adoptNS([[NSMutableArray alloc] init]);
     3606
     3607    for (auto& item : items) {
     3608        if (auto menuItem = createMenuItem(hitTestResult, item))
     3609            [menuItems addObject:menuItem.get()];
     3610    }
     3611
     3612    return menuItems;
     3613}
     3614
    35313615static RetainPtr<NSArray> customMenuFromDefaultItems(WebView *webView, const ContextMenu& defaultMenu)
    35323616{
     3617    const auto& hitTestResult = webView.page->contextMenuController().hitTestResult();
     3618    auto defaultMenuItems = createMenuItems(hitTestResult, contextMenuItemVector(defaultMenu.platformDescription()));
     3619
    35333620    id delegate = [webView UIDelegate];
    35343621    SEL selector = @selector(webView:contextMenuItemsForElement:defaultMenuItems:);
    35353622    if (![delegate respondsToSelector:selector])
    3536         return defaultMenu.platformDescription();
    3537 
    3538     auto element = adoptNS([[WebElementDictionary alloc] initWithHitTestResult:[webView page]->contextMenuController().hitTestResult()]);
     3623        return defaultMenuItems;
     3624
     3625    auto element = adoptNS([[WebElementDictionary alloc] initWithHitTestResult:hitTestResult]);
    35393626
    35403627    BOOL preVersion3Client = isPreVersion3Client();
     
    35423629        DOMNode *node = [element objectForKey:WebElementDOMNodeKey];
    35433630        if ([node isKindOfClass:[DOMHTMLInputElement class]] && [(DOMHTMLInputElement *)node _isTextField])
    3544             return defaultMenu.platformDescription();
     3631            return defaultMenuItems;
    35453632        if ([node isKindOfClass:[DOMHTMLTextAreaElement class]])
    3546             return defaultMenu.platformDescription();
    3547     }
    3548 
    3549     NSMutableArray *defaultMenuItems = defaultMenu.platformDescription();
    3550 
    3551     for (NSMenuItem *menuItem in defaultMenuItems) {
     3633            return defaultMenuItems;
     3634    }
     3635
     3636    for (NSMenuItem *menuItem in defaultMenuItems.get()) {
    35523637        if (!menuItem.representedObject)
    35533638            menuItem.representedObject = element.get();
    35543639    }
    35553640
    3556     auto savedItems = fixMenusToSendToOldClients(defaultMenuItems);
    3557 
    3558     NSArray *delegateSuppliedItems = CallUIDelegate(webView, selector, element.get(), defaultMenuItems);
     3641    auto savedItems = fixMenusToSendToOldClients(defaultMenuItems.get());
     3642
     3643    NSArray *delegateSuppliedItems = CallUIDelegate(webView, selector, element.get(), defaultMenuItems.get());
    35593644
    35603645    return fixMenusReceivedFromOldClients(delegateSuppliedItems, savedItems.get()).autorelease();
Note: See TracChangeset for help on using the changeset viewer.