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

Side by Side Diff: chrome/browser/ui/toolbar/toolbar_actions_bar.cc

Issue 1241063003: Support Component Actions in the toolbar. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Fix tests and indentation changes. Created 5 years, 4 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/toolbar/toolbar_actions_bar.h" 5 #include "chrome/browser/ui/toolbar/toolbar_actions_bar.h"
6 6
7 #include "base/auto_reset.h" 7 #include "base/auto_reset.h"
8 #include "base/location.h" 8 #include "base/location.h"
9 #include "base/profiler/scoped_tracker.h" 9 #include "base/profiler/scoped_tracker.h"
10 #include "base/single_thread_task_runner.h" 10 #include "base/single_thread_task_runner.h"
11 #include "base/thread_task_runner_handle.h" 11 #include "base/thread_task_runner_handle.h"
12 #include "chrome/browser/extensions/extension_action_manager.h" 12 #include "chrome/browser/extensions/extension_action_manager.h"
13 #include "chrome/browser/extensions/extension_message_bubble_controller.h" 13 #include "chrome/browser/extensions/extension_message_bubble_controller.h"
14 #include "chrome/browser/extensions/extension_util.h" 14 #include "chrome/browser/extensions/extension_util.h"
15 #include "chrome/browser/profiles/profile.h" 15 #include "chrome/browser/profiles/profile.h"
16 #include "chrome/browser/sessions/session_tab_helper.h" 16 #include "chrome/browser/sessions/session_tab_helper.h"
17 #include "chrome/browser/ui/browser.h" 17 #include "chrome/browser/ui/browser.h"
18 #include "chrome/browser/ui/browser_window.h" 18 #include "chrome/browser/ui/browser_window.h"
19 #include "chrome/browser/ui/extensions/extension_action_view_controller.h" 19 #include "chrome/browser/ui/extensions/extension_action_view_controller.h"
20 #include "chrome/browser/ui/extensions/extension_message_bubble_factory.h" 20 #include "chrome/browser/ui/extensions/extension_message_bubble_factory.h"
21 #include "chrome/browser/ui/tabs/tab_strip_model.h" 21 #include "chrome/browser/ui/tabs/tab_strip_model.h"
22 #include "chrome/browser/ui/toolbar/component_toolbar_actions_factory.h" 22 #include "chrome/browser/ui/toolbar/component_toolbar_actions_factory.h"
23 #include "chrome/browser/ui/toolbar/toolbar_action_view_controller.h" 23 #include "chrome/browser/ui/toolbar/toolbar_action_view_controller.h"
24 #include "chrome/browser/ui/toolbar/toolbar_actions_bar_delegate.h" 24 #include "chrome/browser/ui/toolbar/toolbar_actions_bar_delegate.h"
25 #include "chrome/common/pref_names.h" 25 #include "chrome/common/pref_names.h"
26 #include "components/crx_file/id_util.h" 26 #include "components/crx_file/id_util.h"
27 #include "components/pref_registry/pref_registry_syncable.h" 27 #include "components/pref_registry/pref_registry_syncable.h"
28 #include "extensions/browser/extension_registry.h"
28 #include "extensions/browser/extension_system.h" 29 #include "extensions/browser/extension_system.h"
29 #include "extensions/browser/runtime_data.h" 30 #include "extensions/browser/runtime_data.h"
30 #include "extensions/common/extension.h" 31 #include "extensions/common/extension.h"
31 #include "extensions/common/feature_switch.h" 32 #include "extensions/common/feature_switch.h"
32 #include "grit/theme_resources.h" 33 #include "grit/theme_resources.h"
33 #include "ui/base/resource/resource_bundle.h" 34 #include "ui/base/resource/resource_bundle.h"
34 #include "ui/gfx/image/image_skia.h" 35 #include "ui/gfx/image/image_skia.h"
35 36
36 namespace { 37 namespace {
37 38
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after
112 icons_per_overflow_menu_row(1), 113 icons_per_overflow_menu_row(1),
113 chevron_enabled(!extensions::FeatureSwitch::extension_action_redesign()-> 114 chevron_enabled(!extensions::FeatureSwitch::extension_action_redesign()->
114 IsEnabled()) { 115 IsEnabled()) {
115 } 116 }
116 117
117 ToolbarActionsBar::ToolbarActionsBar(ToolbarActionsBarDelegate* delegate, 118 ToolbarActionsBar::ToolbarActionsBar(ToolbarActionsBarDelegate* delegate,
118 Browser* browser, 119 Browser* browser,
119 ToolbarActionsBar* main_bar) 120 ToolbarActionsBar* main_bar)
120 : delegate_(delegate), 121 : delegate_(delegate),
121 browser_(browser), 122 browser_(browser),
122 model_(extensions::ExtensionToolbarModel::Get(browser_->profile())), 123 model_(ToolbarActionsModel::Get(browser_->profile())),
123 main_bar_(main_bar), 124 main_bar_(main_bar),
124 platform_settings_(main_bar != nullptr), 125 platform_settings_(main_bar != nullptr),
125 popup_owner_(nullptr), 126 popup_owner_(nullptr),
126 model_observer_(this), 127 model_observer_(this),
127 suppress_layout_(false), 128 suppress_layout_(false),
128 suppress_animation_(true), 129 suppress_animation_(true),
129 overflowed_action_wants_to_run_(false), 130 overflowed_action_wants_to_run_(false),
130 checked_extension_bubble_(false), 131 checked_extension_bubble_(false),
131 popped_out_action_(nullptr), 132 popped_out_action_(nullptr),
132 weak_ptr_factory_(this) { 133 weak_ptr_factory_(this) {
(...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after
251 // want to "slide" the action back in. 252 // want to "slide" the action back in.
252 size_t visible_icons = in_overflow_mode() ? 253 size_t visible_icons = in_overflow_mode() ?
253 toolbar_actions_.size() - model_->visible_icon_count() : 254 toolbar_actions_.size() - model_->visible_icon_count() :
254 model_->visible_icon_count() + pop_out_modifier; 255 model_->visible_icon_count() + pop_out_modifier;
255 256
256 #if DCHECK_IS_ON() 257 #if DCHECK_IS_ON()
257 // Good time for some sanity checks: We should never try to display more 258 // Good time for some sanity checks: We should never try to display more
258 // icons than we have, and we should always have a view per item in the model. 259 // icons than we have, and we should always have a view per item in the model.
259 // (The only exception is if this is in initialization.) 260 // (The only exception is if this is in initialization.)
260 if (!toolbar_actions_.empty() && !suppress_layout_ && 261 if (!toolbar_actions_.empty() && !suppress_layout_ &&
261 model_->extensions_initialized()) { 262 model_->actions_initialized()) {
262 size_t num_extension_actions = 0u; 263 size_t num_actions = 0u;
263 for (ToolbarActionViewController* action : toolbar_actions_) { 264 for (ToolbarActionViewController* action : toolbar_actions_) {
264 // No component action should ever have a valid extension id, so we can 265 // No component action should ever have a valid extension id, so we can
265 // use this to check the extension amount. 266 // use this to check the extension amount.
266 if (crx_file::id_util::IdIsValid(action->GetId())) 267 if (crx_file::id_util::IdIsValid(action->GetId()) ||
Devlin 2015/08/13 21:21:11 In updating these, it looks like the checks here a
apacible 2015/08/15 08:46:41 Done.
267 ++num_extension_actions; 268 model_->IsKnownActionWithType(action->GetId(),
269 ToolbarActionsModel::COMPONENT_ACTION))
270 ++num_actions;
268 } 271 }
269 272
270 int num_component_actions = 273 DCHECK_LE(visible_icons, num_actions);
271 ComponentToolbarActionsFactory::GetInstance()-> 274 DCHECK_EQ(model_->toolbar_items().size(), num_actions);
272 GetNumComponentActions(browser_);
273 size_t num_total_actions = num_extension_actions + num_component_actions;
274
275 DCHECK_LE(visible_icons, num_total_actions);
276 DCHECK_EQ(model_->toolbar_items().size(), num_extension_actions);
277 } 275 }
278 #endif 276 #endif
279 277
280 return visible_icons; 278 return visible_icons;
281 } 279 }
282 280
283 gfx::Rect ToolbarActionsBar::GetFrameForIndex(size_t index) const { 281 gfx::Rect ToolbarActionsBar::GetFrameForIndex(size_t index) const {
284 size_t start_index = in_overflow_mode() ? 282 size_t start_index = in_overflow_mode() ?
285 toolbar_actions_.size() - GetIconCount() : 0u; 283 toolbar_actions_.size() - GetIconCount() : 0u;
286 284
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
324 } 322 }
325 } 323 }
326 324
327 return actions; 325 return actions;
328 } 326 }
329 327
330 void ToolbarActionsBar::CreateActions() { 328 void ToolbarActionsBar::CreateActions() {
331 DCHECK(toolbar_actions_.empty()); 329 DCHECK(toolbar_actions_.empty());
332 // We wait for the extension system to be initialized before we add any 330 // We wait for the extension system to be initialized before we add any
333 // actions, as they rely on the extension system to function. 331 // actions, as they rely on the extension system to function.
334 if (!model_ || !model_->extensions_initialized()) 332 if (!model_ || !model_->actions_initialized())
335 return; 333 return;
336 334
337 { 335 {
338 // TODO(robliao): Remove ScopedTracker below once https://crbug.com/463337 336 // TODO(robliao): Remove ScopedTracker below once https://crbug.com/463337
339 // is fixed. 337 // is fixed.
340 tracked_objects::ScopedTracker tracking_profile1( 338 tracked_objects::ScopedTracker tracking_profile1(
341 FROM_HERE_WITH_EXPLICIT_FUNCTION("ToolbarActionsBar::CreateActions1")); 339 FROM_HERE_WITH_EXPLICIT_FUNCTION("ToolbarActionsBar::CreateActions1"));
342 // We don't redraw the view while creating actions. 340 // We don't redraw the view while creating actions.
343 base::AutoReset<bool> layout_resetter(&suppress_layout_, true); 341 base::AutoReset<bool> layout_resetter(&suppress_layout_, true);
344 342
345 // Extension actions come first. 343 // Get the toolbar actions.
346 extensions::ExtensionActionManager* action_manager = 344 toolbar_actions_ = model_->CreateActions(browser_, this);
347 extensions::ExtensionActionManager::Get(browser_->profile());
348 const extensions::ExtensionList& toolbar_items = model_->toolbar_items();
349 for (const scoped_refptr<const extensions::Extension>& extension :
350 toolbar_items) {
351 toolbar_actions_.push_back(new ExtensionActionViewController(
352 extension.get(),
353 browser_,
354 action_manager->GetExtensionAction(*extension),
355 this));
356 }
357 345
358 // Component actions come second, and are suppressed if the extension
359 // actions are being highlighted.
360 if (!model_->is_highlighting()) { 346 if (!model_->is_highlighting()) {
361 // TODO(robliao): Remove ScopedTracker below once https://crbug.com/463337 347 // TODO(robliao): Remove ScopedTracker below once https://crbug.com/463337
362 // is fixed. 348 // is fixed.
363 tracked_objects::ScopedTracker tracking_profile2( 349 tracked_objects::ScopedTracker tracking_profile2(
364 FROM_HERE_WITH_EXPLICIT_FUNCTION( 350 FROM_HERE_WITH_EXPLICIT_FUNCTION(
365 "ToolbarActionsBar::CreateActions2")); 351 "ToolbarActionsBar::CreateActions2"));
366
367 ScopedVector<ToolbarActionViewController> component_actions =
368 ComponentToolbarActionsFactory::GetInstance()->
369 GetComponentToolbarActions(browser_);
370 DCHECK(component_actions.empty() ||
371 extensions::FeatureSwitch::extension_action_redesign()->IsEnabled());
372 toolbar_actions_.insert(toolbar_actions_.end(),
373 component_actions.begin(),
374 component_actions.end());
375 component_actions.weak_clear();
376 } 352 }
377 353
378 if (!toolbar_actions_.empty()) { 354 if (!toolbar_actions_.empty()) {
379 // TODO(robliao): Remove ScopedTracker below once https://crbug.com/463337 355 // TODO(robliao): Remove ScopedTracker below once https://crbug.com/463337
380 // is fixed. 356 // is fixed.
381 tracked_objects::ScopedTracker tracking_profile3( 357 tracked_objects::ScopedTracker tracking_profile3(
382 FROM_HERE_WITH_EXPLICIT_FUNCTION( 358 FROM_HERE_WITH_EXPLICIT_FUNCTION(
383 "ToolbarActionsBar::CreateActions3")); 359 "ToolbarActionsBar::CreateActions3"));
384 ReorderActions(); 360 ReorderActions();
385 } 361 }
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after
455 if (in_overflow_mode()) { 431 if (in_overflow_mode()) {
456 main_bar_->OnDragDrop(dragged_index, dropped_index, drag_type); 432 main_bar_->OnDragDrop(dragged_index, dropped_index, drag_type);
457 return; 433 return;
458 } 434 }
459 435
460 int delta = 0; 436 int delta = 0;
461 if (drag_type == DRAG_TO_OVERFLOW) 437 if (drag_type == DRAG_TO_OVERFLOW)
462 delta = -1; 438 delta = -1;
463 else if (drag_type == DRAG_TO_MAIN) 439 else if (drag_type == DRAG_TO_MAIN)
464 delta = 1; 440 delta = 1;
465 model_->MoveExtensionIcon(toolbar_actions_[dragged_index]->GetId(), 441 model_->MoveActionIcon(toolbar_actions_[dragged_index]->GetId(),
466 dropped_index); 442 dropped_index);
467 if (delta) 443 if (delta)
468 model_->SetVisibleIconCount(model_->visible_icon_count() + delta); 444 model_->SetVisibleIconCount(model_->visible_icon_count() + delta);
469 } 445 }
470 446
471 void ToolbarActionsBar::OnAnimationEnded() { 447 void ToolbarActionsBar::OnAnimationEnded() {
472 // Check if we were waiting for animation to complete to either show a 448 // Check if we were waiting for animation to complete to either show a
473 // message bubble, or to show a popup. 449 // message bubble, or to show a popup.
474 if (pending_extension_bubble_controller_) { 450 if (pending_extension_bubble_controller_) {
475 MaybeShowExtensionBubble(pending_extension_bubble_controller_.Pass()); 451 MaybeShowExtensionBubble(pending_extension_bubble_controller_.Pass());
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after
545 } 521 }
546 522
547 void ToolbarActionsBar::MaybeShowExtensionBubble( 523 void ToolbarActionsBar::MaybeShowExtensionBubble(
548 scoped_ptr<extensions::ExtensionMessageBubbleController> controller) { 524 scoped_ptr<extensions::ExtensionMessageBubbleController> controller) {
549 controller->HighlightExtensionsIfNecessary(); // Safe to call multiple times. 525 controller->HighlightExtensionsIfNecessary(); // Safe to call multiple times.
550 if (delegate_->IsAnimating()) { 526 if (delegate_->IsAnimating()) {
551 // If the toolbar is animating, we can't effectively anchor the bubble, 527 // If the toolbar is animating, we can't effectively anchor the bubble,
552 // so wait until animation stops. 528 // so wait until animation stops.
553 pending_extension_bubble_controller_ = controller.Pass(); 529 pending_extension_bubble_controller_ = controller.Pass();
554 } else { 530 } else {
555 const extensions::ExtensionIdList& affected_extensions = 531 const ActionIds& affected_extensions = controller->GetExtensionIdList();
556 controller->GetExtensionIdList();
557 ToolbarActionViewController* anchor_action = nullptr; 532 ToolbarActionViewController* anchor_action = nullptr;
558 for (const std::string& id : affected_extensions) { 533 for (const std::string& id : affected_extensions) {
559 anchor_action = GetActionForId(id); 534 anchor_action = GetActionForId(id);
560 if (anchor_action) 535 if (anchor_action)
561 break; 536 break;
562 } 537 }
563 delegate_->ShowExtensionMessageBubble(controller.Pass(), anchor_action); 538 delegate_->ShowExtensionMessageBubble(controller.Pass(), anchor_action);
564 } 539 }
565 } 540 }
566 541
567 void ToolbarActionsBar::OnToolbarExtensionAdded( 542 void ToolbarActionsBar::OnToolbarActionAdded(const std::string& action_id,
568 const extensions::Extension* extension, 543 int index) {
569 int index) { 544 DCHECK(GetActionForId(action_id) == nullptr) <<
570 DCHECK(GetActionForId(extension->id()) == nullptr) <<
571 "Asked to add a toolbar action view for an extension that already exists"; 545 "Asked to add a toolbar action view for an extension that already exists";
572 546
547 // TODO(rdevlin.cronin): This is a minor layering violation and the model
Devlin 2015/08/13 21:21:11 even though it's not the norm, my TODOs are (mostl
apacible 2015/08/15 08:46:41 Done.
548 // should pass in an action directly.
549 const extensions::Extension* extension =
550 extensions::ExtensionRegistry::Get(browser_->profile())->
551 enabled_extensions().GetByID(action_id);
Devlin 2015/08/13 21:21:11 // Only extensions should be added after initializ
apacible 2015/08/15 08:46:41 Done.
552
573 toolbar_actions_.insert( 553 toolbar_actions_.insert(
574 toolbar_actions_.begin() + index, 554 toolbar_actions_.begin() + index,
575 new ExtensionActionViewController( 555 new ExtensionActionViewController(
576 extension, 556 extension,
577 browser_, 557 browser_,
578 extensions::ExtensionActionManager::Get(browser_->profile())-> 558 extensions::ExtensionActionManager::Get(browser_->profile())->
579 GetExtensionAction(*extension), 559 GetExtensionAction(*extension),
580 this)); 560 this));
581 561
582 delegate_->AddViewForAction(toolbar_actions_[index], index); 562 delegate_->AddViewForAction(toolbar_actions_[index], index);
583 563
584 // If we are still initializing the container, don't bother animating. 564 // If we are still initializing the container, don't bother animating.
585 if (!model_->extensions_initialized()) 565 if (!model_->actions_initialized())
586 return; 566 return;
587 567
588 // We may need to resize (e.g. to show the new icon, or the chevron). We don't 568 // We may need to resize (e.g. to show the new icon, or the chevron). We don't
589 // need to check if the extension is upgrading here, because ResizeDelegate() 569 // need to check if the extension is upgrading here, because ResizeDelegate()
590 // checks to see if the container is already the proper size, and because 570 // checks to see if the container is already the proper size, and because
591 // if the action is newly incognito enabled, even though it's a reload, it's 571 // if the action is newly incognito enabled, even though it's a reload, it's
592 // a new extension to this toolbar. 572 // a new extension to this toolbar.
593 // We suppress the chevron during animation because, if we're expanding to 573 // We suppress the chevron during animation because, if we're expanding to
594 // show a new icon, we don't want to have the chevron visible only for the 574 // show a new icon, we don't want to have the chevron visible only for the
595 // duration of the animation. 575 // duration of the animation.
596 ResizeDelegate(gfx::Tween::LINEAR, true); 576 ResizeDelegate(gfx::Tween::LINEAR, true);
597 } 577 }
598 578
599 void ToolbarActionsBar::OnToolbarExtensionRemoved( 579 void ToolbarActionsBar::OnToolbarActionRemoved(const std::string& action_id) {
600 const extensions::Extension* extension) {
601 ToolbarActions::iterator iter = toolbar_actions_.begin(); 580 ToolbarActions::iterator iter = toolbar_actions_.begin();
602 while (iter != toolbar_actions_.end() && (*iter)->GetId() != extension->id()) 581 while (iter != toolbar_actions_.end() && (*iter)->GetId() != action_id)
603 ++iter; 582 ++iter;
604 583
605 if (iter == toolbar_actions_.end()) 584 if (iter == toolbar_actions_.end())
606 return; 585 return;
607 586
608 // The action should outlive the UI element (which is owned by the delegate), 587 // The action should outlive the UI element (which is owned by the delegate),
609 // so we can't delete it just yet. But we should remove it from the list of 588 // so we can't delete it just yet. But we should remove it from the list of
610 // actions so that any width calculations are correct. 589 // actions so that any width calculations are correct.
611 scoped_ptr<ToolbarActionViewController> removed_action(*iter); 590 scoped_ptr<ToolbarActionViewController> removed_action(*iter);
612 toolbar_actions_.weak_erase(iter); 591 toolbar_actions_.weak_erase(iter);
613 delegate_->RemoveViewForAction(removed_action.get()); 592 delegate_->RemoveViewForAction(removed_action.get());
614 removed_action.reset(); 593 removed_action.reset();
615 594
616 // If the extension is being upgraded we don't want the bar to shrink 595 // If the extension is being upgraded we don't want the bar to shrink
617 // because the icon is just going to get re-added to the same location. 596 // because the icon is just going to get re-added to the same location.
618 // There is an exception if this is an off-the-record profile, and the 597 // There is an exception if this is an off-the-record profile, and the
619 // extension is no longer incognito-enabled. 598 // extension is no longer incognito-enabled.
620 if (!extensions::ExtensionSystem::Get(browser_->profile())->runtime_data()-> 599 if (!extensions::ExtensionSystem::Get(browser_->profile())->runtime_data()->
621 IsBeingUpgraded(extension->id()) || 600 IsBeingUpgraded(action_id) ||
622 (browser_->profile()->IsOffTheRecord() && 601 (browser_->profile()->IsOffTheRecord() &&
623 !extensions::util::IsIncognitoEnabled(extension->id(), 602 !extensions::util::IsIncognitoEnabled(action_id,
624 browser_->profile()))) { 603 browser_->profile()))) {
625 if (toolbar_actions_.size() > model_->visible_icon_count()) { 604 if (toolbar_actions_.size() > model_->visible_icon_count()) {
626 // If we have more icons than we can show, then we must not be changing 605 // If we have more icons than we can show, then we must not be changing
627 // the container size (since we either removed an icon from the main 606 // the container size (since we either removed an icon from the main
628 // area and one from the overflow list will have shifted in, or we 607 // area and one from the overflow list will have shifted in, or we
629 // removed an entry directly from the overflow list). 608 // removed an entry directly from the overflow list).
630 delegate_->Redraw(false); 609 delegate_->Redraw(false);
631 } else { 610 } else {
632 delegate_->SetChevronVisibility(false); 611 delegate_->SetChevronVisibility(false);
633 // Either we went from overflow to no-overflow, or we shrunk the no- 612 // Either we went from overflow to no-overflow, or we shrunk the no-
634 // overflow container by 1. Either way the size changed, so animate. 613 // overflow container by 1. Either way the size changed, so animate.
635 ResizeDelegate(gfx::Tween::EASE_OUT, false); 614 ResizeDelegate(gfx::Tween::EASE_OUT, false);
636 } 615 }
637 } 616 }
638 617
639 SetOverflowedActionWantsToRun(); 618 SetOverflowedActionWantsToRun();
640 } 619 }
641 620
642 void ToolbarActionsBar::OnToolbarExtensionMoved( 621 void ToolbarActionsBar::OnToolbarActionMoved(const std::string& action_id,
643 const extensions::Extension* extension, 622 int index) {
644 int index) {
645 DCHECK(index >= 0 && index < static_cast<int>(toolbar_actions_.size())); 623 DCHECK(index >= 0 && index < static_cast<int>(toolbar_actions_.size()));
646 // Unfortunately, |index| doesn't really mean a lot to us, because this 624 // Unfortunately, |index| doesn't really mean a lot to us, because this
647 // window's toolbar could be different (if actions are popped out). Just 625 // window's toolbar could be different (if actions are popped out). Just
648 // do a full reorder. 626 // do a full reorder.
649 ReorderActions(); 627 ReorderActions();
650 } 628 }
651 629
652 void ToolbarActionsBar::OnToolbarExtensionUpdated( 630 void ToolbarActionsBar::OnToolbarActionUpdated(const std::string& action_id) {
653 const extensions::Extension* extension) { 631 ToolbarActionViewController* action = GetActionForId(action_id);
654 ToolbarActionViewController* action = GetActionForId(extension->id());
655 // There might not be a view in cases where we are highlighting or if we 632 // There might not be a view in cases where we are highlighting or if we
656 // haven't fully initialized the actions. 633 // haven't fully initialized the actions.
657 if (action) { 634 if (action) {
658 action->UpdateState(); 635 action->UpdateState();
659 SetOverflowedActionWantsToRun(); 636 SetOverflowedActionWantsToRun();
660 } 637 }
661 } 638 }
662 639
663 bool ToolbarActionsBar::ShowExtensionActionPopup( 640 bool ToolbarActionsBar::ShowToolbarActionPopup(const std::string& action_id,
664 const extensions::Extension* extension, 641 bool grant_active_tab) {
665 bool grant_active_tab) {
666 // Don't override another popup, and only show in the active window. 642 // Don't override another popup, and only show in the active window.
667 if (popup_owner() || !browser_->window()->IsActive()) 643 if (popup_owner() || !browser_->window()->IsActive())
668 return false; 644 return false;
669 645
670 ToolbarActionViewController* action = GetActionForId(extension->id()); 646 ToolbarActionViewController* action = GetActionForId(action_id);
671 return action && action->ExecuteAction(grant_active_tab); 647 return action && action->ExecuteAction(grant_active_tab);
672 } 648 }
673 649
674 void ToolbarActionsBar::OnToolbarVisibleCountChanged() { 650 void ToolbarActionsBar::OnToolbarVisibleCountChanged() {
675 ResizeDelegate(gfx::Tween::EASE_OUT, false); 651 ResizeDelegate(gfx::Tween::EASE_OUT, false);
676 SetOverflowedActionWantsToRun(); 652 SetOverflowedActionWantsToRun();
677 } 653 }
678 654
679 void ToolbarActionsBar::ResizeDelegate(gfx::Tween::Type tween_type, 655 void ToolbarActionsBar::ResizeDelegate(gfx::Tween::Type tween_type,
680 bool suppress_chevron) { 656 bool suppress_chevron) {
681 int desired_width = GetPreferredSize().width(); 657 int desired_width = GetPreferredSize().width();
682 if (desired_width != delegate_->GetWidth()) { 658 if (desired_width != delegate_->GetWidth()) {
683 delegate_->ResizeAndAnimate(tween_type, desired_width, suppress_chevron); 659 delegate_->ResizeAndAnimate(tween_type, desired_width, suppress_chevron);
684 } else if (delegate_->IsAnimating()) { 660 } else if (delegate_->IsAnimating()) {
685 // It's possible that we're right where we're supposed to be in terms of 661 // It's possible that we're right where we're supposed to be in terms of
686 // width, but that we're also currently resizing. If this is the case, end 662 // width, but that we're also currently resizing. If this is the case, end
687 // the current animation with the current width. 663 // the current animation with the current width.
688 delegate_->StopAnimating(); 664 delegate_->StopAnimating();
689 } else { 665 } else {
690 // We may already be at the right size (this can happen frequently with 666 // We may already be at the right size (this can happen frequently with
691 // overflow, where we have a fixed width, and in tests, where we skip 667 // overflow, where we have a fixed width, and in tests, where we skip
692 // animations). If this is the case, we still need to Redraw(), because the 668 // animations). If this is the case, we still need to Redraw(), because the
693 // icons within the toolbar may have changed (e.g. if we removed one 669 // icons within the toolbar may have changed (e.g. if we removed one
694 // action and added a different one in quick succession). 670 // action and added a different one in quick succession).
695 delegate_->Redraw(false); 671 delegate_->Redraw(false);
696 } 672 }
697 } 673 }
698 674
699 void ToolbarActionsBar::OnToolbarHighlightModeChanged(bool is_highlighting) { 675 void ToolbarActionsBar::OnToolbarHighlightModeChanged(bool is_highlighting) {
700 if (!model_->extensions_initialized()) 676 if (!model_->actions_initialized())
701 return; 677 return;
702 // It's a bit of a pain that we delete and recreate everything here, but given 678 // It's a bit of a pain that we delete and recreate everything here, but given
703 // everything else going on (the lack of highlight, [n] more extensions 679 // everything else going on (the lack of highlight, [n] more extensions
704 // appearing, etc), it's not worth the extra complexity to create and insert 680 // appearing, etc), it's not worth the extra complexity to create and insert
705 // only the new actions. 681 // only the new actions.
706 DeleteActions(); 682 DeleteActions();
707 CreateActions(); 683 CreateActions();
708 // Resize the delegate. We suppress the chevron so that we don't risk showing 684 // Resize the delegate. We suppress the chevron so that we don't risk showing
709 // it only for the duration of the animation. 685 // it only for the duration of the animation.
710 ResizeDelegate(gfx::Tween::LINEAR, true); 686 ResizeDelegate(gfx::Tween::LINEAR, true);
(...skipping 15 matching lines...) Expand all
726 Browser* ToolbarActionsBar::GetBrowser() { 702 Browser* ToolbarActionsBar::GetBrowser() {
727 return browser_; 703 return browser_;
728 } 704 }
729 705
730 void ToolbarActionsBar::ReorderActions() { 706 void ToolbarActionsBar::ReorderActions() {
731 if (toolbar_actions_.empty()) 707 if (toolbar_actions_.empty())
732 return; 708 return;
733 709
734 // First, reset the order to that of the model. 710 // First, reset the order to that of the model.
735 auto compare = [](ToolbarActionViewController* const& action, 711 auto compare = [](ToolbarActionViewController* const& action,
736 const scoped_refptr<const extensions::Extension>& ext) { 712 const std::string& id) {
737 return action->GetId() == ext->id(); 713 return action->GetId() == id;
738 }; 714 };
739 SortContainer(&toolbar_actions_.get(), model_->toolbar_items(), compare); 715 SortContainer(&toolbar_actions_.get(), model_->toolbar_items(), compare);
740 716
741 // Our visible browser actions may have changed - re-Layout() and check the 717 // Our visible browser actions may have changed - re-Layout() and check the
742 // size (if we aren't suppressing the layout). 718 // size (if we aren't suppressing the layout).
743 if (!suppress_layout_) { 719 if (!suppress_layout_) {
744 ResizeDelegate(gfx::Tween::EASE_OUT, false); 720 ResizeDelegate(gfx::Tween::EASE_OUT, false);
745 delegate_->Redraw(true); 721 delegate_->Redraw(true);
746 } 722 }
747 723
(...skipping 14 matching lines...) Expand all
762 738
763 if (overflowed_action_wants_to_run_ != overflowed_action_wants_to_run) { 739 if (overflowed_action_wants_to_run_ != overflowed_action_wants_to_run) {
764 overflowed_action_wants_to_run_ = overflowed_action_wants_to_run; 740 overflowed_action_wants_to_run_ = overflowed_action_wants_to_run;
765 if (send_overflowed_action_changes_) 741 if (send_overflowed_action_changes_)
766 delegate_->OnOverflowedActionWantsToRunChanged( 742 delegate_->OnOverflowedActionWantsToRunChanged(
767 overflowed_action_wants_to_run_); 743 overflowed_action_wants_to_run_);
768 } 744 }
769 } 745 }
770 746
771 ToolbarActionViewController* ToolbarActionsBar::GetActionForId( 747 ToolbarActionViewController* ToolbarActionsBar::GetActionForId(
772 const std::string& id) { 748 const std::string& action_id) {
773 for (ToolbarActionViewController* action : toolbar_actions_) { 749 for (ToolbarActionViewController* action : toolbar_actions_) {
774 if (action->GetId() == id) 750 if (action->GetId() == action_id)
775 return action; 751 return action;
776 } 752 }
777 return nullptr; 753 return nullptr;
778 } 754 }
779 755
780 content::WebContents* ToolbarActionsBar::GetCurrentWebContents() { 756 content::WebContents* ToolbarActionsBar::GetCurrentWebContents() {
781 return browser_->tab_strip_model()->GetActiveWebContents(); 757 return browser_->tab_strip_model()->GetActiveWebContents();
782 } 758 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698