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

Changeset 182303 in webkit


Ignore:
Timestamp:
Apr 2, 2015, 6:16:24 PM (11 years ago)
Author:
Brent Fulgham
Message:

Source/WebCore:
Unreviewed: Reapplied Change after rollout.

Expose the "Share" menu for text selections on platforms where it's available.
rdar://problem/20034174 and https://bugs.webkit.org/show_bug.cgi?id=143318

Patch by Brady Eidson <beidson@apple.com> on 2015-04-02

  • page/ContextMenuClient.h:

(WebCore::ContextMenuClient::shareSelectedTextMenuItem):

  • page/ContextMenuContext.h:

(WebCore::ContextMenuContext::setSelectedText):
(WebCore::ContextMenuContext::selectedText):

  • page/ContextMenuController.cpp:

(WebCore::ContextMenuController::populate): Add a Share menu item returned from the client.
(WebCore::ContextMenuController::checkOrEnableIfNeeded):

  • platform/ContextMenuItem.cpp:

(WebCore::ContextMenuItem::shareSelectedTextMenuItem):

  • platform/ContextMenuItem.h:

(WebCore::ContextMenuItem::supportsShareMenu):

  • platform/gtk/ContextMenuItemGtk.cpp:

(WebCore::ContextMenuItem::shareSelectedTextMenuItem):

  • platform/mac/ContextMenuItemMac.mm:

(WebCore::ContextMenuItem::releasePlatformDescription):
(WebCore::ContextMenuItem::getPlatformDescription):
(WebCore::ContextMenuItem::supportsShareMenu):
(WebCore::ContextMenuItem::shareSelectedTextMenuItem): Use NSMenu SPI to get the Share menu.

  • platform/spi/mac/NSMenuSPI.h: Forward declare instead of #include

Source/WebKit/mac:
Unreviewed: Reland change after rollout.

Expose the "Share" menu for text selections on platforms where it's available.
rdar://problem/20034174 and https://bugs.webkit.org/show_bug.cgi?id=143318

Patch by Brady Eidson <beidson@apple.com> on 2015-04-02

  • WebView/WebImmediateActionController.mm: Update for required #include

Source/WebKit2:
Unreviewed: Re-applied change after rollout.

Expose the "Share" menu for text selections on platforms where it's available.
rdar://problem/20034174 and https://bugs.webkit.org/show_bug.cgi?id=143318

Patch by Brady Eidson <beidson@apple.com> on 2015-04-02

  • Shared/API/c/WKContextMenuItemTypes.h: Add a constant for the Share menu.
  • Shared/API/c/WKSharedAPICast.h:

(WebKit::toAPI):
(WebKit::toImpl):

  • Shared/ContextMenuContextData.cpp:

(WebKit::ContextMenuContextData::ContextMenuContextData):
(WebKit::ContextMenuContextData::encode):
(WebKit::ContextMenuContextData::decode):

  • Shared/ContextMenuContextData.h:

(WebKit::ContextMenuContextData::selectedText):

Add a "cross platform" menu item wrapper, right now only for NSMenuItem.

  • Shared/NativeContextMenuItem.h:

(WebKit::NativeContextMenuItem::~NativeContextMenuItem):
(WebKit::NativeContextMenuItem::nsMenuItem):

  • Shared/mac/NativeContextMenuItem.mm:

(WebKit::NativeContextMenuItem::NativeContextMenuItem):

Let WebContextMenuItem hold on to a NativeContextMenuItem to maintain full fidelity of the platform.

  • Shared/WebContextMenuItem.cpp:

(WebKit::WebContextMenuItem::WebContextMenuItem):

  • Shared/WebContextMenuItem.h:

(WebKit::WebContextMenuItem::create):
(WebKit::WebContextMenuItem::nativeContextMenuItem):

  • UIProcess/API/APIContextMenuClient.h:

(API::ContextMenuClient::getContextMenuFromProposedMenu):
(API::ContextMenuClient::showContextMenu):

  • UIProcess/API/C/WKPage.cpp:

(WKPageSetPageContextMenuClient):

  • UIProcess/WebContextMenuProxy.h:
  • UIProcess/WebPageProxy.cpp:

(WebKit::WebPageProxy::internalShowContextMenu): Translate the placeholder item from the web process into the

native Share menu before consulting the context menu client. Also create the API items here so the native NSMenuItem
can be attached to them.

  • UIProcess/mac/WebContextMenuProxyMac.h:
  • UIProcess/mac/WebContextMenuProxyMac.mm:

(-[WKMenuTarget forwardContextMenuAction:]):
(WebKit::nsMenuItem):
(WebKit::nsMenuItemVector):
(WebKit::WebContextMenuProxyMac::populate):
(WebKit::WebContextMenuProxyMac::showContextMenu):

  • WebKit2.xcodeproj/project.pbxproj:
  • WebProcess/WebCoreSupport/WebContextMenuClient.h:
  • WebProcess/WebCoreSupport/mac/WebContextMenuClientMac.mm:

(WebKit::WebContextMenuClient::shareSelectedTextMenuItem): In the web process, mark the Share menu's place in the

context menu with a placeholder item. It will be translated into the real Share menu in the UI process.

