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