Home | History | Annotate | Download | only in ui
      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 
     30 using ui::GestureConfiguration;
     31 
     32 namespace {
     33 
     34 // TODO(rjkroege): Remove this deprecated pref in M29. http://crbug.com/160243.
     35 const char kTouchScreenFlingAccelerationAdjustment[] =
     36     "gesture.touchscreen_fling_acceleration_adjustment";
     37 
     38 struct OverscrollPref {
     39   const char* pref_name;
     40   content::OverscrollConfig config;
     41 };
     42 
     43 const 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)
     68 const char* kImmersiveModePrefs[] = {
     69   prefs::kImmersiveModeRevealDelayMs,
     70   prefs::kImmersiveModeRevealXThresholdPixels,
     71 };
     72 #endif  // USE_ASH
     73 
     74 // This class manages gesture configuration preferences.
     75 class 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
    108 const 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 
    137 const char* kFlingTouchpadPrefs[] = {
    138   prefs::kFlingCurveTouchpadAlpha,
    139   prefs::kFlingCurveTouchpadBeta,
    140   prefs::kFlingCurveTouchpadGamma
    141 };
    142 
    143 const char* kFlingTouchscreenPrefs[] = {
    144   prefs::kFlingCurveTouchscreenAlpha,
    145   prefs::kFlingCurveTouchscreenBeta,
    146   prefs::kFlingCurveTouchscreenGamma,
    147 };
    148 
    149 GesturePrefsObserver::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 
    206 GesturePrefsObserver::~GesturePrefsObserver() {}
    207 
    208 void GesturePrefsObserver::Shutdown() {
    209   registrar_.RemoveAll();
    210 }
    211 
    212 void 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 
    293 void 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 
    301 void 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 
    311 void 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
    323 GesturePrefsObserverFactoryAura*
    324 GesturePrefsObserverFactoryAura::GetInstance() {
    325   return Singleton<GesturePrefsObserverFactoryAura>::get();
    326 }
    327 
    328 GesturePrefsObserverFactoryAura::GesturePrefsObserverFactoryAura()
    329     : BrowserContextKeyedServiceFactory(
    330         "GesturePrefsObserverAura",
    331         BrowserContextDependencyManager::GetInstance()) {}
    332 
    333 GesturePrefsObserverFactoryAura::~GesturePrefsObserverFactoryAura() {}
    334 
    335 BrowserContextKeyedService*
    336 GesturePrefsObserverFactoryAura::BuildServiceInstanceFor(
    337     content::BrowserContext* profile) const {
    338   return new GesturePrefsObserver(static_cast<Profile*>(profile)->GetPrefs());
    339 }
    340 
    341 void 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 
    353 void 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 
    370 void 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 
    385 void 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 
    517 bool
    518 GesturePrefsObserverFactoryAura::ServiceIsCreatedWithBrowserContext() const {
    519   // Create the observer as soon as the profile is created.
    520   return true;
    521 }
    522 
    523 content::BrowserContext*
    524 GesturePrefsObserverFactoryAura::GetBrowserContextToUse(
    525     content::BrowserContext* context) const {
    526   // Use same gesture preferences on incognito windows.
    527   return chrome::GetBrowserContextRedirectedInIncognito(context);
    528 }
    529 
    530 bool 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