// 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_CONTENT_SETTINGS_CONTENT_SETTINGS_BASE_PROVIDER_H_ #define CHROME_BROWSER_CONTENT_SETTINGS_CONTENT_SETTINGS_BASE_PROVIDER_H_ #pragma once #include <map> #include <string> #include <utility> #include "base/synchronization/lock.h" #include "chrome/browser/content_settings/content_settings_provider.h" namespace content_settings { typedef std::pair<ContentSettingsType, std::string> ContentSettingsTypeResourceIdentifierPair; typedef std::map<ContentSettingsTypeResourceIdentifierPair, ContentSetting> ResourceContentSettings; struct ExtendedContentSettings { ExtendedContentSettings(); ExtendedContentSettings(const ExtendedContentSettings& rhs); ~ExtendedContentSettings(); ContentSettings content_settings; ResourceContentSettings content_settings_for_resources; }; // Map for ContentSettings. typedef std::map<std::string, ExtendedContentSettings> HostContentSettings; // BaseProvider is the abstract base class for all content-settings-provider // classes. class BaseProvider : public ProviderInterface { public: // Maps CONTENT_SETTING_ASK for the CONTENT_SETTINGS_TYPE_PLUGINS to // CONTENT_SETTING_BLOCK if click-to-play is not enabled. static ContentSetting ClickToPlayFixup(ContentSettingsType content_type, ContentSetting setting); explicit BaseProvider(bool is_otr); virtual ~BaseProvider(); // Initializes the Provider. virtual void Init() = 0; // ProviderInterface Implementation virtual bool ContentSettingsTypeIsManaged( ContentSettingsType content_type) = 0; virtual ContentSetting GetContentSetting( const GURL& requesting_url, const GURL& embedding_url, ContentSettingsType content_type, const ResourceIdentifier& resource_identifier) const; virtual void SetContentSetting( const ContentSettingsPattern& requesting_pattern, const ContentSettingsPattern& embedding_pattern, ContentSettingsType content_type, const ResourceIdentifier& resource_identifier, ContentSetting content_setting) = 0; virtual void GetAllContentSettingsRules( ContentSettingsType content_type, const ResourceIdentifier& resource_identifier, Rules* content_setting_rules) const; virtual void ClearAllContentSettingsRules( ContentSettingsType content_type) = 0; virtual void ResetToDefaults() = 0; protected: // Returns true if the |content_type| requires a resource identifier. bool RequiresResourceIdentifier( ContentSettingsType content_type) const; // Returns true if the passed |settings| object contains only // CONTENT_SETTING_DEFAULT values. bool AllDefault(const ExtendedContentSettings& settings) const; void UpdateContentSettingsMap( const ContentSettingsPattern& requesting_pattern, const ContentSettingsPattern& embedding_pattern, ContentSettingsType content_type, const ResourceIdentifier& resource_identifier, ContentSetting content_setting); // TODO(markusheintz): LEGACY method. Will be removed in a future re-factoring // step. ContentSettings GetNonDefaultContentSettings(const GURL& url) const; // Accessors HostContentSettings* host_content_settings() { return &host_content_settings_; } HostContentSettings* incognito_settings() { return &incognito_settings_; } base::Lock& lock() const { return lock_; } bool is_incognito() const { return is_incognito_; } private: // Copies of the pref data, so that we can read it on threads other than the // UI thread. HostContentSettings host_content_settings_; // Whether this settings map is for an OTR session. bool is_incognito_; // Differences to the preference-stored host content settings for // incognito settings. HostContentSettings incognito_settings_; // Used around accesses to the content_settings_ object to guarantee // thread safety. mutable base::Lock lock_; }; } // namespace content_settings #endif // CHROME_BROWSER_CONTENT_SETTINGS_CONTENT_SETTINGS_BASE_PROVIDER_H_