Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(102)

Side by Side Diff: chrome/browser/push_messaging/push_messaging_service_impl.cc

Issue 1134733006: Push API: use (un)subscription instead of (un)registration (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Fixed pre-submit warning Created 5 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 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_service_impl.h" 5 #include "chrome/browser/push_messaging/push_messaging_service_impl.h"
6 6
7 #include <vector> 7 #include <vector>
8 8
9 #include "base/barrier_closure.h" 9 #include "base/barrier_closure.h"
10 #include "base/bind.h" 10 #include "base/bind.h"
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after
86 // defined in a regular profile are visible in the corresponding incognito 86 // defined in a regular profile are visible in the corresponding incognito
87 // profile unless overridden. 87 // profile unless overridden.
88 // TODO(johnme): Make sure this pref doesn't get out of sync after crashes. 88 // TODO(johnme): Make sure this pref doesn't get out of sync after crashes.
89 int count = profile->GetPrefs()->GetInteger( 89 int count = profile->GetPrefs()->GetInteger(
90 prefs::kPushMessagingRegistrationCount); 90 prefs::kPushMessagingRegistrationCount);
91 if (count <= 0) 91 if (count <= 0)
92 return; 92 return;
93 93
94 PushMessagingServiceImpl* push_service = 94 PushMessagingServiceImpl* push_service =
95 PushMessagingServiceFactory::GetForProfile(profile); 95 PushMessagingServiceFactory::GetForProfile(profile);
96 push_service->IncreasePushRegistrationCount(count, false /* is_pending */); 96 push_service->IncreasePushSubscriptionCount(count, false /* is_pending */);
97 } 97 }
98 98
99 PushMessagingServiceImpl::PushMessagingServiceImpl(Profile* profile) 99 PushMessagingServiceImpl::PushMessagingServiceImpl(Profile* profile)
100 : profile_(profile), 100 : profile_(profile),
101 push_registration_count_(0), 101 push_subscription_count_(0),
102 pending_push_registration_count_(0), 102 pending_push_subscription_count_(0),
103 #if defined(ENABLE_NOTIFICATIONS) 103 #if defined(ENABLE_NOTIFICATIONS)
104 notification_manager_(profile), 104 notification_manager_(profile),
105 #endif 105 #endif
106 weak_factory_(this) { 106 weak_factory_(this) {
107 DCHECK(profile); 107 DCHECK(profile);
108 profile_->GetHostContentSettingsMap()->AddObserver(this); 108 profile_->GetHostContentSettingsMap()->AddObserver(this);
109 } 109 }
110 110
111 PushMessagingServiceImpl::~PushMessagingServiceImpl() { 111 PushMessagingServiceImpl::~PushMessagingServiceImpl() {
112 profile_->GetHostContentSettingsMap()->RemoveObserver(this); 112 profile_->GetHostContentSettingsMap()->RemoveObserver(this);
113 } 113 }
114 114
115 void PushMessagingServiceImpl::IncreasePushRegistrationCount(int add, 115 void PushMessagingServiceImpl::IncreasePushSubscriptionCount(int add,
116 bool is_pending) { 116 bool is_pending) {
117 DCHECK(add > 0); 117 DCHECK(add > 0);
118 if (push_registration_count_ + pending_push_registration_count_ == 0) { 118 if (push_subscription_count_ + pending_push_subscription_count_ == 0) {
119 GetGCMDriver()->AddAppHandler(kPushMessagingAppIdentifierPrefix, this); 119 GetGCMDriver()->AddAppHandler(kPushMessagingAppIdentifierPrefix, this);
120 } 120 }
121 if (is_pending) { 121 if (is_pending) {
122 pending_push_registration_count_ += add; 122 pending_push_subscription_count_ += add;
123 } else { 123 } else {
124 push_registration_count_ += add; 124 push_subscription_count_ += add;
125 profile_->GetPrefs()->SetInteger(prefs::kPushMessagingRegistrationCount, 125 profile_->GetPrefs()->SetInteger(prefs::kPushMessagingRegistrationCount,
126 push_registration_count_); 126 push_subscription_count_);
127 } 127 }
128 } 128 }
129 129
130 void PushMessagingServiceImpl::DecreasePushRegistrationCount(int subtract, 130 void PushMessagingServiceImpl::DecreasePushSubscriptionCount(int subtract,
131 bool was_pending) { 131 bool was_pending) {
132 DCHECK(subtract > 0); 132 DCHECK(subtract > 0);
133 if (was_pending) { 133 if (was_pending) {
134 pending_push_registration_count_ -= subtract; 134 pending_push_subscription_count_ -= subtract;
135 DCHECK(pending_push_registration_count_ >= 0); 135 DCHECK(pending_push_subscription_count_ >= 0);
136 } else { 136 } else {
137 push_registration_count_ -= subtract; 137 push_subscription_count_ -= subtract;
138 DCHECK(push_registration_count_ >= 0); 138 DCHECK(push_subscription_count_ >= 0);
139 profile_->GetPrefs()->SetInteger(prefs::kPushMessagingRegistrationCount, 139 profile_->GetPrefs()->SetInteger(prefs::kPushMessagingRegistrationCount,
140 push_registration_count_); 140 push_subscription_count_);
141 } 141 }
142 if (push_registration_count_ + pending_push_registration_count_ == 0) { 142 if (push_subscription_count_ + pending_push_subscription_count_ == 0) {
143 GetGCMDriver()->RemoveAppHandler(kPushMessagingAppIdentifierPrefix); 143 GetGCMDriver()->RemoveAppHandler(kPushMessagingAppIdentifierPrefix);
144 } 144 }
145 } 145 }
146 146
147 bool PushMessagingServiceImpl::CanHandle(const std::string& app_id) const { 147 bool PushMessagingServiceImpl::CanHandle(const std::string& app_id) const {
148 return !PushMessagingAppIdentifier::FindByAppId(profile_, app_id).is_null(); 148 return !PushMessagingAppIdentifier::FindByAppId(profile_, app_id).is_null();
149 } 149 }
150 150
151 void PushMessagingServiceImpl::ShutdownHandler() { 151 void PushMessagingServiceImpl::ShutdownHandler() {
152 // Shutdown() should come before and it removes us from the list of app 152 // Shutdown() should come before and it removes us from the list of app
(...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after
246 message_handled_closure.Run(); 246 message_handled_closure.Run();
247 #endif 247 #endif
248 break; 248 break;
249 case content::PUSH_DELIVERY_STATUS_INVALID_MESSAGE: 249 case content::PUSH_DELIVERY_STATUS_INVALID_MESSAGE:
250 case content::PUSH_DELIVERY_STATUS_SERVICE_WORKER_ERROR: 250 case content::PUSH_DELIVERY_STATUS_SERVICE_WORKER_ERROR:
251 message_handled_closure.Run(); 251 message_handled_closure.Run();
252 break; 252 break;
253 case content::PUSH_DELIVERY_STATUS_UNKNOWN_APP_ID: 253 case content::PUSH_DELIVERY_STATUS_UNKNOWN_APP_ID:
254 case content::PUSH_DELIVERY_STATUS_PERMISSION_DENIED: 254 case content::PUSH_DELIVERY_STATUS_PERMISSION_DENIED:
255 case content::PUSH_DELIVERY_STATUS_NO_SERVICE_WORKER: 255 case content::PUSH_DELIVERY_STATUS_NO_SERVICE_WORKER:
256 Unregister(app_id, message.sender_id, 256 Unsubscribe(
257 base::Bind(&UnregisterCallbackToClosure, 257 app_id, message.sender_id,
258 message_handled_closure)); 258 base::Bind(&UnregisterCallbackToClosure, message_handled_closure));
259 break; 259 break;
260 } 260 }
261 RecordDeliveryStatus(status); 261 RecordDeliveryStatus(status);
262 } 262 }
263 263
264 void PushMessagingServiceImpl::SetMessageCallbackForTesting( 264 void PushMessagingServiceImpl::SetMessageCallbackForTesting(
265 const base::Closure& callback) { 265 const base::Closure& callback) {
266 message_callback_for_testing_ = callback; 266 message_callback_for_testing_ = callback;
267 } 267 }
268 268
(...skipping 15 matching lines...) Expand all
284 const std::string& message_id) { 284 const std::string& message_id) {
285 NOTREACHED() << "The Push API shouldn't have sent messages upstream"; 285 NOTREACHED() << "The Push API shouldn't have sent messages upstream";
286 } 286 }
287 287
288 // GetPushEndpoint method ------------------------------------------------------ 288 // GetPushEndpoint method ------------------------------------------------------
289 289
290 GURL PushMessagingServiceImpl::GetPushEndpoint() { 290 GURL PushMessagingServiceImpl::GetPushEndpoint() {
291 return GURL(std::string(kPushMessagingEndpoint)); 291 return GURL(std::string(kPushMessagingEndpoint));
292 } 292 }
293 293
294 // Register and GetPermissionStatus methods ------------------------------------ 294 // Subscribe and GetPermissionStatus methods -----------------------------------
295 295
296 void PushMessagingServiceImpl::RegisterFromDocument( 296 void PushMessagingServiceImpl::SubscribeFromDocument(
297 const GURL& requesting_origin, 297 const GURL& requesting_origin,
298 int64 service_worker_registration_id, 298 int64 service_worker_registration_id,
299 const std::string& sender_id, 299 const std::string& sender_id,
300 int renderer_id, 300 int renderer_id,
301 int render_frame_id, 301 int render_frame_id,
302 bool user_visible, 302 bool user_visible,
303 const content::PushMessagingService::RegisterCallback& callback) { 303 const content::PushMessagingService::RegisterCallback& callback) {
304 PushMessagingAppIdentifier app_identifier = 304 PushMessagingAppIdentifier app_identifier =
305 PushMessagingAppIdentifier::Generate(requesting_origin, 305 PushMessagingAppIdentifier::Generate(requesting_origin,
306 service_worker_registration_id); 306 service_worker_registration_id);
307 307
308 if (push_registration_count_ + pending_push_registration_count_ 308 if (push_subscription_count_ + pending_push_subscription_count_ >=
309 >= kMaxRegistrations) { 309 kMaxRegistrations) {
310 RegisterEnd(callback, 310 SubscribeEnd(callback, std::string(),
311 std::string(), 311 content::PUSH_REGISTRATION_STATUS_LIMIT_REACHED);
312 content::PUSH_REGISTRATION_STATUS_LIMIT_REACHED);
313 return; 312 return;
314 } 313 }
315 314
316 content::RenderFrameHost* render_frame_host = 315 content::RenderFrameHost* render_frame_host =
317 content::RenderFrameHost::FromID(renderer_id, render_frame_id); 316 content::RenderFrameHost::FromID(renderer_id, render_frame_id);
318 if (!render_frame_host) 317 if (!render_frame_host)
319 return; 318 return;
320 319
321 content::WebContents* web_contents = 320 content::WebContents* web_contents =
322 content::WebContents::FromRenderFrameHost(render_frame_host); 321 content::WebContents::FromRenderFrameHost(render_frame_host);
323 if (!web_contents) 322 if (!web_contents)
324 return; 323 return;
325 324
326 // TODO(miguelg) need to send this over IPC when bubble support is 325 // TODO(miguelg) need to send this over IPC when bubble support is
327 // implemented. 326 // implemented.
328 int bridge_id = -1; 327 int bridge_id = -1;
329 328
330 const PermissionRequestID id( 329 const PermissionRequestID id(
331 renderer_id, web_contents->GetRoutingID(), bridge_id, GURL()); 330 renderer_id, web_contents->GetRoutingID(), bridge_id, GURL());
332 331
333 PushMessagingPermissionContext* permission_context = 332 PushMessagingPermissionContext* permission_context =
334 PushMessagingPermissionContextFactory::GetForProfile(profile_); 333 PushMessagingPermissionContextFactory::GetForProfile(profile_);
335 334
336 if (permission_context == NULL || !user_visible) { 335 if (permission_context == NULL || !user_visible) {
337 RegisterEnd(callback, 336 SubscribeEnd(callback,
338 std::string(), 337 std::string(),
339 content::PUSH_REGISTRATION_STATUS_PERMISSION_DENIED); 338 content::PUSH_REGISTRATION_STATUS_PERMISSION_DENIED);
340 return; 339 return;
341 } 340 }
342 341
343 // TODO(miguelg): Consider the value of |user_visible| when making the 342 // TODO(miguelg): Consider the value of |user_visible| when making the
344 // permission request. 343 // permission request.
345 // TODO(mlamouri): Move requesting Push permission over to using Mojo, and 344 // TODO(mlamouri): Move requesting Push permission over to using Mojo, and
346 // re-introduce the ability of |user_gesture| when bubbles require this. 345 // re-introduce the ability of |user_gesture| when bubbles require this.
347 // https://crbug.com/423770. 346 // https://crbug.com/423770.
348 permission_context->RequestPermission( 347 permission_context->RequestPermission(
349 web_contents, id, requesting_origin, true /* user_gesture */, 348 web_contents, id, requesting_origin, true /* user_gesture */,
350 base::Bind(&PushMessagingServiceImpl::DidRequestPermission, 349 base::Bind(&PushMessagingServiceImpl::DidRequestPermission,
351 weak_factory_.GetWeakPtr(), app_identifier, sender_id, 350 weak_factory_.GetWeakPtr(), app_identifier, sender_id,
352 callback)); 351 callback));
353 } 352 }
354 353
355 void PushMessagingServiceImpl::RegisterFromWorker( 354 void PushMessagingServiceImpl::SubscribeFromWorker(
356 const GURL& requesting_origin, 355 const GURL& requesting_origin,
357 int64 service_worker_registration_id, 356 int64 service_worker_registration_id,
358 const std::string& sender_id, 357 const std::string& sender_id,
359 bool user_visible, 358 bool user_visible,
360 const content::PushMessagingService::RegisterCallback& register_callback) { 359 const content::PushMessagingService::RegisterCallback& register_callback) {
361 PushMessagingAppIdentifier app_identifier = 360 PushMessagingAppIdentifier app_identifier =
362 PushMessagingAppIdentifier::Generate(requesting_origin, 361 PushMessagingAppIdentifier::Generate(requesting_origin,
363 service_worker_registration_id); 362 service_worker_registration_id);
364 363
365 if (profile_->GetPrefs()->GetInteger( 364 if (profile_->GetPrefs()->GetInteger(
366 prefs::kPushMessagingRegistrationCount) >= kMaxRegistrations) { 365 prefs::kPushMessagingRegistrationCount) >= kMaxRegistrations) {
367 RegisterEnd(register_callback, std::string(), 366 SubscribeEnd(register_callback, std::string(),
368 content::PUSH_REGISTRATION_STATUS_LIMIT_REACHED); 367 content::PUSH_REGISTRATION_STATUS_LIMIT_REACHED);
369 return; 368 return;
370 } 369 }
371 370
372 // TODO(peter): Consider |user_visible| when getting the permission status 371 // TODO(peter): Consider |user_visible| when getting the permission status
373 // for registering from a worker. 372 // for registering from a worker.
374 373
375 GURL embedding_origin = requesting_origin; 374 GURL embedding_origin = requesting_origin;
376 blink::WebPushPermissionStatus permission_status = 375 blink::WebPushPermissionStatus permission_status =
377 PushMessagingServiceImpl::GetPermissionStatus(requesting_origin, 376 PushMessagingServiceImpl::GetPermissionStatus(requesting_origin,
378 embedding_origin, 377 embedding_origin,
379 user_visible); 378 user_visible);
380 if (permission_status != blink::WebPushPermissionStatusGranted) { 379 if (permission_status != blink::WebPushPermissionStatusGranted) {
381 RegisterEnd(register_callback, std::string(), 380 SubscribeEnd(register_callback, std::string(),
382 content::PUSH_REGISTRATION_STATUS_PERMISSION_DENIED); 381 content::PUSH_REGISTRATION_STATUS_PERMISSION_DENIED);
383 return; 382 return;
384 } 383 }
385 384
386 IncreasePushRegistrationCount(1, true /* is_pending */); 385 IncreasePushSubscriptionCount(1, true /* is_pending */);
387 std::vector<std::string> sender_ids(1, sender_id); 386 std::vector<std::string> sender_ids(1, sender_id);
388 GetGCMDriver()->Register( 387 GetGCMDriver()->Register(app_identifier.app_id(), sender_ids,
389 app_identifier.app_id(), sender_ids, 388 base::Bind(&PushMessagingServiceImpl::DidSubscribe,
390 base::Bind(&PushMessagingServiceImpl::DidRegister, 389 weak_factory_.GetWeakPtr(),
391 weak_factory_.GetWeakPtr(), 390 app_identifier, register_callback));
392 app_identifier, register_callback));
393 } 391 }
394 392
395 blink::WebPushPermissionStatus PushMessagingServiceImpl::GetPermissionStatus( 393 blink::WebPushPermissionStatus PushMessagingServiceImpl::GetPermissionStatus(
396 const GURL& requesting_origin, 394 const GURL& requesting_origin,
397 const GURL& embedding_origin, 395 const GURL& embedding_origin,
398 bool user_visible) { 396 bool user_visible) {
399 // TODO(peter): Consider |user_visible| when checking Push permission. 397 // TODO(peter): Consider |user_visible| when checking Push permission.
400 398
401 PushMessagingPermissionContext* permission_context = 399 PushMessagingPermissionContext* permission_context =
402 PushMessagingPermissionContextFactory::GetForProfile(profile_); 400 PushMessagingPermissionContextFactory::GetForProfile(profile_);
403 return ToPushPermission(permission_context->GetPermissionStatus( 401 return ToPushPermission(permission_context->GetPermissionStatus(
404 requesting_origin, embedding_origin)); 402 requesting_origin, embedding_origin));
405 } 403 }
406 404
407 bool PushMessagingServiceImpl::SupportNonVisibleMessages() { 405 bool PushMessagingServiceImpl::SupportNonVisibleMessages() {
408 return false; 406 return false;
409 } 407 }
410 408
411 void PushMessagingServiceImpl::RegisterEnd( 409 void PushMessagingServiceImpl::SubscribeEnd(
412 const content::PushMessagingService::RegisterCallback& callback, 410 const content::PushMessagingService::RegisterCallback& callback,
413 const std::string& registration_id, 411 const std::string& subscription_id,
414 content::PushRegistrationStatus status) { 412 content::PushRegistrationStatus status) {
415 callback.Run(registration_id, status); 413 callback.Run(subscription_id, status);
416 } 414 }
417 415
418 void PushMessagingServiceImpl::DidRegister( 416 void PushMessagingServiceImpl::DidSubscribe(
419 const PushMessagingAppIdentifier& app_identifier, 417 const PushMessagingAppIdentifier& app_identifier,
420 const content::PushMessagingService::RegisterCallback& callback, 418 const content::PushMessagingService::RegisterCallback& callback,
421 const std::string& registration_id, 419 const std::string& subscription_id,
422 gcm::GCMClient::Result result) { 420 gcm::GCMClient::Result result) {
423 content::PushRegistrationStatus status = 421 content::PushRegistrationStatus status =
424 content::PUSH_REGISTRATION_STATUS_SERVICE_ERROR; 422 content::PUSH_REGISTRATION_STATUS_SERVICE_ERROR;
425 switch (result) { 423 switch (result) {
426 case gcm::GCMClient::SUCCESS: 424 case gcm::GCMClient::SUCCESS:
427 status = content::PUSH_REGISTRATION_STATUS_SUCCESS_FROM_PUSH_SERVICE; 425 status = content::PUSH_REGISTRATION_STATUS_SUCCESS_FROM_PUSH_SERVICE;
428 app_identifier.PersistToPrefs(profile_); 426 app_identifier.PersistToPrefs(profile_);
429 IncreasePushRegistrationCount(1, false /* is_pending */); 427 IncreasePushSubscriptionCount(1, false /* is_pending */);
430 break; 428 break;
431 case gcm::GCMClient::INVALID_PARAMETER: 429 case gcm::GCMClient::INVALID_PARAMETER:
432 case gcm::GCMClient::GCM_DISABLED: 430 case gcm::GCMClient::GCM_DISABLED:
433 case gcm::GCMClient::ASYNC_OPERATION_PENDING: 431 case gcm::GCMClient::ASYNC_OPERATION_PENDING:
434 case gcm::GCMClient::SERVER_ERROR: 432 case gcm::GCMClient::SERVER_ERROR:
435 case gcm::GCMClient::UNKNOWN_ERROR: 433 case gcm::GCMClient::UNKNOWN_ERROR:
436 status = content::PUSH_REGISTRATION_STATUS_SERVICE_ERROR; 434 status = content::PUSH_REGISTRATION_STATUS_SERVICE_ERROR;
437 break; 435 break;
438 case gcm::GCMClient::NETWORK_ERROR: 436 case gcm::GCMClient::NETWORK_ERROR:
439 case gcm::GCMClient::TTL_EXCEEDED: 437 case gcm::GCMClient::TTL_EXCEEDED:
440 status = content::PUSH_REGISTRATION_STATUS_NETWORK_ERROR; 438 status = content::PUSH_REGISTRATION_STATUS_NETWORK_ERROR;
441 break; 439 break;
442 } 440 }
443 RegisterEnd(callback, registration_id, status); 441 SubscribeEnd(callback, subscription_id, status);
444 DecreasePushRegistrationCount(1, true /* was_pending */); 442 DecreasePushSubscriptionCount(1, true /* was_pending */);
445 } 443 }
446 444
447 void PushMessagingServiceImpl::DidRequestPermission( 445 void PushMessagingServiceImpl::DidRequestPermission(
448 const PushMessagingAppIdentifier& app_identifier, 446 const PushMessagingAppIdentifier& app_identifier,
449 const std::string& sender_id, 447 const std::string& sender_id,
450 const content::PushMessagingService::RegisterCallback& register_callback, 448 const content::PushMessagingService::RegisterCallback& register_callback,
451 ContentSetting content_setting) { 449 ContentSetting content_setting) {
452 if (content_setting != CONTENT_SETTING_ALLOW) { 450 if (content_setting != CONTENT_SETTING_ALLOW) {
453 RegisterEnd(register_callback, 451 SubscribeEnd(register_callback,
454 std::string(), 452 std::string(),
455 content::PUSH_REGISTRATION_STATUS_PERMISSION_DENIED); 453 content::PUSH_REGISTRATION_STATUS_PERMISSION_DENIED);
456 return; 454 return;
457 } 455 }
458 456
459 IncreasePushRegistrationCount(1, true /* is_pending */); 457 IncreasePushSubscriptionCount(1, true /* is_pending */);
460 std::vector<std::string> sender_ids(1, sender_id); 458 std::vector<std::string> sender_ids(1, sender_id);
461 GetGCMDriver()->Register( 459 GetGCMDriver()->Register(app_identifier.app_id(), sender_ids,
462 app_identifier.app_id(), 460 base::Bind(&PushMessagingServiceImpl::DidSubscribe,
463 sender_ids, 461 weak_factory_.GetWeakPtr(),
464 base::Bind(&PushMessagingServiceImpl::DidRegister, 462 app_identifier, register_callback));
465 weak_factory_.GetWeakPtr(),
466 app_identifier, register_callback));
467 } 463 }
468 464
469 // Unregister methods ---------------------------------------------------------- 465 // Unsubscribe methods ---------------------------------------------------------
470 466
471 void PushMessagingServiceImpl::Unregister( 467 void PushMessagingServiceImpl::Unsubscribe(
472 const GURL& requesting_origin, 468 const GURL& requesting_origin,
473 int64 service_worker_registration_id, 469 int64 service_worker_registration_id,
474 const std::string& sender_id, 470 const std::string& sender_id,
475 const content::PushMessagingService::UnregisterCallback& callback) { 471 const content::PushMessagingService::UnregisterCallback& callback) {
476 PushMessagingAppIdentifier app_identifier = 472 PushMessagingAppIdentifier app_identifier =
477 PushMessagingAppIdentifier::FindByServiceWorker( 473 PushMessagingAppIdentifier::FindByServiceWorker(
478 profile_, requesting_origin, service_worker_registration_id); 474 profile_, requesting_origin, service_worker_registration_id);
479 if (app_identifier.is_null()) { 475 if (app_identifier.is_null()) {
480 if (!callback.is_null()) { 476 if (!callback.is_null()) {
481 callback.Run( 477 callback.Run(
482 content::PUSH_UNREGISTRATION_STATUS_SUCCESS_WAS_NOT_REGISTERED); 478 content::PUSH_UNREGISTRATION_STATUS_SUCCESS_WAS_NOT_REGISTERED);
483 } 479 }
484 return; 480 return;
485 } 481 }
486 482
487 Unregister(app_identifier.app_id(), sender_id, callback); 483 Unsubscribe(app_identifier.app_id(), sender_id, callback);
488 } 484 }
489 485
490 void PushMessagingServiceImpl::Unregister( 486 void PushMessagingServiceImpl::Unsubscribe(
491 const std::string& app_id, 487 const std::string& app_id,
492 const std::string& sender_id, 488 const std::string& sender_id,
493 const content::PushMessagingService::UnregisterCallback& callback) { 489 const content::PushMessagingService::UnregisterCallback& callback) {
494 // Delete the mapping for this app_id, to guarantee that no messages get 490 // Delete the mapping for this app_id, to guarantee that no messages get
495 // delivered in future (even if unregistration fails). 491 // delivered in future (even if unregistration fails).
496 // TODO(johnme): Instead of deleting these app ids, store them elsewhere, and 492 // TODO(johnme): Instead of deleting these app ids, store them elsewhere, and
497 // retry unregistration if it fails due to network errors (crbug.com/465399). 493 // retry unregistration if it fails due to network errors (crbug.com/465399).
498 PushMessagingAppIdentifier app_identifier = 494 PushMessagingAppIdentifier app_identifier =
499 PushMessagingAppIdentifier::FindByAppId(profile_, app_id); 495 PushMessagingAppIdentifier::FindByAppId(profile_, app_id);
500 bool was_registered = !app_identifier.is_null(); 496 bool was_registered = !app_identifier.is_null();
501 if (was_registered) 497 if (was_registered)
502 app_identifier.DeleteFromPrefs(profile_); 498 app_identifier.DeleteFromPrefs(profile_);
503 499
504 const auto& unregister_callback = 500 const auto& unregister_callback =
505 base::Bind(&PushMessagingServiceImpl::DidUnregister, 501 base::Bind(&PushMessagingServiceImpl::DidUnsubscribe,
506 weak_factory_.GetWeakPtr(), 502 weak_factory_.GetWeakPtr(), was_registered, callback);
507 was_registered, callback);
508 #if defined(OS_ANDROID) 503 #if defined(OS_ANDROID)
509 // On Android the backend is different, and requires the original sender_id. 504 // On Android the backend is different, and requires the original sender_id.
510 // UnregisterBecausePermissionRevoked sometimes calls us with an empty one. 505 // UnsubscribeBecausePermissionRevoked sometimes calls us with an empty one.
511 if (sender_id.empty()) 506 if (sender_id.empty())
512 unregister_callback.Run(gcm::GCMClient::INVALID_PARAMETER); 507 unregister_callback.Run(gcm::GCMClient::INVALID_PARAMETER);
513 else 508 else
514 GetGCMDriver()->UnregisterWithSenderId(app_id, sender_id, 509 GetGCMDriver()->UnregisterWithSenderId(app_id, sender_id,
515 unregister_callback); 510 unregister_callback);
516 #else 511 #else
517 GetGCMDriver()->Unregister(app_id, unregister_callback); 512 GetGCMDriver()->Unregister(app_id, unregister_callback);
518 #endif 513 #endif
519 } 514 }
520 515
521 void PushMessagingServiceImpl::DidUnregister( 516 void PushMessagingServiceImpl::DidUnsubscribe(
522 bool was_registered, 517 bool was_subscribed,
523 const content::PushMessagingService::UnregisterCallback& callback, 518 const content::PushMessagingService::UnregisterCallback& callback,
524 gcm::GCMClient::Result result) { 519 gcm::GCMClient::Result result) {
525 if (was_registered) 520 if (was_subscribed)
526 DecreasePushRegistrationCount(1, false /* was_pending */); 521 DecreasePushSubscriptionCount(1, false /* was_pending */);
527 522
528 // Internal calls pass a null callback. 523 // Internal calls pass a null callback.
529 if (callback.is_null()) 524 if (callback.is_null())
530 return; 525 return;
531 526
532 if (!was_registered) { 527 if (!was_subscribed) {
533 callback.Run( 528 callback.Run(
534 content::PUSH_UNREGISTRATION_STATUS_SUCCESS_WAS_NOT_REGISTERED); 529 content::PUSH_UNREGISTRATION_STATUS_SUCCESS_WAS_NOT_REGISTERED);
535 return; 530 return;
536 } 531 }
537 switch (result) { 532 switch (result) {
538 case gcm::GCMClient::SUCCESS: 533 case gcm::GCMClient::SUCCESS:
539 callback.Run(content::PUSH_UNREGISTRATION_STATUS_SUCCESS_UNREGISTERED); 534 callback.Run(content::PUSH_UNREGISTRATION_STATUS_SUCCESS_UNREGISTERED);
540 break; 535 break;
541 case gcm::GCMClient::INVALID_PARAMETER: 536 case gcm::GCMClient::INVALID_PARAMETER:
542 case gcm::GCMClient::GCM_DISABLED: 537 case gcm::GCMClient::GCM_DISABLED:
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
587 582
588 if (HasPermission(app_identifier.origin())) { 583 if (HasPermission(app_identifier.origin())) {
589 barrier_closure.Run(); 584 barrier_closure.Run();
590 continue; 585 continue;
591 } 586 }
592 587
593 GetSenderId( 588 GetSenderId(
594 profile_, app_identifier.origin(), 589 profile_, app_identifier.origin(),
595 app_identifier.service_worker_registration_id(), 590 app_identifier.service_worker_registration_id(),
596 base::Bind( 591 base::Bind(
597 &PushMessagingServiceImpl::UnregisterBecausePermissionRevoked, 592 &PushMessagingServiceImpl::UnsubscribeBecausePermissionRevoked,
598 weak_factory_.GetWeakPtr(), app_identifier, barrier_closure)); 593 weak_factory_.GetWeakPtr(), app_identifier, barrier_closure));
599 } 594 }
600 } 595 }
601 596
602 void PushMessagingServiceImpl::UnregisterBecausePermissionRevoked( 597 void PushMessagingServiceImpl::UnsubscribeBecausePermissionRevoked(
603 const PushMessagingAppIdentifier& app_identifier, 598 const PushMessagingAppIdentifier& app_identifier,
604 const base::Closure& closure, const std::string& sender_id, 599 const base::Closure& closure,
605 bool success, bool not_found) { 600 const std::string& sender_id,
601 bool success,
602 bool not_found) {
606 base::Closure barrier_closure = base::BarrierClosure(2, closure); 603 base::Closure barrier_closure = base::BarrierClosure(2, closure);
607 604
608 // Unregister the PushMessagingAppIdentifier with the push service. 605 // Unsubscribe the PushMessagingAppIdentifier with the push service.
609 // It's possible for GetSenderId to have failed and sender_id to be empty, if 606 // It's possible for GetSenderId to have failed and sender_id to be empty, if
610 // cookies (and the SW database) for an origin got cleared before permissions 607 // cookies (and the SW database) for an origin got cleared before permissions
611 // are cleared for the origin. In that case Unregister will just delete the 608 // are cleared for the origin. In that case Unsubscribe will just delete the
612 // app identifier to block future messages. 609 // app identifier to block future messages.
613 // TODO(johnme): Auto-unregister before SW DB is cleared 610 // TODO(johnme): Auto-unregister before SW DB is cleared
614 // (https://crbug.com/402458). 611 // (https://crbug.com/402458).
615 Unregister(app_identifier.app_id(), sender_id, 612 Unsubscribe(app_identifier.app_id(), sender_id,
616 base::Bind(&UnregisterCallbackToClosure, barrier_closure)); 613 base::Bind(&UnregisterCallbackToClosure, barrier_closure));
617 614
618 // Clear the associated service worker push registration id. 615 // Clear the associated service worker push registration id.
619 ClearPushRegistrationID(profile_, app_identifier.origin(), 616 ClearPushSubscriptionID(profile_, app_identifier.origin(),
620 app_identifier.service_worker_registration_id(), 617 app_identifier.service_worker_registration_id(),
621 barrier_closure); 618 barrier_closure);
622 } 619 }
623 620
624 void PushMessagingServiceImpl::SetContentSettingChangedCallbackForTesting( 621 void PushMessagingServiceImpl::SetContentSettingChangedCallbackForTesting(
625 const base::Closure& callback) { 622 const base::Closure& callback) {
626 content_setting_changed_callback_for_testing_ = callback; 623 content_setting_changed_callback_for_testing_ = callback;
627 } 624 }
628 625
629 // KeyedService methods ------------------------------------------------------- 626 // KeyedService methods -------------------------------------------------------
(...skipping 13 matching lines...) Expand all
643 CONTENT_SETTING_ALLOW; 640 CONTENT_SETTING_ALLOW;
644 } 641 }
645 642
646 gcm::GCMDriver* PushMessagingServiceImpl::GetGCMDriver() const { 643 gcm::GCMDriver* PushMessagingServiceImpl::GetGCMDriver() const {
647 gcm::GCMProfileService* gcm_profile_service = 644 gcm::GCMProfileService* gcm_profile_service =
648 gcm::GCMProfileServiceFactory::GetForProfile(profile_); 645 gcm::GCMProfileServiceFactory::GetForProfile(profile_);
649 CHECK(gcm_profile_service); 646 CHECK(gcm_profile_service);
650 CHECK(gcm_profile_service->driver()); 647 CHECK(gcm_profile_service->driver());
651 return gcm_profile_service->driver(); 648 return gcm_profile_service->driver();
652 } 649 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698