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