gesture_prefs_observer_factory_aura.cc revision 558790d6acca3451cf3a6b497803a5f07d0bec58
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  registrar_.Init(prefs);
155  registrar_.RemoveAll();
156  base::Closure callback = base::Bind(&GesturePrefsObserver::Update,
157                                      base::Unretained(this));
158
159  base::Closure notify_callback = base::Bind(&GesturePrefsObserver::Notify,
160                                             base::Unretained(this));
161
162  for (size_t i = 0; i < arraysize(kPrefsToObserve); ++i)
163    registrar_.Add(kPrefsToObserve[i], callback);
164
165  const std::vector<OverscrollPref>& overscroll_prefs = GetOverscrollPrefs();
166  for (size_t i = 0; i < overscroll_prefs.size(); ++i)
167    registrar_.Add(overscroll_prefs[i].pref_name, callback);
168
169  for (size_t i = 0; i < arraysize(kFlingTouchpadPrefs); ++i)
170    registrar_.Add(kFlingTouchpadPrefs[i], notify_callback);
171  for (size_t i = 0; i < arraysize(kFlingTouchscreenPrefs); ++i)
172    registrar_.Add(kFlingTouchscreenPrefs[i], notify_callback);
173
174#if defined(USE_ASH)
175  for (size_t i = 0; i < arraysize(kImmersiveModePrefs); ++i)
176    registrar_.Add(kImmersiveModePrefs[i], callback);
177#endif  // USE_ASH
178  Update();
179}
180
181GesturePrefsObserver::~GesturePrefsObserver() {}
182
183void GesturePrefsObserver::Shutdown() {
184  registrar_.RemoveAll();
185}
186
187void GesturePrefsObserver::Update() {
188  GestureConfiguration::set_fling_acceleration_curve_coefficients(0,
189      prefs_->GetDouble(prefs::kFlingAccelerationCurveCoefficient0));
190  GestureConfiguration::set_fling_acceleration_curve_coefficients(1,
191      prefs_->GetDouble(prefs::kFlingAccelerationCurveCoefficient1));
192  GestureConfiguration::set_fling_acceleration_curve_coefficients(2,
193      prefs_->GetDouble(prefs::kFlingAccelerationCurveCoefficient2));
194  GestureConfiguration::set_fling_acceleration_curve_coefficients(3,
195      prefs_->GetDouble(prefs::kFlingAccelerationCurveCoefficient3));
196  GestureConfiguration::set_fling_max_cancel_to_down_time_in_ms(
197      prefs_->GetInteger(prefs::kFlingMaxCancelToDownTimeInMs));
198  GestureConfiguration::set_fling_max_tap_gap_time_in_ms(
199      prefs_->GetInteger(prefs::kFlingMaxTapGapTimeInMs));
200  GestureConfiguration::set_tab_scrub_activation_delay_in_ms(
201      prefs_->GetInteger(prefs::kTabScrubActivationDelayInMS));
202  GestureConfiguration::set_fling_velocity_cap(
203      prefs_->GetDouble(prefs::kFlingVelocityCap));
204  GestureConfiguration::set_long_press_time_in_seconds(
205      prefs_->GetDouble(
206          prefs::kLongPressTimeInSeconds));
207  GestureConfiguration::set_semi_long_press_time_in_seconds(
208      prefs_->GetDouble(
209          prefs::kSemiLongPressTimeInSeconds));
210  GestureConfiguration::set_max_distance_for_two_finger_tap_in_pixels(
211      prefs_->GetDouble(
212          prefs::kMaxDistanceForTwoFingerTapInPixels));
213  GestureConfiguration::set_max_seconds_between_double_click(
214      prefs_->GetDouble(
215          prefs::kMaxSecondsBetweenDoubleClick));
216  GestureConfiguration::set_max_separation_for_gesture_touches_in_pixels(
217      prefs_->GetDouble(
218          prefs::kMaxSeparationForGestureTouchesInPixels));
219  GestureConfiguration::set_max_swipe_deviation_ratio(
220      prefs_->GetDouble(
221          prefs::kMaxSwipeDeviationRatio));
222  GestureConfiguration::set_max_touch_down_duration_in_seconds_for_click(
223      prefs_->GetDouble(
224          prefs::kMaxTouchDownDurationInSecondsForClick));
225  GestureConfiguration::set_max_touch_move_in_pixels_for_click(
226      prefs_->GetDouble(
227          prefs::kMaxTouchMoveInPixelsForClick));
228  GestureConfiguration::set_max_distance_between_taps_for_double_tap(
229      prefs_->GetDouble(
230          prefs::kMaxDistanceBetweenTapsForDoubleTap));
231  GestureConfiguration::set_min_distance_for_pinch_scroll_in_pixels(
232      prefs_->GetDouble(
233          prefs::kMinDistanceForPinchScrollInPixels));
234  GestureConfiguration::set_min_flick_speed_squared(
235      prefs_->GetDouble(
236          prefs::kMinFlickSpeedSquared));
237  GestureConfiguration::set_min_pinch_update_distance_in_pixels(
238      prefs_->GetDouble(
239          prefs::kMinPinchUpdateDistanceInPixels));
240  GestureConfiguration::set_min_rail_break_velocity(
241      prefs_->GetDouble(
242          prefs::kMinRailBreakVelocity));
243  GestureConfiguration::set_min_scroll_delta_squared(
244      prefs_->GetDouble(
245          prefs::kMinScrollDeltaSquared));
246  GestureConfiguration::set_min_swipe_speed(
247      prefs_->GetDouble(
248          prefs::kMinSwipeSpeed));
249  GestureConfiguration::set_min_touch_down_duration_in_seconds_for_click(
250      prefs_->GetDouble(
251          prefs::kMinTouchDownDurationInSecondsForClick));
252  GestureConfiguration::set_points_buffered_for_velocity(
253      prefs_->GetInteger(
254          prefs::kPointsBufferedForVelocity));
255  GestureConfiguration::set_rail_break_proportion(
256      prefs_->GetDouble(
257          prefs::kRailBreakProportion));
258  GestureConfiguration::set_rail_start_proportion(
259      prefs_->GetDouble(
260          prefs::kRailStartProportion));
261  GestureConfiguration::set_scroll_prediction_seconds(
262      prefs_->GetDouble(prefs::kScrollPredictionSeconds));
263
264  UpdateOverscrollPrefs();
265  UpdateImmersiveModePrefs();
266}
267
268void GesturePrefsObserver::UpdateOverscrollPrefs() {
269  const std::vector<OverscrollPref>& overscroll_prefs = GetOverscrollPrefs();
270  for (size_t i = 0; i < overscroll_prefs.size(); ++i) {
271    content::SetOverscrollConfig(overscroll_prefs[i].config,
272        static_cast<float>(prefs_->GetDouble(overscroll_prefs[i].pref_name)));
273  }
274}
275
276void GesturePrefsObserver::UpdateImmersiveModePrefs() {
277#if defined(USE_ASH)
278  ImmersiveFullscreenConfiguration::set_immersive_mode_reveal_delay_ms(
279      prefs_->GetInteger(prefs::kImmersiveModeRevealDelayMs));
280  ImmersiveFullscreenConfiguration::
281      set_immersive_mode_reveal_x_threshold_pixels(
282          prefs_->GetInteger(prefs::kImmersiveModeRevealXThresholdPixels));
283#endif  // USE_ASH
284}
285
286void GesturePrefsObserver::Notify() {
287  // Must do a notify to distribute the changes to all renderers.
288  content::NotificationService* service =
289      content::NotificationService::current();
290  service->Notify(chrome::NOTIFICATION_BROWSER_FLING_CURVE_PARAMETERS_CHANGED,
291                  content::Source<GesturePrefsObserver>(this),
292                  content::NotificationService::NoDetails());
293}
294
295}  // namespace
296
297// static
298GesturePrefsObserverFactoryAura*
299GesturePrefsObserverFactoryAura::GetInstance() {
300  return Singleton<GesturePrefsObserverFactoryAura>::get();
301}
302
303GesturePrefsObserverFactoryAura::GesturePrefsObserverFactoryAura()
304    : BrowserContextKeyedServiceFactory(
305        "GesturePrefsObserverAura",
306        BrowserContextDependencyManager::GetInstance()) {}
307
308GesturePrefsObserverFactoryAura::~GesturePrefsObserverFactoryAura() {}
309
310BrowserContextKeyedService*
311GesturePrefsObserverFactoryAura::BuildServiceInstanceFor(
312    content::BrowserContext* profile) const {
313  return new GesturePrefsObserver(static_cast<Profile*>(profile)->GetPrefs());
314}
315
316void GesturePrefsObserverFactoryAura::RegisterOverscrollPrefs(
317    user_prefs::PrefRegistrySyncable* registry) {
318  const std::vector<OverscrollPref>& overscroll_prefs = GetOverscrollPrefs();
319
320  for (size_t i = 0; i < overscroll_prefs.size(); ++i) {
321    registry->RegisterDoublePref(
322        overscroll_prefs[i].pref_name,
323        content::GetOverscrollConfig(overscroll_prefs[i].config),
324        user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
325  }
326}
327
328void GesturePrefsObserverFactoryAura::RegisterFlingCurveParameters(
329    user_prefs::PrefRegistrySyncable* registry) {
330  content::RendererPreferences def_prefs;
331
332  for (size_t i = 0; i < arraysize(kFlingTouchpadPrefs); i++)
333    registry->RegisterDoublePref(
334        kFlingTouchpadPrefs[i],
335        def_prefs.touchpad_fling_profile[i],
336        user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
337
338  for (size_t i = 0; i < arraysize(kFlingTouchscreenPrefs); i++)
339    registry->RegisterDoublePref(
340        kFlingTouchscreenPrefs[i],
341        def_prefs.touchscreen_fling_profile[i],
342        user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
343}
344
345void GesturePrefsObserverFactoryAura::RegisterImmersiveModePrefs(
346    user_prefs::PrefRegistrySyncable* registry) {
347#if defined(USE_ASH)
348  registry->RegisterIntegerPref(
349      prefs::kImmersiveModeRevealDelayMs,
350      ImmersiveFullscreenConfiguration::immersive_mode_reveal_delay_ms(),
351      user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
352  registry->RegisterIntegerPref(
353      prefs::kImmersiveModeRevealXThresholdPixels,
354      ImmersiveFullscreenConfiguration::
355          immersive_mode_reveal_x_threshold_pixels(),
356      user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
357#endif  // USE_ASH
358}
359
360void GesturePrefsObserverFactoryAura::RegisterProfilePrefs(
361    user_prefs::PrefRegistrySyncable* registry) {
362  registry->RegisterDoublePref(
363      prefs::kFlingAccelerationCurveCoefficient0,
364      GestureConfiguration::fling_acceleration_curve_coefficients(0),
365      user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
366  registry->RegisterDoublePref(
367      prefs::kFlingAccelerationCurveCoefficient1,
368      GestureConfiguration::fling_acceleration_curve_coefficients(1),
369      user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
370  registry->RegisterDoublePref(
371      prefs::kFlingAccelerationCurveCoefficient2,
372      GestureConfiguration::fling_acceleration_curve_coefficients(2),
373      user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
374  registry->RegisterDoublePref(
375      prefs::kFlingAccelerationCurveCoefficient3,
376      GestureConfiguration::fling_acceleration_curve_coefficients(3),
377      user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
378  registry->RegisterIntegerPref(
379      prefs::kFlingMaxCancelToDownTimeInMs,
380      GestureConfiguration::fling_max_cancel_to_down_time_in_ms(),
381      user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
382  registry->RegisterIntegerPref(
383      prefs::kFlingMaxTapGapTimeInMs,
384      GestureConfiguration::fling_max_tap_gap_time_in_ms(),
385      user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
386  registry->RegisterIntegerPref(
387      prefs::kTabScrubActivationDelayInMS,
388      GestureConfiguration::tab_scrub_activation_delay_in_ms(),
389      user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
390  registry->RegisterDoublePref(
391      prefs::kFlingVelocityCap,
392      GestureConfiguration::fling_velocity_cap(),
393      user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
394  registry->RegisterDoublePref(
395      prefs::kLongPressTimeInSeconds,
396      GestureConfiguration::long_press_time_in_seconds(),
397      user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
398  registry->RegisterDoublePref(
399      prefs::kSemiLongPressTimeInSeconds,
400      GestureConfiguration::semi_long_press_time_in_seconds(),
401      user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
402  registry->RegisterDoublePref(
403      prefs::kMaxDistanceForTwoFingerTapInPixels,
404      GestureConfiguration::max_distance_for_two_finger_tap_in_pixels(),
405      user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
406  registry->RegisterDoublePref(
407      prefs::kMaxSecondsBetweenDoubleClick,
408      GestureConfiguration::max_seconds_between_double_click(),
409      user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
410  registry->RegisterDoublePref(
411      prefs::kMaxSeparationForGestureTouchesInPixels,
412      GestureConfiguration::max_separation_for_gesture_touches_in_pixels(),
413      user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
414  registry->RegisterDoublePref(
415      prefs::kMaxSwipeDeviationRatio,
416      GestureConfiguration::max_swipe_deviation_ratio(),
417      user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
418  registry->RegisterDoublePref(
419      prefs::kMaxTouchDownDurationInSecondsForClick,
420      GestureConfiguration::max_touch_down_duration_in_seconds_for_click(),
421      user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
422  registry->RegisterDoublePref(
423      prefs::kMaxTouchMoveInPixelsForClick,
424      GestureConfiguration::max_touch_move_in_pixels_for_click(),
425      user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
426  registry->RegisterDoublePref(
427      prefs::kMaxDistanceBetweenTapsForDoubleTap,
428      GestureConfiguration::max_distance_between_taps_for_double_tap(),
429      user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
430  registry->RegisterDoublePref(
431      prefs::kMinDistanceForPinchScrollInPixels,
432      GestureConfiguration::min_distance_for_pinch_scroll_in_pixels(),
433      user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
434  registry->RegisterDoublePref(
435      prefs::kMinFlickSpeedSquared,
436      GestureConfiguration::min_flick_speed_squared(),
437      user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
438  registry->RegisterDoublePref(
439      prefs::kMinPinchUpdateDistanceInPixels,
440      GestureConfiguration::min_pinch_update_distance_in_pixels(),
441      user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
442  registry->RegisterDoublePref(
443      prefs::kMinRailBreakVelocity,
444      GestureConfiguration::min_rail_break_velocity(),
445      user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
446  registry->RegisterDoublePref(
447      prefs::kMinScrollDeltaSquared,
448      GestureConfiguration::min_scroll_delta_squared(),
449      user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
450  registry->RegisterDoublePref(
451      prefs::kMinSwipeSpeed,
452      GestureConfiguration::min_swipe_speed(),
453      user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
454  registry->RegisterDoublePref(
455      prefs::kMinTouchDownDurationInSecondsForClick,
456      GestureConfiguration::min_touch_down_duration_in_seconds_for_click(),
457      user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
458  registry->RegisterIntegerPref(
459      prefs::kPointsBufferedForVelocity,
460      GestureConfiguration::points_buffered_for_velocity(),
461      user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
462  registry->RegisterDoublePref(
463      prefs::kRailBreakProportion,
464      GestureConfiguration::rail_break_proportion(),
465      user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
466  registry->RegisterDoublePref(
467      prefs::kRailStartProportion,
468      GestureConfiguration::rail_start_proportion(),
469      user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
470  registry->RegisterDoublePref(
471      prefs::kScrollPredictionSeconds,
472      GestureConfiguration::scroll_prediction_seconds(),
473      user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
474
475  // Register for migration.
476  registry->RegisterDoublePref(
477      kTouchScreenFlingAccelerationAdjustment,
478      0.0,
479      user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
480
481  RegisterOverscrollPrefs(registry);
482  RegisterFlingCurveParameters(registry);
483  RegisterImmersiveModePrefs(registry);
484}
485
486bool
487GesturePrefsObserverFactoryAura::ServiceIsCreatedWithBrowserContext() const {
488  // Create the observer as soon as the profile is created.
489  return true;
490}
491
492content::BrowserContext*
493GesturePrefsObserverFactoryAura::GetBrowserContextToUse(
494    content::BrowserContext* context) const {
495  // Use same gesture preferences on incognito windows.
496  return chrome::GetBrowserContextRedirectedInIncognito(context);
497}
498
499bool GesturePrefsObserverFactoryAura::ServiceIsNULLWhileTesting() const {
500  // Some tests replace the PrefService of the TestingProfile after the
501  // GesturePrefsObserver has been created, which makes Shutdown()
502  // remove the registrar from a non-existent PrefService.
503  return true;
504}
505