gesture_prefs_observer_factory_aura.cc revision b2df76ea8fec9e32f6f3718986dba0d95315b29c
1// Copyright (c) 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 "chrome/browser/ui/gesture_prefs_observer_factory_aura.h"
6
7#include <vector>
8
9#include "base/bind.h"
10#include "base/bind_helpers.h"
11#include "base/compiler_specific.h"
12#include "base/prefs/pref_change_registrar.h"
13#include "base/prefs/pref_service.h"
14#include "chrome/browser/profiles/incognito_helpers.h"
15#include "chrome/browser/profiles/profile.h"
16#include "chrome/browser/profiles/profile_dependency_manager.h"
17#include "chrome/common/chrome_notification_types.h"
18#include "chrome/common/pref_names.h"
19#include "components/user_prefs/pref_registry_syncable.h"
20#include "content/public/browser/notification_observer.h"
21#include "content/public/browser/notification_service.h"
22#include "content/public/browser/overscroll_configuration.h"
23#include "content/public/common/renderer_preferences.h"
24#include "ui/base/gestures/gesture_configuration.h"
25
26#if defined(USE_ASH)
27#include "ash/wm/workspace/workspace_cycler_configuration.h"
28#endif  // USE_ASH
29
30#if defined(USE_ASH)
31using ash::WorkspaceCyclerConfiguration;
32#endif  // USE_ASH
33
34using ui::GestureConfiguration;
35
36namespace {
37
38// TODO(rjkroege): Remove this deprecated pref in M29. http://crbug.com/160243.
39const char kTouchScreenFlingAccelerationAdjustment[] =
40    "gesture.touchscreen_fling_acceleration_adjustment";
41
42struct OverscrollPref {
43  const char* pref_name;
44  content::OverscrollConfig config;
45};
46
47const std::vector<OverscrollPref>& GetOverscrollPrefs() {
48  CR_DEFINE_STATIC_LOCAL(std::vector<OverscrollPref>, overscroll_prefs, ());
49  if (overscroll_prefs.empty()) {
50    using namespace content;
51    const OverscrollPref kOverscrollPrefs[] = {
52      { prefs::kOverscrollHorizontalThresholdComplete,
53        OVERSCROLL_CONFIG_HORIZ_THRESHOLD_COMPLETE },
54      { prefs::kOverscrollVerticalThresholdComplete,
55        OVERSCROLL_CONFIG_VERT_THRESHOLD_COMPLETE },
56      { prefs::kOverscrollMinimumThresholdStart,
57        OVERSCROLL_CONFIG_MIN_THRESHOLD_START },
58      { prefs::kOverscrollHorizontalResistThreshold,
59        OVERSCROLL_CONFIG_HORIZ_RESIST_AFTER },
60      { prefs::kOverscrollVerticalResistThreshold,
61        OVERSCROLL_CONFIG_VERT_RESIST_AFTER },
62    };
63    overscroll_prefs.assign(kOverscrollPrefs,
64                            kOverscrollPrefs + arraysize(kOverscrollPrefs));
65  }
66  return overscroll_prefs;
67}
68
69#if defined(USE_ASH)
70const char* kImmersiveModePrefs[] = {
71  prefs::kImmersiveModeRevealDelayMs,
72  prefs::kImmersiveModeRevealXThresholdPixels,
73};
74
75struct WorkspaceCyclerPref {
76  const char* pref_name;
77  WorkspaceCyclerConfiguration::Property property;
78};
79
80const std::vector<WorkspaceCyclerPref>& GetWorkspaceCyclerPrefs() {
81  CR_DEFINE_STATIC_LOCAL(std::vector<WorkspaceCyclerPref>, cycler_prefs, ());
82  if (cycler_prefs.empty()) {
83    const WorkspaceCyclerPref kCyclerPrefs[] = {
84      { prefs::kWorkspaceCyclerShallowerThanSelectedYOffsets,
85        WorkspaceCyclerConfiguration::SHALLOWER_THAN_SELECTED_Y_OFFSETS },
86      { prefs::kWorkspaceCyclerDeeperThanSelectedYOffsets,
87        WorkspaceCyclerConfiguration::DEEPER_THAN_SELECTED_Y_OFFSETS },
88      { prefs::kWorkspaceCyclerSelectedYOffset,
89        WorkspaceCyclerConfiguration::SELECTED_Y_OFFSET },
90      { prefs::kWorkspaceCyclerSelectedScale,
91        WorkspaceCyclerConfiguration::SELECTED_SCALE },
92      { prefs::kWorkspaceCyclerMinScale,
93        WorkspaceCyclerConfiguration::MIN_SCALE },
94      { prefs::kWorkspaceCyclerMaxScale,
95        WorkspaceCyclerConfiguration::MAX_SCALE },
96      { prefs::kWorkspaceCyclerMinBrightness,
97        WorkspaceCyclerConfiguration::MIN_BRIGHTNESS },
98      { prefs::kWorkspaceCyclerBackgroundOpacity,
99        WorkspaceCyclerConfiguration::BACKGROUND_OPACITY },
100      { prefs::kWorkspaceCyclerDesktopWorkspaceBrightness,
101        WorkspaceCyclerConfiguration::DESKTOP_WORKSPACE_BRIGHTNESS },
102      { prefs::kWorkspaceCyclerDistanceToInitiateCycling,
103        WorkspaceCyclerConfiguration::DISTANCE_TO_INITIATE_CYCLING },
104      { prefs::kWorkspaceCyclerScrollDistanceToCycleToNextWorkspace,
105        WorkspaceCyclerConfiguration::
106            SCROLL_DISTANCE_TO_CYCLE_TO_NEXT_WORKSPACE },
107      { prefs::kWorkspaceCyclerCyclerStepAnimationDurationRatio,
108        WorkspaceCyclerConfiguration::CYCLER_STEP_ANIMATION_DURATION_RATIO },
109      { prefs::kWorkspaceCyclerStartCyclerAnimationDuration,
110        WorkspaceCyclerConfiguration::START_CYCLER_ANIMATION_DURATION },
111      { prefs::kWorkspaceCyclerStopCyclerAnimationDuration,
112        WorkspaceCyclerConfiguration::STOP_CYCLER_ANIMATION_DURATION },
113    };
114    cycler_prefs.assign(kCyclerPrefs, kCyclerPrefs + arraysize(kCyclerPrefs));
115  }
116  return cycler_prefs;
117}
118#endif  // USE_ASH
119
120// This class manages gesture configuration preferences.
121class GesturePrefsObserver : public ProfileKeyedService {
122 public:
123  explicit GesturePrefsObserver(PrefService* prefs);
124  virtual ~GesturePrefsObserver();
125
126  // ProfileKeyedService implementation.
127  virtual void Shutdown() OVERRIDE;
128
129 private:
130  // Notification callback invoked when browser-side preferences
131  // are updated and need to be pushed into ui::GesturePreferences.
132  void Update();
133
134  // Notification callback invoked when the fling deacceleration
135  // gesture preferences are changed from chrome://gesture.
136  // Broadcasts the changes all renderers where they are used.
137  void Notify();
138
139  // Notification helper to push overscroll preferences into
140  // content.
141  void UpdateOverscrollPrefs();
142
143  void UpdateImmersiveModePrefs();
144  void UpdateWorkspaceCyclerPrefs();
145
146  PrefChangeRegistrar registrar_;
147  PrefService* prefs_;
148
149  DISALLOW_COPY_AND_ASSIGN(GesturePrefsObserver);
150};
151
152// The list of prefs we want to observe.
153// Note that this collection of settings should correspond to the settings used
154// in ui/base/gestures/gesture_configuration.h
155const char* kPrefsToObserve[] = {
156  prefs::kFlingAccelerationCurveCoefficient0,
157  prefs::kFlingAccelerationCurveCoefficient1,
158  prefs::kFlingAccelerationCurveCoefficient2,
159  prefs::kFlingAccelerationCurveCoefficient3,
160  prefs::kFlingMaxCancelToDownTimeInMs,
161  prefs::kFlingMaxTapGapTimeInMs,
162  prefs::kTabScrubActivationDelayInMS,
163  prefs::kFlingVelocityCap,
164  prefs::kLongPressTimeInSeconds,
165  prefs::kMaxDistanceForTwoFingerTapInPixels,
166  prefs::kMaxSecondsBetweenDoubleClick,
167  prefs::kMaxSeparationForGestureTouchesInPixels,
168  prefs::kMaxSwipeDeviationRatio,
169  prefs::kMaxTouchDownDurationInSecondsForClick,
170  prefs::kMaxTouchMoveInPixelsForClick,
171  prefs::kMinDistanceForPinchScrollInPixels,
172  prefs::kMinFlickSpeedSquared,
173  prefs::kMinPinchUpdateDistanceInPixels,
174  prefs::kMinRailBreakVelocity,
175  prefs::kMinScrollDeltaSquared,
176  prefs::kMinSwipeSpeed,
177  prefs::kMinTouchDownDurationInSecondsForClick,
178  prefs::kPointsBufferedForVelocity,
179  prefs::kRailBreakProportion,
180  prefs::kRailStartProportion,
181  prefs::kSemiLongPressTimeInSeconds,
182};
183
184const char* kFlingTouchpadPrefs[] = {
185  prefs::kFlingCurveTouchpadAlpha,
186  prefs::kFlingCurveTouchpadBeta,
187  prefs::kFlingCurveTouchpadGamma
188};
189
190const char* kFlingTouchscreenPrefs[] = {
191  prefs::kFlingCurveTouchscreenAlpha,
192  prefs::kFlingCurveTouchscreenBeta,
193  prefs::kFlingCurveTouchscreenGamma,
194};
195
196GesturePrefsObserver::GesturePrefsObserver(PrefService* prefs)
197    : prefs_(prefs) {
198  // Clear for migration.
199  prefs->ClearPref(kTouchScreenFlingAccelerationAdjustment);
200
201  registrar_.Init(prefs);
202  registrar_.RemoveAll();
203  base::Closure callback = base::Bind(&GesturePrefsObserver::Update,
204                                      base::Unretained(this));
205
206  base::Closure notify_callback = base::Bind(&GesturePrefsObserver::Notify,
207                                             base::Unretained(this));
208
209  for (size_t i = 0; i < arraysize(kPrefsToObserve); ++i)
210    registrar_.Add(kPrefsToObserve[i], callback);
211
212  const std::vector<OverscrollPref>& overscroll_prefs = GetOverscrollPrefs();
213  for (size_t i = 0; i < overscroll_prefs.size(); ++i)
214    registrar_.Add(overscroll_prefs[i].pref_name, callback);
215
216  for (size_t i = 0; i < arraysize(kFlingTouchpadPrefs); ++i)
217    registrar_.Add(kFlingTouchpadPrefs[i], notify_callback);
218  for (size_t i = 0; i < arraysize(kFlingTouchscreenPrefs); ++i)
219    registrar_.Add(kFlingTouchscreenPrefs[i], notify_callback);
220
221#if defined(USE_ASH)
222  for (size_t i = 0; i < arraysize(kImmersiveModePrefs); ++i)
223    registrar_.Add(kImmersiveModePrefs[i], callback);
224
225  const std::vector<WorkspaceCyclerPref>& cycler_prefs =
226      GetWorkspaceCyclerPrefs();
227  for (size_t i = 0; i < cycler_prefs.size(); ++i)
228    registrar_.Add(cycler_prefs[i].pref_name, callback);
229#endif  // USE_ASH
230  Update();
231}
232
233GesturePrefsObserver::~GesturePrefsObserver() {}
234
235void GesturePrefsObserver::Shutdown() {
236  registrar_.RemoveAll();
237}
238
239void GesturePrefsObserver::Update() {
240  GestureConfiguration::set_fling_acceleration_curve_coefficients(0,
241      prefs_->GetDouble(prefs::kFlingAccelerationCurveCoefficient0));
242  GestureConfiguration::set_fling_acceleration_curve_coefficients(1,
243      prefs_->GetDouble(prefs::kFlingAccelerationCurveCoefficient1));
244  GestureConfiguration::set_fling_acceleration_curve_coefficients(2,
245      prefs_->GetDouble(prefs::kFlingAccelerationCurveCoefficient2));
246  GestureConfiguration::set_fling_acceleration_curve_coefficients(3,
247      prefs_->GetDouble(prefs::kFlingAccelerationCurveCoefficient3));
248  GestureConfiguration::set_fling_max_cancel_to_down_time_in_ms(
249      prefs_->GetInteger(prefs::kFlingMaxCancelToDownTimeInMs));
250  GestureConfiguration::set_fling_max_tap_gap_time_in_ms(
251      prefs_->GetInteger(prefs::kFlingMaxTapGapTimeInMs));
252  GestureConfiguration::set_tab_scrub_activation_delay_in_ms(
253      prefs_->GetInteger(prefs::kTabScrubActivationDelayInMS));
254  GestureConfiguration::set_fling_velocity_cap(
255      prefs_->GetDouble(prefs::kFlingVelocityCap));
256  GestureConfiguration::set_long_press_time_in_seconds(
257      prefs_->GetDouble(
258          prefs::kLongPressTimeInSeconds));
259  GestureConfiguration::set_semi_long_press_time_in_seconds(
260      prefs_->GetDouble(
261          prefs::kSemiLongPressTimeInSeconds));
262  GestureConfiguration::set_max_distance_for_two_finger_tap_in_pixels(
263      prefs_->GetDouble(
264          prefs::kMaxDistanceForTwoFingerTapInPixels));
265  GestureConfiguration::set_max_seconds_between_double_click(
266      prefs_->GetDouble(
267          prefs::kMaxSecondsBetweenDoubleClick));
268  GestureConfiguration::set_max_separation_for_gesture_touches_in_pixels(
269      prefs_->GetDouble(
270          prefs::kMaxSeparationForGestureTouchesInPixels));
271  GestureConfiguration::set_max_swipe_deviation_ratio(
272      prefs_->GetDouble(
273          prefs::kMaxSwipeDeviationRatio));
274  GestureConfiguration::set_max_touch_down_duration_in_seconds_for_click(
275      prefs_->GetDouble(
276          prefs::kMaxTouchDownDurationInSecondsForClick));
277  GestureConfiguration::set_max_touch_move_in_pixels_for_click(
278      prefs_->GetDouble(
279          prefs::kMaxTouchMoveInPixelsForClick));
280  GestureConfiguration::set_max_distance_between_taps_for_double_tap(
281      prefs_->GetDouble(
282          prefs::kMaxDistanceBetweenTapsForDoubleTap));
283  GestureConfiguration::set_min_distance_for_pinch_scroll_in_pixels(
284      prefs_->GetDouble(
285          prefs::kMinDistanceForPinchScrollInPixels));
286  GestureConfiguration::set_min_flick_speed_squared(
287      prefs_->GetDouble(
288          prefs::kMinFlickSpeedSquared));
289  GestureConfiguration::set_min_pinch_update_distance_in_pixels(
290      prefs_->GetDouble(
291          prefs::kMinPinchUpdateDistanceInPixels));
292  GestureConfiguration::set_min_rail_break_velocity(
293      prefs_->GetDouble(
294          prefs::kMinRailBreakVelocity));
295  GestureConfiguration::set_min_scroll_delta_squared(
296      prefs_->GetDouble(
297          prefs::kMinScrollDeltaSquared));
298  GestureConfiguration::set_min_swipe_speed(
299      prefs_->GetDouble(
300          prefs::kMinSwipeSpeed));
301  GestureConfiguration::set_min_touch_down_duration_in_seconds_for_click(
302      prefs_->GetDouble(
303          prefs::kMinTouchDownDurationInSecondsForClick));
304  GestureConfiguration::set_points_buffered_for_velocity(
305      prefs_->GetInteger(
306          prefs::kPointsBufferedForVelocity));
307  GestureConfiguration::set_rail_break_proportion(
308      prefs_->GetDouble(
309          prefs::kRailBreakProportion));
310  GestureConfiguration::set_rail_start_proportion(
311      prefs_->GetDouble(
312          prefs::kRailStartProportion));
313
314  UpdateOverscrollPrefs();
315  UpdateImmersiveModePrefs();
316  UpdateWorkspaceCyclerPrefs();
317}
318
319void GesturePrefsObserver::UpdateOverscrollPrefs() {
320  const std::vector<OverscrollPref>& overscroll_prefs = GetOverscrollPrefs();
321  for (size_t i = 0; i < overscroll_prefs.size(); ++i) {
322    content::SetOverscrollConfig(overscroll_prefs[i].config,
323        static_cast<float>(prefs_->GetDouble(overscroll_prefs[i].pref_name)));
324  }
325}
326
327void GesturePrefsObserver::UpdateImmersiveModePrefs() {
328#if defined(USE_ASH)
329  GestureConfiguration::set_immersive_mode_reveal_delay_ms(
330      prefs_->GetInteger(prefs::kImmersiveModeRevealDelayMs));
331  GestureConfiguration::set_immersive_mode_reveal_x_threshold_pixels(
332      prefs_->GetInteger(prefs::kImmersiveModeRevealXThresholdPixels));
333#endif  // USE_ASH
334}
335
336void GesturePrefsObserver::UpdateWorkspaceCyclerPrefs() {
337#if defined(USE_ASH)
338  const std::vector<WorkspaceCyclerPref>& cycler_prefs =
339      GetWorkspaceCyclerPrefs();
340  for (size_t i = 0; i < cycler_prefs.size(); ++i) {
341    WorkspaceCyclerConfiguration::Property property =
342        cycler_prefs[i].property;
343    if (WorkspaceCyclerConfiguration::IsListProperty(property)) {
344      WorkspaceCyclerConfiguration::SetListValue(property,
345          *prefs_->GetList(cycler_prefs[i].pref_name));
346    } else {
347      WorkspaceCyclerConfiguration::SetDouble(property,
348          prefs_->GetDouble(cycler_prefs[i].pref_name));
349    }
350  }
351#endif  // USE_ASH
352}
353
354void GesturePrefsObserver::Notify() {
355  // Must do a notify to distribute the changes to all renderers.
356  content::NotificationService* service =
357      content::NotificationService::current();
358  service->Notify(chrome::NOTIFICATION_BROWSER_FLING_CURVE_PARAMETERS_CHANGED,
359                  content::Source<GesturePrefsObserver>(this),
360                  content::NotificationService::NoDetails());
361}
362
363}  // namespace
364
365// static
366GesturePrefsObserverFactoryAura*
367GesturePrefsObserverFactoryAura::GetInstance() {
368  return Singleton<GesturePrefsObserverFactoryAura>::get();
369}
370
371GesturePrefsObserverFactoryAura::GesturePrefsObserverFactoryAura()
372    : ProfileKeyedServiceFactory("GesturePrefsObserverAura",
373                                 ProfileDependencyManager::GetInstance()) {}
374
375GesturePrefsObserverFactoryAura::~GesturePrefsObserverFactoryAura() {}
376
377ProfileKeyedService* GesturePrefsObserverFactoryAura::BuildServiceInstanceFor(
378    content::BrowserContext* profile) const {
379  return new GesturePrefsObserver(static_cast<Profile*>(profile)->GetPrefs());
380}
381
382void GesturePrefsObserverFactoryAura::RegisterOverscrollPrefs(
383    user_prefs::PrefRegistrySyncable* registry) {
384  const std::vector<OverscrollPref>& overscroll_prefs = GetOverscrollPrefs();
385
386  for (size_t i = 0; i < overscroll_prefs.size(); ++i) {
387    registry->RegisterDoublePref(
388        overscroll_prefs[i].pref_name,
389        content::GetOverscrollConfig(overscroll_prefs[i].config),
390        user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
391  }
392}
393
394void GesturePrefsObserverFactoryAura::RegisterFlingCurveParameters(
395    user_prefs::PrefRegistrySyncable* registry) {
396  content::RendererPreferences def_prefs;
397
398  for (size_t i = 0; i < arraysize(kFlingTouchpadPrefs); i++)
399    registry->RegisterDoublePref(
400        kFlingTouchpadPrefs[i],
401        def_prefs.touchpad_fling_profile[i],
402        user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
403
404  for (size_t i = 0; i < arraysize(kFlingTouchscreenPrefs); i++)
405    registry->RegisterDoublePref(
406        kFlingTouchscreenPrefs[i],
407        def_prefs.touchscreen_fling_profile[i],
408        user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
409}
410
411void GesturePrefsObserverFactoryAura::RegisterImmersiveModePrefs(
412    user_prefs::PrefRegistrySyncable* registry) {
413#if defined(USE_ASH)
414  registry->RegisterIntegerPref(
415      prefs::kImmersiveModeRevealDelayMs,
416      GestureConfiguration::immersive_mode_reveal_delay_ms(),
417      user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
418  registry->RegisterIntegerPref(
419      prefs::kImmersiveModeRevealXThresholdPixels,
420      GestureConfiguration::immersive_mode_reveal_x_threshold_pixels(),
421      user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
422#endif  // USE_ASH
423}
424
425void GesturePrefsObserverFactoryAura::RegisterWorkspaceCyclerPrefs(
426    user_prefs::PrefRegistrySyncable* registry) {
427#if defined(USE_ASH)
428  const std::vector<WorkspaceCyclerPref>& cycler_prefs =
429      GetWorkspaceCyclerPrefs();
430  for (size_t i = 0; i < cycler_prefs.size(); ++i) {
431    WorkspaceCyclerConfiguration::Property property =
432        cycler_prefs[i].property;
433    if (WorkspaceCyclerConfiguration::IsListProperty(property)) {
434      registry->RegisterListPref(
435          cycler_prefs[i].pref_name,
436          WorkspaceCyclerConfiguration::GetListValue(property).DeepCopy(),
437          user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
438    } else {
439      registry->RegisterDoublePref(
440          cycler_prefs[i].pref_name,
441          WorkspaceCyclerConfiguration::GetDouble(property),
442          user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
443    }
444  }
445#endif  // USE_ASH
446}
447
448void GesturePrefsObserverFactoryAura::RegisterUserPrefs(
449    user_prefs::PrefRegistrySyncable* registry) {
450  registry->RegisterDoublePref(
451      prefs::kFlingAccelerationCurveCoefficient0,
452      GestureConfiguration::fling_acceleration_curve_coefficients(0),
453      user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
454  registry->RegisterDoublePref(
455      prefs::kFlingAccelerationCurveCoefficient1,
456      GestureConfiguration::fling_acceleration_curve_coefficients(1),
457      user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
458  registry->RegisterDoublePref(
459      prefs::kFlingAccelerationCurveCoefficient2,
460      GestureConfiguration::fling_acceleration_curve_coefficients(2),
461      user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
462  registry->RegisterDoublePref(
463      prefs::kFlingAccelerationCurveCoefficient3,
464      GestureConfiguration::fling_acceleration_curve_coefficients(3),
465      user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
466  registry->RegisterIntegerPref(
467      prefs::kFlingMaxCancelToDownTimeInMs,
468      GestureConfiguration::fling_max_cancel_to_down_time_in_ms(),
469      user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
470  registry->RegisterIntegerPref(
471      prefs::kFlingMaxTapGapTimeInMs,
472      GestureConfiguration::fling_max_tap_gap_time_in_ms(),
473      user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
474  registry->RegisterIntegerPref(
475      prefs::kTabScrubActivationDelayInMS,
476      GestureConfiguration::tab_scrub_activation_delay_in_ms(),
477      user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
478  registry->RegisterDoublePref(
479      prefs::kFlingVelocityCap,
480      GestureConfiguration::fling_velocity_cap(),
481      user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
482  registry->RegisterDoublePref(
483      prefs::kLongPressTimeInSeconds,
484      GestureConfiguration::long_press_time_in_seconds(),
485      user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
486  registry->RegisterDoublePref(
487      prefs::kSemiLongPressTimeInSeconds,
488      GestureConfiguration::semi_long_press_time_in_seconds(),
489      user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
490  registry->RegisterDoublePref(
491      prefs::kMaxDistanceForTwoFingerTapInPixels,
492      GestureConfiguration::max_distance_for_two_finger_tap_in_pixels(),
493      user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
494  registry->RegisterDoublePref(
495      prefs::kMaxSecondsBetweenDoubleClick,
496      GestureConfiguration::max_seconds_between_double_click(),
497      user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
498  registry->RegisterDoublePref(
499      prefs::kMaxSeparationForGestureTouchesInPixels,
500      GestureConfiguration::max_separation_for_gesture_touches_in_pixels(),
501      user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
502  registry->RegisterDoublePref(
503      prefs::kMaxSwipeDeviationRatio,
504      GestureConfiguration::max_swipe_deviation_ratio(),
505      user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
506  registry->RegisterDoublePref(
507      prefs::kMaxTouchDownDurationInSecondsForClick,
508      GestureConfiguration::max_touch_down_duration_in_seconds_for_click(),
509      user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
510  registry->RegisterDoublePref(
511      prefs::kMaxTouchMoveInPixelsForClick,
512      GestureConfiguration::max_touch_move_in_pixels_for_click(),
513      user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
514  registry->RegisterDoublePref(
515      prefs::kMaxDistanceBetweenTapsForDoubleTap,
516      GestureConfiguration::max_distance_between_taps_for_double_tap(),
517      user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
518  registry->RegisterDoublePref(
519      prefs::kMinDistanceForPinchScrollInPixels,
520      GestureConfiguration::min_distance_for_pinch_scroll_in_pixels(),
521      user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
522  registry->RegisterDoublePref(
523      prefs::kMinFlickSpeedSquared,
524      GestureConfiguration::min_flick_speed_squared(),
525      user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
526  registry->RegisterDoublePref(
527      prefs::kMinPinchUpdateDistanceInPixels,
528      GestureConfiguration::min_pinch_update_distance_in_pixels(),
529      user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
530  registry->RegisterDoublePref(
531      prefs::kMinRailBreakVelocity,
532      GestureConfiguration::min_rail_break_velocity(),
533      user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
534  registry->RegisterDoublePref(
535      prefs::kMinScrollDeltaSquared,
536      GestureConfiguration::min_scroll_delta_squared(),
537      user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
538  registry->RegisterDoublePref(
539      prefs::kMinSwipeSpeed,
540      GestureConfiguration::min_swipe_speed(),
541      user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
542  registry->RegisterDoublePref(
543      prefs::kMinTouchDownDurationInSecondsForClick,
544      GestureConfiguration::min_touch_down_duration_in_seconds_for_click(),
545      user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
546  registry->RegisterIntegerPref(
547      prefs::kPointsBufferedForVelocity,
548      GestureConfiguration::points_buffered_for_velocity(),
549      user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
550  registry->RegisterDoublePref(
551      prefs::kRailBreakProportion,
552      GestureConfiguration::rail_break_proportion(),
553      user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
554  registry->RegisterDoublePref(
555      prefs::kRailStartProportion,
556      GestureConfiguration::rail_start_proportion(),
557      user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
558
559  // Register for migration.
560  registry->RegisterDoublePref(
561      kTouchScreenFlingAccelerationAdjustment,
562      0.0,
563      user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
564
565  RegisterOverscrollPrefs(registry);
566  RegisterFlingCurveParameters(registry);
567  RegisterImmersiveModePrefs(registry);
568  RegisterWorkspaceCyclerPrefs(registry);
569}
570
571bool GesturePrefsObserverFactoryAura::ServiceIsCreatedWithProfile() const {
572  // Create the observer as soon as the profile is created.
573  return true;
574}
575
576content::BrowserContext*
577GesturePrefsObserverFactoryAura::GetBrowserContextToUse(
578    content::BrowserContext* context) const {
579  // Use same gesture preferences on incognito windows.
580  return chrome::GetBrowserContextRedirectedInIncognito(context);
581}
582
583bool GesturePrefsObserverFactoryAura::ServiceIsNULLWhileTesting() const {
584  // Some tests replace the PrefService of the TestingProfile after the
585  // GesturePrefsObserver has been created, which makes Shutdown()
586  // remove the registrar from a non-existent PrefService.
587  return true;
588}
589