| Index: content/browser/push_messaging_message_filter.cc
|
| diff --git a/content/browser/push_messaging_message_filter.cc b/content/browser/push_messaging_message_filter.cc
|
| index 451c11253f6be876828459a742e4928d4780a679..6a059dfe90314302cc8f2b57bf2da021afa7b6b5 100644
|
| --- a/content/browser/push_messaging_message_filter.cc
|
| +++ b/content/browser/push_messaging_message_filter.cc
|
| @@ -8,18 +8,24 @@
|
|
|
| #include "base/bind.h"
|
| #include "content/browser/renderer_host/render_process_host_impl.h"
|
| +#include "content/browser/service_worker/service_worker_context_wrapper.h"
|
| #include "content/common/push_messaging_messages.h"
|
| #include "content/public/browser/browser_context.h"
|
| #include "content/public/browser/browser_thread.h"
|
| +#include "content/public/browser/push_messaging_application_id.h"
|
| #include "content/public/browser/push_messaging_service.h"
|
|
|
| namespace content {
|
|
|
| -PushMessagingMessageFilter::PushMessagingMessageFilter(int render_process_id)
|
| +PushMessagingMessageFilter::PushMessagingMessageFilter(
|
| + int render_process_id,
|
| + ServiceWorkerContextWrapper* worker_context)
|
| : BrowserMessageFilter(PushMessagingMsgStart),
|
| render_process_id_(render_process_id),
|
| + worker_context_(worker_context),
|
| service_(NULL),
|
| - weak_factory_(this) {}
|
| + weak_factory_(this) {
|
| +}
|
|
|
| PushMessagingMessageFilter::~PushMessagingMessageFilter() {}
|
|
|
| @@ -35,31 +41,51 @@ bool PushMessagingMessageFilter::OnMessageReceived(
|
|
|
| void PushMessagingMessageFilter::OnRegister(int routing_id,
|
| int callbacks_id,
|
| - const std::string& sender_id) {
|
| + const std::string& sender_id,
|
| + const GURL& url,
|
| + int worker_provider_id) {
|
| DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
|
| // TODO(mvanouwerkerk): Validate arguments?
|
| - // TODO(mvanouwerkerk): A WebContentsObserver could avoid this PostTask
|
| - // by receiving the IPC on the UI thread.
|
| - BrowserThread::PostTask(BrowserThread::UI,
|
| - FROM_HERE,
|
| - base::Bind(&PushMessagingMessageFilter::DoRegister,
|
| - weak_factory_.GetWeakPtr(),
|
| - routing_id,
|
| - callbacks_id,
|
| - sender_id));
|
| + ServiceWorkerProviderHost* worker_host =
|
| + worker_context_->context()->GetProviderHost(render_process_id_,
|
| + worker_provider_id);
|
| + if (!worker_host)
|
| + LOG(WARNING) << "No worker host.";
|
| + if (worker_host && !worker_host->active_version())
|
| + LOG(WARNING) << "No active version."; // Why does this trigger on first page load? Because the SW is not activated yet?
|
| + if (!worker_host || !worker_host->active_version()) {
|
| + SendRegisterError(routing_id, callbacks_id);
|
| + return;
|
| + }
|
| + BrowserThread::PostTask(
|
| + BrowserThread::UI,
|
| + FROM_HERE,
|
| + base::Bind(&PushMessagingMessageFilter::DoRegister,
|
| + weak_factory_.GetWeakPtr(),
|
| + routing_id,
|
| + callbacks_id,
|
| + sender_id,
|
| + url,
|
| + worker_host->active_version()->registration_id()));
|
| }
|
|
|
| void PushMessagingMessageFilter::DoRegister(int routing_id,
|
| int callbacks_id,
|
| - const std::string& sender_id) {
|
| + const std::string& sender_id,
|
| + const GURL& url,
|
| + int64 worker_registration_id) {
|
| DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
| if (!service()) {
|
| - DidRegister(routing_id, callbacks_id, GURL(), "", false);
|
| + LOG(WARNING) << "No PushMessagingService.";
|
| + SendRegisterError(routing_id, callbacks_id);
|
| return;
|
| }
|
| - // TODO(mvanouwerkerk): Pass in a real app ID based on Service Worker ID.
|
| - std::string app_id = "https://example.com 0";
|
| - service_->Register(app_id,
|
| + PushMessagingApplicationId app_id =
|
| + PushMessagingApplicationId(url.GetOrigin(), worker_registration_id);
|
| + LOG(WARNING) << app_id.ToString();
|
| + LOG(WARNING) << app_id.is_valid();
|
| + DCHECK(app_id.is_valid());
|
| + service_->Register(app_id.ToString(),
|
| sender_id,
|
| base::Bind(&PushMessagingMessageFilter::DidRegister,
|
| weak_factory_.GetWeakPtr(),
|
| @@ -67,29 +93,47 @@ void PushMessagingMessageFilter::DoRegister(int routing_id,
|
| callbacks_id));
|
| }
|
|
|
| -void PushMessagingMessageFilter::DidRegister(int routing_id,
|
| - int callbacks_id,
|
| - const GURL& endpoint,
|
| - const std::string& registration_id,
|
| - bool success) {
|
| +void PushMessagingMessageFilter::DidRegister(
|
| + int routing_id,
|
| + int callbacks_id,
|
| + const GURL& endpoint,
|
| + const std::string& push_registration_id,
|
| + bool success) {
|
| DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
| + LOG(WARNING) << "Registration success: " << success;
|
| if (success) {
|
| - Send(new PushMessagingMsg_RegisterSuccess(routing_id,
|
| - callbacks_id,
|
| - endpoint,
|
| - registration_id));
|
| + Send(new PushMessagingMsg_RegisterSuccess(
|
| + routing_id, callbacks_id, endpoint, push_registration_id));
|
| } else {
|
| Send(new PushMessagingMsg_RegisterError(routing_id, callbacks_id));
|
| }
|
| }
|
|
|
| +void PushMessagingMessageFilter::SendRegisterError(int routing_id,
|
| + int callbacks_id) {
|
| + if (!BrowserThread::CurrentlyOn(BrowserThread::UI)) {
|
| + BrowserThread::PostTask(
|
| + BrowserThread::UI,
|
| + FROM_HERE,
|
| + base::Bind(&PushMessagingMessageFilter::SendRegisterError,
|
| + this,
|
| + routing_id,
|
| + callbacks_id));
|
| + return;
|
| + }
|
| + DidRegister(routing_id, callbacks_id, GURL(), "", false);
|
| +}
|
| +
|
| PushMessagingService* PushMessagingMessageFilter::service() {
|
| + LOG(WARNING) << "No PushMessagingService yet.";
|
| if (!service_) {
|
| - RenderProcessHostImpl* host = static_cast<RenderProcessHostImpl*>(
|
| + RenderProcessHostImpl* process_host = static_cast<RenderProcessHostImpl*>(
|
| RenderProcessHost::FromID(render_process_id_));
|
| - if (!host)
|
| + if (!process_host) {
|
| + LOG(WARNING) << "No process_host.";
|
| return NULL;
|
| - service_ = host->GetBrowserContext()->GetPushMessagingService();
|
| + }
|
| + service_ = process_host->GetBrowserContext()->GetPushMessagingService();
|
| }
|
| return service_;
|
| }
|
|
|