Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(243)

Side by Side Diff: chrome/browser/views/bookmark_menu_controller_views.cc

Issue 328012: Makes it so that when a folder is open on the bookmark bar and the... (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: '' Created 11 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2009 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2009 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chrome/browser/views/bookmark_menu_controller_views.h" 5 #include "chrome/browser/views/bookmark_menu_controller_views.h"
6 6
7 #include "app/l10n_util.h" 7 #include "app/l10n_util.h"
8 #include "app/os_exchange_data.h" 8 #include "app/os_exchange_data.h"
9 #include "app/resource_bundle.h" 9 #include "app/resource_bundle.h"
10 #include "base/stl_util-inl.h"
10 #include "chrome/browser/bookmarks/bookmark_drag_data.h" 11 #include "chrome/browser/bookmarks/bookmark_drag_data.h"
11 #include "chrome/browser/bookmarks/bookmark_utils.h" 12 #include "chrome/browser/bookmarks/bookmark_utils.h"
12 #include "chrome/browser/metrics/user_metrics.h" 13 #include "chrome/browser/metrics/user_metrics.h"
13 #include "chrome/browser/profile.h" 14 #include "chrome/browser/profile.h"
14 #include "chrome/browser/tab_contents/page_navigator.h" 15 #include "chrome/browser/tab_contents/page_navigator.h"
16 #include "chrome/browser/views/bookmark_bar_view.h"
15 #include "chrome/browser/views/event_utils.h" 17 #include "chrome/browser/views/event_utils.h"
16 #include "chrome/common/page_transition_types.h" 18 #include "chrome/common/page_transition_types.h"
17 #include "grit/app_resources.h" 19 #include "grit/app_resources.h"
18 #include "grit/generated_resources.h" 20 #include "grit/generated_resources.h"
19 #include "grit/theme_resources.h" 21 #include "grit/theme_resources.h"
22 #include "views/controls/button/menu_button.h"
23
24 using views::MenuItemView;
20 25
21 BookmarkMenuController::BookmarkMenuController(Browser* browser, 26 BookmarkMenuController::BookmarkMenuController(Browser* browser,
22 Profile* profile, 27 Profile* profile,
23 PageNavigator* navigator, 28 PageNavigator* navigator,
24 gfx::NativeWindow parent, 29 gfx::NativeWindow parent,
25 const BookmarkNode* node, 30 const BookmarkNode* node,
26 int start_child_index, 31 int start_child_index,
27 bool show_other_folder) 32 bool show_other_folder)
28 : browser_(browser), 33 : browser_(browser),
29 profile_(profile), 34 profile_(profile),
30 page_navigator_(navigator), 35 page_navigator_(navigator),
31 parent_(parent), 36 parent_(parent),
32 node_(node), 37 node_(node),
38 menu_(NULL),
33 observer_(NULL), 39 observer_(NULL),
34 for_drop_(false), 40 for_drop_(false),
35 show_other_folder_(show_other_folder) { 41 show_other_folder_(show_other_folder),
36 menu_.reset(new views::MenuItemView(this)); 42 bookmark_bar_(NULL),
37 int next_menu_id = 1; 43 next_menu_id_(1) {
38 menu_id_to_node_map_[menu_->GetCommand()] = node; 44 menu_ = CreateMenu(node, start_child_index);
39 menu_->set_has_icons(true); 45 }
40 BuildMenu(node, start_child_index, menu_.get(), &next_menu_id); 46
41 if (show_other_folder) 47 void BookmarkMenuController::RunMenuAt(BookmarkBarView* bookmark_bar,
42 BuildOtherFolderMenu(&next_menu_id); 48 bool for_drop) {
49 bookmark_bar_ = bookmark_bar;
50 views::MenuButton* menu_button = bookmark_bar_->GetMenuButtonForNode(node_);
51 DCHECK(menu_button);
52 MenuItemView::AnchorPosition anchor;
53 int start_index;
54 bookmark_bar_->GetAnchorPositionAndStartIndexForButton(
55 menu_button, &anchor, &start_index);
56 RunMenuAt(menu_button, anchor, for_drop);
43 } 57 }
44 58
45 void BookmarkMenuController::RunMenuAt( 59 void BookmarkMenuController::RunMenuAt(
46 const gfx::Rect& bounds, 60 views::MenuButton* button,
47 views::MenuItemView::AnchorPosition position, 61 MenuItemView::AnchorPosition position,
48 bool for_drop) { 62 bool for_drop) {
63 gfx::Point screen_loc;
64 views::View::ConvertPointToScreen(button, &screen_loc);
65 // Subtract 1 from the height to make the popup flush with the button border.
66 gfx::Rect bounds(screen_loc.x(), screen_loc.y(), button->width(),
67 button->height() - 1);
49 for_drop_ = for_drop; 68 for_drop_ = for_drop;
50 profile_->GetBookmarkModel()->AddObserver(this); 69 profile_->GetBookmarkModel()->AddObserver(this);
70 // The constructor creates the initial menu and that is all we should have
71 // at this point.
72 DCHECK(node_to_menu_map_.size() == 1);
51 if (for_drop) { 73 if (for_drop) {
52 menu_->RunMenuForDropAt(parent_, bounds, position); 74 menu_->RunMenuForDropAt(parent_, bounds, position);
53 } else { 75 } else {
54 menu_->RunMenuAt(parent_, bounds, position, false); 76 menu_->RunMenuAt(parent_, button, bounds, position, false);
55 delete this; 77 delete this;
56 } 78 }
57 } 79 }
58 80
59 void BookmarkMenuController::Cancel() { 81 void BookmarkMenuController::Cancel() {
60 menu_->Cancel(); 82 menu_->Cancel();
61 } 83 }
62 84
63 bool BookmarkMenuController::IsTriggerableEvent(const views::MouseEvent& e) { 85 bool BookmarkMenuController::IsTriggerableEvent(const views::MouseEvent& e) {
64 return event_utils::IsPossibleDispositionEvent(e); 86 return event_utils::IsPossibleDispositionEvent(e);
65 } 87 }
66 88
67 void BookmarkMenuController::ExecuteCommand(int id, int mouse_event_flags) { 89 void BookmarkMenuController::ExecuteCommand(int id, int mouse_event_flags) {
68 DCHECK(page_navigator_); 90 DCHECK(page_navigator_);
69 DCHECK(menu_id_to_node_map_.find(id) != menu_id_to_node_map_.end()); 91 DCHECK(menu_id_to_node_map_.find(id) != menu_id_to_node_map_.end());
70 GURL url = menu_id_to_node_map_[id]->GetURL(); 92 GURL url = menu_id_to_node_map_[id]->GetURL();
71 page_navigator_->OpenURL( 93 page_navigator_->OpenURL(
72 url, GURL(), event_utils::DispositionFromEventFlags(mouse_event_flags), 94 url, GURL(), event_utils::DispositionFromEventFlags(mouse_event_flags),
73 PageTransition::AUTO_BOOKMARK); 95 PageTransition::AUTO_BOOKMARK);
74 } 96 }
75 97
76 bool BookmarkMenuController::GetDropFormats( 98 bool BookmarkMenuController::GetDropFormats(
77 views::MenuItemView* menu, 99 MenuItemView* menu,
78 int* formats, 100 int* formats,
79 std::set<OSExchangeData::CustomFormat>* custom_formats) { 101 std::set<OSExchangeData::CustomFormat>* custom_formats) {
80 *formats = OSExchangeData::URL; 102 *formats = OSExchangeData::URL;
81 custom_formats->insert(BookmarkDragData::GetBookmarkCustomFormat()); 103 custom_formats->insert(BookmarkDragData::GetBookmarkCustomFormat());
82 return true; 104 return true;
83 } 105 }
84 106
85 bool BookmarkMenuController::AreDropTypesRequired(views::MenuItemView* menu) { 107 bool BookmarkMenuController::AreDropTypesRequired(MenuItemView* menu) {
86 return true; 108 return true;
87 } 109 }
88 110
89 bool BookmarkMenuController::CanDrop(views::MenuItemView* menu, 111 bool BookmarkMenuController::CanDrop(MenuItemView* menu,
90 const OSExchangeData& data) { 112 const OSExchangeData& data) {
91 // Only accept drops of 1 node, which is the case for all data dragged from 113 // Only accept drops of 1 node, which is the case for all data dragged from
92 // bookmark bar and menus. 114 // bookmark bar and menus.
93 115
94 if (!drop_data_.Read(data) || drop_data_.elements.size() != 1) 116 if (!drop_data_.Read(data) || drop_data_.elements.size() != 1)
95 return false; 117 return false;
96 118
97 if (drop_data_.has_single_url()) 119 if (drop_data_.has_single_url())
98 return true; 120 return true;
99 121
100 const BookmarkNode* drag_node = drop_data_.GetFirstNode(profile_); 122 const BookmarkNode* drag_node = drop_data_.GetFirstNode(profile_);
101 if (!drag_node) { 123 if (!drag_node) {
102 // Dragging a group from another profile, always accept. 124 // Dragging a group from another profile, always accept.
103 return true; 125 return true;
104 } 126 }
105 127
106 // Drag originated from same profile and is not a URL. Only accept it if 128 // Drag originated from same profile and is not a URL. Only accept it if
107 // the dragged node is not a parent of the node menu represents. 129 // the dragged node is not a parent of the node menu represents.
108 const BookmarkNode* drop_node = menu_id_to_node_map_[menu->GetCommand()]; 130 const BookmarkNode* drop_node = menu_id_to_node_map_[menu->GetCommand()];
109 DCHECK(drop_node); 131 DCHECK(drop_node);
110 while (drop_node && drop_node != drag_node) 132 while (drop_node && drop_node != drag_node)
111 drop_node = drop_node->GetParent(); 133 drop_node = drop_node->GetParent();
112 return (drop_node == NULL); 134 return (drop_node == NULL);
113 } 135 }
114 136
115 int BookmarkMenuController::GetDropOperation( 137 int BookmarkMenuController::GetDropOperation(
116 views::MenuItemView* item, 138 MenuItemView* item,
117 const views::DropTargetEvent& event, 139 const views::DropTargetEvent& event,
118 DropPosition* position) { 140 DropPosition* position) {
119 // Should only get here if we have drop data. 141 // Should only get here if we have drop data.
120 DCHECK(drop_data_.is_valid()); 142 DCHECK(drop_data_.is_valid());
121 143
122 const BookmarkNode* node = menu_id_to_node_map_[item->GetCommand()]; 144 const BookmarkNode* node = menu_id_to_node_map_[item->GetCommand()];
123 const BookmarkNode* drop_parent = node->GetParent(); 145 const BookmarkNode* drop_parent = node->GetParent();
124 int index_to_drop_at = drop_parent->IndexOfChild(node); 146 int index_to_drop_at = drop_parent->IndexOfChild(node);
125 if (*position == DROP_AFTER) { 147 if (*position == DROP_AFTER) {
126 if (node == profile_->GetBookmarkModel()->other_node()) { 148 if (node == profile_->GetBookmarkModel()->other_node()) {
127 // The other folder is shown after all bookmarks on the bookmark bar. 149 // The other folder is shown after all bookmarks on the bookmark bar.
128 // Dropping after the other folder makes no sense. 150 // Dropping after the other folder makes no sense.
129 *position = DROP_NONE; 151 *position = DROP_NONE;
130 } 152 }
131 index_to_drop_at++; 153 index_to_drop_at++;
132 } else if (*position == DROP_ON) { 154 } else if (*position == DROP_ON) {
133 drop_parent = node; 155 drop_parent = node;
134 index_to_drop_at = node->GetChildCount(); 156 index_to_drop_at = node->GetChildCount();
135 } 157 }
136 DCHECK(drop_parent); 158 DCHECK(drop_parent);
137 return bookmark_utils::BookmarkDropOperation( 159 return bookmark_utils::BookmarkDropOperation(
138 profile_, event, drop_data_, drop_parent, index_to_drop_at); 160 profile_, event, drop_data_, drop_parent, index_to_drop_at);
139 } 161 }
140 162
141 int BookmarkMenuController::OnPerformDrop(views::MenuItemView* menu, 163 int BookmarkMenuController::OnPerformDrop(MenuItemView* menu,
142 DropPosition position, 164 DropPosition position,
143 const views::DropTargetEvent& event) { 165 const views::DropTargetEvent& event) {
144 const BookmarkNode* drop_node = menu_id_to_node_map_[menu->GetCommand()]; 166 const BookmarkNode* drop_node = menu_id_to_node_map_[menu->GetCommand()];
145 DCHECK(drop_node); 167 DCHECK(drop_node);
146 BookmarkModel* model = profile_->GetBookmarkModel(); 168 BookmarkModel* model = profile_->GetBookmarkModel();
147 DCHECK(model); 169 DCHECK(model);
148 const BookmarkNode* drop_parent = drop_node->GetParent(); 170 const BookmarkNode* drop_parent = drop_node->GetParent();
149 DCHECK(drop_parent); 171 DCHECK(drop_parent);
150 int index_to_drop_at = drop_parent->IndexOfChild(drop_node); 172 int index_to_drop_at = drop_parent->IndexOfChild(drop_node);
151 if (position == DROP_AFTER) { 173 if (position == DROP_AFTER) {
152 index_to_drop_at++; 174 index_to_drop_at++;
153 } else if (position == DROP_ON) { 175 } else if (position == DROP_ON) {
154 DCHECK(drop_node->is_folder()); 176 DCHECK(drop_node->is_folder());
155 drop_parent = drop_node; 177 drop_parent = drop_node;
156 index_to_drop_at = drop_node->GetChildCount(); 178 index_to_drop_at = drop_node->GetChildCount();
157 } 179 }
158 180
159 int result = bookmark_utils::PerformBookmarkDrop( 181 int result = bookmark_utils::PerformBookmarkDrop(
160 profile_, drop_data_, drop_parent, index_to_drop_at); 182 profile_, drop_data_, drop_parent, index_to_drop_at);
161 if (for_drop_) 183 if (for_drop_)
162 delete this; 184 delete this;
163 return result; 185 return result;
164 } 186 }
165 187
166 bool BookmarkMenuController::ShowContextMenu(views::MenuItemView* source, 188 bool BookmarkMenuController::ShowContextMenu(MenuItemView* source,
167 int id, 189 int id,
168 int x, 190 int x,
169 int y, 191 int y,
170 bool is_mouse_gesture) { 192 bool is_mouse_gesture) {
171 DCHECK(menu_id_to_node_map_.find(id) != menu_id_to_node_map_.end()); 193 DCHECK(menu_id_to_node_map_.find(id) != menu_id_to_node_map_.end());
172 std::vector<const BookmarkNode*> nodes; 194 std::vector<const BookmarkNode*> nodes;
173 nodes.push_back(menu_id_to_node_map_[id]); 195 nodes.push_back(menu_id_to_node_map_[id]);
174 context_menu_.reset( 196 context_menu_.reset(
175 new BookmarkContextMenu(parent_, 197 new BookmarkContextMenu(parent_,
176 profile_, 198 profile_,
177 page_navigator_, 199 page_navigator_,
178 nodes[0]->GetParent(), 200 nodes[0]->GetParent(),
179 nodes, 201 nodes,
180 BookmarkContextMenuController::BOOKMARK_BAR)); 202 BookmarkContextMenuController::BOOKMARK_BAR));
181 context_menu_->RunMenuAt(gfx::Point(x, y)); 203 context_menu_->RunMenuAt(gfx::Point(x, y));
182 context_menu_.reset(NULL); 204 context_menu_.reset(NULL);
183 return true; 205 return true;
184 } 206 }
185 207
186 void BookmarkMenuController::DropMenuClosed(views::MenuItemView* menu) { 208 void BookmarkMenuController::DropMenuClosed(MenuItemView* menu) {
187 delete this; 209 delete this;
188 } 210 }
189 211
190 bool BookmarkMenuController::CanDrag(views::MenuItemView* menu) { 212 bool BookmarkMenuController::CanDrag(MenuItemView* menu) {
191 const BookmarkNode* node = menu_id_to_node_map_[menu->GetCommand()]; 213 const BookmarkNode* node = menu_id_to_node_map_[menu->GetCommand()];
192 // Don't let users drag the other folder. 214 // Don't let users drag the other folder.
193 return node->GetParent() != profile_->GetBookmarkModel()->root_node(); 215 return node->GetParent() != profile_->GetBookmarkModel()->root_node();
194 } 216 }
195 217
196 void BookmarkMenuController::WriteDragData(views::MenuItemView* sender, 218 void BookmarkMenuController::WriteDragData(MenuItemView* sender,
197 OSExchangeData* data) { 219 OSExchangeData* data) {
198 DCHECK(sender && data); 220 DCHECK(sender && data);
199 221
200 UserMetrics::RecordAction(L"BookmarkBar_DragFromFolder", profile_); 222 UserMetrics::RecordAction(L"BookmarkBar_DragFromFolder", profile_);
201 223
202 BookmarkDragData drag_data(menu_id_to_node_map_[sender->GetCommand()]); 224 BookmarkDragData drag_data(menu_id_to_node_map_[sender->GetCommand()]);
203 drag_data.Write(profile_, data); 225 drag_data.Write(profile_, data);
204 } 226 }
205 227
206 int BookmarkMenuController::GetDragOperations(views::MenuItemView* sender) { 228 int BookmarkMenuController::GetDragOperations(MenuItemView* sender) {
207 return bookmark_utils::BookmarkDragOperation( 229 return bookmark_utils::BookmarkDragOperation(
208 menu_id_to_node_map_[sender->GetCommand()]); 230 menu_id_to_node_map_[sender->GetCommand()]);
209 } 231 }
210 232
233 views::MenuItemView* BookmarkMenuController::GetSiblingMenu(
234 views::MenuItemView* menu,
235 const gfx::Point& screen_point,
236 views::MenuItemView::AnchorPosition* anchor,
237 bool* has_mnemonics,
238 views::MenuButton** button) {
239 if (show_other_folder_ || !bookmark_bar_ || for_drop_)
240 return NULL;
241 gfx::Point bookmark_bar_loc(screen_point);
242 views::View::ConvertPointToView(NULL, bookmark_bar_, &bookmark_bar_loc);
243 int start_index;
244 const BookmarkNode* node =
245 bookmark_bar_->GetNodeForButtonAt(bookmark_bar_loc, &start_index);
246 if (!node || !node->is_folder())
247 return NULL;
248
249 MenuItemView* alt_menu = node_to_menu_map_[node];
250 if (!alt_menu)
251 alt_menu = CreateMenu(node, start_index);
252
253 if (alt_menu)
254 menu_ = alt_menu;
255
256 *button = bookmark_bar_->GetMenuButtonForNode(node);
257 bookmark_bar_->GetAnchorPositionAndStartIndexForButton(
258 *button, anchor, &start_index);
259 *has_mnemonics = false;
260 return alt_menu;
261 }
262
211 void BookmarkMenuController::BookmarkModelChanged() { 263 void BookmarkMenuController::BookmarkModelChanged() {
212 menu_->Cancel(); 264 menu_->Cancel();
213 } 265 }
214 266
215 void BookmarkMenuController::BookmarkNodeFavIconLoaded( 267 void BookmarkMenuController::BookmarkNodeFavIconLoaded(
216 BookmarkModel* model, const BookmarkNode* node) { 268 BookmarkModel* model, const BookmarkNode* node) {
217 if (node_to_menu_id_map_.find(node) != node_to_menu_id_map_.end()) 269 if (node_to_menu_id_map_.find(node) != node_to_menu_id_map_.end())
218 menu_->SetIcon(model->GetFavIcon(node), node_to_menu_id_map_[node]); 270 menu_->SetIcon(model->GetFavIcon(node), node_to_menu_id_map_[node]);
219 } 271 }
220 272
221 void BookmarkMenuController::BuildOtherFolderMenu(int* next_menu_id) { 273 MenuItemView* BookmarkMenuController::CreateMenu(const BookmarkNode* parent,
274 int start_child_index) {
275 MenuItemView* menu = new MenuItemView(this);
276 menu->SetCommand(next_menu_id_++);
277 menu_id_to_node_map_[menu->GetCommand()] = parent;
278 menu->set_has_icons(true);
279 BuildMenu(parent, start_child_index, menu, &next_menu_id_);
280 if (show_other_folder_)
281 BuildOtherFolderMenu(menu, &next_menu_id_);
282 node_to_menu_map_[parent] = menu;
283 return menu;
284 }
285
286 void BookmarkMenuController::BuildOtherFolderMenu(
287 MenuItemView* menu, int* next_menu_id) {
222 const BookmarkNode* other_folder = profile_->GetBookmarkModel()->other_node(); 288 const BookmarkNode* other_folder = profile_->GetBookmarkModel()->other_node();
223 int id = *next_menu_id; 289 int id = *next_menu_id;
224 (*next_menu_id)++; 290 (*next_menu_id)++;
225 SkBitmap* folder_icon = ResourceBundle::GetSharedInstance(). 291 SkBitmap* folder_icon = ResourceBundle::GetSharedInstance().
226 GetBitmapNamed(IDR_BOOKMARK_BAR_FOLDER); 292 GetBitmapNamed(IDR_BOOKMARK_BAR_FOLDER);
227 views::MenuItemView* submenu = menu_->AppendSubMenuWithIcon( 293 MenuItemView* submenu = menu->AppendSubMenuWithIcon(
228 id, l10n_util::GetString(IDS_BOOMARK_BAR_OTHER_BOOKMARKED), *folder_icon); 294 id, l10n_util::GetString(IDS_BOOMARK_BAR_OTHER_BOOKMARKED), *folder_icon);
229 BuildMenu(other_folder, 0, submenu, next_menu_id); 295 BuildMenu(other_folder, 0, submenu, next_menu_id);
230 menu_id_to_node_map_[id] = other_folder; 296 menu_id_to_node_map_[id] = other_folder;
231 } 297 }
232 298
233 void BookmarkMenuController::BuildMenu(const BookmarkNode* parent, 299 void BookmarkMenuController::BuildMenu(const BookmarkNode* parent,
234 int start_child_index, 300 int start_child_index,
235 views::MenuItemView* menu, 301 MenuItemView* menu,
236 int* next_menu_id) { 302 int* next_menu_id) {
237 DCHECK(!parent->GetChildCount() || 303 DCHECK(!parent->GetChildCount() ||
238 start_child_index < parent->GetChildCount()); 304 start_child_index < parent->GetChildCount());
239 for (int i = start_child_index; i < parent->GetChildCount(); ++i) { 305 for (int i = start_child_index; i < parent->GetChildCount(); ++i) {
240 const BookmarkNode* node = parent->GetChild(i); 306 const BookmarkNode* node = parent->GetChild(i);
241 int id = *next_menu_id; 307 int id = *next_menu_id;
242 308
243 (*next_menu_id)++; 309 (*next_menu_id)++;
244 if (node->is_url()) { 310 if (node->is_url()) {
245 SkBitmap icon = profile_->GetBookmarkModel()->GetFavIcon(node); 311 SkBitmap icon = profile_->GetBookmarkModel()->GetFavIcon(node);
246 if (icon.width() == 0) { 312 if (icon.width() == 0) {
247 icon = *ResourceBundle::GetSharedInstance(). 313 icon = *ResourceBundle::GetSharedInstance().
248 GetBitmapNamed(IDR_DEFAULT_FAVICON); 314 GetBitmapNamed(IDR_DEFAULT_FAVICON);
249 } 315 }
250 menu->AppendMenuItemWithIcon(id, node->GetTitle(), icon); 316 menu->AppendMenuItemWithIcon(id, node->GetTitle(), icon);
251 node_to_menu_id_map_[node] = id; 317 node_to_menu_id_map_[node] = id;
252 } else if (node->is_folder()) { 318 } else if (node->is_folder()) {
253 SkBitmap* folder_icon = ResourceBundle::GetSharedInstance(). 319 SkBitmap* folder_icon = ResourceBundle::GetSharedInstance().
254 GetBitmapNamed(IDR_BOOKMARK_BAR_FOLDER); 320 GetBitmapNamed(IDR_BOOKMARK_BAR_FOLDER);
255 views::MenuItemView* submenu = 321 MenuItemView* submenu =
256 menu->AppendSubMenuWithIcon(id, node->GetTitle(), *folder_icon); 322 menu->AppendSubMenuWithIcon(id, node->GetTitle(), *folder_icon);
257 BuildMenu(node, 0, submenu, next_menu_id); 323 BuildMenu(node, 0, submenu, next_menu_id);
258 } else { 324 } else {
259 NOTREACHED(); 325 NOTREACHED();
260 } 326 }
261 menu_id_to_node_map_[id] = node; 327 menu_id_to_node_map_[id] = node;
262 } 328 }
263 } 329 }
264 330
265 BookmarkMenuController::~BookmarkMenuController() { 331 BookmarkMenuController::~BookmarkMenuController() {
266 profile_->GetBookmarkModel()->RemoveObserver(this); 332 profile_->GetBookmarkModel()->RemoveObserver(this);
267 if (observer_) 333 if (observer_)
268 observer_->BookmarkMenuDeleted(this); 334 observer_->BookmarkMenuDeleted(this);
335 STLDeleteValues(&node_to_menu_map_);
269 } 336 }
OLDNEW
« no previous file with comments | « chrome/browser/views/bookmark_menu_controller_views.h ('k') | views/controls/button/menu_button.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698