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

Side by Side Diff: chrome/browser/ui/views/toolbar/chevron_menu_button.cc

Issue 661493004: Add infrastructure for Chrome Actions (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Sky's I Created 6 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
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 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/ui/views/toolbar/chevron_menu_button.h" 5 #include "chrome/browser/ui/views/toolbar/chevron_menu_button.h"
6 6
7 #include "base/memory/scoped_vector.h" 7 #include "base/memory/scoped_vector.h"
8 #include "base/message_loop/message_loop.h" 8 #include "base/message_loop/message_loop.h"
9 #include "base/strings/utf_string_conversions.h" 9 #include "base/strings/utf_string_conversions.h"
10 #include "chrome/browser/extensions/extension_action.h" 10 #include "chrome/browser/extensions/extension_action.h"
11 #include "chrome/browser/extensions/extension_action_icon_factory.h"
11 #include "chrome/browser/extensions/extension_context_menu_model.h" 12 #include "chrome/browser/extensions/extension_context_menu_model.h"
12 #include "chrome/browser/extensions/extension_toolbar_model.h" 13 #include "chrome/browser/extensions/extension_toolbar_model.h"
13 #include "chrome/browser/profiles/profile.h" 14 #include "chrome/browser/profiles/profile.h"
14 #include "chrome/browser/ui/browser.h" 15 #include "chrome/browser/ui/browser.h"
15 #include "chrome/browser/ui/views/extensions/browser_action_drag_data.h" 16 #include "chrome/browser/ui/views/extensions/browser_action_drag_data.h"
17 #include "chrome/browser/ui/views/extensions/extension_action_view_controller.h"
16 #include "chrome/browser/ui/views/toolbar/browser_action_view.h" 18 #include "chrome/browser/ui/views/toolbar/browser_action_view.h"
17 #include "chrome/browser/ui/views/toolbar/browser_actions_container.h" 19 #include "chrome/browser/ui/views/toolbar/browser_actions_container.h"
18 #include "extensions/browser/extension_registry.h" 20 #include "extensions/browser/extension_registry.h"
19 #include "extensions/common/extension.h" 21 #include "extensions/common/extension.h"
20 #include "extensions/common/extension_set.h" 22 #include "extensions/common/extension_set.h"
21 #include "ui/views/border.h" 23 #include "ui/views/border.h"
22 #include "ui/views/controls/button/label_button_border.h" 24 #include "ui/views/controls/button/label_button_border.h"
23 #include "ui/views/controls/menu/menu_delegate.h" 25 #include "ui/views/controls/menu/menu_delegate.h"
24 #include "ui/views/controls/menu/menu_item_view.h" 26 #include "ui/views/controls/menu/menu_item_view.h"
25 #include "ui/views/controls/menu/menu_runner.h" 27 #include "ui/views/controls/menu/menu_runner.h"
26 #include "ui/views/metrics.h" 28 #include "ui/views/metrics.h"
27 29
28 namespace { 30 namespace {
29 31
30 // In the browser actions container's chevron menu, a menu item view's icon 32 // In the browser actions container's chevron menu, a menu item view's icon
31 // comes from BrowserActionView::GetIconWithBadge() when the menu item view is 33 // comes from BrowserActionView::GetIconWithBadge() when the menu item view is
32 // created. But, the browser action's icon may not be loaded in time because it 34 // created. But, the browser action's icon may not be loaded in time because it
33 // is read from file system in another thread. 35 // is read from file system in another thread.
34 // The IconUpdater will update the menu item view's icon when the browser 36 // The IconUpdater will update the menu item view's icon when the browser
35 // action's icon has been updated. 37 // action's icon has been updated.
36 class IconUpdater : public BrowserActionView::IconObserver { 38 class IconUpdater : public ExtensionActionIconFactory::Observer {
37 public: 39 public:
38 IconUpdater(views::MenuItemView* menu_item_view, BrowserActionView* view) 40 IconUpdater(views::MenuItemView* menu_item_view,
41 ExtensionActionViewController* view_controller)
39 : menu_item_view_(menu_item_view), 42 : menu_item_view_(menu_item_view),
40 view_(view) { 43 view_controller_(view_controller) {
41 DCHECK(menu_item_view); 44 DCHECK(menu_item_view);
42 DCHECK(view); 45 DCHECK(view_controller);
43 view->set_icon_observer(this); 46 view_controller->set_icon_observer(this);
44 } 47 }
45 virtual ~IconUpdater() { 48 virtual ~IconUpdater() {
46 view_->set_icon_observer(NULL); 49 view_controller_->set_icon_observer(NULL);
47 } 50 }
48 51
49 // BrowserActionView::IconObserver: 52 // BrowserActionView::IconObserver:
50 virtual void OnIconUpdated(const gfx::ImageSkia& icon) override { 53 virtual void OnIconUpdated() override {
51 menu_item_view_->SetIcon(icon); 54 menu_item_view_->SetIcon(view_controller_->GetIconWithBadge());
52 } 55 }
53 56
54 private: 57 private:
55 // The menu item view whose icon might be updated. 58 // The menu item view whose icon might be updated.
56 views::MenuItemView* menu_item_view_; 59 views::MenuItemView* menu_item_view_;
57 60
58 // The view to be observed. When its icon changes, update the corresponding 61 // The view controller to be observed. When its icon changes, update the
59 // menu item view's icon. 62 // corresponding menu item view's icon.
60 BrowserActionView* view_; 63 ExtensionActionViewController* view_controller_;
61 64
62 DISALLOW_COPY_AND_ASSIGN(IconUpdater); 65 DISALLOW_COPY_AND_ASSIGN(IconUpdater);
63 }; 66 };
64 67
65 } // namespace 68 } // namespace
66 69
67 // This class handles the overflow menu for browser actions. 70 // This class handles the overflow menu for browser actions.
68 class ChevronMenuButton::MenuController : public views::MenuDelegate { 71 class ChevronMenuButton::MenuController : public views::MenuDelegate {
69 public: 72 public:
70 MenuController(ChevronMenuButton* owner, 73 MenuController(ChevronMenuButton* owner,
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after
152 menu_ = new views::MenuItemView(this); 155 menu_ = new views::MenuItemView(this);
153 menu_runner_.reset(new views::MenuRunner( 156 menu_runner_.reset(new views::MenuRunner(
154 menu_, for_drop_ ? views::MenuRunner::FOR_DROP : 0)); 157 menu_, for_drop_ ? views::MenuRunner::FOR_DROP : 0));
155 menu_->set_has_icons(true); 158 menu_->set_has_icons(true);
156 159
157 size_t command_id = 1; // Menu id 0 is reserved, start with 1. 160 size_t command_id = 1; // Menu id 0 is reserved, start with 1.
158 for (size_t i = start_index_; 161 for (size_t i = start_index_;
159 i < browser_actions_container_->num_browser_actions(); ++i) { 162 i < browser_actions_container_->num_browser_actions(); ++i) {
160 BrowserActionView* view = 163 BrowserActionView* view =
161 browser_actions_container_->GetBrowserActionViewAt(i); 164 browser_actions_container_->GetBrowserActionViewAt(i);
165 ExtensionActionViewController* view_controller =
166 view->GetExtensionActionViewController();
162 views::MenuItemView* menu_item = menu_->AppendMenuItemWithIcon( 167 views::MenuItemView* menu_item = menu_->AppendMenuItemWithIcon(
163 command_id, 168 command_id,
164 base::UTF8ToUTF16(view->extension()->name()), 169 base::UTF8ToUTF16(view_controller->extension()->name()),
165 view->GetIconWithBadge()); 170 view_controller->GetIconWithBadge());
166 171
167 // Set the tooltip for this item. 172 // Set the tooltip for this item.
168 base::string16 tooltip = base::UTF8ToUTF16( 173 menu_->SetTooltip(
169 view->extension_action()->GetTitle( 174 view_controller->GetTooltip(view->GetCurrentWebContents()),
170 view->view_controller()->GetCurrentTabId())); 175 command_id);
171 menu_->SetTooltip(tooltip, command_id);
172 176
173 icon_updaters_.push_back(new IconUpdater(menu_item, view)); 177 icon_updaters_.push_back(
178 new IconUpdater(menu_item, view->GetExtensionActionViewController()));
Finnur 2014/10/17 09:57:02 nit: s/view->GetExtensionActionViewController()/vi
Devlin 2014/10/17 16:33:33 Done.
174 179
175 ++command_id; 180 ++command_id;
176 } 181 }
177 } 182 }
178 183
179 ChevronMenuButton::MenuController::~MenuController() { 184 ChevronMenuButton::MenuController::~MenuController() {
180 } 185 }
181 186
182 void ChevronMenuButton::MenuController::RunMenu(views::Widget* window) { 187 void ChevronMenuButton::MenuController::RunMenu(views::Widget* window) {
183 gfx::Rect bounds = owner_->bounds(); 188 gfx::Rect bounds = owner_->bounds();
(...skipping 20 matching lines...) Expand all
204 } 209 }
205 } 210 }
206 211
207 void ChevronMenuButton::MenuController::CloseMenu() { 212 void ChevronMenuButton::MenuController::CloseMenu() {
208 menu_->Cancel(); 213 menu_->Cancel();
209 } 214 }
210 215
211 bool ChevronMenuButton::MenuController::IsCommandEnabled(int id) const { 216 bool ChevronMenuButton::MenuController::IsCommandEnabled(int id) const {
212 BrowserActionView* view = 217 BrowserActionView* view =
213 browser_actions_container_->GetBrowserActionViewAt(start_index_ + id - 1); 218 browser_actions_container_->GetBrowserActionViewAt(start_index_ + id - 1);
214 return view->IsEnabled(view->view_controller()->GetCurrentTabId()); 219 return view->view_controller()->IsEnabled(view->GetCurrentWebContents());
215 } 220 }
216 221
217 void ChevronMenuButton::MenuController::ExecuteCommand(int id) { 222 void ChevronMenuButton::MenuController::ExecuteCommand(int id) {
218 browser_actions_container_->GetBrowserActionViewAt(start_index_ + id - 1)-> 223 browser_actions_container_->GetBrowserActionViewAt(start_index_ + id - 1)->
219 view_controller()->ExecuteActionByUser(); 224 view_controller()->ExecuteActionByUser();
220 } 225 }
221 226
222 bool ChevronMenuButton::MenuController::ShowContextMenu( 227 bool ChevronMenuButton::MenuController::ShowContextMenu(
223 views::MenuItemView* source, 228 views::MenuItemView* source,
224 int id, 229 int id,
225 const gfx::Point& p, 230 const gfx::Point& p,
226 ui::MenuSourceType source_type) { 231 ui::MenuSourceType source_type) {
227 BrowserActionView* view = browser_actions_container_->GetBrowserActionViewAt( 232 BrowserActionView* view = browser_actions_container_->GetBrowserActionViewAt(
228 start_index_ + id - 1); 233 start_index_ + id - 1);
229 if (!view->extension()->ShowConfigureContextMenus()) 234 ExtensionActionViewController* view_controller =
235 view->GetExtensionActionViewController();
236 if (!view_controller->extension()->ShowConfigureContextMenus())
230 return false; 237 return false;
231 238
232 scoped_refptr<ExtensionContextMenuModel> context_menu_contents = 239 scoped_refptr<ExtensionContextMenuModel> context_menu_contents =
233 new ExtensionContextMenuModel(view->extension(), 240 new ExtensionContextMenuModel(view_controller->extension(),
234 view->view_controller()->browser(), 241 view->browser(),
235 view->view_controller()); 242 view_controller);
236 views::MenuRunner context_menu_runner(context_menu_contents.get(), 243 views::MenuRunner context_menu_runner(context_menu_contents.get(),
237 views::MenuRunner::HAS_MNEMONICS | 244 views::MenuRunner::HAS_MNEMONICS |
238 views::MenuRunner::IS_NESTED | 245 views::MenuRunner::IS_NESTED |
239 views::MenuRunner::CONTEXT_MENU); 246 views::MenuRunner::CONTEXT_MENU);
240 247
241 // We can ignore the result as we delete ourself. 248 // We can ignore the result as we delete ourself.
242 // This blocks until the user chooses something or dismisses the menu. 249 // This blocks until the user chooses something or dismisses the menu.
243 if (context_menu_runner.RunMenuAt(owner_->GetWidget(), 250 if (context_menu_runner.RunMenuAt(owner_->GetWidget(),
244 NULL, 251 NULL,
245 gfx::Rect(p, gfx::Size()), 252 gfx::Rect(p, gfx::Size()),
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after
334 } 341 }
335 342
336 bool ChevronMenuButton::MenuController::CanDrag(views::MenuItemView* menu) { 343 bool ChevronMenuButton::MenuController::CanDrag(views::MenuItemView* menu) {
337 return true; 344 return true;
338 } 345 }
339 346
340 void ChevronMenuButton::MenuController::WriteDragData( 347 void ChevronMenuButton::MenuController::WriteDragData(
341 views::MenuItemView* sender, OSExchangeData* data) { 348 views::MenuItemView* sender, OSExchangeData* data) {
342 size_t drag_index = IndexForId(sender->GetCommand()); 349 size_t drag_index = IndexForId(sender->GetCommand());
343 const extensions::Extension* extension = 350 const extensions::Extension* extension =
344 browser_actions_container_->GetBrowserActionViewAt(drag_index)-> 351 browser_actions_container_->GetExtensionAt(drag_index);
345 extension();
346 BrowserActionDragData drag_data(extension->id(), drag_index); 352 BrowserActionDragData drag_data(extension->id(), drag_index);
347 drag_data.Write(browser_actions_container_->profile(), data); 353 drag_data.Write(browser_actions_container_->profile(), data);
348 } 354 }
349 355
350 int ChevronMenuButton::MenuController::GetDragOperations( 356 int ChevronMenuButton::MenuController::GetDragOperations(
351 views::MenuItemView* sender) { 357 views::MenuItemView* sender) {
352 return ui::DragDropTypes::DRAG_MOVE; 358 return ui::DragDropTypes::DRAG_MOVE;
353 } 359 }
354 360
355 size_t ChevronMenuButton::MenuController::IndexForId(int id) const { 361 size_t ChevronMenuButton::MenuController::IndexForId(int id) const {
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after
431 void ChevronMenuButton::ShowOverflowMenu(bool for_drop) { 437 void ChevronMenuButton::ShowOverflowMenu(bool for_drop) {
432 DCHECK(!menu_controller_); 438 DCHECK(!menu_controller_);
433 menu_controller_.reset(new MenuController( 439 menu_controller_.reset(new MenuController(
434 this, browser_actions_container_, for_drop)); 440 this, browser_actions_container_, for_drop));
435 menu_controller_->RunMenu(GetWidget()); 441 menu_controller_->RunMenu(GetWidget());
436 } 442 }
437 443
438 void ChevronMenuButton::MenuDone() { 444 void ChevronMenuButton::MenuDone() {
439 menu_controller_.reset(); 445 menu_controller_.reset();
440 } 446 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698