1ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved.
2c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Use of this source code is governed by a BSD-style license that can be
3c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// found in the LICENSE file.
4c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
5c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Maps [requesting_origin, embedder] to content settings.  Written on the UI
6c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// thread and read on any thread.  One instance per profile. This is based on
7c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// HostContentSettingsMap but differs significantly in two aspects:
8c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// - It maps [requesting_origin.GetOrigin(), embedder.GetOrigin()] => setting
9c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//   rather than host => setting.
10c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// - It manages only Geolocation.
11c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
12c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#ifndef CHROME_BROWSER_GEOLOCATION_GEOLOCATION_CONTENT_SETTINGS_MAP_H_
13c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#define CHROME_BROWSER_GEOLOCATION_GEOLOCATION_CONTENT_SETTINGS_MAP_H_
143345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#pragma once
15c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
16c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include <map>
17c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
18c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/basictypes.h"
19ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/memory/ref_counted.h"
2021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "chrome/browser/prefs/pref_change_registrar.h"
21c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/common/content_settings.h"
22ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "content/common/notification_observer.h"
23ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "content/common/notification_registrar.h"
24c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "googleurl/src/gurl.h"
25c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
2621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsenclass ContentSettingsDetails;
27c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass DictionaryValue;
28c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass PrefService;
29c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass Profile;
30c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
31c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass GeolocationContentSettingsMap
3221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    : public base::RefCountedThreadSafe<GeolocationContentSettingsMap>,
3321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen      public NotificationObserver {
34c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public:
35c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  typedef std::map<GURL, ContentSetting> OneOriginSettings;
36c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  typedef std::map<GURL, OneOriginSettings> AllOriginsSettings;
37c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
38c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  explicit GeolocationContentSettingsMap(Profile* profile);
39c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
4021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  virtual ~GeolocationContentSettingsMap();
4121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
42c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  static void RegisterUserPrefs(PrefService* prefs);
43c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
44c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Returns the default setting.
45c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  //
46c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // This should only be called on the UI thread.
47c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ContentSetting GetDefaultContentSetting() const;
48c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
4921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  // Returns true if the content setting is managed (set by a policy).
5021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  bool IsDefaultContentSettingManaged() const;
5121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
52c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Returns a single ContentSetting which applies to the given |requesting_url|
53c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // when embedded in a top-level page from |embedding_url|.  To determine the
54c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // setting for a top-level page, as opposed to a frame embedded in a page,
55c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // pass the page's URL for both arguments.
56c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  //
57c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // This should only be called on the UI thread.
58c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Both arguments should be valid GURLs.
59c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ContentSetting GetContentSetting(const GURL& requesting_url,
60c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                   const GURL& embedding_url) const;
61c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
62c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Returns the settings for all origins with any non-default settings.
63c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  //
64c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // This should only be called on the UI thread.
65c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  AllOriginsSettings GetAllOriginsSettings() const;
66c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
67c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Sets the default setting.
68c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  //
69c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // This should only be called on the UI thread.
70c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void SetDefaultContentSetting(ContentSetting setting);
71c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
72c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Sets the content setting for a particular (requesting origin, embedding
73c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // origin) pair.  If the embedding origin is the same as the requesting
74c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // origin, this represents the setting used when the requesting origin is
75c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // itself the top-level page.  If |embedder| is the empty GURL, |setting|
76c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // becomes the default setting for the requesting origin when embedded on any
77c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // page that does not have an explicit setting.  Passing
78c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // CONTENT_SETTING_DEFAULT for |setting| effectively removes that setting and
79c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // allows future requests to return the all-embedders or global defaults (as
80c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // applicable).
81c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  //
82c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // This should only be called on the UI thread.  |requesting_url| should be
83c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // a valid GURL, and |embedding_url| should be valid or empty.
84c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void SetContentSetting(const GURL& requesting_url,
85c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                         const GURL& embedding_url,
86c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                         ContentSetting setting);
87c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
88c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Resets all settings.
89c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  //
90c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // This should only be called on the UI thread.
91c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void ResetToDefault();
92c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
9321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  // NotificationObserver implementation.
9421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  virtual void Observe(NotificationType type,
9521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen                       const NotificationSource& source,
9621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen                       const NotificationDetails& details);
9721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
98c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch private:
99c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  friend class base::RefCountedThreadSafe<GeolocationContentSettingsMap>;
100c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
101c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // The default setting.
102c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  static const ContentSetting kDefaultSetting;
103c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
10421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  // Sends a CONTENT_SETTINGS_CHANGED notification.
10521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  void NotifyObservers(const ContentSettingsDetails& details);
10621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
10721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  void UnregisterObservers();
108c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
109c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Sets the fields of |one_origin_settings| based on the values in
110c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // |dictionary|.
111c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  static void GetOneOriginSettingsFromDictionary(
112c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      const DictionaryValue* dictionary,
113c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      OneOriginSettings* one_origin_settings);
114c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
115c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // The profile we're associated with.
116c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  Profile* profile_;
117c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
11821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  // Registrar to register for PREF_CHANGED notifications.
11921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  PrefChangeRegistrar prefs_registrar_;
12021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  NotificationRegistrar notification_registrar_;
12121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
122c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  DISALLOW_COPY_AND_ASSIGN(GeolocationContentSettingsMap);
123c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
124c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
125c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif  // CHROME_BROWSER_GEOLOCATION_GEOLOCATION_CONTENT_SETTINGS_MAP_H_
126