Skip to content

Commit d89780e

Browse files
committed
Fix nwjs#2595: Linux MenuBar crash
1 parent e588e11 commit d89780e

File tree

4 files changed

+43
-23
lines changed

4 files changed

+43
-23
lines changed

src/browser/menubar_controller.cc

Lines changed: 33 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,31 @@
11
#include "content/nw/src/browser/menubar_controller.h"
22

3+
#include "base/stl_util.h"
34
#include "content/nw/src/browser/menubar_view.h"
5+
#include "ui/views/controls/button/menu_button.h"
46
#include "ui/views/controls/menu/menu_item_view.h"
7+
#include "ui/views/widget/widget.h"
58

69
namespace nw {
710

811
MenuBarController::ModelToMenuMap MenuBarController::model_to_menu_map_;
12+
MenuBarController* MenuBarController::master_;
913

10-
MenuBarController::MenuBarController(MenuBarView* menubar, ui::MenuModel* menu_model)
14+
MenuBarController::MenuBarController(MenuBarView* menubar, ui::MenuModel* menu_model, MenuBarController* master)
1115
:MenuModelAdapter(menu_model), menubar_(menubar) {
16+
17+
views::MenuItemView* menu = MenuBarController::CreateMenu(menubar, menu_model, this);
18+
if (!master) {
19+
master_ = this;
20+
menu_runner_.reset(new views::MenuRunner(menu, views::MenuRunner::HAS_MNEMONICS));
21+
}
1222
}
1323

1424
MenuBarController::~MenuBarController() {
25+
if (master_ == this) {
26+
STLDeleteElements(&controllers_);
27+
model_to_menu_map_.clear();
28+
}
1529
}
1630

1731
views::MenuItemView* MenuBarController::GetSiblingMenu(
@@ -30,19 +44,33 @@ views::MenuItemView* MenuBarController::GetSiblingMenu(
3044

3145
*has_mnemonics = false;
3246
*anchor = views::MENU_ANCHOR_TOPLEFT;
33-
if (!model_to_menu_map_[model])
34-
CreateMenu(menubar_, model);
47+
if (!model_to_menu_map_[model]) {
48+
MenuBarController* controller = new MenuBarController(menubar_, model, master_);
49+
CreateMenu(menubar_, model, controller);
50+
controllers_.push_back(controller);
51+
}
3552

3653
return model_to_menu_map_[model];
3754
}
3855

39-
views::MenuItemView* MenuBarController::CreateMenu(MenuBarView* menubar, ui::MenuModel* model) {
40-
MenuBarController* controller = new MenuBarController(menubar, model);
56+
views::MenuItemView* MenuBarController::CreateMenu(MenuBarView* menubar,
57+
ui::MenuModel* model,
58+
MenuBarController* controller) {
4159
views::MenuItemView* menu = new views::MenuItemView(controller);
4260
controller->BuildMenu(menu);
4361
model_to_menu_map_[model] = menu;
4462

4563
return menu;
4664
}
4765

66+
void MenuBarController::RunMenuAt(views::View* view, const gfx::Point& point) {
67+
68+
ignore_result(menu_runner_->RunMenuAt(view->GetWidget()->GetTopLevelWidget(),
69+
static_cast<views::MenuButton*>(view),
70+
gfx::Rect(point, gfx::Size()),
71+
views::MENU_ANCHOR_TOPRIGHT,
72+
ui::MENU_SOURCE_NONE));
73+
delete this;
74+
}
75+
4876
} //namespace nw

src/browser/menubar_controller.h

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22
#define NW_BROWSER_MENUBAR_CONTROLLER_H
33

44
#include "ui/views/controls/menu/menu_model_adapter.h"
5+
#include "ui/views/controls/menu/menu_runner.h"
6+
#include "ui/views/view.h"
57

68
#include <map>
79

@@ -14,10 +16,11 @@ class MenuBarView;
1416

1517
class MenuBarController : public views::MenuModelAdapter {
1618
public:
17-
MenuBarController(MenuBarView* menubar, ui::MenuModel* menu_model);
19+
MenuBarController(MenuBarView* menubar, ui::MenuModel* menu_model, MenuBarController* master);
1820
virtual ~MenuBarController();
1921

20-
static views::MenuItemView* CreateMenu(MenuBarView* menubar, ui::MenuModel* model);
22+
static views::MenuItemView* CreateMenu(MenuBarView* menubar, ui::MenuModel* model, MenuBarController* controller);
23+
void RunMenuAt(views::View* view, const gfx::Point& point);
2124

2225
virtual views::MenuItemView* GetSiblingMenu(
2326
views::MenuItemView* menu,
@@ -30,7 +33,10 @@ class MenuBarController : public views::MenuModelAdapter {
3033
typedef std::map<const ui::MenuModel*, views::MenuItemView*> ModelToMenuMap;
3134

3235
MenuBarView* menubar_;
36+
scoped_ptr<views::MenuRunner> menu_runner_;
37+
std::vector<MenuBarController*> controllers_;
3338
static ModelToMenuMap model_to_menu_map_;
39+
static MenuBarController* master_;
3440

3541
DISALLOW_COPY_AND_ASSIGN(MenuBarController);
3642
};

src/browser/menubar_view.cc

Lines changed: 2 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@
1010
#include "ui/base/window_open_disposition.h"
1111
#include "ui/gfx/text_elider.h"
1212
#include "ui/views/controls/button/menu_button.h"
13-
#include "ui/views/controls/menu/menu_runner.h"
1413
#include "ui/views/layout/box_layout.h"
1514
#include "ui/views/widget/widget.h"
1615

@@ -112,20 +111,8 @@ void MenuBarView::OnMenuButtonClicked(views::View* view,
112111
DCHECK_NE(-1, button_index);
113112
ui::MenuModel::ItemType type = model_->GetTypeAt(button_index);
114113
if (type == ui::MenuModel::TYPE_SUBMENU) {
115-
views::MenuItemView* menu = MenuBarController::CreateMenu(this, model_->GetSubmenuModelAt(button_index));
116-
menu_runner_.reset(new MenuRunner(menu, MenuRunner::HAS_MNEMONICS));
117-
118-
// menu_runner_.reset(new MenuRunner(model_->GetSubmenuModelAt(button_index),
119-
// MenuRunner::HAS_MNEMONICS));
120-
121-
if (menu_runner_->RunMenuAt(GetWidget()->GetTopLevelWidget(),
122-
static_cast<views::MenuButton*>(view),
123-
gfx::Rect(point, gfx::Size()),
124-
views::MENU_ANCHOR_TOPRIGHT,
125-
ui::MENU_SOURCE_NONE) ==
126-
MenuRunner::MENU_DELETED) {
127-
return;
128-
}
114+
MenuBarController* controller = new MenuBarController(this, model_->GetSubmenuModelAt(button_index), NULL);
115+
controller->RunMenuAt(view, point);
129116
}
130117
}
131118

src/browser/menubar_view.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,6 @@ class MenuBarView :
5959

6060
private:
6161
ui::MenuModel* model_;
62-
scoped_ptr<views::MenuRunner> menu_runner_;
6362
DISALLOW_COPY_AND_ASSIGN(MenuBarView);
6463
};
6564
} //namespace nw

0 commit comments

Comments
 (0)