| OLD | NEW |
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 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/push_messaging/push_messaging_notification_manager.h" | 5 #include "chrome/browser/push_messaging/push_messaging_notification_manager.h" |
| 6 | 6 |
| 7 #include <stddef.h> | 7 #include <stddef.h> |
| 8 | 8 |
| 9 #include <bitset> | 9 #include <bitset> |
| 10 | 10 |
| 11 #include "base/metrics/histogram_macros.h" | 11 #include "base/metrics/histogram_macros.h" |
| 12 #include "base/strings/utf_string_conversions.h" | 12 #include "base/strings/utf_string_conversions.h" |
| 13 #include "chrome/browser/browser_process.h" | 13 #include "chrome/browser/browser_process.h" |
| 14 #include "chrome/browser/budget_service/background_budget_service.h" | 14 #include "chrome/browser/budget_service/budget_manager.h" |
| 15 #include "chrome/browser/budget_service/background_budget_service_factory.h" | 15 #include "chrome/browser/budget_service/budget_manager_factory.h" |
| 16 #include "chrome/browser/engagement/site_engagement_service.h" | 16 #include "chrome/browser/engagement/site_engagement_service.h" |
| 17 #include "chrome/browser/notifications/platform_notification_service_impl.h" | 17 #include "chrome/browser/notifications/platform_notification_service_impl.h" |
| 18 #include "chrome/browser/profiles/profile.h" | 18 #include "chrome/browser/profiles/profile.h" |
| 19 #include "chrome/browser/push_messaging/push_messaging_constants.h" | 19 #include "chrome/browser/push_messaging/push_messaging_constants.h" |
| 20 #include "chrome/common/features.h" | 20 #include "chrome/common/features.h" |
| 21 #include "chrome/grit/generated_resources.h" | 21 #include "chrome/grit/generated_resources.h" |
| 22 #include "components/rappor/rappor_utils.h" | 22 #include "components/rappor/rappor_utils.h" |
| 23 #include "components/url_formatter/elide_url.h" | 23 #include "components/url_formatter/elide_url.h" |
| 24 #include "content/public/browser/browser_context.h" | 24 #include "content/public/browser/browser_context.h" |
| 25 #include "content/public/browser/browser_thread.h" | 25 #include "content/public/browser/browser_thread.h" |
| (...skipping 153 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 179 platform_notification_service->ClosePersistentNotification( | 179 platform_notification_service->ClosePersistentNotification( |
| 180 profile_, notification_database_data.notification_id); | 180 profile_, notification_database_data.notification_id); |
| 181 platform_notification_service->OnPersistentNotificationClose( | 181 platform_notification_service->OnPersistentNotificationClose( |
| 182 profile_, notification_database_data.notification_id, | 182 profile_, notification_database_data.notification_id, |
| 183 notification_database_data.origin, false /* by_user */); | 183 notification_database_data.origin, false /* by_user */); |
| 184 | 184 |
| 185 break; | 185 break; |
| 186 } | 186 } |
| 187 } | 187 } |
| 188 | 188 |
| 189 // Get the budget for the service worker. | 189 // Get the budget for the origin. |
| 190 BackgroundBudgetService* service = | 190 BudgetManager* manager = BudgetManagerFactory::GetForProfile(profile_); |
| 191 BackgroundBudgetServiceFactory::GetForProfile(profile_); | 191 manager->GetBudget( |
| 192 service->GetBudget( | |
| 193 origin, | 192 origin, |
| 194 base::Bind(&PushMessagingNotificationManager::DidGetBudget, | 193 base::Bind(&PushMessagingNotificationManager::DidGetBudget, |
| 195 weak_factory_.GetWeakPtr(), origin, | 194 weak_factory_.GetWeakPtr(), origin, |
| 196 service_worker_registration_id, message_handled_closure, | 195 service_worker_registration_id, message_handled_closure, |
| 197 notification_needed, notification_shown)); | 196 notification_needed, notification_shown)); |
| 198 } | 197 } |
| 199 | 198 |
| 200 void PushMessagingNotificationManager::DidGetBudget( | 199 void PushMessagingNotificationManager::DidGetBudget( |
| 201 const GURL& origin, | 200 const GURL& origin, |
| 202 int64_t service_worker_registration_id, | 201 int64_t service_worker_registration_id, |
| 203 const base::Closure& message_handled_closure, | 202 const base::Closure& message_handled_closure, |
| 204 bool notification_needed, | 203 bool notification_needed, |
| 205 bool notification_shown, | 204 bool notification_shown, |
| 206 const double budget) { | 205 const double budget) { |
| 207 // Record the budget available any time the budget is queried. | 206 // Record the budget available any time the budget is queried. |
| 208 UMA_HISTOGRAM_COUNTS_100("PushMessaging.BackgroundBudget", budget); | 207 UMA_HISTOGRAM_COUNTS_100("PushMessaging.BackgroundBudget", budget); |
| 209 | 208 |
| 210 // Get the site engagement score. Only used for UMA recording. | 209 // Get the site engagement score. Only used for UMA recording. |
| 211 SiteEngagementService* ses_service = SiteEngagementService::Get(profile_); | 210 SiteEngagementService* ses_service = SiteEngagementService::Get(profile_); |
| 212 double ses_score = ses_service->GetScore(origin); | 211 double ses_score = ses_service->GetScore(origin); |
| 213 | 212 |
| 214 // Generate histograms for the GetBudget calls which would return "no budget" | 213 // Generate histograms for the GetBudget calls which would return "no budget" |
| 215 // or "low budget" if an API was available to app developers. | 214 // or "low budget" if an API was available to app developers. |
| 216 double cost = BackgroundBudgetService::GetCost( | 215 double cost = BudgetManager::GetCost(BudgetManager::CostType::SILENT_PUSH); |
| 217 BackgroundBudgetService::CostType::SILENT_PUSH); | |
| 218 if (budget < cost) | 216 if (budget < cost) |
| 219 UMA_HISTOGRAM_COUNTS_100("PushMessaging.SESForNoBudgetOrigin", ses_score); | 217 UMA_HISTOGRAM_COUNTS_100("PushMessaging.SESForNoBudgetOrigin", ses_score); |
| 220 else if (budget < 2.0 * cost) | 218 else if (budget < 2.0 * cost) |
| 221 UMA_HISTOGRAM_COUNTS_100("PushMessaging.SESForLowBudgetOrigin", ses_score); | 219 UMA_HISTOGRAM_COUNTS_100("PushMessaging.SESForLowBudgetOrigin", ses_score); |
| 222 | 220 |
| 223 if (notification_needed && !notification_shown) { | 221 if (notification_needed && !notification_shown) { |
| 224 // If the worker needed to show a notification and didn't, check the budget | 222 // If the worker needed to show a notification and didn't, check the budget |
| 225 // and take appropriate action. | 223 // and take appropriate action. |
| 226 CheckForMissedNotification(origin, service_worker_registration_id, | 224 CheckForMissedNotification(origin, service_worker_registration_id, |
| 227 message_handled_closure, budget); | 225 message_handled_closure, budget); |
| (...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 277 | 275 |
| 278 void PushMessagingNotificationManager::CheckForMissedNotification( | 276 void PushMessagingNotificationManager::CheckForMissedNotification( |
| 279 const GURL& origin, | 277 const GURL& origin, |
| 280 int64_t service_worker_registration_id, | 278 int64_t service_worker_registration_id, |
| 281 const base::Closure& message_handled_closure, | 279 const base::Closure& message_handled_closure, |
| 282 const double budget) { | 280 const double budget) { |
| 283 DCHECK_CURRENTLY_ON(BrowserThread::UI); | 281 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 284 | 282 |
| 285 // If the service needed to show a notification but did not, update the | 283 // If the service needed to show a notification but did not, update the |
| 286 // budget. | 284 // budget. |
| 287 double cost = BackgroundBudgetService::GetCost( | 285 double cost = BudgetManager::GetCost(BudgetManager::CostType::SILENT_PUSH); |
| 288 BackgroundBudgetService::CostType::SILENT_PUSH); | |
| 289 if (budget >= cost) { | 286 if (budget >= cost) { |
| 290 RecordUserVisibleStatus( | 287 RecordUserVisibleStatus( |
| 291 content::PUSH_USER_VISIBLE_STATUS_REQUIRED_BUT_NOT_SHOWN_USED_GRACE); | 288 content::PUSH_USER_VISIBLE_STATUS_REQUIRED_BUT_NOT_SHOWN_USED_GRACE); |
| 292 | 289 |
| 293 BackgroundBudgetService* service = | 290 BudgetManager* manager = BudgetManagerFactory::GetForProfile(profile_); |
| 294 BackgroundBudgetServiceFactory::GetForProfile(profile_); | |
| 295 // Update the stored budget. | 291 // Update the stored budget. |
| 296 service->StoreBudget(origin, budget - cost, message_handled_closure); | 292 manager->StoreBudget(origin, budget - cost, message_handled_closure); |
| 297 | 293 |
| 298 return; | 294 return; |
| 299 } | 295 } |
| 300 | 296 |
| 301 RecordUserVisibleStatus( | 297 RecordUserVisibleStatus( |
| 302 content::PUSH_USER_VISIBLE_STATUS_REQUIRED_BUT_NOT_SHOWN_GRACE_EXCEEDED); | 298 content::PUSH_USER_VISIBLE_STATUS_REQUIRED_BUT_NOT_SHOWN_GRACE_EXCEEDED); |
| 303 rappor::SampleDomainAndRegistryFromGURL( | 299 rappor::SampleDomainAndRegistryFromGURL( |
| 304 g_browser_process->rappor_service(), | 300 g_browser_process->rappor_service(), |
| 305 "PushMessaging.GenericNotificationShown.Origin", origin); | 301 "PushMessaging.GenericNotificationShown.Origin", origin); |
| 306 | 302 |
| (...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 354 // Do not pass service worker scope. The origin will be used instead of the | 350 // Do not pass service worker scope. The origin will be used instead of the |
| 355 // service worker scope to determine whether a notification should be | 351 // service worker scope to determine whether a notification should be |
| 356 // attributed to a WebAPK on Android. This is OK because this code path is hit | 352 // attributed to a WebAPK on Android. This is OK because this code path is hit |
| 357 // rarely. | 353 // rarely. |
| 358 PlatformNotificationServiceImpl::GetInstance()->DisplayPersistentNotification( | 354 PlatformNotificationServiceImpl::GetInstance()->DisplayPersistentNotification( |
| 359 profile_, persistent_notification_id, GURL() /* service_worker_scope */, | 355 profile_, persistent_notification_id, GURL() /* service_worker_scope */, |
| 360 origin, notification_data, NotificationResources()); | 356 origin, notification_data, NotificationResources()); |
| 361 | 357 |
| 362 message_handled_closure.Run(); | 358 message_handled_closure.Run(); |
| 363 } | 359 } |
| OLD | NEW |