shared_worker_host.cc revision 4ad1aa43a48567659193a298fad74f55e00b3dd9
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" 134ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch#include "content/browser/worker_host/worker_document_set.h" 14a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "content/common/view_messages.h" 15a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "content/common/worker_messages.h" 16a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "content/public/browser/browser_thread.h" 17a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "content/public/browser/content_browser_client.h" 18a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "content/public/common/content_client.h" 19a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 20a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)namespace content { 21a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)namespace { 22a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 23a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// Notifies RenderViewHost that one or more worker objects crashed. 24a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void WorkerCrashCallback(int render_process_unique_id, int render_frame_id) { 25a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) RenderFrameHostImpl* host = 26a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) RenderFrameHostImpl::FromID(render_process_unique_id, render_frame_id); 27a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (host) 28a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) host->delegate()->WorkerCrashed(host); 29a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 30a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 31a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} // namespace 32a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 33a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)SharedWorkerHost::SharedWorkerHost(SharedWorkerInstance* instance) 34a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) : instance_(instance), 354ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch worker_document_set_(new WorkerDocumentSet()), 36a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) container_render_filter_(NULL), 37effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch worker_route_id_(MSG_ROUTING_NONE), 384ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch load_failed_(false), 394ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch closed_(false), 40effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch creation_time_(base::TimeTicks::Now()) { 41a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 42a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 43a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 44a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)SharedWorkerHost::~SharedWorkerHost() { 45a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 46effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch UMA_HISTOGRAM_LONG_TIMES("SharedWorker.TimeToDeleted", 47effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch base::TimeTicks::Now() - creation_time_); 48a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // If we crashed, tell the RenderViewHosts. 494ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch if (instance_ && !load_failed_) { 50a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const WorkerDocumentSet::DocumentInfoSet& parents = 514ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch worker_document_set_->documents(); 52a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) for (WorkerDocumentSet::DocumentInfoSet::const_iterator parent_iter = 53a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) parents.begin(); 54a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) parent_iter != parents.end(); 55a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ++parent_iter) { 56a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) BrowserThread::PostTask(BrowserThread::UI, 57a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) FROM_HERE, 58a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::Bind(&WorkerCrashCallback, 59a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) parent_iter->render_process_id(), 60a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) parent_iter->render_frame_id())); 61a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 62a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 63a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 64a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 65a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)bool SharedWorkerHost::Send(IPC::Message* message) { 66a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (!container_render_filter_) { 67a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) delete message; 68a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return false; 69a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 70a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return container_render_filter_->Send(message); 71a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 72a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 73a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void SharedWorkerHost::Init(SharedWorkerMessageFilter* filter) { 74a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) CHECK(instance_); 75a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) DCHECK(worker_route_id_ == MSG_ROUTING_NONE); 76a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) container_render_filter_ = filter; 77a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) worker_route_id_ = filter->GetNextRoutingID(); 78a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 79a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) WorkerProcessMsg_CreateWorker_Params params; 80a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) params.url = instance_->url(); 81a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) params.name = instance_->name(); 82a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) params.content_security_policy = instance_->content_security_policy(); 83a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) params.security_policy_type = instance_->security_policy_type(); 84a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) params.route_id = worker_route_id_; 85a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) Send(new WorkerProcessMsg_CreateWorker(params)); 86a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 874ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch for (FilterList::const_iterator i = filters_.begin(); i != filters_.end(); 884ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch ++i) { 89a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) i->filter()->Send(new ViewMsg_WorkerCreated(i->route_id())); 90a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 91a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 92a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 93a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)bool SharedWorkerHost::FilterMessage(const IPC::Message& message, 94a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) SharedWorkerMessageFilter* filter) { 95a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (!instance_) 96a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return false; 97a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 984ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch if (!closed_ && HasFilter(filter, message.routing_id())) { 99a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) RelayMessage(message, filter); 100a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return true; 101a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 102a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 103a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return false; 104a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 105a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 106a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void SharedWorkerHost::FilterShutdown(SharedWorkerMessageFilter* filter) { 107a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (!instance_) 108a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return; 1094ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch RemoveFilters(filter); 1104ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch worker_document_set_->RemoveAll(filter); 1114ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch if (worker_document_set_->IsEmpty()) { 112a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // This worker has no more associated documents - shut it down. 113a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) Send(new WorkerMsg_TerminateWorkerContext(worker_route_id_)); 114a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 115a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 116a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 117a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void SharedWorkerHost::DocumentDetached(SharedWorkerMessageFilter* filter, 118a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) unsigned long long document_id) { 119a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (!instance_) 120a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return; 121a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Walk all instances and remove the document from their document set. 1224ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch worker_document_set_->Remove(filter, document_id); 1234ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch if (worker_document_set_->IsEmpty()) { 124a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // This worker has no more associated documents - shut it down. 125a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) Send(new WorkerMsg_TerminateWorkerContext(worker_route_id_)); 126a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 127a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 128a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 129a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void SharedWorkerHost::WorkerContextClosed() { 130a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (!instance_) 131a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return; 132a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Set the closed flag - this will stop any further messages from 133a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // being sent to the worker (messages can still be sent from the worker, 134a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // for exception reporting, etc). 1354ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch closed_ = true; 136a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 137a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 138a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void SharedWorkerHost::WorkerContextDestroyed() { 139a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (!instance_) 140a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return; 141a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) instance_.reset(); 1424ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch worker_document_set_ = NULL; 143a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 144a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 145a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void SharedWorkerHost::WorkerScriptLoaded() { 146a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // TODO(horo): implement this. 147effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch UMA_HISTOGRAM_TIMES("SharedWorker.TimeToScriptLoaded", 148effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch base::TimeTicks::Now() - creation_time_); 149a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 150a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 151a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void SharedWorkerHost::WorkerScriptLoadFailed() { 152effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch UMA_HISTOGRAM_TIMES("SharedWorker.TimeToScriptLoadFailed", 153effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch base::TimeTicks::Now() - creation_time_); 154a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (!instance_) 155a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return; 1564ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch load_failed_ = true; 1574ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch for (FilterList::const_iterator i = filters_.begin(); i != filters_.end(); 1584ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch ++i) { 159a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) i->filter()->Send(new ViewMsg_WorkerScriptLoadFailed(i->route_id())); 160a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 161a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 162a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 163a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void SharedWorkerHost::WorkerConnected(int message_port_id) { 164a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (!instance_) 165a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return; 1664ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch for (FilterList::const_iterator i = filters_.begin(); i != filters_.end(); 1674ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch ++i) { 168a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (i->message_port_id() != message_port_id) 169a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) continue; 170a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) i->filter()->Send(new ViewMsg_WorkerConnected(i->route_id())); 171a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return; 172a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 173a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 174a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 175a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void SharedWorkerHost::AllowDatabase(const GURL& url, 176a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const base::string16& name, 177a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const base::string16& display_name, 178a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) unsigned long estimated_size, 179a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) bool* result) { 180a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (!instance_) 181a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return; 182a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) *result = GetContentClient()->browser()->AllowWorkerDatabase( 183a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) url, 184a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) name, 185a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) display_name, 186a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) estimated_size, 187a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) instance_->resource_context(), 188a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) GetRenderFrameIDsForWorker()); 189a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 190a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 191a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void SharedWorkerHost::AllowFileSystem(const GURL& url, 192a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) bool* result) { 193a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (!instance_) 194a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return; 195a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) *result = GetContentClient()->browser()->AllowWorkerFileSystem( 196a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) url, instance_->resource_context(), GetRenderFrameIDsForWorker()); 197a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 198a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 199a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void SharedWorkerHost::AllowIndexedDB(const GURL& url, 200a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const base::string16& name, 201a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) bool* result) { 202a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (!instance_) 203a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return; 204a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) *result = GetContentClient()->browser()->AllowWorkerIndexedDB( 205a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) url, name, instance_->resource_context(), GetRenderFrameIDsForWorker()); 206a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 207a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 208a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void SharedWorkerHost::RelayMessage( 209a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const IPC::Message& message, 210a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) SharedWorkerMessageFilter* incoming_filter) { 211a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (!instance_) 212a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return; 213a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (message.type() == WorkerMsg_Connect::ID) { 214a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Crack the SharedWorker Connect message to setup routing for the port. 215a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) int sent_message_port_id; 216a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) int new_routing_id; 217a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (!WorkerMsg_Connect::Read( 218a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) &message, &sent_message_port_id, &new_routing_id)) { 219a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return; 220a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 221a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) DCHECK(container_render_filter_); 222a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) new_routing_id = container_render_filter_->GetNextRoutingID(); 223a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) MessagePortService::GetInstance()->UpdateMessagePort( 224a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) sent_message_port_id, 225a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) container_render_filter_->message_port_message_filter(), 226a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) new_routing_id); 2274ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch SetMessagePortID( 2284ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch incoming_filter, message.routing_id(), 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 = 2544ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch 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) 2654ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdochvoid SharedWorkerHost::AddFilter(SharedWorkerMessageFilter* filter, 2664ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch int route_id) { 2674ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch CHECK(filter); 2684ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch if (!HasFilter(filter, route_id)) { 2694ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch FilterInfo info(filter, route_id); 2704ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch filters_.push_back(info); 2714ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch } 2724ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch} 2734ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch 2744ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdochvoid SharedWorkerHost::RemoveFilters(SharedWorkerMessageFilter* filter) { 2754ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch for (FilterList::iterator i = filters_.begin(); i != filters_.end();) { 2764ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch if (i->filter() == filter) 2774ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch i = filters_.erase(i); 2784ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch else 2794ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch ++i; 2804ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch } 2814ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch} 2824ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch 2834ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdochbool SharedWorkerHost::HasFilter(SharedWorkerMessageFilter* filter, 2844ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch int route_id) const { 2854ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch for (FilterList::const_iterator i = filters_.begin(); i != filters_.end(); 2864ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch ++i) { 2874ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch if (i->filter() == filter && i->route_id() == route_id) 2884ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch return true; 2894ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch } 2904ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch return false; 2914ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch} 2924ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch 2934ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdochvoid SharedWorkerHost::SetMessagePortID(SharedWorkerMessageFilter* filter, 2944ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch int route_id, 2954ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch int message_port_id) { 2964ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch for (FilterList::iterator i = filters_.begin(); i != filters_.end(); ++i) { 2974ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch if (i->filter() == filter && i->route_id() == route_id) { 2984ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch i->set_message_port_id(message_port_id); 2994ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch return; 3004ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch } 3014ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch } 3024ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch} 3034ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch 304a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} // namespace content 305