| Index: content/browser/renderer_host/popup_menu_helper_mac.mm
|
| diff --git a/content/browser/renderer_host/popup_menu_helper_mac.mm b/content/browser/renderer_host/popup_menu_helper_mac.mm
|
| index d5b9ed876d50cf0dac69e62da53afe7d1b9c2208..1fb28bae96bce3cff27b343f0f023bef038df089 100644
|
| --- a/content/browser/renderer_host/popup_menu_helper_mac.mm
|
| +++ b/content/browser/renderer_host/popup_menu_helper_mac.mm
|
| @@ -25,7 +25,9 @@ bool g_allow_showing_popup_menus = true;
|
| } // namespace
|
|
|
| PopupMenuHelper::PopupMenuHelper(RenderViewHost* render_view_host)
|
| - : render_view_host_(static_cast<RenderViewHostImpl*>(render_view_host)) {
|
| + : render_view_host_(static_cast<RenderViewHostImpl*>(render_view_host)),
|
| + menu_runner_(nil),
|
| + popup_was_hidden_(false) {
|
| notification_registrar_.Add(
|
| this, NOTIFICATION_RENDER_WIDGET_HOST_DESTROYED,
|
| Source<RenderWidgetHost>(render_view_host));
|
| @@ -55,10 +57,9 @@ void PopupMenuHelper::ShowPopupMenu(
|
| [rwhvm->cocoa_view() retain]);
|
|
|
| // Display the menu.
|
| - base::scoped_nsobject<WebMenuRunner> menu_runner;
|
| - menu_runner.reset([[WebMenuRunner alloc] initWithItems:items
|
| - fontSize:item_font_size
|
| - rightAligned:right_aligned]);
|
| + menu_runner_ = [[WebMenuRunner alloc] initWithItems:items
|
| + fontSize:item_font_size
|
| + rightAligned:right_aligned];
|
|
|
| {
|
| // Make sure events can be pumped while the menu is up.
|
| @@ -73,23 +74,35 @@ void PopupMenuHelper::ShowPopupMenu(
|
| base::mac::ScopedSendingEvent sending_event_scoper;
|
|
|
| // Now run a SYNCHRONOUS NESTED EVENT LOOP until the pop-up is finished.
|
| - [menu_runner runMenuInView:cocoa_view
|
| - withBounds:[cocoa_view flipRectToNSRect:bounds]
|
| - initialIndex:selected_item];
|
| + [menu_runner_ runMenuInView:cocoa_view
|
| + withBounds:[cocoa_view flipRectToNSRect:bounds]
|
| + initialIndex:selected_item];
|
| }
|
|
|
| if (!render_view_host_) {
|
| // Bad news, the RenderViewHost got deleted while we were off running the
|
| // menu. Nothing to do.
|
| + [menu_runner_ release];
|
| + menu_runner_ = nil;
|
| return;
|
| }
|
|
|
| - if ([menu_runner menuItemWasChosen]) {
|
| - render_view_host_->DidSelectPopupMenuItem(
|
| - [menu_runner indexOfSelectedItem]);
|
| - } else {
|
| - render_view_host_->DidCancelPopupMenu();
|
| + if (!popup_was_hidden_) {
|
| + if ([menu_runner_ menuItemWasChosen]) {
|
| + render_view_host_->DidSelectPopupMenuItem(
|
| + [menu_runner_ indexOfSelectedItem]);
|
| + } else {
|
| + render_view_host_->DidCancelPopupMenu();
|
| + }
|
| }
|
| + [menu_runner_ release];
|
| + menu_runner_ = nil;
|
| +}
|
| +
|
| +void PopupMenuHelper::Hide() {
|
| + if (menu_runner_)
|
| + [menu_runner_ hide];
|
| + popup_was_hidden_ = true;
|
| }
|
|
|
| // static
|
|
|