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