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