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, &param))
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