Changeset 51874 in webkit


Ignore:
Timestamp:
Dec 8, 2009 2:43:45 PM (14 years ago)
Author:
pfeldman@chromium.org
Message:

2009-12-08 Pavel Feldman <pfeldman@chromium.org>

Reviewed by Darin Fisher.

Chromium: support custom WebCore context menu items in Chromium port.

https://bugs.webkit.org/show_bug.cgi?id=32277

WebCore:

  • platform/ContextMenu.h:
  • platform/ContextMenuItem.h: (WebCore::PlatformMenuItemDescription::PlatformMenuItemDescription):
  • platform/chromium/ContextMenuChromium.cpp: (WebCore::ContextMenu::ContextMenu): (WebCore::ContextMenu::itemCount): (WebCore::ContextMenu::insertItem): (WebCore::ContextMenu::appendItem): (WebCore::ContextMenu::itemWithAction): (WebCore::ContextMenu::itemAtIndex): (WebCore::ContextMenu::platformDescription):
  • platform/chromium/ContextMenuItemChromium.cpp: (WebCore::ContextMenuItem::ContextMenuItem): (WebCore::ContextMenuItem::releasePlatformDescription): (WebCore::ContextMenuItem::type): (WebCore::ContextMenuItem::action): (WebCore::ContextMenuItem::title): (WebCore::ContextMenuItem::checked): (WebCore::ContextMenuItem::enabled): (WebCore::ContextMenuItem::setType): (WebCore::ContextMenuItem::setAction): (WebCore::ContextMenuItem::setTitle): (WebCore::ContextMenuItem::setChecked): (WebCore::ContextMenuItem::setEnabled):

WebKit/chromium:

  • public/WebContextMenuData.h:
  • public/WebPopupMenuInfo.h: (WebKit::WebPopupMenuInfo::Item::):
  • public/WebView.h:
  • src/ContextMenuClientImpl.cpp: (WebKit::ContextMenuClientImpl::getCustomMenuFromDefaultItems):
  • src/WebViewImpl.cpp: (WebKit::WebViewImpl::executeCustomContextMenuAction):
  • src/WebViewImpl.h:
Location:
trunk
Files:
14 edited
1 copied

Legend:

