[Chromium] Implement the ContextMenuItem SubMenu type
authorapavlov@chromium.org <apavlov@chromium.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 22 May 2012 14:32:27 +0000 (14:32 +0000)
committerapavlov@chromium.org <apavlov@chromium.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 22 May 2012 14:32:27 +0000 (14:32 +0000)
https://bugs.webkit.org/show_bug.cgi?id=86625

Reviewed by Pavel Feldman.

Source/WebCore:

This change is the WebKit part of a two-sided patch that adds subMenuItems to ContextMenuItem
and introduces code needed to handle it properly.

* platform/ContextMenuItem.h:
(PlatformMenuItemDescription): Add a Vector for subMenuItems.
* platform/PlatformMenuDescription.h:
(WebCore): Introduce a meaningful typedef for PlatformMenuDescription in Chromium.
* platform/chromium/ContextMenuChromium.cpp:
(WebCore::ContextMenu::itemWithAction): Search submenus when looking up a requested action id.
(WebCore::ContextMenu::platformDescription): Return a real PlatformMenuDescription rather than 0.
* platform/chromium/ContextMenuItemChromium.cpp:
(WebCore::ContextMenuItem::ContextMenuItem): Set submenu if one has been passed in.
(WebCore::ContextMenuItem::platformSubMenu): Return real subMenuItems instead of an empty PlatformMenuDescription.
(WebCore::ContextMenuItem::setSubMenu): Implemented.
(WebCore):

Source/WebKit/chromium:

* public/WebMenuItemInfo.h:
(WebMenuItemInfo): Add the SubMenu type and a vector of subMenuItems.
* src/ContextMenuClientImpl.cpp:
(WebKit::populateSubMenuItems): A recursive implementation that populates submenu items as well as other item types.
(WebKit):
(WebKit::ContextMenuClientImpl::populateCustomMenuItems): Consider submenus when populating WebMenuItemInfos.

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@117970 268f45cc-cd09-0410-ab3c-d52691b4dbfc

Source/WebCore/ChangeLog
Source/WebCore/platform/ContextMenuItem.h
Source/WebCore/platform/PlatformMenuDescription.h
Source/WebCore/platform/chromium/ContextMenuChromium.cpp
Source/WebCore/platform/chromium/ContextMenuItemChromium.cpp
Source/WebKit/chromium/ChangeLog
Source/WebKit/chromium/public/WebMenuItemInfo.h
Source/WebKit/chromium/src/ContextMenuClientImpl.cpp

index 7ca1ea7..c51f03b 100644 (file)
@@ -1,3 +1,26 @@
+2012-05-22  Alexander Pavlov  <apavlov@chromium.org>
+
+        [Chromium] Implement the ContextMenuItem SubMenu type
+        https://bugs.webkit.org/show_bug.cgi?id=86625
+
+        Reviewed by Pavel Feldman.
+
+        This change is the WebKit part of a two-sided patch that adds subMenuItems to ContextMenuItem
+        and introduces code needed to handle it properly.
+
+        * platform/ContextMenuItem.h:
+        (PlatformMenuItemDescription): Add a Vector for subMenuItems.
+        * platform/PlatformMenuDescription.h:
+        (WebCore): Introduce a meaningful typedef for PlatformMenuDescription in Chromium.
+        * platform/chromium/ContextMenuChromium.cpp:
+        (WebCore::ContextMenu::itemWithAction): Search submenus when looking up a requested action id.
+        (WebCore::ContextMenu::platformDescription): Return a real PlatformMenuDescription rather than 0.
+        * platform/chromium/ContextMenuItemChromium.cpp:
+        (WebCore::ContextMenuItem::ContextMenuItem): Set submenu if one has been passed in.
+        (WebCore::ContextMenuItem::platformSubMenu): Return real subMenuItems instead of an empty PlatformMenuDescription.
+        (WebCore::ContextMenuItem::setSubMenu): Implemented.
+        (WebCore):
+
 2012-05-22  Andrey Kosyakov  <caseq@chromium.org>
 
         Web Inspector: use canvas to render timeline category strips in overview pane
