shared_worker_host.cc revision 116680a4aac90f2aa7413d9095a592090648e557
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" 8010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "content/browser/devtools/embedded_worker_devtools_manager.h" 9a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "content/browser/frame_host/render_frame_host_delegate.h" 10a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "content/browser/frame_host/render_frame_host_impl.h" 11a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "content/browser/message_port_service.h" 12a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "content/browser/shared_worker/shared_worker_instance.h" 13a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "content/browser/shared_worker/shared_worker_message_filter.h" 14c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "content/browser/shared_worker/shared_worker_service_impl.h" 154ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch#include "content/browser/worker_host/worker_document_set.h" 16a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "content/common/view_messages.h" 17a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "content/common/worker_messages.h" 18a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "content/public/browser/browser_thread.h" 19a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "content/public/browser/content_browser_client.h" 20c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "content/public/browser/render_process_host.h" 21a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "content/public/common/content_client.h" 22a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 23a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)namespace content { 24a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)namespace { 25a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 26a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// Notifies RenderViewHost that one or more worker objects crashed. 27a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void WorkerCrashCallback(int render_process_unique_id, int render_frame_id) { 28a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) RenderFrameHostImpl* host = 29a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) RenderFrameHostImpl::FromID(render_process_unique_id, render_frame_id); 30a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (host) 31a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) host->delegate()->WorkerCrashed(host); 32a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 33a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 34cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void NotifyWorkerContextStarted(int worker_process_id, int worker_route_id) { 35cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (!BrowserThread::CurrentlyOn(BrowserThread::UI)) { 36cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) BrowserThread::PostTask( 37cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) BrowserThread::UI, 38cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) FROM_HERE, 39cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) base::Bind( 40cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) NotifyWorkerContextStarted, worker_process_id, worker_route_id)); 41cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return; 42cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 43010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EmbeddedWorkerDevToolsManager::GetInstance()->WorkerContextStarted( 44c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch worker_process_id, worker_route_id); 45c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 46c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 47cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void NotifyWorkerDestroyed(int worker_process_id, int worker_route_id) { 48cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (!BrowserThread::CurrentlyOn(BrowserThread::UI)) { 49cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) BrowserThread::PostTask( 50cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) BrowserThread::UI, 51cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) FROM_HERE, 52cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) base::Bind(NotifyWorkerDestroyed, worker_process_id, worker_route_id)); 53cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return; 54cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 55010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EmbeddedWorkerDevToolsManager::GetInstance()->WorkerDestroyed( 56010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) worker_process_id, worker_route_id); 57c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 58c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 59a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} // namespace 60a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 61c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen MurdochSharedWorkerHost::SharedWorkerHost(SharedWorkerInstance* instance, 620529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch SharedWorkerMessageFilter* filter, 630529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch int worker_route_id) 64a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) : instance_(instance), 654ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch worker_document_set_(new WorkerDocumentSet()), 66116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch weak_factory_(this), 67c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch container_render_filter_(filter), 68c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch worker_process_id_(filter->render_process_id()), 690529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch worker_route_id_(worker_route_id), 704ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch load_failed_(false), 714ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch closed_(false), 72effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch creation_time_(base::TimeTicks::Now()) { 73a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 74a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 75a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 76a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)SharedWorkerHost::~SharedWorkerHost() { 77a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 78effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch UMA_HISTOGRAM_LONG_TIMES("SharedWorker.TimeToDeleted", 79effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch base::TimeTicks::Now() - creation_time_); 80a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // If we crashed, tell the RenderViewHosts. 814ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch if (instance_ && !load_failed_) { 82a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const WorkerDocumentSet::DocumentInfoSet& parents = 834ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch worker_document_set_->documents(); 84a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) for (WorkerDocumentSet::DocumentInfoSet::const_iterator parent_iter = 85a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) parents.begin(); 86a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) parent_iter != parents.end(); 87a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ++parent_iter) { 88a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) BrowserThread::PostTask(BrowserThread::UI, 89a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) FROM_HERE, 90a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::Bind(&WorkerCrashCallback, 91a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) parent_iter->render_process_id(), 92a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) parent_iter->render_frame_id())); 93a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 94a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 95cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (!closed_) 96cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) NotifyWorkerDestroyed(worker_process_id_, worker_route_id_); 97c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch SharedWorkerServiceImpl::GetInstance()->NotifyWorkerDestroyed( 98c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch worker_process_id_, worker_route_id_); 99a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 100a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 101a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)bool SharedWorkerHost::Send(IPC::Message* message) { 102a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (!container_render_filter_) { 103a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) delete message; 104a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return false; 105a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 106a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return container_render_filter_->Send(message); 107a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 108a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 109c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid SharedWorkerHost::Start(bool pause_on_start) { 110a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) WorkerProcessMsg_CreateWorker_Params params; 111a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) params.url = instance_->url(); 112a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) params.name = instance_->name(); 113a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) params.content_security_policy = instance_->content_security_policy(); 114a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) params.security_policy_type = instance_->security_policy_type(); 115c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch params.pause_on_start = pause_on_start; 116a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) params.route_id = worker_route_id_; 117a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) Send(new WorkerProcessMsg_CreateWorker(params)); 118a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 1194ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch for (FilterList::const_iterator i = filters_.begin(); i != filters_.end(); 1204ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch ++i) { 121a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) i->filter()->Send(new ViewMsg_WorkerCreated(i->route_id())); 122a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 123a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 124a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 125a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)bool SharedWorkerHost::FilterMessage(const IPC::Message& message, 126a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) SharedWorkerMessageFilter* filter) { 127a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (!instance_) 128a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return false; 129a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 1304ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch if (!closed_ && HasFilter(filter, message.routing_id())) { 131a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) RelayMessage(message, filter); 132a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return true; 133a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 134a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 135a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return false; 136a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 137a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 138a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void SharedWorkerHost::FilterShutdown(SharedWorkerMessageFilter* filter) { 139a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (!instance_) 140a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return; 1414ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch RemoveFilters(filter); 1424ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch worker_document_set_->RemoveAll(filter); 1434ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch if (worker_document_set_->IsEmpty()) { 144a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // This worker has no more associated documents - shut it down. 145a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) Send(new WorkerMsg_TerminateWorkerContext(worker_route_id_)); 146a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 147a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 148a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 149a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void SharedWorkerHost::DocumentDetached(SharedWorkerMessageFilter* filter, 150a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) unsigned long long document_id) { 151a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (!instance_) 152a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return; 153a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Walk all instances and remove the document from their document set. 1544ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch worker_document_set_->Remove(filter, document_id); 1554ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch if (worker_document_set_->IsEmpty()) { 156a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // This worker has no more associated documents - shut it down. 157a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) Send(new WorkerMsg_TerminateWorkerContext(worker_route_id_)); 158a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 159a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 160a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 161a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void SharedWorkerHost::WorkerContextClosed() { 162a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (!instance_) 163a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return; 164a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Set the closed flag - this will stop any further messages from 165a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // being sent to the worker (messages can still be sent from the worker, 166a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // for exception reporting, etc). 1674ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch closed_ = true; 168cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) NotifyWorkerDestroyed(worker_process_id_, worker_route_id_); 169a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 170a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 171a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void SharedWorkerHost::WorkerContextDestroyed() { 172a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (!instance_) 173a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return; 174a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) instance_.reset(); 1754ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch worker_document_set_ = NULL; 176a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 177a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 178a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void SharedWorkerHost::WorkerScriptLoaded() { 179effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch UMA_HISTOGRAM_TIMES("SharedWorker.TimeToScriptLoaded", 180effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch base::TimeTicks::Now() - creation_time_); 181cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) NotifyWorkerContextStarted(worker_process_id_, worker_route_id_); 182a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 183a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 184a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void SharedWorkerHost::WorkerScriptLoadFailed() { 185effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch UMA_HISTOGRAM_TIMES("SharedWorker.TimeToScriptLoadFailed", 186effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch base::TimeTicks::Now() - creation_time_); 187a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (!instance_) 188a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return; 1894ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch load_failed_ = true; 1904ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch for (FilterList::const_iterator i = filters_.begin(); i != filters_.end(); 1914ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch ++i) { 192a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) i->filter()->Send(new ViewMsg_WorkerScriptLoadFailed(i->route_id())); 193a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 194a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 195a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 196a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void SharedWorkerHost::WorkerConnected(int message_port_id) { 197a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (!instance_) 198a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return; 1994ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch for (FilterList::const_iterator i = filters_.begin(); i != filters_.end(); 2004ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch ++i) { 201a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (i->message_port_id() != message_port_id) 202a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) continue; 203a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) i->filter()->Send(new ViewMsg_WorkerConnected(i->route_id())); 204a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return; 205a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 206a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 207a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 208a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void SharedWorkerHost::AllowDatabase(const GURL& url, 209a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const base::string16& name, 210a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const base::string16& display_name, 211a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) unsigned long estimated_size, 212a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) bool* result) { 213a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (!instance_) 214a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return; 215a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) *result = GetContentClient()->browser()->AllowWorkerDatabase( 216a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) url, 217a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) name, 218a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) display_name, 219a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) estimated_size, 220a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) instance_->resource_context(), 221a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) GetRenderFrameIDsForWorker()); 222a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 223a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 224a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void SharedWorkerHost::AllowFileSystem(const GURL& url, 225116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scoped_ptr<IPC::Message> reply_msg) { 226a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (!instance_) 227a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return; 228116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch GetContentClient()->browser()->AllowWorkerFileSystem( 229116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch url, 230116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch instance_->resource_context(), 231116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch GetRenderFrameIDsForWorker(), 232116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch base::Bind(&SharedWorkerHost::AllowFileSystemResponse, 233116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch weak_factory_.GetWeakPtr(), 234116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch base::Passed(&reply_msg))); 235116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 236116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 237116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid SharedWorkerHost::AllowFileSystemResponse( 238116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scoped_ptr<IPC::Message> reply_msg, 239116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch bool allowed) { 240116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch WorkerProcessHostMsg_RequestFileSystemAccessSync::WriteReplyParams( 241116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch reply_msg.get(), 242116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch allowed); 243116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch Send(reply_msg.release()); 244a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 245a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 246a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void SharedWorkerHost::AllowIndexedDB(const GURL& url, 247a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const base::string16& name, 248a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) bool* result) { 249a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (!instance_) 250a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return; 251a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) *result = GetContentClient()->browser()->AllowWorkerIndexedDB( 252a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) url, name, instance_->resource_context(), GetRenderFrameIDsForWorker()); 253a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 254a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 255a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void SharedWorkerHost::RelayMessage( 256a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const IPC::Message& message, 257a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) SharedWorkerMessageFilter* incoming_filter) { 258a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (!instance_) 259a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return; 260a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (message.type() == WorkerMsg_Connect::ID) { 261a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Crack the SharedWorker Connect message to setup routing for the port. 262cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) WorkerMsg_Connect::Param param; 263cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (!WorkerMsg_Connect::Read(&message, ¶m)) 264a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return; 265cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) int sent_message_port_id = param.a; 266cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) int new_routing_id = param.b; 267cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 268a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) DCHECK(container_render_filter_); 269a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) new_routing_id = container_render_filter_->GetNextRoutingID(); 270a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) MessagePortService::GetInstance()->UpdateMessagePort( 271a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) sent_message_port_id, 272a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) container_render_filter_->message_port_message_filter(), 273a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) new_routing_id); 2744ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch SetMessagePortID( 2754ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch incoming_filter, message.routing_id(), sent_message_port_id); 276a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Resend the message with the new routing id. 277a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) Send(new WorkerMsg_Connect( 278a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) worker_route_id_, sent_message_port_id, new_routing_id)); 279a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 280a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Send any queued messages for the sent port. 281a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) MessagePortService::GetInstance()->SendQueuedMessagesIfPossible( 282a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) sent_message_port_id); 283a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } else { 284a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) IPC::Message* new_message = new IPC::Message(message); 285a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) new_message->set_routing_id(worker_route_id_); 286a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) Send(new_message); 287a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return; 288a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 289a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 290a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 291a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void SharedWorkerHost::TerminateWorker() { 292a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) Send(new WorkerMsg_TerminateWorkerContext(worker_route_id_)); 293a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 294a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 295a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)std::vector<std::pair<int, int> > 296a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)SharedWorkerHost::GetRenderFrameIDsForWorker() { 297a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) std::vector<std::pair<int, int> > result; 298a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (!instance_) 299a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return result; 300a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const WorkerDocumentSet::DocumentInfoSet& documents = 3014ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch worker_document_set_->documents(); 302a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) for (WorkerDocumentSet::DocumentInfoSet::const_iterator doc = 303a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) documents.begin(); 304a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) doc != documents.end(); 305a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ++doc) { 306a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) result.push_back( 307a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) std::make_pair(doc->render_process_id(), doc->render_frame_id())); 308a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 309a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return result; 310a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 311a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 3124ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdochvoid SharedWorkerHost::AddFilter(SharedWorkerMessageFilter* filter, 3134ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch int route_id) { 3144ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch CHECK(filter); 3154ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch if (!HasFilter(filter, route_id)) { 3164ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch FilterInfo info(filter, route_id); 3174ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch filters_.push_back(info); 3184ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch } 3194ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch} 3204ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch 3214ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdochvoid SharedWorkerHost::RemoveFilters(SharedWorkerMessageFilter* filter) { 3224ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch for (FilterList::iterator i = filters_.begin(); i != filters_.end();) { 3234ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch if (i->filter() == filter) 3244ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch i = filters_.erase(i); 3254ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch else 3264ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch ++i; 3274ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch } 3284ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch} 3294ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch 3304ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdochbool SharedWorkerHost::HasFilter(SharedWorkerMessageFilter* filter, 3314ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch int route_id) const { 3324ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch for (FilterList::const_iterator i = filters_.begin(); i != filters_.end(); 3334ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch ++i) { 3344ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch if (i->filter() == filter && i->route_id() == route_id) 3354ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch return true; 3364ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch } 3374ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch return false; 3384ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch} 3394ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch 3404ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdochvoid SharedWorkerHost::SetMessagePortID(SharedWorkerMessageFilter* filter, 3414ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch int route_id, 3424ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch int message_port_id) { 3434ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch for (FilterList::iterator i = filters_.begin(); i != filters_.end(); ++i) { 3444ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch if (i->filter() == filter && i->route_id() == route_id) { 3454ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch i->set_message_port_id(message_port_id); 3464ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch return; 3474ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch } 3484ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch } 3494ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch} 3504ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch 351a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} // namespace content 352