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

Unified 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 side-by-side diff with in-line comments
Download patch
Index: chrome/browser/ui/views/toolbar/browser_actions_container.cc
diff --git a/chrome/browser/ui/views/toolbar/browser_actions_container.cc b/chrome/browser/ui/views/toolbar/browser_actions_container.cc
index a1398c167f41fba1b8af89737cab218a88ed9974..55706072a72a2671d7c3740606b874f86793d055 100644
--- a/chrome/browser/ui/views/toolbar/browser_actions_container.cc
+++ b/chrome/browser/ui/views/toolbar/browser_actions_container.cc
@@ -17,6 +17,7 @@
#include "chrome/browser/ui/views/extensions/extension_popup.h"
#include "chrome/browser/ui/views/frame/browser_view.h"
#include "chrome/browser/ui/views/toolbar/browser_actions_container_observer.h"
+#include "chrome/browser/ui/views/toolbar/chrome_actions_registry.h"
#include "chrome/browser/ui/views/toolbar/toolbar_view.h"
#include "chrome/common/extensions/command.h"
#include "chrome/grit/generated_resources.h"
@@ -130,7 +131,7 @@ BrowserActionsContainer::~BrowserActionsContainer() {
if (model_)
model_->RemoveObserver(this);
HideActivePopup();
- DeleteBrowserActionViews();
+ DeleteActionViews();
}
void BrowserActionsContainer::Init() {
@@ -149,18 +150,25 @@ void BrowserActionsContainer::Init() {
BrowserActionView* BrowserActionsContainer::GetViewForExtension(
const Extension* extension) {
for (BrowserActionView* view : browser_action_views_) {
- if (view->extension() == extension)
+ if (view->GetExtensionActionViewController()->extension() == extension)
return view;
}
return NULL;
}
-void BrowserActionsContainer::RefreshBrowserActionViews() {
+const Extension* BrowserActionsContainer::GetExtensionAt(size_t index) const {
+ return browser_action_views_[index]->GetExtensionActionViewController()->
+ extension();
+}
+
+void BrowserActionsContainer::RefreshActionViews() {
for (BrowserActionView* view : browser_action_views_)
view->UpdateState();
+ for (BrowserActionView* view : chrome_action_views_)
+ view->UpdateState();
}
-void BrowserActionsContainer::CreateBrowserActionViews() {
+void BrowserActionsContainer::CreateActionViews() {
DCHECK(browser_action_views_.empty());
if (!model_)
return;
@@ -169,19 +177,39 @@ void BrowserActionsContainer::CreateBrowserActionViews() {
extensions::ExtensionActionManager::Get(profile_);
const extensions::ExtensionList& toolbar_items = model_->toolbar_items();
sky 2014/10/15 23:52:30 Seems like there should be one unified presentatio
Devlin 2014/10/16 16:46:38 In a perfect world, yes. But that will lead to a
sky 2014/10/16 18:13:39 I think it's possible to do this incrementally. No
Devlin 2014/10/16 22:05:27 I'm curious what you think of Patch Set 3's approa
for (const scoped_refptr<const Extension>& extension : toolbar_items) {
- BrowserActionView* view =
- new BrowserActionView(extension.get(),
- action_manager->GetExtensionAction(*extension),
- browser_,
- this);
+ BrowserActionView* view = new BrowserActionView(
+ make_scoped_ptr(new ExtensionActionViewController(
+ extension.get(),
+ browser_,
+ action_manager->GetExtensionAction(*extension),
+ NULL)),
+ BrowserActionView::TYPE_EXTENSION_ACTION,
+ browser_,
+ this);
browser_action_views_.push_back(view);
AddChildView(view);
}
+
+ ScopedVector<ToolbarActionViewController> chrome_actions =
+ ChromeActionsRegistry::GetChromeActions();
+ DCHECK(extensions::FeatureSwitch::extension_action_redesign()->IsEnabled() ||
+ chrome_actions.empty());
+ for (ToolbarActionViewController* controller : chrome_actions) {
+ BrowserActionView* view = new BrowserActionView(
+ make_scoped_ptr(controller),
+ BrowserActionView::TYPE_CHROME_ACTION,
+ browser_,
+ this);
+ chrome_action_views_.push_back(view);
+ AddChildView(view);
+ }
+ chrome_actions.weak_clear();
}
-void BrowserActionsContainer::DeleteBrowserActionViews() {
+void BrowserActionsContainer::DeleteActionViews() {
HideActivePopup();
STLDeleteElements(&browser_action_views_);
+ STLDeleteElements(&chrome_action_views_);
}
size_t BrowserActionsContainer::VisibleBrowserActions() const {
@@ -254,11 +282,25 @@ void BrowserActionsContainer::HideActivePopup() {
popup_owner_->view_controller()->HidePopup();
}
-BrowserActionView* BrowserActionsContainer::GetMainViewForExtension(
- const Extension* extension) {
- return in_overflow_mode() ?
- main_container_->GetViewForExtension(extension) :
- GetViewForExtension(extension);
+BrowserActionView* BrowserActionsContainer::GetMainViewForAction(
+ BrowserActionView* view) {
+ if (!in_overflow_mode())
+ return view; // This is the main view.
+
+ // The overflow container and main container each have the same views and
+ // view indices, so we can return the view of the index that |view| has in
+ // this container.
+ bool is_extension_action =
+ view->type() == BrowserActionView::TYPE_EXTENSION_ACTION;
+ const BrowserActionViews& views =
+ is_extension_action ? browser_action_views_ : chrome_action_views_;
+ BrowserActionViews::const_iterator iter =
+ std::find(views.begin(), views.end(), view);
+ DCHECK(iter != views.end());
+ size_t index = iter - views.begin();
+ return is_extension_action ?
+ main_container_->browser_action_views_[index] :
+ main_container_->chrome_action_views_[index];
}
void BrowserActionsContainer::AddObserver(
@@ -312,7 +354,7 @@ gfx::Size BrowserActionsContainer::GetMinimumSize() const {
}
void BrowserActionsContainer::Layout() {
- if (browser_action_views_.empty()) {
+ if (browser_action_views_.empty() && chrome_action_views_.empty()) {
SetVisible(false);
return;
}
@@ -336,6 +378,14 @@ void BrowserActionsContainer::Layout() {
chevron_->SetVisible(false);
}
+ // Construct a single vector of all views to draw to ease calculation (since
+ // this only copies pointers, it's cheap).
+ BrowserActionViews views(browser_action_views_.begin(),
+ browser_action_views_.end());
+ views.insert(views.end(),
+ chrome_action_views_.begin(),
+ chrome_action_views_.end());
+
// The padding before the first icon and after the last icon in the container.
int container_padding =
in_overflow_mode() ? kItemSpacing : ToolbarView::kStandardSpacing;
@@ -347,7 +397,7 @@ void BrowserActionsContainer::Layout() {
// can display with the given width. We add an extra kItemSpacing because the
// last icon doesn't need padding, but we want it to divide easily.
size_t end_index = in_overflow_mode() ?
- browser_action_views_.size() :
+ views.size() :
(max_x - 2 * container_padding + kItemSpacing) / IconWidth(true);
// The maximum length for one row of icons.
size_t row_length =
@@ -356,8 +406,8 @@ void BrowserActionsContainer::Layout() {
// Now draw the icons for the browser actions in the available space. Once
// all the variables are in place, the layout works equally well for the main
// and overflow container.
- for (size_t i = 0u; i < browser_action_views_.size(); ++i) {
- BrowserActionView* view = browser_action_views_[i];
+ for (size_t i = 0u; i < views.size(); ++i) {
+ BrowserActionView* view = views[i];
if (i < start_index || i >= end_index) {
view->SetVisible(false);
} else {
@@ -479,8 +529,7 @@ int BrowserActionsContainer::OnPerformDrop(
return ui::DragDropTypes::DRAG_NONE;
// Make sure we have the same view as we started with.
- DCHECK_EQ(browser_action_views_[data.index()]->extension()->id(),
- data.id());
+ DCHECK_EQ(GetExtensionAt(data.index())->id(), data.id());
DCHECK(model_);
size_t i = drop_position_->row * icons_per_overflow_menu_row_ +
@@ -499,8 +548,7 @@ int BrowserActionsContainer::OnPerformDrop(
// visible icons.
bool drag_between_containers =
!browser_action_views_[data.index()]->visible();
- model_->MoveExtensionIcon(
- browser_action_views_[data.index()]->extension(), i);
+ model_->MoveExtensionIcon(GetExtensionAt(data.index()), i);
if (drag_between_containers) {
// Let the main container update the model.
@@ -529,11 +577,13 @@ void BrowserActionsContainer::WriteDragDataForView(View* sender,
browser_action_views_.end(),
sender);
DCHECK(iter != browser_action_views_.end());
- drag_utils::SetDragImageOnDataObject((*iter)->GetIconWithBadge(),
+ ExtensionActionViewController* view_controller =
+ (*iter)->GetExtensionActionViewController();
+ drag_utils::SetDragImageOnDataObject(view_controller->GetIconWithBadge(),
press_pt.OffsetFromOrigin(),
data);
// Fill in the remaining info.
- BrowserActionDragData drag_data((*iter)->extension()->id(),
+ BrowserActionDragData drag_data(view_controller->extension()->id(),
iter - browser_action_views_.begin());
drag_data.Write(profile_, data);
}
@@ -606,7 +656,9 @@ extensions::ActiveTabPermissionGranter*
}
ExtensionPopup* BrowserActionsContainer::TestGetPopup() {
- return popup_owner_ ? popup_owner_->view_controller()->popup() : NULL;
+ return popup_owner_ ?
+ popup_owner_->GetExtensionActionViewController()->popup() :
+ NULL;
}
void BrowserActionsContainer::OnPaint(gfx::Canvas* canvas) {
@@ -679,7 +731,7 @@ void BrowserActionsContainer::ViewHierarchyChanged(
// We do this here instead of in the constructor because AddBrowserAction
// calls Layout on the Toolbar, which needs this object to be constructed
// before its Layout function is called.
- CreateBrowserActionViews();
+ CreateActionViews();
}
}
@@ -720,12 +772,16 @@ void BrowserActionsContainer::ToolbarExtensionAdded(const Extension* extension,
chevron_->CloseMenu();
// Add the new browser action to the vector and the view hierarchy.
- BrowserActionView* view =
- new BrowserActionView(extension,
- extensions::ExtensionActionManager::Get(profile_)->
- GetExtensionAction(*extension),
- browser_,
- this);
+ BrowserActionView* view = new BrowserActionView(
+ make_scoped_ptr(new ExtensionActionViewController(
+ extension,
+ browser_,
+ extensions::ExtensionActionManager::Get(profile_)->
+ GetExtensionAction(*extension),
+ NULL)),
+ BrowserActionView::TYPE_EXTENSION_ACTION,
+ browser_,
+ this);
browser_action_views_.insert(browser_action_views_.begin() + index, view);
AddChildViewAt(view, index);
@@ -765,7 +821,7 @@ void BrowserActionsContainer::ToolbarExtensionRemoved(
size_t visible_actions = VisibleBrowserActionsAfterAnimation();
for (BrowserActionViews::iterator i(browser_action_views_.begin());
i != browser_action_views_.end(); ++i) {
- if ((*i)->extension() == extension) {
+ if ((*i)->GetExtensionActionViewController()->extension() == extension) {
delete *i;
browser_action_views_.erase(i);
@@ -799,9 +855,8 @@ void BrowserActionsContainer::ToolbarExtensionMoved(const Extension* extension,
BrowserActionViews::iterator iter = browser_action_views_.begin();
while (iter != browser_action_views_.end() &&
- (*iter)->extension() != extension) {
+ (*iter)->GetExtensionActionViewController()->extension() != extension)
++iter;
- }
DCHECK(iter != browser_action_views_.end());
if (iter - browser_action_views_.begin() == index)
@@ -831,8 +886,8 @@ bool BrowserActionsContainer::ShowExtensionActionPopup(
return false;
BrowserActionView* view = GetViewForExtension(extension);
- return view && view->view_controller()->ExecuteAction(ExtensionPopup::SHOW,
- grant_active_tab);
+ return view && view->GetExtensionActionViewController()->ExecuteAction(
+ ExtensionPopup::SHOW, grant_active_tab);
}
void BrowserActionsContainer::ToolbarVisibleCountChanged() {
@@ -846,8 +901,8 @@ void BrowserActionsContainer::ToolbarHighlightModeChanged(
// we delete and recreate everything here, but given everything else going on
// (the lack of highlight, n more extensions appearing, etc), it's not worth
// the extra complexity to create and insert only the new extensions.
- DeleteBrowserActionViews();
- CreateBrowserActionViews();
+ DeleteActionViews();
+ CreateActionViews();
Animate(gfx::Tween::LINEAR, GetIconCount());
}
@@ -968,6 +1023,7 @@ size_t BrowserActionsContainer::GetIconCount() const {
// The overflow displays any icons not shown by the main bar.
return in_overflow_mode() ?
- model_->toolbar_items().size() - absolute_model_visible_size :
+ model_->toolbar_items().size() - absolute_model_visible_size +
+ chrome_action_views_.size() :
absolute_model_visible_size;
}

Powered by Google App Engine
This is Rietveld 408576698