diff --git a/atom/browser/api/atom_api_menu_views.cc b/atom/browser/api/atom_api_menu_views.cc index 8a72247c9d..7a5edb9621 100644 --- a/atom/browser/api/atom_api_menu_views.cc +++ b/atom/browser/api/atom_api_menu_views.cc @@ -8,14 +8,16 @@ #include "atom/browser/unresponsive_suppressor.h" #include "content/public/browser/render_widget_host_view.h" #include "ui/display/screen.h" -#include "ui/views/controls/menu/menu_runner.h" + +using views::MenuRunner; namespace atom { namespace api { MenuViews::MenuViews(v8::Isolate* isolate, v8::Local wrapper) - : Menu(isolate, wrapper) { + : Menu(isolate, wrapper), + weak_factory_(this) { } void MenuViews::PopupAt(Window* window, int x, int y, int positioning_item) { @@ -42,10 +44,11 @@ void MenuViews::PopupAt(Window* window, int x, int y, int positioning_item) { atom::UnresponsiveSuppressor suppressor; // Show the menu. - views::MenuRunner menu_runner( + menu_runner_.reset(new MenuRunner( model(), - views::MenuRunner::CONTEXT_MENU | views::MenuRunner::HAS_MNEMONICS); - ignore_result(menu_runner.RunMenuAt( + MenuRunner::CONTEXT_MENU | MenuRunner::HAS_MNEMONICS | MenuRunner::ASYNC, + base::Bind(&MenuViews::OnMenuClosed, weak_factory_.GetWeakPtr()))); + ignore_result(menu_runner_->RunMenuAt( static_cast(window->window())->widget(), NULL, gfx::Rect(location, gfx::Size()), @@ -53,6 +56,10 @@ void MenuViews::PopupAt(Window* window, int x, int y, int positioning_item) { ui::MENU_SOURCE_MOUSE)); } +void MenuViews::OnMenuClosed() { + menu_runner_.reset(); +} + // static mate::WrappableBase* Menu::New(mate::Arguments* args) { return new MenuViews(args->isolate(), args->GetThis()); diff --git a/atom/browser/api/atom_api_menu_views.h b/atom/browser/api/atom_api_menu_views.h index 1e7abd1372..c17dee3536 100644 --- a/atom/browser/api/atom_api_menu_views.h +++ b/atom/browser/api/atom_api_menu_views.h @@ -6,7 +6,9 @@ #define ATOM_BROWSER_API_ATOM_API_MENU_VIEWS_H_ #include "atom/browser/api/atom_api_menu.h" +#include "base/memory/weak_ptr.h" #include "ui/display/screen.h" +#include "ui/views/controls/menu/menu_runner.h" namespace atom { @@ -18,8 +20,12 @@ class MenuViews : public Menu { protected: void PopupAt(Window* window, int x, int y, int positioning_item) override; + void OnMenuClosed(); private: + std::unique_ptr menu_runner_; + base::WeakPtrFactory weak_factory_; + DISALLOW_COPY_AND_ASSIGN(MenuViews); };