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

Unified Diff: ash/accelerators/accelerator_controller.cc

Issue 1177773002: Deprecating high-conflict accelerators (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: moving IsDeprecated() to c/b/ui/ash Created 5 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 side-by-side diff with in-line comments
Download patch
Index: ash/accelerators/accelerator_controller.cc
diff --git a/ash/accelerators/accelerator_controller.cc b/ash/accelerators/accelerator_controller.cc
index 6eb68a3921409ddb09a7388551f83661ff71e866..e5113674d88a5c37e45b4d6ac6a8a41b38ef19f3 100644
--- a/ash/accelerators/accelerator_controller.cc
+++ b/ash/accelerators/accelerator_controller.cc
@@ -38,6 +38,7 @@
#include "ash/system/brightness_control_delegate.h"
#include "ash/system/keyboard_brightness/keyboard_brightness_control_delegate.h"
#include "ash/system/status_area_widget.h"
+#include "ash/system/system_notifier.h"
#include "ash/system/tray/system_tray.h"
#include "ash/system/tray/system_tray_delegate.h"
#include "ash/system/tray/system_tray_notifier.h"
@@ -55,16 +56,21 @@
#include "ash/wm/wm_event.h"
#include "base/bind.h"
#include "base/command_line.h"
+#include "base/metrics/histogram_macros.h"
#include "base/metrics/user_metrics.h"
#include "ui/aura/env.h"
#include "ui/base/accelerators/accelerator.h"
#include "ui/base/accelerators/accelerator_manager.h"
+#include "ui/base/l10n/l10n_util.h"
#include "ui/compositor/layer.h"
#include "ui/compositor/layer_animation_sequence.h"
#include "ui/compositor/layer_animator.h"
#include "ui/events/event.h"
#include "ui/events/keycodes/keyboard_codes.h"
#include "ui/gfx/screen.h"
+#include "ui/message_center/message_center.h"
+#include "ui/message_center/notification.h"
+#include "ui/message_center/notifier_settings.h"
#include "ui/views/controls/webview/webview.h"
#if defined(OS_CHROMEOS)
@@ -79,6 +85,37 @@ namespace {
using base::UserMetricsAction;
+inline ui::Accelerator CreateAccelerator(ui::KeyboardCode keycode,
+ int modifiers,
+ bool trigger_on_press) {
+ ui::Accelerator accelerator(keycode, modifiers);
+ accelerator.set_type(trigger_on_press ? ui::ET_KEY_PRESSED
+ : ui::ET_KEY_RELEASED);
+ return accelerator;
+}
+
+void ShowDeprecatedAcceleratorNotification(int message_id) {
+ const base::string16 message = l10n_util::GetStringUTF16(message_id);
+ scoped_ptr<message_center::Notification> notification(
+ new message_center::Notification(
+ message_center::NOTIFICATION_TYPE_SIMPLE,
+ kDeprecatedAcceleratorNotificationId, base::string16(), message,
+ gfx::Image(), base::string16(),
+ message_center::NotifierId(
+ message_center::NotifierId::SYSTEM_COMPONENT,
+ system_notifier::kNotifierAcceleratorController),
+ message_center::RichNotificationData(), nullptr));
+ message_center::MessageCenter::Get()->AddNotification(notification.Pass());
+}
+
+void RecordUmaHistogram(const char* histogram_name,
+ DeprecatedAcceleratorUsage sample) {
+ auto histogram = base::LinearHistogram::FactoryGet(
+ histogram_name, 1, DEPRECATED_USAGE_COUNT, DEPRECATED_USAGE_COUNT + 1,
+ base::HistogramBase::kUmaTargetedHistogramFlag);
+ histogram->Add(sample);
+}
+
bool CanHandleAccessibleFocusCycle() {
if (!Shell::GetInstance()->accessibility_delegate()->
IsSpokenFeedbackEnabled()) {
@@ -758,6 +795,11 @@ bool AcceleratorController::IsReserved(
return reserved_actions_.find(iter->second) != reserved_actions_.end();
}
+bool AcceleratorController::IsDeprecated(
+ const ui::Accelerator& accelerator) const {
+ return deprecated_accelerators_.count(accelerator) != 0;
+}
+
bool AcceleratorController::PerformActionIfEnabled(AcceleratorAction action) {
if (CanPerformAction(action, ui::Accelerator())) {
PerformAction(action, ui::Accelerator());
@@ -833,6 +875,9 @@ void AcceleratorController::Init() {
RegisterAccelerators(kAcceleratorData, kAcceleratorDataLength);
+ RegisterDeprecatedAccelerators(kDeprecatedAccelerators,
+ kDeprecatedAcceleratorsLength);
+
if (debug::DebugAcceleratorsEnabled()) {
RegisterAccelerators(kDebugAcceleratorData, kDebugAcceleratorDataLength);
// All debug accelerators are reserved.
@@ -850,16 +895,33 @@ void AcceleratorController::RegisterAccelerators(
const AcceleratorData accelerators[],
size_t accelerators_length) {
for (size_t i = 0; i < accelerators_length; ++i) {
- ui::Accelerator accelerator(accelerators[i].keycode,
- accelerators[i].modifiers);
- accelerator.set_type(accelerators[i].trigger_on_press ?
- ui::ET_KEY_PRESSED : ui::ET_KEY_RELEASED);
+ ui::Accelerator accelerator =
+ CreateAccelerator(accelerators[i].keycode, accelerators[i].modifiers,
+ accelerators[i].trigger_on_press);
Register(accelerator, this);
accelerators_.insert(
std::make_pair(accelerator, accelerators[i].action));
}
}
+void AcceleratorController::RegisterDeprecatedAccelerators(
+ const DeprecatedAcceleratorData deprecated_accelerators[],
+ size_t length) {
+ for (size_t i = 0; i < length; ++i) {
+ const DeprecatedAcceleratorData* data = &deprecated_accelerators[i];
+ const AcceleratorAction action = data->deprecated_accelerator.action;
+ const ui::Accelerator deprecated_accelerator =
+ CreateAccelerator(data->deprecated_accelerator.keycode,
+ data->deprecated_accelerator.modifiers,
+ data->deprecated_accelerator.trigger_on_press);
+
+ Register(deprecated_accelerator, this);
+ actions_with_deprecations_[action] = data;
+ accelerators_[deprecated_accelerator] = action;
+ deprecated_accelerators_.insert(deprecated_accelerator);
+ }
+}
+
bool AcceleratorController::CanPerformAction(
AcceleratorAction action,
const ui::Accelerator& accelerator) {
@@ -868,6 +930,29 @@ bool AcceleratorController::CanPerformAction(
return false;
}
+ // Handling the deprecated accelerators.
+ auto itr = actions_with_deprecations_.find(action);
+ if (itr != actions_with_deprecations_.end()) {
+ const DeprecatedAcceleratorData* data = itr->second;
+ if (deprecated_accelerators_.count(accelerator)) {
+ // This accelerator has been deprecated and should be treated according
+ // to its |DeprecatedAcceleratorData|.
+
+ // Record UMA stats.
+ RecordUmaHistogram(data->uma_histogram_name, DEPRECATED_USED);
+
+ // We always display the notification as long as this entry exists.
+ ShowDeprecatedAcceleratorNotification(data->notification_message_id);
+
+ if (!data->deprecated_enabled)
+ return false;
+ } else {
+ // This is a new accelerator replacing the old deprecated one.
+ // Record UMA stats and proceed normally.
+ RecordUmaHistogram(data->uma_histogram_name, NEW_USED);
+ }
+ }
+
AcceleratorProcessingRestriction restriction =
GetAcceleratorProcessingRestriction(action);
if (restriction != RESTRICTION_NONE)

Powered by Google App Engine
This is Rietveld 408576698