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

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: android fix 2 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 297 matching lines...) Expand 10 before | Expand all | Expand 10 after
308 const std::string& message_id) { 308 const std::string& message_id) {
309 NOTREACHED() << "The Push API shouldn't have sent messages upstream"; 309 NOTREACHED() << "The Push API shouldn't have sent messages upstream";
310 } 310 }
311 311
312 // GetPushEndpoint method ------------------------------------------------------ 312 // GetPushEndpoint method ------------------------------------------------------
313 313
314 GURL PushMessagingServiceImpl::GetPushEndpoint() { 314 GURL PushMessagingServiceImpl::GetPushEndpoint() {
315 return GURL(std::string(kPushMessagingEndpoint)); 315 return GURL(std::string(kPushMessagingEndpoint));
316 } 316 }
317 317
318 // GetPublicEncryptionKey method -----------------------------------------------
319
320 void PushMessagingServiceImpl::GetPublicEncryptionKey(
321 const GURL& origin,
322 int64_t service_worker_registration_id,
323 const PushMessagingService::PublicKeyCallback& callback) {
324 // TODO(peter): Get the public key from the GCM Driver. Right now we have to
325 // return success=true here, otherwise subscriptions would fail.
326 callback.Run(true /* success */, std::vector<uint8_t>());
327 }
328
318 // Subscribe and GetPermissionStatus methods ----------------------------------- 329 // Subscribe and GetPermissionStatus methods -----------------------------------
319 330
320 void PushMessagingServiceImpl::SubscribeFromDocument( 331 void PushMessagingServiceImpl::SubscribeFromDocument(
321 const GURL& requesting_origin, 332 const GURL& requesting_origin,
322 int64 service_worker_registration_id, 333 int64 service_worker_registration_id,
323 const std::string& sender_id, 334 const std::string& sender_id,
324 int renderer_id, 335 int renderer_id,
325 int render_frame_id, 336 int render_frame_id,
326 bool user_visible, 337 bool user_visible,
327 const content::PushMessagingService::RegisterCallback& callback) { 338 const content::PushMessagingService::RegisterCallback& callback) {
328 PushMessagingAppIdentifier app_identifier = 339 PushMessagingAppIdentifier app_identifier =
329 PushMessagingAppIdentifier::Generate(requesting_origin, 340 PushMessagingAppIdentifier::Generate(requesting_origin,
330 service_worker_registration_id); 341 service_worker_registration_id);
331 342
332 if (push_subscription_count_ + pending_push_subscription_count_ >= 343 if (push_subscription_count_ + pending_push_subscription_count_ >=
333 kMaxRegistrations) { 344 kMaxRegistrations) {
334 SubscribeEnd(callback, std::string(), 345 SubscribeEndWithError(callback,
335 content::PUSH_REGISTRATION_STATUS_LIMIT_REACHED); 346 content::PUSH_REGISTRATION_STATUS_LIMIT_REACHED);
336 return; 347 return;
337 } 348 }
338 349
339 content::RenderFrameHost* render_frame_host = 350 content::RenderFrameHost* render_frame_host =
340 content::RenderFrameHost::FromID(renderer_id, render_frame_id); 351 content::RenderFrameHost::FromID(renderer_id, render_frame_id);
341 content::WebContents* web_contents = 352 content::WebContents* web_contents =
342 content::WebContents::FromRenderFrameHost(render_frame_host); 353 content::WebContents::FromRenderFrameHost(render_frame_host);
343 if (!web_contents) 354 if (!web_contents)
344 return; 355 return;
345 356
346 if (!user_visible) { 357 if (!user_visible) {
347 web_contents->GetMainFrame()->AddMessageToConsole( 358 web_contents->GetMainFrame()->AddMessageToConsole(
348 content::CONSOLE_MESSAGE_LEVEL_ERROR, 359 content::CONSOLE_MESSAGE_LEVEL_ERROR,
349 kSilentPushUnsupportedMessage); 360 kSilentPushUnsupportedMessage);
350 361
351 SubscribeEnd(callback, 362 SubscribeEndWithError(callback,
352 std::string(), 363 content::PUSH_REGISTRATION_STATUS_PERMISSION_DENIED);
353 content::PUSH_REGISTRATION_STATUS_PERMISSION_DENIED);
354 return; 364 return;
355 } 365 }
356 366
357 // Push does not allow permission requests from iframes. 367 // Push does not allow permission requests from iframes.
358 int request_id = -1; 368 int request_id = -1;
359 369
360 profile_->GetPermissionManager()->RequestPermission( 370 profile_->GetPermissionManager()->RequestPermission(
361 content::PermissionType::PUSH_MESSAGING, web_contents->GetMainFrame(), 371 content::PermissionType::PUSH_MESSAGING, web_contents->GetMainFrame(),
362 request_id, requesting_origin, true /* user_gesture */, 372 request_id, requesting_origin, true /* user_gesture */,
363 base::Bind(&PushMessagingServiceImpl::DidRequestPermission, 373 base::Bind(&PushMessagingServiceImpl::DidRequestPermission,
364 weak_factory_.GetWeakPtr(), app_identifier, sender_id, 374 weak_factory_.GetWeakPtr(), app_identifier, sender_id,
365 callback)); 375 callback));
366 } 376 }
367 377
368 void PushMessagingServiceImpl::SubscribeFromWorker( 378 void PushMessagingServiceImpl::SubscribeFromWorker(
369 const GURL& requesting_origin, 379 const GURL& requesting_origin,
370 int64 service_worker_registration_id, 380 int64 service_worker_registration_id,
371 const std::string& sender_id, 381 const std::string& sender_id,
372 bool user_visible, 382 bool user_visible,
373 const content::PushMessagingService::RegisterCallback& register_callback) { 383 const content::PushMessagingService::RegisterCallback& register_callback) {
374 PushMessagingAppIdentifier app_identifier = 384 PushMessagingAppIdentifier app_identifier =
375 PushMessagingAppIdentifier::Generate(requesting_origin, 385 PushMessagingAppIdentifier::Generate(requesting_origin,
376 service_worker_registration_id); 386 service_worker_registration_id);
377 387
378 if (profile_->GetPrefs()->GetInteger( 388 if (profile_->GetPrefs()->GetInteger(
379 prefs::kPushMessagingRegistrationCount) >= kMaxRegistrations) { 389 prefs::kPushMessagingRegistrationCount) >= kMaxRegistrations) {
380 SubscribeEnd(register_callback, std::string(), 390 SubscribeEndWithError(register_callback,
381 content::PUSH_REGISTRATION_STATUS_LIMIT_REACHED); 391 content::PUSH_REGISTRATION_STATUS_LIMIT_REACHED);
382 return; 392 return;
383 } 393 }
384 394
385 GURL embedding_origin = requesting_origin; 395 GURL embedding_origin = requesting_origin;
386 blink::WebPushPermissionStatus permission_status = 396 blink::WebPushPermissionStatus permission_status =
387 PushMessagingServiceImpl::GetPermissionStatus(requesting_origin, 397 PushMessagingServiceImpl::GetPermissionStatus(requesting_origin,
388 embedding_origin, 398 embedding_origin,
389 user_visible); 399 user_visible);
390 if (permission_status != blink::WebPushPermissionStatusGranted) { 400 if (permission_status != blink::WebPushPermissionStatusGranted) {
391 SubscribeEnd(register_callback, std::string(), 401 SubscribeEndWithError(register_callback,
392 content::PUSH_REGISTRATION_STATUS_PERMISSION_DENIED); 402 content::PUSH_REGISTRATION_STATUS_PERMISSION_DENIED);
393 return; 403 return;
394 } 404 }
395 405
396 IncreasePushSubscriptionCount(1, true /* is_pending */); 406 IncreasePushSubscriptionCount(1, true /* is_pending */);
397 std::vector<std::string> sender_ids(1, sender_id); 407 std::vector<std::string> sender_ids(1, sender_id);
398 GetGCMDriver()->Register(app_identifier.app_id(), sender_ids, 408 GetGCMDriver()->Register(app_identifier.app_id(), sender_ids,
399 base::Bind(&PushMessagingServiceImpl::DidSubscribe, 409 base::Bind(&PushMessagingServiceImpl::DidSubscribe,
400 weak_factory_.GetWeakPtr(), 410 weak_factory_.GetWeakPtr(),
401 app_identifier, register_callback)); 411 app_identifier, register_callback));
402 } 412 }
(...skipping 10 matching lines...) Expand all
413 embedding_origin)); 423 embedding_origin));
414 } 424 }
415 425
416 bool PushMessagingServiceImpl::SupportNonVisibleMessages() { 426 bool PushMessagingServiceImpl::SupportNonVisibleMessages() {
417 return false; 427 return false;
418 } 428 }
419 429
420 void PushMessagingServiceImpl::SubscribeEnd( 430 void PushMessagingServiceImpl::SubscribeEnd(
421 const content::PushMessagingService::RegisterCallback& callback, 431 const content::PushMessagingService::RegisterCallback& callback,
422 const std::string& subscription_id, 432 const std::string& subscription_id,
433 const std::vector<uint8_t>& curve25519dh,
423 content::PushRegistrationStatus status) { 434 content::PushRegistrationStatus status) {
424 callback.Run(subscription_id, status); 435 callback.Run(subscription_id, curve25519dh, status);
436 }
437
438 void PushMessagingServiceImpl::SubscribeEndWithError(
439 const content::PushMessagingService::RegisterCallback& callback,
440 content::PushRegistrationStatus status) {
441 SubscribeEnd(callback, std::string() /* subscription_id */,
442 std::vector<uint8_t>() /* curve25519dh */, status);
425 } 443 }
426 444
427 void PushMessagingServiceImpl::DidSubscribe( 445 void PushMessagingServiceImpl::DidSubscribe(
428 const PushMessagingAppIdentifier& app_identifier, 446 const PushMessagingAppIdentifier& app_identifier,
429 const content::PushMessagingService::RegisterCallback& callback, 447 const content::PushMessagingService::RegisterCallback& callback,
430 const std::string& subscription_id, 448 const std::string& subscription_id,
431 gcm::GCMClient::Result result) { 449 gcm::GCMClient::Result result) {
432 content::PushRegistrationStatus status = 450 content::PushRegistrationStatus status =
433 content::PUSH_REGISTRATION_STATUS_SERVICE_ERROR; 451 content::PUSH_REGISTRATION_STATUS_SERVICE_ERROR;
452 std::vector<uint8_t> curve25519dh;
453
434 switch (result) { 454 switch (result) {
435 case gcm::GCMClient::SUCCESS: 455 case gcm::GCMClient::SUCCESS:
436 status = content::PUSH_REGISTRATION_STATUS_SUCCESS_FROM_PUSH_SERVICE; 456 status = content::PUSH_REGISTRATION_STATUS_SUCCESS_FROM_PUSH_SERVICE;
437 app_identifier.PersistToPrefs(profile_); 457 app_identifier.PersistToPrefs(profile_);
458
459 // TODO(peter): Hook up getting the keys from the GCM Driver.
460
438 IncreasePushSubscriptionCount(1, false /* is_pending */); 461 IncreasePushSubscriptionCount(1, false /* is_pending */);
439 break; 462 break;
440 case gcm::GCMClient::INVALID_PARAMETER: 463 case gcm::GCMClient::INVALID_PARAMETER:
441 case gcm::GCMClient::GCM_DISABLED: 464 case gcm::GCMClient::GCM_DISABLED:
442 case gcm::GCMClient::ASYNC_OPERATION_PENDING: 465 case gcm::GCMClient::ASYNC_OPERATION_PENDING:
443 case gcm::GCMClient::SERVER_ERROR: 466 case gcm::GCMClient::SERVER_ERROR:
444 case gcm::GCMClient::UNKNOWN_ERROR: 467 case gcm::GCMClient::UNKNOWN_ERROR:
445 status = content::PUSH_REGISTRATION_STATUS_SERVICE_ERROR; 468 status = content::PUSH_REGISTRATION_STATUS_SERVICE_ERROR;
446 break; 469 break;
447 case gcm::GCMClient::NETWORK_ERROR: 470 case gcm::GCMClient::NETWORK_ERROR:
448 case gcm::GCMClient::TTL_EXCEEDED: 471 case gcm::GCMClient::TTL_EXCEEDED:
449 status = content::PUSH_REGISTRATION_STATUS_NETWORK_ERROR; 472 status = content::PUSH_REGISTRATION_STATUS_NETWORK_ERROR;
450 break; 473 break;
451 } 474 }
452 SubscribeEnd(callback, subscription_id, status); 475
476 SubscribeEnd(callback, subscription_id, curve25519dh, status);
453 DecreasePushSubscriptionCount(1, true /* was_pending */); 477 DecreasePushSubscriptionCount(1, true /* was_pending */);
454 } 478 }
455 479
456 void PushMessagingServiceImpl::DidRequestPermission( 480 void PushMessagingServiceImpl::DidRequestPermission(
457 const PushMessagingAppIdentifier& app_identifier, 481 const PushMessagingAppIdentifier& app_identifier,
458 const std::string& sender_id, 482 const std::string& sender_id,
459 const content::PushMessagingService::RegisterCallback& register_callback, 483 const content::PushMessagingService::RegisterCallback& register_callback,
460 content::PermissionStatus permission_status) { 484 content::PermissionStatus permission_status) {
461 if (permission_status != content::PERMISSION_STATUS_GRANTED) { 485 if (permission_status != content::PERMISSION_STATUS_GRANTED) {
462 SubscribeEnd(register_callback, 486 SubscribeEndWithError(register_callback,
463 std::string(), 487 content::PUSH_REGISTRATION_STATUS_PERMISSION_DENIED);
464 content::PUSH_REGISTRATION_STATUS_PERMISSION_DENIED);
465 return; 488 return;
466 } 489 }
467 490
468 IncreasePushSubscriptionCount(1, true /* is_pending */); 491 IncreasePushSubscriptionCount(1, true /* is_pending */);
469 std::vector<std::string> sender_ids(1, sender_id); 492 std::vector<std::string> sender_ids(1, sender_id);
470 GetGCMDriver()->Register(app_identifier.app_id(), sender_ids, 493 GetGCMDriver()->Register(app_identifier.app_id(), sender_ids,
471 base::Bind(&PushMessagingServiceImpl::DidSubscribe, 494 base::Bind(&PushMessagingServiceImpl::DidSubscribe,
472 weak_factory_.GetWeakPtr(), 495 weak_factory_.GetWeakPtr(),
473 app_identifier, register_callback)); 496 app_identifier, register_callback));
474 } 497 }
(...skipping 174 matching lines...) Expand 10 before | Expand all | Expand 10 after
649 blink::WebPushPermissionStatusGranted; 672 blink::WebPushPermissionStatusGranted;
650 } 673 }
651 674
652 gcm::GCMDriver* PushMessagingServiceImpl::GetGCMDriver() const { 675 gcm::GCMDriver* PushMessagingServiceImpl::GetGCMDriver() const {
653 gcm::GCMProfileService* gcm_profile_service = 676 gcm::GCMProfileService* gcm_profile_service =
654 gcm::GCMProfileServiceFactory::GetForProfile(profile_); 677 gcm::GCMProfileServiceFactory::GetForProfile(profile_);
655 CHECK(gcm_profile_service); 678 CHECK(gcm_profile_service);
656 CHECK(gcm_profile_service->driver()); 679 CHECK(gcm_profile_service->driver());
657 return gcm_profile_service->driver(); 680 return gcm_profile_service->driver();
658 } 681 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698