Home | History | Annotate | Download | only in chromeos
      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
      3 // found in the LICENSE file.
      4 
      5 #include "ash/system/chromeos/tray_display.h"
      6 
      7 #include "ash/display/display_manager.h"
      8 #include "ash/root_window_controller.h"
      9 #include "ash/screen_util.h"
     10 #include "ash/shell.h"
     11 #include "ash/system/tray/system_tray.h"
     12 #include "ash/test/ash_test_base.h"
     13 #include "ash/test/test_system_tray_delegate.h"
     14 #include "base/strings/string16.h"
     15 #include "base/strings/string_util.h"
     16 #include "base/strings/utf_string_conversions.h"
     17 #include "grit/ash_strings.h"
     18 #include "ui/accessibility/ax_view_state.h"
     19 #include "ui/base/l10n/l10n_util.h"
     20 #include "ui/gfx/display.h"
     21 #include "ui/message_center/message_center.h"
     22 #include "ui/message_center/notification.h"
     23 #include "ui/message_center/notification_list.h"
     24 #include "ui/views/controls/label.h"
     25 
     26 namespace ash {
     27 
     28 base::string16 GetTooltipText(const base::string16& headline,
     29                               const base::string16& name1,
     30                               const std::string& data1,
     31                               const base::string16& name2,
     32                               const std::string& data2) {
     33   std::vector<base::string16> lines;
     34   lines.push_back(headline);
     35   if (data1.empty()) {
     36     lines.push_back(name1);
     37   } else {
     38     lines.push_back(l10n_util::GetStringFUTF16(
     39         IDS_ASH_STATUS_TRAY_DISPLAY_SINGLE_DISPLAY,
     40         name1, base::UTF8ToUTF16(data1)));
     41   }
     42   if (!name2.empty()) {
     43     lines.push_back(l10n_util::GetStringFUTF16(
     44         IDS_ASH_STATUS_TRAY_DISPLAY_SINGLE_DISPLAY,
     45         name2, base::UTF8ToUTF16(data2)));
     46   }
     47   return JoinString(lines, '\n');
     48 }
     49 
     50 base::string16 GetMirroredTooltipText(const base::string16& headline,
     51                                       const base::string16& name,
     52                                       const std::string& data) {
     53   return GetTooltipText(headline, name, data, base::string16(), "");
     54 }
     55 
     56 base::string16 GetFirstDisplayName() {
     57   DisplayManager* display_manager = Shell::GetInstance()->display_manager();
     58   return base::UTF8ToUTF16(display_manager->GetDisplayNameForId(
     59       display_manager->first_display_id()));
     60 }
     61 
     62 base::string16 GetSecondDisplayName() {
     63   return base::UTF8ToUTF16(
     64       Shell::GetInstance()->display_manager()->GetDisplayNameForId(
     65           ScreenUtil::GetSecondaryDisplay().id()));
     66 }
     67 
     68 base::string16 GetMirroredDisplayName() {
     69   DisplayManager* display_manager = Shell::GetInstance()->display_manager();
     70   return base::UTF8ToUTF16(display_manager->GetDisplayNameForId(
     71       display_manager->mirrored_display_id()));
     72 }
     73 
     74 class TrayDisplayTest : public ash::test::AshTestBase {
     75  public:
     76   TrayDisplayTest();
     77   virtual ~TrayDisplayTest();
     78 
     79   virtual void SetUp() OVERRIDE;
     80 
     81  protected:
     82   SystemTray* tray() { return tray_; }
     83   TrayDisplay* tray_display() { return tray_display_; }
     84 
     85   void CloseNotification();
     86   bool IsDisplayVisibleInTray() const;
     87   base::string16 GetTrayDisplayText() const;
     88   void CheckAccessibleName() const;
     89   base::string16 GetTrayDisplayTooltipText() const;
     90   base::string16 GetDisplayNotificationText() const;
     91   base::string16 GetDisplayNotificationAdditionalText() const;
     92 
     93  private:
     94   const message_center::Notification* GetDisplayNotification() const;
     95 
     96   // Weak reference, owned by Shell.
     97   SystemTray* tray_;
     98 
     99   // Weak reference, owned by |tray_|.
    100   TrayDisplay* tray_display_;
    101 
    102   DISALLOW_COPY_AND_ASSIGN(TrayDisplayTest);
    103 };
    104 
    105 TrayDisplayTest::TrayDisplayTest() : tray_(NULL), tray_display_(NULL) {
    106 }
    107 
    108 TrayDisplayTest::~TrayDisplayTest() {
    109 }
    110 
    111 void TrayDisplayTest::SetUp() {
    112   ash::test::AshTestBase::SetUp();
    113   tray_ = Shell::GetPrimaryRootWindowController()->GetSystemTray();
    114   tray_display_ = new TrayDisplay(tray_);
    115   tray_->AddTrayItem(tray_display_);
    116 }
    117 
    118 void TrayDisplayTest::CloseNotification() {
    119   message_center::MessageCenter::Get()->RemoveNotification(
    120       TrayDisplay::kNotificationId, false);
    121   RunAllPendingInMessageLoop();
    122 }
    123 
    124 bool TrayDisplayTest::IsDisplayVisibleInTray() const {
    125   return tray_->HasSystemBubble() &&
    126       tray_display_->default_view() &&
    127       tray_display_->default_view()->visible();
    128 }
    129 
    130 base::string16 TrayDisplayTest::GetTrayDisplayText() const {
    131   return tray_display_->GetDefaultViewMessage();
    132 }
    133 
    134 void TrayDisplayTest::CheckAccessibleName() const {
    135   ui::AXViewState state;
    136   if (tray_display_->GetAccessibleStateForTesting(&state)) {
    137     base::string16 expected = tray_display_->GetDefaultViewMessage();
    138     EXPECT_EQ(expected, state.name);
    139   }
    140 }
    141 
    142 base::string16 TrayDisplayTest::GetTrayDisplayTooltipText() const {
    143   if (!tray_display_->default_view())
    144     return base::string16();
    145 
    146   base::string16 tooltip;
    147   if (!tray_display_->default_view()->GetTooltipText(gfx::Point(), &tooltip))
    148     return base::string16();
    149   return tooltip;
    150 }
    151 
    152 base::string16 TrayDisplayTest::GetDisplayNotificationText() const {
    153   const message_center::Notification* notification = GetDisplayNotification();
    154   return notification ? notification->title() : base::string16();
    155 }
    156 
    157 base::string16 TrayDisplayTest::GetDisplayNotificationAdditionalText() const {
    158   const message_center::Notification* notification = GetDisplayNotification();
    159   return notification ? notification->message() : base::string16();
    160 }
    161 
    162 const message_center::Notification* TrayDisplayTest::GetDisplayNotification()
    163     const {
    164   const message_center::NotificationList::Notifications notifications =
    165       message_center::MessageCenter::Get()->GetVisibleNotifications();
    166   for (message_center::NotificationList::Notifications::const_iterator iter =
    167            notifications.begin(); iter != notifications.end(); ++iter) {
    168     if ((*iter)->id() == TrayDisplay::kNotificationId)
    169       return *iter;
    170   }
    171 
    172   return NULL;
    173 }
    174 
    175 TEST_F(TrayDisplayTest, NoInternalDisplay) {
    176   UpdateDisplay("400x400");
    177   tray()->ShowDefaultView(BUBBLE_USE_EXISTING);
    178   EXPECT_FALSE(IsDisplayVisibleInTray());
    179 
    180   UpdateDisplay("400x400,200x200");
    181   tray()->ShowDefaultView(BUBBLE_USE_EXISTING);
    182   EXPECT_TRUE(IsDisplayVisibleInTray());
    183   base::string16 expected = l10n_util::GetStringUTF16(
    184       IDS_ASH_STATUS_TRAY_DISPLAY_EXTENDED_NO_INTERNAL);
    185   base::string16 first_name = GetFirstDisplayName();
    186   EXPECT_EQ(expected, GetTrayDisplayText());
    187   EXPECT_EQ(GetTooltipText(expected, GetFirstDisplayName(), "400x400",
    188                            GetSecondDisplayName(), "200x200"),
    189             GetTrayDisplayTooltipText());
    190   CheckAccessibleName();
    191 
    192   // mirroring
    193   Shell::GetInstance()->display_manager()->SetSoftwareMirroring(true);
    194   UpdateDisplay("400x400,200x200");
    195   tray()->ShowDefaultView(BUBBLE_USE_EXISTING);
    196   EXPECT_TRUE(IsDisplayVisibleInTray());
    197   expected = l10n_util::GetStringUTF16(
    198       IDS_ASH_STATUS_TRAY_DISPLAY_MIRRORING_NO_INTERNAL);
    199   EXPECT_EQ(expected, GetTrayDisplayText());
    200   EXPECT_EQ(GetMirroredTooltipText(expected, GetFirstDisplayName(), "400x400"),
    201             GetTrayDisplayTooltipText());
    202   CheckAccessibleName();
    203 }
    204 
    205 TEST_F(TrayDisplayTest, InternalDisplay) {
    206   UpdateDisplay("400x400");
    207   DisplayManager* display_manager = Shell::GetInstance()->display_manager();
    208   gfx::Display::SetInternalDisplayId(display_manager->first_display_id());
    209 
    210   tray()->ShowDefaultView(BUBBLE_USE_EXISTING);
    211   EXPECT_FALSE(IsDisplayVisibleInTray());
    212 
    213   // Extended
    214   UpdateDisplay("400x400,200x200");
    215   base::string16 expected = l10n_util::GetStringFUTF16(
    216       IDS_ASH_STATUS_TRAY_DISPLAY_EXTENDED, GetSecondDisplayName());
    217   tray()->ShowDefaultView(BUBBLE_USE_EXISTING);
    218   EXPECT_TRUE(IsDisplayVisibleInTray());
    219   EXPECT_EQ(expected, GetTrayDisplayText());
    220   EXPECT_EQ(GetTooltipText(expected, GetFirstDisplayName(), "400x400",
    221                            GetSecondDisplayName(), "200x200"),
    222             GetTrayDisplayTooltipText());
    223   CheckAccessibleName();
    224 
    225   // Mirroring
    226   display_manager->SetSoftwareMirroring(true);
    227   UpdateDisplay("400x400,200x200");
    228   tray()->ShowDefaultView(BUBBLE_USE_EXISTING);
    229   EXPECT_TRUE(IsDisplayVisibleInTray());
    230 
    231   expected = l10n_util::GetStringFUTF16(
    232       IDS_ASH_STATUS_TRAY_DISPLAY_MIRRORING, GetMirroredDisplayName());
    233   EXPECT_EQ(expected, GetTrayDisplayText());
    234   EXPECT_EQ(GetMirroredTooltipText(expected, GetFirstDisplayName(), "400x400"),
    235             GetTrayDisplayTooltipText());
    236   CheckAccessibleName();
    237 }
    238 
    239 TEST_F(TrayDisplayTest, InternalDisplayResized) {
    240   UpdateDisplay("400x400 (at) 1.5");
    241   DisplayManager* display_manager = Shell::GetInstance()->display_manager();
    242   gfx::Display::SetInternalDisplayId(display_manager->first_display_id());
    243 
    244   // Shows the tray_display even though there's a single-display.
    245   tray()->ShowDefaultView(BUBBLE_USE_EXISTING);
    246   EXPECT_TRUE(IsDisplayVisibleInTray());
    247   base::string16 internal_info = l10n_util::GetStringFUTF16(
    248       IDS_ASH_STATUS_TRAY_DISPLAY_SINGLE_DISPLAY,
    249       GetFirstDisplayName(), base::UTF8ToUTF16("600x600"));
    250   EXPECT_EQ(internal_info, GetTrayDisplayText());
    251   EXPECT_EQ(GetTooltipText(base::string16(), GetFirstDisplayName(), "600x600",
    252                            base::string16(), std::string()),
    253             GetTrayDisplayTooltipText());
    254   CheckAccessibleName();
    255 
    256   // Extended
    257   UpdateDisplay("400x400 (at) 1.5,200x200");
    258   tray()->ShowDefaultView(BUBBLE_USE_EXISTING);
    259   EXPECT_TRUE(IsDisplayVisibleInTray());
    260   base::string16 expected = l10n_util::GetStringFUTF16(
    261       IDS_ASH_STATUS_TRAY_DISPLAY_EXTENDED, GetSecondDisplayName());
    262   EXPECT_EQ(expected, GetTrayDisplayText());
    263   EXPECT_EQ(GetTooltipText(expected, GetFirstDisplayName(), "600x600",
    264                            GetSecondDisplayName(), "200x200"),
    265             GetTrayDisplayTooltipText());
    266   CheckAccessibleName();
    267 
    268   // Mirroring
    269   display_manager->SetSoftwareMirroring(true);
    270   UpdateDisplay("400x400 (at) 1.5,200x200");
    271   tray()->ShowDefaultView(BUBBLE_USE_EXISTING);
    272   EXPECT_TRUE(IsDisplayVisibleInTray());
    273   expected = l10n_util::GetStringFUTF16(
    274       IDS_ASH_STATUS_TRAY_DISPLAY_MIRRORING, GetMirroredDisplayName());
    275   EXPECT_EQ(expected, GetTrayDisplayText());
    276   EXPECT_EQ(GetMirroredTooltipText(expected, GetFirstDisplayName(), "600x600"),
    277             GetTrayDisplayTooltipText());
    278   CheckAccessibleName();
    279 
    280   // Closed lid mode.
    281   display_manager->SetSoftwareMirroring(false);
    282   UpdateDisplay("400x400 (at) 1.5,200x200");
    283   gfx::Display::SetInternalDisplayId(ScreenUtil::GetSecondaryDisplay().id());
    284   UpdateDisplay("400x400 (at) 1.5");
    285   tray()->ShowDefaultView(BUBBLE_USE_EXISTING);
    286   EXPECT_TRUE(IsDisplayVisibleInTray());
    287   expected = l10n_util::GetStringUTF16(IDS_ASH_STATUS_TRAY_DISPLAY_DOCKED);
    288   EXPECT_EQ(expected, GetTrayDisplayText());
    289   EXPECT_EQ(
    290       GetTooltipText(
    291           expected, GetFirstDisplayName(), "600x600", base::string16(), ""),
    292       GetTrayDisplayTooltipText());
    293   CheckAccessibleName();
    294 }
    295 
    296 TEST_F(TrayDisplayTest, ExternalDisplayResized) {
    297   UpdateDisplay("400x400");
    298   DisplayManager* display_manager = Shell::GetInstance()->display_manager();
    299   gfx::Display::SetInternalDisplayId(display_manager->first_display_id());
    300 
    301   // Shows the tray_display even though there's a single-display.
    302   tray()->ShowDefaultView(BUBBLE_USE_EXISTING);
    303   EXPECT_FALSE(IsDisplayVisibleInTray());
    304 
    305   // Extended
    306   UpdateDisplay("400x400,200x200 (at) 1.5");
    307   const gfx::Display& secondary_display = ScreenUtil::GetSecondaryDisplay();
    308 
    309   tray()->ShowDefaultView(BUBBLE_USE_EXISTING);
    310   EXPECT_TRUE(IsDisplayVisibleInTray());
    311   base::string16 expected = l10n_util::GetStringFUTF16(
    312       IDS_ASH_STATUS_TRAY_DISPLAY_EXTENDED,
    313       l10n_util::GetStringFUTF16(
    314           IDS_ASH_STATUS_TRAY_DISPLAY_ANNOTATED_NAME,
    315           GetSecondDisplayName(),
    316           base::UTF8ToUTF16(secondary_display.size().ToString())));
    317   EXPECT_EQ(expected, GetTrayDisplayText());
    318   EXPECT_EQ(GetTooltipText(expected, GetFirstDisplayName(), "400x400",
    319                            GetSecondDisplayName(), "300x300"),
    320             GetTrayDisplayTooltipText());
    321   CheckAccessibleName();
    322 
    323   // Mirroring
    324   display_manager->SetSoftwareMirroring(true);
    325   UpdateDisplay("400x400,200x200 (at) 1.5");
    326   tray()->ShowDefaultView(BUBBLE_USE_EXISTING);
    327   EXPECT_TRUE(IsDisplayVisibleInTray());
    328   expected = l10n_util::GetStringFUTF16(
    329       IDS_ASH_STATUS_TRAY_DISPLAY_MIRRORING, GetMirroredDisplayName());
    330   EXPECT_EQ(expected, GetTrayDisplayText());
    331   EXPECT_EQ(GetMirroredTooltipText(expected, GetFirstDisplayName(), "400x400"),
    332             GetTrayDisplayTooltipText());
    333   CheckAccessibleName();
    334 }
    335 
    336 TEST_F(TrayDisplayTest, OverscanDisplay) {
    337   UpdateDisplay("400x400,300x300/o");
    338   DisplayManager* display_manager = Shell::GetInstance()->display_manager();
    339   gfx::Display::SetInternalDisplayId(display_manager->first_display_id());
    340 
    341   tray()->ShowDefaultView(BUBBLE_USE_EXISTING);
    342   EXPECT_TRUE(IsDisplayVisibleInTray());
    343 
    344   // /o creates the default overscan, and if overscan is set, the annotation
    345   // should be the size.
    346   base::string16 overscan = l10n_util::GetStringUTF16(
    347       IDS_ASH_STATUS_TRAY_DISPLAY_ANNOTATION_OVERSCAN);
    348   base::string16 headline = l10n_util::GetStringFUTF16(
    349       IDS_ASH_STATUS_TRAY_DISPLAY_EXTENDED,
    350       l10n_util::GetStringFUTF16(
    351           IDS_ASH_STATUS_TRAY_DISPLAY_ANNOTATED_NAME,
    352           GetSecondDisplayName(), base::UTF8ToUTF16("286x286")));
    353   std::string second_data = l10n_util::GetStringFUTF8(
    354       IDS_ASH_STATUS_TRAY_DISPLAY_ANNOTATION,
    355       base::UTF8ToUTF16("286x286"), overscan);
    356   EXPECT_EQ(GetTooltipText(headline, GetFirstDisplayName(), "400x400",
    357                            GetSecondDisplayName(), second_data),
    358             GetTrayDisplayTooltipText());
    359 
    360   // reset the overscan.
    361   display_manager->SetOverscanInsets(
    362       ScreenUtil::GetSecondaryDisplay().id(), gfx::Insets());
    363   headline = l10n_util::GetStringFUTF16(
    364       IDS_ASH_STATUS_TRAY_DISPLAY_EXTENDED,
    365       l10n_util::GetStringFUTF16(
    366           IDS_ASH_STATUS_TRAY_DISPLAY_ANNOTATED_NAME,
    367           GetSecondDisplayName(), overscan));
    368   second_data = l10n_util::GetStringFUTF8(
    369       IDS_ASH_STATUS_TRAY_DISPLAY_ANNOTATION,
    370       base::UTF8ToUTF16("300x300"), overscan);
    371   EXPECT_EQ(GetTooltipText(headline, GetFirstDisplayName(), "400x400",
    372                            GetSecondDisplayName(), second_data),
    373             GetTrayDisplayTooltipText());
    374 }
    375 
    376 TEST_F(TrayDisplayTest, UpdateDuringDisplayConfigurationChange) {
    377   tray()->ShowDefaultView(BUBBLE_USE_EXISTING);
    378   EXPECT_FALSE(IsDisplayVisibleInTray());
    379 
    380   UpdateDisplay("400x400 (at) 1.5");
    381   EXPECT_TRUE(tray()->HasSystemBubble());
    382   EXPECT_TRUE(IsDisplayVisibleInTray());
    383   base::string16 internal_info = l10n_util::GetStringFUTF16(
    384       IDS_ASH_STATUS_TRAY_DISPLAY_SINGLE_DISPLAY,
    385       GetFirstDisplayName(), base::UTF8ToUTF16("600x600"));
    386   EXPECT_EQ(internal_info, GetTrayDisplayText());
    387   EXPECT_EQ(GetTooltipText(base::string16(), GetFirstDisplayName(), "600x600",
    388                            base::string16(), std::string()),
    389             GetTrayDisplayTooltipText());
    390   CheckAccessibleName();
    391 
    392   UpdateDisplay("400x400,200x200");
    393   EXPECT_TRUE(tray()->HasSystemBubble());
    394   EXPECT_TRUE(IsDisplayVisibleInTray());
    395   base::string16 expected = l10n_util::GetStringUTF16(
    396       IDS_ASH_STATUS_TRAY_DISPLAY_EXTENDED_NO_INTERNAL);
    397   base::string16 first_name = GetFirstDisplayName();
    398   EXPECT_EQ(expected, GetTrayDisplayText());
    399   EXPECT_EQ(GetTooltipText(expected, GetFirstDisplayName(), "400x400",
    400                            GetSecondDisplayName(), "200x200"),
    401             GetTrayDisplayTooltipText());
    402   CheckAccessibleName();
    403 
    404   UpdateDisplay("400x400 (at) 1.5");
    405   tray()->ShowDefaultView(BUBBLE_USE_EXISTING);
    406 
    407   // Back to the default state, the display tray item should disappear.
    408   UpdateDisplay("400x400");
    409   EXPECT_TRUE(tray()->HasSystemBubble());
    410   EXPECT_FALSE(IsDisplayVisibleInTray());
    411 }
    412 
    413 TEST_F(TrayDisplayTest, DisplayNotifications) {
    414   test::TestSystemTrayDelegate* tray_delegate =
    415       static_cast<test::TestSystemTrayDelegate*>(
    416           Shell::GetInstance()->system_tray_delegate());
    417   tray_delegate->set_should_show_display_notification(true);
    418 
    419   UpdateDisplay("400x400");
    420   DisplayManager* display_manager = Shell::GetInstance()->display_manager();
    421   gfx::Display::SetInternalDisplayId(display_manager->first_display_id());
    422   EXPECT_TRUE(GetDisplayNotificationText().empty());
    423 
    424   // rotation.
    425   UpdateDisplay("400x400/r");
    426   EXPECT_EQ(
    427       l10n_util::GetStringFUTF16(
    428           IDS_ASH_STATUS_TRAY_DISPLAY_ROTATED, GetFirstDisplayName(),
    429           l10n_util::GetStringUTF16(
    430               IDS_ASH_STATUS_TRAY_DISPLAY_ORIENTATION_90)),
    431       GetDisplayNotificationText());
    432   EXPECT_TRUE(GetDisplayNotificationAdditionalText().empty());
    433 
    434   CloseNotification();
    435   UpdateDisplay("400x400");
    436   EXPECT_EQ(
    437       l10n_util::GetStringFUTF16(
    438           IDS_ASH_STATUS_TRAY_DISPLAY_ROTATED, GetFirstDisplayName(),
    439           l10n_util::GetStringUTF16(
    440               IDS_ASH_STATUS_TRAY_DISPLAY_STANDARD_ORIENTATION)),
    441       GetDisplayNotificationText());
    442   EXPECT_TRUE(GetDisplayNotificationAdditionalText().empty());
    443 
    444   // UI-scale
    445   CloseNotification();
    446   UpdateDisplay("400x400 (at) 1.5");
    447   EXPECT_EQ(
    448       l10n_util::GetStringFUTF16(
    449           IDS_ASH_STATUS_TRAY_DISPLAY_RESOLUTION_CHANGED,
    450           GetFirstDisplayName(), base::UTF8ToUTF16("600x600")),
    451       GetDisplayNotificationText());
    452   EXPECT_TRUE(GetDisplayNotificationAdditionalText().empty());
    453 
    454   // UI-scale to 1.0
    455   CloseNotification();
    456   UpdateDisplay("400x400");
    457   EXPECT_EQ(
    458       l10n_util::GetStringFUTF16(
    459           IDS_ASH_STATUS_TRAY_DISPLAY_RESOLUTION_CHANGED,
    460           GetFirstDisplayName(), base::UTF8ToUTF16("400x400")),
    461       GetDisplayNotificationText());
    462   EXPECT_TRUE(GetDisplayNotificationAdditionalText().empty());
    463 
    464   // No-update
    465   CloseNotification();
    466   UpdateDisplay("400x400");
    467   EXPECT_TRUE(GetDisplayNotificationText().empty());
    468   EXPECT_TRUE(GetDisplayNotificationAdditionalText().empty());
    469 
    470   // Extended.
    471   CloseNotification();
    472   UpdateDisplay("400x400,200x200");
    473   EXPECT_EQ(
    474       l10n_util::GetStringFUTF16(
    475           IDS_ASH_STATUS_TRAY_DISPLAY_EXTENDED, GetSecondDisplayName()),
    476       GetDisplayNotificationText());
    477   EXPECT_TRUE(GetDisplayNotificationAdditionalText().empty());
    478 
    479   // Mirroring.
    480   CloseNotification();
    481   display_manager->SetSoftwareMirroring(true);
    482   UpdateDisplay("400x400,200x200");
    483   EXPECT_EQ(
    484       l10n_util::GetStringFUTF16(
    485           IDS_ASH_STATUS_TRAY_DISPLAY_MIRRORING, GetMirroredDisplayName()),
    486       GetDisplayNotificationText());
    487   EXPECT_TRUE(GetDisplayNotificationAdditionalText().empty());
    488 
    489   // Back to extended.
    490   CloseNotification();
    491   display_manager->SetSoftwareMirroring(false);
    492   UpdateDisplay("400x400,200x200");
    493   EXPECT_EQ(
    494       l10n_util::GetStringFUTF16(
    495           IDS_ASH_STATUS_TRAY_DISPLAY_EXTENDED, GetSecondDisplayName()),
    496       GetDisplayNotificationText());
    497   EXPECT_TRUE(GetDisplayNotificationAdditionalText().empty());
    498 
    499   // Resize the first display.
    500   UpdateDisplay("400x400 (at) 1.5,200x200");
    501   EXPECT_EQ(
    502       l10n_util::GetStringFUTF16(
    503           IDS_ASH_STATUS_TRAY_DISPLAY_RESOLUTION_CHANGED,
    504           GetFirstDisplayName(), base::UTF8ToUTF16("600x600")),
    505       GetDisplayNotificationText());
    506   EXPECT_TRUE(GetDisplayNotificationAdditionalText().empty());
    507 
    508   // Rotate the second.
    509   UpdateDisplay("400x400 (at) 1.5,200x200/r");
    510   EXPECT_EQ(
    511       l10n_util::GetStringFUTF16(
    512           IDS_ASH_STATUS_TRAY_DISPLAY_ROTATED,
    513           GetSecondDisplayName(),
    514           l10n_util::GetStringUTF16(
    515               IDS_ASH_STATUS_TRAY_DISPLAY_ORIENTATION_90)),
    516       GetDisplayNotificationText());
    517   EXPECT_TRUE(GetDisplayNotificationAdditionalText().empty());
    518 
    519   // Enters closed lid mode.
    520   UpdateDisplay("400x400 (at) 1.5,200x200");
    521   gfx::Display::SetInternalDisplayId(ScreenUtil::GetSecondaryDisplay().id());
    522   UpdateDisplay("400x400 (at) 1.5");
    523   EXPECT_EQ(l10n_util::GetStringUTF16(IDS_ASH_STATUS_TRAY_DISPLAY_DOCKED),
    524             GetDisplayNotificationText());
    525   EXPECT_EQ(
    526       l10n_util::GetStringUTF16(IDS_ASH_STATUS_TRAY_DISPLAY_DOCKED_DESCRIPTION),
    527       GetDisplayNotificationAdditionalText());
    528 }
    529 
    530 TEST_F(TrayDisplayTest, DisplayConfigurationChangedTwice) {
    531   test::TestSystemTrayDelegate* tray_delegate =
    532       static_cast<test::TestSystemTrayDelegate*>(
    533           Shell::GetInstance()->system_tray_delegate());
    534   tray_delegate->set_should_show_display_notification(true);
    535 
    536   UpdateDisplay("400x400,200x200");
    537   EXPECT_EQ(
    538       l10n_util::GetStringUTF16(
    539           IDS_ASH_STATUS_TRAY_DISPLAY_EXTENDED_NO_INTERNAL),
    540       GetDisplayNotificationText());
    541 
    542   // OnDisplayConfigurationChanged() may be called more than once for a single
    543   // update display in case of primary is swapped or recovered from dock mode.
    544   // Should not remove the notification in such case.
    545   tray_display()->OnDisplayConfigurationChanged();
    546   EXPECT_EQ(
    547       l10n_util::GetStringUTF16(
    548           IDS_ASH_STATUS_TRAY_DISPLAY_EXTENDED_NO_INTERNAL),
    549       GetDisplayNotificationText());
    550 
    551   // Back to the single display. It SHOULD remove the notification since the
    552   // information is stale.
    553   UpdateDisplay("400x400");
    554   EXPECT_TRUE(GetDisplayNotificationText().empty());
    555 }
    556 
    557 TEST_F(TrayDisplayTest, UpdateAfterSuppressDisplayNotification) {
    558   UpdateDisplay("400x400,200x200");
    559 
    560   test::TestSystemTrayDelegate* tray_delegate =
    561       static_cast<test::TestSystemTrayDelegate*>(
    562           Shell::GetInstance()->system_tray_delegate());
    563   tray_delegate->set_should_show_display_notification(true);
    564 
    565   // rotate the second.
    566   UpdateDisplay("400x400,200x200/r");
    567   EXPECT_EQ(
    568       l10n_util::GetStringFUTF16(
    569           IDS_ASH_STATUS_TRAY_DISPLAY_ROTATED,
    570           GetSecondDisplayName(),
    571           l10n_util::GetStringUTF16(
    572               IDS_ASH_STATUS_TRAY_DISPLAY_ORIENTATION_90)),
    573       GetDisplayNotificationText());
    574 }
    575 
    576 }  // namespace ash
    577