11e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved.
21e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
31e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)// found in the LICENSE file.
41e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
51e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "content/child/service_worker/service_worker_message_filter.h"
61e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
71e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "base/message_loop/message_loop_proxy.h"
81e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "content/child/service_worker/service_worker_dispatcher.h"
91e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "content/child/thread_safe_sender.h"
10f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "content/child/worker_thread_task_runner.h"
11c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "content/common/service_worker/service_worker_messages.h"
126e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "content/common/service_worker/service_worker_types.h"
13f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "ipc/ipc_message_macros.h"
141e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
151e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)namespace content {
161e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
170529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochnamespace {
180529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
190529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch// Sends a ServiceWorkerObjectDestroyed message to the browser so it can delete
200529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch// the ServiceWorker handle.
210529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochvoid SendServiceWorkerObjectDestroyed(
226e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    ThreadSafeSender* sender,
230529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    int handle_id) {
240529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  if (handle_id == kInvalidServiceWorkerHandleId)
250529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    return;
260529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  sender->Send(
27010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      new ServiceWorkerHostMsg_DecrementServiceWorkerRefCount(handle_id));
280529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch}
290529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
306e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)void SendRegistrationObjectDestroyed(
316e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    ThreadSafeSender* sender,
326e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    int handle_id) {
336e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  if (handle_id == kInvalidServiceWorkerRegistrationHandleId)
346e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    return;
356e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  sender->Send(
366e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      new ServiceWorkerHostMsg_DecrementRegistrationRefCount(handle_id));
376e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)}
386e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
390529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch}  // namespace
400529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
411e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)ServiceWorkerMessageFilter::ServiceWorkerMessageFilter(ThreadSafeSender* sender)
421e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    : main_thread_loop_proxy_(base::MessageLoopProxy::current()),
431e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      thread_safe_sender_(sender) {}
441e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
451e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)ServiceWorkerMessageFilter::~ServiceWorkerMessageFilter() {}
461e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
47f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)base::TaskRunner* ServiceWorkerMessageFilter::OverrideTaskRunnerForMessage(
48f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    const IPC::Message& msg) {
491e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  if (IPC_MESSAGE_CLASS(msg) != ServiceWorkerMsgStart)
50f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    return NULL;
51f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  int ipc_thread_id = 0;
52f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  const bool success = PickleIterator(msg).ReadInt(&ipc_thread_id);
53f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  DCHECK(success);
54f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (!ipc_thread_id)
55f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    return main_thread_loop_proxy_.get();
56f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  return new WorkerThreadTaskRunner(ipc_thread_id);
571e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)}
581e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
59f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)bool ServiceWorkerMessageFilter::OnMessageReceived(const IPC::Message& msg) {
60f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (IPC_MESSAGE_CLASS(msg) != ServiceWorkerMsgStart)
61f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    return false;
62a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  ServiceWorkerDispatcher::GetOrCreateThreadSpecificInstance(
63a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      thread_safe_sender_.get())->OnMessageReceived(msg);
64f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  return true;
651e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)}
661e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
67c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid ServiceWorkerMessageFilter::OnStaleMessageReceived(
68c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    const IPC::Message& msg) {
69c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // Specifically handle some messages in case we failed to post task
70c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // to the thread (meaning that the context on the thread is now gone).
71c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  IPC_BEGIN_MESSAGE_MAP(ServiceWorkerMessageFilter, msg)
72c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    IPC_MESSAGE_HANDLER(ServiceWorkerMsg_ServiceWorkerRegistered,
73c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                        OnStaleRegistered)
746e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    IPC_MESSAGE_HANDLER(ServiceWorkerMsg_SetVersionAttributes,
756e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                        OnStaleSetVersionAttributes)
76116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    IPC_MESSAGE_HANDLER(ServiceWorkerMsg_SetControllerServiceWorker,
776e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                        OnStaleSetControllerServiceWorker)
78c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  IPC_END_MESSAGE_MAP()
79c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}
80c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
81a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochvoid ServiceWorkerMessageFilter::OnStaleRegistered(
820529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    int thread_id,
830529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    int request_id,
841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const ServiceWorkerRegistrationObjectInfo& info,
851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const ServiceWorkerVersionAttributes& attrs) {
861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  SendServiceWorkerObjectDestroyed(thread_safe_sender_.get(),
871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                   attrs.installing.handle_id);
881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  SendServiceWorkerObjectDestroyed(thread_safe_sender_.get(),
891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                   attrs.waiting.handle_id);
901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  SendServiceWorkerObjectDestroyed(thread_safe_sender_.get(),
911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                   attrs.active.handle_id);
921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  SendRegistrationObjectDestroyed(thread_safe_sender_.get(), info.handle_id);
936e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)}
946e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
956e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)void ServiceWorkerMessageFilter::OnStaleSetVersionAttributes(
966e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    int thread_id,
976e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    int provider_id,
986e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    int registration_handle_id,
996e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    int changed_mask,
1001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const ServiceWorkerVersionAttributes& attrs) {
1011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  SendServiceWorkerObjectDestroyed(thread_safe_sender_.get(),
1021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                   attrs.installing.handle_id);
1031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  SendServiceWorkerObjectDestroyed(thread_safe_sender_.get(),
1041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                   attrs.waiting.handle_id);
1051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  SendServiceWorkerObjectDestroyed(thread_safe_sender_.get(),
1061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                   attrs.active.handle_id);
1071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  SendRegistrationObjectDestroyed(thread_safe_sender_.get(),
1081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                  registration_handle_id);
1090529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch}
1100529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
1116e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)void ServiceWorkerMessageFilter::OnStaleSetControllerServiceWorker(
1120529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    int thread_id,
1130529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    int provider_id,
114a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    const ServiceWorkerObjectInfo& info) {
1151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  SendServiceWorkerObjectDestroyed(thread_safe_sender_.get(), info.handle_id);
116c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}
117c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
1181e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)}  // namespace content
119