Index: chrome/browser/chrome_content_browser_client.cc |
diff --git a/chrome/browser/chrome_content_browser_client.cc b/chrome/browser/chrome_content_browser_client.cc |
index 3255a210a4b86cedca12deb9f2ab6b88eb2fd1dc..4fe6b5a4f3021321321a7980738fee8ee2d0b5b3 100644 |
--- a/chrome/browser/chrome_content_browser_client.cc |
+++ b/chrome/browser/chrome_content_browser_client.cc |
@@ -1938,31 +1938,38 @@ WebKit::WebNotificationPresenter::Permission |
int render_process_id) { |
#if defined(ENABLE_NOTIFICATIONS) |
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
- // Sometimes a notification may be invoked during the shutdown. |
- // See http://crbug.com/256638 |
- if (browser_shutdown::IsTryingToQuit()) |
- return WebKit::WebNotificationPresenter::PermissionNotAllowed; |
ProfileIOData* io_data = ProfileIOData::FromResourceContext(context); |
- |
- DesktopNotificationService* notification_service = |
- io_data->GetNotificationService(); |
- if (notification_service) { |
- ExtensionInfoMap* extension_info_map = io_data->GetExtensionInfoMap(); |
- ExtensionSet extensions; |
- extension_info_map->GetExtensionsWithAPIPermissionForSecurityOrigin( |
- source_origin, render_process_id, |
- extensions::APIPermission::kNotification, &extensions); |
- for (ExtensionSet::const_iterator iter = extensions.begin(); |
- iter != extensions.end(); ++iter) { |
- NotifierId notifier_id(NotifierId::APPLICATION, (*iter)->id()); |
- if (notification_service->IsNotifierEnabled(notifier_id)) |
- return WebKit::WebNotificationPresenter::PermissionAllowed; |
- } |
- |
- return notification_service->HasPermission(source_origin); |
- } |
- |
+ ExtensionInfoMap* extension_info_map = io_data->GetExtensionInfoMap(); |
+ |
+ // We want to see if there is an extension that hasn't been manually disabled |
+ // that has the notifications permission and applies to this security origin. |
+ // First, get the list of extensions with permission for the origin. |
+ ExtensionSet extensions; |
+ extension_info_map->GetExtensionsWithAPIPermissionForSecurityOrigin( |
+ source_origin, render_process_id, |
+ extensions::APIPermission::kNotification, &extensions); |
+ for (ExtensionSet::const_iterator iter = extensions.begin(); |
+ iter != extensions.end(); ++iter) { |
+ // Then, check to see if it's been disabled by the user. |
+ const std::string& id = (*iter)->id(); |
+ if (!extension_info_map->GetNotificationsDisabledForExtension(id)) |
+ return WebKit::WebNotificationPresenter::PermissionAllowed; |
+ } |
+ |
+ // No enabled extensions exist, so check the normal host content settings. |
+ HostContentSettingsMap* host_content_settings_map = |
+ io_data->GetHostContentSettingsMap(); |
+ ContentSetting setting = host_content_settings_map->GetContentSetting( |
+ source_origin, |
+ source_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; |
return WebKit::WebNotificationPresenter::PermissionNotAllowed; |
#else |
return WebKit::WebNotificationPresenter::PermissionAllowed; |