OLD | NEW |
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" |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
53 // TODO(devlin): We should move this to the model, once it supports component | 53 // TODO(devlin): We should move this to the model, once it supports component |
54 // actions. | 54 // actions. |
55 ScopedVector<ToolbarActionViewController> GetToolbarActions( | 55 ScopedVector<ToolbarActionViewController> GetToolbarActions( |
56 extensions::ExtensionToolbarModel* model, | 56 extensions::ExtensionToolbarModel* model, |
57 Browser* browser) { | 57 Browser* browser) { |
58 ScopedVector<ToolbarActionViewController> actions; | 58 ScopedVector<ToolbarActionViewController> actions; |
59 | 59 |
60 // Extension actions come first. | 60 // Extension actions come first. |
61 extensions::ExtensionActionManager* action_manager = | 61 extensions::ExtensionActionManager* action_manager = |
62 extensions::ExtensionActionManager::Get(browser->profile()); | 62 extensions::ExtensionActionManager::Get(browser->profile()); |
63 const extensions::ExtensionList& toolbar_items = model->GetItemOrderForTab( | 63 const extensions::ExtensionList& toolbar_items = model->toolbar_items(); |
64 browser->tab_strip_model()->GetActiveWebContents()); | |
65 for (const scoped_refptr<const Extension>& extension : toolbar_items) { | 64 for (const scoped_refptr<const Extension>& extension : toolbar_items) { |
66 actions.push_back(new ExtensionActionViewController( | 65 actions.push_back(new ExtensionActionViewController( |
67 extension.get(), | 66 extension.get(), |
68 browser, | 67 browser, |
69 action_manager->GetExtensionAction(*extension))); | 68 action_manager->GetExtensionAction(*extension))); |
70 } | 69 } |
71 | 70 |
72 // Component actions come second. | 71 // Component actions come second. |
73 ScopedVector<ToolbarActionViewController> component_actions = | 72 ScopedVector<ToolbarActionViewController> component_actions = |
74 ComponentToolbarActionsFactory::GetInstance()-> | 73 ComponentToolbarActionsFactory::GetInstance()-> |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
119 : initialized_(false), | 118 : initialized_(false), |
120 profile_(browser->profile()), | 119 profile_(browser->profile()), |
121 browser_(browser), | 120 browser_(browser), |
122 main_container_(main_container), | 121 main_container_(main_container), |
123 popup_owner_(NULL), | 122 popup_owner_(NULL), |
124 model_(extensions::ExtensionToolbarModel::Get(browser->profile())), | 123 model_(extensions::ExtensionToolbarModel::Get(browser->profile())), |
125 container_width_(0), | 124 container_width_(0), |
126 resize_area_(NULL), | 125 resize_area_(NULL), |
127 chevron_(NULL), | 126 chevron_(NULL), |
128 suppress_chevron_(false), | 127 suppress_chevron_(false), |
129 suppress_animation_(false), | |
130 suppress_layout_(false), | |
131 resize_amount_(0), | 128 resize_amount_(0), |
132 animation_target_size_(0) { | 129 animation_target_size_(0) { |
133 set_id(VIEW_ID_BROWSER_ACTION_TOOLBAR); | 130 set_id(VIEW_ID_BROWSER_ACTION_TOOLBAR); |
134 if (model_) // |model_| can be NULL in views unittests. | 131 if (model_) // |model_| can be NULL in views unittests. |
135 model_->AddObserver(this); | 132 model_->AddObserver(this); |
136 | 133 |
137 bool overflow_experiment = | 134 bool overflow_experiment = |
138 extensions::FeatureSwitch::extension_action_redesign()->IsEnabled(); | 135 extensions::FeatureSwitch::extension_action_redesign()->IsEnabled(); |
139 DCHECK(!in_overflow_mode() || overflow_experiment); | 136 DCHECK(!in_overflow_mode() || overflow_experiment); |
140 | 137 |
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
190 ToolbarActionView* BrowserActionsContainer::GetViewForExtension( | 187 ToolbarActionView* BrowserActionsContainer::GetViewForExtension( |
191 const Extension* extension) { | 188 const Extension* extension) { |
192 for (ToolbarActionView* view : toolbar_action_views_) { | 189 for (ToolbarActionView* view : toolbar_action_views_) { |
193 if (view->view_controller()->GetId() == extension->id()) | 190 if (view->view_controller()->GetId() == extension->id()) |
194 return view; | 191 return view; |
195 } | 192 } |
196 return nullptr; | 193 return nullptr; |
197 } | 194 } |
198 | 195 |
199 void BrowserActionsContainer::RefreshToolbarActionViews() { | 196 void BrowserActionsContainer::RefreshToolbarActionViews() { |
200 if (toolbar_action_views_.empty()) | 197 for (ToolbarActionView* view : toolbar_action_views_) |
201 return; // Nothing to do. | 198 view->UpdateState(); |
202 | |
203 // When we do a bulk-refresh of views (such as when we switch tabs), we don't | |
204 // animate the difference. We only animate when it's a change driven by the | |
205 // action. | |
206 base::AutoReset<bool> animation_resetter(&suppress_animation_, true); | |
207 | |
208 { | |
209 // Don't layout until the end. | |
210 base::AutoReset<bool> layout_resetter(&suppress_layout_, true); | |
211 for (ToolbarActionView* view : toolbar_action_views_) | |
212 view->UpdateState(); | |
213 } | |
214 | |
215 ReorderViews(); // Also triggers a layout. | |
216 } | 199 } |
217 | 200 |
218 void BrowserActionsContainer::CreateToolbarActionViews() { | 201 void BrowserActionsContainer::CreateToolbarActionViews() { |
219 DCHECK(toolbar_action_views_.empty()); | 202 DCHECK(toolbar_action_views_.empty()); |
220 if (!model_) | 203 if (!model_) |
221 return; | 204 return; |
222 | 205 |
223 { | 206 ScopedVector<ToolbarActionViewController> actions = |
224 // We don't Layout while creating views. Instead, Layout() once at the end. | 207 GetToolbarActions(model_, browser_); |
225 base::AutoReset<bool> layout_resetter(&suppress_layout_, true); | 208 for (ToolbarActionViewController* controller : actions) { |
226 | 209 ToolbarActionView* view = |
227 ScopedVector<ToolbarActionViewController> actions = | 210 new ToolbarActionView(make_scoped_ptr(controller), browser_, this); |
228 GetToolbarActions(model_, browser_); | 211 toolbar_action_views_.push_back(view); |
229 for (ToolbarActionViewController* controller : actions) { | 212 AddChildView(view); |
230 ToolbarActionView* view = | |
231 new ToolbarActionView(make_scoped_ptr(controller), browser_, this); | |
232 toolbar_action_views_.push_back(view); | |
233 AddChildView(view); | |
234 } | |
235 actions.weak_clear(); | |
236 } | 213 } |
237 | 214 actions.weak_clear(); |
238 Layout(); | |
239 SchedulePaint(); | |
240 } | 215 } |
241 | 216 |
242 void BrowserActionsContainer::DeleteToolbarActionViews() { | 217 void BrowserActionsContainer::DeleteToolbarActionViews() { |
243 HideActivePopup(); | 218 HideActivePopup(); |
244 STLDeleteElements(&toolbar_action_views_); | 219 STLDeleteElements(&toolbar_action_views_); |
245 } | 220 } |
246 | 221 |
247 size_t BrowserActionsContainer::VisibleBrowserActions() const { | 222 size_t BrowserActionsContainer::VisibleBrowserActions() const { |
248 size_t visible_actions = 0; | 223 size_t visible_actions = 0; |
249 for (const ToolbarActionView* view : toolbar_action_views_) { | 224 for (const ToolbarActionView* view : toolbar_action_views_) { |
(...skipping 16 matching lines...) Expand all Loading... |
266 // Global commands are handled by the ExtensionCommandsGlobalRegistry | 241 // Global commands are handled by the ExtensionCommandsGlobalRegistry |
267 // instance. | 242 // instance. |
268 DCHECK(!command.global()); | 243 DCHECK(!command.global()); |
269 extension_keybinding_registry_->ExecuteCommand(extension->id(), | 244 extension_keybinding_registry_->ExecuteCommand(extension->id(), |
270 command.accelerator()); | 245 command.accelerator()); |
271 } | 246 } |
272 | 247 |
273 void BrowserActionsContainer::NotifyActionMovedToOverflow() { | 248 void BrowserActionsContainer::NotifyActionMovedToOverflow() { |
274 // When an action is moved to overflow, we shrink the size of the container | 249 // When an action is moved to overflow, we shrink the size of the container |
275 // by 1. | 250 // by 1. |
276 size_t icon_count = model_->visible_icon_count(); | 251 int icon_count = model_->GetVisibleIconCount(); |
277 // Since this happens when an icon moves from the main bar to overflow, we | 252 // Since this happens when an icon moves from the main bar to overflow, we |
278 // can't possibly have had no visible icons on the main bar. | 253 // can't possibly have had no visible icons on the main bar. |
279 DCHECK_NE(0u, icon_count); | 254 DCHECK_NE(0, icon_count); |
| 255 if (icon_count == -1) |
| 256 icon_count = toolbar_action_views_.size(); |
280 model_->SetVisibleIconCount(icon_count - 1); | 257 model_->SetVisibleIconCount(icon_count - 1); |
281 } | 258 } |
282 | 259 |
283 bool BrowserActionsContainer::ShownInsideMenu() const { | 260 bool BrowserActionsContainer::ShownInsideMenu() const { |
284 return in_overflow_mode(); | 261 return in_overflow_mode(); |
285 } | 262 } |
286 | 263 |
287 void BrowserActionsContainer::OnToolbarActionViewDragDone() { | 264 void BrowserActionsContainer::OnToolbarActionViewDragDone() { |
288 ToolbarVisibleCountChanged(); | 265 ToolbarVisibleCountChanged(); |
289 FOR_EACH_OBSERVER(BrowserActionsContainerObserver, | 266 FOR_EACH_OBSERVER(BrowserActionsContainerObserver, |
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
373 icons_per_overflow_menu_row_ = (width - kItemSpacing) / IconWidth(true); | 350 icons_per_overflow_menu_row_ = (width - kItemSpacing) / IconWidth(true); |
374 return GetPreferredSize().height(); | 351 return GetPreferredSize().height(); |
375 } | 352 } |
376 | 353 |
377 gfx::Size BrowserActionsContainer::GetMinimumSize() const { | 354 gfx::Size BrowserActionsContainer::GetMinimumSize() const { |
378 int min_width = std::min(MinimumNonemptyWidth(), IconCountToWidth(-1)); | 355 int min_width = std::min(MinimumNonemptyWidth(), IconCountToWidth(-1)); |
379 return gfx::Size(min_width, IconHeight()); | 356 return gfx::Size(min_width, IconHeight()); |
380 } | 357 } |
381 | 358 |
382 void BrowserActionsContainer::Layout() { | 359 void BrowserActionsContainer::Layout() { |
383 if (suppress_layout_) | |
384 return; | |
385 | |
386 if (toolbar_action_views_.empty()) { | 360 if (toolbar_action_views_.empty()) { |
387 SetVisible(false); | 361 SetVisible(false); |
388 return; | 362 return; |
389 } | 363 } |
390 | 364 |
391 SetVisible(true); | 365 SetVisible(true); |
392 if (resize_area_) | 366 if (resize_area_) |
393 resize_area_->SetBounds(0, 0, kItemSpacing, height()); | 367 resize_area_->SetBounds(0, 0, kItemSpacing, height()); |
394 | 368 |
395 // If the icons don't all fit, show the chevron (unless suppressed). | 369 // If the icons don't all fit, show the chevron (unless suppressed). |
(...skipping 173 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
569 // visible icons. | 543 // visible icons. |
570 bool drag_between_containers = | 544 bool drag_between_containers = |
571 !toolbar_action_views_[data.index()]->visible(); | 545 !toolbar_action_views_[data.index()]->visible(); |
572 model_->MoveExtensionIcon(GetIdAt(data.index()), i); | 546 model_->MoveExtensionIcon(GetIdAt(data.index()), i); |
573 | 547 |
574 if (drag_between_containers) { | 548 if (drag_between_containers) { |
575 // Let the main container update the model. | 549 // Let the main container update the model. |
576 if (in_overflow_mode()) | 550 if (in_overflow_mode()) |
577 main_container_->NotifyActionMovedToOverflow(); | 551 main_container_->NotifyActionMovedToOverflow(); |
578 else // This is the main container. | 552 else // This is the main container. |
579 model_->SetVisibleIconCount(model_->visible_icon_count() + 1); | 553 model_->SetVisibleIconCount(model_->GetVisibleIconCount() + 1); |
580 } | 554 } |
581 | 555 |
582 OnDragExited(); // Perform clean up after dragging. | 556 OnDragExited(); // Perform clean up after dragging. |
583 return ui::DragDropTypes::DRAG_MOVE; | 557 return ui::DragDropTypes::DRAG_MOVE; |
584 } | 558 } |
585 | 559 |
586 void BrowserActionsContainer::GetAccessibleState( | 560 void BrowserActionsContainer::GetAccessibleState( |
587 ui::AXViewState* state) { | 561 ui::AXViewState* state) { |
588 state->role = ui::AX_ROLE_GROUP; | 562 state->role = ui::AX_ROLE_GROUP; |
589 state->name = l10n_util::GetStringUTF16(IDS_ACCNAME_EXTENSIONS); | 563 state->name = l10n_util::GetStringUTF16(IDS_ACCNAME_EXTENSIONS); |
(...skipping 210 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
800 AddChildViewAt(view, index); | 774 AddChildViewAt(view, index); |
801 | 775 |
802 // If we are still initializing the container, don't bother animating. | 776 // If we are still initializing the container, don't bother animating. |
803 if (!model_->extensions_initialized()) | 777 if (!model_->extensions_initialized()) |
804 return; | 778 return; |
805 | 779 |
806 // If this is just an upgrade, then don't worry about resizing. | 780 // If this is just an upgrade, then don't worry about resizing. |
807 if (!extensions::ExtensionSystem::Get(profile_)->runtime_data()-> | 781 if (!extensions::ExtensionSystem::Get(profile_)->runtime_data()-> |
808 IsBeingUpgraded(extension)) { | 782 IsBeingUpgraded(extension)) { |
809 // We need to resize if either: | 783 // We need to resize if either: |
810 // - The container is set to display all icons, or | 784 // - The container is set to display all icons (visible count = -1), or |
811 // - The container will need to expand to include the chevron. This can | 785 // - The container will need to expand to include the chevron. This can |
812 // happen when the container is set to display <n> icons, where <n> is | 786 // happen when the container is set to display <n> icons, where <n> is |
813 // the number of icons before the new icon. With the new icon, the chevron | 787 // the number of icons before the new icon. With the new icon, the chevron |
814 // will need to be displayed. | 788 // will need to be displayed. |
815 if (model_->all_icons_visible() || | 789 int model_icon_count = model_->GetVisibleIconCount(); |
816 (model_->visible_icon_count() < toolbar_action_views_.size() && | 790 if (model_icon_count == -1 || |
| 791 (static_cast<size_t>(model_icon_count) < toolbar_action_views_.size() && |
817 (chevron_ && !chevron_->visible()))) { | 792 (chevron_ && !chevron_->visible()))) { |
818 suppress_chevron_ = true; | 793 suppress_chevron_ = true; |
819 Animate(gfx::Tween::LINEAR, GetIconCount()); | 794 Animate(gfx::Tween::LINEAR, GetIconCount()); |
820 return; | 795 return; |
821 } | 796 } |
822 } | 797 } |
823 | 798 |
824 // Otherwise, we don't have to resize, so just redraw the (possibly modified) | 799 // Otherwise, we don't have to resize, so just redraw the (possibly modified) |
825 // visible icon set. | 800 // visible icon set. |
826 OnBrowserActionVisibilityChanged(); | 801 OnBrowserActionVisibilityChanged(); |
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
898 bool grant_active_tab) { | 873 bool grant_active_tab) { |
899 // Don't override another popup, and only show in the active window. | 874 // Don't override another popup, and only show in the active window. |
900 if (popup_owner_ || !browser_->window()->IsActive()) | 875 if (popup_owner_ || !browser_->window()->IsActive()) |
901 return false; | 876 return false; |
902 | 877 |
903 ToolbarActionView* view = GetViewForExtension(extension); | 878 ToolbarActionView* view = GetViewForExtension(extension); |
904 return view && view->view_controller()->ExecuteAction(grant_active_tab); | 879 return view && view->view_controller()->ExecuteAction(grant_active_tab); |
905 } | 880 } |
906 | 881 |
907 void BrowserActionsContainer::ToolbarVisibleCountChanged() { | 882 void BrowserActionsContainer::ToolbarVisibleCountChanged() { |
908 if (GetPreferredWidth() != container_width_) { | 883 if (GetPreferredWidth() != container_width_) |
909 Animate(gfx::Tween::EASE_OUT, GetIconCount()); | 884 Animate(gfx::Tween::EASE_OUT, GetIconCount()); |
910 } else if (animation_target_size_ != 0) { | |
911 // It's possible that we're right where we're supposed to be in terms of | |
912 // icon count, but that we're also currently resizing. If this is the case, | |
913 // end the current animation with the current width. | |
914 animation_target_size_ = container_width_; | |
915 resize_animation_->Reset(); | |
916 } | |
917 } | 885 } |
918 | 886 |
919 void BrowserActionsContainer::ToolbarHighlightModeChanged( | 887 void BrowserActionsContainer::ToolbarHighlightModeChanged( |
920 bool is_highlighting) { | 888 bool is_highlighting) { |
921 // The visual highlighting is done in OnPaint(). It's a bit of a pain that | 889 // The visual highlighting is done in OnPaint(). It's a bit of a pain that |
922 // we delete and recreate everything here, but given everything else going on | 890 // we delete and recreate everything here, but given everything else going on |
923 // (the lack of highlight, n more extensions appearing, etc), it's not worth | 891 // (the lack of highlight, n more extensions appearing, etc), it's not worth |
924 // the extra complexity to create and insert only the new extensions. | 892 // the extra complexity to create and insert only the new extensions. |
925 DeleteToolbarActionViews(); | 893 DeleteToolbarActionViews(); |
926 CreateToolbarActionViews(); | 894 CreateToolbarActionViews(); |
927 Animate(gfx::Tween::LINEAR, GetIconCount()); | 895 Animate(gfx::Tween::LINEAR, GetIconCount()); |
928 } | 896 } |
929 | 897 |
930 void BrowserActionsContainer::OnToolbarReorderNecessary( | |
931 content::WebContents* web_contents) { | |
932 if (GetCurrentWebContents() == web_contents) | |
933 ReorderViews(); | |
934 } | |
935 | |
936 Browser* BrowserActionsContainer::GetBrowser() { | 898 Browser* BrowserActionsContainer::GetBrowser() { |
937 return browser_; | 899 return browser_; |
938 } | 900 } |
939 | 901 |
940 void BrowserActionsContainer::LoadImages() { | 902 void BrowserActionsContainer::LoadImages() { |
941 if (in_overflow_mode()) | 903 if (in_overflow_mode()) |
942 return; // Overflow mode has neither a chevron nor highlighting. | 904 return; // Overflow mode has neither a chevron nor highlighting. |
943 | 905 |
944 ui::ThemeProvider* tp = GetThemeProvider(); | 906 ui::ThemeProvider* tp = GetThemeProvider(); |
945 if (tp && chevron_) { | 907 if (tp && chevron_) { |
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1011 int BrowserActionsContainer::MinimumNonemptyWidth() const { | 973 int BrowserActionsContainer::MinimumNonemptyWidth() const { |
1012 if (!chevron_) | 974 if (!chevron_) |
1013 return ToolbarView::kStandardSpacing; | 975 return ToolbarView::kStandardSpacing; |
1014 return (ToolbarView::kStandardSpacing * 2) + kChevronSpacing + | 976 return (ToolbarView::kStandardSpacing * 2) + kChevronSpacing + |
1015 chevron_->GetPreferredSize().width(); | 977 chevron_->GetPreferredSize().width(); |
1016 } | 978 } |
1017 | 979 |
1018 void BrowserActionsContainer::Animate(gfx::Tween::Type tween_type, | 980 void BrowserActionsContainer::Animate(gfx::Tween::Type tween_type, |
1019 size_t num_visible_icons) { | 981 size_t num_visible_icons) { |
1020 int target_size = IconCountToWidth(num_visible_icons); | 982 int target_size = IconCountToWidth(num_visible_icons); |
1021 if (resize_animation_ && !disable_animations_during_testing_ && | 983 if (resize_animation_ && !disable_animations_during_testing_) { |
1022 !suppress_animation_) { | |
1023 // Animate! We have to set the animation_target_size_ after calling Reset(), | 984 // Animate! We have to set the animation_target_size_ after calling Reset(), |
1024 // because that could end up calling AnimationEnded which clears the value. | 985 // because that could end up calling AnimationEnded which clears the value. |
1025 resize_animation_->Reset(); | 986 resize_animation_->Reset(); |
1026 resize_animation_->SetTweenType(tween_type); | 987 resize_animation_->SetTweenType(tween_type); |
1027 animation_target_size_ = target_size; | 988 animation_target_size_ = target_size; |
1028 resize_animation_->Show(); | 989 resize_animation_->Show(); |
1029 } else { | 990 } else { |
1030 animation_target_size_ = target_size; | 991 animation_target_size_ = target_size; |
1031 AnimationEnded(resize_animation_.get()); | 992 AnimationEnded(resize_animation_.get()); |
1032 } | 993 } |
1033 } | 994 } |
1034 | 995 |
1035 void BrowserActionsContainer::ReorderViews() { | |
1036 extensions::ExtensionList new_order = | |
1037 model_->GetItemOrderForTab(GetCurrentWebContents()); | |
1038 if (new_order.empty()) | |
1039 return; // Nothing to do. | |
1040 | |
1041 #if DCHECK_IS_ON | |
1042 // Make sure the lists are in sync. There should be a view for each action in | |
1043 // the new order. | |
1044 // |toolbar_action_views_| may have more views than actions are present in | |
1045 // |new_order| if there are any component toolbar actions. | |
1046 // TODO(devlin): Change this to DCHECK_EQ when all toolbar actions are shown | |
1047 // in the model. | |
1048 DCHECK_LE(new_order.size(), toolbar_action_views_.size()); | |
1049 for (const scoped_refptr<const Extension>& extension : new_order) | |
1050 DCHECK(GetViewForExtension(extension.get())); | |
1051 #endif | |
1052 | |
1053 // Run through the views and compare them to the desired order. If something | |
1054 // is out of place, find the correct spot for it. | |
1055 for (size_t i = 0; i < new_order.size() - 1; ++i) { | |
1056 if (new_order[i]->id() != | |
1057 toolbar_action_views_[i]->view_controller()->GetId()) { | |
1058 // Find where the correct view is (it's guaranteed to be after our current | |
1059 // index, since everything up to this point is correct). | |
1060 size_t j = i + 1; | |
1061 while (new_order[i]->id() != | |
1062 toolbar_action_views_[j]->view_controller()->GetId()) | |
1063 ++j; | |
1064 std::swap(toolbar_action_views_[i], toolbar_action_views_[j]); | |
1065 } | |
1066 } | |
1067 | |
1068 // Our visible browser actions may have changed - re-Layout() and check the | |
1069 // size. | |
1070 ToolbarVisibleCountChanged(); | |
1071 OnBrowserActionVisibilityChanged(); | |
1072 } | |
1073 | |
1074 size_t BrowserActionsContainer::GetIconCount() const { | 996 size_t BrowserActionsContainer::GetIconCount() const { |
1075 if (!model_) | 997 if (!model_) |
1076 return 0u; | 998 return 0u; |
1077 | 999 |
1078 // Find the absolute value for the model's visible count. | 1000 // Find the absolute value for the model's visible count. |
1079 size_t model_visible_size = model_->GetVisibleIconCountForTab( | 1001 int model_visible_size = model_->GetVisibleIconCount(); |
1080 browser_->tab_strip_model()->GetActiveWebContents()); | 1002 size_t absolute_model_visible_size = model_visible_size == -1 ? |
| 1003 model_->toolbar_items().size() : model_visible_size; |
1081 | 1004 |
1082 #if DCHECK_IS_ON | 1005 #if !defined(NDEBUG) |
1083 // Good time for some sanity checks: We should never try to display more | 1006 // Good time for some sanity checks: We should never try to display more |
1084 // icons than we have, and we should always have a view per item in the model. | 1007 // icons than we have, and we should always have a view per item in the model. |
1085 // (The only exception is if this is in initialization.) | 1008 // (The only exception is if this is in initialization.) |
1086 if (initialized_ && !suppress_layout_) { | 1009 if (initialized_) { |
1087 size_t num_extension_actions = 0u; | 1010 size_t num_extension_actions = 0u; |
1088 for (ToolbarActionView* view : toolbar_action_views_) { | 1011 for (ToolbarActionView* view : toolbar_action_views_) { |
1089 // No component action should ever have a valid extension id, so we can | 1012 // No component action should ever have a valid extension id, so we can |
1090 // use this to check the extension amount. | 1013 // use this to check the extension amount. |
1091 // TODO(devlin): Fix this to just check model size when the model also | 1014 // TODO(devlin): Fix this to just check model size when the model also |
1092 // includes component actions. | 1015 // includes component actions. |
1093 if (crx_file::id_util::IdIsValid(view->view_controller()->GetId())) | 1016 if (crx_file::id_util::IdIsValid(view->view_controller()->GetId())) |
1094 ++num_extension_actions; | 1017 ++num_extension_actions; |
1095 } | 1018 } |
1096 DCHECK_LE(model_visible_size, num_extension_actions); | 1019 DCHECK_LE(absolute_model_visible_size, num_extension_actions); |
1097 DCHECK_EQ(model_->toolbar_items().size(), num_extension_actions); | 1020 DCHECK_EQ(model_->toolbar_items().size(), num_extension_actions); |
1098 } | 1021 } |
1099 #endif | 1022 #endif |
1100 | 1023 |
1101 // The overflow displays any icons not shown by the main bar. | 1024 // The overflow displays any icons not shown by the main bar. |
1102 return in_overflow_mode() ? | 1025 return in_overflow_mode() ? |
1103 model_->toolbar_items().size() - model_visible_size : model_visible_size; | 1026 model_->toolbar_items().size() - absolute_model_visible_size : |
| 1027 absolute_model_visible_size; |
1104 } | 1028 } |
OLD | NEW |