Index: chrome/browser/services/gcm/push_messaging_permission_context.cc |
diff --git a/chrome/browser/services/gcm/push_messaging_permission_context.cc b/chrome/browser/services/gcm/push_messaging_permission_context.cc |
index 418b1742997436582cbef7c2d51312891a453a9a..9badad170510eb1137bc2e58d0eb7ac369b4007d 100644 |
--- a/chrome/browser/services/gcm/push_messaging_permission_context.cc |
+++ b/chrome/browser/services/gcm/push_messaging_permission_context.cc |
@@ -4,21 +4,25 @@ |
#include "chrome/browser/services/gcm/push_messaging_permission_context.h" |
+#include "chrome/browser/content_settings/permission_context_uma_util.h" |
+#include "chrome/browser/notifications/desktop_notification_service.h" |
+#include "chrome/browser/notifications/desktop_notification_service_factory.h" |
#include "chrome/browser/profiles/profile.h" |
#include "components/content_settings/core/browser/host_content_settings_map.h" |
+#include "components/content_settings/core/common/permission_request_id.h" |
+#include "content/public/browser/browser_thread.h" |
#include "content/public/browser/web_contents.h" |
#include "content/public/browser/web_contents_delegate.h" |
const ContentSettingsType kPushSettingType = |
CONTENT_SETTINGS_TYPE_PUSH_MESSAGING; |
-const ContentSettingsType kNotificationSettingType = |
- CONTENT_SETTINGS_TYPE_NOTIFICATIONS; |
namespace gcm { |
PushMessagingPermissionContext::PushMessagingPermissionContext(Profile* profile) |
: PermissionContextBase(profile, CONTENT_SETTINGS_TYPE_PUSH_MESSAGING), |
- profile_(profile) { |
+ profile_(profile), |
+ weak_factory_(this) { |
} |
PushMessagingPermissionContext::~PushMessagingPermissionContext() { |
@@ -27,6 +31,7 @@ PushMessagingPermissionContext::~PushMessagingPermissionContext() { |
ContentSetting PushMessagingPermissionContext::GetPermissionStatus( |
const GURL& requesting_origin, |
const GURL& embedding_origin) const { |
+#if defined(ENABLE_NOTIFICATIONS) |
if (requesting_origin != embedding_origin) |
return CONTENT_SETTING_BLOCK; |
@@ -34,22 +39,28 @@ ContentSetting PushMessagingPermissionContext::GetPermissionStatus( |
profile_->GetHostContentSettingsMap()->GetContentSetting( |
requesting_origin, embedding_origin, kPushSettingType, std::string()); |
- ContentSetting notifications_content_setting = |
- profile_->GetHostContentSettingsMap()->GetContentSetting( |
- requesting_origin, embedding_origin, kNotificationSettingType, |
- std::string()); |
+ DesktopNotificationService* notification_service = |
+ DesktopNotificationServiceFactory::GetForProfile(profile_); |
+ DCHECK(notification_service); |
+ |
+ ContentSetting notifications_permission = |
+ notification_service->GetPermissionStatus(requesting_origin, |
+ embedding_origin); |
- if (notifications_content_setting == CONTENT_SETTING_BLOCK || |
+ if (notifications_permission == CONTENT_SETTING_BLOCK || |
push_content_setting == CONTENT_SETTING_BLOCK) { |
return CONTENT_SETTING_BLOCK; |
} |
- if (notifications_content_setting == CONTENT_SETTING_ASK || |
+ if (notifications_permission == CONTENT_SETTING_ASK || |
push_content_setting == CONTENT_SETTING_ASK) { |
return CONTENT_SETTING_ASK; |
} |
- DCHECK_EQ(CONTENT_SETTING_ALLOW, notifications_content_setting); |
+ DCHECK_EQ(CONTENT_SETTING_ALLOW, notifications_permission); |
DCHECK_EQ(CONTENT_SETTING_ALLOW, push_content_setting); |
return CONTENT_SETTING_ALLOW; |
+#else |
+ return CONTENT_SETTING_BLOCK; |
+#endif |
} |
// Unlike other permissions, push is decided by the following algorithm |
@@ -65,23 +76,34 @@ void PushMessagingPermissionContext::DecidePermission( |
const GURL& embedding_origin, |
bool user_gesture, |
const BrowserPermissionCallback& callback) { |
+ DCHECK_CURRENTLY_ON(content::BrowserThread::UI); |
Michael van Ouwerkerk
2014/12/10 18:36:33
Why are we (sometimes) checking for threads? This
Miguel Garcia
2014/12/11 11:37:08
This was actually not strictly required before we
|
+#if defined(ENABLE_NOTIFICATIONS) |
if (requesting_origin != embedding_origin) { |
NotifyPermissionSet(id, requesting_origin, embedding_origin, callback, |
false /* persist */, false /* granted */); |
} |
- ContentSetting notifications_content_setting = |
- profile_->GetHostContentSettingsMap() |
- ->GetContentSettingAndMaybeUpdateLastUsage( |
- requesting_origin, embedding_origin, kNotificationSettingType, |
- std::string()); |
- |
- if (notifications_content_setting != CONTENT_SETTING_ALLOW) { |
- DVLOG(1) << "Notification permission has not been granted."; |
- NotifyPermissionSet(id, requesting_origin, embedding_origin, callback, |
- false /* persist */, false /* granted */); |
- return; |
- } |
+ DesktopNotificationService* notification_service = |
+ DesktopNotificationServiceFactory::GetForProfile(profile_); |
+ DCHECK(notification_service); |
+ |
+ notification_service->RequestPermission( |
+ web_contents, id, requesting_origin, user_gesture, |
+ base::Bind(&PushMessagingPermissionContext::DecidePushPermission, |
+ weak_factory_.GetWeakPtr(), id, requesting_origin, |
+ embedding_origin, callback)); |
+#else |
+ NotifyPermissionSet(id, requesting_origin, embedding_origin, callback, |
+ false /* persist */, false /* granted */); |
+#endif |
+} |
+void PushMessagingPermissionContext::DecidePushPermission( |
+ const PermissionRequestID& id, |
+ const GURL& requesting_origin, |
+ const GURL& embedding_origin, |
+ const BrowserPermissionCallback& callback, |
+ bool notifications_permission_granted) { |
+ DCHECK_CURRENTLY_ON(content::BrowserThread::UI); |
ContentSetting push_content_setting = |
profile_->GetHostContentSettingsMap() |
->GetContentSettingAndMaybeUpdateLastUsage( |
@@ -90,13 +112,24 @@ void PushMessagingPermissionContext::DecidePermission( |
if (push_content_setting == CONTENT_SETTING_BLOCK) { |
DVLOG(1) << "Push permission was explicitly blocked."; |
+ PermissionContextUmaUtil::PermissionDenied(kPushSettingType, |
+ requesting_origin); |
+ NotifyPermissionSet(id, requesting_origin, embedding_origin, callback, |
+ true /* persist */, false /* granted */); |
+ return; |
+ } |
+ |
+ if (!notifications_permission_granted) { |
+ DVLOG(1) << "Notification permission has not been granted."; |
NotifyPermissionSet(id, requesting_origin, embedding_origin, callback, |
false /* persist */, false /* granted */); |
return; |
} |
+ PermissionContextUmaUtil::PermissionGranted(kPushSettingType, |
+ requesting_origin); |
NotifyPermissionSet(id, requesting_origin, embedding_origin, callback, |
true /* persist */, true /* granted */); |
} |
- |
} // namespace gcm |
+ |