diff options
Diffstat (limited to 'Source/WebKit2/UIProcess/qt/WebContextMenuProxyQt.cpp')
-rw-r--r-- | Source/WebKit2/UIProcess/qt/WebContextMenuProxyQt.cpp | 39 |
1 files changed, 22 insertions, 17 deletions
diff --git a/Source/WebKit2/UIProcess/qt/WebContextMenuProxyQt.cpp b/Source/WebKit2/UIProcess/qt/WebContextMenuProxyQt.cpp index 09638b6..777f98c 100644 --- a/Source/WebKit2/UIProcess/qt/WebContextMenuProxyQt.cpp +++ b/Source/WebKit2/UIProcess/qt/WebContextMenuProxyQt.cpp @@ -28,6 +28,7 @@ #include "WebContextMenuProxyQt.h" #include <IntPoint.h> +#include <OwnPtr.h> #include <WebContextMenuItemData.h> #include <qmenu.h> #include <qwkpage.h> @@ -81,19 +82,24 @@ PassRefPtr<WebContextMenuProxyQt> WebContextMenuProxyQt::create(QWKPage* page) void WebContextMenuProxyQt::showContextMenu(const IntPoint& position, const Vector<WebContextMenuItemData>& items) { - if (QMenu* menu = createContextMenu(items)) { - menu->move(position); - emit m_page->showContextMenu(menu); - } + OwnPtr<QMenu> menu = createContextMenu(items); + + // We send the signal, even with no items, because the client should be able to show custom items + // even if WebKit has nothing to show. + if (!menu) + menu = adoptPtr(new QMenu); + + menu->move(position); + emit m_page->showContextMenu(QSharedPointer<QMenu>(menu.leakPtr())); } void WebContextMenuProxyQt::hideContextMenu() { } -QMenu* WebContextMenuProxyQt::createContextMenu(const Vector<WebContextMenuItemData>& items) +PassOwnPtr<QMenu> WebContextMenuProxyQt::createContextMenu(const Vector<WebContextMenuItemData>& items) const { - QMenu* menu = new QMenu; + OwnPtr<QMenu> menu = adoptPtr(new QMenu); for (int i = 0; i < items.size(); ++i) { const WebContextMenuItemData& item = items.at(i); switch (item.type()) { @@ -114,9 +120,11 @@ QMenu* WebContextMenuProxyQt::createContextMenu(const Vector<WebContextMenuItemD menu->addSeparator(); break; case WebCore::SubmenuType: - if (QMenu *subMenu = createContextMenu(item.submenu())) { + if (OwnPtr<QMenu> subMenu = createContextMenu(item.submenu())) { + subMenu->setParent(menu.get()); + QMenu* const subMenuPtr = subMenu.leakPtr(); subMenu->setTitle(item.title()); - menu->addAction(subMenu->menuAction()); + menu->addMenu(subMenuPtr); } break; @@ -124,22 +132,19 @@ QMenu* WebContextMenuProxyQt::createContextMenu(const Vector<WebContextMenuItemD } // Do not show sub-menus with just disabled actions. - if (menu->isEmpty()) { - delete menu; - return 0; - } + if (menu->isEmpty()) + return PassOwnPtr<QMenu>(); + bool isAnyActionEnabled = false; QList<QAction *> actions = menu->actions(); for (int i = 0; i < actions.count(); ++i) { if (actions.at(i)->isVisible()) isAnyActionEnabled |= actions.at(i)->isEnabled(); } - if (!isAnyActionEnabled) { - delete menu; - return 0; - } + if (!isAnyActionEnabled) + return PassOwnPtr<QMenu>(); - return menu; + return menu.release(); } } // namespace WebKit |