C++程序  |  111行  |  3.49 KB

// 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_NOTIFICATION_PROVIDER_H_
#define CHROME_BROWSER_CONTENT_SETTINGS_CONTENT_SETTINGS_NOTIFICATION_PROVIDER_H_

#include <string>
#include <vector>

#include "base/basictypes.h"
#include "base/memory/ref_counted.h"
#include "chrome/browser/content_settings/content_settings_provider.h"
#include "chrome/browser/prefs/pref_change_registrar.h"
#include "content/common/notification_observer.h"
#include "content/common/notification_registrar.h"

class GURL;
class PrefService;
class Profile;

namespace content_settings {

class NotificationProvider : public ProviderInterface,
                             public NotificationObserver {
 public:
  static void RegisterUserPrefs(PrefService* user_prefs);

  static ContentSettingsPattern ToContentSettingsPattern(const GURL& origin);

  static GURL ToGURL(const ContentSettingsPattern& pattern);

  explicit NotificationProvider(Profile* profile);

  virtual ~NotificationProvider();

  // ProviderInterface implementation
  virtual bool ContentSettingsTypeIsManaged(
      ContentSettingsType content_type);

  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_url_pattern,
      const ContentSettingsPattern& embedding_url_pattern,
      ContentSettingsType content_type,
      const ResourceIdentifier& resource_identifier,
      ContentSetting content_setting);

  virtual void GetAllContentSettingsRules(
      ContentSettingsType content_type,
      const ResourceIdentifier& resource_identifier,
      Rules* content_setting_rules) const;

  virtual void ClearAllContentSettingsRules(
      ContentSettingsType content_type);

  virtual void ResetToDefaults();

  // NotificationObserver implementation.
  virtual void Observe(NotificationType type,
                       const NotificationSource& source,
                       const NotificationDetails& details);
 private:
  void StartObserving();
  void StopObserving();

  void OnPrefsChanged(const std::string& pref_name);

  // Notifies the observers when permissions settings change.
  void NotifySettingsChange();

  // Returns all origins that explicitly have been allowed.
  std::vector<GURL> GetAllowedOrigins() const;

  // Returns all origins that explicitly have been denied.
  std::vector<GURL> GetBlockedOrigins() const;

  // Methods to setup and modify permission preferences.
  void GrantPermission(const GURL& origin);
  void DenyPermission(const GURL& origin);

  void PersistPermissionChange(const GURL& origin, bool is_allowed);

  ContentSetting GetContentSetting(const GURL& origin) const;

  // Removes an origin from the "explicitly allowed" set.
  void ResetAllowedOrigin(const GURL& origin);

  // Removes an origin from the "explicitly denied" set.
  void ResetBlockedOrigin(const GURL& origin);

  // Clears the sets of explicitly allowed and denied origins.
  void ResetAllOrigins();

  Profile* profile_;

  PrefChangeRegistrar prefs_registrar_;
  NotificationRegistrar notification_registrar_;

  DISALLOW_COPY_AND_ASSIGN(NotificationProvider);
};

}  // namespace content_settings

#endif  // CHROME_BROWSER_CONTENT_SETTINGS_CONTENT_SETTINGS_NOTIFICATION_PROVIDER_H_