15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/worker/worker_thread.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/command_line.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/lazy_instance.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/threading/thread_local.h"
103d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch#include "content/child/appcache/appcache_dispatcher.h"
113d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch#include "content/child/appcache/appcache_frontend_impl.h"
127dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "content/child/db_message_filter.h"
13868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "content/child/indexed_db/indexed_db_message_filter.h"
147d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "content/child/runtime_features.h"
15868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "content/child/web_database_observer_impl.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/common/worker_messages.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/common/content_switches.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/worker/websharedworker_stub.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/worker/worker_webkitplatformsupport_impl.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ipc/ipc_sync_channel.h"
217dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "third_party/WebKit/public/platform/WebBlobRegistry.h"
227d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebDatabase.h"
237d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebKit.h"
247d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebRuntimeFeatures.h"
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "webkit/glue/webkit_glue.h"
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebRuntimeFeatures;
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content {
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static base::LazyInstance<base::ThreadLocalPointer<WorkerThread> > lazy_tls =
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    LAZY_INSTANCE_INITIALIZER;
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WorkerThread::WorkerThread() {
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  lazy_tls.Pointer()->Set(this);
36eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  webkit_platform_support_.reset(new WorkerWebKitPlatformSupportImpl(
37558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch      thread_safe_sender(),
38558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch      sync_message_filter(),
39558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch      quota_message_filter()));
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WebKit::initialize(webkit_platform_support_.get());
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
42868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  appcache_dispatcher_.reset(
433d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch      new AppCacheDispatcher(this, new AppCacheFrontendImpl()));
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_database_observer_impl_.reset(
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new WebDatabaseObserverImpl(sync_message_filter()));
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WebKit::WebDatabase::setObserver(web_database_observer_impl_.get());
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  db_message_filter_ = new DBMessageFilter();
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  channel()->AddFilter(db_message_filter_.get());
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
51eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  indexed_db_message_filter_ = new IndexedDBMessageFilter(
52eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      thread_safe_sender());
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  channel()->AddFilter(indexed_db_message_filter_.get());
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const CommandLine& command_line = *CommandLine::ForCurrentProcess();
567d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  SetRuntimeFeaturesDefaultsAndUpdateFromArgs(command_line);
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WorkerThread::~WorkerThread() {
60c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
61c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
62c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void WorkerThread::Shutdown() {
63a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  ChildThread::Shutdown();
64a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Shutdown in reverse of the initialization order.
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  channel()->RemoveFilter(indexed_db_message_filter_.get());
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  indexed_db_message_filter_ = NULL;
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  channel()->RemoveFilter(db_message_filter_.get());
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  db_message_filter_ = NULL;
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WebKit::shutdown();
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  lazy_tls.Pointer()->Set(NULL);
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WorkerThread* WorkerThread::current() {
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return lazy_tls.Pointer()->Get();
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WorkerThread::OnControlMessageReceived(const IPC::Message& msg) {
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Appcache messages are handled by a delegate.
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (appcache_dispatcher_->OnMessageReceived(msg))
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return true;
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool handled = true;
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IPC_BEGIN_MESSAGE_MAP(WorkerThread, msg)
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC_MESSAGE_HANDLER(WorkerProcessMsg_CreateWorker, OnCreateWorker)
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC_MESSAGE_UNHANDLED(handled = false)
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IPC_END_MESSAGE_MAP()
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return handled;
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WorkerThread::OnCreateWorker(
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const WorkerProcessMsg_CreateWorker_Params& params) {
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WorkerAppCacheInitInfo appcache_init_info(
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      params.creator_process_id,
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      params.shared_worker_appcache_id);
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // WebSharedWorkerStub own themselves.
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  new WebSharedWorkerStub(params.name, params.route_id, appcache_init_info);
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The browser process is likely dead. Terminate all workers.
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WorkerThread::OnChannelError() {
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  set_on_channel_error_called(true);
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (WorkerStubsList::iterator it = worker_stubs_.begin();
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       it != worker_stubs_.end(); ++it) {
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    (*it)->OnChannelError();
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WorkerThread::RemoveWorkerStub(WebSharedWorkerStub* stub) {
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  worker_stubs_.erase(stub);
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WorkerThread::AddWorkerStub(WebSharedWorkerStub* stub) {
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  worker_stubs_.insert(stub);
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace content
122