| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "chrome/browser/notifications/desktop_notification_service.h" | 5 #include "chrome/browser/notifications/desktop_notification_service.h" |
| 6 | 6 |
| 7 #include "base/bind.h" | 7 #include "base/bind.h" |
| 8 #include "base/metrics/histogram.h" | 8 #include "base/metrics/histogram.h" |
| 9 #include "base/metrics/histogram_macros.h" | 9 #include "base/metrics/histogram_macros.h" |
| 10 #include "base/prefs/scoped_user_pref_update.h" | 10 #include "base/prefs/scoped_user_pref_update.h" |
| (...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 89 } | 89 } |
| 90 | 90 |
| 91 DesktopNotificationService::~DesktopNotificationService() { | 91 DesktopNotificationService::~DesktopNotificationService() { |
| 92 } | 92 } |
| 93 | 93 |
| 94 void DesktopNotificationService::RequestNotificationPermission( | 94 void DesktopNotificationService::RequestNotificationPermission( |
| 95 content::WebContents* web_contents, | 95 content::WebContents* web_contents, |
| 96 const PermissionRequestID& request_id, | 96 const PermissionRequestID& request_id, |
| 97 const GURL& requesting_origin, | 97 const GURL& requesting_origin, |
| 98 bool user_gesture, | 98 bool user_gesture, |
| 99 const base::Callback<void(bool)>& result_callback) { | 99 const BrowserPermissionCallback& result_callback) { |
| 100 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 100 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 101 | 101 |
| 102 #if defined(ENABLE_EXTENSIONS) | 102 #if defined(ENABLE_EXTENSIONS) |
| 103 extensions::InfoMap* extension_info_map = | 103 extensions::InfoMap* extension_info_map = |
| 104 extensions::ExtensionSystem::Get(profile_)->info_map(); | 104 extensions::ExtensionSystem::Get(profile_)->info_map(); |
| 105 const extensions::Extension* extension = NULL; | 105 const extensions::Extension* extension = NULL; |
| 106 if (extension_info_map) { | 106 if (extension_info_map) { |
| 107 extensions::ExtensionSet extensions; | 107 extensions::ExtensionSet extensions; |
| 108 extension_info_map->GetExtensionsWithAPIPermissionForSecurityOrigin( | 108 extension_info_map->GetExtensionsWithAPIPermissionForSecurityOrigin( |
| 109 requesting_origin, | 109 requesting_origin, |
| 110 request_id.render_process_id(), | 110 request_id.render_process_id(), |
| 111 extensions::APIPermission::kNotifications, | 111 extensions::APIPermission::kNotifications, |
| 112 &extensions); | 112 &extensions); |
| 113 for (extensions::ExtensionSet::const_iterator iter = extensions.begin(); | 113 for (extensions::ExtensionSet::const_iterator iter = extensions.begin(); |
| 114 iter != extensions.end(); ++iter) { | 114 iter != extensions.end(); ++iter) { |
| 115 if (IsNotifierEnabled(NotifierId( | 115 if (IsNotifierEnabled(NotifierId( |
| 116 NotifierId::APPLICATION, (*iter)->id()))) { | 116 NotifierId::APPLICATION, (*iter)->id()))) { |
| 117 extension = iter->get(); | 117 extension = iter->get(); |
| 118 break; | 118 break; |
| 119 } | 119 } |
| 120 } | 120 } |
| 121 } | 121 } |
| 122 if (IsExtensionWithPermissionOrSuggestInConsole( | 122 if (IsExtensionWithPermissionOrSuggestInConsole( |
| 123 extensions::APIPermission::kNotifications, | 123 extensions::APIPermission::kNotifications, |
| 124 extension, | 124 extension, |
| 125 web_contents->GetRenderViewHost())) { | 125 web_contents->GetRenderViewHost())) { |
| 126 result_callback.Run(true); | 126 result_callback.Run(CONTENT_SETTING_ALLOW); |
| 127 return; | 127 return; |
| 128 } | 128 } |
| 129 #endif | 129 #endif |
| 130 | 130 |
| 131 // Track whether the requesting and embedding origins are different when | 131 // Track whether the requesting and embedding origins are different when |
| 132 // permission to display Web Notifications is being requested. | 132 // permission to display Web Notifications is being requested. |
| 133 UMA_HISTOGRAM_BOOLEAN("Notifications.DifferentRequestingEmbeddingOrigins", | 133 UMA_HISTOGRAM_BOOLEAN("Notifications.DifferentRequestingEmbeddingOrigins", |
| 134 requesting_origin.GetOrigin() != | 134 requesting_origin.GetOrigin() != |
| 135 web_contents->GetLastCommittedURL().GetOrigin()); | 135 web_contents->GetLastCommittedURL().GetOrigin()); |
| 136 | 136 |
| (...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 238 #endif | 238 #endif |
| 239 | 239 |
| 240 // Unlike other permission types, granting a notification for a given origin | 240 // Unlike other permission types, granting a notification for a given origin |
| 241 // will not take into account the |embedder_origin|, it will only be based | 241 // will not take into account the |embedder_origin|, it will only be based |
| 242 // on the requesting iframe origin. | 242 // on the requesting iframe origin. |
| 243 // TODO(mukai) Consider why notifications behave differently than | 243 // TODO(mukai) Consider why notifications behave differently than |
| 244 // other permissions. crbug.com/416894 | 244 // other permissions. crbug.com/416894 |
| 245 void DesktopNotificationService::UpdateContentSetting( | 245 void DesktopNotificationService::UpdateContentSetting( |
| 246 const GURL& requesting_origin, | 246 const GURL& requesting_origin, |
| 247 const GURL& embedder_origin, | 247 const GURL& embedder_origin, |
| 248 bool allowed) { | 248 ContentSetting content_setting) { |
| 249 if (allowed) { | 249 DCHECK(content_setting == CONTENT_SETTING_ALLOW || |
| 250 content_setting == CONTENT_SETTING_BLOCK); |
| 251 |
| 252 if (content_setting == CONTENT_SETTING_ALLOW) { |
| 250 DesktopNotificationProfileUtil::GrantPermission( | 253 DesktopNotificationProfileUtil::GrantPermission( |
| 251 profile_, requesting_origin); | 254 profile_, requesting_origin); |
| 252 } else { | 255 } else { |
| 253 DesktopNotificationProfileUtil::DenyPermission(profile_, requesting_origin); | 256 DesktopNotificationProfileUtil::DenyPermission(profile_, requesting_origin); |
| 254 } | 257 } |
| 255 } | 258 } |
| 256 | 259 |
| 257 void DesktopNotificationService::FirePermissionLevelChangedEvent( | 260 void DesktopNotificationService::FirePermissionLevelChangedEvent( |
| 258 const NotifierId& notifier_id, bool enabled) { | 261 const NotifierId& notifier_id, bool enabled) { |
| 259 #if defined(ENABLE_EXTENSIONS) | 262 #if defined(ENABLE_EXTENSIONS) |
| (...skipping 13 matching lines...) Expand all Loading... |
| 273 // Tell the IO thread that this extension's permission for notifications | 276 // Tell the IO thread that this extension's permission for notifications |
| 274 // has changed. | 277 // has changed. |
| 275 extensions::InfoMap* extension_info_map = | 278 extensions::InfoMap* extension_info_map = |
| 276 extensions::ExtensionSystem::Get(profile_)->info_map(); | 279 extensions::ExtensionSystem::Get(profile_)->info_map(); |
| 277 BrowserThread::PostTask( | 280 BrowserThread::PostTask( |
| 278 BrowserThread::IO, FROM_HERE, | 281 BrowserThread::IO, FROM_HERE, |
| 279 base::Bind(&extensions::InfoMap::SetNotificationsDisabled, | 282 base::Bind(&extensions::InfoMap::SetNotificationsDisabled, |
| 280 extension_info_map, notifier_id.id, !enabled)); | 283 extension_info_map, notifier_id.id, !enabled)); |
| 281 #endif | 284 #endif |
| 282 } | 285 } |
| OLD | NEW |