diff options
24 files changed, 233 insertions, 17 deletions
diff --git a/chrome/browser/automation/automation_provider.cc b/chrome/browser/automation/automation_provider.cc index 5b692b8..3a58327 100755 --- a/chrome/browser/automation/automation_provider.cc +++ b/chrome/browser/automation/automation_provider.cc @@ -1028,6 +1028,8 @@ void AutomationProvider::OnMessageReceived(const IPC::Message& message) { IPC_MESSAGE_HANDLER(AutomationMsg_SetInitialFocus, SetInitialFocus) #if defined(OS_WIN) IPC_MESSAGE_HANDLER(AutomationMsg_TabReposition, OnTabReposition) + IPC_MESSAGE_HANDLER(AutomationMsg_ForwardContextMenuCommandToChrome, + OnForwardContextMenuCommandToChrome) #endif IPC_MESSAGE_HANDLER(AutomationMsg_GetSecurityState, GetSecurityState) IPC_MESSAGE_HANDLER(AutomationMsg_GetPageType, GetPageType) @@ -3003,7 +3005,27 @@ void AutomationProvider::OnTabReposition( } } } -#endif + +void AutomationProvider::OnForwardContextMenuCommandToChrome(int tab_handle, + int command) { + if (tab_tracker_->ContainsHandle(tab_handle)) { + NavigationController* tab = tab_tracker_->GetResource(tab_handle); + if (!tab) { + NOTREACHED(); + return; + } + + TabContents* tab_contents = tab->tab_contents(); + if (!tab_contents || !tab_contents->delegate()) { + NOTREACHED(); + return; + } + + tab_contents->delegate()->ExecuteContextMenuCommand(command); + } +} + +#endif // defined(OS_WIN) void AutomationProvider::GetWindowTitle(int handle, string16* text) { gfx::NativeWindow window = window_tracker_->GetResource(handle); diff --git a/chrome/browser/automation/automation_provider.h b/chrome/browser/automation/automation_provider.h index 3dedd65..59935f5 100644 --- a/chrome/browser/automation/automation_provider.h +++ b/chrome/browser/automation/automation_provider.h @@ -334,6 +334,7 @@ class AutomationProvider : public base::RefCounted<AutomationProvider>, void OnTabReposition(int tab_handle, const IPC::Reposition_Params& params); + void OnForwardContextMenuCommandToChrome(int tab_handle, int command); #endif // defined(OS_WIN) // Gets the security state for the tab associated to the specified |handle|. diff --git a/chrome/browser/external_tab_container.cc b/chrome/browser/external_tab_container.cc index 14ee79e..2dbf706 100644 --- a/chrome/browser/external_tab_container.cc +++ b/chrome/browser/external_tab_container.cc @@ -13,12 +13,15 @@ #include "chrome/browser/load_notification_details.h" #include "chrome/browser/profile.h" #include "chrome/browser/tab_contents/provisional_load_details.h" +#include "chrome/browser/tab_contents/render_view_context_menu_external_win.h" #include "chrome/browser/tab_contents/tab_contents.h" #include "chrome/browser/views/tab_contents/tab_contents_container.h" #include "chrome/common/chrome_constants.h" #include "chrome/common/notification_service.h" #include "chrome/test/automation/automation_messages.h" +#include "grit/generated_resources.h" + static const wchar_t kWindowObjectKey[] = L"ChromeWindowObject"; // TODO(sanjeevr): The external_accel_table_ and external_accel_entry_count_ @@ -96,6 +99,9 @@ bool ExternalTabContainer::Init(Profile* profile, SetParent(GetNativeView(), parent); ::ShowWindow(tab_contents_->GetNativeView(), SW_SHOWNA); + + disabled_context_menu_ids_.push_back( + IDS_CONTENT_CONTEXT_OPENLINKOFFTHERECORD); return true; } @@ -253,6 +259,40 @@ bool ExternalTabContainer::TakeFocus(bool reverse) { return true; } +bool ExternalTabContainer::HandleContextMenu(const ContextMenuParams& params) { + if (!automation_) { + NOTREACHED(); + return false; + } + + external_context_menu_.reset( + new RenderViewContextMenuExternalWin(tab_contents(), + params, + GetNativeView(), + disabled_context_menu_ids_)); + external_context_menu_->Init(); + + POINT screen_pt = { params.x, params.y }; + MapWindowPoints(GetNativeView(), HWND_DESKTOP, &screen_pt, 1); + + automation_->Send( + new AutomationMsg_ForwardContextMenuToExternalHost(0, tab_handle_, + external_context_menu_->GetMenuHandle(), screen_pt.x, screen_pt.y, + external_context_menu_->GetTPMAlignFlags())); + + return true; +} + +bool ExternalTabContainer::ExecuteContextMenuCommand(int command) { + if (!external_context_menu_.get()) { + NOTREACHED(); + return false; + } + + external_context_menu_->ExecuteCommand(command); + return true; +} + //////////////////////////////////////////////////////////////////////////////// // ExternalTabContainer, NotificationObserver implementation: diff --git a/chrome/browser/external_tab_container.h b/chrome/browser/external_tab_container.h index 3d65321..1f98891 100644 --- a/chrome/browser/external_tab_container.h +++ b/chrome/browser/external_tab_container.h @@ -5,6 +5,8 @@ #ifndef CHROME_BROWSER_EXTERNAL_TAB_CONTAINER_H_ #define CHROME_BROWSER_EXTERNAL_TAB_CONTAINER_H_ +#include <vector> + #include "chrome/browser/tab_contents/tab_contents_delegate.h" #include "chrome/common/notification_observer.h" #include "chrome/common/notification_registrar.h" @@ -13,6 +15,7 @@ class AutomationProvider; class Profile; class TabContentsContainer; +class RenderViewContextMenuExternalWin; // This class serves as the container window for an external tab. // An external tab is a Chrome tab that is meant to displayed in an @@ -83,6 +86,7 @@ class ExternalTabContainer : public TabContentsDelegate, virtual bool IsExternalTabContainer() const { return true; }; + virtual ExtensionFunctionDispatcher *CreateExtensionFunctionDispatcher( RenderViewHost* render_view_host, const std::string& extension_id); @@ -97,6 +101,14 @@ class ExternalTabContainer : public TabContentsDelegate, virtual bool ProcessKeyStroke(HWND window, UINT message, WPARAM wparam, LPARAM lparam); + // Handles the context menu display operation. This allows external + // hosts to customize the menu. + virtual bool HandleContextMenu(const ContextMenuParams& params); + + // Executes the context menu command identified by the command + // parameter. + virtual bool ExecuteContextMenuCommand(int command); + protected: // Overridden from views::WidgetWin: virtual void OnDestroy(); @@ -126,6 +138,11 @@ class ExternalTabContainer : public TabContentsDelegate, // is set when we need to ignore the next load notification. bool ignore_next_load_notification_; + // Contains the list of disabled context menu identifiers. + std::vector<int> disabled_context_menu_ids_; + + scoped_ptr<RenderViewContextMenuExternalWin> external_context_menu_; + DISALLOW_COPY_AND_ASSIGN(ExternalTabContainer); }; diff --git a/chrome/browser/tab_contents/render_view_context_menu.cc b/chrome/browser/tab_contents/render_view_context_menu.cc index fc387d9..bb33e78 100644 --- a/chrome/browser/tab_contents/render_view_context_menu.cc +++ b/chrome/browser/tab_contents/render_view_context_menu.cc @@ -43,6 +43,11 @@ RenderViewContextMenu::~RenderViewContextMenu() { // Menu construction functions ------------------------------------------------- +void RenderViewContextMenu::Init() { + InitMenu(params_.node); + DoInit(); +} + void RenderViewContextMenu::InitMenu(ContextNode node) { if (node.type & ContextNode::PAGE) AppendPageItems(); diff --git a/chrome/browser/tab_contents/render_view_context_menu.h b/chrome/browser/tab_contents/render_view_context_menu.h index 0fc13cd..cc779bd 100644 --- a/chrome/browser/tab_contents/render_view_context_menu.h +++ b/chrome/browser/tab_contents/render_view_context_menu.h @@ -21,11 +21,17 @@ class RenderViewContextMenu { virtual ~RenderViewContextMenu(); + // Initializes the context menu. + void Init(); + protected: void InitMenu(ContextNode node); // Functions to be implemented by platform-specific subclasses --------------- + // Platform specific initialization goes here. + virtual void DoInit() {} + // Append a normal menu item, taking the name from the id. virtual void AppendMenuItem(int id) = 0; diff --git a/chrome/browser/tab_contents/render_view_context_menu_external_win.cc b/chrome/browser/tab_contents/render_view_context_menu_external_win.cc new file mode 100644 index 0000000..0c19f94 --- /dev/null +++ b/chrome/browser/tab_contents/render_view_context_menu_external_win.cc @@ -0,0 +1,25 @@ +// Copyright (c) 2009 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chrome/browser/tab_contents/render_view_context_menu_external_win.h" + +#include <algorithm> + +RenderViewContextMenuExternalWin::RenderViewContextMenuExternalWin( + TabContents* tab_contents, + const ContextMenuParams& params, + HWND owner, + const std::vector<int> disabled_ids) + : RenderViewContextMenuWin(tab_contents, params, owner), + disabled_menu_ids_(disabled_ids) { +} + +void RenderViewContextMenuExternalWin::AppendMenuItem(int id) { + std::vector<int>::iterator found = + std::find(disabled_menu_ids_.begin(), disabled_menu_ids_.end(), id); + + if (found == disabled_menu_ids_.end()) { + RenderViewContextMenuWin::AppendMenuItem(id); + } +} diff --git a/chrome/browser/tab_contents/render_view_context_menu_external_win.h b/chrome/browser/tab_contents/render_view_context_menu_external_win.h new file mode 100644 index 0000000..3c31e44 --- /dev/null +++ b/chrome/browser/tab_contents/render_view_context_menu_external_win.h @@ -0,0 +1,32 @@ +// Copyright (c) 2009 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CHROME_BROWSER_TAB_CONTENTS_RENDER_VIEW_CONTEXT_MENU_EXTERNAL_WIN_H_ +#define CHROME_BROWSER_TAB_CONTENTS_RENDER_VIEW_CONTEXT_MENU_EXTERNAL_WIN_H_ + +#include <vector> + +#include "chrome/browser/tab_contents/render_view_context_menu_win.h" + +// This class provides a facility for an external host to customize the context +// menu displayed in Chrome. +class RenderViewContextMenuExternalWin : public RenderViewContextMenuWin { + public: + RenderViewContextMenuExternalWin(TabContents* tab_contents, + const ContextMenuParams& params, + HWND window, + const std::vector<int> disabled_menu_ids); + + ~RenderViewContextMenuExternalWin() {} + + protected: + // RenderViewContextMenuWin overrides -------------------------------------- + virtual void AppendMenuItem(int id); + + private: + // Contains the list of context menu ids to be disabled. + std::vector<int> disabled_menu_ids_; +}; + +#endif // CHROME_BROWSER_TAB_CONTENTS_RENDER_VIEW_CONTEXT_MENU_EXTERNAL_WIN_H_ diff --git a/chrome/browser/tab_contents/render_view_context_menu_gtk.cc b/chrome/browser/tab_contents/render_view_context_menu_gtk.cc index c58a7f3..80e90db 100644 --- a/chrome/browser/tab_contents/render_view_context_menu_gtk.cc +++ b/chrome/browser/tab_contents/render_view_context_menu_gtk.cc @@ -20,14 +20,16 @@ RenderViewContextMenuGtk::RenderViewContextMenuGtk( making_submenu_(false), triggering_event_time_(triggering_event_time), host_view_(rwhv) { - InitMenu(params.node); - DoneMakingMenu(&menu_); - gtk_menu_.reset(new MenuGtk(this, menu_.data(), NULL)); } RenderViewContextMenuGtk::~RenderViewContextMenuGtk() { } +void RenderViewContextMenuGtk::DoInit() { + DoneMakingMenu(&menu_); + gtk_menu_.reset(new MenuGtk(this, menu_.data(), NULL)); +} + void RenderViewContextMenuGtk::Popup() { host_view_->ShowingContextMenu(true); gtk_menu_->PopupAsContext(triggering_event_time_); diff --git a/chrome/browser/tab_contents/render_view_context_menu_gtk.h b/chrome/browser/tab_contents/render_view_context_menu_gtk.h index 8b6ebb6..51f5cf35 100644 --- a/chrome/browser/tab_contents/render_view_context_menu_gtk.h +++ b/chrome/browser/tab_contents/render_view_context_menu_gtk.h @@ -39,6 +39,7 @@ class RenderViewContextMenuGtk : public RenderViewContextMenu, protected: // RenderViewContextMenu implementation -------------------------------------- + virtual void DoInit(); virtual void AppendMenuItem(int id); virtual void AppendMenuItem(int id, const std::wstring& label); virtual void AppendRadioMenuItem(int id, const std::wstring& label); diff --git a/chrome/browser/tab_contents/render_view_context_menu_mac.h b/chrome/browser/tab_contents/render_view_context_menu_mac.h index 4b39b56..8ca5e3c 100644 --- a/chrome/browser/tab_contents/render_view_context_menu_mac.h +++ b/chrome/browser/tab_contents/render_view_context_menu_mac.h @@ -27,6 +27,7 @@ class RenderViewContextMenuMac : public RenderViewContextMenu { protected: // RenderViewContextMenu implementation- + virtual void DoInit(); virtual void AppendMenuItem(int id); virtual void AppendMenuItem(int id, const std::wstring& label); virtual void AppendRadioMenuItem(int id, const std::wstring& label); @@ -43,6 +44,7 @@ class RenderViewContextMenuMac : public RenderViewContextMenu { NSMenu* insert_menu_; // weak, where new items are inserted (usually // |menu_| unless there's a submenu in progress). ContextMenuTarget* target_; // obj-c target for menu actions + NSView* parent_view_; // parent view }; #endif // CHROME_BROWSER_TAB_CONTENTS_RENDER_VIEW_CONTEXT_MENU_MAC_H_ diff --git a/chrome/browser/tab_contents/render_view_context_menu_mac.mm b/chrome/browser/tab_contents/render_view_context_menu_mac.mm index ba55aa2..4c0537f 100644 --- a/chrome/browser/tab_contents/render_view_context_menu_mac.mm +++ b/chrome/browser/tab_contents/render_view_context_menu_mac.mm @@ -46,15 +46,10 @@ RenderViewContextMenuMac::RenderViewContextMenuMac( : RenderViewContextMenu(web_contents, params), menu_([[NSMenu alloc] init]), insert_menu_(menu_), - target_(nil) { + target_(nil), + parent_view_(parent_view) { [menu_ setAutoenablesItems:NO]; target_ = [[ContextMenuTarget alloc] initWithContext:this]; - InitMenu(params.node); - - // show the menu - [NSMenu popUpContextMenu:menu_ - withEvent:[NSApp currentEvent] - forView:parent_view]; } RenderViewContextMenuMac::~RenderViewContextMenuMac() { @@ -62,6 +57,13 @@ RenderViewContextMenuMac::~RenderViewContextMenuMac() { [menu_ release]; } +void RenderViewContextMenuMac::DoInit() { + // show the menu + [NSMenu popUpContextMenu:menu_ + withEvent:[NSApp currentEvent] + forView:parent_view_]; +} + // Do things like remove the windows accelerators. // TODO(pinkerton): Do we want to do anything like make a maximum string width // and middle-truncate? diff --git a/chrome/browser/tab_contents/render_view_context_menu_win.cc b/chrome/browser/tab_contents/render_view_context_menu_win.cc index 90b0345..952993f 100644 --- a/chrome/browser/tab_contents/render_view_context_menu_win.cc +++ b/chrome/browser/tab_contents/render_view_context_menu_win.cc @@ -14,13 +14,13 @@ RenderViewContextMenuWin::RenderViewContextMenuWin( const ContextMenuParams& params, HWND owner) : RenderViewContextMenu(tab_contents, params), - sub_menu_(NULL) { + sub_menu_(NULL), + owner_(owner) { // anchor_position set per http://crbug.com/10827. views::Menu::AnchorPoint anchor_position = views::Menu::TOPLEFT; if (l10n_util::GetTextDirection() == l10n_util::RIGHT_TO_LEFT) anchor_position = views::Menu::TOPRIGHT; - menu_.reset(new views::MenuWin(this, anchor_position, owner)); - InitMenu(params.node); + menu_.reset(new views::MenuWin(this, anchor_position, owner_)); } RenderViewContextMenuWin::~RenderViewContextMenuWin() { diff --git a/chrome/browser/tab_contents/render_view_context_menu_win.h b/chrome/browser/tab_contents/render_view_context_menu_win.h index 94aec65..3488d59 100644 --- a/chrome/browser/tab_contents/render_view_context_menu_win.h +++ b/chrome/browser/tab_contents/render_view_context_menu_win.h @@ -28,6 +28,14 @@ class RenderViewContextMenuWin : public RenderViewContextMenu, // TODO(port): move the logic in this function to RenderViewContextMenu. virtual bool GetAcceleratorInfo(int id, views::Accelerator* accel); + HMENU GetMenuHandle() const { + return (menu_.get() ? menu_->GetMenuHandle() : NULL); + } + + unsigned int GetTPMAlignFlags() const { + return (menu_.get() ? menu_->GetTPMAlignFlags() : 0); + } + protected: // RenderViewContextMenu implementation -------------------------------------- virtual void AppendMenuItem(int id); @@ -46,6 +54,7 @@ class RenderViewContextMenuWin : public RenderViewContextMenu, scoped_ptr<views::MenuWin> menu_; views::Menu* sub_menu_; + HWND owner_; }; #endif // CHROME_BROWSER_TAB_CONTENTS_RENDER_VIEW_CONTEXT_MENU_WIN_H_ diff --git a/chrome/browser/tab_contents/tab_contents_delegate.h b/chrome/browser/tab_contents/tab_contents_delegate.h index 496172a..d7820e2 100644 --- a/chrome/browser/tab_contents/tab_contents_delegate.h +++ b/chrome/browser/tab_contents/tab_contents_delegate.h @@ -10,6 +10,7 @@ #include "base/gfx/rect.h" #include "chrome/common/page_transition_types.h" #include "chrome/common/renderer_preferences.h" +#include "webkit/glue/context_menu.h" #include "webkit/glue/window_open_disposition.h" class DownloadItem; @@ -180,6 +181,16 @@ class TabContentsDelegate { virtual void OnStartDownload(DownloadItem* download) { } + // Returns true if the context menu operation was handled by the delegate. + virtual bool HandleContextMenu(const ContextMenuParams& params) { + return false; + } + + // Returns true if the context menu command was handled + virtual bool ExecuteContextMenuCommand(int command) { + return false; + } + // Returns the renderer's current preferences settings. RendererPreferences GetRendererPrefs() const { return renderer_preferences_; } diff --git a/chrome/browser/tab_contents/tab_contents_view_gtk.cc b/chrome/browser/tab_contents/tab_contents_view_gtk.cc index 30cef96..8496b03 100644 --- a/chrome/browser/tab_contents/tab_contents_view_gtk.cc +++ b/chrome/browser/tab_contents/tab_contents_view_gtk.cc @@ -312,6 +312,7 @@ void TabContentsViewGtk::Observe(NotificationType type, void TabContentsViewGtk::ShowContextMenu(const ContextMenuParams& params) { context_menu_.reset(new RenderViewContextMenuGtk(tab_contents(), params, last_mouse_down_time_, tab_contents()->render_widget_host_view())); + context_menu_->Init(); context_menu_->Popup(); } diff --git a/chrome/browser/tab_contents/tab_contents_view_mac.mm b/chrome/browser/tab_contents/tab_contents_view_mac.mm index fd32310..9bf8e1e 100644 --- a/chrome/browser/tab_contents/tab_contents_view_mac.mm +++ b/chrome/browser/tab_contents/tab_contents_view_mac.mm @@ -180,6 +180,7 @@ void TabContentsViewMac::ShowContextMenu(const ContextMenuParams& params) { RenderViewContextMenuMac menu(tab_contents(), params, GetNativeView()); + menu.Init(); } RenderWidgetHostView* TabContentsViewMac::CreateNewWidgetInternal( diff --git a/chrome/browser/tab_contents/tab_contents_view_win.cc b/chrome/browser/tab_contents/tab_contents_view_win.cc index ed72402..966c41e 100644 --- a/chrome/browser/tab_contents/tab_contents_view_win.cc +++ b/chrome/browser/tab_contents/tab_contents_view_win.cc @@ -380,10 +380,17 @@ void TabContentsViewWin::HandleKeyboardEvent( } void TabContentsViewWin::ShowContextMenu(const ContextMenuParams& params) { + // Allow delegates to handle the context menu operation first. + if (tab_contents()->delegate()->HandleContextMenu(params)) { + return; + } + RenderViewContextMenuWin menu(tab_contents(), params, GetNativeView()); + menu.Init(); + POINT screen_pt = { params.x, params.y }; MapWindowPoints(GetNativeView(), HWND_DESKTOP, &screen_pt, 1); diff --git a/chrome/chrome.gyp b/chrome/chrome.gyp index 583cafa..735ee10 100644 --- a/chrome/chrome.gyp +++ b/chrome/chrome.gyp @@ -1355,6 +1355,8 @@ 'browser/tab_contents/render_view_context_menu_mac.h', 'browser/tab_contents/render_view_context_menu_win.cc', 'browser/tab_contents/render_view_context_menu_win.h', + 'browser/tab_contents/render_view_context_menu_external_win.cc', + 'browser/tab_contents/render_view_context_menu_external_win.h', 'browser/tab_contents/render_view_host_delegate_helper.cc', 'browser/tab_contents/render_view_host_delegate_helper.h', 'browser/tab_contents/render_view_host_manager.cc', diff --git a/chrome/test/automation/automation_messages_internal.h b/chrome/test/automation/automation_messages_internal.h index d746202..7e20454 100755 --- a/chrome/test/automation/automation_messages_internal.h +++ b/chrome/test/automation/automation_messages_internal.h @@ -939,5 +939,17 @@ IPC_BEGIN_MESSAGES(Automation) IPC_SYNC_MESSAGE_ROUTED1_1(AutomationMsg_BlockedPopupCount, int /* tab_handle */, int /* blocked_popup_count */) +#if defined(OS_WIN) + IPC_MESSAGE_ROUTED5(AutomationMsg_ForwardContextMenuToExternalHost, + int /* tab_handle */, + HANDLE /* source menu handle */, + int /* the x coordinate for displaying the menu */, + int /* the y coordinate for displaying the menu */, + int /* align flags */) + + IPC_MESSAGE_ROUTED2(AutomationMsg_ForwardContextMenuCommandToChrome, + int /* tab_handle */, + int /* selected_command */) +#endif // OS_WIN IPC_END_MESSAGES(Automation) diff --git a/chrome/test/automation/tab_proxy.cc b/chrome/test/automation/tab_proxy.cc index 1a2d1144..f81e23b 100644 --- a/chrome/test/automation/tab_proxy.cc +++ b/chrome/test/automation/tab_proxy.cc @@ -662,6 +662,11 @@ void TabProxy::Reposition(HWND window, HWND window_insert_after, int left, sender_->Send(new AutomationMsg_TabReposition(0, handle_, params)); } +void TabProxy::SendContextMenuCommand(int selected_command) { + sender_->Send(new AutomationMsg_ForwardContextMenuCommandToChrome( + 0, handle_, selected_command)); +} + #endif // defined(OS_WIN) void TabProxy::AddObserver(TabProxyDelegate* observer) { diff --git a/chrome/test/automation/tab_proxy.h b/chrome/test/automation/tab_proxy.h index 2b142b1..5366119 100644 --- a/chrome/test/automation/tab_proxy.h +++ b/chrome/test/automation/tab_proxy.h @@ -303,6 +303,10 @@ class TabProxy : public AutomationResourceProxy { // passed in. void Reposition(HWND window, HWND window_insert_after, int left, int top, int width, int height, int flags, HWND parent_window); + + // Sends the selected context menu command to the chrome instance + void SendContextMenuCommand(int selected_command); + #endif // defined(OS_WIN) // Calls delegates diff --git a/views/controls/menu/menu.h b/views/controls/menu/menu.h index faf4a7b..b93ef98 100644 --- a/views/controls/menu/menu.h +++ b/views/controls/menu/menu.h @@ -271,6 +271,11 @@ class Menu { // Returns the number of menu items. virtual int ItemCount() = 0; +#if defined(OS_WIN) + // Returns the underlying menu handle + virtual HMENU GetMenuHandle() const = 0; +#endif // defined(OS_WIN) + protected: explicit Menu(Menu* parent); diff --git a/views/controls/menu/menu_win.h b/views/controls/menu/menu_win.h index 5022db7..0469c12 100644 --- a/views/controls/menu/menu_win.h +++ b/views/controls/menu/menu_win.h @@ -63,6 +63,13 @@ class MenuWin : public Menu { virtual void Cancel(); virtual int ItemCount(); + virtual HMENU GetMenuHandle() const { + return menu_; + } + + // Gets the Win32 TPM alignment flags for the specified AnchorPoint. + DWORD GetTPMAlignFlags() const; + protected: virtual void AddMenuItemInternal(int index, int item_id, @@ -91,9 +98,6 @@ class MenuWin : public Menu { // the state of the item in preference to |controller_|. UINT GetStateFlagsForItemID(int item_id) const; - // Gets the Win32 TPM alignment flags for the specified AnchorPoint. - DWORD GetTPMAlignFlags() const; - // The Win32 Menu Handle we wrap HMENU menu_; |