blob: f9a7765713735f042befac99486bce94d2491bf5 [file] [log] [blame]
// Copyright (c) 2011 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CHROME_BROWSER_EXTENSIONS_EXTENSION_CONTENT_SETTINGS_STORE_H_
#define CHROME_BROWSER_EXTENSIONS_EXTENSION_CONTENT_SETTINGS_STORE_H_
#include <list>
#include <map>
#include <string>
#include "base/observer_list.h"
#include "base/synchronization/lock.h"
#include "base/threading/thread_checker.h"
#include "base/time.h"
#include "base/tuple.h"
#include "chrome/browser/content_settings/content_settings_pattern.h"
#include "chrome/browser/content_settings/content_settings_provider.h"
#include "chrome/browser/extensions/extension_prefs_scope.h"
#include "chrome/common/content_settings.h"
#include "googleurl/src/gurl.h"
namespace base {
class ListValue;
}
// This class is the backend for extension-defined content settings. It is used
// by the content_settings::ExtensionProvider to integrate its settings into the
// HostContentSettingsMap and by the content settings extension API to provide
// extensions with access to content settings.
class ExtensionContentSettingsStore
: public base::RefCountedThreadSafe<ExtensionContentSettingsStore> {
public:
class Observer {
public:
virtual ~Observer() {}
// Called when a content setting changes in the
// ExtensionContentSettingsStore.
virtual void OnContentSettingChanged(
const std::string& extension_id,
bool incognito) = 0;
};
ExtensionContentSettingsStore();
// //////////////////////////////////////////////////////////////////////////
// Sets the content |setting| for |pattern| of extension |ext_id|. The
// |incognito| flag allow to set whether the provided setting is for
// incognito mode only.
// Precondition: the extension must be registered.
// This method should only be called on the UI thread.
void SetExtensionContentSetting(
const std::string& ext_id,
const ContentSettingsPattern& embedded_pattern,
const ContentSettingsPattern& top_level_pattern,
ContentSettingsType type,
const content_settings::ResourceIdentifier& identifier,
ContentSetting setting,
ExtensionPrefsScope scope);
ContentSetting GetEffectiveContentSetting(
const GURL& embedded_url,
const GURL& top_level_url,
ContentSettingsType type,
const content_settings::ResourceIdentifier& identifier,
bool incognito) const;
// Clears all contents settings set by the extension |ext_id|.
void ClearContentSettingsForExtension(const std::string& ext_id,
ExtensionPrefsScope scope);
// Returns a list of all content setting rules for the content type |type|
// and the resource identifier (if specified and the content type uses
// resource identifiers).
void GetContentSettingsForContentType(
ContentSettingsType type,
const content_settings::ResourceIdentifier& identifier,
bool incognito,
content_settings::ProviderInterface::Rules* rules) const;
// Serializes all content settings set by the extension with ID |extension_id|
// and returns them as a ListValue. The caller takes ownership of the returned
// value.
base::ListValue* GetSettingsForExtension(const std::string& extension_id,
ExtensionPrefsScope scope) const;
// Deserializes content settings rules from |list| and applies them as set by
// the extension with ID |extension_id|.
void SetExtensionContentSettingsFromList(const std::string& extension_id,
const base::ListValue* list,
ExtensionPrefsScope scope);
// //////////////////////////////////////////////////////////////////////////
// Registers the time when an extension |ext_id| is installed.
void RegisterExtension(const std::string& ext_id,
const base::Time& install_time,
bool is_enabled);
// Deletes all entries related to extension |ext_id|.
void UnregisterExtension(const std::string& ext_id);
// Hides or makes the extension content settings of the specified extension
// visible.
void SetExtensionState(const std::string& ext_id, bool is_enabled);
// Adds |observer|. This method should only be called on the UI thread.
void AddObserver(Observer* observer);
// Remove |observer|. This method should only be called on the UI thread.
void RemoveObserver(Observer* observer);
private:
friend class base::RefCountedThreadSafe<ExtensionContentSettingsStore>;
struct ExtensionEntry;
struct ContentSettingSpec {
ContentSettingSpec(const ContentSettingsPattern& primary_pattern,
const ContentSettingsPattern& secondary_pattern,
ContentSettingsType type,
const content_settings::ResourceIdentifier& identifier,
ContentSetting setting);
ContentSettingsPattern primary_pattern;
ContentSettingsPattern secondary_pattern;
ContentSettingsType content_type;
content_settings::ResourceIdentifier resource_identifier;
ContentSetting setting;
};
typedef std::map<std::string, ExtensionEntry*> ExtensionEntryMap;
typedef std::list<ContentSettingSpec> ContentSettingSpecList;
virtual ~ExtensionContentSettingsStore();
ContentSetting GetContentSettingFromSpecList(
const GURL& embedded_url,
const GURL& top_level_url,
ContentSettingsType type,
const content_settings::ResourceIdentifier& identifier,
const ContentSettingSpecList& setting_spec_list) const;
ContentSettingSpecList* GetContentSettingSpecList(
const std::string& ext_id,
ExtensionPrefsScope scope);
const ContentSettingSpecList* GetContentSettingSpecList(
const std::string& ext_id,
ExtensionPrefsScope scope) const;
// Adds all content setting rules for |type| and |identifier| found in
// |setting_spec_list| to |rules|.
static void AddRules(ContentSettingsType type,
const content_settings::ResourceIdentifier& identifier,
const ContentSettingSpecList* setting_spec_list,
content_settings::ProviderInterface::Rules* rules);
void NotifyOfContentSettingChanged(const std::string& extension_id,
bool incognito);
bool OnCorrectThread();
ExtensionEntryMap entries_;
ObserverList<Observer, false> observers_;
mutable base::Lock lock_;
DISALLOW_COPY_AND_ASSIGN(ExtensionContentSettingsStore);
};
#endif // CHROME_BROWSER_EXTENSIONS_EXTENSION_CONTENT_SETTINGS_STORE_H_