shared_worker_host.cc revision effb81e5f8246d0db0270817048dc992db66e9fb
1a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved. 2a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 3a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// found in the LICENSE file. 4a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 5a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "content/browser/shared_worker/shared_worker_host.h" 6a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 7effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "base/metrics/histogram.h" 8a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "content/browser/frame_host/render_frame_host_delegate.h" 9a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "content/browser/frame_host/render_frame_host_impl.h" 10a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "content/browser/message_port_service.h" 11a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "content/browser/shared_worker/shared_worker_instance.h" 12a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "content/browser/shared_worker/shared_worker_message_filter.h" 13a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "content/common/view_messages.h" 14a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "content/common/worker_messages.h" 15a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "content/public/browser/browser_thread.h" 16a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "content/public/browser/content_browser_client.h" 17a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "content/public/common/content_client.h" 18a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 19a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)namespace content { 20a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)namespace { 21a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 22a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// Notifies RenderViewHost that one or more worker objects crashed. 23a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void WorkerCrashCallback(int render_process_unique_id, int render_frame_id) { 24a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) RenderFrameHostImpl* host = 25a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) RenderFrameHostImpl::FromID(render_process_unique_id, render_frame_id); 26a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (host) 27a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) host->delegate()->WorkerCrashed(host); 28a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 29a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 30a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} // namespace 31a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 32a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)SharedWorkerHost::SharedWorkerHost(SharedWorkerInstance* instance) 33a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) : instance_(instance), 34a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) container_render_filter_(NULL), 35effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch worker_route_id_(MSG_ROUTING_NONE), 36effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch creation_time_(base::TimeTicks::Now()) { 37a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 38a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 39a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 40a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)SharedWorkerHost::~SharedWorkerHost() { 41a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 42effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch UMA_HISTOGRAM_LONG_TIMES("SharedWorker.TimeToDeleted", 43effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch base::TimeTicks::Now() - creation_time_); 44a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // If we crashed, tell the RenderViewHosts. 45a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (instance_ && !instance_->load_failed()) { 46a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const WorkerDocumentSet::DocumentInfoSet& parents = 47a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) instance_->worker_document_set()->documents(); 48a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) for (WorkerDocumentSet::DocumentInfoSet::const_iterator parent_iter = 49a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) parents.begin(); 50a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) parent_iter != parents.end(); 51a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ++parent_iter) { 52a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) BrowserThread::PostTask(BrowserThread::UI, 53a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) FROM_HERE, 54a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::Bind(&WorkerCrashCallback, 55a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) parent_iter->render_process_id(), 56a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) parent_iter->render_frame_id())); 57a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 58a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 59a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 60a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 61a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)bool SharedWorkerHost::Send(IPC::Message* message) { 62a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (!container_render_filter_) { 63a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) delete message; 64a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return false; 65a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 66a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return container_render_filter_->Send(message); 67a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 68a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 69a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void SharedWorkerHost::Init(SharedWorkerMessageFilter* filter) { 70a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) CHECK(instance_); 71a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) DCHECK(worker_route_id_ == MSG_ROUTING_NONE); 72a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) container_render_filter_ = filter; 73a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) worker_route_id_ = filter->GetNextRoutingID(); 74a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 75a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) WorkerProcessMsg_CreateWorker_Params params; 76a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) params.url = instance_->url(); 77a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) params.name = instance_->name(); 78a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) params.content_security_policy = instance_->content_security_policy(); 79a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) params.security_policy_type = instance_->security_policy_type(); 80a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) params.route_id = worker_route_id_; 81a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) Send(new WorkerProcessMsg_CreateWorker(params)); 82a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 83a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) for (SharedWorkerInstance::FilterList::const_iterator i = 84a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) instance_->filters().begin(); 85a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) i != instance_->filters().end(); ++i) { 86a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) i->filter()->Send(new ViewMsg_WorkerCreated(i->route_id())); 87a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 88a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 89a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 90a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)bool SharedWorkerHost::FilterMessage(const IPC::Message& message, 91a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) SharedWorkerMessageFilter* filter) { 92a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (!instance_) 93a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return false; 94a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 95a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (!instance_->closed() && 96a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) instance_->HasFilter(filter, message.routing_id())) { 97a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) RelayMessage(message, filter); 98a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return true; 99a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 100a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 101a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return false; 102a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 103a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 104a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void SharedWorkerHost::FilterShutdown(SharedWorkerMessageFilter* filter) { 105a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (!instance_) 106a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return; 107a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) instance_->RemoveFilters(filter); 108a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) instance_->worker_document_set()->RemoveAll(filter); 109a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (instance_->worker_document_set()->IsEmpty()) { 110a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // This worker has no more associated documents - shut it down. 111a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) Send(new WorkerMsg_TerminateWorkerContext(worker_route_id_)); 112a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 113a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 114a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 115a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void SharedWorkerHost::DocumentDetached(SharedWorkerMessageFilter* filter, 116a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) unsigned long long document_id) { 117a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (!instance_) 118a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return; 119a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Walk all instances and remove the document from their document set. 120a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) instance_->worker_document_set()->Remove(filter, document_id); 121a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (instance_->worker_document_set()->IsEmpty()) { 122a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // This worker has no more associated documents - shut it down. 123a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) Send(new WorkerMsg_TerminateWorkerContext(worker_route_id_)); 124a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 125a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 126a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 127a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void SharedWorkerHost::WorkerContextClosed() { 128a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (!instance_) 129a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return; 130a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Set the closed flag - this will stop any further messages from 131a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // being sent to the worker (messages can still be sent from the worker, 132a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // for exception reporting, etc). 133a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) instance_->set_closed(true); 134a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 135a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 136a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void SharedWorkerHost::WorkerContextDestroyed() { 137a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (!instance_) 138a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return; 139a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) instance_.reset(); 140a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 141a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 142a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void SharedWorkerHost::WorkerScriptLoaded() { 143a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // TODO(horo): implement this. 144effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch UMA_HISTOGRAM_TIMES("SharedWorker.TimeToScriptLoaded", 145effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch base::TimeTicks::Now() - creation_time_); 146a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 147a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 148a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void SharedWorkerHost::WorkerScriptLoadFailed() { 149effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch UMA_HISTOGRAM_TIMES("SharedWorker.TimeToScriptLoadFailed", 150effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch base::TimeTicks::Now() - creation_time_); 151a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (!instance_) 152a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return; 153a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) instance_->set_load_failed(true); 154a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) for (SharedWorkerInstance::FilterList::const_iterator i = 155a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) instance_->filters().begin(); 156a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) i != instance_->filters().end(); ++i) { 157a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) i->filter()->Send(new ViewMsg_WorkerScriptLoadFailed(i->route_id())); 158a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 159a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 160a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 161a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void SharedWorkerHost::WorkerConnected(int message_port_id) { 162a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (!instance_) 163a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return; 164a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) for (SharedWorkerInstance::FilterList::const_iterator i = 165a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) instance_->filters().begin(); 166a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) i != instance_->filters().end(); ++i) { 167a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (i->message_port_id() != message_port_id) 168a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) continue; 169a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) i->filter()->Send(new ViewMsg_WorkerConnected(i->route_id())); 170a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return; 171a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 172a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 173a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 174a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void SharedWorkerHost::AllowDatabase(const GURL& url, 175a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const base::string16& name, 176a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const base::string16& display_name, 177a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) unsigned long estimated_size, 178a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) bool* result) { 179a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (!instance_) 180a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return; 181a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) *result = GetContentClient()->browser()->AllowWorkerDatabase( 182a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) url, 183a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) name, 184a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) display_name, 185a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) estimated_size, 186a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) instance_->resource_context(), 187a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) GetRenderFrameIDsForWorker()); 188a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 189a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 190a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void SharedWorkerHost::AllowFileSystem(const GURL& url, 191a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) bool* result) { 192a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (!instance_) 193a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return; 194a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) *result = GetContentClient()->browser()->AllowWorkerFileSystem( 195a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) url, instance_->resource_context(), GetRenderFrameIDsForWorker()); 196a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 197a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 198a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void SharedWorkerHost::AllowIndexedDB(const GURL& url, 199a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const base::string16& name, 200a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) bool* result) { 201a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (!instance_) 202a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return; 203a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) *result = GetContentClient()->browser()->AllowWorkerIndexedDB( 204a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) url, name, instance_->resource_context(), GetRenderFrameIDsForWorker()); 205a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 206a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 207a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void SharedWorkerHost::RelayMessage( 208a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const IPC::Message& message, 209a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) SharedWorkerMessageFilter* incoming_filter) { 210a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (!instance_) 211a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return; 212a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (message.type() == WorkerMsg_Connect::ID) { 213a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Crack the SharedWorker Connect message to setup routing for the port. 214a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) int sent_message_port_id; 215a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) int new_routing_id; 216a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (!WorkerMsg_Connect::Read( 217a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) &message, &sent_message_port_id, &new_routing_id)) { 218a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return; 219a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 220a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) DCHECK(container_render_filter_); 221a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) new_routing_id = container_render_filter_->GetNextRoutingID(); 222a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) MessagePortService::GetInstance()->UpdateMessagePort( 223a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) sent_message_port_id, 224a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) container_render_filter_->message_port_message_filter(), 225a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) new_routing_id); 226a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) instance_->SetMessagePortID(incoming_filter, 227a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) message.routing_id(), 228a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) sent_message_port_id); 229a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Resend the message with the new routing id. 230a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) Send(new WorkerMsg_Connect( 231a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) worker_route_id_, sent_message_port_id, new_routing_id)); 232a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 233a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Send any queued messages for the sent port. 234a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) MessagePortService::GetInstance()->SendQueuedMessagesIfPossible( 235a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) sent_message_port_id); 236a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } else { 237a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) IPC::Message* new_message = new IPC::Message(message); 238a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) new_message->set_routing_id(worker_route_id_); 239a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) Send(new_message); 240a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return; 241a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 242a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 243a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 244a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void SharedWorkerHost::TerminateWorker() { 245a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) Send(new WorkerMsg_TerminateWorkerContext(worker_route_id_)); 246a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 247a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 248a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)std::vector<std::pair<int, int> > 249a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)SharedWorkerHost::GetRenderFrameIDsForWorker() { 250a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) std::vector<std::pair<int, int> > result; 251a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (!instance_) 252a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return result; 253a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const WorkerDocumentSet::DocumentInfoSet& documents = 254a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) instance_->worker_document_set()->documents(); 255a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) for (WorkerDocumentSet::DocumentInfoSet::const_iterator doc = 256a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) documents.begin(); 257a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) doc != documents.end(); 258a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ++doc) { 259a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) result.push_back( 260a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) std::make_pair(doc->render_process_id(), doc->render_frame_id())); 261a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 262a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return result; 263a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 264a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 265a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} // namespace content 266