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" 155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "content/browser/shared_worker/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) 3403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)void NotifyWorkerReadyForInspection(int worker_process_id, 3503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) int worker_route_id) { 3603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) if (!BrowserThread::CurrentlyOn(BrowserThread::UI)) { 3703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) BrowserThread::PostTask(BrowserThread::UI, 3803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) FROM_HERE, 3903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) base::Bind(NotifyWorkerReadyForInspection, 4003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) worker_process_id, 4103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) worker_route_id)); 4203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) return; 4303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) } 4403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) EmbeddedWorkerDevToolsManager::GetInstance()->WorkerReadyForInspection( 4503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) worker_process_id, worker_route_id); 4603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)} 4703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 48cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void NotifyWorkerContextStarted(int worker_process_id, int worker_route_id) { 49cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (!BrowserThread::CurrentlyOn(BrowserThread::UI)) { 50cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) BrowserThread::PostTask( 51cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) BrowserThread::UI, 52cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) FROM_HERE, 53cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) base::Bind( 54cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) NotifyWorkerContextStarted, worker_process_id, worker_route_id)); 55cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return; 56cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 57010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EmbeddedWorkerDevToolsManager::GetInstance()->WorkerContextStarted( 58c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch worker_process_id, worker_route_id); 59c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 60c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 61cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void NotifyWorkerDestroyed(int worker_process_id, int worker_route_id) { 62cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (!BrowserThread::CurrentlyOn(BrowserThread::UI)) { 63cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) BrowserThread::PostTask( 64cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) BrowserThread::UI, 65cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) FROM_HERE, 66cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) base::Bind(NotifyWorkerDestroyed, worker_process_id, worker_route_id)); 67cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return; 68cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 69010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EmbeddedWorkerDevToolsManager::GetInstance()->WorkerDestroyed( 70010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) worker_process_id, worker_route_id); 71c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 72c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 73a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} // namespace 74a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 75c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen MurdochSharedWorkerHost::SharedWorkerHost(SharedWorkerInstance* instance, 760529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch SharedWorkerMessageFilter* filter, 770529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch int worker_route_id) 78a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) : instance_(instance), 794ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch worker_document_set_(new WorkerDocumentSet()), 80c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch container_render_filter_(filter), 81c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch worker_process_id_(filter->render_process_id()), 820529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch worker_route_id_(worker_route_id), 834ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch load_failed_(false), 844ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch closed_(false), 851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci creation_time_(base::TimeTicks::Now()), 861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci weak_factory_(this) { 87a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 88a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 89a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 90a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)SharedWorkerHost::~SharedWorkerHost() { 91a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 92effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch UMA_HISTOGRAM_LONG_TIMES("SharedWorker.TimeToDeleted", 93effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch base::TimeTicks::Now() - creation_time_); 94a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // If we crashed, tell the RenderViewHosts. 954ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch if (instance_ && !load_failed_) { 96a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const WorkerDocumentSet::DocumentInfoSet& parents = 974ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch worker_document_set_->documents(); 98a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) for (WorkerDocumentSet::DocumentInfoSet::const_iterator parent_iter = 99a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) parents.begin(); 100a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) parent_iter != parents.end(); 101a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ++parent_iter) { 102a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) BrowserThread::PostTask(BrowserThread::UI, 103a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) FROM_HERE, 104a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::Bind(&WorkerCrashCallback, 105a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) parent_iter->render_process_id(), 106a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) parent_iter->render_frame_id())); 107a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 108a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 109cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (!closed_) 110cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) NotifyWorkerDestroyed(worker_process_id_, worker_route_id_); 111c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch SharedWorkerServiceImpl::GetInstance()->NotifyWorkerDestroyed( 112c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch worker_process_id_, worker_route_id_); 113a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 114a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 115a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)bool SharedWorkerHost::Send(IPC::Message* message) { 116a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (!container_render_filter_) { 117a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) delete message; 118a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return false; 119a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 120a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return container_render_filter_->Send(message); 121a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 122a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 123c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid SharedWorkerHost::Start(bool pause_on_start) { 124a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) WorkerProcessMsg_CreateWorker_Params params; 125a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) params.url = instance_->url(); 126a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) params.name = instance_->name(); 127a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) params.content_security_policy = instance_->content_security_policy(); 128a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) params.security_policy_type = instance_->security_policy_type(); 129c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch params.pause_on_start = pause_on_start; 130a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) params.route_id = worker_route_id_; 131a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) Send(new WorkerProcessMsg_CreateWorker(params)); 132a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 1334ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch for (FilterList::const_iterator i = filters_.begin(); i != filters_.end(); 1344ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch ++i) { 135a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) i->filter()->Send(new ViewMsg_WorkerCreated(i->route_id())); 136a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 137a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 138a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 139a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)bool SharedWorkerHost::FilterMessage(const IPC::Message& message, 140a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) SharedWorkerMessageFilter* filter) { 141a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (!instance_) 142a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return false; 143a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 1444ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch if (!closed_ && HasFilter(filter, message.routing_id())) { 145a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) RelayMessage(message, filter); 146a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return true; 147a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 148a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 149a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return false; 150a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 151a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 152a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void SharedWorkerHost::FilterShutdown(SharedWorkerMessageFilter* filter) { 153a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (!instance_) 154a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return; 1554ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch RemoveFilters(filter); 1564ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch worker_document_set_->RemoveAll(filter); 1574ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch if (worker_document_set_->IsEmpty()) { 158a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // This worker has no more associated documents - shut it down. 159a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) Send(new WorkerMsg_TerminateWorkerContext(worker_route_id_)); 160a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 161a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 162a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 163a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void SharedWorkerHost::DocumentDetached(SharedWorkerMessageFilter* filter, 164a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) unsigned long long document_id) { 165a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (!instance_) 166a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return; 167a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Walk all instances and remove the document from their document set. 1684ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch worker_document_set_->Remove(filter, document_id); 1694ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch if (worker_document_set_->IsEmpty()) { 170a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // This worker has no more associated documents - shut it down. 171a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) Send(new WorkerMsg_TerminateWorkerContext(worker_route_id_)); 172a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 173a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 174a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 175a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void SharedWorkerHost::WorkerContextClosed() { 176a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (!instance_) 177a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return; 178a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Set the closed flag - this will stop any further messages from 179a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // being sent to the worker (messages can still be sent from the worker, 180a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // for exception reporting, etc). 1814ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch closed_ = true; 182cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) NotifyWorkerDestroyed(worker_process_id_, worker_route_id_); 183a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 184a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 185a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void SharedWorkerHost::WorkerContextDestroyed() { 186a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (!instance_) 187a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return; 188a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) instance_.reset(); 1894ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch worker_document_set_ = NULL; 190a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 191a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 19203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)void SharedWorkerHost::WorkerReadyForInspection() { 19303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) NotifyWorkerReadyForInspection(worker_process_id_, worker_route_id_); 19403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)} 19503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 196a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void SharedWorkerHost::WorkerScriptLoaded() { 197effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch UMA_HISTOGRAM_TIMES("SharedWorker.TimeToScriptLoaded", 198effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch base::TimeTicks::Now() - creation_time_); 199cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) NotifyWorkerContextStarted(worker_process_id_, worker_route_id_); 200a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 201a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 202a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void SharedWorkerHost::WorkerScriptLoadFailed() { 203effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch UMA_HISTOGRAM_TIMES("SharedWorker.TimeToScriptLoadFailed", 204effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch base::TimeTicks::Now() - creation_time_); 205a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (!instance_) 206a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return; 2074ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch load_failed_ = true; 2084ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch for (FilterList::const_iterator i = filters_.begin(); i != filters_.end(); 2094ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch ++i) { 210a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) i->filter()->Send(new ViewMsg_WorkerScriptLoadFailed(i->route_id())); 211a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 212a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 213a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 214a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void SharedWorkerHost::WorkerConnected(int message_port_id) { 215a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (!instance_) 216a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return; 2174ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch for (FilterList::const_iterator i = filters_.begin(); i != filters_.end(); 2184ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch ++i) { 219a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (i->message_port_id() != message_port_id) 220a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) continue; 221a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) i->filter()->Send(new ViewMsg_WorkerConnected(i->route_id())); 222a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return; 223a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 224a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 225a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 226a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void SharedWorkerHost::AllowDatabase(const GURL& url, 227a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const base::string16& name, 228a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const base::string16& display_name, 229a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) unsigned long estimated_size, 230a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) bool* result) { 231a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (!instance_) 232a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return; 233a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) *result = GetContentClient()->browser()->AllowWorkerDatabase( 234a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) url, 235a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) name, 236a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) display_name, 237a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) estimated_size, 238a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) instance_->resource_context(), 239a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) GetRenderFrameIDsForWorker()); 240a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 241a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 242a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void SharedWorkerHost::AllowFileSystem(const GURL& url, 243116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scoped_ptr<IPC::Message> reply_msg) { 244a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (!instance_) 245a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return; 246116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch GetContentClient()->browser()->AllowWorkerFileSystem( 247116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch url, 248116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch instance_->resource_context(), 249116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch GetRenderFrameIDsForWorker(), 250116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch base::Bind(&SharedWorkerHost::AllowFileSystemResponse, 251116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch weak_factory_.GetWeakPtr(), 252116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch base::Passed(&reply_msg))); 253116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 254116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 255116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid SharedWorkerHost::AllowFileSystemResponse( 256116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scoped_ptr<IPC::Message> reply_msg, 257116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch bool allowed) { 258116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch WorkerProcessHostMsg_RequestFileSystemAccessSync::WriteReplyParams( 259116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch reply_msg.get(), 260116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch allowed); 261116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch Send(reply_msg.release()); 262a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 263a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 264a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void SharedWorkerHost::AllowIndexedDB(const GURL& url, 265a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const base::string16& name, 266a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) bool* result) { 267a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (!instance_) 268a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return; 269a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) *result = GetContentClient()->browser()->AllowWorkerIndexedDB( 270a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) url, name, instance_->resource_context(), GetRenderFrameIDsForWorker()); 271a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 272a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 273a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void SharedWorkerHost::RelayMessage( 274a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const IPC::Message& message, 275a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) SharedWorkerMessageFilter* incoming_filter) { 276a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (!instance_) 277a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return; 278a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (message.type() == WorkerMsg_Connect::ID) { 279a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Crack the SharedWorker Connect message to setup routing for the port. 280cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) WorkerMsg_Connect::Param param; 281cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (!WorkerMsg_Connect::Read(&message, ¶m)) 282a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return; 283cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) int sent_message_port_id = param.a; 284cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) int new_routing_id = param.b; 285cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 286a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) DCHECK(container_render_filter_); 287a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) new_routing_id = container_render_filter_->GetNextRoutingID(); 288a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) MessagePortService::GetInstance()->UpdateMessagePort( 289a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) sent_message_port_id, 290a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) container_render_filter_->message_port_message_filter(), 291a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) new_routing_id); 2924ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch SetMessagePortID( 2934ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch incoming_filter, message.routing_id(), sent_message_port_id); 294a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Resend the message with the new routing id. 295a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) Send(new WorkerMsg_Connect( 296a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) worker_route_id_, sent_message_port_id, new_routing_id)); 297a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 298a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Send any queued messages for the sent port. 299a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) MessagePortService::GetInstance()->SendQueuedMessagesIfPossible( 300a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) sent_message_port_id); 301a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } else { 302a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) IPC::Message* new_message = new IPC::Message(message); 303a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) new_message->set_routing_id(worker_route_id_); 304a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) Send(new_message); 305a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return; 306a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 307a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 308a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 309a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void SharedWorkerHost::TerminateWorker() { 310a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) Send(new WorkerMsg_TerminateWorkerContext(worker_route_id_)); 311a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 312a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 313a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)std::vector<std::pair<int, int> > 314a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)SharedWorkerHost::GetRenderFrameIDsForWorker() { 315a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) std::vector<std::pair<int, int> > result; 316a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (!instance_) 317a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return result; 318a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const WorkerDocumentSet::DocumentInfoSet& documents = 3194ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch worker_document_set_->documents(); 320a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) for (WorkerDocumentSet::DocumentInfoSet::const_iterator doc = 321a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) documents.begin(); 322a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) doc != documents.end(); 323a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ++doc) { 324a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) result.push_back( 325a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) std::make_pair(doc->render_process_id(), doc->render_frame_id())); 326a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 327a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return result; 328a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 329a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 3304ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdochvoid SharedWorkerHost::AddFilter(SharedWorkerMessageFilter* filter, 3314ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch int route_id) { 3324ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch CHECK(filter); 3334ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch if (!HasFilter(filter, route_id)) { 3344ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch FilterInfo info(filter, route_id); 3354ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch filters_.push_back(info); 3364ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch } 3374ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch} 3384ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch 3394ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdochvoid SharedWorkerHost::RemoveFilters(SharedWorkerMessageFilter* filter) { 3404ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch for (FilterList::iterator i = filters_.begin(); i != filters_.end();) { 3414ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch if (i->filter() == filter) 3424ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch i = filters_.erase(i); 3434ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch else 3444ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch ++i; 3454ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch } 3464ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch} 3474ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch 3484ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdochbool SharedWorkerHost::HasFilter(SharedWorkerMessageFilter* filter, 3494ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch int route_id) const { 3504ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch for (FilterList::const_iterator i = filters_.begin(); i != filters_.end(); 3514ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch ++i) { 3524ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch if (i->filter() == filter && i->route_id() == route_id) 3534ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch return true; 3544ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch } 3554ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch return false; 3564ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch} 3574ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch 3584ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdochvoid SharedWorkerHost::SetMessagePortID(SharedWorkerMessageFilter* filter, 3594ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch int route_id, 3604ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch int message_port_id) { 3614ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch for (FilterList::iterator i = filters_.begin(); i != filters_.end(); ++i) { 3624ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch if (i->filter() == filter && i->route_id() == route_id) { 3634ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch i->set_message_port_id(message_port_id); 3644ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch return; 3654ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch } 3664ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch } 3674ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch} 3684ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch 369a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} // namespace content 370