Location:
trunk/Source
Files:
2 added
31 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r182301 r182303  
     12015-04-02  Brady Eidson  <beidson@apple.com>
     2
     3        Unreviewed: Reapplied Change after rollout.
     4
     5        Expose the "Share" menu for text selections on platforms where it's available.
     6        rdar://problem/20034174 and https://bugs.webkit.org/show_bug.cgi?id=143318
     7
     8        * page/ContextMenuClient.h:
     9        (WebCore::ContextMenuClient::shareSelectedTextMenuItem):
     10
     11        * page/ContextMenuContext.h:
     12        (WebCore::ContextMenuContext::setSelectedText):
     13        (WebCore::ContextMenuContext::selectedText):
     14
     15        * page/ContextMenuController.cpp:
     16        (WebCore::ContextMenuController::populate): Add a Share menu item returned from the client.
     17        (WebCore::ContextMenuController::checkOrEnableIfNeeded):
     18
     19        * platform/ContextMenuItem.cpp:
     20        (WebCore::ContextMenuItem::shareSelectedTextMenuItem):
     21
     22        * platform/ContextMenuItem.h:
     23        (WebCore::ContextMenuItem::supportsShareMenu):
     24
     25        * platform/gtk/ContextMenuItemGtk.cpp:
     26        (WebCore::ContextMenuItem::shareSelectedTextMenuItem):
     27
     28        * platform/mac/ContextMenuItemMac.mm:
     29        (WebCore::ContextMenuItem::releasePlatformDescription):
     30        (WebCore::ContextMenuItem::getPlatformDescription):
     31        (WebCore::ContextMenuItem::supportsShareMenu):
     32        (WebCore::ContextMenuItem::shareSelectedTextMenuItem): Use NSMenu SPI to get the Share menu.
     33
     34        * platform/spi/mac/NSMenuSPI.h: Forward declare instead of #include
     35
    1362015-04-02  Commit Queue  <commit-queue@webkit.org>
    237
  • trunk/Source/WebCore/page/ContextMenuClient.h

    r182301 r182303  
    6161#if PLATFORM(COCOA)
    6262        virtual void searchWithSpotlight() = 0;
     63        virtual ContextMenuItem shareSelectedTextMenuItem(const String& selectedText) { return ContextMenuItem::shareSelectedTextMenuItem(selectedText); }
    6364#endif
    6465
  • trunk/Source/WebCore/page/ContextMenuContext.h

    r182301 r182303  
    4242    const HitTestResult& hitTestResult() const { return m_hitTestResult; }
    4343
     44    void setSelectedText(const String& selectedText) { m_selectedText = selectedText; }
     45    const String& selectedText() const { return m_selectedText; }
     46
    4447#if ENABLE(SERVICE_CONTROLS)
    4548    void setControlledImage(Image* controlledImage) { m_controlledImage = controlledImage; }
     
    5053
    5154    HitTestResult m_hitTestResult;
     55    String m_selectedText;
    5256
    5357#if ENABLE(SERVICE_CONTROLS)
  • trunk/Source/WebCore/page/ContextMenuController.cpp

    r182301 r182303  
    893893        if (imageURL.isEmpty() && linkURL.isEmpty() && mediaURL.isEmpty()) {
    894894            if (m_context.hitTestResult().isSelected()) {
     895                String selectedString;
    895896                if (selectionContainsPossibleWord(frame)) {
    896897#if PLATFORM(COCOA)
    897                     String selectedString = frame->displayStringModifiedByEncoding(frame->editor().selectedText());
     898                    selectedString = frame->displayStringModifiedByEncoding(frame->editor().selectedText());
    898899                    ContextMenuItem LookUpInDictionaryItem(ActionType, ContextMenuItemTagLookUpInDictionary, contextMenuItemTagLookUpInDictionary(selectedString));
    899900
     
    910911#if PLATFORM(COCOA)
    911912                appendItem(*separatorItem(), m_contextMenu.get());
     913
     914                if (!selectedString.isEmpty() && ContextMenuItem::supportsShareMenu()) {
     915                    ContextMenuItem ShareItem(m_client.shareSelectedTextMenuItem(selectedString));
     916                    appendItem(ShareItem, m_contextMenu.get());
     917                    appendItem(*separatorItem(), m_contextMenu.get());
     918
     919                    m_context.setSelectedText(selectedString);
     920                }
    912921
    913922                ContextMenuItem SpeechMenuItem(SubmenuType, ContextMenuItemTagSpeechMenu, contextMenuItemTagSpeechMenu());
     
    14011410        case ContextMenuItemBaseApplicationTag:
    14021411        case ContextMenuItemTagDictationAlternative:
     1412        case ContextMenuItemTagShareMenu:
    14031413            break;
    14041414        case ContextMenuItemTagMediaPlayPause:
  • trunk/Source/WebCore/platform/ContextMenuItem.cpp

    r182301 r182303  
    118118}
    119119
     120bool ContextMenuItem::supportsShareMenu()
     121{
     122    return false;
     123}
     124
     125ContextMenuItem ContextMenuItem::shareSelectedTextMenuItem(const String&)
     126{
     127    return ContextMenuItem(SubmenuType, ContextMenuItemTagShareMenu, emptyString());
     128}
     129
    120130} // namespace WebCore
    121131
  • trunk/Source/WebCore/platform/ContextMenuItem.h

    r182301 r182303  
    162162        ContextMenuItemTagOpenLinkInThisWindow,
    163163        ContextMenuItemTagToggleVideoFullscreen,
     164        ContextMenuItemTagShareMenu,
    164165        ContextMenuItemBaseCustomTag = 5000,
    165166        ContextMenuItemCustomTagNoAction = 5998,
     
    206207        void setSubMenu(ContextMenu*);
    207208
     209        static bool supportsShareMenu();
     210        WEBCORE_EXPORT static ContextMenuItem shareSelectedTextMenuItem(const String&);
     211
    208212#if PLATFORM(GTK)
    209213        GtkAction* gtkAction() const;
     
    229233
    230234        WEBCORE_EXPORT PlatformMenuItemDescription releasePlatformDescription();
     235        WEBCORE_EXPORT PlatformMenuItemDescription getPlatformDescription() const;
    231236
    232237        WEBCORE_EXPORT String title() const;
  • trunk/Source/WebCore/platform/gtk/ContextMenuItemGtk.cpp

    r182301 r182303  
    284284}
    285285
     286bool ContextMenuItem::supportsShareMenu()
     287{
     288    return false;
     289}
     290
     291ContextMenuItem ContextMenuItem::shareSelectedTextMenuItem(const String&)
     292{
     293    return ContextMenuItem(SubmenuType, ContextMenuItemTagShareMenu, emptyString());
     294}
     295
    286296}
    287297
  • trunk/Source/WebCore/platform/mac/ContextMenuItemMac.mm

    r182301 r182303  
    3030
    3131#include "ContextMenu.h"
     32#include "NSMenuSPI.h"
    3233
    3334namespace WebCore {
     
    9697}
    9798
    98 NSMenuItem* ContextMenuItem::releasePlatformDescription()
    99 {
    100     NSMenuItem* item = [m_platformDescription.get() retain];
     99NSMenuItem *ContextMenuItem::releasePlatformDescription()
     100{
     101    NSMenuItem *item = [m_platformDescription.get() retain];
    101102    m_platformDescription = 0;
    102103    return item;
     104}
     105
     106NSMenuItem *ContextMenuItem::getPlatformDescription() const
     107{
     108    return m_platformDescription.get();
    103109}
    104110
     
    188194}
    189195
     196bool ContextMenuItem::supportsShareMenu()
     197{
     198    static bool supportsShareMenu = [[NSMenuItem class] respondsToSelector:@selector(standardShareMenuItemWithItems:)];
     199    return supportsShareMenu;
     200}
     201
     202ContextMenuItem ContextMenuItem::shareSelectedTextMenuItem(const String& selectedText)
     203{
     204    ContextMenuItem item([NSMenuItem standardShareMenuItemWithItems:@[ (NSString *)selectedText ]]);
     205    item.setAction(ContextMenuItemTagShareMenu);
     206    return item;
     207}
     208
    190209} // namespace WebCore
    191210
  • trunk/Source/WebCore/platform/spi/mac/NSMenuSPI.h

    r182301 r182303  
    2424 */
    2525
    26 #import "QuickLookMacSPI.h"
    27 
    2826// FIXME: We should just include the appropriate internal headers.
    2927
     
    3836@end
    3937
     38@class QLPreviewMenuItem;
     39
    4040@interface NSMenuItem (Private)
    4141+ (QLPreviewMenuItem *)standardQuickLookMenuItem;
  • trunk/Source/WebKit/mac/ChangeLog

    r182301 r182303  
     12015-04-02  Brady Eidson  <beidson@apple.com>
     2
     3        Unreviewed: Reland change after rollout.
     4
     5        Expose the "Share" menu for text selections on platforms where it's available.
     6        rdar://problem/20034174 and https://bugs.webkit.org/show_bug.cgi?id=143318
     7
     8        * WebView/WebImmediateActionController.mm: Update for required #include
     9
    1102015-04-02  Commit Queue  <commit-queue@webkit.org>
    211
  • trunk/Source/WebKit/mac/WebView/WebImmediateActionController.mm

    r182301 r182303  
    5050#import <WebCore/NSMenuSPI.h>
    5151#import <WebCore/Page.h>
     52#import <WebCore/QuickLookMacSPI.h>
    5253#import <WebCore/RenderElement.h>
    5354#import <WebCore/RenderObject.h>
  • trunk/Source/WebKit2/ChangeLog

    r182301 r182303  
     12015-04-02  Brady Eidson  <beidson@apple.com>
     2
     3        Unreviewed: Re-applied change after rollout.
     4
     5        Expose the "Share" menu for text selections on platforms where it's available.
     6        rdar://problem/20034174 and https://bugs.webkit.org/show_bug.cgi?id=143318
     7
     8        * Shared/API/c/WKContextMenuItemTypes.h: Add a constant for the Share menu.
     9        * Shared/API/c/WKSharedAPICast.h:
     10        (WebKit::toAPI):
     11        (WebKit::toImpl):
     12
     13        * Shared/ContextMenuContextData.cpp:
     14        (WebKit::ContextMenuContextData::ContextMenuContextData):
     15        (WebKit::ContextMenuContextData::encode):
     16        (WebKit::ContextMenuContextData::decode):
     17        * Shared/ContextMenuContextData.h:
     18        (WebKit::ContextMenuContextData::selectedText):
     19
     20        Add a "cross platform" menu item wrapper, right now only for NSMenuItem.
     21        * Shared/NativeContextMenuItem.h:
     22        (WebKit::NativeContextMenuItem::~NativeContextMenuItem):
     23        (WebKit::NativeContextMenuItem::nsMenuItem):
     24        * Shared/mac/NativeContextMenuItem.mm:
     25        (WebKit::NativeContextMenuItem::NativeContextMenuItem):
     26
     27        Let WebContextMenuItem hold on to a NativeContextMenuItem to maintain full fidelity of the platform.
     28        * Shared/WebContextMenuItem.cpp:
     29        (WebKit::WebContextMenuItem::WebContextMenuItem):
     30        * Shared/WebContextMenuItem.h:
     31        (WebKit::WebContextMenuItem::create):
     32        (WebKit::WebContextMenuItem::nativeContextMenuItem):
     33
     34        * UIProcess/API/APIContextMenuClient.h:
     35        (API::ContextMenuClient::getContextMenuFromProposedMenu):
     36        (API::ContextMenuClient::showContextMenu):
     37
     38        * UIProcess/API/C/WKPage.cpp:
     39        (WKPageSetPageContextMenuClient):
     40
     41        * UIProcess/WebContextMenuProxy.h:
     42
     43        * UIProcess/WebPageProxy.cpp:
     44        (WebKit::WebPageProxy::internalShowContextMenu): Translate the placeholder item from the web process into the
     45          native Share menu before consulting the context menu client. Also create the API items here so the native NSMenuItem
     46          can be attached to them.
     47
     48        * UIProcess/mac/WebContextMenuProxyMac.h:
     49        * UIProcess/mac/WebContextMenuProxyMac.mm:
     50        (-[WKMenuTarget forwardContextMenuAction:]):
     51        (WebKit::nsMenuItem):
     52        (WebKit::nsMenuItemVector):
     53        (WebKit::WebContextMenuProxyMac::populate):
     54        (WebKit::WebContextMenuProxyMac::showContextMenu):
     55
     56        * WebKit2.xcodeproj/project.pbxproj:
     57
     58        * WebProcess/WebCoreSupport/WebContextMenuClient.h:
     59        * WebProcess/WebCoreSupport/mac/WebContextMenuClientMac.mm:
     60        (WebKit::WebContextMenuClient::shareSelectedTextMenuItem): In the web process, mark the Share menu's place in the
     61          context menu with a placeholder item. It will be translated into the real Share menu in the UI process.
     62
    1632015-04-02  Commit Queue  <commit-queue@webkit.org>
    264
  • trunk/Source/WebKit2/Shared/API/c/WKContextMenuItemTypes.h

    r182301 r182303  
    122122    kWKContextMenuItemTagOpenLinkInThisWindow,
    123123    kWKContextMenuItemTagToggleVideoFullscreen,
     124    kWKContextMenuItemTagShareMenu,
    124125    kWKContextMenuItemBaseApplicationTag = 10000
    125126};
  • trunk/Source/WebKit2/Shared/API/c/WKSharedAPICast.h

    r182301 r182303  
    504504    case WebCore::ContextMenuItemTagOpenLinkInThisWindow:
    505505        return kWKContextMenuItemTagOpenLinkInThisWindow;
     506    case WebCore::ContextMenuItemTagShareMenu:
     507        return kWKContextMenuItemTagShareMenu;
    506508    default:
    507509        if (action < WebCore::ContextMenuItemBaseApplicationTag)
     
    693695    case kWKContextMenuItemTagChangeBack:
    694696        return WebCore::ContextMenuItemTagChangeBack;
     697    case kWKContextMenuItemTagShareMenu:
     698        return WebCore::ContextMenuItemTagShareMenu;
    695699#endif
    696700    case kWKContextMenuItemTagOpenLinkInThisWindow:
  • trunk/Source/WebKit2/Shared/ContextMenuContextData.cpp

    r182301 r182303  
    4747ContextMenuContextData::ContextMenuContextData(const ContextMenuContext& context)
    4848    : m_webHitTestResultData(WebHitTestResult::Data(context.hitTestResult()))
     49    , m_selectedText(context.selectedText())
    4950#if ENABLE(SERVICE_CONTROLS)
    5051    , m_selectionIsEditable(false)
     
    6566{
    6667    encoder << m_webHitTestResultData;
     68    encoder << m_selectedText;
    6769
    6870#if ENABLE(SERVICE_CONTROLS)
     
    7779{
    7880    if (!decoder.decode(contextMenuContextData.m_webHitTestResultData))
     81        return false;
     82
     83    if (!decoder.decode(contextMenuContextData.m_selectedText))
    7984        return false;
    8085
  • trunk/Source/WebKit2/Shared/ContextMenuContextData.h

    r182301 r182303  
    5050   
    5151    const WebHitTestResult::Data& webHitTestResultData() const { return m_webHitTestResultData; }
     52    const String& selectedText() const { return m_selectedText; }
    5253
    5354#if ENABLE(SERVICE_CONTROLS)
     
    7273private:
    7374    WebHitTestResult::Data m_webHitTestResultData;
     75    String m_selectedText;
    7476
    7577#if ENABLE(SERVICE_CONTROLS)
  • trunk/Source/WebKit2/Shared/WebContextMenuItem.cpp

    r182301 r182303  
    3939    : m_webContextMenuItemData(data)
    4040{
     41}
     42
     43WebContextMenuItem::WebContextMenuItem(const WebCore::ContextMenuItem& coreItem)
     44    : m_webContextMenuItemData(coreItem)
     45{
     46    m_nativeContextMenuItem = std::make_unique<NativeContextMenuItem>(coreItem);
    4147}
    4248
  • trunk/Source/WebKit2/Shared/WebContextMenuItem.h

    r182301 r182303  
    3030
    3131#include "APIObject.h"
     32#include "NativeContextMenuItem.h"
    3233#include "WebContextMenuItemData.h"
    3334
    3435namespace API {
    3536class Array;
     37}
     38
     39namespace WebCore {
     40class ContextMenuItem;
    3641}
    3742
     
    4449        return adoptRef(new WebContextMenuItem(data));
    4550    }
     51
     52    static PassRefPtr<WebContextMenuItem> create(const WebCore::ContextMenuItem& item)
     53    {
     54        return adoptRef(new WebContextMenuItem(item));
     55    }
     56
    4657    static PassRefPtr<WebContextMenuItem> create(const String& title, bool enabled, API::Array* submenuItems);
    4758    static WebContextMenuItem* separatorItem();
     
    5364
    5465    WebContextMenuItemData* data() { return &m_webContextMenuItemData; }
     66    NativeContextMenuItem* nativeContextMenuItem() { return m_nativeContextMenuItem.get(); }
    5567
    5668private:
    5769    WebContextMenuItem(const WebContextMenuItemData&);
     70    WebContextMenuItem(const WebCore::ContextMenuItem&);
    5871
    5972    WebContextMenuItemData m_webContextMenuItemData;
     73
     74    std::unique_ptr<NativeContextMenuItem> m_nativeContextMenuItem;
    6075};
    6176
  • trunk/Source/WebKit2/UIProcess/API/APIContextMenuClient.h

    r182301 r182303  
    3030
    3131#include "WebHitTestResult.h"
     32#include <wtf/RefPtr.h>
    3233#include <wtf/Vector.h>
    3334
     
    3738
    3839namespace WebKit {
     40class WebContextMenuItem;
    3941class WebContextMenuItemData;
    4042class WebPageProxy;
     
    4749    virtual ~ContextMenuClient() { }
    4850
    49     virtual bool getContextMenuFromProposedMenu(WebKit::WebPageProxy&, const Vector<WebKit::WebContextMenuItemData>& /* proposedMenu */, Vector<WebKit::WebContextMenuItemData>& /* customMenu */, const WebKit::WebHitTestResult::Data&, API::Object* /* userData */) { return false; }
     51    virtual bool getContextMenuFromProposedMenu(WebKit::WebPageProxy&, const Vector<RefPtr<WebKit::WebContextMenuItem>>& /* proposedMenu */, Vector<RefPtr<WebKit::WebContextMenuItem>>& /* customMenu */, const WebKit::WebHitTestResult::Data&, API::Object* /* userData */) { return false; }
    5052    virtual void customContextMenuItemSelected(WebKit::WebPageProxy&, const WebKit::WebContextMenuItemData&) { }
    5153    virtual void contextMenuDismissed(WebKit::WebPageProxy&) { }
    52     virtual bool showContextMenu(WebKit::WebPageProxy&, const WebCore::IntPoint&, const Vector<WebKit::WebContextMenuItemData>&) { return false; }
     54    virtual bool showContextMenu(WebKit::WebPageProxy&, const WebCore::IntPoint&, const Vector<RefPtr<WebKit::WebContextMenuItem>>&) { return false; }
    5355    virtual bool hideContextMenu(WebKit::WebPageProxy&) { return false; }
    5456};
  • trunk/Source/WebKit2/UIProcess/API/C/WKPage.cpp

    r182301 r182303  
    745745
    746746    private:
    747         virtual bool getContextMenuFromProposedMenu(WebPageProxy& page, const Vector<WebContextMenuItemData>& proposedMenuVector, Vector<WebContextMenuItemData>& customMenu, const WebHitTestResult::Data& hitTestResultData, API::Object* userData) override
     747        virtual bool getContextMenuFromProposedMenu(WebPageProxy& page, const Vector<RefPtr<WebKit::WebContextMenuItem>>& proposedMenuVector, Vector<RefPtr<WebKit::WebContextMenuItem>>& customMenu, const WebHitTestResult::Data& hitTestResultData, API::Object* userData) override
    748748        {
    749749            if (!m_client.getContextMenuFromProposedMenu && !m_client.getContextMenuFromProposedMenu_deprecatedForUseWithV0)
     
    757757
    758758            for (const auto& menuItem : proposedMenuVector)
    759                 proposedMenuItems.uncheckedAppend(WebContextMenuItem::create(menuItem));
     759                proposedMenuItems.uncheckedAppend(menuItem);
    760760
    761761            WKArrayRef newMenu = nullptr;
     
    778778                }
    779779
    780                 customMenu.append(*item->data());
     780                customMenu.append(item);
    781781            }
    782782
     
    800800        }
    801801
    802         virtual bool showContextMenu(WebPageProxy& page, const WebCore::IntPoint& menuLocation, const Vector<WebContextMenuItemData>& menuItemsVector) override
     802        virtual bool showContextMenu(WebPageProxy& page, const WebCore::IntPoint& menuLocation, const Vector<RefPtr<WebContextMenuItem>>& menuItemsVector) override
    803803        {
    804804            if (!m_client.showContextMenu)
     
    809809
    810810            for (const auto& menuItem : menuItemsVector)
    811                 menuItems.uncheckedAppend(WebContextMenuItem::create(menuItem));
     811                menuItems.uncheckedAppend(menuItem);
    812812
    813813            m_client.showContextMenu(toAPI(&page), toAPI(menuLocation), toAPI(API::Array::create(WTF::move(menuItems)).get()), m_client.base.clientInfo);
  • trunk/Source/WebKit2/UIProcess/WebContextMenuProxy.h

    r182301 r182303  
    3838
    3939class ContextMenuContextData;
    40 class WebContextMenuItemData;
     40class WebContextMenuItem;
    4141
    4242class WebContextMenuProxy : public RefCounted<WebContextMenuProxy> {
     
    4444    virtual ~WebContextMenuProxy();
    4545
    46     virtual void showContextMenu(const WebCore::IntPoint&, const Vector<WebContextMenuItemData>&, const ContextMenuContextData&) = 0;
     46    virtual void showContextMenu(const WebCore::IntPoint&, const Vector<RefPtr<WebContextMenuItem>>&, const ContextMenuContextData&) = 0;
    4747    virtual void hideContextMenu() = 0;
    4848    virtual void cancelTracking() { }
  • trunk/Source/WebKit2/UIProcess/WebPageProxy.cpp

    r182301 r182303  
    7070#include "WebBackForwardListItem.h"
    7171#include "WebCertificateInfo.h"
     72#include "WebContextMenuItem.h"
    7273#include "WebContextMenuProxy.h"
    7374#include "WebCoreArgumentCoders.h"
     
    40294030
    40304031    // Unless this is an image control, give the PageContextMenuClient one last swipe at changing the menu.
    4031     Vector<WebContextMenuItemData> items;
    4032     bool useProposedItems = true;
    40334032    bool askClientToChangeMenu = clientEligibility == ContextMenuClientEligibility::EligibleForClient;
    40344033#if ENABLE(SERVICE_CONTROLS)
     
    40374036#endif
    40384037
    4039     if (askClientToChangeMenu && m_contextMenuClient->getContextMenuFromProposedMenu(*this, proposedItems, items, contextMenuContextData.webHitTestResultData(), m_process->transformHandlesToObjects(userData.object()).get()))
     4038    Vector<RefPtr<WebContextMenuItem>> proposedAPIItems;
     4039    for (auto& item : proposedItems) {
     4040        if (item.action() != ContextMenuItemTagShareMenu) {
     4041            proposedAPIItems.append(WebContextMenuItem::create(item));
     4042            continue;
     4043        }
     4044
     4045        // Currently we only support the share menu for text selection, so create the appropriate menu item for that text selection now.
     4046        ContextMenuItem coreItem = ContextMenuItem::shareSelectedTextMenuItem(contextMenuContextData.selectedText());
     4047        proposedAPIItems.append(WebContextMenuItem::create(coreItem));
     4048    }
     4049
     4050    Vector<RefPtr<WebContextMenuItem>> clientItems;
     4051    bool useProposedItems = true;
     4052
     4053    if (askClientToChangeMenu && m_contextMenuClient->getContextMenuFromProposedMenu(*this, proposedAPIItems, clientItems, contextMenuContextData.webHitTestResultData(), m_process->transformHandlesToObjects(userData.object()).get()))
    40404054        useProposedItems = false;
    40414055
    4042     const Vector<WebContextMenuItemData>& itemsToShow = useProposedItems ? proposedItems : items;
     4056    const Vector<RefPtr<WebContextMenuItem>>& itemsToShow = useProposedItems ? proposedAPIItems : clientItems;
    40434057    if (!m_contextMenuClient->showContextMenu(*this, menuLocation, itemsToShow))
    40444058        m_activeContextMenu->showContextMenu(menuLocation, itemsToShow, contextMenuContextData);
  • trunk/Source/WebKit2/UIProcess/efl/WebContextMenuProxyEfl.cpp

    r182301 r182303  
    4848}
    4949
    50 void WebContextMenuProxyEfl::showContextMenu(const WebCore::IntPoint&, const Vector<WebContextMenuItemData>&, const ContextMenuContextData&)
     50void WebContextMenuProxyEfl::showContextMenu(const WebCore::IntPoint&, const Vector<RefPtr<WebContextMenuItem>>&, const ContextMenuContextData&)
    5151{
    5252    notImplemented();
  • trunk/Source/WebKit2/UIProcess/efl/WebContextMenuProxyEfl.h

    r182301 r182303  
    4949    ~WebContextMenuProxyEfl();
    5050
    51     void showContextMenu(const WebCore::IntPoint&, const Vector<WebContextMenuItemData>&, const ContextMenuContextData&);
     51    void showContextMenu(const WebCore::IntPoint&, const Vector<RefPtr<WebContextMenuItem>>&, const ContextMenuContextData&);
    5252    void hideContextMenu();
    5353
  • trunk/Source/WebKit2/UIProcess/gtk/WebContextMenuProxyGtk.cpp

    r182301 r182303  
    131131}
    132132
    133 void WebContextMenuProxyGtk::populate(const Vector<WebContextMenuItemData>& items)
     133void WebContextMenuProxyGtk::populate(const Vector<RefPtr<WebContextMenuItem>>& items)
    134134{
    135135    for (size_t i = 0; i < items.size(); i++) {
    136         ContextMenuItem menuitem = items.at(i).core();
     136        ContextMenuItem menuitem = items.at(i)->data()->core();
    137137        append(menuitem);
    138138    }
    139139}
    140140
    141 void WebContextMenuProxyGtk::showContextMenu(const WebCore::IntPoint& position, const Vector<WebContextMenuItemData>& items, const ContextMenuContextData&)
     141void WebContextMenuProxyGtk::showContextMenu(const WebCore::IntPoint& position, const Vector<RefPtr<WebContextMenuItem>>& items, const ContextMenuContextData&)
    142142{
    143143    if (!items.isEmpty())
  • trunk/Source/WebKit2/UIProcess/gtk/WebContextMenuProxyGtk.h

    r182301 r182303  
    4747    ~WebContextMenuProxyGtk();
    4848
    49     virtual void showContextMenu(const WebCore::IntPoint&, const Vector<WebContextMenuItemData>&, const ContextMenuContextData&);
     49    virtual void showContextMenu(const WebCore::IntPoint&, const Vector<RefPtr<WebContextMenuItem>>&, const ContextMenuContextData&);
    5050    virtual void hideContextMenu();
    5151
     
    5757
    5858    void append(WebCore::ContextMenuItem&);
    59     void populate(const Vector<WebContextMenuItemData>&);
     59    void populate(const Vector<RefPtr<WebContextMenuItem>>&);
    6060    static void menuPositionFunction(GtkMenu*, gint*, gint*, gboolean*, WebContextMenuProxyGtk*);
    6161
  • trunk/Source/WebKit2/UIProcess/mac/WebContextMenuProxyMac.h

    r182301 r182303  
    3939
    4040class ShareableBitmap;
     41class WebContextMenuItemData;
    4142class WebPageProxy;
    4243
     
    4950    ~WebContextMenuProxyMac();
    5051
    51     virtual void showContextMenu(const WebCore::IntPoint&, const Vector<WebContextMenuItemData>&, const ContextMenuContextData&) override;
     52    virtual void showContextMenu(const WebCore::IntPoint&, const Vector<RefPtr<WebContextMenuItem>>&, const ContextMenuContextData&) override;
    5253
    5354    virtual void hideContextMenu() override;
     
    6667    WebContextMenuProxyMac(WKView*, WebPageProxy*);
    6768
    68     void populate(const Vector<WebContextMenuItemData>&, const ContextMenuContextData&);
     69    void populate(const Vector<RefPtr<WebContextMenuItem>>&, const ContextMenuContextData&);
    6970
    7071#if ENABLE(SERVICE_CONTROLS)
  • trunk/Source/WebKit2/UIProcess/mac/WebContextMenuProxyMac.mm

    r182301 r182303  
    3535#import "ShareableBitmap.h"
    3636#import "StringUtilities.h"
     37#import "WebContextMenuItem.h"
    3738#import "WebContextMenuItemData.h"
    3839#import "WebProcessProxy.h"
     
    141142        item.setUserData([static_cast<WKUserDataWrapper *>(representedObject) userData]);
    142143    }
    143            
     144
    144145    _menuProxy->contextMenuItemSelected(item);
    145146}
     
    293294}
    294295
    295 static Vector<RetainPtr<NSMenuItem>> nsMenuItemVector(const Vector<WebContextMenuItemData>& items)
     296template<typename ItemType> static Vector<RetainPtr<NSMenuItem>> nsMenuItemVector(const Vector<ItemType>&);
     297
     298static RetainPtr<NSMenuItem> nsMenuItem(const WebContextMenuItemData& item)
     299{
     300    switch (item.type()) {
     301    case ActionType:
     302    case CheckableActionType: {
     303        NSMenuItem* menuItem = [[NSMenuItem alloc] initWithTitle:nsStringFromWebCoreString(item.title()) action:@selector(forwardContextMenuAction:) keyEquivalent:@""];
     304        [menuItem setTag:item.action()];
     305        [menuItem setEnabled:item.enabled()];
     306        [menuItem setState:item.checked() ? NSOnState : NSOffState];
     307
     308        if (std::function<void ()> selectionHandler = item.selectionHandler()) {
     309            WKSelectionHandlerWrapper *wrapper = [[WKSelectionHandlerWrapper alloc] initWithSelectionHandler:selectionHandler];
     310            [menuItem setRepresentedObject:wrapper];
     311            [wrapper release];
     312        } else if (item.userData()) {
     313            WKUserDataWrapper *wrapper = [[WKUserDataWrapper alloc] initWithUserData:item.userData()];
     314            [menuItem setRepresentedObject:wrapper];
     315            [wrapper release];
     316        }
     317
     318        return adoptNS(menuItem);
     319        break;
     320    }
     321    case SeparatorType:
     322        return [NSMenuItem separatorItem];
     323        break;
     324    case SubmenuType: {
     325        NSMenu* menu = [[NSMenu alloc] initWithTitle:nsStringFromWebCoreString(item.title())];
     326        [menu setAutoenablesItems:NO];
     327        populateNSMenu(menu, nsMenuItemVector(item.submenu()));
     328           
     329        NSMenuItem* menuItem = [[NSMenuItem alloc] initWithTitle:nsStringFromWebCoreString(item.title()) action:@selector(forwardContextMenuAction:) keyEquivalent:@""];
     330        [menuItem setEnabled:item.enabled()];
     331        [menuItem setSubmenu:menu];
     332        [menu release];
     333
     334        return adoptNS(menuItem);
     335    }
     336    default:
     337        ASSERT_NOT_REACHED();
     338    }
     339}
     340
     341static RetainPtr<NSMenuItem> nsMenuItem(const RefPtr<WebContextMenuItem>& item)
     342{
     343    if (NativeContextMenuItem* nativeItem = item->nativeContextMenuItem())
     344        return nativeItem->nsMenuItem();
     345
     346    ASSERT(item->data());
     347    return nsMenuItem(*item->data());
     348}
     349
     350template<typename ItemType> static Vector<RetainPtr<NSMenuItem>> nsMenuItemVector(const Vector<ItemType>& items)
    296351{
    297352    Vector<RetainPtr<NSMenuItem>> result;
     
    299354    unsigned size = items.size();
    300355    result.reserveCapacity(size);
    301     for (unsigned i = 0; i < size; i++) {
    302         switch (items[i].type()) {
    303         case ActionType:
    304         case CheckableActionType: {
    305             NSMenuItem* menuItem = [[NSMenuItem alloc] initWithTitle:nsStringFromWebCoreString(items[i].title()) action:@selector(forwardContextMenuAction:) keyEquivalent:@""];
    306             [menuItem setTag:items[i].action()];
    307             [menuItem setEnabled:items[i].enabled()];
    308             [menuItem setState:items[i].checked() ? NSOnState : NSOffState];
    309 
    310             if (std::function<void ()> selectionHandler = items[i].selectionHandler()) {
    311                 WKSelectionHandlerWrapper *wrapper = [[WKSelectionHandlerWrapper alloc] initWithSelectionHandler:selectionHandler];
    312                 [menuItem setRepresentedObject:wrapper];
    313                 [wrapper release];
    314             } else if (items[i].userData()) {
    315                 WKUserDataWrapper *wrapper = [[WKUserDataWrapper alloc] initWithUserData:items[i].userData()];
    316                 [menuItem setRepresentedObject:wrapper];
    317                 [wrapper release];
    318             }
    319 
    320             result.append(adoptNS(menuItem));
    321             break;
    322         }
    323         case SeparatorType:
    324             result.append([NSMenuItem separatorItem]);
    325             break;
    326         case SubmenuType: {
    327             NSMenu* menu = [[NSMenu alloc] initWithTitle:nsStringFromWebCoreString(items[i].title())];
    328             [menu setAutoenablesItems:NO];
    329             populateNSMenu(menu, nsMenuItemVector(items[i].submenu()));
    330                
    331             NSMenuItem* menuItem = [[NSMenuItem alloc] initWithTitle:nsStringFromWebCoreString(items[i].title()) action:@selector(forwardContextMenuAction:) keyEquivalent:@""];
    332             [menuItem setEnabled:items[i].enabled()];
    333             [menuItem setSubmenu:menu];
    334             [menu release];
    335 
    336             result.append(adoptNS(menuItem));
    337            
    338             break;
    339         }
    340         default:
    341             ASSERT_NOT_REACHED();
    342         }
    343     }
     356    for (auto& item : items)
     357        result.uncheckedAppend(nsMenuItem(item));
    344358
    345359    WKMenuTarget* target = [WKMenuTarget sharedMenuTarget];
    346     for (unsigned i = 0; i < size; ++i)
    347         [result[i].get() setTarget:target];
     360    for (auto& item : result)
     361        [item.get() setTarget:target];
    348362   
    349363    return result;
     
    422436#endif
    423437
    424 void WebContextMenuProxyMac::populate(const Vector<WebContextMenuItemData>& items, const ContextMenuContextData& context)
     438void WebContextMenuProxyMac::populate(const Vector<RefPtr<WebContextMenuItem>>& items, const ContextMenuContextData& context)
    425439{
    426440#if ENABLE(SERVICE_CONTROLS)
     
    443457}
    444458
    445 void WebContextMenuProxyMac::showContextMenu(const IntPoint& menuLocation, const Vector<WebContextMenuItemData>& items, const ContextMenuContextData& context)
     459void WebContextMenuProxyMac::showContextMenu(const IntPoint& menuLocation, const Vector<RefPtr<WebContextMenuItem>>& items, const ContextMenuContextData& context)
    446460{
    447461#if ENABLE(SERVICE_CONTROLS)
  • trunk/Source/WebKit2/WebKit2.xcodeproj/project.pbxproj

    r182301 r182303  
    945945                5163199416289A6000E22F00 /* NetworkProcessMessageReceiver.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 51ACC9341628064800342550 /* NetworkProcessMessageReceiver.cpp */; };
    946946                5163199516289A6300E22F00 /* NetworkProcessMessages.h in Headers */ = {isa = PBXBuildFile; fileRef = 51ACC9351628064800342550 /* NetworkProcessMessages.h */; };
     947                5163EA451ACC7AE50012D1E4 /* NativeContextMenuItem.mm in Sources */ = {isa = PBXBuildFile; fileRef = 5163EA431ACC74AE0012D1E4 /* NativeContextMenuItem.mm */; };
    947948                51654EFD184EF33F007DC837 /* UniqueIDBDatabaseBackingStoreSQLite.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 51654EFB184EF33F007DC837 /* UniqueIDBDatabaseBackingStoreSQLite.cpp */; };
    948949                51654EFE184EF33F007DC837 /* UniqueIDBDatabaseBackingStoreSQLite.h in Headers */ = {isa = PBXBuildFile; fileRef = 51654EFC184EF33F007DC837 /* UniqueIDBDatabaseBackingStoreSQLite.h */; };
     
    31323133                516311861858446600534647 /* WebCrossThreadCopier.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WebCrossThreadCopier.h; sourceTree = "<group>"; };
    31333134                516319911628980A00E22F00 /* NetworkProcessProxyMac.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = NetworkProcessProxyMac.mm; path = mac/NetworkProcessProxyMac.mm; sourceTree = "<group>"; };
     3135                5163EA3F1ACC74820012D1E4 /* NativeContextMenuItem.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NativeContextMenuItem.h; sourceTree = "<group>"; };
     3136                5163EA431ACC74AE0012D1E4 /* NativeContextMenuItem.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = NativeContextMenuItem.mm; sourceTree = "<group>"; };
    31343137                51654EFB184EF33F007DC837 /* UniqueIDBDatabaseBackingStoreSQLite.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = UniqueIDBDatabaseBackingStoreSQLite.cpp; sourceTree = "<group>"; };
    31353138                51654EFC184EF33F007DC837 /* UniqueIDBDatabaseBackingStoreSQLite.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UniqueIDBDatabaseBackingStoreSQLite.h; sourceTree = "<group>"; };
     
    47374740                                1A92DC1212F8BAB90017AF65 /* LayerTreeContext.cpp */,
    47384741                                1A92DC1012F8BA460017AF65 /* LayerTreeContext.h */,
     4742                                5163EA3F1ACC74820012D1E4 /* NativeContextMenuItem.h */,
    47394743                                C02BFF1512514FD8009CCBEA /* NativeWebKeyboardEvent.h */,
    47404744                                31EA25D3134F78D6005B1452 /* NativeWebMouseEvent.h */,
     
    65306534                                CDC382F9172116D3008A2FC3 /* CookieStorageShimLibrary.cpp */,
    65316535                                CDC3830B172121CE008A2FC3 /* CookieStorageShimLibrary.h */,
     6536                                5163EA431ACC74AE0012D1E4 /* NativeContextMenuItem.mm */,
    65326537                                C02BFF1D1251502E009CCBEA /* NativeWebKeyboardEventMac.mm */,
    65336538                                31EA25D0134F78B2005B1452 /* NativeWebMouseEventMac.mm */,
     
    99929997                                BC4A6296147313A0006C681A /* WKConnectionRef.cpp in Sources */,
    99939998                                0FCB4E4D18BBE044000FCFC9 /* WKContentView.mm in Sources */,
     9999                                5163EA451ACC7AE50012D1E4 /* NativeContextMenuItem.mm in Sources */,
    999410000                                0FCB4E6D18BBF26A000FCFC9 /* WKContentViewInteraction.mm in Sources */,
    999510001                                BCB9E24C1120E15C00A137E0 /* WKContext.cpp in Sources */,
  • trunk/Source/WebKit2/WebProcess/WebCoreSupport/WebContextMenuClient.h

    r182301 r182303  
    6161#if PLATFORM(COCOA)
    6262    virtual void searchWithSpotlight() override;
     63    virtual WebCore::ContextMenuItem shareSelectedTextMenuItem(const String&) override;
    6364#endif
    6465
  • trunk/Source/WebKit2/WebProcess/WebCoreSupport/mac/WebContextMenuClientMac.mm

    r182301 r182303  
    9595}
    9696
     97ContextMenuItem WebContextMenuClient::shareSelectedTextMenuItem(const String& selectedText)
     98{
     99    return ContextMenuItem(SubmenuType, ContextMenuItemTagShareMenu, emptyString());
     100}
     101
    97102} // namespace WebKit
    98103
Note: See TracChangeset for help on using the changeset viewer.