| Index: chrome/browser/notifications/desktop_notification_service.cc
|
| diff --git a/chrome/browser/notifications/desktop_notification_service.cc b/chrome/browser/notifications/desktop_notification_service.cc
|
| index 53dce9d5fd6d98c8c7b14f4654567c16eb186a0b..bd46686e5511dca4bd41ad284523918a89032984 100644
|
| --- a/chrome/browser/notifications/desktop_notification_service.cc
|
| +++ b/chrome/browser/notifications/desktop_notification_service.cc
|
| @@ -7,6 +7,8 @@
|
| #include "base/metrics/histogram.h"
|
| #include "base/threading/thread.h"
|
| #include "base/utf_string_conversions.h"
|
| +#include "chrome/browser/content_settings/content_settings_details.h"
|
| +#include "chrome/browser/content_settings/content_settings_pattern.h"
|
| #include "chrome/browser/content_settings/content_settings_provider.h"
|
| #include "chrome/browser/content_settings/host_content_settings_map.h"
|
| #include "chrome/browser/extensions/extension_service.h"
|
| @@ -14,7 +16,6 @@
|
| #include "chrome/browser/notifications/notification.h"
|
| #include "chrome/browser/notifications/notification_object_proxy.h"
|
| #include "chrome/browser/notifications/notification_ui_manager.h"
|
| -#include "chrome/browser/notifications/notifications_prefs_cache.h"
|
| #include "chrome/browser/prefs/pref_service.h"
|
| #include "chrome/browser/prefs/scoped_user_pref_update.h"
|
| #include "chrome/browser/profiles/profile.h"
|
| @@ -45,45 +46,6 @@ using WebKit::WebTextDirection;
|
|
|
| const ContentSetting kDefaultSetting = CONTENT_SETTING_ASK;
|
|
|
| -namespace {
|
| -
|
| -typedef content_settings::ProviderInterface::Rules Rules;
|
| -
|
| -void GetOriginsWithSettingFromContentSettingsRules(
|
| - const Rules& content_setting_rules,
|
| - ContentSetting setting,
|
| - std::vector<GURL>* origins) {
|
| - origins->clear();
|
| -
|
| - for (Rules::const_iterator rule = content_setting_rules.begin();
|
| - rule != content_setting_rules.end();
|
| - ++rule) {
|
| - if (setting == rule->content_setting) {
|
| - std::string url_str = rule->primary_pattern.ToString();
|
| - if (!rule->primary_pattern.IsValid()) {
|
| - // TODO(markusheintz): This will be removed in one of the next
|
| - // refactoring steps as this entire function will disapear.
|
| - LOG(DFATAL) << "Ignoring invalid content settings pattern: "
|
| - << url_str;
|
| - } else if (url_str.find(ContentSettingsPattern::kDomainWildcard) == 0) {
|
| - // TODO(markusheintz): This must be changed once the UI code is
|
| - // refactored and content_settings patterns are fully supported for
|
| - // notifications settings.
|
| - LOG(DFATAL) << "Ignoring unsupported content settings pattern: "
|
| - << url_str << ". Content settings patterns other than "
|
| - << "hostnames (e.g. wildcard patterns) are not supported "
|
| - << "for notification content settings yet.";
|
| - } else {
|
| - origins->push_back(
|
| - content_settings::NotificationProvider::ToGURL(
|
| - rule->primary_pattern));
|
| - }
|
| - }
|
| - }
|
| -}
|
| -
|
| -} // namespace
|
| -
|
| // NotificationPermissionInfoBarDelegate --------------------------------------
|
|
|
| // The delegate for the infobar shown when an origin requests notification
|
| @@ -252,8 +214,6 @@ DesktopNotificationService::DesktopNotificationService(Profile* profile,
|
| NotificationUIManager* ui_manager)
|
| : profile_(profile),
|
| ui_manager_(ui_manager) {
|
| - prefs_registrar_.Init(profile_->GetPrefs());
|
| - InitPrefs();
|
| StartObserving();
|
| }
|
|
|
| @@ -261,114 +221,45 @@ DesktopNotificationService::~DesktopNotificationService() {
|
| StopObserving();
|
| }
|
|
|
| -void DesktopNotificationService::RegisterUserPrefs(PrefService* user_prefs) {
|
| - content_settings::NotificationProvider::RegisterUserPrefs(user_prefs);
|
| -}
|
| -
|
| -// Initialize the cache with the allowed and denied origins, or
|
| -// create the preferences if they don't exist yet.
|
| -void DesktopNotificationService::InitPrefs() {
|
| - provider_.reset(new content_settings::NotificationProvider(profile_));
|
| -
|
| - std::vector<GURL> allowed_origins;
|
| - std::vector<GURL> denied_origins;
|
| - ContentSetting default_content_setting = CONTENT_SETTING_DEFAULT;
|
| -
|
| - if (!profile_->IsOffTheRecord()) {
|
| - default_content_setting =
|
| - profile_->GetHostContentSettingsMap()->GetDefaultContentSetting(
|
| - CONTENT_SETTINGS_TYPE_NOTIFICATIONS);
|
| - allowed_origins = GetAllowedOrigins();
|
| - denied_origins = GetBlockedOrigins();
|
| - }
|
| -
|
| - prefs_cache_ = new NotificationsPrefsCache();
|
| - prefs_cache_->SetCacheDefaultContentSetting(default_content_setting);
|
| - prefs_cache_->SetCacheAllowedOrigins(allowed_origins);
|
| - prefs_cache_->SetCacheDeniedOrigins(denied_origins);
|
| - prefs_cache_->set_is_initialized(true);
|
| -}
|
| -
|
| void DesktopNotificationService::StartObserving() {
|
| if (!profile_->IsOffTheRecord()) {
|
| - prefs_registrar_.Add(prefs::kDesktopNotificationAllowedOrigins, this);
|
| - prefs_registrar_.Add(prefs::kDesktopNotificationDeniedOrigins, this);
|
| notification_registrar_.Add(this, chrome::NOTIFICATION_EXTENSION_UNLOADED,
|
| NotificationService::AllSources());
|
| - notification_registrar_.Add(
|
| - this,
|
| - chrome::NOTIFICATION_CONTENT_SETTINGS_CHANGED,
|
| - Source<HostContentSettingsMap>(profile_->GetHostContentSettingsMap()));
|
| }
|
| notification_registrar_.Add(this, chrome::NOTIFICATION_PROFILE_DESTROYED,
|
| Source<Profile>(profile_));
|
| }
|
|
|
| void DesktopNotificationService::StopObserving() {
|
| - if (!profile_->IsOffTheRecord()) {
|
| - prefs_registrar_.RemoveAll();
|
| - }
|
| notification_registrar_.RemoveAll();
|
| }
|
|
|
| void DesktopNotificationService::GrantPermission(const GURL& origin) {
|
| - ContentSettingsPattern pattern =
|
| - content_settings::NotificationProvider::ToContentSettingsPattern(origin);
|
| - provider_->SetContentSetting(
|
| - pattern,
|
| - pattern,
|
| + ContentSettingsPattern primary_pattern =
|
| + ContentSettingsPattern::FromURLNoWildcard(origin);
|
| + profile_->GetHostContentSettingsMap()->SetContentSetting(
|
| + primary_pattern,
|
| + ContentSettingsPattern::Wildcard(),
|
| CONTENT_SETTINGS_TYPE_NOTIFICATIONS,
|
| NO_RESOURCE_IDENTIFIER,
|
| CONTENT_SETTING_ALLOW);
|
| -
|
| - // Schedule a cache update on the IO thread.
|
| - BrowserThread::PostTask(
|
| - BrowserThread::IO, FROM_HERE,
|
| - NewRunnableMethod(
|
| - prefs_cache_.get(),
|
| - &NotificationsPrefsCache::CacheAllowedOrigin,
|
| - origin));
|
| }
|
|
|
| void DesktopNotificationService::DenyPermission(const GURL& origin) {
|
| - // Update content settings
|
| - ContentSettingsPattern pattern =
|
| - content_settings::NotificationProvider::ToContentSettingsPattern(origin);
|
| - provider_->SetContentSetting(
|
| - pattern,
|
| - pattern,
|
| + ContentSettingsPattern primary_pattern =
|
| + ContentSettingsPattern::FromURLNoWildcard(origin);
|
| + profile_->GetHostContentSettingsMap()->SetContentSetting(
|
| + primary_pattern,
|
| + ContentSettingsPattern::Wildcard(),
|
| CONTENT_SETTINGS_TYPE_NOTIFICATIONS,
|
| NO_RESOURCE_IDENTIFIER,
|
| CONTENT_SETTING_BLOCK);
|
| -
|
| - // Schedule a cache update on the IO thread.
|
| - BrowserThread::PostTask(
|
| - BrowserThread::IO, FROM_HERE,
|
| - NewRunnableMethod(
|
| - prefs_cache_.get(),
|
| - &NotificationsPrefsCache::CacheDeniedOrigin,
|
| - origin));
|
| }
|
|
|
| void DesktopNotificationService::Observe(int type,
|
| const NotificationSource& source,
|
| const NotificationDetails& details) {
|
| - if (chrome::NOTIFICATION_PREF_CHANGED == type) {
|
| - const std::string& name = *Details<std::string>(details).ptr();
|
| - OnPrefsChanged(name);
|
| - } else if (chrome::NOTIFICATION_CONTENT_SETTINGS_CHANGED == type) {
|
| - // TODO(markusheintz): Check if content settings type default was changed;
|
| - const ContentSetting default_content_setting =
|
| - profile_->GetHostContentSettingsMap()->GetDefaultContentSetting(
|
| - CONTENT_SETTINGS_TYPE_NOTIFICATIONS);
|
| - // Schedule a cache update on the IO thread.
|
| - BrowserThread::PostTask(
|
| - BrowserThread::IO, FROM_HERE,
|
| - NewRunnableMethod(
|
| - prefs_cache_.get(),
|
| - &NotificationsPrefsCache::SetCacheDefaultContentSetting,
|
| - default_content_setting));
|
| - } else if (chrome::NOTIFICATION_EXTENSION_UNLOADED == type) {
|
| + if (chrome::NOTIFICATION_EXTENSION_UNLOADED == type) {
|
| // Remove all notifications currently shown or queued by the extension
|
| // which was unloaded.
|
| const Extension* extension =
|
| @@ -380,30 +271,6 @@ void DesktopNotificationService::Observe(int type,
|
| }
|
| }
|
|
|
| -void DesktopNotificationService::OnPrefsChanged(const std::string& pref_name) {
|
| - if (pref_name == prefs::kDesktopNotificationAllowedOrigins) {
|
| - // Schedule a cache update on the IO thread.
|
| - std::vector<GURL> allowed_origins(GetAllowedOrigins());
|
| - BrowserThread::PostTask(
|
| - BrowserThread::IO, FROM_HERE,
|
| - NewRunnableMethod(
|
| - prefs_cache_.get(),
|
| - &NotificationsPrefsCache::SetCacheAllowedOrigins,
|
| - allowed_origins));
|
| - } else if (pref_name == prefs::kDesktopNotificationDeniedOrigins) {
|
| - // Schedule a cache update on the IO thread.
|
| - std::vector<GURL> denied_origins(GetBlockedOrigins());
|
| - BrowserThread::PostTask(
|
| - BrowserThread::IO, FROM_HERE,
|
| - NewRunnableMethod(
|
| - prefs_cache_.get(),
|
| - &NotificationsPrefsCache::SetCacheDeniedOrigins,
|
| - denied_origins));
|
| - } else {
|
| - NOTREACHED();
|
| - }
|
| -}
|
| -
|
| ContentSetting DesktopNotificationService::GetDefaultContentSetting() {
|
| return profile_->GetHostContentSettingsMap()->GetDefaultContentSetting(
|
| CONTENT_SETTINGS_TYPE_NOTIFICATIONS);
|
| @@ -425,70 +292,36 @@ void DesktopNotificationService::ResetToDefaultContentSetting() {
|
| CONTENT_SETTINGS_TYPE_NOTIFICATIONS, CONTENT_SETTING_DEFAULT);
|
| }
|
|
|
| -std::vector<GURL> DesktopNotificationService::GetAllowedOrigins() {
|
| - content_settings::ProviderInterface::Rules content_setting_rules;
|
| - provider_->GetAllContentSettingsRules(
|
| - CONTENT_SETTINGS_TYPE_NOTIFICATIONS,
|
| - NO_RESOURCE_IDENTIFIER,
|
| - &content_setting_rules);
|
| - std::vector<GURL> allowed_origins;
|
| -
|
| - GetOriginsWithSettingFromContentSettingsRules(
|
| - content_setting_rules, CONTENT_SETTING_ALLOW, &allowed_origins);
|
| -
|
| - return allowed_origins;
|
| -}
|
| -
|
| -std::vector<GURL> DesktopNotificationService::GetBlockedOrigins() {
|
| - content_settings::ProviderInterface::Rules content_settings_rules;
|
| - provider_->GetAllContentSettingsRules(
|
| - CONTENT_SETTINGS_TYPE_NOTIFICATIONS,
|
| - NO_RESOURCE_IDENTIFIER,
|
| - &content_settings_rules);
|
| - std::vector<GURL> denied_origins;
|
| -
|
| - GetOriginsWithSettingFromContentSettingsRules(
|
| - content_settings_rules, CONTENT_SETTING_BLOCK, &denied_origins);
|
| -
|
| - return denied_origins;
|
| -}
|
| -
|
| -void DesktopNotificationService::ResetAllowedOrigin(const GURL& origin) {
|
| - ContentSettingsPattern pattern =
|
| - ContentSettingsPattern::FromURLNoWildcard(origin);
|
| - provider_->SetContentSetting(
|
| - pattern,
|
| - pattern,
|
| +void DesktopNotificationService::GetNotificationsSettings(
|
| + HostContentSettingsMap::SettingsForOneType* settings) {
|
| + profile_->GetHostContentSettingsMap()->GetSettingsForOneType(
|
| CONTENT_SETTINGS_TYPE_NOTIFICATIONS,
|
| NO_RESOURCE_IDENTIFIER,
|
| - CONTENT_SETTING_DEFAULT);
|
| + settings);
|
| }
|
|
|
| -void DesktopNotificationService::ResetBlockedOrigin(const GURL& origin) {
|
| - ContentSettingsPattern pattern =
|
| - ContentSettingsPattern::FromURLNoWildcard(origin);
|
| - provider_->SetContentSetting(
|
| - pattern,
|
| +void DesktopNotificationService::ClearSetting(
|
| + const ContentSettingsPattern& pattern) {
|
| + profile_->GetHostContentSettingsMap()->SetContentSetting(
|
| pattern,
|
| + ContentSettingsPattern::Wildcard(),
|
| CONTENT_SETTINGS_TYPE_NOTIFICATIONS,
|
| NO_RESOURCE_IDENTIFIER,
|
| CONTENT_SETTING_DEFAULT);
|
| }
|
|
|
| void DesktopNotificationService::ResetAllOrigins() {
|
| - provider_->ClearAllContentSettingsRules(CONTENT_SETTINGS_TYPE_NOTIFICATIONS);
|
| + profile_->GetHostContentSettingsMap()->ClearSettingsForOneType(
|
| + CONTENT_SETTINGS_TYPE_NOTIFICATIONS);
|
| }
|
|
|
| ContentSetting DesktopNotificationService::GetContentSetting(
|
| const GURL& origin) {
|
| - ContentSetting provided_setting = provider_->GetContentSetting(
|
| + return profile_->GetHostContentSettingsMap()->GetContentSetting(
|
| origin,
|
| origin,
|
| CONTENT_SETTINGS_TYPE_NOTIFICATIONS,
|
| NO_RESOURCE_IDENTIFIER);
|
| - if (CONTENT_SETTING_DEFAULT == provided_setting)
|
| - return GetDefaultContentSetting();
|
| - return provided_setting;
|
| }
|
|
|
| void DesktopNotificationService::RequestPermission(
|
| @@ -539,7 +372,6 @@ bool DesktopNotificationService::CancelDesktopNotification(
|
| return ui_manager_->CancelById(proxy->id());
|
| }
|
|
|
| -
|
| bool DesktopNotificationService::ShowDesktopNotification(
|
| const DesktopNotificationHostMsg_Show_Params& params,
|
| int process_id, int route_id, DesktopNotificationSource source) {
|
| @@ -589,5 +421,20 @@ void DesktopNotificationService::NotifySettingsChange() {
|
| WebKit::WebNotificationPresenter::Permission
|
| DesktopNotificationService::HasPermission(const GURL& origin) {
|
| DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
|
| - return prefs_cache()->HasPermission(origin.GetOrigin());
|
| + HostContentSettingsMap* host_content_settings_map =
|
| + profile_->GetHostContentSettingsMap();
|
| + ContentSetting setting = host_content_settings_map->GetContentSetting(
|
| + origin,
|
| + origin,
|
| + CONTENT_SETTINGS_TYPE_NOTIFICATIONS,
|
| + NO_RESOURCE_IDENTIFIER);
|
| +
|
| + if (setting == CONTENT_SETTING_ALLOW)
|
| + return WebKit::WebNotificationPresenter::PermissionAllowed;
|
| + if (setting == CONTENT_SETTING_BLOCK)
|
| + return WebKit::WebNotificationPresenter::PermissionDenied;
|
| + if (setting == CONTENT_SETTING_ASK)
|
| + return WebKit::WebNotificationPresenter::PermissionNotAllowed;
|
| + NOTREACHED() << "Invalid notifications settings value: " << setting;
|
| + return WebKit::WebNotificationPresenter::PermissionNotAllowed;
|
| }
|
|
|