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

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

Issue 489183005: Make a ShowExtensionActionPopup function (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Peter's Created 6 years, 3 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/extension_util.h" 10 #include "chrome/browser/extensions/extension_util.h"
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
59 // The maximum number of icons to show per row when in overflow mode (showing 59 // The maximum number of icons to show per row when in overflow mode (showing
60 // icons in the application menu). 60 // icons in the application menu).
61 // TODO(devlin): Compute the right number of icons to show, depending on the 61 // TODO(devlin): Compute the right number of icons to show, depending on the
62 // menu width. 62 // menu width.
63 #if defined(OS_LINUX) 63 #if defined(OS_LINUX)
64 const int kIconsPerMenuRow = 8; // The menu on Linux is wider. 64 const int kIconsPerMenuRow = 8; // The menu on Linux is wider.
65 #else 65 #else
66 const int kIconsPerMenuRow = 7; 66 const int kIconsPerMenuRow = 7;
67 #endif 67 #endif
68 68
69 // Returns the ExtensionAction for the given |extension|.
70 ExtensionAction* GetExtensionAction(const Extension& extension,
71 Profile* profile) {
72 extensions::ExtensionActionManager* action_manager =
73 extensions::ExtensionActionManager::Get(profile);
74 ExtensionAction* action = action_manager->GetBrowserAction(extension);
75 return action ? action : action_manager->GetPageAction(extension);
76 }
77
78 // A version of MenuButton with almost empty insets to fit properly on the 69 // A version of MenuButton with almost empty insets to fit properly on the
79 // toolbar. 70 // toolbar.
80 class ChevronMenuButton : public views::MenuButton { 71 class ChevronMenuButton : public views::MenuButton {
81 public: 72 public:
82 ChevronMenuButton(views::ButtonListener* listener, 73 ChevronMenuButton(views::ButtonListener* listener,
83 const base::string16& text, 74 const base::string16& text,
84 views::MenuButtonListener* menu_button_listener, 75 views::MenuButtonListener* menu_button_listener,
85 bool show_menu_marker) 76 bool show_menu_marker)
86 : views::MenuButton(listener, 77 : views::MenuButton(listener,
87 text, 78 text,
(...skipping 131 matching lines...) Expand 10 before | Expand all | Expand 10 after
219 void BrowserActionsContainer::RefreshBrowserActionViews() { 210 void BrowserActionsContainer::RefreshBrowserActionViews() {
220 for (size_t i = 0; i < browser_action_views_.size(); ++i) 211 for (size_t i = 0; i < browser_action_views_.size(); ++i)
221 browser_action_views_[i]->UpdateState(); 212 browser_action_views_[i]->UpdateState();
222 } 213 }
223 214
224 void BrowserActionsContainer::CreateBrowserActionViews() { 215 void BrowserActionsContainer::CreateBrowserActionViews() {
225 DCHECK(browser_action_views_.empty()); 216 DCHECK(browser_action_views_.empty());
226 if (!model_) 217 if (!model_)
227 return; 218 return;
228 219
220 extensions::ExtensionActionManager* action_manager =
221 extensions::ExtensionActionManager::Get(profile_);
229 const extensions::ExtensionList& toolbar_items = model_->toolbar_items(); 222 const extensions::ExtensionList& toolbar_items = model_->toolbar_items();
230 for (extensions::ExtensionList::const_iterator i(toolbar_items.begin()); 223 for (extensions::ExtensionList::const_iterator i(toolbar_items.begin());
231 i != toolbar_items.end(); ++i) { 224 i != toolbar_items.end(); ++i) {
232 if (!ShouldDisplayBrowserAction(i->get())) 225 if (!ShouldDisplayBrowserAction(i->get()))
233 continue; 226 continue;
234 227
235 BrowserActionView* view = 228 BrowserActionView* view =
236 new BrowserActionView(i->get(), 229 new BrowserActionView(i->get(),
237 GetExtensionAction(*i->get(), profile_), 230 action_manager->GetExtensionAction(**i),
238 browser_, 231 browser_,
239 this); 232 this);
240 browser_action_views_.push_back(view); 233 browser_action_views_.push_back(view);
241 AddChildView(view); 234 AddChildView(view);
242 } 235 }
243 } 236 }
244 237
245 void BrowserActionsContainer::DeleteBrowserActionViews() { 238 void BrowserActionsContainer::DeleteBrowserActionViews() {
246 HideActivePopup(); 239 HideActivePopup();
247 if (overflow_menu_) 240 if (overflow_menu_)
(...skipping 557 matching lines...) Expand 10 before | Expand all | Expand 10 after
805 CloseOverflowMenu(); 798 CloseOverflowMenu();
806 799
807 if (!ShouldDisplayBrowserAction(extension)) 800 if (!ShouldDisplayBrowserAction(extension))
808 return; 801 return;
809 802
810 // Add the new browser action to the vector and the view hierarchy. 803 // Add the new browser action to the vector and the view hierarchy.
811 if (profile_->IsOffTheRecord()) 804 if (profile_->IsOffTheRecord())
812 index = model_->OriginalIndexToIncognito(index); 805 index = model_->OriginalIndexToIncognito(index);
813 BrowserActionView* view = 806 BrowserActionView* view =
814 new BrowserActionView(extension, 807 new BrowserActionView(extension,
815 GetExtensionAction(*extension, profile_), 808 extensions::ExtensionActionManager::Get(profile_)->
809 GetExtensionAction(*extension),
816 browser_, 810 browser_,
817 this); 811 this);
818 browser_action_views_.insert(browser_action_views_.begin() + index, view); 812 browser_action_views_.insert(browser_action_views_.begin() + index, view);
819 AddChildViewAt(view, index); 813 AddChildViewAt(view, index);
820 814
821 // If we are still initializing the container, don't bother animating. 815 // If we are still initializing the container, don't bother animating.
822 if (!model_->extensions_initialized()) 816 if (!model_->extensions_initialized())
823 return; 817 return;
824 818
825 // Enlarge the container if it was already at maximum size and we're not in 819 // Enlarge the container if it was already at maximum size and we're not in
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after
902 } 896 }
903 897
904 void BrowserActionsContainer::ToolbarExtensionUpdated( 898 void BrowserActionsContainer::ToolbarExtensionUpdated(
905 const Extension* extension) { 899 const Extension* extension) {
906 BrowserActionView* view = GetViewForExtension(extension); 900 BrowserActionView* view = GetViewForExtension(extension);
907 if (view) 901 if (view)
908 view->UpdateState(); 902 view->UpdateState();
909 } 903 }
910 904
911 bool BrowserActionsContainer::ShowExtensionActionPopup( 905 bool BrowserActionsContainer::ShowExtensionActionPopup(
912 const Extension* extension) { 906 const Extension* extension,
913 return ShowPopupForExtension(extension, false, false); 907 bool grant_active_tab) {
908 // Don't override another popup, and only show in the active window.
909 if (popup_owner_ || !browser_->window()->IsActive())
910 return false;
911
912 BrowserActionView* view = GetViewForExtension(extension);
913 return view && view->view_controller()->ExecuteAction(ExtensionPopup::SHOW,
914 grant_active_tab);
914 } 915 }
915 916
916 void BrowserActionsContainer::ToolbarVisibleCountChanged() { 917 void BrowserActionsContainer::ToolbarVisibleCountChanged() {
917 int old_container_width = container_width_; 918 int old_container_width = container_width_;
918 SetContainerWidth(); 919 SetContainerWidth();
919 if (old_container_width != container_width_) 920 if (old_container_width != container_width_)
920 Animate(gfx::Tween::EASE_OUT, GetIconCount()); 921 Animate(gfx::Tween::EASE_OUT, GetIconCount());
921 } 922 }
922 923
923 void BrowserActionsContainer::ToolbarHighlightModeChanged( 924 void BrowserActionsContainer::ToolbarHighlightModeChanged(
924 bool is_highlighting) { 925 bool is_highlighting) {
925 // The visual highlighting is done in OnPaint(). It's a bit of a pain that 926 // The visual highlighting is done in OnPaint(). It's a bit of a pain that
926 // we delete and recreate everything here, but given everything else going on 927 // we delete and recreate everything here, but given everything else going on
927 // (the lack of highlight, n more extensions appearing, etc), it's not worth 928 // (the lack of highlight, n more extensions appearing, etc), it's not worth
928 // the extra complexity to create and insert only the new extensions. 929 // the extra complexity to create and insert only the new extensions.
929 DeleteBrowserActionViews(); 930 DeleteBrowserActionViews();
930 CreateBrowserActionViews(); 931 CreateBrowserActionViews();
931 Animate(gfx::Tween::LINEAR, browser_action_views_.size()); 932 Animate(gfx::Tween::LINEAR, browser_action_views_.size());
932 } 933 }
933 934
935 Browser* BrowserActionsContainer::GetBrowser() {
936 return browser_;
937 }
938
934 void BrowserActionsContainer::LoadImages() { 939 void BrowserActionsContainer::LoadImages() {
935 ui::ThemeProvider* tp = GetThemeProvider(); 940 ui::ThemeProvider* tp = GetThemeProvider();
936 if (!tp || !chevron_) 941 if (!tp || !chevron_)
937 return; 942 return;
938 943
939 chevron_->SetImage(views::Button::STATE_NORMAL, 944 chevron_->SetImage(views::Button::STATE_NORMAL,
940 *tp->GetImageSkiaNamed(IDR_BROWSER_ACTIONS_OVERFLOW)); 945 *tp->GetImageSkiaNamed(IDR_BROWSER_ACTIONS_OVERFLOW));
941 946
942 const int kImages[] = IMAGE_GRID(IDR_DEVELOPER_MODE_HIGHLIGHT); 947 const int kImages[] = IMAGE_GRID(IDR_DEVELOPER_MODE_HIGHLIGHT);
943 highlight_painter_.reset(views::Painter::CreateImageGridPainter(kImages)); 948 highlight_painter_.reset(views::Painter::CreateImageGridPainter(kImages));
(...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after
1046 } 1051 }
1047 } 1052 }
1048 1053
1049 bool BrowserActionsContainer::ShouldDisplayBrowserAction( 1054 bool BrowserActionsContainer::ShouldDisplayBrowserAction(
1050 const Extension* extension) const { 1055 const Extension* extension) const {
1051 // Only display incognito-enabled extensions while in incognito mode. 1056 // Only display incognito-enabled extensions while in incognito mode.
1052 return !profile_->IsOffTheRecord() || 1057 return !profile_->IsOffTheRecord() ||
1053 extensions::util::IsIncognitoEnabled(extension->id(), profile_); 1058 extensions::util::IsIncognitoEnabled(extension->id(), profile_);
1054 } 1059 }
1055 1060
1056 bool BrowserActionsContainer::ShowPopupForExtension(
1057 const extensions::Extension* extension,
1058 bool grant_tab_permissions,
1059 bool can_override) {
1060 // If the popup cannot override other views, then no other popups can be
1061 // showing, and it must be shown in the active widow with a visible toolbar.
1062 // TODO(justinlin): Remove toolbar check when http://crbug.com/308645 is
1063 // fixed.
1064 if (!can_override &&
1065 (popup_owner_ ||
1066 !browser_->window()->IsActive() ||
1067 !browser_->window()->IsToolbarVisible())) {
1068 return false;
1069 }
1070
1071 BrowserActionView* view = GetViewForExtension(extension);
1072 return view ? view->view_controller()->ExecuteAction(
1073 ExtensionPopup::SHOW, grant_tab_permissions) : false;
1074 }
1075
1076 BrowserActionView* BrowserActionsContainer::GetViewForExtension( 1061 BrowserActionView* BrowserActionsContainer::GetViewForExtension(
1077 const Extension* extension) { 1062 const Extension* extension) {
1078 for (BrowserActionViews::iterator view = browser_action_views_.begin(); 1063 for (BrowserActionViews::iterator view = browser_action_views_.begin();
1079 view != browser_action_views_.end(); ++view) { 1064 view != browser_action_views_.end(); ++view) {
1080 if ((*view)->extension() == extension) 1065 if ((*view)->extension() == extension)
1081 return *view; 1066 return *view;
1082 } 1067 }
1083 1068
1084 return NULL; 1069 return NULL;
1085 } 1070 }
(...skipping 13 matching lines...) Expand all
1099 size_t absolute_model_size = 1084 size_t absolute_model_size =
1100 model_size == -1 ? extensions.size() : model_size; 1085 model_size == -1 ? extensions.size() : model_size;
1101 1086
1102 // The main container will try to show |model_size| icons, but reduce if there 1087 // The main container will try to show |model_size| icons, but reduce if there
1103 // aren't enough displayable icons to do so. 1088 // aren't enough displayable icons to do so.
1104 size_t main_displayed = std::min(displayable_icon_count, absolute_model_size); 1089 size_t main_displayed = std::min(displayable_icon_count, absolute_model_size);
1105 // The overflow will display the extras, if any. 1090 // The overflow will display the extras, if any.
1106 return in_overflow_mode() ? 1091 return in_overflow_mode() ?
1107 displayable_icon_count - main_displayed : main_displayed; 1092 displayable_icon_count - main_displayed : main_displayed;
1108 } 1093 }
OLDNEW
« no previous file with comments | « chrome/browser/ui/views/toolbar/browser_actions_container.h ('k') | chrome/browser/ui/views/toolbar/toolbar_view.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698