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