diff options
-rw-r--r-- | base/message_loop.h | 17 | ||||
-rw-r--r-- | chrome/browser/renderer_host/render_widget_host_view_mac.mm | 10 | ||||
-rw-r--r-- | chrome/browser/tab_contents/render_view_context_menu_mac.mm | 18 | ||||
-rw-r--r-- | chrome/browser/tab_contents/tab_contents_view_mac.mm | 4 |
4 files changed, 34 insertions, 15 deletions
diff --git a/base/message_loop.h b/base/message_loop.h index e45adde..fe28179 100644 --- a/base/message_loop.h +++ b/base/message_loop.h @@ -223,6 +223,23 @@ class MessageLoop : public base::MessagePump::Delegate { void SetNestableTasksAllowed(bool allowed); bool NestableTasksAllowed() const; + // Enables nestable tasks on |loop| while in scope. + class ScopedNestableTaskAllower { + public: + explicit ScopedNestableTaskAllower(MessageLoop* loop) + : loop_(loop), + old_state_(loop_->NestableTasksAllowed()) { + loop_->SetNestableTasksAllowed(true); + } + ~ScopedNestableTaskAllower() { + loop_->SetNestableTasksAllowed(old_state_); + } + + private: + MessageLoop* loop_; + bool old_state_; + }; + // Enables or disables the restoration during an exception of the unhandled // exception filter that was active when Run() was called. This can happen // if some third party code call SetUnhandledExceptionFilter() and never diff --git a/chrome/browser/renderer_host/render_widget_host_view_mac.mm b/chrome/browser/renderer_host/render_widget_host_view_mac.mm index 17f4a66..78d2736 100644 --- a/chrome/browser/renderer_host/render_widget_host_view_mac.mm +++ b/chrome/browser/renderer_host/render_widget_host_view_mac.mm @@ -399,9 +399,13 @@ void RenderWidgetHostViewMac::ShowPopupWithItems( scoped_nsobject<WebMenuRunner> menu_runner; menu_runner.reset([[WebMenuRunner alloc] initWithItems:items]); - [menu_runner runMenuInView:parent_view_ - withBounds:position - initialIndex:selected_item]; + { + // Make sure events can be pumped while the menu is up. + MessageLoop::ScopedNestableTaskAllower allow(MessageLoop::current()); + [menu_runner runMenuInView:parent_view_ + withBounds:position + initialIndex:selected_item]; + } int window_num = [[parent_view_ window] windowNumber]; NSEvent* event = 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 ef25b7e..8e7c01e 100644 --- a/chrome/browser/tab_contents/render_view_context_menu_mac.mm +++ b/chrome/browser/tab_contents/render_view_context_menu_mac.mm @@ -75,15 +75,15 @@ void RenderViewContextMenuMac::DoInit() { clickCount:1 pressure:1.0]; - bool old_state = MessageLoop::current()->NestableTasksAllowed(); - MessageLoop::current()->SetNestableTasksAllowed(true); - - // Show the menu. - [NSMenu popUpContextMenu:menu_ - withEvent:clickEvent - forView:parent_view_]; - - MessageLoop::current()->SetNestableTasksAllowed(old_state); + { + // Make sure events can be pumped while the menu is up. + MessageLoop::ScopedNestableTaskAllower allow(MessageLoop::current()); + + // Show the menu. + [NSMenu popUpContextMenu:menu_ + withEvent:clickEvent + forView:parent_view_]; + } } // Do things like remove the windows accelerators. diff --git a/chrome/browser/tab_contents/tab_contents_view_mac.mm b/chrome/browser/tab_contents/tab_contents_view_mac.mm index 8c1f3d6..c313493 100644 --- a/chrome/browser/tab_contents/tab_contents_view_mac.mm +++ b/chrome/browser/tab_contents/tab_contents_view_mac.mm @@ -137,12 +137,10 @@ void TabContentsViewMac::StartDragging(const WebDropData& drop_data, // The drag invokes a nested event loop, arrange to continue // processing events. - bool old_state = MessageLoop::current()->NestableTasksAllowed(); - MessageLoop::current()->SetNestableTasksAllowed(true); + MessageLoop::ScopedNestableTaskAllower allow(MessageLoop::current()); NSDragOperation mask = static_cast<NSDragOperation>(allowed_operations); [cocoa_view_ startDragWithDropData:drop_data dragOperationMask:mask]; - MessageLoop::current()->SetNestableTasksAllowed(old_state); } void TabContentsViewMac::RenderViewCreated(RenderViewHost* host) { |