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

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

Issue 661493004: Add infrastructure for Chrome Actions (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: 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 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 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/browser_actions_container.h" 5 #include "chrome/browser/ui/views/toolbar/browser_actions_container.h"
6 6
7 #include "base/compiler_specific.h" 7 #include "base/compiler_specific.h"
8 #include "base/stl_util.h" 8 #include "base/stl_util.h"
9 #include "chrome/browser/extensions/extension_action_manager.h" 9 #include "chrome/browser/extensions/extension_action_manager.h"
10 #include "chrome/browser/extensions/tab_helper.h" 10 #include "chrome/browser/extensions/tab_helper.h"
11 #include "chrome/browser/profiles/profile.h" 11 #include "chrome/browser/profiles/profile.h"
12 #include "chrome/browser/ui/browser.h" 12 #include "chrome/browser/ui/browser.h"
13 #include "chrome/browser/ui/browser_window.h" 13 #include "chrome/browser/ui/browser_window.h"
14 #include "chrome/browser/ui/tabs/tab_strip_model.h" 14 #include "chrome/browser/ui/tabs/tab_strip_model.h"
15 #include "chrome/browser/ui/toolbar/component_toolbar_actions_factory.h"
15 #include "chrome/browser/ui/view_ids.h" 16 #include "chrome/browser/ui/view_ids.h"
16 #include "chrome/browser/ui/views/extensions/browser_action_drag_data.h" 17 #include "chrome/browser/ui/views/extensions/browser_action_drag_data.h"
18 #include "chrome/browser/ui/views/extensions/extension_action_view_controller.h"
17 #include "chrome/browser/ui/views/extensions/extension_popup.h" 19 #include "chrome/browser/ui/views/extensions/extension_popup.h"
18 #include "chrome/browser/ui/views/frame/browser_view.h" 20 #include "chrome/browser/ui/views/frame/browser_view.h"
19 #include "chrome/browser/ui/views/toolbar/browser_actions_container_observer.h" 21 #include "chrome/browser/ui/views/toolbar/browser_actions_container_observer.h"
20 #include "chrome/browser/ui/views/toolbar/toolbar_view.h" 22 #include "chrome/browser/ui/views/toolbar/toolbar_view.h"
21 #include "chrome/common/extensions/command.h" 23 #include "chrome/common/extensions/command.h"
22 #include "chrome/grit/generated_resources.h" 24 #include "chrome/grit/generated_resources.h"
23 #include "extensions/browser/extension_system.h" 25 #include "extensions/browser/extension_system.h"
24 #include "extensions/browser/runtime_data.h" 26 #include "extensions/browser/runtime_data.h"
25 #include "extensions/common/feature_switch.h" 27 #include "extensions/common/feature_switch.h"
26 #include "grit/theme_resources.h" 28 #include "grit/theme_resources.h"
(...skipping 12 matching lines...) Expand all
39 #include "ui/views/painter.h" 41 #include "ui/views/painter.h"
40 #include "ui/views/widget/widget.h" 42 #include "ui/views/widget/widget.h"
41 43
42 using extensions::Extension; 44 using extensions::Extension;
43 45
44 namespace { 46 namespace {
45 47
46 // Horizontal spacing before the chevron (if visible). 48 // Horizontal spacing before the chevron (if visible).
47 const int kChevronSpacing = ToolbarView::kStandardSpacing - 2; 49 const int kChevronSpacing = ToolbarView::kStandardSpacing - 2;
48 50
51 // Returns the set of controllers for all actions.
52 // TODO(devlin): We should move this to the model, once it supports component
53 // actions.
54 ScopedVector<ToolbarActionViewController> GetToolbarActions(
55 extensions::ExtensionToolbarModel* model,
56 Browser* browser) {
57 ScopedVector<ToolbarActionViewController> actions;
58
59 // Extension actions come first.
60 extensions::ExtensionActionManager* action_manager =
61 extensions::ExtensionActionManager::Get(browser->profile());
62 const extensions::ExtensionList& toolbar_items = model->toolbar_items();
63 for (const scoped_refptr<const Extension>& extension : toolbar_items) {
64 actions.push_back(new ExtensionActionViewController(
65 extension.get(),
66 browser,
67 action_manager->GetExtensionAction(*extension)));
68 }
69
70 // Component actions come second.
71 ScopedVector<ToolbarActionViewController> component_actions =
72 ComponentToolbarActionsFactory::GetInstance()->
73 GetComponentToolbarActions();
74 DCHECK(extensions::FeatureSwitch::extension_action_redesign()->IsEnabled() ||
75 component_actions.empty());
76 actions.insert(
77 actions.end(), component_actions.begin(), component_actions.end());
78 component_actions.weak_clear();
79 return actions.Pass();
80 }
81
49 } // namespace 82 } // namespace
50 83
51 //////////////////////////////////////////////////////////////////////////////// 84 ////////////////////////////////////////////////////////////////////////////////
52 // BrowserActionsContainer::DropPosition 85 // BrowserActionsContainer::DropPosition
53 86
54 struct BrowserActionsContainer::DropPosition { 87 struct BrowserActionsContainer::DropPosition {
55 DropPosition(size_t row, size_t icon_in_row); 88 DropPosition(size_t row, size_t icon_in_row);
56 89
57 // The (0-indexed) row into which the action will be dropped. 90 // The (0-indexed) row into which the action will be dropped.
58 size_t row; 91 size_t row;
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after
139 // We wait to set the container width until now so that the chevron images 172 // We wait to set the container width until now so that the chevron images
140 // will be loaded. The width calculation needs to know the chevron size. 173 // will be loaded. The width calculation needs to know the chevron size.
141 if (model_ && model_->extensions_initialized()) { 174 if (model_ && model_->extensions_initialized()) {
142 container_width_ = GetPreferredWidth(); 175 container_width_ = GetPreferredWidth();
143 SetChevronVisibility(); 176 SetChevronVisibility();
144 } 177 }
145 178
146 initialized_ = true; 179 initialized_ = true;
147 } 180 }
148 181
182 const std::string& BrowserActionsContainer::GetIdAt(size_t index) {
183 return browser_action_views_[index]->view_controller()->GetId();
184 }
185
149 BrowserActionView* BrowserActionsContainer::GetViewForExtension( 186 BrowserActionView* BrowserActionsContainer::GetViewForExtension(
150 const Extension* extension) { 187 const Extension* extension) {
151 for (BrowserActionView* view : browser_action_views_) { 188 for (BrowserActionView* view : browser_action_views_) {
152 if (view->extension() == extension) 189 if (view->view_controller()->GetId() == extension->id())
153 return view; 190 return view;
154 } 191 }
155 return NULL; 192 return NULL;
156 } 193 }
157 194
158 void BrowserActionsContainer::RefreshBrowserActionViews() { 195 void BrowserActionsContainer::RefreshBrowserActionViews() {
159 for (BrowserActionView* view : browser_action_views_) 196 for (BrowserActionView* view : browser_action_views_)
160 view->UpdateState(); 197 view->UpdateState();
161 } 198 }
162 199
163 void BrowserActionsContainer::CreateBrowserActionViews() { 200 void BrowserActionsContainer::CreateBrowserActionViews() {
164 DCHECK(browser_action_views_.empty()); 201 DCHECK(browser_action_views_.empty());
165 if (!model_) 202 if (!model_)
166 return; 203 return;
167 204
168 extensions::ExtensionActionManager* action_manager = 205 ScopedVector<ToolbarActionViewController> actions =
169 extensions::ExtensionActionManager::Get(profile_); 206 GetToolbarActions(model_, browser_);
170 const extensions::ExtensionList& toolbar_items = model_->toolbar_items(); 207 for (ToolbarActionViewController* controller : actions) {
171 for (const scoped_refptr<const Extension>& extension : toolbar_items) {
172 BrowserActionView* view = 208 BrowserActionView* view =
173 new BrowserActionView(extension.get(), 209 new BrowserActionView(make_scoped_ptr(controller), browser_, this);
174 action_manager->GetExtensionAction(*extension),
175 browser_,
176 this);
177 browser_action_views_.push_back(view); 210 browser_action_views_.push_back(view);
178 AddChildView(view); 211 AddChildView(view);
179 } 212 }
213 actions.weak_clear();
180 } 214 }
181 215
182 void BrowserActionsContainer::DeleteBrowserActionViews() { 216 void BrowserActionsContainer::DeleteBrowserActionViews() {
183 HideActivePopup(); 217 HideActivePopup();
184 STLDeleteElements(&browser_action_views_); 218 STLDeleteElements(&browser_action_views_);
185 } 219 }
186 220
187 size_t BrowserActionsContainer::VisibleBrowserActions() const { 221 size_t BrowserActionsContainer::VisibleBrowserActions() const {
188 size_t visible_actions = 0; 222 size_t visible_actions = 0;
189 for (const BrowserActionView* view : browser_action_views_) { 223 for (const BrowserActionView* view : browser_action_views_) {
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after
247 DCHECK((!popup_owner_ && popup_owner) || 281 DCHECK((!popup_owner_ && popup_owner) ||
248 (popup_owner_ && !popup_owner)); 282 (popup_owner_ && !popup_owner));
249 popup_owner_ = popup_owner; 283 popup_owner_ = popup_owner;
250 } 284 }
251 285
252 void BrowserActionsContainer::HideActivePopup() { 286 void BrowserActionsContainer::HideActivePopup() {
253 if (popup_owner_) 287 if (popup_owner_)
254 popup_owner_->view_controller()->HidePopup(); 288 popup_owner_->view_controller()->HidePopup();
255 } 289 }
256 290
257 BrowserActionView* BrowserActionsContainer::GetMainViewForExtension( 291 BrowserActionView* BrowserActionsContainer::GetMainViewForAction(
258 const Extension* extension) { 292 BrowserActionView* view) {
259 return in_overflow_mode() ? 293 if (!in_overflow_mode())
260 main_container_->GetViewForExtension(extension) : 294 return view; // This is the main view.
261 GetViewForExtension(extension); 295
296 // The overflow container and main container each have the same views and
297 // view indices, so we can return the view of the index that |view| has in
298 // this container.
299 BrowserActionViews::const_iterator iter =
300 std::find(browser_action_views_.begin(),
301 browser_action_views_.end(),
302 view);
303 DCHECK(iter != browser_action_views_.end());
304 size_t index = iter - browser_action_views_.begin();
305 return main_container_->browser_action_views_[index];
262 } 306 }
263 307
264 void BrowserActionsContainer::AddObserver( 308 void BrowserActionsContainer::AddObserver(
265 BrowserActionsContainerObserver* observer) { 309 BrowserActionsContainerObserver* observer) {
266 observers_.AddObserver(observer); 310 observers_.AddObserver(observer);
267 } 311 }
268 312
269 void BrowserActionsContainer::RemoveObserver( 313 void BrowserActionsContainer::RemoveObserver(
270 BrowserActionsContainerObserver* observer) { 314 BrowserActionsContainerObserver* observer) {
271 observers_.RemoveObserver(observer); 315 observers_.RemoveObserver(observer);
(...skipping 200 matching lines...) Expand 10 before | Expand all | Expand 10 after
472 SchedulePaint(); 516 SchedulePaint();
473 } 517 }
474 518
475 int BrowserActionsContainer::OnPerformDrop( 519 int BrowserActionsContainer::OnPerformDrop(
476 const ui::DropTargetEvent& event) { 520 const ui::DropTargetEvent& event) {
477 BrowserActionDragData data; 521 BrowserActionDragData data;
478 if (!data.Read(event.data())) 522 if (!data.Read(event.data()))
479 return ui::DragDropTypes::DRAG_NONE; 523 return ui::DragDropTypes::DRAG_NONE;
480 524
481 // Make sure we have the same view as we started with. 525 // Make sure we have the same view as we started with.
482 DCHECK_EQ(browser_action_views_[data.index()]->extension()->id(), 526 DCHECK_EQ(GetIdAt(data.index()), data.id());
483 data.id());
484 DCHECK(model_); 527 DCHECK(model_);
485 528
486 size_t i = drop_position_->row * icons_per_overflow_menu_row_ + 529 size_t i = drop_position_->row * icons_per_overflow_menu_row_ +
487 drop_position_->icon_in_row; 530 drop_position_->icon_in_row;
488 if (in_overflow_mode()) 531 if (in_overflow_mode())
489 i += main_container_->VisibleBrowserActionsAfterAnimation(); 532 i += main_container_->VisibleBrowserActionsAfterAnimation();
490 // |i| now points to the item to the right of the drop indicator*, which is 533 // |i| now points to the item to the right of the drop indicator*, which is
491 // correct when dragging an icon to the left. When dragging to the right, 534 // correct when dragging an icon to the left. When dragging to the right,
492 // however, we want the icon being dragged to get the index of the item to 535 // however, we want the icon being dragged to get the index of the item to
493 // the left of the drop indicator, so we subtract one. 536 // the left of the drop indicator, so we subtract one.
494 // * Well, it can also point to the end, but not when dragging to the left. :) 537 // * Well, it can also point to the end, but not when dragging to the left. :)
495 if (i > data.index()) 538 if (i > data.index())
496 --i; 539 --i;
497 540
498 // If this was a drag between containers, we will have to adjust the number of 541 // If this was a drag between containers, we will have to adjust the number of
499 // visible icons. 542 // visible icons.
500 bool drag_between_containers = 543 bool drag_between_containers =
501 !browser_action_views_[data.index()]->visible(); 544 !browser_action_views_[data.index()]->visible();
502 model_->MoveExtensionIcon( 545 model_->MoveExtensionIcon(GetIdAt(data.index()), i);
503 browser_action_views_[data.index()]->extension(), i);
504 546
505 if (drag_between_containers) { 547 if (drag_between_containers) {
506 // Let the main container update the model. 548 // Let the main container update the model.
507 if (in_overflow_mode()) 549 if (in_overflow_mode())
508 main_container_->NotifyActionMovedToOverflow(); 550 main_container_->NotifyActionMovedToOverflow();
509 else // This is the main container. 551 else // This is the main container.
510 model_->SetVisibleIconCount(model_->GetVisibleIconCount() + 1); 552 model_->SetVisibleIconCount(model_->GetVisibleIconCount() + 1);
511 } 553 }
512 554
513 OnDragExited(); // Perform clean up after dragging. 555 OnDragExited(); // Perform clean up after dragging.
514 return ui::DragDropTypes::DRAG_MOVE; 556 return ui::DragDropTypes::DRAG_MOVE;
515 } 557 }
516 558
517 void BrowserActionsContainer::GetAccessibleState( 559 void BrowserActionsContainer::GetAccessibleState(
518 ui::AXViewState* state) { 560 ui::AXViewState* state) {
519 state->role = ui::AX_ROLE_GROUP; 561 state->role = ui::AX_ROLE_GROUP;
520 state->name = l10n_util::GetStringUTF16(IDS_ACCNAME_EXTENSIONS); 562 state->name = l10n_util::GetStringUTF16(IDS_ACCNAME_EXTENSIONS);
521 } 563 }
522 564
523 void BrowserActionsContainer::WriteDragDataForView(View* sender, 565 void BrowserActionsContainer::WriteDragDataForView(View* sender,
524 const gfx::Point& press_pt, 566 const gfx::Point& press_pt,
525 OSExchangeData* data) { 567 OSExchangeData* data) {
526 DCHECK(data); 568 DCHECK(data);
527 569
528 BrowserActionViews::iterator iter = std::find(browser_action_views_.begin(), 570 BrowserActionViews::iterator iter = std::find(browser_action_views_.begin(),
529 browser_action_views_.end(), 571 browser_action_views_.end(),
530 sender); 572 sender);
531 DCHECK(iter != browser_action_views_.end()); 573 DCHECK(iter != browser_action_views_.end());
532 drag_utils::SetDragImageOnDataObject((*iter)->GetIconWithBadge(), 574 ToolbarActionViewController* view_controller = (*iter)->view_controller();
533 press_pt.OffsetFromOrigin(), 575 drag_utils::SetDragImageOnDataObject(
534 data); 576 view_controller->GetIconWithBadge(),
577 press_pt.OffsetFromOrigin(),
578 data);
535 // Fill in the remaining info. 579 // Fill in the remaining info.
536 BrowserActionDragData drag_data((*iter)->extension()->id(), 580 BrowserActionDragData drag_data(view_controller->GetId(),
537 iter - browser_action_views_.begin()); 581 iter - browser_action_views_.begin());
538 drag_data.Write(profile_, data); 582 drag_data.Write(profile_, data);
539 } 583 }
540 584
541 int BrowserActionsContainer::GetDragOperationsForView(View* sender, 585 int BrowserActionsContainer::GetDragOperationsForView(View* sender,
542 const gfx::Point& p) { 586 const gfx::Point& p) {
543 return ui::DragDropTypes::DRAG_MOVE; 587 return ui::DragDropTypes::DRAG_MOVE;
544 } 588 }
545 589
546 bool BrowserActionsContainer::CanStartDragForView(View* sender, 590 bool BrowserActionsContainer::CanStartDragForView(View* sender,
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
598 642
599 extensions::ActiveTabPermissionGranter* 643 extensions::ActiveTabPermissionGranter*
600 BrowserActionsContainer::GetActiveTabPermissionGranter() { 644 BrowserActionsContainer::GetActiveTabPermissionGranter() {
601 content::WebContents* web_contents = GetCurrentWebContents(); 645 content::WebContents* web_contents = GetCurrentWebContents();
602 if (!web_contents) 646 if (!web_contents)
603 return NULL; 647 return NULL;
604 return extensions::TabHelper::FromWebContents(web_contents)-> 648 return extensions::TabHelper::FromWebContents(web_contents)->
605 active_tab_permission_granter(); 649 active_tab_permission_granter();
606 } 650 }
607 651
608 ExtensionPopup* BrowserActionsContainer::TestGetPopup() { 652 gfx::NativeView BrowserActionsContainer::TestGetPopup() {
609 return popup_owner_ ? popup_owner_->view_controller()->popup() : NULL; 653 return popup_owner_ ?
654 popup_owner_->view_controller()->GetPopupNativeView() :
655 NULL;
610 } 656 }
611 657
612 void BrowserActionsContainer::OnPaint(gfx::Canvas* canvas) { 658 void BrowserActionsContainer::OnPaint(gfx::Canvas* canvas) {
613 // If the views haven't been initialized yet, wait for the next call to 659 // If the views haven't been initialized yet, wait for the next call to
614 // paint (one will be triggered by entering highlight mode). 660 // paint (one will be triggered by entering highlight mode).
615 if (model_->is_highlighting() && !browser_action_views_.empty() && 661 if (model_->is_highlighting() && !browser_action_views_.empty() &&
616 !in_overflow_mode()) { 662 !in_overflow_mode()) {
617 views::Painter::PaintPainterAt( 663 views::Painter::PaintPainterAt(
618 canvas, highlight_painter_.get(), GetLocalBounds()); 664 canvas, highlight_painter_.get(), GetLocalBounds());
619 } 665 }
(...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after
713 for (size_t i = 0; i < browser_action_views_.size(); ++i) { 759 for (size_t i = 0; i < browser_action_views_.size(); ++i) {
714 DCHECK(browser_action_views_[i]->extension() != extension) << 760 DCHECK(browser_action_views_[i]->extension() != extension) <<
715 "Asked to add a browser action view for an extension that already " 761 "Asked to add a browser action view for an extension that already "
716 "exists."; 762 "exists.";
717 } 763 }
718 #endif 764 #endif
719 if (chevron_) 765 if (chevron_)
720 chevron_->CloseMenu(); 766 chevron_->CloseMenu();
721 767
722 // Add the new browser action to the vector and the view hierarchy. 768 // Add the new browser action to the vector and the view hierarchy.
723 BrowserActionView* view = 769 BrowserActionView* view = new BrowserActionView(
724 new BrowserActionView(extension, 770 make_scoped_ptr(new ExtensionActionViewController(
725 extensions::ExtensionActionManager::Get(profile_)-> 771 extension,
726 GetExtensionAction(*extension), 772 browser_,
727 browser_, 773 extensions::ExtensionActionManager::Get(profile_)->
728 this); 774 GetExtensionAction(*extension))),
775 browser_,
776 this);
729 browser_action_views_.insert(browser_action_views_.begin() + index, view); 777 browser_action_views_.insert(browser_action_views_.begin() + index, view);
730 AddChildViewAt(view, index); 778 AddChildViewAt(view, index);
731 779
732 // If we are still initializing the container, don't bother animating. 780 // If we are still initializing the container, don't bother animating.
733 if (!model_->extensions_initialized()) 781 if (!model_->extensions_initialized())
734 return; 782 return;
735 783
736 // If this is just an upgrade, then don't worry about resizing. 784 // If this is just an upgrade, then don't worry about resizing.
737 if (!extensions::ExtensionSystem::Get(profile_)->runtime_data()-> 785 if (!extensions::ExtensionSystem::Get(profile_)->runtime_data()->
738 IsBeingUpgraded(extension)) { 786 IsBeingUpgraded(extension)) {
(...skipping 19 matching lines...) Expand all
758 } 806 }
759 807
760 void BrowserActionsContainer::ToolbarExtensionRemoved( 808 void BrowserActionsContainer::ToolbarExtensionRemoved(
761 const Extension* extension) { 809 const Extension* extension) {
762 if (chevron_) 810 if (chevron_)
763 chevron_->CloseMenu(); 811 chevron_->CloseMenu();
764 812
765 size_t visible_actions = VisibleBrowserActionsAfterAnimation(); 813 size_t visible_actions = VisibleBrowserActionsAfterAnimation();
766 for (BrowserActionViews::iterator i(browser_action_views_.begin()); 814 for (BrowserActionViews::iterator i(browser_action_views_.begin());
767 i != browser_action_views_.end(); ++i) { 815 i != browser_action_views_.end(); ++i) {
768 if ((*i)->extension() == extension) { 816 if ((*i)->view_controller()->GetId() == extension->id()) {
769 delete *i; 817 delete *i;
770 browser_action_views_.erase(i); 818 browser_action_views_.erase(i);
771 819
772 // If the extension is being upgraded we don't want the bar to shrink 820 // If the extension is being upgraded we don't want the bar to shrink
773 // because the icon is just going to get re-added to the same location. 821 // because the icon is just going to get re-added to the same location.
774 if (extensions::ExtensionSystem::Get(profile_)->runtime_data()-> 822 if (extensions::ExtensionSystem::Get(profile_)->runtime_data()->
775 IsBeingUpgraded(extension)) 823 IsBeingUpgraded(extension))
776 return; 824 return;
777 825
778 if (browser_action_views_.size() > visible_actions) { 826 if (browser_action_views_.size() > visible_actions) {
(...skipping 13 matching lines...) Expand all
792 } 840 }
793 } 841 }
794 } 842 }
795 843
796 void BrowserActionsContainer::ToolbarExtensionMoved(const Extension* extension, 844 void BrowserActionsContainer::ToolbarExtensionMoved(const Extension* extension,
797 int index) { 845 int index) {
798 DCHECK(index >= 0 && index < static_cast<int>(browser_action_views_.size())); 846 DCHECK(index >= 0 && index < static_cast<int>(browser_action_views_.size()));
799 847
800 BrowserActionViews::iterator iter = browser_action_views_.begin(); 848 BrowserActionViews::iterator iter = browser_action_views_.begin();
801 while (iter != browser_action_views_.end() && 849 while (iter != browser_action_views_.end() &&
802 (*iter)->extension() != extension) { 850 (*iter)->view_controller()->GetId() != extension->id())
803 ++iter; 851 ++iter;
804 }
805 852
806 DCHECK(iter != browser_action_views_.end()); 853 DCHECK(iter != browser_action_views_.end());
807 if (iter - browser_action_views_.begin() == index) 854 if (iter - browser_action_views_.begin() == index)
808 return; // Already in place. 855 return; // Already in place.
809 856
810 BrowserActionView* moved_view = *iter; 857 BrowserActionView* moved_view = *iter;
811 browser_action_views_.erase(iter); 858 browser_action_views_.erase(iter);
812 browser_action_views_.insert( 859 browser_action_views_.insert(
813 browser_action_views_.begin() + index, moved_view); 860 browser_action_views_.begin() + index, moved_view);
814 861
(...skipping 11 matching lines...) Expand all
826 } 873 }
827 874
828 bool BrowserActionsContainer::ShowExtensionActionPopup( 875 bool BrowserActionsContainer::ShowExtensionActionPopup(
829 const Extension* extension, 876 const Extension* extension,
830 bool grant_active_tab) { 877 bool grant_active_tab) {
831 // Don't override another popup, and only show in the active window. 878 // Don't override another popup, and only show in the active window.
832 if (popup_owner_ || !browser_->window()->IsActive()) 879 if (popup_owner_ || !browser_->window()->IsActive())
833 return false; 880 return false;
834 881
835 BrowserActionView* view = GetViewForExtension(extension); 882 BrowserActionView* view = GetViewForExtension(extension);
836 return view && view->view_controller()->ExecuteAction(ExtensionPopup::SHOW, 883 return view && view->view_controller()->ExecuteAction(grant_active_tab);
837 grant_active_tab);
838 } 884 }
839 885
840 void BrowserActionsContainer::ToolbarVisibleCountChanged() { 886 void BrowserActionsContainer::ToolbarVisibleCountChanged() {
841 if (GetPreferredWidth() != container_width_) 887 if (GetPreferredWidth() != container_width_)
842 Animate(gfx::Tween::EASE_OUT, GetIconCount()); 888 Animate(gfx::Tween::EASE_OUT, GetIconCount());
843 } 889 }
844 890
845 void BrowserActionsContainer::ToolbarHighlightModeChanged( 891 void BrowserActionsContainer::ToolbarHighlightModeChanged(
846 bool is_highlighting) { 892 bool is_highlighting) {
847 // The visual highlighting is done in OnPaint(). It's a bit of a pain that 893 // The visual highlighting is done in OnPaint(). It's a bit of a pain that
(...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after
953 999
954 size_t BrowserActionsContainer::GetIconCount() const { 1000 size_t BrowserActionsContainer::GetIconCount() const {
955 if (!model_) 1001 if (!model_)
956 return 0u; 1002 return 0u;
957 1003
958 // Find the absolute value for the model's visible count. 1004 // Find the absolute value for the model's visible count.
959 int model_visible_size = model_->GetVisibleIconCount(); 1005 int model_visible_size = model_->GetVisibleIconCount();
960 size_t absolute_model_visible_size = model_visible_size == -1 ? 1006 size_t absolute_model_visible_size = model_visible_size == -1 ?
961 model_->toolbar_items().size() : model_visible_size; 1007 model_->toolbar_items().size() : model_visible_size;
962 1008
1009 #if defined(DEBUG)
963 // Good time for some sanity checks: We should never try to display more 1010 // Good time for some sanity checks: We should never try to display more
964 // icons than we have, and we should always have a view per item in the model. 1011 // icons than we have, and we should always have a view per item in the model.
965 // (The only exception is if this is in initialization.) 1012 // (The only exception is if this is in initialization.)
966 if (initialized_) { 1013 if (initialized_) {
1014 size_t num_extension_actions = 0u;
1015 for (const BrowserActionView* view : browser_action_views_) {
1016 num_extension_actions +=
1017 view->view_controller()->GetType() ==
1018 ToolbarActionViewController::TYPE_EXTENSION_ACTION ? 1 : 0;
1019 }
967 DCHECK_LE(absolute_model_visible_size, browser_action_views_.size()); 1020 DCHECK_LE(absolute_model_visible_size, browser_action_views_.size());
968 DCHECK_EQ(model_->toolbar_items().size(), browser_action_views_.size()); 1021 DCHECK_EQ(model_->toolbar_items().size(), browser_action_views_.size());
969 } 1022 }
1023 #endif
970 1024
971 // The overflow displays any icons not shown by the main bar. 1025 // The overflow displays any icons not shown by the main bar.
972 return in_overflow_mode() ? 1026 return in_overflow_mode() ?
973 model_->toolbar_items().size() - absolute_model_visible_size : 1027 model_->toolbar_items().size() - absolute_model_visible_size :
974 absolute_model_visible_size; 1028 absolute_model_visible_size;
975 } 1029 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698