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