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