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

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

Issue 547303003: Keep reference view pressed while extension actions have a popup (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: VIEWS_EXPORT fix 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_action_view.h" 5 #include "chrome/browser/ui/views/toolbar/browser_action_view.h"
6 6
7 #include <string> 7 #include <string>
8 8
9 #include "base/strings/utf_string_conversions.h" 9 #include "base/strings/utf_string_conversions.h"
10 #include "chrome/browser/chrome_notification_types.h" 10 #include "chrome/browser/chrome_notification_types.h"
(...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after
123 void BrowserActionView::ButtonPressed(views::Button* sender, 123 void BrowserActionView::ButtonPressed(views::Button* sender,
124 const ui::Event& event) { 124 const ui::Event& event) {
125 view_controller_->ExecuteActionByUser(); 125 view_controller_->ExecuteActionByUser();
126 } 126 }
127 127
128 void BrowserActionView::UpdateState() { 128 void BrowserActionView::UpdateState() {
129 int tab_id = view_controller_->GetCurrentTabId(); 129 int tab_id = view_controller_->GetCurrentTabId();
130 if (tab_id < 0) 130 if (tab_id < 0)
131 return; 131 return;
132 132
133 if (!IsEnabled(tab_id)) { 133 if (!IsEnabled(tab_id))
134 SetState(views::CustomButton::STATE_DISABLED); 134 SetState(views::CustomButton::STATE_DISABLED);
135 } else {
136 SetState(menu_visible_ ?
137 views::CustomButton::STATE_PRESSED :
138 views::CustomButton::STATE_NORMAL);
139 }
140 135
141 gfx::ImageSkia icon = *view_controller_->GetIcon(tab_id).ToImageSkia(); 136 gfx::ImageSkia icon = *view_controller_->GetIcon(tab_id).ToImageSkia();
142 137
143 if (!icon.isNull()) { 138 if (!icon.isNull()) {
144 if (!extension_action()->GetIsVisible(tab_id)) 139 if (!extension_action()->GetIsVisible(tab_id))
145 icon = gfx::ImageSkiaOperations::CreateTransparentImage(icon, .25); 140 icon = gfx::ImageSkiaOperations::CreateTransparentImage(icon, .25);
146 141
147 ThemeService* theme = ThemeServiceFactory::GetForProfile( 142 ThemeService* theme = ThemeServiceFactory::GetForProfile(
148 view_controller_->browser()->profile()); 143 view_controller_->browser()->profile());
149 144
(...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after
248 LabelButton::OnGestureEvent(event); 243 LabelButton::OnGestureEvent(event);
249 } 244 }
250 245
251 scoped_ptr<LabelButtonBorder> BrowserActionView::CreateDefaultBorder() const { 246 scoped_ptr<LabelButtonBorder> BrowserActionView::CreateDefaultBorder() const {
252 scoped_ptr<LabelButtonBorder> border = LabelButton::CreateDefaultBorder(); 247 scoped_ptr<LabelButtonBorder> border = LabelButton::CreateDefaultBorder();
253 border->set_insets(gfx::Insets(kBorderInset, kBorderInset, 248 border->set_insets(gfx::Insets(kBorderInset, kBorderInset,
254 kBorderInset, kBorderInset)); 249 kBorderInset, kBorderInset));
255 return border.Pass(); 250 return border.Pass();
256 } 251 }
257 252
258 void BrowserActionView::SetButtonPushed() {
259 SetState(views::CustomButton::STATE_PRESSED);
260 menu_visible_ = true;
261 }
262
263 void BrowserActionView::SetButtonNotPushed() {
264 SetState(views::CustomButton::STATE_NORMAL);
265 menu_visible_ = false;
266 }
267
268 bool BrowserActionView::IsEnabled(int tab_id) const { 253 bool BrowserActionView::IsEnabled(int tab_id) const {
269 return view_controller_->extension_action()->GetIsVisible(tab_id); 254 return view_controller_->extension_action()->GetIsVisible(tab_id);
270 } 255 }
271 256
272 gfx::ImageSkia BrowserActionView::GetIconWithBadge() { 257 gfx::ImageSkia BrowserActionView::GetIconWithBadge() {
273 int tab_id = view_controller_->GetCurrentTabId(); 258 int tab_id = view_controller_->GetCurrentTabId();
274 gfx::Size spacing(0, ToolbarView::kVertSpacing); 259 gfx::Size spacing(0, ToolbarView::kVertSpacing);
275 gfx::ImageSkia icon = *view_controller_->GetIcon(tab_id).ToImageSkia(); 260 gfx::ImageSkia icon = *view_controller_->GetIcon(tab_id).ToImageSkia();
276 if (!IsEnabled(tab_id)) 261 if (!IsEnabled(tab_id))
277 icon = gfx::ImageSkiaOperations::CreateTransparentImage(icon, .25); 262 icon = gfx::ImageSkiaOperations::CreateTransparentImage(icon, .25);
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
316 view_controller(); 301 view_controller();
317 } 302 }
318 303
319 views::View* BrowserActionView::GetReferenceViewForPopup() { 304 views::View* BrowserActionView::GetReferenceViewForPopup() {
320 // Browser actions in the overflow menu can still show popups, so we may need 305 // Browser actions in the overflow menu can still show popups, so we may need
321 // a reference view other than this button's parent. If so, use the overflow 306 // a reference view other than this button's parent. If so, use the overflow
322 // view. 307 // view.
323 return visible() ? this : delegate_->GetOverflowReferenceView(); 308 return visible() ? this : delegate_->GetOverflowReferenceView();
324 } 309 }
325 310
311 views::MenuButton* BrowserActionView::GetContextMenuButton() {
312 DCHECK(visible()); // We should never show a context menu for a hidden item.
313 return this;
314 }
315
326 content::WebContents* BrowserActionView::GetCurrentWebContents() { 316 content::WebContents* BrowserActionView::GetCurrentWebContents() {
327 return delegate_->GetCurrentWebContents(); 317 return delegate_->GetCurrentWebContents();
328 } 318 }
329 319
330 void BrowserActionView::HideActivePopup() { 320 void BrowserActionView::HideActivePopup() {
331 delegate_->HideActivePopup(); 321 delegate_->HideActivePopup();
332 } 322 }
333 323
334 void BrowserActionView::OnPopupShown(bool grant_tab_permissions) { 324 void BrowserActionView::OnPopupShown(bool grant_tab_permissions) {
335 delegate_->SetPopupOwner(this); 325 delegate_->SetPopupOwner(this);
336 if (grant_tab_permissions) 326 // If this was through direct user action, we press the menu button.
337 SetButtonPushed(); 327 if (grant_tab_permissions) {
328 // We set the state of the menu button we're using as a reference view,
329 // which is either this or the overflow reference view.
330 // This cast is safe because GetReferenceViewForPopup returns either |this|
331 // or delegate_->GetOverflowReferenceView(), which returns a MenuButton.
332 views::MenuButton* reference_view =
333 static_cast<views::MenuButton*>(GetReferenceViewForPopup());
334 pressed_lock_.reset(new views::MenuButton::PressedLock(reference_view));
335 }
338 } 336 }
339 337
340 void BrowserActionView::CleanupPopup() { 338 void BrowserActionView::CleanupPopup() {
341 // We need to do these actions synchronously (instead of closing and then 339 // We need to do these actions synchronously (instead of closing and then
342 // performing the rest of the cleanup in OnWidgetDestroyed()) because 340 // performing the rest of the cleanup in OnWidgetDestroyed()) because
343 // OnWidgetDestroyed() can be called asynchronously from Close(), and we need 341 // OnWidgetDestroyed() can be called asynchronously from Close(), and we need
344 // to keep the delegate's popup owner up-to-date. 342 // to keep the delegate's popup owner up-to-date.
345 SetButtonNotPushed();
346 delegate_->SetPopupOwner(NULL); 343 delegate_->SetPopupOwner(NULL);
344 pressed_lock_.reset(); // Unpress the menu button if it was pressed.
347 } 345 }
348
349 void BrowserActionView::OnWillShowContextMenus() {
350 SetButtonPushed();
351 }
352
353 void BrowserActionView::OnContextMenuDone() {
354 SetButtonNotPushed();
355 }
OLDNEW
« no previous file with comments | « chrome/browser/ui/views/toolbar/browser_action_view.h ('k') | chrome/browser/ui/views/toolbar/browser_actions_container.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698