Chromium Code Reviews| Index: ash/display/display_error_observer_chromeos.cc |
| diff --git a/ash/display/display_error_observer_chromeos.cc b/ash/display/display_error_observer_chromeos.cc |
| index c08e6402da45394b01d650ecc0de98a094d06851..fe89db88f8a421f08ec936e11dd5c7e58501a258 100644 |
| --- a/ash/display/display_error_observer_chromeos.cc |
| +++ b/ash/display/display_error_observer_chromeos.cc |
| @@ -4,9 +4,13 @@ |
| #include "ash/display/display_error_observer_chromeos.h" |
| +#include <cinttypes> |
| #include <utility> |
| +#include "ash/new_window_delegate.h" |
| +#include "ash/shell.h" |
| #include "ash/system/system_notifier.h" |
| +#include "base/strings/stringprintf.h" |
| #include "grit/ash_resources.h" |
| #include "grit/ash_strings.h" |
| #include "ui/base/l10n/l10n_util.h" |
| @@ -23,6 +27,48 @@ namespace { |
| const char kDisplayErrorNotificationId[] = "chrome://settings/display/error"; |
| +// A notification delegate that will start the feedback app when the notication |
| +// is clicked. |
| +class DisplayErrorNotificationDelegate |
| + : public message_center::NotificationDelegate { |
| + public: |
| + DisplayErrorNotificationDelegate() {} |
|
oshima
2016/01/27 09:18:14
= default. (this seems to be allowed now)
afakhry
2016/01/29 02:16:51
Done.
|
| + |
| + // message_center::NotificationDelegate: |
| + bool HasClickedListener() override { return true; } |
| + |
| + void Click() override { |
| + ash::Shell::GetInstance()->new_window_delegate()->OpenFeedbackPage(); |
| + } |
| + |
| + private: |
| + // Private destructor since NotificationDelegate is ref-counted. |
| + ~DisplayErrorNotificationDelegate() override {} |
|
oshima
2016/01/27 09:18:14
ditto
afakhry
2016/01/29 02:16:51
Done.
|
| + |
| + DISALLOW_COPY_AND_ASSIGN(DisplayErrorNotificationDelegate); |
| +}; |
| + |
| +// Returns an error message to be logged when there is a failure in changing |
| +// the display mode, so that it shows in the system logs when the user files |
| +// a feedback report. |
| +std::string CreateErrorLogMessage( |
| + const ui::DisplayConfigurator::DisplayStateList& displays) { |
| + std::string error_log_message( |
| + "Failed to configure the following display(s):\n"); |
| + for (const auto& display : displays) { |
| + base::StringAppendF(&error_log_message, |
| + "\t- Display with ID = %" PRId64 ", and EDID = ", |
| + display->display_id()); |
| + |
| + for (const auto& edid_byte : display->edid()) |
| + base::StringAppendF(&error_log_message, "%02X", edid_byte); |
|
oshima
2016/01/27 09:18:14
base::HexEncode?
afakhry
2016/01/29 02:16:51
Done.
|
| + |
| + base::StringAppendF(&error_log_message, ".\n"); |
| + } |
| + |
| + return error_log_message; |
|
oshima
2016/01/27 09:18:14
can't you jus log it to the stream instead of crea
afakhry
2016/01/29 02:16:51
Done.
|
| +} |
| + |
| } // namespace |
| DisplayErrorObserver::DisplayErrorObserver() { |
| @@ -34,6 +80,8 @@ DisplayErrorObserver::~DisplayErrorObserver() { |
| void DisplayErrorObserver::OnDisplayModeChangeFailed( |
| const ui::DisplayConfigurator::DisplayStateList& displays, |
| ui::MultipleDisplayState new_state) { |
| + LOG(ERROR) << CreateErrorLogMessage(displays); |
| + |
| // Always remove the notification to make sure the notification appears |
| // as a popup in any situation. |
| message_center::MessageCenter::Get()->RemoveNotification( |
| @@ -53,7 +101,8 @@ void DisplayErrorObserver::OnDisplayModeChangeFailed( |
| GURL(), |
| message_center::NotifierId(message_center::NotifierId::SYSTEM_COMPONENT, |
| system_notifier::kNotifierDisplayError), |
| - message_center::RichNotificationData(), NULL)); |
| + message_center::RichNotificationData(), |
| + new DisplayErrorNotificationDelegate)); |
| message_center::MessageCenter::Get()->AddNotification( |
| std::move(notification)); |
| } |