diff options
Diffstat (limited to 'chromium/content/browser/worker_host/worker_process_host.cc')
-rw-r--r-- | chromium/content/browser/worker_host/worker_process_host.cc | 385 |
1 files changed, 253 insertions, 132 deletions
diff --git a/chromium/content/browser/worker_host/worker_process_host.cc b/chromium/content/browser/worker_host/worker_process_host.cc index fae589bf476..81645f66732 100644 --- a/chromium/content/browser/worker_host/worker_process_host.cc +++ b/chromium/content/browser/worker_host/worker_process_host.cc @@ -23,6 +23,8 @@ #include "content/browser/devtools/worker_devtools_manager.h" #include "content/browser/devtools/worker_devtools_message_filter.h" #include "content/browser/fileapi/fileapi_message_filter.h" +#include "content/browser/frame_host/render_frame_host_delegate.h" +#include "content/browser/frame_host/render_frame_host_impl.h" #include "content/browser/indexed_db/indexed_db_dispatcher_host.h" #include "content/browser/loader/resource_message_filter.h" #include "content/browser/message_port_message_filter.h" @@ -34,6 +36,7 @@ #include "content/browser/renderer_host/render_view_host_delegate.h" #include "content/browser/renderer_host/render_view_host_impl.h" #include "content/browser/renderer_host/socket_stream_dispatcher_host.h" +#include "content/browser/renderer_host/websocket_dispatcher_host.h" #include "content/browser/resource_context_impl.h" #include "content/browser/worker_host/worker_message_filter.h" #include "content/browser/worker_host/worker_service_impl.h" @@ -45,6 +48,7 @@ #include "content/public/browser/user_metrics.h" #include "content/public/common/content_switches.h" #include "content/public/common/result_codes.h" +#include "content/public/common/sandboxed_process_launcher_delegate.h" #include "ipc/ipc_switches.h" #include "net/base/mime_util.h" #include "net/base/registry_controlled_domains/registry_controlled_domain.h" @@ -56,37 +60,82 @@ #if defined(OS_WIN) #include "content/common/sandbox_win.h" -#include "content/public/common/sandboxed_process_launcher_delegate.h" #endif namespace content { namespace { -#if defined(OS_WIN) // NOTE: changes to this class need to be reviewed by the security team. class WorkerSandboxedProcessLauncherDelegate : public content::SandboxedProcessLauncherDelegate { public: - WorkerSandboxedProcessLauncherDelegate() {} + WorkerSandboxedProcessLauncherDelegate(ChildProcessHost* host, + bool debugging_child) +#if defined(OS_POSIX) + : ipc_fd_(host->TakeClientFileDescriptor()), + debugging_child_(debugging_child) +#endif // OS_POSIX + {} + virtual ~WorkerSandboxedProcessLauncherDelegate() {} +#if defined(OS_WIN) virtual void PreSpawnTarget(sandbox::TargetPolicy* policy, bool* success) { AddBaseHandleClosePolicy(policy); } -}; +#elif defined(OS_POSIX) + virtual bool ShouldUseZygote() OVERRIDE { + return !debugging_child_; + } + virtual int GetIpcFd() OVERRIDE { + return ipc_fd_; + } #endif // OS_WIN -} // namespace + private: +#if defined(OS_POSIX) + int ipc_fd_; + bool debugging_child_; +#endif // OS_POSIX +}; // Notifies RenderViewHost that one or more worker objects crashed. -void WorkerCrashCallback(int render_process_unique_id, int render_view_id) { - RenderViewHostImpl* host = - RenderViewHostImpl::FromID(render_process_unique_id, render_view_id); +void WorkerCrashCallback(int render_process_unique_id, int render_frame_id) { + RenderFrameHostImpl* host = + RenderFrameHostImpl::FromID(render_process_unique_id, render_frame_id); if (host) - host->GetDelegate()->WorkerCrashed(); + host->delegate()->WorkerCrashed(host); } +void WorkerCreatedCallback(int render_process_id, + int render_frame_id, + int worker_process_id) { + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); + RenderFrameHost* render_frame_host = + RenderFrameHost::FromID(render_process_id, render_frame_id); + if (!render_frame_host) + return; + SiteInstance* site_instance = render_frame_host->GetSiteInstance(); + GetContentClient()->browser()->WorkerProcessCreated(site_instance, + worker_process_id); +} + +void WorkerTerminatedCallback(int render_process_id, + int render_frame_id, + int worker_process_id) { + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); + RenderFrameHost* render_frame_host = + RenderFrameHost::FromID(render_process_id, render_frame_id); + if (!render_frame_host) + return; + SiteInstance* site_instance = render_frame_host->GetSiteInstance(); + GetContentClient()->browser()->WorkerProcessTerminated(site_instance, + worker_process_id); +} + +} // namespace + WorkerProcessHost::WorkerProcessHost( ResourceContext* resource_context, const WorkerStoragePartition& partition) @@ -102,14 +151,16 @@ WorkerProcessHost::WorkerProcessHost( WorkerProcessHost::~WorkerProcessHost() { // If we crashed, tell the RenderViewHosts. for (Instances::iterator i = instances_.begin(); i != instances_.end(); ++i) { - const WorkerDocumentSet::DocumentInfoSet& parents = - i->worker_document_set()->documents(); - for (WorkerDocumentSet::DocumentInfoSet::const_iterator parent_iter = - parents.begin(); parent_iter != parents.end(); ++parent_iter) { - BrowserThread::PostTask( - BrowserThread::UI, FROM_HERE, - base::Bind(&WorkerCrashCallback, parent_iter->render_process_id(), - parent_iter->render_view_id())); + if (!i->load_failed()) { + const WorkerDocumentSet::DocumentInfoSet& parents = + i->worker_document_set()->documents(); + for (WorkerDocumentSet::DocumentInfoSet::const_iterator parent_iter = + parents.begin(); parent_iter != parents.end(); ++parent_iter) { + BrowserThread::PostTask( + BrowserThread::UI, FROM_HERE, + base::Bind(&WorkerCrashCallback, parent_iter->render_process_id(), + parent_iter->render_frame_id())); + } } WorkerServiceImpl::GetInstance()->NotifyWorkerDestroyed( this, i->worker_route_id()); @@ -123,7 +174,7 @@ bool WorkerProcessHost::Send(IPC::Message* message) { return process_->Send(message); } -bool WorkerProcessHost::Init(int render_process_id) { +bool WorkerProcessHost::Init(int render_process_id, int render_frame_id) { std::string channel_id = process_->GetHost()->CreateChannel(); if (channel_id.empty()) return false; @@ -153,18 +204,19 @@ bool WorkerProcessHost::Init(int render_process_id) { switches::kDisableFileSystem, switches::kDisableSeccompFilterSandbox, switches::kEnableExperimentalWebPlatformFeatures, + switches::kEnablePreciseMemoryInfo, switches::kEnableServiceWorker, #if defined(OS_MACOSX) switches::kEnableSandboxLogging, #endif - switches::kJavaScriptFlags + switches::kJavaScriptFlags, + switches::kNoSandbox }; cmd_line->CopySwitchesFrom(*CommandLine::ForCurrentProcess(), kSwitchNames, arraysize(kSwitchNames)); +bool debugging_child = false; #if defined(OS_POSIX) - bool use_zygote = true; - if (CommandLine::ForCurrentProcess()->HasSwitch( switches::kWaitForDebuggerChildren)) { // Look to pass-on the kWaitForDebugger flag. @@ -172,36 +224,26 @@ bool WorkerProcessHost::Init(int render_process_id) { switches::kWaitForDebuggerChildren); if (value.empty() || value == switches::kWorkerProcess) { cmd_line->AppendSwitch(switches::kWaitForDebugger); - use_zygote = false; - } - } - - if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kDebugChildren)) { - // Look to pass-on the kDebugOnStart flag. - std::string value = CommandLine::ForCurrentProcess()->GetSwitchValueASCII( - switches::kDebugChildren); - if (value.empty() || value == switches::kWorkerProcess) { - // launches a new xterm, and runs the worker process in gdb, reading - // optional commands from gdb_chrome file in the working directory. - cmd_line->PrependWrapper("xterm -e gdb -x gdb_chrome --args"); - use_zygote = false; + debugging_child = true; } } #endif process_->Launch( -#if defined(OS_WIN) - new WorkerSandboxedProcessLauncherDelegate, -#elif defined(OS_POSIX) - use_zygote, - base::EnvironmentMap(), -#endif + new WorkerSandboxedProcessLauncherDelegate(process_->GetHost(), + debugging_child), cmd_line); ChildProcessSecurityPolicyImpl::GetInstance()->AddWorker( process_->GetData().id, render_process_id); CreateMessageFilters(render_process_id); + BrowserThread::PostTask( + BrowserThread::UI, FROM_HERE, + base::Bind(&WorkerCreatedCallback, + render_process_id, + render_frame_id, + process_->GetData().id)); return true; } @@ -223,6 +265,7 @@ void WorkerProcessHost::CreateMessageFilters(int render_process_id) { partition_.appcache_service(), blob_storage_context, partition_.filesystem_context(), + partition_.service_worker_context(), get_contexts_callback); process_->AddFilter(resource_message_filter); @@ -265,12 +308,26 @@ void WorkerProcessHost::CreateMessageFilters(int render_process_id) { resource_context_); socket_stream_dispatcher_host_ = socket_stream_dispatcher_host; process_->AddFilter(socket_stream_dispatcher_host); + + WebSocketDispatcherHost::GetRequestContextCallback + websocket_request_context_callback( + base::Bind(&WorkerProcessHost::GetRequestContext, + base::Unretained(this), + ResourceType::SUB_RESOURCE)); + + process_->AddFilter(new WebSocketDispatcherHost( + render_process_id, websocket_request_context_callback)); + process_->AddFilter(new WorkerDevToolsMessageFilter(process_->GetData().id)); process_->AddFilter( - new IndexedDBDispatcherHost(partition_.indexed_db_context())); + new IndexedDBDispatcherHost(process_->GetData().id, + url_request_context, + partition_.indexed_db_context(), + blob_storage_context)); } -void WorkerProcessHost::CreateWorker(const WorkerInstance& instance) { +void WorkerProcessHost::CreateWorker(const WorkerInstance& instance, + bool pause_on_start) { ChildProcessSecurityPolicyImpl::GetInstance()->GrantRequestURL( process_->GetData().id, instance.url()); @@ -279,9 +336,10 @@ void WorkerProcessHost::CreateWorker(const WorkerInstance& instance) { WorkerProcessMsg_CreateWorker_Params params; params.url = instance.url(); params.name = instance.name(); + params.content_security_policy = instance.content_security_policy(); + params.security_policy_type = instance.security_policy_type(); + params.pause_on_start = pause_on_start; params.route_id = instance.worker_route_id(); - params.creator_process_id = instance.parent_process_id(); - params.shared_worker_appcache_id = instance.main_resource_appcache_id(); Send(new WorkerProcessMsg_CreateWorker(params)); UpdateTitle(); @@ -292,8 +350,7 @@ void WorkerProcessHost::CreateWorker(const WorkerInstance& instance) { for (WorkerInstance::FilterList::const_iterator i = instance.filters().begin(); i != instance.filters().end(); ++i) { - CHECK(i->first); - i->first->Send(new ViewMsg_WorkerCreated(i->second)); + i->filter()->Send(new ViewMsg_WorkerCreated(i->route_id())); } } @@ -301,7 +358,7 @@ bool WorkerProcessHost::FilterMessage(const IPC::Message& message, WorkerMessageFilter* filter) { for (Instances::iterator i = instances_.begin(); i != instances_.end(); ++i) { if (!i->closed() && i->HasFilter(filter, message.routing_id())) { - RelayMessage(message, worker_message_filter_.get(), i->worker_route_id()); + RelayMessage(message, filter, &(*i)); return true; } } @@ -316,44 +373,28 @@ void WorkerProcessHost::OnProcessLaunched() { } bool WorkerProcessHost::OnMessageReceived(const IPC::Message& message) { - bool msg_is_ok = true; bool handled = true; - IPC_BEGIN_MESSAGE_MAP_EX(WorkerProcessHost, message, msg_is_ok) + IPC_BEGIN_MESSAGE_MAP(WorkerProcessHost, message) IPC_MESSAGE_HANDLER(WorkerHostMsg_WorkerContextClosed, OnWorkerContextClosed) + IPC_MESSAGE_HANDLER(WorkerHostMsg_WorkerContextDestroyed, + OnWorkerContextDestroyed) + IPC_MESSAGE_HANDLER(WorkerHostMsg_WorkerScriptLoaded, + OnWorkerScriptLoaded) + IPC_MESSAGE_HANDLER(WorkerHostMsg_WorkerScriptLoadFailed, + OnWorkerScriptLoadFailed) + IPC_MESSAGE_HANDLER(WorkerHostMsg_WorkerConnected, + OnWorkerConnected) IPC_MESSAGE_HANDLER(WorkerProcessHostMsg_AllowDatabase, OnAllowDatabase) - IPC_MESSAGE_HANDLER(WorkerProcessHostMsg_AllowFileSystem, OnAllowFileSystem) + IPC_MESSAGE_HANDLER(WorkerProcessHostMsg_RequestFileSystemAccessSync, + OnRequestFileSystemAccessSync) IPC_MESSAGE_HANDLER(WorkerProcessHostMsg_AllowIndexedDB, OnAllowIndexedDB) IPC_MESSAGE_HANDLER(WorkerProcessHostMsg_ForceKillWorker, OnForceKillWorkerProcess) IPC_MESSAGE_UNHANDLED(handled = false) - IPC_END_MESSAGE_MAP_EX() - - if (!msg_is_ok) { - NOTREACHED(); - RecordAction(UserMetricsAction("BadMessageTerminate_WPH")); - base::KillProcess( - process_->GetData().handle, RESULT_CODE_KILLED_BAD_MESSAGE, false); - } - - if (handled) - return true; - - if (message.type() == WorkerHostMsg_WorkerContextDestroyed::ID) { - WorkerServiceImpl::GetInstance()->NotifyWorkerDestroyed( - this, message.routing_id()); - } + IPC_END_MESSAGE_MAP() - for (Instances::iterator i = instances_.begin(); i != instances_.end(); ++i) { - if (i->worker_route_id() == message.routing_id()) { - if (message.type() == WorkerHostMsg_WorkerContextDestroyed::ID) { - instances_.erase(i); - UpdateTitle(); - } - return true; - } - } - return false; + return handled; } // Sent to notify the browser process when a worker context invokes close(), so @@ -370,6 +411,57 @@ void WorkerProcessHost::OnWorkerContextClosed(int worker_route_id) { } } +void WorkerProcessHost::OnWorkerContextDestroyed(int worker_route_id) { + WorkerServiceImpl::GetInstance()->NotifyWorkerDestroyed( + this, worker_route_id); + for (Instances::iterator i = instances_.begin(); i != instances_.end(); ++i) { + if (i->worker_route_id() == worker_route_id) { + instances_.erase(i); + UpdateTitle(); + return; + } + } +} + +void WorkerProcessHost::OnWorkerScriptLoaded(int worker_route_id) { + WorkerDevToolsManager::GetInstance()->WorkerContextStarted(this, + worker_route_id); +} + +void WorkerProcessHost::OnWorkerScriptLoadFailed(int worker_route_id) { + bool shutdown = true; + for (Instances::iterator i = instances_.begin(); i != instances_.end(); ++i) { + if (i->worker_route_id() != worker_route_id) { + shutdown = false; + continue; + } + i->set_load_failed(true); + for (WorkerInstance::FilterList::const_iterator j = i->filters().begin(); + j != i->filters().end(); ++j) { + j->filter()->Send(new ViewMsg_WorkerScriptLoadFailed(j->route_id())); + } + } + if (shutdown) { + base::KillProcess( + process_->GetData().handle, RESULT_CODE_NORMAL_EXIT, false); + } +} + +void WorkerProcessHost::OnWorkerConnected(int message_port_id, + int worker_route_id) { + for (Instances::iterator i = instances_.begin(); i != instances_.end(); ++i) { + if (i->worker_route_id() != worker_route_id) + continue; + for (WorkerInstance::FilterList::const_iterator j = i->filters().begin(); + j != i->filters().end(); ++j) { + if (j->message_port_id() != message_port_id) + continue; + j->filter()->Send(new ViewMsg_WorkerConnected(j->route_id())); + return; + } + } +} + void WorkerProcessHost::OnAllowDatabase(int worker_route_id, const GURL& url, const base::string16& name, @@ -378,14 +470,14 @@ void WorkerProcessHost::OnAllowDatabase(int worker_route_id, bool* result) { *result = GetContentClient()->browser()->AllowWorkerDatabase( url, name, display_name, estimated_size, resource_context_, - GetRenderViewIDsForWorker(worker_route_id)); + GetRenderFrameIDsForWorker(worker_route_id)); } -void WorkerProcessHost::OnAllowFileSystem(int worker_route_id, - const GURL& url, - bool* result) { +void WorkerProcessHost::OnRequestFileSystemAccessSync(int worker_route_id, + const GURL& url, + bool* result) { *result = GetContentClient()->browser()->AllowWorkerFileSystem( - url, resource_context_, GetRenderViewIDsForWorker(worker_route_id)); + url, resource_context_, GetRenderFrameIDsForWorker(worker_route_id)); } void WorkerProcessHost::OnAllowIndexedDB(int worker_route_id, @@ -393,7 +485,8 @@ void WorkerProcessHost::OnAllowIndexedDB(int worker_route_id, const base::string16& name, bool* result) { *result = GetContentClient()->browser()->AllowWorkerIndexedDB( - url, name, resource_context_, GetRenderViewIDsForWorker(worker_route_id)); + url, name, resource_context_, + GetRenderFrameIDsForWorker(worker_route_id)); } void WorkerProcessHost::OnForceKillWorkerProcess() { @@ -401,42 +494,41 @@ void WorkerProcessHost::OnForceKillWorkerProcess() { base::KillProcess( process_->GetData().handle, RESULT_CODE_NORMAL_EXIT, false); else - RecordAction(UserMetricsAction("WorkerProcess_BadProcessToKill")); + RecordAction(base::UserMetricsAction("WorkerProcess_BadProcessToKill")); } void WorkerProcessHost::RelayMessage( const IPC::Message& message, - WorkerMessageFilter* filter, - int route_id) { + WorkerMessageFilter* incoming_filter, + WorkerInstance* instance) { if (message.type() == WorkerMsg_Connect::ID) { // Crack the SharedWorker Connect message to setup routing for the port. - int sent_message_port_id; - int new_routing_id; - if (!WorkerMsg_Connect::Read( - &message, &sent_message_port_id, &new_routing_id)) { + WorkerMsg_Connect::Param params; + if (!WorkerMsg_Connect::Read(&message, ¶ms)) return; - } - new_routing_id = filter->GetNextRoutingID(); + + int sent_message_port_id = params.a; + int new_routing_id = params.b; + new_routing_id = worker_message_filter_->GetNextRoutingID(); MessagePortService::GetInstance()->UpdateMessagePort( sent_message_port_id, - filter->message_port_message_filter(), + worker_message_filter_->message_port_message_filter(), new_routing_id); + instance->SetMessagePortID(incoming_filter, + message.routing_id(), + sent_message_port_id); // Resend the message with the new routing id. - filter->Send(new WorkerMsg_Connect( - route_id, sent_message_port_id, new_routing_id)); + worker_message_filter_->Send(new WorkerMsg_Connect( + instance->worker_route_id(), sent_message_port_id, new_routing_id)); // Send any queued messages for the sent port. MessagePortService::GetInstance()->SendQueuedMessagesIfPossible( sent_message_port_id); } else { IPC::Message* new_message = new IPC::Message(message); - new_message->set_routing_id(route_id); - filter->Send(new_message); - if (message.type() == WorkerMsg_StartWorkerContext::ID) { - WorkerDevToolsManager::GetInstance()->WorkerContextStarted( - this, route_id); - } + new_message->set_routing_id(instance->worker_route_id()); + worker_message_filter_->Send(new_message); return; } } @@ -459,11 +551,27 @@ void WorkerProcessHost::FilterShutdown(WorkerMessageFilter* filter) { bool shutdown = false; i->RemoveFilters(filter); + int render_frame_id = 0; + const WorkerDocumentSet::DocumentInfoSet& documents = + i->worker_document_set()->documents(); + for (WorkerDocumentSet::DocumentInfoSet::const_iterator doc = + documents.begin(); doc != documents.end(); ++doc) { + if (doc->filter() == filter) { + render_frame_id = doc->render_frame_id(); + break; + } + } i->worker_document_set()->RemoveAll(filter); if (i->worker_document_set()->IsEmpty()) { shutdown = true; } if (shutdown) { + BrowserThread::PostTask( + BrowserThread::UI, FROM_HERE, + base::Bind(&WorkerTerminatedCallback, + filter->render_process_id(), + render_frame_id, + process_->GetData().id)); Send(new WorkerMsg_TerminateWorkerContext(i->worker_route_id())); i = instances_.erase(i); } else { @@ -487,7 +595,7 @@ void WorkerProcessHost::UpdateTitle() { if (title.empty()) { title = net::registry_controlled_domains::GetDomainAndRegistry( i->url(), - net::registry_controlled_domains::EXCLUDE_PRIVATE_REGISTRIES); + net::registry_controlled_domains::INCLUDE_PRIVATE_REGISTRIES); } // Use the host name if the domain is empty, i.e. localhost or IP address. @@ -508,15 +616,31 @@ void WorkerProcessHost::UpdateTitle() { display_title += *i; } - process_->SetName(UTF8ToUTF16(display_title)); + process_->SetName(base::UTF8ToUTF16(display_title)); } void WorkerProcessHost::DocumentDetached(WorkerMessageFilter* filter, unsigned long long document_id) { // Walk all instances and remove the document from their document set. for (Instances::iterator i = instances_.begin(); i != instances_.end();) { + int render_frame_id = 0; + const WorkerDocumentSet::DocumentInfoSet& documents = + i->worker_document_set()->documents(); + for (WorkerDocumentSet::DocumentInfoSet::const_iterator doc = + documents.begin(); doc != documents.end(); ++doc) { + if (doc->filter() == filter && doc->document_id() == document_id) { + render_frame_id = doc->render_frame_id(); + break; + } + } i->worker_document_set()->Remove(filter, document_id); if (i->worker_document_set()->IsEmpty()) { + BrowserThread::PostTask( + BrowserThread::UI, FROM_HERE, + base::Bind(&WorkerTerminatedCallback, + filter->render_process_id(), + render_frame_id, + process_->GetData().id)); // This worker has no more associated documents - shut it down. Send(new WorkerMsg_TerminateWorkerContext(i->worker_route_id())); i = instances_.erase(i); @@ -539,7 +663,7 @@ const ChildProcessData& WorkerProcessHost::GetData() { return process_->GetData(); } -std::vector<std::pair<int, int> > WorkerProcessHost::GetRenderViewIDsForWorker( +std::vector<std::pair<int, int> > WorkerProcessHost::GetRenderFrameIDsForWorker( int worker_route_id) { std::vector<std::pair<int, int> > result; WorkerProcessHost::Instances::const_iterator i; @@ -551,7 +675,7 @@ std::vector<std::pair<int, int> > WorkerProcessHost::GetRenderViewIDsForWorker( for (WorkerDocumentSet::DocumentInfoSet::const_iterator doc = documents.begin(); doc != documents.end(); ++doc) { result.push_back( - std::make_pair(doc->render_process_id(), doc->render_view_id())); + std::make_pair(doc->render_process_id(), doc->render_frame_id())); } break; } @@ -573,42 +697,39 @@ net::URLRequestContext* WorkerProcessHost::GetRequestContext( WorkerProcessHost::WorkerInstance::WorkerInstance( const GURL& url, const base::string16& name, + const base::string16& content_security_policy, + blink::WebContentSecurityPolicyType security_policy_type, int worker_route_id, - int parent_process_id, - int64 main_resource_appcache_id, + int render_frame_id, ResourceContext* resource_context, const WorkerStoragePartition& partition) : url_(url), closed_(false), name_(name), + content_security_policy_(content_security_policy), + security_policy_type_(security_policy_type), worker_route_id_(worker_route_id), - parent_process_id_(parent_process_id), - main_resource_appcache_id_(main_resource_appcache_id), + render_frame_id_(render_frame_id), worker_document_set_(new WorkerDocumentSet()), resource_context_(resource_context), - partition_(partition) { + partition_(partition), + load_failed_(false) { DCHECK(resource_context_); } -WorkerProcessHost::WorkerInstance::WorkerInstance( - const GURL& url, - bool shared, - const base::string16& name, - ResourceContext* resource_context, - const WorkerStoragePartition& partition) - : url_(url), - closed_(false), - name_(name), - worker_route_id_(MSG_ROUTING_NONE), - parent_process_id_(0), - main_resource_appcache_id_(0), - worker_document_set_(new WorkerDocumentSet()), - resource_context_(resource_context), - partition_(partition) { - DCHECK(resource_context_); +WorkerProcessHost::WorkerInstance::~WorkerInstance() { } -WorkerProcessHost::WorkerInstance::~WorkerInstance() { +void WorkerProcessHost::WorkerInstance::SetMessagePortID( + WorkerMessageFilter* filter, + int route_id, + int message_port_id) { + for (FilterList::iterator i = filters_.begin(); i != filters_.end(); ++i) { + if (i->filter() == filter && i->route_id() == route_id) { + i->set_message_port_id(message_port_id); + return; + } + } } // Compares an instance based on the algorithm in the WebWorkers spec - an @@ -656,7 +777,7 @@ void WorkerProcessHost::WorkerInstance::AddFilter(WorkerMessageFilter* filter, void WorkerProcessHost::WorkerInstance::RemoveFilter( WorkerMessageFilter* filter, int route_id) { for (FilterList::iterator i = filters_.begin(); i != filters_.end();) { - if (i->first == filter && i->second == route_id) + if (i->filter() == filter && i->route_id() == route_id) i = filters_.erase(i); else ++i; @@ -668,7 +789,7 @@ void WorkerProcessHost::WorkerInstance::RemoveFilter( void WorkerProcessHost::WorkerInstance::RemoveFilters( WorkerMessageFilter* filter) { for (FilterList::iterator i = filters_.begin(); i != filters_.end();) { - if (i->first == filter) + if (i->filter() == filter) i = filters_.erase(i); else ++i; @@ -679,21 +800,21 @@ bool WorkerProcessHost::WorkerInstance::HasFilter( WorkerMessageFilter* filter, int route_id) const { for (FilterList::const_iterator i = filters_.begin(); i != filters_.end(); ++i) { - if (i->first == filter && i->second == route_id) + if (i->filter() == filter && i->route_id() == route_id) return true; } return false; } -bool WorkerProcessHost::WorkerInstance::RendererIsParent( - int render_process_id, int render_view_id) const { +bool WorkerProcessHost::WorkerInstance::FrameIsParent( + int render_process_id, int render_frame_id) const { const WorkerDocumentSet::DocumentInfoSet& parents = worker_document_set()->documents(); for (WorkerDocumentSet::DocumentInfoSet::const_iterator parent_iter = parents.begin(); parent_iter != parents.end(); ++parent_iter) { if (parent_iter->render_process_id() == render_process_id && - parent_iter->render_view_id() == render_view_id) { + parent_iter->render_frame_id() == render_frame_id) { return true; } } |