| OLD | NEW |
| 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 "content/renderer/push_messaging/push_messaging_dispatcher.h" | 5 #include "content/renderer/push_messaging/push_messaging_dispatcher.h" |
| 6 | 6 |
| 7 #include "base/strings/utf_string_conversions.h" | 7 #include "base/strings/utf_string_conversions.h" |
| 8 #include "content/child/service_worker/web_service_worker_registration_impl.h" | 8 #include "content/child/service_worker/web_service_worker_registration_impl.h" |
| 9 #include "content/common/push_messaging_messages.h" | 9 #include "content/common/push_messaging_messages.h" |
| 10 #include "content/renderer/manifest/manifest_manager.h" | 10 #include "content/renderer/manifest/manifest_manager.h" |
| (...skipping 26 matching lines...) Expand all Loading... |
| 37 IPC_END_MESSAGE_MAP() | 37 IPC_END_MESSAGE_MAP() |
| 38 return handled; | 38 return handled; |
| 39 } | 39 } |
| 40 | 40 |
| 41 void PushMessagingDispatcher::subscribe( | 41 void PushMessagingDispatcher::subscribe( |
| 42 blink::WebServiceWorkerRegistration* service_worker_registration, | 42 blink::WebServiceWorkerRegistration* service_worker_registration, |
| 43 const blink::WebPushSubscriptionOptions& options, | 43 const blink::WebPushSubscriptionOptions& options, |
| 44 blink::WebPushSubscriptionCallbacks* callbacks) { | 44 blink::WebPushSubscriptionCallbacks* callbacks) { |
| 45 DCHECK(service_worker_registration); | 45 DCHECK(service_worker_registration); |
| 46 DCHECK(callbacks); | 46 DCHECK(callbacks); |
| 47 RenderFrameImpl::FromRoutingID(routing_id()) | 47 // If a developer provided an application server key in |options|, skip |
| 48 ->manifest_manager() | 48 // fetching the manifest. |
| 49 ->GetManifest(base::Bind( | 49 if (options.applicationServerKey.isEmpty()) { |
| 50 &PushMessagingDispatcher::DoSubscribe, base::Unretained(this), | 50 RenderFrameImpl::FromRoutingID(routing_id()) |
| 51 service_worker_registration, options, callbacks)); | 51 ->manifest_manager() |
| 52 ->GetManifest(base::Bind( |
| 53 &PushMessagingDispatcher::DidGetManifest, base::Unretained(this), |
| 54 service_worker_registration, options, callbacks)); |
| 55 } else { |
| 56 PushSubscriptionOptions content_options; |
| 57 content_options.user_visible_only = options.userVisibleOnly; |
| 58 content_options.sender_info = options.applicationServerKey.utf8(); |
| 59 DoSubscribe(service_worker_registration, content_options, callbacks); |
| 60 } |
| 61 } |
| 62 |
| 63 void PushMessagingDispatcher::DidGetManifest( |
| 64 blink::WebServiceWorkerRegistration* service_worker_registration, |
| 65 const blink::WebPushSubscriptionOptions& options, |
| 66 blink::WebPushSubscriptionCallbacks* callbacks, |
| 67 const Manifest& manifest) { |
| 68 int request_id = subscription_callbacks_.Add(callbacks); |
| 69 // Get the sender_info from the manifest since it wasn't provided by |
| 70 // the caller. |
| 71 if (manifest.IsEmpty()) { |
| 72 OnSubscribeFromDocumentError( |
| 73 request_id, PUSH_REGISTRATION_STATUS_MANIFEST_EMPTY_OR_MISSING); |
| 74 return; |
| 75 } |
| 76 |
| 77 PushSubscriptionOptions content_options; |
| 78 content_options.user_visible_only = options.userVisibleOnly; |
| 79 if (!manifest.gcm_sender_id.is_null()) { |
| 80 content_options.sender_info = |
| 81 base::UTF16ToUTF8(manifest.gcm_sender_id.string()); |
| 82 } |
| 83 |
| 84 DoSubscribe(service_worker_registration, content_options, callbacks); |
| 52 } | 85 } |
| 53 | 86 |
| 54 void PushMessagingDispatcher::DoSubscribe( | 87 void PushMessagingDispatcher::DoSubscribe( |
| 55 blink::WebServiceWorkerRegistration* service_worker_registration, | 88 blink::WebServiceWorkerRegistration* service_worker_registration, |
| 56 const blink::WebPushSubscriptionOptions& options, | 89 const PushSubscriptionOptions& options, |
| 57 blink::WebPushSubscriptionCallbacks* callbacks, | 90 blink::WebPushSubscriptionCallbacks* callbacks) { |
| 58 const Manifest& manifest) { | |
| 59 int request_id = subscription_callbacks_.Add(callbacks); | 91 int request_id = subscription_callbacks_.Add(callbacks); |
| 60 int64_t service_worker_registration_id = | 92 int64_t service_worker_registration_id = |
| 61 static_cast<WebServiceWorkerRegistrationImpl*>( | 93 static_cast<WebServiceWorkerRegistrationImpl*>( |
| 62 service_worker_registration) | 94 service_worker_registration) |
| 63 ->registration_id(); | 95 ->registration_id(); |
| 64 | 96 |
| 65 if (manifest.IsEmpty()) { | 97 if (options.sender_info.empty()) { |
| 66 OnSubscribeFromDocumentError( | |
| 67 request_id, PUSH_REGISTRATION_STATUS_MANIFEST_EMPTY_OR_MISSING); | |
| 68 return; | |
| 69 } | |
| 70 | |
| 71 std::string sender_id = | |
| 72 manifest.gcm_sender_id.is_null() | |
| 73 ? std::string() | |
| 74 : base::UTF16ToUTF8(manifest.gcm_sender_id.string()); | |
| 75 if (sender_id.empty()) { | |
| 76 OnSubscribeFromDocumentError(request_id, | 98 OnSubscribeFromDocumentError(request_id, |
| 77 PUSH_REGISTRATION_STATUS_NO_SENDER_ID); | 99 PUSH_REGISTRATION_STATUS_NO_SENDER_ID); |
| 78 return; | 100 return; |
| 79 } | 101 } |
| 80 | |
| 81 Send(new PushMessagingHostMsg_SubscribeFromDocument( | 102 Send(new PushMessagingHostMsg_SubscribeFromDocument( |
| 82 routing_id(), request_id, | 103 routing_id(), request_id, options, service_worker_registration_id)); |
| 83 manifest.gcm_sender_id.is_null() | |
| 84 ? std::string() | |
| 85 : base::UTF16ToUTF8(manifest.gcm_sender_id.string()), | |
| 86 options.userVisibleOnly, service_worker_registration_id)); | |
| 87 } | 104 } |
| 88 | 105 |
| 89 void PushMessagingDispatcher::OnSubscribeFromDocumentSuccess( | 106 void PushMessagingDispatcher::OnSubscribeFromDocumentSuccess( |
| 90 int32_t request_id, | 107 int32_t request_id, |
| 91 const GURL& endpoint, | 108 const GURL& endpoint, |
| 92 const std::vector<uint8_t>& p256dh, | 109 const std::vector<uint8_t>& p256dh, |
| 93 const std::vector<uint8_t>& auth) { | 110 const std::vector<uint8_t>& auth) { |
| 94 blink::WebPushSubscriptionCallbacks* callbacks = | 111 blink::WebPushSubscriptionCallbacks* callbacks = |
| 95 subscription_callbacks_.Lookup(request_id); | 112 subscription_callbacks_.Lookup(request_id); |
| 96 DCHECK(callbacks); | 113 DCHECK(callbacks); |
| (...skipping 17 matching lines...) Expand all Loading... |
| 114 : blink::WebPushError::ErrorTypeAbort; | 131 : blink::WebPushError::ErrorTypeAbort; |
| 115 | 132 |
| 116 callbacks->onError(blink::WebPushError( | 133 callbacks->onError(blink::WebPushError( |
| 117 error_type, | 134 error_type, |
| 118 blink::WebString::fromUTF8(PushRegistrationStatusToString(status)))); | 135 blink::WebString::fromUTF8(PushRegistrationStatusToString(status)))); |
| 119 | 136 |
| 120 subscription_callbacks_.Remove(request_id); | 137 subscription_callbacks_.Remove(request_id); |
| 121 } | 138 } |
| 122 | 139 |
| 123 } // namespace content | 140 } // namespace content |
| OLD | NEW |