diff options
Diffstat (limited to 'chromium/content/child/service_worker/service_worker_message_filter.cc')
-rw-r--r-- | chromium/content/child/service_worker/service_worker_message_filter.cc | 48 |
1 files changed, 46 insertions, 2 deletions
diff --git a/chromium/content/child/service_worker/service_worker_message_filter.cc b/chromium/content/child/service_worker/service_worker_message_filter.cc index e6b5ff1d14b..71632f765d3 100644 --- a/chromium/content/child/service_worker/service_worker_message_filter.cc +++ b/chromium/content/child/service_worker/service_worker_message_filter.cc @@ -8,10 +8,26 @@ #include "content/child/service_worker/service_worker_dispatcher.h" #include "content/child/thread_safe_sender.h" #include "content/child/worker_thread_task_runner.h" +#include "content/common/service_worker/service_worker_messages.h" #include "ipc/ipc_message_macros.h" namespace content { +namespace { + +// Sends a ServiceWorkerObjectDestroyed message to the browser so it can delete +// the ServiceWorker handle. +void SendServiceWorkerObjectDestroyed( + scoped_refptr<ThreadSafeSender> sender, + int handle_id) { + if (handle_id == kInvalidServiceWorkerHandleId) + return; + sender->Send( + new ServiceWorkerHostMsg_DecrementServiceWorkerRefCount(handle_id)); +} + +} // namespace + ServiceWorkerMessageFilter::ServiceWorkerMessageFilter(ThreadSafeSender* sender) : main_thread_loop_proxy_(base::MessageLoopProxy::current()), thread_safe_sender_(sender) {} @@ -33,9 +49,37 @@ base::TaskRunner* ServiceWorkerMessageFilter::OverrideTaskRunnerForMessage( bool ServiceWorkerMessageFilter::OnMessageReceived(const IPC::Message& msg) { if (IPC_MESSAGE_CLASS(msg) != ServiceWorkerMsgStart) return false; - ServiceWorkerDispatcher::ThreadSpecificInstance(thread_safe_sender_.get()) - ->OnMessageReceived(msg); + ServiceWorkerDispatcher::GetOrCreateThreadSpecificInstance( + thread_safe_sender_.get())->OnMessageReceived(msg); return true; } +void ServiceWorkerMessageFilter::OnStaleMessageReceived( + const IPC::Message& msg) { + // Specifically handle some messages in case we failed to post task + // to the thread (meaning that the context on the thread is now gone). + IPC_BEGIN_MESSAGE_MAP(ServiceWorkerMessageFilter, msg) + IPC_MESSAGE_HANDLER(ServiceWorkerMsg_ServiceWorkerRegistered, + OnStaleRegistered) + IPC_MESSAGE_HANDLER(ServiceWorkerMsg_SetWaitingServiceWorker, + OnStaleSetServiceWorker) + IPC_MESSAGE_HANDLER(ServiceWorkerMsg_SetCurrentServiceWorker, + OnStaleSetServiceWorker) + IPC_END_MESSAGE_MAP() +} + +void ServiceWorkerMessageFilter::OnStaleRegistered( + int thread_id, + int request_id, + const ServiceWorkerObjectInfo& info) { + SendServiceWorkerObjectDestroyed(thread_safe_sender_, info.handle_id); +} + +void ServiceWorkerMessageFilter::OnStaleSetServiceWorker( + int thread_id, + int provider_id, + const ServiceWorkerObjectInfo& info) { + SendServiceWorkerObjectDestroyed(thread_safe_sender_, info.handle_id); +} + } // namespace content |