Home | History | Annotate | Download | only in geolocation
      1 // Copyright (c) 2011 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 // Maps [requesting_origin, embedder] to content settings.  Written on the UI
      6 // thread and read on any thread.  One instance per profile. This is based on
      7 // HostContentSettingsMap but differs significantly in two aspects:
      8 // - It maps [requesting_origin.GetOrigin(), embedder.GetOrigin()] => setting
      9 //   rather than host => setting.
     10 // - It manages only Geolocation.
     11 
     12 #ifndef CHROME_BROWSER_GEOLOCATION_GEOLOCATION_CONTENT_SETTINGS_MAP_H_
     13 #define CHROME_BROWSER_GEOLOCATION_GEOLOCATION_CONTENT_SETTINGS_MAP_H_
     14 #pragma once
     15 
     16 #include <map>
     17 
     18 #include "base/basictypes.h"
     19 #include "base/memory/ref_counted.h"
     20 #include "chrome/browser/prefs/pref_change_registrar.h"
     21 #include "chrome/common/content_settings.h"
     22 #include "content/common/notification_observer.h"
     23 #include "content/common/notification_registrar.h"
     24 #include "googleurl/src/gurl.h"
     25 
     26 class ContentSettingsDetails;
     27 class DictionaryValue;
     28 class PrefService;
     29 class Profile;
     30 
     31 class GeolocationContentSettingsMap
     32     : public base::RefCountedThreadSafe<GeolocationContentSettingsMap>,
     33       public NotificationObserver {
     34  public:
     35   typedef std::map<GURL, ContentSetting> OneOriginSettings;
     36   typedef std::map<GURL, OneOriginSettings> AllOriginsSettings;
     37 
     38   explicit GeolocationContentSettingsMap(Profile* profile);
     39 
     40   virtual ~GeolocationContentSettingsMap();
     41 
     42   static void RegisterUserPrefs(PrefService* prefs);
     43 
     44   // Returns the default setting.
     45   //
     46   // This should only be called on the UI thread.
     47   ContentSetting GetDefaultContentSetting() const;
     48 
     49   // Returns true if the content setting is managed (set by a policy).
     50   bool IsDefaultContentSettingManaged() const;
     51 
     52   // Returns a single ContentSetting which applies to the given |requesting_url|
     53   // when embedded in a top-level page from |embedding_url|.  To determine the
     54   // setting for a top-level page, as opposed to a frame embedded in a page,
     55   // pass the page's URL for both arguments.
     56   //
     57   // This should only be called on the UI thread.
     58   // Both arguments should be valid GURLs.
     59   ContentSetting GetContentSetting(const GURL& requesting_url,
     60                                    const GURL& embedding_url) const;
     61 
     62   // Returns the settings for all origins with any non-default settings.
     63   //
     64   // This should only be called on the UI thread.
     65   AllOriginsSettings GetAllOriginsSettings() const;
     66 
     67   // Sets the default setting.
     68   //
     69   // This should only be called on the UI thread.
     70   void SetDefaultContentSetting(ContentSetting setting);
     71 
     72   // Sets the content setting for a particular (requesting origin, embedding
     73   // origin) pair.  If the embedding origin is the same as the requesting
     74   // origin, this represents the setting used when the requesting origin is
     75   // itself the top-level page.  If |embedder| is the empty GURL, |setting|
     76   // becomes the default setting for the requesting origin when embedded on any
     77   // page that does not have an explicit setting.  Passing
     78   // CONTENT_SETTING_DEFAULT for |setting| effectively removes that setting and
     79   // allows future requests to return the all-embedders or global defaults (as
     80   // applicable).
     81   //
     82   // This should only be called on the UI thread.  |requesting_url| should be
     83   // a valid GURL, and |embedding_url| should be valid or empty.
     84   void SetContentSetting(const GURL& requesting_url,
     85                          const GURL& embedding_url,
     86                          ContentSetting setting);
     87 
     88   // Resets all settings.
     89   //
     90   // This should only be called on the UI thread.
     91   void ResetToDefault();
     92 
     93   // NotificationObserver implementation.
     94   virtual void Observe(NotificationType type,
     95                        const NotificationSource& source,
     96                        const NotificationDetails& details);
     97 
     98  private:
     99   friend class base::RefCountedThreadSafe<GeolocationContentSettingsMap>;
    100 
    101   // The default setting.
    102   static const ContentSetting kDefaultSetting;
    103 
    104   // Sends a CONTENT_SETTINGS_CHANGED notification.
    105   void NotifyObservers(const ContentSettingsDetails& details);
    106 
    107   void UnregisterObservers();
    108 
    109   // Sets the fields of |one_origin_settings| based on the values in
    110   // |dictionary|.
    111   static void GetOneOriginSettingsFromDictionary(
    112       const DictionaryValue* dictionary,
    113       OneOriginSettings* one_origin_settings);
    114 
    115   // The profile we're associated with.
    116   Profile* profile_;
    117 
    118   // Registrar to register for PREF_CHANGED notifications.
    119   PrefChangeRegistrar prefs_registrar_;
    120   NotificationRegistrar notification_registrar_;
    121 
    122   DISALLOW_COPY_AND_ASSIGN(GeolocationContentSettingsMap);
    123 };
    124 
    125 #endif  // CHROME_BROWSER_GEOLOCATION_GEOLOCATION_CONTENT_SETTINGS_MAP_H_
    126