index f97e2fb..f8a1a29 100644 (file)
@@ -223,6 +223,7 @@ namespace WebCore {
         ContextMenuItemType type;
         ContextMenuAction action;
         String title;
+        Vector<ContextMenuItem> subMenuItems;
         bool checked;
         bool enabled;
     };
index 78196ad..56a7d08 100644 (file)
@@ -34,7 +34,7 @@ OBJC_CLASS NSMutableArray;
 typedef struct _GtkMenu GtkMenu;
 #elif PLATFORM(WX)
 class wxMenu;
-#elif PLATFORM(EFL)
+#elif PLATFORM(CHROMIUM) || PLATFORM(EFL)
 #include <wtf/Vector.h>
 #endif
 
@@ -50,7 +50,7 @@ namespace WebCore {
     typedef GtkMenu* PlatformMenuDescription;
 #elif PLATFORM(WX)
     typedef wxMenu* PlatformMenuDescription;
-#elif PLATFORM(EFL)
+#elif PLATFORM(CHROMIUM) || PLATFORM(EFL)
     class ContextMenuItem;
     typedef const Vector<ContextMenuItem>* PlatformMenuDescription;
 #else
index 9bddd28..e415138 100644 (file)
@@ -65,9 +65,17 @@ void ContextMenu::appendItem(ContextMenuItem& item)
 
 ContextMenuItem* ContextMenu::itemWithAction(unsigned action)
 {
-    for (size_t i = 0; i < m_items.size(); ++i) {
-        if (m_items[i].action() == static_cast<ContextMenuAction>(action))
-            return &m_items[i];
+    Vector<Vector<ContextMenuItem>*> menuItemStack;
+    menuItemStack.append(&m_items);
+    while (!menuItemStack.isEmpty()) {
+        Vector<ContextMenuItem>& items = *(menuItemStack.last());
+        menuItemStack.removeLast();
+        for (size_t i = 0; i < items.size(); ++i) {
+            if (items[i].action() == static_cast<ContextMenuAction>(action))
+                return &items[i];
+            if (items[i].type() == SubmenuType)
+                menuItemStack.append(const_cast<Vector<ContextMenuItem>*>(items[i].platformSubMenu()));
+        }
     }
     return 0;
 }
@@ -83,7 +91,7 @@ void ContextMenu::setPlatformDescription(PlatformMenuDescription menu)
 
 PlatformMenuDescription ContextMenu::platformDescription() const
 {
-    return 0;
+    return &m_items;
 }
 
 PlatformMenuDescription ContextMenu::releasePlatformDescription()
index 6a0d657..0ee7ee9 100644 (file)
@@ -31,6 +31,8 @@
 #include "config.h"
 #include "ContextMenuItem.h"
 
+#include "ContextMenu.h"
+
 namespace WebCore {
 
 // This is a stub implementation of WebKit's ContextMenu class that does
@@ -49,6 +51,8 @@ ContextMenuItem::ContextMenuItem(ContextMenuItemType type, ContextMenuAction act
     m_platformDescription.type = type;
     m_platformDescription.action = action;
     m_platformDescription.title = title;
+    if (subMenu)
+        setSubMenu(subMenu);
 }
 
 ContextMenuItem::~ContextMenuItem()
@@ -87,7 +91,7 @@ bool ContextMenuItem::enabled() const
 
 PlatformMenuDescription ContextMenuItem::platformSubMenu() const
 {
-    return PlatformMenuDescription();
+    return &m_platformDescription.subMenuItems;
 }
 
 void ContextMenuItem::setType(ContextMenuItemType type)
@@ -105,8 +109,14 @@ void ContextMenuItem::setTitle(const String& title)
     m_platformDescription.title = title;
 }
 
-void ContextMenuItem::setSubMenu(ContextMenu* subMenu)
+void ContextMenuItem::setSubMenu(ContextMenu* menu)
+{
+    m_platformDescription.subMenuItems = *menu->platformDescription();
+}
+
+void ContextMenuItem::setSubMenu(Vector<ContextMenuItem>& items)
 {
+    m_platformDescription.subMenuItems = items;
 }
 
 void ContextMenuItem::setChecked(bool checked)
index 7511b04..85af83b 100644 (file)
@@ -1,3 +1,17 @@
+2012-05-22  Alexander Pavlov  <apavlov@chromium.org>
+
+        [Chromium] Implement the ContextMenuItem SubMenu type
+        https://bugs.webkit.org/show_bug.cgi?id=86625
+
+        Reviewed by Pavel Feldman.
+
+        * public/WebMenuItemInfo.h:
+        (WebMenuItemInfo): Add the SubMenu type and a vector of subMenuItems.
+        * src/ContextMenuClientImpl.cpp:
+        (WebKit::populateSubMenuItems): A recursive implementation that populates submenu items as well as other item types.
+        (WebKit):
+        (WebKit::ContextMenuClientImpl::populateCustomMenuItems): Consider submenus when populating WebMenuItemInfos.
+
 2012-05-22  Ian Vollick  <vollick@chromium.org>
 
         [chromium] Speed up CCLayerTreeHostTestTickAnimationWhileBackgrounded
index ae284e7..d90049d 100644 (file)
@@ -44,6 +44,7 @@ struct WebMenuItemInfo {
         CheckableOption,
         Group,
         Separator,
+        SubMenu
     };
 
     WebMenuItemInfo() 
@@ -61,6 +62,7 @@ struct WebMenuItemInfo {
     Type type;
     unsigned action;
     WebTextDirection textDirection;
+    WebVector<WebMenuItemInfo> subMenuItems;
     bool hasTextDirectionOverride;
     bool enabled;
     bool checked;
index d35eb0e..87b11fe 100644 (file)
@@ -347,12 +347,12 @@ PlatformMenuDescription ContextMenuClientImpl::getCustomMenuFromDefaultItems(
     return 0;
 }
 
-void ContextMenuClientImpl::populateCustomMenuItems(WebCore::ContextMenu* defaultMenu, WebContextMenuData* data)
+static void populateSubMenuItems(PlatformMenuDescription inputMenu, WebVector<WebMenuItemInfo>& subMenuItems)
 {
-    Vector<WebMenuItemInfo> customItems;
-    for (size_t i = 0; i < defaultMenu->itemCount(); ++i) {
-        ContextMenuItem* inputItem = defaultMenu->itemAtIndex(i, defaultMenu->platformDescription());
-        if (inputItem->action() < ContextMenuItemBaseCustomTag || inputItem->action() >  ContextMenuItemLastCustomTag)
+    Vector<WebMenuItemInfo> subItems;
+    for (size_t i = 0; i < inputMenu->size(); ++i) {
+        const ContextMenuItem* inputItem = &inputMenu->at(i);
+        if (inputItem->action() < ContextMenuItemBaseCustomTag || inputItem->action() > ContextMenuItemLastCustomTag)
             continue;
 
         WebMenuItemInfo outputItem;
@@ -371,16 +371,22 @@ void ContextMenuClientImpl::populateCustomMenuItems(WebCore::ContextMenu* defaul
             outputItem.type = WebMenuItemInfo::Separator;
             break;
         case SubmenuType:
-            outputItem.type = WebMenuItemInfo::Group;
+            outputItem.type = WebMenuItemInfo::SubMenu;
+            populateSubMenuItems(inputItem->platformSubMenu(), outputItem.subMenuItems);
             break;
         }
-        customItems.append(outputItem);
+        subItems.append(outputItem);
     }
 
-    WebVector<WebMenuItemInfo> outputItems(customItems.size());
-    for (size_t i = 0; i < customItems.size(); ++i)
-        outputItems[i] = customItems[i];
-    data->customItems.swap(outputItems);
+    WebVector<WebMenuItemInfo> outputItems(subItems.size());
+    for (size_t i = 0; i < subItems.size(); ++i)
+        outputItems[i] = subItems[i];
+    subMenuItems.swap(outputItems);
+}
+
+void ContextMenuClientImpl::populateCustomMenuItems(WebCore::ContextMenu* defaultMenu, WebContextMenuData* data)
+{
+    populateSubMenuItems(defaultMenu->platformDescription(), data->customItems);
 }
 
 } // namespace WebKit