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..ef95915c8c4575c215af7478214b662da0a9676f 100644 |
--- a/chrome/browser/notifications/desktop_notification_service.cc |
+++ b/chrome/browser/notifications/desktop_notification_service.cc |
@@ -7,6 +7,7 @@ |
#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_provider.h" |
#include "chrome/browser/content_settings/host_content_settings_map.h" |
#include "chrome/browser/extensions/extension_service.h" |
@@ -47,20 +48,23 @@ const ContentSetting kDefaultSetting = CONTENT_SETTING_ASK; |
namespace { |
-typedef content_settings::ProviderInterface::Rules Rules; |
+typedef HostContentSettingsMap::SettingsForOneType SettingsForOneType; |
+typedef HostContentSettingsMap::PatternSettingSourceTuple |
+ PatternSettingSourceTuple; |
-void GetOriginsWithSettingFromContentSettingsRules( |
- const Rules& content_setting_rules, |
+void GetOriginsWithSettingFromSettingsForOneType( |
+ const SettingsForOneType& settings, |
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()) { |
+ for (SettingsForOneType::const_iterator i = settings.begin(); |
+ i != settings.end(); |
+ ++i) { |
+ const PatternSettingSourceTuple& tuple(*i); |
+ if (setting == tuple.c) { |
battre
2011/08/22 15:00:57
Who allowed HostContentSettingsMap::PatternSetting
markusheintz_
2011/08/24 00:47:12
Yeah sorry I had to sell deposit my for that. But
|
+ std::string url_str = tuple.a.ToString(); |
+ if (!tuple.a.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: " |
@@ -74,9 +78,9 @@ void GetOriginsWithSettingFromContentSettingsRules( |
<< "hostnames (e.g. wildcard patterns) are not supported " |
<< "for notification content settings yet."; |
} else { |
- origins->push_back( |
- content_settings::NotificationProvider::ToGURL( |
- rule->primary_pattern)); |
+ GURL origin(tuple.a.ToString()); |
+ DCHECK(origin.is_valid()); |
+ origins->push_back(origin); |
} |
} |
} |
@@ -252,7 +256,6 @@ DesktopNotificationService::DesktopNotificationService(Profile* profile, |
NotificationUIManager* ui_manager) |
: profile_(profile), |
ui_manager_(ui_manager) { |
- prefs_registrar_.Init(profile_->GetPrefs()); |
InitPrefs(); |
StartObserving(); |
} |
@@ -261,15 +264,9 @@ 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; |
@@ -291,8 +288,6 @@ void DesktopNotificationService::InitPrefs() { |
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( |
@@ -305,18 +300,15 @@ void DesktopNotificationService::StartObserving() { |
} |
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); |
@@ -331,12 +323,11 @@ void DesktopNotificationService::GrantPermission(const GURL& 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); |
@@ -353,36 +344,28 @@ void DesktopNotificationService::DenyPermission(const GURL& 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) { |
- // Remove all notifications currently shown or queued by the extension |
- // which was unloaded. |
- const Extension* extension = |
- Details<UnloadedExtensionInfo>(details)->extension; |
- if (extension) |
- ui_manager_->CancelAllBySourceOrigin(extension->url()); |
- } else if (chrome::NOTIFICATION_PROFILE_DESTROYED == type) { |
- StopObserving(); |
- } |
-} |
+ if (chrome::NOTIFICATION_CONTENT_SETTINGS_CHANGED == type) { |
+ ContentSettingsDetails* settings_details = |
+ Details<ContentSettingsDetails>(details).ptr(); |
+ if (!settings_details->update_all_types() && |
battre
2011/08/22 15:00:57
should this be an || ?
markusheintz_
2011/08/24 00:47:12
That's correct this way.
|
+ settings_details->type() != CONTENT_SETTINGS_TYPE_NOTIFICATIONS) |
+ return; |
+ |
+ if (settings_details->update_all_types() || |
+ settings_details->update_all()) { |
+ 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)); |
+ } |
-void DesktopNotificationService::OnPrefsChanged(const std::string& pref_name) { |
- if (pref_name == prefs::kDesktopNotificationAllowedOrigins) { |
- // Schedule a cache update on the IO thread. |
+ // TODO(markusheintz): Only update the changed patterns. |
std::vector<GURL> allowed_origins(GetAllowedOrigins()); |
BrowserThread::PostTask( |
BrowserThread::IO, FROM_HERE, |
@@ -390,8 +373,7 @@ void DesktopNotificationService::OnPrefsChanged(const std::string& pref_name) { |
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, |
@@ -399,8 +381,16 @@ void DesktopNotificationService::OnPrefsChanged(const std::string& pref_name) { |
prefs_cache_.get(), |
&NotificationsPrefsCache::SetCacheDeniedOrigins, |
denied_origins)); |
- } else { |
- NOTREACHED(); |
+ |
+ } else if (chrome::NOTIFICATION_EXTENSION_UNLOADED == type) { |
+ // Remove all notifications currently shown or queued by the extension |
+ // which was unloaded. |
+ const Extension* extension = |
+ Details<UnloadedExtensionInfo>(details)->extension; |
+ if (extension) |
+ ui_manager_->CancelAllBySourceOrigin(extension->url()); |
+ } else if (chrome::NOTIFICATION_PROFILE_DESTROYED == type) { |
+ StopObserving(); |
} |
} |
@@ -426,66 +416,66 @@ void DesktopNotificationService::ResetToDefaultContentSetting() { |
} |
std::vector<GURL> DesktopNotificationService::GetAllowedOrigins() { |
- content_settings::ProviderInterface::Rules content_setting_rules; |
- provider_->GetAllContentSettingsRules( |
+ HostContentSettingsMap::SettingsForOneType settings; |
+ profile_->GetHostContentSettingsMap()->GetSettingsForOneType( |
CONTENT_SETTINGS_TYPE_NOTIFICATIONS, |
NO_RESOURCE_IDENTIFIER, |
- &content_setting_rules); |
- std::vector<GURL> allowed_origins; |
+ &settings); |
- GetOriginsWithSettingFromContentSettingsRules( |
- content_setting_rules, CONTENT_SETTING_ALLOW, &allowed_origins); |
+ std::vector<GURL> allowed_origins; |
+ GetOriginsWithSettingFromSettingsForOneType( |
+ settings, CONTENT_SETTING_ALLOW, &allowed_origins); |
return allowed_origins; |
} |
std::vector<GURL> DesktopNotificationService::GetBlockedOrigins() { |
- content_settings::ProviderInterface::Rules content_settings_rules; |
- provider_->GetAllContentSettingsRules( |
+ HostContentSettingsMap::SettingsForOneType settings; |
+ profile_->GetHostContentSettingsMap()->GetSettingsForOneType( |
CONTENT_SETTINGS_TYPE_NOTIFICATIONS, |
NO_RESOURCE_IDENTIFIER, |
- &content_settings_rules); |
+ &settings); |
std::vector<GURL> denied_origins; |
- |
- GetOriginsWithSettingFromContentSettingsRules( |
- content_settings_rules, CONTENT_SETTING_BLOCK, &denied_origins); |
- |
+ GetOriginsWithSettingFromSettingsForOneType( |
+ settings, CONTENT_SETTING_BLOCK, &denied_origins); |
return denied_origins; |
} |
void DesktopNotificationService::ResetAllowedOrigin(const GURL& origin) { |
- ContentSettingsPattern pattern = |
+ ContentSettingsPattern primary_pattern = |
ContentSettingsPattern::FromURLNoWildcard(origin); |
- provider_->SetContentSetting( |
- pattern, |
- pattern, |
+ profile_->GetHostContentSettingsMap()->SetContentSetting( |
+ primary_pattern, |
+ ContentSettingsPattern::Wildcard(), |
CONTENT_SETTINGS_TYPE_NOTIFICATIONS, |
NO_RESOURCE_IDENTIFIER, |
CONTENT_SETTING_DEFAULT); |
} |
void DesktopNotificationService::ResetBlockedOrigin(const GURL& origin) { |
- ContentSettingsPattern pattern = |
+ ContentSettingsPattern primary_pattern = |
ContentSettingsPattern::FromURLNoWildcard(origin); |
- provider_->SetContentSetting( |
- pattern, |
- pattern, |
+ profile_->GetHostContentSettingsMap()->SetContentSetting( |
+ primary_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( |
- origin, |
- origin, |
- CONTENT_SETTINGS_TYPE_NOTIFICATIONS, |
- NO_RESOURCE_IDENTIFIER); |
+ ContentSetting provided_setting = |
+ profile_->GetHostContentSettingsMap()->GetContentSetting( |
+ origin, |
+ origin, |
+ CONTENT_SETTINGS_TYPE_NOTIFICATIONS, |
+ NO_RESOURCE_IDENTIFIER); |
if (CONTENT_SETTING_DEFAULT == provided_setting) |
return GetDefaultContentSetting(); |
return provided_setting; |