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

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

Issue 1210283005: Introduce the PushSubscription.curve25519dh attribute (2/3) (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 5 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 314 matching lines...) Expand 10 before | Expand all | Expand 10 after
325 int renderer_id, 325 int renderer_id,
326 int render_frame_id, 326 int render_frame_id,
327 bool user_visible, 327 bool user_visible,
328 const content::PushMessagingService::RegisterCallback& callback) { 328 const content::PushMessagingService::RegisterCallback& callback) {
329 PushMessagingAppIdentifier app_identifier = 329 PushMessagingAppIdentifier app_identifier =
330 PushMessagingAppIdentifier::Generate(requesting_origin, 330 PushMessagingAppIdentifier::Generate(requesting_origin,
331 service_worker_registration_id); 331 service_worker_registration_id);
332 332
333 if (push_subscription_count_ + pending_push_subscription_count_ >= 333 if (push_subscription_count_ + pending_push_subscription_count_ >=
334 kMaxRegistrations) { 334 kMaxRegistrations) {
335 SubscribeEnd(callback, std::string(), 335 SubscribeEndWithError(callback,
336 content::PUSH_REGISTRATION_STATUS_LIMIT_REACHED); 336 content::PUSH_REGISTRATION_STATUS_LIMIT_REACHED);
337 return; 337 return;
338 } 338 }
339 339
340 content::RenderFrameHost* render_frame_host = 340 content::RenderFrameHost* render_frame_host =
341 content::RenderFrameHost::FromID(renderer_id, render_frame_id); 341 content::RenderFrameHost::FromID(renderer_id, render_frame_id);
342 content::WebContents* web_contents = 342 content::WebContents* web_contents =
343 content::WebContents::FromRenderFrameHost(render_frame_host); 343 content::WebContents::FromRenderFrameHost(render_frame_host);
344 if (!web_contents) 344 if (!web_contents)
345 return; 345 return;
346 346
347 // TODO(miguelg) need to send this over IPC when bubble support is 347 // TODO(miguelg) need to send this over IPC when bubble support is
348 // implemented. 348 // implemented.
349 int request_id = -1; 349 int request_id = -1;
350 350
351 const PermissionRequestID id( 351 const PermissionRequestID id(
352 renderer_id, render_frame_id, request_id, GURL()); 352 renderer_id, render_frame_id, request_id, GURL());
353 353
354 PushMessagingPermissionContext* permission_context = 354 PushMessagingPermissionContext* permission_context =
355 PushMessagingPermissionContextFactory::GetForProfile(profile_); 355 PushMessagingPermissionContextFactory::GetForProfile(profile_);
356 DCHECK(permission_context); 356 DCHECK(permission_context);
357 357
358 if (!user_visible) { 358 if (!user_visible) {
359 web_contents->GetMainFrame()->AddMessageToConsole( 359 web_contents->GetMainFrame()->AddMessageToConsole(
360 content::CONSOLE_MESSAGE_LEVEL_ERROR, 360 content::CONSOLE_MESSAGE_LEVEL_ERROR,
361 kSilentPushUnsupportedMessage); 361 kSilentPushUnsupportedMessage);
362 362
363 SubscribeEnd(callback, 363 SubscribeEndWithError(callback,
364 std::string(), 364 content::PUSH_REGISTRATION_STATUS_PERMISSION_DENIED);
365 content::PUSH_REGISTRATION_STATUS_PERMISSION_DENIED);
366 return; 365 return;
367 } 366 }
368 367
369 // TODO(miguelg): Consider the value of |user_visible| when making the 368 // TODO(miguelg): Consider the value of |user_visible| when making the
370 // permission request. 369 // permission request.
371 // TODO(mlamouri): Move requesting Push permission over to using Mojo, and 370 // TODO(mlamouri): Move requesting Push permission over to using Mojo, and
372 // re-introduce the ability of |user_gesture| when bubbles require this. 371 // re-introduce the ability of |user_gesture| when bubbles require this.
373 // https://crbug.com/423770. 372 // https://crbug.com/423770.
374 permission_context->RequestPermission( 373 permission_context->RequestPermission(
375 web_contents, id, requesting_origin, true /* user_gesture */, 374 web_contents, id, requesting_origin, true /* user_gesture */,
376 base::Bind(&PushMessagingServiceImpl::DidRequestPermission, 375 base::Bind(&PushMessagingServiceImpl::DidRequestPermission,
377 weak_factory_.GetWeakPtr(), app_identifier, sender_id, 376 weak_factory_.GetWeakPtr(), app_identifier, sender_id,
378 callback)); 377 callback));
379 } 378 }
380 379
381 void PushMessagingServiceImpl::SubscribeFromWorker( 380 void PushMessagingServiceImpl::SubscribeFromWorker(
382 const GURL& requesting_origin, 381 const GURL& requesting_origin,
383 int64 service_worker_registration_id, 382 int64 service_worker_registration_id,
384 const std::string& sender_id, 383 const std::string& sender_id,
385 bool user_visible, 384 bool user_visible,
386 const content::PushMessagingService::RegisterCallback& register_callback) { 385 const content::PushMessagingService::RegisterCallback& register_callback) {
387 PushMessagingAppIdentifier app_identifier = 386 PushMessagingAppIdentifier app_identifier =
388 PushMessagingAppIdentifier::Generate(requesting_origin, 387 PushMessagingAppIdentifier::Generate(requesting_origin,
389 service_worker_registration_id); 388 service_worker_registration_id);
390 389
391 if (profile_->GetPrefs()->GetInteger( 390 if (profile_->GetPrefs()->GetInteger(
392 prefs::kPushMessagingRegistrationCount) >= kMaxRegistrations) { 391 prefs::kPushMessagingRegistrationCount) >= kMaxRegistrations) {
393 SubscribeEnd(register_callback, std::string(), 392 SubscribeEndWithError(register_callback,
394 content::PUSH_REGISTRATION_STATUS_LIMIT_REACHED); 393 content::PUSH_REGISTRATION_STATUS_LIMIT_REACHED);
395 return; 394 return;
396 } 395 }
397 396
398 // TODO(peter): Consider |user_visible| when getting the permission status 397 // TODO(peter): Consider |user_visible| when getting the permission status
399 // for registering from a worker. 398 // for registering from a worker.
400 399
401 GURL embedding_origin = requesting_origin; 400 GURL embedding_origin = requesting_origin;
402 blink::WebPushPermissionStatus permission_status = 401 blink::WebPushPermissionStatus permission_status =
403 PushMessagingServiceImpl::GetPermissionStatus(requesting_origin, 402 PushMessagingServiceImpl::GetPermissionStatus(requesting_origin,
404 embedding_origin, 403 embedding_origin,
405 user_visible); 404 user_visible);
406 if (permission_status != blink::WebPushPermissionStatusGranted) { 405 if (permission_status != blink::WebPushPermissionStatusGranted) {
407 SubscribeEnd(register_callback, std::string(), 406 SubscribeEndWithError(register_callback,
408 content::PUSH_REGISTRATION_STATUS_PERMISSION_DENIED); 407 content::PUSH_REGISTRATION_STATUS_PERMISSION_DENIED);
409 return; 408 return;
410 } 409 }
411 410
412 IncreasePushSubscriptionCount(1, true /* is_pending */); 411 IncreasePushSubscriptionCount(1, true /* is_pending */);
413 std::vector<std::string> sender_ids(1, sender_id); 412 std::vector<std::string> sender_ids(1, sender_id);
414 GetGCMDriver()->Register(app_identifier.app_id(), sender_ids, 413 GetGCMDriver()->Register(app_identifier.app_id(), sender_ids,
415 base::Bind(&PushMessagingServiceImpl::DidSubscribe, 414 base::Bind(&PushMessagingServiceImpl::DidSubscribe,
416 weak_factory_.GetWeakPtr(), 415 weak_factory_.GetWeakPtr(),
417 app_identifier, register_callback)); 416 app_identifier, register_callback));
418 } 417 }
419 418
419 void PushMessagingServiceImpl::GetPublicEncryptionKey(
johnme 2015/07/09 16:02:53 Nit: Please move this to a new section of the .cc
Peter Beverloo 2015/07/09 18:54:17 Done.
420 const GURL& origin,
421 int64_t service_worker_registration_id,
422 const PushMessagingService::PublicKeyCallback& callback) {
423 // TODO(peter): Get the public key from the GCM Driver. Right now we have to
424 // return success=true here, otherwise subscriptions would fail.
425 callback.Run(true /* success */, std::vector<uint8_t>());
426 }
427
420 blink::WebPushPermissionStatus PushMessagingServiceImpl::GetPermissionStatus( 428 blink::WebPushPermissionStatus PushMessagingServiceImpl::GetPermissionStatus(
421 const GURL& requesting_origin, 429 const GURL& requesting_origin,
422 const GURL& embedding_origin, 430 const GURL& embedding_origin,
423 bool user_visible) { 431 bool user_visible) {
424 // TODO(peter): Consider |user_visible| when checking Push permission. 432 // TODO(peter): Consider |user_visible| when checking Push permission.
425 433
426 PushMessagingPermissionContext* permission_context = 434 PushMessagingPermissionContext* permission_context =
427 PushMessagingPermissionContextFactory::GetForProfile(profile_); 435 PushMessagingPermissionContextFactory::GetForProfile(profile_);
428 return ToPushPermission(permission_context->GetPermissionStatus( 436 return ToPushPermission(permission_context->GetPermissionStatus(
429 requesting_origin, embedding_origin)); 437 requesting_origin, embedding_origin));
430 } 438 }
431 439
432 bool PushMessagingServiceImpl::SupportNonVisibleMessages() { 440 bool PushMessagingServiceImpl::SupportNonVisibleMessages() {
433 return false; 441 return false;
434 } 442 }
435 443
436 void PushMessagingServiceImpl::SubscribeEnd( 444 void PushMessagingServiceImpl::SubscribeEnd(
437 const content::PushMessagingService::RegisterCallback& callback, 445 const content::PushMessagingService::RegisterCallback& callback,
438 const std::string& subscription_id, 446 const std::string& subscription_id,
447 const std::vector<uint8_t>& curve25519dh,
439 content::PushRegistrationStatus status) { 448 content::PushRegistrationStatus status) {
440 callback.Run(subscription_id, status); 449 callback.Run(subscription_id, curve25519dh, status);
450 }
451
452 void PushMessagingServiceImpl::SubscribeEndWithError(
453 const content::PushMessagingService::RegisterCallback& callback,
454 content::PushRegistrationStatus status) {
455 SubscribeEnd(callback, std::string() /* subscription_id */,
456 std::vector<uint8_t>() /* curve25519dh */, status);
441 } 457 }
442 458
443 void PushMessagingServiceImpl::DidSubscribe( 459 void PushMessagingServiceImpl::DidSubscribe(
444 const PushMessagingAppIdentifier& app_identifier, 460 const PushMessagingAppIdentifier& app_identifier,
445 const content::PushMessagingService::RegisterCallback& callback, 461 const content::PushMessagingService::RegisterCallback& callback,
446 const std::string& subscription_id, 462 const std::string& subscription_id,
447 gcm::GCMClient::Result result) { 463 gcm::GCMClient::Result result) {
448 content::PushRegistrationStatus status = 464 content::PushRegistrationStatus status =
449 content::PUSH_REGISTRATION_STATUS_SERVICE_ERROR; 465 content::PUSH_REGISTRATION_STATUS_SERVICE_ERROR;
450 switch (result) { 466 switch (result) {
451 case gcm::GCMClient::SUCCESS: 467 case gcm::GCMClient::SUCCESS:
452 status = content::PUSH_REGISTRATION_STATUS_SUCCESS_FROM_PUSH_SERVICE; 468 status = content::PUSH_REGISTRATION_STATUS_SUCCESS_FROM_PUSH_SERVICE;
453 app_identifier.PersistToPrefs(profile_); 469 app_identifier.PersistToPrefs(profile_);
454 IncreasePushSubscriptionCount(1, false /* is_pending */); 470 IncreasePushSubscriptionCount(1, false /* is_pending */);
455 break; 471 break;
456 case gcm::GCMClient::INVALID_PARAMETER: 472 case gcm::GCMClient::INVALID_PARAMETER:
457 case gcm::GCMClient::GCM_DISABLED: 473 case gcm::GCMClient::GCM_DISABLED:
458 case gcm::GCMClient::ASYNC_OPERATION_PENDING: 474 case gcm::GCMClient::ASYNC_OPERATION_PENDING:
459 case gcm::GCMClient::SERVER_ERROR: 475 case gcm::GCMClient::SERVER_ERROR:
460 case gcm::GCMClient::UNKNOWN_ERROR: 476 case gcm::GCMClient::UNKNOWN_ERROR:
461 status = content::PUSH_REGISTRATION_STATUS_SERVICE_ERROR; 477 status = content::PUSH_REGISTRATION_STATUS_SERVICE_ERROR;
462 break; 478 break;
463 case gcm::GCMClient::NETWORK_ERROR: 479 case gcm::GCMClient::NETWORK_ERROR:
464 case gcm::GCMClient::TTL_EXCEEDED: 480 case gcm::GCMClient::TTL_EXCEEDED:
465 status = content::PUSH_REGISTRATION_STATUS_NETWORK_ERROR; 481 status = content::PUSH_REGISTRATION_STATUS_NETWORK_ERROR;
466 break; 482 break;
467 } 483 }
468 SubscribeEnd(callback, subscription_id, status); 484
485 // TODO(peter): Hook up getting the keys from the GCM Driver.
486 std::vector<uint8_t> curve25519dh;
487
488 SubscribeEnd(callback, subscription_id, curve25519dh, status);
johnme 2015/07/09 16:02:53 Nit: it feels slightly inconsistent that you still
Peter Beverloo 2015/07/09 18:54:16 The alternative would be to return from the gcm::G
469 DecreasePushSubscriptionCount(1, true /* was_pending */); 489 DecreasePushSubscriptionCount(1, true /* was_pending */);
470 } 490 }
471 491
472 void PushMessagingServiceImpl::DidRequestPermission( 492 void PushMessagingServiceImpl::DidRequestPermission(
473 const PushMessagingAppIdentifier& app_identifier, 493 const PushMessagingAppIdentifier& app_identifier,
474 const std::string& sender_id, 494 const std::string& sender_id,
475 const content::PushMessagingService::RegisterCallback& register_callback, 495 const content::PushMessagingService::RegisterCallback& register_callback,
476 ContentSetting content_setting) { 496 ContentSetting content_setting) {
477 if (content_setting != CONTENT_SETTING_ALLOW) { 497 if (content_setting != CONTENT_SETTING_ALLOW) {
478 SubscribeEnd(register_callback, 498 SubscribeEndWithError(register_callback,
479 std::string(), 499 content::PUSH_REGISTRATION_STATUS_PERMISSION_DENIED);
480 content::PUSH_REGISTRATION_STATUS_PERMISSION_DENIED);
481 return; 500 return;
482 } 501 }
483 502
484 IncreasePushSubscriptionCount(1, true /* is_pending */); 503 IncreasePushSubscriptionCount(1, true /* is_pending */);
485 std::vector<std::string> sender_ids(1, sender_id); 504 std::vector<std::string> sender_ids(1, sender_id);
486 GetGCMDriver()->Register(app_identifier.app_id(), sender_ids, 505 GetGCMDriver()->Register(app_identifier.app_id(), sender_ids,
487 base::Bind(&PushMessagingServiceImpl::DidSubscribe, 506 base::Bind(&PushMessagingServiceImpl::DidSubscribe,
488 weak_factory_.GetWeakPtr(), 507 weak_factory_.GetWeakPtr(),
489 app_identifier, register_callback)); 508 app_identifier, register_callback));
490 } 509 }
(...skipping 176 matching lines...) Expand 10 before | Expand all | Expand 10 after
667 CONTENT_SETTING_ALLOW; 686 CONTENT_SETTING_ALLOW;
668 } 687 }
669 688
670 gcm::GCMDriver* PushMessagingServiceImpl::GetGCMDriver() const { 689 gcm::GCMDriver* PushMessagingServiceImpl::GetGCMDriver() const {
671 gcm::GCMProfileService* gcm_profile_service = 690 gcm::GCMProfileService* gcm_profile_service =
672 gcm::GCMProfileServiceFactory::GetForProfile(profile_); 691 gcm::GCMProfileServiceFactory::GetForProfile(profile_);
673 CHECK(gcm_profile_service); 692 CHECK(gcm_profile_service);
674 CHECK(gcm_profile_service->driver()); 693 CHECK(gcm_profile_service->driver());
675 return gcm_profile_service->driver(); 694 return gcm_profile_service->driver();
676 } 695 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698