Unmodified
Added
Removed
  • trunk/WebCore/ChangeLog

    r51872 r51874  
     12009-12-08  Pavel Feldman  <pfeldman@chromium.org>
     2
     3        Reviewed by Darin Fisher.
     4
     5        Chromium: support custom WebCore context menu items in Chromium port.
     6
     7        https://bugs.webkit.org/show_bug.cgi?id=32277
     8
     9        * platform/ContextMenu.h:
     10        * platform/ContextMenuItem.h:
     11        (WebCore::PlatformMenuItemDescription::PlatformMenuItemDescription):
     12        * platform/chromium/ContextMenuChromium.cpp:
     13        (WebCore::ContextMenu::ContextMenu):
     14        (WebCore::ContextMenu::itemCount):
     15        (WebCore::ContextMenu::insertItem):
     16        (WebCore::ContextMenu::appendItem):
     17        (WebCore::ContextMenu::itemWithAction):
     18        (WebCore::ContextMenu::itemAtIndex):
     19        (WebCore::ContextMenu::platformDescription):
     20        * platform/chromium/ContextMenuItemChromium.cpp:
     21        (WebCore::ContextMenuItem::ContextMenuItem):
     22        (WebCore::ContextMenuItem::releasePlatformDescription):
     23        (WebCore::ContextMenuItem::type):
     24        (WebCore::ContextMenuItem::action):
     25        (WebCore::ContextMenuItem::title):
     26        (WebCore::ContextMenuItem::checked):
     27        (WebCore::ContextMenuItem::enabled):
     28        (WebCore::ContextMenuItem::setType):
     29        (WebCore::ContextMenuItem::setAction):
     30        (WebCore::ContextMenuItem::setTitle):
     31        (WebCore::ContextMenuItem::setChecked):
     32        (WebCore::ContextMenuItem::setEnabled):
     33
    1342009-12-08  Adam Langley  <agl@google.com>
    235
  • trunk/WebCore/platform/ContextMenu.h

    r45891 r51874  
    7979#elif PLATFORM(QT)
    8080        QList<ContextMenuItem> m_items;
     81#elif PLATFORM(CHROMIUM)
     82        Vector<ContextMenuItem> m_items;
    8183#else
    8284        PlatformMenuDescription m_platformDescription;
  • trunk/WebCore/platform/ContextMenuItem.h

    r51839 r51874  
    210210#elif PLATFORM(HAIKU)
    211211    typedef BMenuItem* PlatformMenuItemDescription;
     212#elif PLATFORM(CHROMIUM)
     213    struct PlatformMenuItemDescription {
     214        PlatformMenuItemDescription()
     215            : type(ActionType)
     216            , action(ContextMenuItemTagNoAction)
     217            , checked(false)
     218            , enabled(true) { }
     219        ContextMenuItemType type;
     220        ContextMenuAction action;
     221        String title;
     222        bool checked;
     223        bool enabled;
     224    };
    212225#else
    213226    typedef void* PlatformMenuItemDescription;
     
    239252
    240253        void setChecked(bool = true);
    241        
     254        bool checked() const;
     255
    242256        void setEnabled(bool = true);
    243257        bool enabled() const;
  • trunk/WebCore/platform/chromium/ContextMenuChromium.cpp

    r39903 r51874  
    3939ContextMenu::ContextMenu(const HitTestResult& result)
    4040    : m_hitTestResult(result)
    41     , m_platformDescription(0)
    4241{
    4342}
     
    4544ContextMenu::ContextMenu(const HitTestResult& result, const PlatformMenuDescription menu)
    4645    : m_hitTestResult(result)
    47     , m_platformDescription(0)
    4846{
    4947}
     
    5553unsigned ContextMenu::itemCount() const
    5654{
    57     return 0;
     55    return m_items.size();
    5856}
    5957
    6058void ContextMenu::insertItem(unsigned position, ContextMenuItem& item)
    6159{
     60    m_items.insert(position, item);
    6261}
    6362
    6463void ContextMenu::appendItem(ContextMenuItem& item)
    6564{
     65    m_items.append(item);
    6666}
    6767
    6868ContextMenuItem* ContextMenu::itemWithAction(unsigned action)
    6969{
     70    for (size_t i = 0; i < m_items.size(); ++i) {
     71        if (m_items[i].action() == static_cast<ContextMenuAction>(action))
     72            return &m_items[i];
     73    }
    7074    return 0;
    7175}
     
    7377ContextMenuItem* ContextMenu::itemAtIndex(unsigned index, const PlatformMenuDescription platformDescription)
    7478{
    75     return 0;
     79    return &m_items[index];
    7680}
    7781
     
    8286PlatformMenuDescription ContextMenu::platformDescription() const
    8387{
    84     return m_platformDescription;
     88    return 0;
    8589}
    8690
  • trunk/WebCore/platform/chromium/ContextMenuItemChromium.cpp

    r39861 r51874  
    4747ContextMenuItem::ContextMenuItem(ContextMenuItemType type, ContextMenuAction action, const String& title, ContextMenu* subMenu)
    4848{
     49    m_platformDescription.type = type;
     50    m_platformDescription.action = action;
     51    m_platformDescription.title = title;
    4952}
    5053
     
    5558PlatformMenuItemDescription ContextMenuItem::releasePlatformDescription()
    5659{
    57     return PlatformMenuItemDescription();
     60    return m_platformDescription;
    5861}
    5962
    6063ContextMenuItemType ContextMenuItem::type() const
    6164{
    62     return ContextMenuItemType();
     65    return m_platformDescription.type;
    6366}
    6467
    6568ContextMenuAction ContextMenuItem::action() const
    6669{
    67     return ContextMenuAction();
     70    return m_platformDescription.action;
    6871}
    6972
    7073String ContextMenuItem::title() const
    7174{
    72     return String();
     75    return m_platformDescription.title;
     76}
     77
     78bool ContextMenuItem::checked() const
     79{
     80    return m_platformDescription.checked;
     81}
     82
     83bool ContextMenuItem::enabled() const
     84{
     85    return m_platformDescription.enabled;
    7386}
    7487
     
    8093void ContextMenuItem::setType(ContextMenuItemType type)
    8194{
     95    m_platformDescription.type = type;
    8296}
    8397
    8498void ContextMenuItem::setAction(ContextMenuAction action)
    8599{
     100    m_platformDescription.action = action;
    86101}
    87102
    88103void ContextMenuItem::setTitle(const String& title)
    89104{
     105    m_platformDescription.title = title;
    90106}
    91107
     
    96112void ContextMenuItem::setChecked(bool checked)
    97113{
     114    m_platformDescription.checked = checked;
    98115}
    99116
    100117void ContextMenuItem::setEnabled(bool enabled)
    101118{
    102 }
    103 
    104 bool ContextMenuItem::enabled() const
    105 {
    106     return false;
     119    m_platformDescription.enabled = enabled;
    107120}
    108121
  • trunk/WebKit/chromium/ChangeLog

    r51868 r51874  
     12009-12-08  Pavel Feldman  <pfeldman@chromium.org>
     2
     3        Reviewed by Darin Fisher.
     4
     5        Chromium: support custom WebCore context menu items in Chromium port.
     6
     7        https://bugs.webkit.org/show_bug.cgi?id=32277
     8
     9        * public/WebContextMenuData.h:
     10        * public/WebPopupMenuInfo.h:
     11        (WebKit::WebPopupMenuInfo::Item::):
     12        * public/WebView.h:
     13        * src/ContextMenuClientImpl.cpp:
     14        (WebKit::ContextMenuClientImpl::getCustomMenuFromDefaultItems):
     15        * src/WebViewImpl.cpp:
     16        (WebKit::WebViewImpl::executeCustomContextMenuAction):
     17        * src/WebViewImpl.h:
     18
    1192009-12-08  Albert J. Wong  <ajwong@chromium.org>
    220
  • trunk/WebKit/chromium/WebKit.gyp

    r51788 r51874  
    132132                'public/WebMediaPlayerAction.h',
    133133                'public/WebMediaPlayerClient.h',
     134                'public/WebMenuItemInfo.h',
    134135                'public/WebMessagePortChannel.h',
    135136                'public/WebMessagePortChannelClient.h',
  • trunk/WebKit/chromium/public/WebContextMenuData.h

    r50678 r51874  
    3232#define WebContextMenuData_h
    3333
     34#include "WebMenuItemInfo.h"
    3435#include "WebPoint.h"
    3536#include "WebString.h"
    3637#include "WebURL.h"
     38#include "WebVector.h"
    3739
    3840namespace WebKit {
     
    112114    // Security information for the context.
    113115    WebCString securityInfo;
     116
     117    // Custom context menu items provided by the WebCore internals.
     118    WebVector<WebMenuItemInfo> customItems;
    114119};
    115120
  • trunk/WebKit/chromium/public/WebMenuItemInfo.h

    r51873 r51874  
    2929 */
    3030
    31 #ifndef WebPopupMenuInfo_h
    32 #define WebPopupMenuInfo_h
     31#ifndef WebMenuItemInfo_h
     32#define WebMenuItemInfo_h
    3333
    3434#include "WebCommon.h"
    35 #include "WebRect.h"
    3635#include "WebString.h"
    3736#include "WebVector.h"
     
    3938namespace WebKit {
    4039
    41 // Describes the contents of a popup menu.
    42 struct WebPopupMenuInfo {
    43     struct Item {
    44         enum Type {
    45             Option,
    46             Group,
    47             Separator,
    48         };
    49         WebString label;
    50         Type type;
    51         bool enabled;
     40struct WebMenuItemInfo {
     41    enum Type {
     42        Option,
     43        CheckableOption,
     44        Group,
     45        Separator,
    5246    };
    53 
    54     int itemHeight;
    55     int selectedIndex;
    56     WebVector<Item> items;
     47    WebString label;
     48    Type type;
     49    unsigned action;
     50    bool enabled;
     51    bool checked;
    5752};
    5853
  • trunk/WebKit/chromium/public/WebPopupMenuInfo.h

    r50717 r51874  
    3232#define WebPopupMenuInfo_h
    3333
    34 #include "WebCommon.h"
    35 #include "WebRect.h"
    36 #include "WebString.h"
     34#include "WebMenuItemInfo.h"
    3735#include "WebVector.h"
    3836
     
    4139// Describes the contents of a popup menu.
    4240struct WebPopupMenuInfo {
    43     struct Item {
    44         enum Type {
    45             Option,
    46             Group,
    47             Separator,
    48         };
    49         WebString label;
    50         Type type;
    51         bool enabled;
    52     };
    53 
     41    // FIXME: migrate clients to WebMenuItemInfo and remove this temporary Item typedef.
     42    typedef WebMenuItemInfo Item;
    5443    int itemHeight;
    5544    int selectedIndex;
    56     WebVector<Item> items;
     45    WebVector<WebMenuItemInfo> items;
    5746};
    5847
  • trunk/WebKit/chromium/public/WebView.h

    r51827 r51874  
    236236
    237237
     238    // Context menu --------------------------------------------------------
     239
     240    virtual void performCustomContextMenuAction(unsigned action) = 0;
     241
     242
    238243    // Visited link state --------------------------------------------------
    239244
     
    245250    // their links.
    246251    WEBKIT_API static void resetVisitedLinkState();
     252
    247253
    248254    // Scrollbar colors ----------------------------------------------------
  • trunk/WebKit/chromium/src/ContextMenuClientImpl.cpp

    r50741 r51874  
    5151#include "WebDataSourceImpl.h"
    5252#include "WebFrameImpl.h"
     53#include "WebMenuItemInfo.h"
    5354#include "WebPoint.h"
    5455#include "WebString.h"
    5556#include "WebURL.h"
    5657#include "WebURLResponse.h"
     58#include "WebVector.h"
    5759#include "WebViewClient.h"
    5860#include "WebViewImpl.h"
     
    229231    data.editFlags |= WebContextMenuData::CanSelectAll;
    230232
     233    // Filter out custom menu elements and add them into the data.
     234    populateCustomMenuItems(defaultMenu, &data);
     235
    231236    WebFrame* selected_web_frame = WebFrameImpl::fromFrame(selectedFrame);
    232237    if (m_webView->client())
     
    236241}
    237242
     243void ContextMenuClientImpl::populateCustomMenuItems(WebCore::ContextMenu* defaultMenu, WebContextMenuData* data)
     244{
     245    Vector<WebMenuItemInfo> customItems;
     246    for (size_t i = 0; i < defaultMenu->itemCount(); ++i) {
     247        ContextMenuItem* inputItem = defaultMenu->itemAtIndex(i, defaultMenu->platformDescription());
     248        if (inputItem->action() < ContextMenuItemBaseCustomTag || inputItem->action() >=  ContextMenuItemBaseApplicationTag)
     249            continue;
     250
     251        WebMenuItemInfo outputItem;
     252        outputItem.label = inputItem->title();
     253        outputItem.enabled = inputItem->enabled();
     254        outputItem.checked = inputItem->checked();
     255        outputItem.action = static_cast<unsigned>(inputItem->action() - ContextMenuItemBaseCustomTag);
     256        switch (inputItem->type()) {
     257        case ActionType:
     258            outputItem.type = WebMenuItemInfo::Option;
     259            break;
     260        case CheckableActionType:
     261            outputItem.type = WebMenuItemInfo::CheckableOption;
     262            break;
     263        case SeparatorType:
     264            outputItem.type = WebMenuItemInfo::Separator;
     265            break;
     266        case SubmenuType:
     267            outputItem.type = WebMenuItemInfo::Group;
     268            break;
     269        }
     270        customItems.append(outputItem);
     271    }
     272
     273    WebVector<WebMenuItemInfo> outputItems(customItems.size());
     274    for (size_t i = 0; i < customItems.size(); ++i)
     275        outputItems[i] = customItems[i];
     276    data->customItems.swap(outputItems);
     277}
     278
    238279} // namespace WebKit
  • trunk/WebKit/chromium/src/ContextMenuClientImpl.h

    r50741 r51874  
    3636namespace WebKit {
    3737
     38class WebContextMenuData;
    3839class WebViewImpl;
    3940
     
    5455    virtual void stopSpeaking() {}
    5556private:
     57    void populateCustomMenuItems(WebCore::ContextMenu*, WebContextMenuData*);
    5658    WebViewImpl* m_webView;
    5759};
  • trunk/WebKit/chromium/src/WebViewImpl.cpp

    r51832 r51874  
    3434#include "AutocompletePopupMenuClient.h"
    3535#include "AXObjectCache.h"
     36#include "ContextMenu.h"
     37#include "ContextMenuController.h"
     38#include "ContextMenuItem.h"
    3639#include "CSSStyleSelector.h"
    3740#include "CSSValueKeywords.h"
     
    15871590}
    15881591
     1592void WebViewImpl::performCustomContextMenuAction(unsigned action)
     1593{
     1594    if (!m_page)
     1595        return;
     1596    ContextMenu* menu = m_page->contextMenuController()->contextMenu();
     1597    if (!menu)
     1598        return;
     1599    ContextMenuItem* item = menu->itemWithAction(static_cast<ContextMenuAction>(ContextMenuItemBaseCustomTag + action));
     1600    if (item)
     1601        m_page->contextMenuController()->contextMenuItemSelected(item);
     1602    m_page->contextMenuController()->clearContextMenu();
     1603}
     1604
    15891605// WebView --------------------------------------------------------------------
    15901606
  • trunk/WebKit/chromium/src/WebViewImpl.h

    r51827 r51874  
    158158                                    unsigned activeColor,
    159159                                    unsigned trackColor);
     160    virtual void performCustomContextMenuAction(unsigned action);
    160161
    161162    // WebViewImpl
Note: See TracChangeset for help on using the changeset viewer.