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

Side by Side Diff: ash/system/tray/system_tray.cc

Issue 2897553002: Do not activate TrayBubbleView by default (Closed)
Patch Set: Add comment. Created 3 years, 6 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 (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 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 "ash/system/tray/system_tray.h" 5 #include "ash/system/tray/system_tray.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <map> 8 #include <map>
9 #include <vector> 9 #include <vector>
10 10
11 #include "ash/accelerators/accelerator_controller.h"
11 #include "ash/key_event_watcher.h" 12 #include "ash/key_event_watcher.h"
12 #include "ash/login_status.h" 13 #include "ash/login_status.h"
13 #include "ash/public/cpp/config.h" 14 #include "ash/public/cpp/config.h"
14 #include "ash/public/cpp/shell_window_ids.h" 15 #include "ash/public/cpp/shell_window_ids.h"
15 #include "ash/root_window_controller.h" 16 #include "ash/root_window_controller.h"
16 #include "ash/session/session_controller.h" 17 #include "ash/session/session_controller.h"
17 #include "ash/shelf/shelf.h" 18 #include "ash/shelf/shelf.h"
18 #include "ash/shell.h" 19 #include "ash/shell.h"
19 #include "ash/shell_port.h" 20 #include "ash/shell_port.h"
20 #include "ash/strings/grit/ash_strings.h" 21 #include "ash/strings/grit/ash_strings.h"
(...skipping 182 matching lines...) Expand 10 before | Expand all | Expand 10 after
203 204
204 // Since user avatar is on the right hand side of System tray of a 205 // Since user avatar is on the right hand side of System tray of a
205 // horizontal shelf and that is sufficient to indicate separation, no 206 // horizontal shelf and that is sufficient to indicate separation, no
206 // separator is required. 207 // separator is required.
207 set_separator_visibility(false); 208 set_separator_visibility(false);
208 } 209 }
209 210
210 SystemTray::~SystemTray() { 211 SystemTray::~SystemTray() {
211 // Destroy any child views that might have back pointers before ~View(). 212 // Destroy any child views that might have back pointers before ~View().
212 activation_observer_.reset(); 213 activation_observer_.reset();
213 key_event_watcher_.reset();
214 system_bubble_.reset(); 214 system_bubble_.reset();
215 for (const auto& item : items_) 215 for (const auto& item : items_)
216 item->OnTrayViewDestroyed(); 216 item->OnTrayViewDestroyed();
217 } 217 }
218 218
219 void SystemTray::InitializeTrayItems( 219 void SystemTray::InitializeTrayItems(
220 SystemTrayDelegate* delegate, 220 SystemTrayDelegate* delegate,
221 WebNotificationTray* web_notification_tray) { 221 WebNotificationTray* web_notification_tray) {
222 DCHECK(web_notification_tray); 222 DCHECK(web_notification_tray);
223 web_notification_tray_ = web_notification_tray; 223 web_notification_tray_ = web_notification_tray;
(...skipping 205 matching lines...) Expand 10 before | Expand all | Expand 10 after
429 if (Shell::Get()->session_controller()->IsKioskSession()) 429 if (Shell::Get()->session_controller()->IsKioskSession())
430 return; 430 return;
431 431
432 // Destroy any existing bubble and create a new one. 432 // Destroy any existing bubble and create a new one.
433 SystemTrayBubble::BubbleType bubble_type = 433 SystemTrayBubble::BubbleType bubble_type =
434 detailed ? SystemTrayBubble::BUBBLE_TYPE_DETAILED 434 detailed ? SystemTrayBubble::BUBBLE_TYPE_DETAILED
435 : SystemTrayBubble::BUBBLE_TYPE_DEFAULT; 435 : SystemTrayBubble::BUBBLE_TYPE_DEFAULT;
436 436
437 if (system_bubble_.get() && creation_type == BUBBLE_USE_EXISTING) { 437 if (system_bubble_.get() && creation_type == BUBBLE_USE_EXISTING) {
438 system_bubble_->bubble()->UpdateView(items, bubble_type); 438 system_bubble_->bubble()->UpdateView(items, bubble_type);
439 // If ChromeVox is enabled, focus the default item if no item is focused. 439 // If ChromeVox is enabled, focus the default item if no item is focused.
James Cook 2017/06/09 16:06:13 Is this comment still needed?
yawano 2017/06/12 09:11:03 No longer necessary. Deleted.
440 if (Shell::Get()->accessibility_delegate()->IsSpokenFeedbackEnabled())
441 system_bubble_->bubble()->FocusDefaultIfNeeded();
442 } else { 440 } else {
443 // Cleanup the existing bubble before showing a new one. Otherwise, it's 441 // Cleanup the existing bubble before showing a new one. Otherwise, it's
444 // possible to confuse the new system bubble with the old one during 442 // possible to confuse the new system bubble with the old one during
445 // destruction, leading to subtle errors/crashes such as crbug.com/545166. 443 // destruction, leading to subtle errors/crashes such as crbug.com/545166.
446 DestroySystemBubble(); 444 DestroySystemBubble();
447 445
448 // Remember if the menu is a single property (like e.g. volume) or the 446 // Remember if the menu is a single property (like e.g. volume) or the
449 // full tray menu. Note that in case of the |BUBBLE_USE_EXISTING| case 447 // full tray menu. Note that in case of the |BUBBLE_USE_EXISTING| case
450 // above, |full_system_tray_menu_| does not get changed since the fact that 448 // above, |full_system_tray_menu_| does not get changed since the fact that
451 // the menu is full (or not) doesn't change even if a "single property" 449 // the menu is full (or not) doesn't change even if a "single property"
(...skipping 27 matching lines...) Expand all
479 : new ActivationObserver(this)); 477 : new ActivationObserver(this));
480 478
481 // Record metrics for the system menu when the default view is invoked. 479 // Record metrics for the system menu when the default view is invoked.
482 if (!detailed) 480 if (!detailed)
483 RecordSystemMenuMetrics(); 481 RecordSystemMenuMetrics();
484 } 482 }
485 // Save height of default view for creating detailed views directly. 483 // Save height of default view for creating detailed views directly.
486 if (!detailed) 484 if (!detailed)
487 default_bubble_height_ = system_bubble_->bubble_view()->height(); 485 default_bubble_height_ = system_bubble_->bubble_view()->height();
488 486
489 key_event_watcher_.reset();
490 if (can_activate)
491 CreateKeyEventWatcher();
492
493 if (detailed && items.size() > 0) 487 if (detailed && items.size() > 0)
494 detailed_item_ = items[0]; 488 detailed_item_ = items[0];
495 else 489 else
496 detailed_item_ = NULL; 490 detailed_item_ = NULL;
497 491
498 UpdateWebNotifications(); 492 UpdateWebNotifications();
499 shelf()->UpdateAutoHideState(); 493 shelf()->UpdateAutoHideState();
500 494
501 // When we show the system menu in our alternate shelf layout, we need to 495 // When we show the system menu in our alternate shelf layout, we need to
502 // tint the background. 496 // tint the background.
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after
573 void SystemTray::OnMouseEnteredView() { 567 void SystemTray::OnMouseEnteredView() {
574 if (system_bubble_) 568 if (system_bubble_)
575 system_bubble_->bubble()->StopAutoCloseTimer(); 569 system_bubble_->bubble()->StopAutoCloseTimer();
576 } 570 }
577 571
578 void SystemTray::OnMouseExitedView() { 572 void SystemTray::OnMouseExitedView() {
579 if (system_bubble_) 573 if (system_bubble_)
580 system_bubble_->bubble()->RestartAutoCloseTimer(); 574 system_bubble_->bubble()->RestartAutoCloseTimer();
581 } 575 }
582 576
577 void SystemTray::RegisterAccelerators(
578 const std::vector<ui::Accelerator>& accelerators,
579 views::TrayBubbleView* tray_bubble_view) {
580 Shell::Get()->accelerator_controller()->Register(accelerators,
581 tray_bubble_view);
582 }
583
584 void SystemTray::UnregisterAllAccelerators(
585 views::TrayBubbleView* tray_bubble_view) {
586 Shell::Get()->accelerator_controller()->UnregisterAll(tray_bubble_view);
587 }
588
583 base::string16 SystemTray::GetAccessibleNameForBubble() { 589 base::string16 SystemTray::GetAccessibleNameForBubble() {
584 return GetAccessibleNameForTray(); 590 return GetAccessibleNameForTray();
585 } 591 }
586 592
593 bool SystemTray::ShouldEnableExtraKeyboardAccessibility() {
594 return Shell::Get()->accessibility_delegate()->IsSpokenFeedbackEnabled();
595 }
596
587 void SystemTray::HideBubble(const TrayBubbleView* bubble_view) { 597 void SystemTray::HideBubble(const TrayBubbleView* bubble_view) {
588 HideBubbleWithView(bubble_view); 598 HideBubbleWithView(bubble_view);
589 } 599 }
590 600
591 TrayCast* SystemTray::GetTrayCastForTesting() const { 601 TrayCast* SystemTray::GetTrayCastForTesting() const {
592 return tray_cast_; 602 return tray_cast_;
593 } 603 }
594 604
595 TrayEnterprise* SystemTray::GetTrayEnterpriseForTesting() const { 605 TrayEnterprise* SystemTray::GetTrayEnterpriseForTesting() const {
596 return tray_enterprise_; 606 return tray_enterprise_;
(...skipping 21 matching lines...) Expand all
618 628
619 void SystemTray::ActivateAndStartNavigation(const ui::KeyEvent& key_event) { 629 void SystemTray::ActivateAndStartNavigation(const ui::KeyEvent& key_event) {
620 if (!system_bubble_) 630 if (!system_bubble_)
621 return; 631 return;
622 ActivateBubble(); 632 ActivateBubble();
623 633
624 views::Widget* widget = GetSystemBubble()->bubble_view()->GetWidget(); 634 views::Widget* widget = GetSystemBubble()->bubble_view()->GetWidget();
625 widget->GetFocusManager()->OnKeyEvent(key_event); 635 widget->GetFocusManager()->OnKeyEvent(key_event);
626 } 636 }
627 637
628 void SystemTray::CreateKeyEventWatcher() {
629 key_event_watcher_ = ShellPort::Get()->CreateKeyEventWatcher();
630 // mustash does not yet support KeyEventWatcher. http://crbug.com/649600.
631 if (!key_event_watcher_)
632 return;
633 key_event_watcher_->AddKeyEventCallback(
634 ui::Accelerator(ui::VKEY_ESCAPE, ui::EF_NONE),
635 base::Bind(&SystemTray::CloseBubble, base::Unretained(this)));
636 key_event_watcher_->AddKeyEventCallback(
637 ui::Accelerator(ui::VKEY_TAB, ui::EF_NONE),
638 base::Bind(&SystemTray::ActivateAndStartNavigation,
639 base::Unretained(this)));
640 key_event_watcher_->AddKeyEventCallback(
641 ui::Accelerator(ui::VKEY_TAB, ui::EF_SHIFT_DOWN),
642 base::Bind(&SystemTray::ActivateAndStartNavigation,
643 base::Unretained(this)));
644 }
645
646 void SystemTray::ActivateBubble() { 638 void SystemTray::ActivateBubble() {
647 TrayBubbleView* bubble_view = GetSystemBubble()->bubble_view(); 639 TrayBubbleView* bubble_view = GetSystemBubble()->bubble_view();
648 // If system tray bubble is in the process of closing, do not try to activate 640 // If system tray bubble is in the process of closing, do not try to activate
649 // bubble. 641 // bubble.
650 if (bubble_view->GetWidget()->IsClosed()) 642 if (bubble_view->GetWidget()->IsClosed())
651 return; 643 return;
652 bubble_view->set_can_activate(true); 644 bubble_view->set_can_activate(true);
653 bubble_view->GetWidget()->Activate(); 645 bubble_view->GetWidget()->Activate();
654 } 646 }
655 647
656 bool SystemTray::PerformAction(const ui::Event& event) { 648 bool SystemTray::PerformAction(const ui::Event& event) {
657 // If we're already showing the default view or detailed view in system menu, 649 // If we're already showing the default view or detailed view in system menu,
658 // hide it; otherwise, show it (and hide any popup that's currently shown). 650 // hide it; otherwise, show it (and hide any popup that's currently shown).
659 if (HasSystemBubbleType(SystemTrayBubble::BUBBLE_TYPE_DEFAULT) || 651 if (HasSystemBubbleType(SystemTrayBubble::BUBBLE_TYPE_DEFAULT) ||
660 (HasSystemBubbleType(SystemTrayBubble::BUBBLE_TYPE_DETAILED) && 652 (HasSystemBubbleType(SystemTrayBubble::BUBBLE_TYPE_DETAILED) &&
661 full_system_tray_menu_)) { 653 full_system_tray_menu_)) {
662 system_bubble_->bubble()->Close(); 654 system_bubble_->bubble()->Close();
663 } else { 655 } else {
664 ShowDefaultView(BUBBLE_CREATE_NEW); 656 ShowDefaultView(BUBBLE_CREATE_NEW);
665 if (event.IsKeyEvent() || (event.flags() & ui::EF_TOUCH_ACCESSIBILITY)) 657 if (event.IsKeyEvent() || (event.flags() & ui::EF_TOUCH_ACCESSIBILITY))
666 ActivateBubble(); 658 ActivateBubble();
667 } 659 }
668 return true; 660 return true;
669 } 661 }
670 662
671 void SystemTray::CloseSystemBubbleAndDeactivateSystemTray() { 663 void SystemTray::CloseSystemBubbleAndDeactivateSystemTray() {
672 activation_observer_.reset(); 664 activation_observer_.reset();
673 key_event_watcher_.reset();
674 system_bubble_.reset(); 665 system_bubble_.reset();
675 // When closing a system bubble with the alternate shelf layout, we need to 666 // When closing a system bubble with the alternate shelf layout, we need to
676 // turn off the active tinting of the shelf. 667 // turn off the active tinting of the shelf.
677 if (full_system_tray_menu_) { 668 if (full_system_tray_menu_) {
678 SetIsActive(false); 669 SetIsActive(false);
679 full_system_tray_menu_ = false; 670 full_system_tray_menu_ = false;
680 } 671 }
681 } 672 }
682 673
683 void SystemTray::RecordSystemMenuMetrics() { 674 void SystemTray::RecordSystemMenuMetrics() {
(...skipping 17 matching lines...) Expand all
701 .work_area() 692 .work_area()
702 .height(); 693 .height();
703 if (work_area_height > 0) { 694 if (work_area_height > 0) {
704 UMA_HISTOGRAM_CUSTOM_COUNTS( 695 UMA_HISTOGRAM_CUSTOM_COUNTS(
705 "Ash.SystemMenu.PercentageOfWorkAreaHeightCoveredByMenu", 696 "Ash.SystemMenu.PercentageOfWorkAreaHeightCoveredByMenu",
706 100 * bubble_view->height() / work_area_height, 1, 300, 100); 697 100 * bubble_view->height() / work_area_height, 1, 300, 100);
707 } 698 }
708 } 699 }
709 700
710 } // namespace ash 701 } // namespace ash
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698