summaryrefslogtreecommitdiffstats
path: root/ash
diff options
context:
space:
mode:
authormukai@chromium.org <mukai@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-07-11 05:48:28 +0000
committermukai@chromium.org <mukai@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-07-11 05:48:28 +0000
commit144b9a99017cf47dd44a729bd860801cae0b4633 (patch)
tree155381bba73a9197083a1a6bf5a84d9f56eba49a /ash
parent2f05248d6e284bef29fc8f68802a39b450f9f757 (diff)
downloadchromium_src-144b9a99017cf47dd44a729bd860801cae0b4633.zip
chromium_src-144b9a99017cf47dd44a729bd860801cae0b4633.tar.gz
chromium_src-144b9a99017cf47dd44a729bd860801cae0b4633.tar.bz2
Replaces display error dialog by notifications.
Notification would be good enough, more consistent with existing display notifications, and much simpler. BUG=None R=oshima@chromium.org TBR=jamescook@chromium.org Review URL: https://chromiumcodereview.appspot.com/18269005 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@211028 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'ash')
-rw-r--r--ash/ash.gyp12
-rw-r--r--ash/display/display_error_dialog.cc136
-rw-r--r--ash/display/display_error_dialog.h90
-rw-r--r--ash/display/display_error_dialog_unittest.cc132
-rw-r--r--ash/display/display_error_observer.cc89
-rw-r--r--ash/display/display_error_observer.h39
-rw-r--r--ash/display/display_error_observer_unittest.cc85
-rw-r--r--ash/display/output_configurator_animation.cc1
-rw-r--r--ash/shell.cc2
9 files changed, 220 insertions, 366 deletions
diff --git a/ash/ash.gyp b/ash/ash.gyp
index 05929ce..b63f9d9f 100644
--- a/ash/ash.gyp
+++ b/ash/ash.gyp
@@ -88,8 +88,8 @@
'display/display_change_observer_x11.h',
'display/display_controller.cc',
'display/display_controller.h',
- 'display/display_error_dialog.cc',
- 'display/display_error_dialog.h',
+ 'display/display_error_observer.cc',
+ 'display/display_error_observer.h',
'display/display_info.h',
'display/display_info.cc',
'display/display_layout.h',
@@ -559,8 +559,8 @@
}, { # else: chromeos!=1
'sources/': [
['exclude', '/chromeos/'],
- ['exclude', 'display/display_error_dialog.cc'],
- ['exclude', 'display/display_error_dialog.h'],
+ ['exclude', 'display/display_error_observer.cc'],
+ ['exclude', 'display/display_error_observer.h'],
['exclude', 'display/output_configurator_animation.cc'],
['exclude', 'display/output_configurator_animation.h'],
],
@@ -669,7 +669,7 @@
'desktop_background/wallpaper_resizer_unittest.cc',
'dip_unittest.cc',
'display/display_controller_unittest.cc',
- 'display/display_error_dialog_unittest.cc',
+ 'display/display_error_observer_unittest.cc',
'display/display_info_unittest.cc',
'display/display_manager_unittest.cc',
'display/mirror_window_controller_unittest.cc',
@@ -799,7 +799,7 @@
}],
['chromeos!=1', {
'sources/': [
- ['exclude', 'display/display_error_dialog_unittest.cc'],
+ ['exclude', 'display/display_error_observer_unittest.cc'],
],
}, { # chromeos==1
'dependencies': [
diff --git a/ash/display/display_error_dialog.cc b/ash/display/display_error_dialog.cc
deleted file mode 100644
index b5bda17..0000000
--- a/ash/display/display_error_dialog.cc
+++ /dev/null
@@ -1,136 +0,0 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "ash/display/display_error_dialog.h"
-
-#include "ash/screen_ash.h"
-#include "ash/shell.h"
-#include "grit/ash_strings.h"
-#include "ui/aura/root_window.h"
-#include "ui/aura/window.h"
-#include "ui/base/l10n/l10n_util.h"
-#include "ui/base/ui_base_types.h"
-#include "ui/gfx/display.h"
-#include "ui/gfx/screen.h"
-#include "ui/views/border.h"
-#include "ui/views/controls/label.h"
-#include "ui/views/widget/widget.h"
-
-namespace ash {
-namespace internal {
-namespace {
-
-// The width of the area to show the error message.
-const int kDialogMessageWidthPixel = 300;
-
-// The margin width from the error message to the edge of the dialog.
-const int kDialogMessageMarginWidthPixel = 5;
-
-} // namespace
-
-// static
-DisplayErrorDialog* DisplayErrorDialog::ShowDialog(
- chromeos::OutputState new_state) {
- gfx::Screen* screen = Shell::GetScreen();
- const gfx::Display& target_display =
- (screen->GetNumDisplays() > 1) ?
- ScreenAsh::GetSecondaryDisplay() : screen->GetPrimaryDisplay();
-
- DisplayErrorDialog* dialog = new DisplayErrorDialog(new_state);
- views::Widget* widget = new views::Widget;
- views::Widget::InitParams params(views::Widget::InitParams::TYPE_WINDOW);
- params.delegate = dialog;
- // Makes |widget| belong to the target display. Size and location are
- // fixed by CenterWindow() below.
- params.bounds = target_display.bounds();
- DisplayController* display_controller =
- Shell::GetInstance()->display_controller();
- params.context =
- display_controller->GetRootWindowForDisplayId(target_display.id());
- params.keep_on_top = true;
- widget->Init(params);
-
- widget->GetNativeView()->SetName("DisplayErrorDialog");
- widget->CenterWindow(widget->GetRootView()->GetPreferredSize());
- widget->Show();
- return dialog;
-}
-
-void DisplayErrorDialog::UpdateMessageForState(
- chromeos::OutputState new_state) {
- int message_id = (new_state == chromeos::STATE_DUAL_MIRROR) ?
- IDS_ASH_DISPLAY_FAILURE_ON_MIRRORING :
- IDS_ASH_DISPLAY_FAILURE_ON_NON_MIRRORING;
- label_->SetText(l10n_util::GetStringUTF16(message_id));
- label_->SizeToFit(kDialogMessageWidthPixel);
- Layout();
- SchedulePaint();
-}
-
-DisplayErrorDialog::DisplayErrorDialog(chromeos::OutputState new_state) {
- Shell::GetInstance()->display_controller()->AddObserver(this);
- label_ = new views::Label();
- AddChildView(label_);
-
- label_->SetMultiLine(true);
- label_->SetHorizontalAlignment(gfx::ALIGN_LEFT);
- label_->set_border(views::Border::CreateEmptyBorder(
- kDialogMessageMarginWidthPixel,
- kDialogMessageMarginWidthPixel,
- kDialogMessageMarginWidthPixel,
- kDialogMessageMarginWidthPixel));
-
- UpdateMessageForState(new_state);
-}
-
-DisplayErrorDialog::~DisplayErrorDialog() {
- Shell::GetInstance()->display_controller()->RemoveObserver(this);
-}
-
-int DisplayErrorDialog::GetDialogButtons() const {
- return ui::DIALOG_BUTTON_OK;
-}
-
-ui::ModalType DisplayErrorDialog::GetModalType() const {
- return ui::MODAL_TYPE_NONE;
-}
-
-gfx::Size DisplayErrorDialog::GetPreferredSize() {
- return label_->GetPreferredSize();
-}
-
-void DisplayErrorDialog::OnDisplayConfigurationChanging() {
- GetWidget()->Close();
-}
-
-DisplayErrorObserver::DisplayErrorObserver()
- : dialog_(NULL) {
-}
-
-DisplayErrorObserver::~DisplayErrorObserver() {
- DCHECK(!dialog_);
-}
-
-void DisplayErrorObserver::OnDisplayModeChangeFailed(
- chromeos::OutputState new_state) {
- if (dialog_) {
- DCHECK(dialog_->GetWidget());
- dialog_->UpdateMessageForState(new_state);
- dialog_->GetWidget()->StackAtTop();
- dialog_->GetWidget()->Activate();
- } else {
- dialog_ = DisplayErrorDialog::ShowDialog(new_state);
- dialog_->GetWidget()->AddObserver(this);
- }
-}
-
-void DisplayErrorObserver::OnWidgetClosing(views::Widget* widget) {
- DCHECK(dialog_);
- DCHECK_EQ(dialog_->GetWidget(), widget);
- widget->RemoveObserver(this);
- dialog_ = NULL;
-}
-
-} // namespace internal
-} // namespace ash
diff --git a/ash/display/display_error_dialog.h b/ash/display/display_error_dialog.h
deleted file mode 100644
index 541adc3..0000000
--- a/ash/display/display_error_dialog.h
+++ /dev/null
@@ -1,90 +0,0 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef ASH_DISPLAY_DISPLAY_ERROR_DIALOG_H_
-#define ASH_DISPLAY_DISPLAY_ERROR_DIALOG_H_
-
-#include "ash/ash_export.h"
-#include "ash/display/display_controller.h"
-#include "base/compiler_specific.h"
-#include "chromeos/display/output_configurator.h"
-#include "ui/views/widget/widget_observer.h"
-#include "ui/views/window/dialog_delegate.h"
-
-namespace aura {
-class RootWindow;
-} // namespace aura
-
-namespace gfx {
-class Display;
-class Size;
-} // namespace gfx
-
-namespace views {
-class Label;
-} // namespace views
-
-namespace ash {
-namespace internal {
-
-// Dialog used to show an error messages when unable to change the display
-// configuration to mirroring.
-class ASH_EXPORT DisplayErrorDialog : public views::DialogDelegateView,
- public ash::DisplayController::Observer {
- public:
- // Shows the error dialog for |failed_new_state| and returns it.
- static DisplayErrorDialog* ShowDialog(chromeos::OutputState failed_new_state);
-
- // Update the error message for |failed_new_state|.
- void UpdateMessageForState(chromeos::OutputState failed_new_state);
-
- private:
- explicit DisplayErrorDialog(chromeos::OutputState failed_new_state);
- virtual ~DisplayErrorDialog();
-
- // views::DialogDelegate overrides:
- virtual int GetDialogButtons() const OVERRIDE;
-
- // views::WidgetDelegate overrides::
- virtual ui::ModalType GetModalType() const OVERRIDE;
-
- // views::View overrides:
- virtual gfx::Size GetPreferredSize() OVERRIDE;
-
- // ash::DisplayController::Observer overrides:
- virtual void OnDisplayConfigurationChanging() OVERRIDE;
-
- views::Label* label_;
-
- DISALLOW_COPY_AND_ASSIGN(DisplayErrorDialog);
-};
-
-// The class to observe the output failures and shows the error dialog when
-// necessary.
-class ASH_EXPORT DisplayErrorObserver
- : public chromeos::OutputConfigurator::Observer,
- public views::WidgetObserver {
- public:
- DisplayErrorObserver();
- virtual ~DisplayErrorObserver();
-
- const DisplayErrorDialog* dialog() const { return dialog_; }
-
- // chromeos::OutputConfigurator::Observer overrides:
- virtual void OnDisplayModeChangeFailed(
- chromeos::OutputState failed_new_state) OVERRIDE;
-
- // views::WidgetObserver overrides:
- virtual void OnWidgetClosing(views::Widget* widget) OVERRIDE;
-
- private:
- DisplayErrorDialog* dialog_;
-
- DISALLOW_COPY_AND_ASSIGN(DisplayErrorObserver);
-};
-
-} // namespace internal
-} // namespace ash
-
-#endif // ASH_DISPLAY_DISPLAY_ERROR_DIALOG_H_
diff --git a/ash/display/display_error_dialog_unittest.cc b/ash/display/display_error_dialog_unittest.cc
deleted file mode 100644
index 9bd81e4..0000000
--- a/ash/display/display_error_dialog_unittest.cc
+++ /dev/null
@@ -1,132 +0,0 @@
-// Copyright (c) 2013 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "ash/display/display_error_dialog.h"
-
-#include "ash/shell.h"
-#include "ash/test/ash_test_base.h"
-#include "grit/ash_strings.h"
-#include "ui/aura/window.h"
-#include "ui/base/l10n/l10n_util.h"
-#include "ui/views/controls/label.h"
-#include "ui/views/view.h"
-#include "ui/views/widget/widget.h"
-
-namespace ash {
-namespace internal {
-namespace {
-
-class DisplayErrorDialogTest : public test::AshTestBase {
- protected:
- DisplayErrorDialogTest() {
- }
-
- virtual ~DisplayErrorDialogTest() {
- }
-
- virtual void SetUp() OVERRIDE {
- test::AshTestBase::SetUp();
- observer_.reset(new DisplayErrorObserver());
- }
-
- virtual void TearDown() OVERRIDE {
- if (observer_->dialog()) {
- views::Widget* widget =
- const_cast<DisplayErrorDialog*>(observer_->dialog())->GetWidget();
- widget->CloseNow();
- }
- observer_.reset();
- test::AshTestBase::TearDown();
- }
-
- DisplayErrorObserver* observer() { return observer_.get(); }
-
- const base::string16& GetMessageContents(const DisplayErrorDialog* dialog) {
- const views::Label* label = static_cast<const views::Label*>(
- static_cast<const views::View*>(dialog)->child_at(0));
- return label->text();
- }
-
- private:
- scoped_ptr<DisplayErrorObserver> observer_;
-
- DISALLOW_COPY_AND_ASSIGN(DisplayErrorDialogTest);
-};
-
-}
-
-// The test cases in this file usually check if the showing dialog doesn't
-// cause any crashes, and the code doesn't cause any memory leaks.
-TEST_F(DisplayErrorDialogTest, Normal) {
- if (!SupportsMultipleDisplays())
- return;
-
- UpdateDisplay("200x200,300x300");
- DisplayErrorDialog* dialog =
- DisplayErrorDialog::ShowDialog(chromeos::STATE_DUAL_MIRROR);
- EXPECT_TRUE(dialog);
- EXPECT_TRUE(dialog->GetWidget()->IsVisible());
- EXPECT_EQ(l10n_util::GetStringUTF16(IDS_ASH_DISPLAY_FAILURE_ON_MIRRORING),
- GetMessageContents(dialog));
- EXPECT_EQ(Shell::GetAllRootWindows()[1],
- dialog->GetWidget()->GetNativeView()->GetRootWindow());
-}
-
-TEST_F(DisplayErrorDialogTest, CallTwice) {
- if (!SupportsMultipleDisplays())
- return;
-
- UpdateDisplay("200x200,300x300");
- observer()->OnDisplayModeChangeFailed(chromeos::STATE_DUAL_MIRROR);
- const DisplayErrorDialog* dialog = observer()->dialog();
- EXPECT_TRUE(dialog);
-
- observer()->OnDisplayModeChangeFailed(chromeos::STATE_DUAL_MIRROR);
- EXPECT_EQ(dialog, observer()->dialog());
-}
-
-TEST_F(DisplayErrorDialogTest, CallWithDifferentState) {
- if (!SupportsMultipleDisplays())
- return;
-
- UpdateDisplay("200x200,300x300");
- observer()->OnDisplayModeChangeFailed(chromeos::STATE_DUAL_MIRROR);
- const DisplayErrorDialog* dialog = observer()->dialog();
- EXPECT_TRUE(dialog);
- EXPECT_EQ(l10n_util::GetStringUTF16(IDS_ASH_DISPLAY_FAILURE_ON_MIRRORING),
- GetMessageContents(dialog));
-
- observer()->OnDisplayModeChangeFailed(chromeos::STATE_DUAL_EXTENDED);
- EXPECT_EQ(dialog, observer()->dialog());
- EXPECT_EQ(l10n_util::GetStringUTF16(IDS_ASH_DISPLAY_FAILURE_ON_NON_MIRRORING),
- GetMessageContents(dialog));
-}
-
-TEST_F(DisplayErrorDialogTest, SingleDisplay) {
- UpdateDisplay("200x200");
- DisplayErrorDialog* dialog =
- DisplayErrorDialog::ShowDialog(chromeos::STATE_DUAL_MIRROR);
- EXPECT_TRUE(dialog);
- EXPECT_TRUE(dialog->GetWidget()->IsVisible());
- EXPECT_EQ(Shell::GetInstance()->GetPrimaryRootWindow(),
- dialog->GetWidget()->GetNativeView()->GetRootWindow());
-}
-
-TEST_F(DisplayErrorDialogTest, DisplayDisconnected) {
- if (!SupportsMultipleDisplays())
- return;
-
- UpdateDisplay("200x200,300x300");
- observer()->OnDisplayModeChangeFailed(chromeos::STATE_DUAL_MIRROR);
- EXPECT_TRUE(observer()->dialog());
-
- UpdateDisplay("200x200");
- // Disconnection will close the dialog but we have to run all pending tasks
- // to make the effect of the close.
- RunAllPendingInMessageLoop();
- EXPECT_FALSE(observer()->dialog());
-}
-
-} // namespace internal
-} // namespace ash
diff --git a/ash/display/display_error_observer.cc b/ash/display/display_error_observer.cc
new file mode 100644
index 0000000..d4080a2
--- /dev/null
+++ b/ash/display/display_error_observer.cc
@@ -0,0 +1,89 @@
+// Copyright 2013 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "ash/display/display_error_observer.h"
+
+#include "grit/ash_resources.h"
+#include "grit/ash_strings.h"
+#include "ui/base/l10n/l10n_util.h"
+#include "ui/base/resource/resource_bundle.h"
+#include "ui/message_center/message_center.h"
+#include "ui/message_center/notification.h"
+#include "ui/message_center/notification_delegate.h"
+#include "ui/message_center/notification_list.h"
+
+using message_center::Notification;
+
+namespace ash {
+namespace internal {
+namespace {
+
+const char kDisplayErrorNotificationId[] = "chrome://settings/display/error";
+
+class DisplayErrorNotificationDelegate
+ : public message_center::NotificationDelegate {
+ public:
+ DisplayErrorNotificationDelegate() {}
+
+ // message_center::NotificationDelegate overrides:
+ virtual void Display() OVERRIDE {}
+ virtual void Error() OVERRIDE {}
+ virtual void Close(bool by_user) OVERRIDE {}
+ virtual bool HasClickedListener() OVERRIDE { return false; }
+ virtual void Click() OVERRIDE { }
+
+ protected:
+ virtual ~DisplayErrorNotificationDelegate() {}
+
+ private:
+ DISALLOW_COPY_AND_ASSIGN(DisplayErrorNotificationDelegate);
+};
+
+} // namespace
+
+DisplayErrorObserver::DisplayErrorObserver() {
+}
+
+DisplayErrorObserver::~DisplayErrorObserver() {
+}
+
+void DisplayErrorObserver::OnDisplayModeChangeFailed(
+ chromeos::OutputState new_state) {
+ // Always remove the notification to make sure the notification appears
+ // as a popup in any situation.
+ message_center::MessageCenter::Get()->RemoveNotification(
+ kDisplayErrorNotificationId, false /* by_user */);
+
+ int message_id = (new_state == chromeos::STATE_DUAL_MIRROR) ?
+ IDS_ASH_DISPLAY_FAILURE_ON_MIRRORING :
+ IDS_ASH_DISPLAY_FAILURE_ON_NON_MIRRORING;
+
+ ui::ResourceBundle& bundle = ui::ResourceBundle::GetSharedInstance();
+ scoped_ptr<Notification> notification(new Notification(
+ message_center::NOTIFICATION_TYPE_SIMPLE,
+ kDisplayErrorNotificationId,
+ l10n_util::GetStringUTF16(message_id),
+ base::string16(), // message
+ bundle.GetImageNamed(IDR_AURA_UBER_TRAY_DISPLAY),
+ base::string16(), // display_source
+ std::string(), // extension_id
+ message_center::RichNotificationData(),
+ new DisplayErrorNotificationDelegate()));
+ message_center::MessageCenter::Get()->AddNotification(notification.Pass());
+}
+
+string16 DisplayErrorObserver::GetTitleOfDisplayErrorNotificationForTest() {
+ message_center::NotificationList::Notifications notifications =
+ message_center::MessageCenter::Get()->GetNotifications();
+ for (message_center::NotificationList::Notifications::const_iterator iter =
+ notifications.begin(); iter != notifications.end(); ++iter) {
+ if ((*iter)->id() == kDisplayErrorNotificationId)
+ return (*iter)->title();
+ }
+
+ return base::string16();
+}
+
+} // namespace internal
+} // namespace ash
diff --git a/ash/display/display_error_observer.h b/ash/display/display_error_observer.h
new file mode 100644
index 0000000..5cba904
--- /dev/null
+++ b/ash/display/display_error_observer.h
@@ -0,0 +1,39 @@
+// Copyright 2013 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef ASH_DISPLAY_DISPLAY_ERROR_OBSERVER_H_
+#define ASH_DISPLAY_DISPLAY_ERROR_OBSERVER_H_
+
+#include "ash/ash_export.h"
+#include "base/compiler_specific.h"
+#include "base/strings/string16.h"
+#include "chromeos/display/output_configurator.h"
+
+namespace ash {
+namespace internal {
+
+// The class to observe the output failures and shows the error dialog when
+// necessary.
+class ASH_EXPORT DisplayErrorObserver
+ : public chromeos::OutputConfigurator::Observer {
+ public:
+ DisplayErrorObserver();
+ virtual ~DisplayErrorObserver();
+
+ // chromeos::OutputConfigurator::Observer overrides:
+ virtual void OnDisplayModeChangeFailed(
+ chromeos::OutputState failed_new_state) OVERRIDE;
+
+ private:
+ friend class DisplayErrorObserverTest;
+
+ base::string16 GetTitleOfDisplayErrorNotificationForTest();
+
+ DISALLOW_COPY_AND_ASSIGN(DisplayErrorObserver);
+};
+
+} // namespace internal
+} // namespace ash
+
+#endif // ASH_DISPLAY_DISPLAY_ERROR_OBSERVER_H_
diff --git a/ash/display/display_error_observer_unittest.cc b/ash/display/display_error_observer_unittest.cc
new file mode 100644
index 0000000..abe4907
--- /dev/null
+++ b/ash/display/display_error_observer_unittest.cc
@@ -0,0 +1,85 @@
+// Copyright 2013 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "ash/display/display_error_observer.h"
+
+#include "ash/shell.h"
+#include "ash/test/ash_test_base.h"
+#include "grit/ash_strings.h"
+#include "ui/aura/window.h"
+#include "ui/base/l10n/l10n_util.h"
+#include "ui/views/controls/label.h"
+#include "ui/views/view.h"
+#include "ui/views/widget/widget.h"
+
+namespace ash {
+namespace internal {
+
+class DisplayErrorObserverTest : public test::AshTestBase {
+ protected:
+ DisplayErrorObserverTest() {
+ }
+
+ virtual ~DisplayErrorObserverTest() {
+ }
+
+ virtual void SetUp() OVERRIDE {
+ test::AshTestBase::SetUp();
+ observer_.reset(new DisplayErrorObserver());
+ }
+
+ protected:
+ DisplayErrorObserver* observer() { return observer_.get(); }
+
+ base::string16 GetMessageContents() {
+ return observer_->GetTitleOfDisplayErrorNotificationForTest();
+ }
+
+ private:
+ scoped_ptr<DisplayErrorObserver> observer_;
+
+ DISALLOW_COPY_AND_ASSIGN(DisplayErrorObserverTest);
+};
+
+TEST_F(DisplayErrorObserverTest, Normal) {
+ if (!SupportsMultipleDisplays())
+ return;
+
+ UpdateDisplay("200x200,300x300");
+ observer()->OnDisplayModeChangeFailed(chromeos::STATE_DUAL_MIRROR);
+ EXPECT_EQ(l10n_util::GetStringUTF16(IDS_ASH_DISPLAY_FAILURE_ON_MIRRORING),
+ GetMessageContents());
+}
+
+TEST_F(DisplayErrorObserverTest, CallTwice) {
+ if (!SupportsMultipleDisplays())
+ return;
+
+ UpdateDisplay("200x200,300x300");
+ observer()->OnDisplayModeChangeFailed(chromeos::STATE_DUAL_MIRROR);
+ base::string16 message = GetMessageContents();
+ EXPECT_FALSE(message.empty());
+
+ observer()->OnDisplayModeChangeFailed(chromeos::STATE_DUAL_MIRROR);
+ base::string16 message2 = GetMessageContents();
+ EXPECT_FALSE(message2.empty());
+ EXPECT_EQ(message, message2);
+}
+
+TEST_F(DisplayErrorObserverTest, CallWithDifferentState) {
+ if (!SupportsMultipleDisplays())
+ return;
+
+ UpdateDisplay("200x200,300x300");
+ observer()->OnDisplayModeChangeFailed(chromeos::STATE_DUAL_MIRROR);
+ EXPECT_EQ(l10n_util::GetStringUTF16(IDS_ASH_DISPLAY_FAILURE_ON_MIRRORING),
+ GetMessageContents());
+
+ observer()->OnDisplayModeChangeFailed(chromeos::STATE_DUAL_EXTENDED);
+ EXPECT_EQ(l10n_util::GetStringUTF16(IDS_ASH_DISPLAY_FAILURE_ON_NON_MIRRORING),
+ GetMessageContents());
+}
+
+} // namespace internal
+} // namespace ash
diff --git a/ash/display/output_configurator_animation.cc b/ash/display/output_configurator_animation.cc
index d58d9a5..6161bef 100644
--- a/ash/display/output_configurator_animation.cc
+++ b/ash/display/output_configurator_animation.cc
@@ -4,7 +4,6 @@
#include "ash/display/output_configurator_animation.h"
-#include "ash/display/display_error_dialog.h"
#include "ash/shell.h"
#include "ash/shell_window_ids.h"
#include "base/bind.h"
diff --git a/ash/shell.cc b/ash/shell.cc
index 8d3b3bb..a53fc5c 100644
--- a/ash/shell.cc
+++ b/ash/shell.cc
@@ -110,7 +110,7 @@
#if defined(USE_X11)
#include "ash/ash_constants.h"
#include "ash/display/display_change_observer_x11.h"
-#include "ash/display/display_error_dialog.h"
+#include "ash/display/display_error_observer.h"
#include "ash/display/output_configurator_animation.h"
#include "base/chromeos/chromeos_version.h"
#include "base/message_loop/message_pump_aurax11.h"