Index: content/renderer/push_messaging/push_messaging_client.cc |
diff --git a/content/renderer/push_messaging/push_messaging_dispatcher.cc b/content/renderer/push_messaging/push_messaging_client.cc |
similarity index 57% |
rename from content/renderer/push_messaging/push_messaging_dispatcher.cc |
rename to content/renderer/push_messaging/push_messaging_client.cc |
index cc4fda70d7dd1a52bfac48d0ea096c7285f0a65e..3cef773bb8b7e8ce9512b9df971e9e114e18ea11 100644 |
--- a/content/renderer/push_messaging/push_messaging_dispatcher.cc |
+++ b/content/renderer/push_messaging/push_messaging_client.cc |
@@ -2,19 +2,20 @@ |
// Use of this source code is governed by a BSD-style license that can be |
// found in the LICENSE file. |
-#include "content/renderer/push_messaging/push_messaging_dispatcher.h" |
+#include "content/renderer/push_messaging/push_messaging_client.h" |
#include <memory> |
#include <utility> |
+#include "base/bind_helpers.h" |
#include "base/memory/ptr_util.h" |
#include "base/strings/utf_string_conversions.h" |
+#include "content/child/child_thread_impl.h" |
#include "content/child/push_messaging/push_provider.h" |
#include "content/child/service_worker/web_service_worker_registration_impl.h" |
-#include "content/common/push_messaging_messages.h" |
#include "content/renderer/manifest/manifest_manager.h" |
#include "content/renderer/render_frame_impl.h" |
-#include "ipc/ipc_message.h" |
+#include "services/service_manager/public/cpp/interface_provider.h" |
#include "third_party/WebKit/public/platform/WebString.h" |
#include "third_party/WebKit/public/platform/modules/push_messaging/WebPushError.h" |
#include "third_party/WebKit/public/platform/modules/push_messaging/WebPushSubscription.h" |
@@ -26,40 +27,34 @@ |
namespace content { |
-PushMessagingDispatcher::PushMessagingDispatcher(RenderFrame* render_frame) |
- : RenderFrameObserver(render_frame) {} |
- |
-PushMessagingDispatcher::~PushMessagingDispatcher() {} |
- |
-bool PushMessagingDispatcher::OnMessageReceived(const IPC::Message& message) { |
- bool handled = true; |
- IPC_BEGIN_MESSAGE_MAP(PushMessagingDispatcher, message) |
- IPC_MESSAGE_HANDLER(PushMessagingMsg_SubscribeFromDocumentSuccess, |
- OnSubscribeFromDocumentSuccess) |
- IPC_MESSAGE_HANDLER(PushMessagingMsg_SubscribeFromDocumentError, |
- OnSubscribeFromDocumentError) |
- IPC_MESSAGE_UNHANDLED(handled = false) |
- IPC_END_MESSAGE_MAP() |
- return handled; |
+PushMessagingClient::PushMessagingClient(RenderFrame* render_frame) |
+ : RenderFrameObserver(render_frame) { |
+ if (ChildThreadImpl::current()) { |
+ ChildThreadImpl::current()->GetRemoteInterfaces()->GetInterface( |
+ mojo::MakeRequest(&push_messaging_manager_)); |
+ } |
} |
-void PushMessagingDispatcher::OnDestruct() { |
+PushMessagingClient::~PushMessagingClient() {} |
+ |
+void PushMessagingClient::OnDestruct() { |
delete this; |
} |
-void PushMessagingDispatcher::subscribe( |
+void PushMessagingClient::subscribe( |
blink::WebServiceWorkerRegistration* service_worker_registration, |
const blink::WebPushSubscriptionOptions& options, |
std::unique_ptr<blink::WebPushSubscriptionCallbacks> callbacks) { |
DCHECK(service_worker_registration); |
DCHECK(callbacks); |
+ |
// If a developer provided an application server key in |options|, skip |
// fetching the manifest. |
if (options.applicationServerKey.isEmpty()) { |
RenderFrameImpl::FromRoutingID(routing_id()) |
->manifest_manager() |
->GetManifest(base::Bind( |
- &PushMessagingDispatcher::DidGetManifest, base::Unretained(this), |
+ &PushMessagingClient::DidGetManifest, base::Unretained(this), |
service_worker_registration, options, base::Passed(&callbacks))); |
} else { |
PushSubscriptionOptions content_options; |
@@ -72,7 +67,7 @@ void PushMessagingDispatcher::subscribe( |
} |
} |
-void PushMessagingDispatcher::DidGetManifest( |
+void PushMessagingClient::DidGetManifest( |
blink::WebServiceWorkerRegistration* service_worker_registration, |
const blink::WebPushSubscriptionOptions& options, |
std::unique_ptr<blink::WebPushSubscriptionCallbacks> callbacks, |
@@ -82,9 +77,10 @@ void PushMessagingDispatcher::DidGetManifest( |
// Get the sender_info from the manifest since it wasn't provided by |
// the caller. |
if (manifest.IsEmpty()) { |
- int request_id = subscription_callbacks_.Add(std::move(callbacks)); |
- OnSubscribeFromDocumentError( |
- request_id, PUSH_REGISTRATION_STATUS_MANIFEST_EMPTY_OR_MISSING); |
+ SubscribeCallback(std::move(callbacks), |
+ PUSH_REGISTRATION_STATUS_MANIFEST_EMPTY_OR_MISSING, |
+ base::nullopt, base::nullopt, base::nullopt, |
+ base::nullopt); |
return; |
} |
@@ -99,52 +95,54 @@ void PushMessagingDispatcher::DidGetManifest( |
std::move(callbacks)); |
} |
-void PushMessagingDispatcher::DoSubscribe( |
+void PushMessagingClient::DoSubscribe( |
blink::WebServiceWorkerRegistration* service_worker_registration, |
const PushSubscriptionOptions& options, |
std::unique_ptr<blink::WebPushSubscriptionCallbacks> callbacks) { |
- int request_id = subscription_callbacks_.Add(std::move(callbacks)); |
int64_t service_worker_registration_id = |
static_cast<WebServiceWorkerRegistrationImpl*>( |
service_worker_registration) |
->registrationId(); |
if (options.sender_info.empty()) { |
- OnSubscribeFromDocumentError(request_id, |
- PUSH_REGISTRATION_STATUS_NO_SENDER_ID); |
+ SubscribeCallback(std::move(callbacks), |
+ PUSH_REGISTRATION_STATUS_NO_SENDER_ID, base::nullopt, |
+ base::nullopt, base::nullopt, base::nullopt); |
return; |
} |
- Send(new PushMessagingHostMsg_Subscribe( |
- routing_id(), request_id, service_worker_registration_id, options)); |
-} |
- |
-void PushMessagingDispatcher::OnSubscribeFromDocumentSuccess( |
- int32_t request_id, |
- const GURL& endpoint, |
- const PushSubscriptionOptions& options, |
- const std::vector<uint8_t>& p256dh, |
- const std::vector<uint8_t>& auth) { |
- blink::WebPushSubscriptionCallbacks* callbacks = |
- subscription_callbacks_.Lookup(request_id); |
- DCHECK(callbacks); |
- |
- callbacks->onSuccess(base::MakeUnique<blink::WebPushSubscription>( |
- endpoint, options.user_visible_only, |
- blink::WebString::fromLatin1(options.sender_info), p256dh, auth)); |
- subscription_callbacks_.Remove(request_id); |
+ DCHECK(push_messaging_manager_); |
+ push_messaging_manager_->Subscribe( |
+ routing_id(), service_worker_registration_id, options, |
+ // Safe to use base::Unretained because |push_messaging_manager_ |is |
+ // owned by |this|. |
+ base::Bind(&PushMessagingClient::SubscribeCallback, |
+ base::Unretained(this), base::Passed(&callbacks))); |
} |
-void PushMessagingDispatcher::OnSubscribeFromDocumentError( |
- int32_t request_id, |
- PushRegistrationStatus status) { |
- blink::WebPushSubscriptionCallbacks* callbacks = |
- subscription_callbacks_.Lookup(request_id); |
+void PushMessagingClient::SubscribeCallback( |
+ std::unique_ptr<blink::WebPushSubscriptionCallbacks> callbacks, |
+ content::PushRegistrationStatus status, |
+ const base::Optional<GURL>& endpoint, |
+ const base::Optional<content::PushSubscriptionOptions>& options, |
+ const base::Optional<std::vector<uint8_t>>& p256dh, |
+ const base::Optional<std::vector<uint8_t>>& auth) { |
DCHECK(callbacks); |
- callbacks->onError(PushRegistrationStatusToWebPushError(status)); |
- |
- subscription_callbacks_.Remove(request_id); |
+ if (status == PUSH_REGISTRATION_STATUS_SUCCESS_FROM_PUSH_SERVICE || |
+ status == PUSH_REGISTRATION_STATUS_SUCCESS_FROM_CACHE) { |
+ DCHECK(endpoint); |
+ DCHECK(options); |
+ DCHECK(p256dh); |
+ DCHECK(auth); |
+ |
+ callbacks->onSuccess(base::MakeUnique<blink::WebPushSubscription>( |
+ endpoint.value(), options.value().user_visible_only, |
+ blink::WebString::fromLatin1(options.value().sender_info), |
+ p256dh.value(), auth.value())); |
+ } else { |
+ callbacks->onError(PushRegistrationStatusToWebPushError(status)); |
+ } |
} |
} // namespace content |