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
3 // found in the LICENSE file.
5 #include "content/browser/push_messaging_message_filter.h"
10 #include "base/strings/string_number_conversions.h"
11 #include "content/browser/renderer_host/render_process_host_impl.h"
12 #include "content/browser/service_worker/service_worker_context_wrapper.h"
13 #include "content/common/push_messaging_messages.h"
14 #include "content/public/browser/browser_context.h"
15 #include "content/public/browser/browser_thread.h"
16 #include "content/public/browser/push_messaging_service.h"
20 PushMessagingMessageFilter::PushMessagingMessageFilter(
21 int render_process_id,
22 ServiceWorkerContextWrapper* service_worker_context)
23 : BrowserMessageFilter(PushMessagingMsgStart),
24 render_process_id_(render_process_id),
25 service_worker_context_(service_worker_context),
30 PushMessagingMessageFilter::~PushMessagingMessageFilter() {}
32 bool PushMessagingMessageFilter::OnMessageReceived(
33 const IPC::Message& message) {
35 IPC_BEGIN_MESSAGE_MAP(PushMessagingMessageFilter, message)
36 IPC_MESSAGE_HANDLER(PushMessagingHostMsg_Register, OnRegister)
37 IPC_MESSAGE_UNHANDLED(handled = false)
42 void PushMessagingMessageFilter::OnRegister(int render_frame_id,
44 const std::string& sender_id,
46 int service_worker_provider_id) {
47 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
48 // TODO(mvanouwerkerk): Validate arguments?
49 ServiceWorkerProviderHost* service_worker_host =
50 service_worker_context_->context()->GetProviderHost(
51 render_process_id_, service_worker_provider_id);
52 if (!service_worker_host || !service_worker_host->active_version()) {
53 Send(new PushMessagingMsg_RegisterError(
56 PUSH_MESSAGING_STATUS_REGISTRATION_FAILED_NO_SERVICE_WORKER));
59 BrowserThread::PostTask(
62 base::Bind(&PushMessagingMessageFilter::DoRegister,
63 weak_factory_.GetWeakPtr(),
68 service_worker_host->active_version()->scope().GetOrigin(),
69 service_worker_host->active_version()->registration_id()));
72 void PushMessagingMessageFilter::DoRegister(
75 const std::string& sender_id,
78 int64 service_worker_registration_id) {
79 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
81 Send(new PushMessagingMsg_RegisterError(
84 PUSH_MESSAGING_STATUS_REGISTRATION_FAILED_SERVICE_NOT_AVAILABLE));
87 service()->Register(origin,
88 service_worker_registration_id,
93 base::Bind(&PushMessagingMessageFilter::DidRegister,
94 weak_factory_.GetWeakPtr(),
99 void PushMessagingMessageFilter::DidRegister(
102 const GURL& push_endpoint,
103 const std::string& push_registration_id,
104 PushMessagingStatus status) {
105 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
106 if (status == PUSH_MESSAGING_STATUS_OK) {
107 Send(new PushMessagingMsg_RegisterSuccess(
108 render_frame_id, callbacks_id, push_endpoint, push_registration_id));
110 Send(new PushMessagingMsg_RegisterError(
111 render_frame_id, callbacks_id, status));
115 PushMessagingService* PushMessagingMessageFilter::service() {
117 RenderProcessHost* process_host =
118 RenderProcessHost::FromID(render_process_id_);
121 service_ = process_host->GetBrowserContext()->GetPushMessagingService();
126 } // namespace content