1// Copyright (c) 2012 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/geolocation/chrome_geolocation_permission_context_factory.h"
6
7#include "chrome/browser/profiles/incognito_helpers.h"
8#include "chrome/browser/profiles/profile.h"
9#include "chrome/common/pref_names.h"
10#include "components/browser_context_keyed_service/browser_context_dependency_manager.h"
11#include "components/user_prefs/pref_registry_syncable.h"
12#if defined(OS_ANDROID)
13#include "chrome/browser/geolocation/chrome_geolocation_permission_context_android.h"
14#else
15#include "chrome/browser/geolocation/chrome_geolocation_permission_context.h"
16#endif
17
18namespace {
19
20class Service : public BrowserContextKeyedService {
21 public:
22  explicit Service(Profile* profile) {
23#if defined(OS_ANDROID)
24    context_ = new ChromeGeolocationPermissionContextAndroid(profile);
25#else
26    context_ = new ChromeGeolocationPermissionContext(profile);
27#endif
28  }
29
30  ChromeGeolocationPermissionContext* context() {
31    return context_.get();
32  }
33
34  virtual void Shutdown() OVERRIDE {
35    context()->ShutdownOnUIThread();
36  }
37
38 private:
39  scoped_refptr<ChromeGeolocationPermissionContext> context_;
40
41  DISALLOW_COPY_AND_ASSIGN(Service);
42};
43
44}  // namespace
45
46// static
47ChromeGeolocationPermissionContext*
48ChromeGeolocationPermissionContextFactory::GetForProfile(Profile* profile) {
49  return static_cast<Service*>(
50      GetInstance()->GetServiceForBrowserContext(profile, true))->context();
51}
52
53// static
54ChromeGeolocationPermissionContextFactory*
55ChromeGeolocationPermissionContextFactory::GetInstance() {
56  return Singleton<ChromeGeolocationPermissionContextFactory>::get();
57}
58
59ChromeGeolocationPermissionContextFactory::
60ChromeGeolocationPermissionContextFactory()
61    : BrowserContextKeyedServiceFactory(
62          "ChromeGeolocationPermissionContext",
63          BrowserContextDependencyManager::GetInstance()) {
64}
65
66ChromeGeolocationPermissionContextFactory::
67~ChromeGeolocationPermissionContextFactory() {
68}
69
70BrowserContextKeyedService*
71ChromeGeolocationPermissionContextFactory::BuildServiceInstanceFor(
72    content::BrowserContext* profile) const {
73  return new Service(static_cast<Profile*>(profile));
74}
75
76void ChromeGeolocationPermissionContextFactory::RegisterProfilePrefs(
77    user_prefs::PrefRegistrySyncable* registry) {
78#if defined(OS_ANDROID)
79  registry->RegisterBooleanPref(
80      prefs::kGeolocationEnabled,
81      true,
82      user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
83#endif
84}
85
86content::BrowserContext*
87ChromeGeolocationPermissionContextFactory::GetBrowserContextToUse(
88    content::BrowserContext* context) const {
89  return chrome::GetBrowserContextOwnInstanceInIncognito(context);
90}
91