service_worker_provider_host.cc revision 116680a4aac90f2aa7413d9095a592090648e557
1f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved.
2f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
3f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// found in the LICENSE file.
4f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
5f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "content/browser/service_worker/service_worker_provider_host.h"
6f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
7a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "base/stl_util.h"
8010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "content/browser/message_port_message_filter.h"
9c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "content/browser/service_worker/service_worker_context_core.h"
105c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "content/browser/service_worker/service_worker_context_request_handler.h"
115c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "content/browser/service_worker/service_worker_controllee_request_handler.h"
12c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "content/browser/service_worker/service_worker_dispatcher_host.h"
13c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "content/browser/service_worker/service_worker_handle.h"
14a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "content/browser/service_worker/service_worker_utils.h"
15f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "content/browser/service_worker/service_worker_version.h"
160529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "content/common/service_worker/service_worker_messages.h"
17f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
18f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)namespace content {
19f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
20010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)static const int kDocumentMainThreadId = 0;
21010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
22f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)ServiceWorkerProviderHost::ServiceWorkerProviderHost(
23c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    int process_id, int provider_id,
24c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    base::WeakPtr<ServiceWorkerContextCore> context,
25c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    ServiceWorkerDispatcherHost* dispatcher_host)
26a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    : process_id_(process_id),
27c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      provider_id_(provider_id),
28c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      context_(context),
29c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      dispatcher_host_(dispatcher_host) {
30f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
31f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
32f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)ServiceWorkerProviderHost::~ServiceWorkerProviderHost() {
33116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (controlling_version_)
34116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    controlling_version_->RemoveControllee(this);
35c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  if (active_version_)
36116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    active_version_->RemovePotentialControllee(this);
37cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (waiting_version_)
38116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    waiting_version_->RemovePotentialControllee(this);
39116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (installing_version_)
40116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    installing_version_->RemovePotentialControllee(this);
41a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
42a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
4346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)void ServiceWorkerProviderHost::SetDocumentUrl(const GURL& url) {
4446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  DCHECK(!url.has_ref());
4546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  document_url_ = url;
4646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}
4746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
48116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid ServiceWorkerProviderHost::SetControllerVersion(
49116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    ServiceWorkerVersion* version) {
50116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  DCHECK(CanAssociateVersion(version));
51116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (version == controlling_version_)
52116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    return;
53116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  scoped_refptr<ServiceWorkerVersion> previous_version = controlling_version_;
54116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  controlling_version_ = version;
55116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (version)
56116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    version->AddControllee(this);
57116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (previous_version)
58116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    previous_version->RemoveControllee(this);
59116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
60116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (!dispatcher_host_)
61116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    return;  // Could be NULL in some tests.
62116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
63116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  dispatcher_host_->Send(new ServiceWorkerMsg_SetControllerServiceWorker(
64116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      kDocumentMainThreadId, provider_id(), CreateHandleAndPass(version)));
65116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
66116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
67c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid ServiceWorkerProviderHost::SetActiveVersion(
68c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    ServiceWorkerVersion* version) {
69116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  DCHECK(CanAssociateVersion(version));
70a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  if (version == active_version_)
71a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    return;
72c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  scoped_refptr<ServiceWorkerVersion> previous_version = active_version_;
73c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  active_version_ = version;
74c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  if (version)
75116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    version->AddPotentialControllee(this);
76c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  if (previous_version)
77116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    previous_version->RemovePotentialControllee(this);
78c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
79c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  if (!dispatcher_host_)
80c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    return;  // Could be NULL in some tests.
81c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
82116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  dispatcher_host_->Send(new ServiceWorkerMsg_SetActiveServiceWorker(
83f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      kDocumentMainThreadId, provider_id(), CreateHandleAndPass(version)));
84c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}
85c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
86cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void ServiceWorkerProviderHost::SetWaitingVersion(
87c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    ServiceWorkerVersion* version) {
88116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  DCHECK(CanAssociateVersion(version));
89cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (version == waiting_version_)
90a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    return;
91cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  scoped_refptr<ServiceWorkerVersion> previous_version = waiting_version_;
92cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  waiting_version_ = version;
93a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  if (version)
94116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    version->AddPotentialControllee(this);
95a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  if (previous_version)
96116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    previous_version->RemovePotentialControllee(this);
97a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
98a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  if (!dispatcher_host_)
99a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    return;  // Could be NULL in some tests.
100a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
101f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  dispatcher_host_->Send(new ServiceWorkerMsg_SetWaitingServiceWorker(
102f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      kDocumentMainThreadId, provider_id(), CreateHandleAndPass(version)));
103c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}
104c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
105116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid ServiceWorkerProviderHost::SetInstallingVersion(
106116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    ServiceWorkerVersion* version) {
107116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  DCHECK(CanAssociateVersion(version));
108116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (version == installing_version_)
109116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    return;
110116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  scoped_refptr<ServiceWorkerVersion> previous_version = installing_version_;
111116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  installing_version_ = version;
112116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (version)
113116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    version->AddPotentialControllee(this);
114116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (previous_version)
115116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    previous_version->RemovePotentialControllee(this);
116116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
117116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (!dispatcher_host_)
118116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    return;  // Could be NULL in some tests.
119116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
120116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  dispatcher_host_->Send(new ServiceWorkerMsg_SetInstallingServiceWorker(
121116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      kDocumentMainThreadId, provider_id(), CreateHandleAndPass(version)));
122116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
123116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
124116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid ServiceWorkerProviderHost::UnsetVersion(ServiceWorkerVersion* version) {
125116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (!version)
126116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    return;
127116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (installing_version_ == version)
128116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    SetInstallingVersion(NULL);
129116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  else if (waiting_version_  == version)
130116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    SetWaitingVersion(NULL);
131116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  else if (active_version_ == version)
132116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    SetActiveVersion(NULL);
133116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  else if (controlling_version_ == version)
134116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    SetControllerVersion(NULL);
135116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
136116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
137c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochbool ServiceWorkerProviderHost::SetHostedVersionId(int64 version_id) {
138c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  if (!context_)
139c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    return true;  // System is shutting down.
140c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  if (active_version_)
141c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    return false;  // Unexpected bad message.
142c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
143c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  ServiceWorkerVersion* live_version = context_->GetLiveVersion(version_id);
144c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  if (!live_version)
145c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    return true;  // Was deleted before it got started.
146c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
147c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  ServiceWorkerVersionInfo info = live_version->GetInfo();
148c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  if (info.running_status != ServiceWorkerVersion::STARTING ||
149c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      info.process_id != process_id_) {
150c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    // If we aren't trying to start this version in our process
151c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    // something is amiss.
152c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    return false;
153c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  }
154c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
1555c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  running_hosted_version_ = live_version;
156c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  return true;
157c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}
158c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
1595c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuscoped_ptr<ServiceWorkerRequestHandler>
1605c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo LiuServiceWorkerProviderHost::CreateRequestHandler(
161cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    ResourceType::Type resource_type,
162cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    base::WeakPtr<webkit_blob::BlobStorageContext> blob_storage_context) {
1635c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  if (IsHostToRunningServiceWorker()) {
1645c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    return scoped_ptr<ServiceWorkerRequestHandler>(
1655c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        new ServiceWorkerContextRequestHandler(
166cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)            context_, AsWeakPtr(), blob_storage_context, resource_type));
1675c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  }
1685c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  if (ServiceWorkerUtils::IsMainResourceType(resource_type) ||
1695c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      active_version()) {
1705c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    return scoped_ptr<ServiceWorkerRequestHandler>(
1715c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        new ServiceWorkerControlleeRequestHandler(
172cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)            context_, AsWeakPtr(), blob_storage_context, resource_type));
1735c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  }
1745c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  return scoped_ptr<ServiceWorkerRequestHandler>();
175f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
176f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
177116680a4aac90f2aa7413d9095a592090648e557Ben Murdochbool ServiceWorkerProviderHost::CanAssociateVersion(
178f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    ServiceWorkerVersion* version) {
179116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (!context_)
180116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    return false;
181f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  if (running_hosted_version_)
182f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    return false;
183f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  if (!version)
184f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    return true;
185f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
186116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ServiceWorkerVersion* already_associated_version = NULL;
187116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (controlling_version_)
188116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    already_associated_version = controlling_version_;
189116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (active_version_)
190116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    already_associated_version = active_version_;
191116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  else if (waiting_version_)
192116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    already_associated_version = waiting_version_;
193116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  else if (installing_version_)
194116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    already_associated_version = installing_version_;
195116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
196116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  return !already_associated_version ||
197116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch         already_associated_version->registration_id() ==
198116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch              version->registration_id();
199f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}
200f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
201010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void ServiceWorkerProviderHost::PostMessage(
202010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    const base::string16& message,
203010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    const std::vector<int>& sent_message_port_ids) {
204010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  if (!dispatcher_host_)
205010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    return;  // Could be NULL in some tests.
206010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
207010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  std::vector<int> new_routing_ids;
208010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  dispatcher_host_->message_port_message_filter()->
209010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      UpdateMessagePortsWithNewRoutes(sent_message_port_ids,
210010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                      &new_routing_ids);
211010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
212010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  dispatcher_host_->Send(
213010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      new ServiceWorkerMsg_MessageToDocument(
214010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          kDocumentMainThreadId, provider_id(),
215010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          message,
216010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          sent_message_port_ids,
217010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          new_routing_ids));
218010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
219010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
220f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)ServiceWorkerObjectInfo ServiceWorkerProviderHost::CreateHandleAndPass(
221f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    ServiceWorkerVersion* version) {
222f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  ServiceWorkerObjectInfo info;
223f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  if (context_ && version) {
224f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    scoped_ptr<ServiceWorkerHandle> handle =
225f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        ServiceWorkerHandle::Create(context_, dispatcher_host_,
226f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                    kDocumentMainThreadId, version);
227f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    info = handle->GetObjectInfo();
228f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    dispatcher_host_->RegisterServiceWorkerHandle(handle.Pass());
229f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  }
230f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  return info;
231f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}
232f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
233f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)bool ServiceWorkerProviderHost::IsContextAlive() {
234f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  return context_ != NULL;
235f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}
236f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
237f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}  // namespace content
238