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"
146e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "content/browser/service_worker/service_worker_registration_handle.h"
15a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "content/browser/service_worker/service_worker_utils.h"
16f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "content/browser/service_worker/service_worker_version.h"
1703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "content/common/resource_request_body.h"
180529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "content/common/service_worker/service_worker_messages.h"
19f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
20f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)namespace content {
21f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
22010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)static const int kDocumentMainThreadId = 0;
23010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
24f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)ServiceWorkerProviderHost::ServiceWorkerProviderHost(
25c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    int process_id, int provider_id,
26c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    base::WeakPtr<ServiceWorkerContextCore> context,
27c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    ServiceWorkerDispatcherHost* dispatcher_host)
28a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    : process_id_(process_id),
29c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      provider_id_(provider_id),
30c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      context_(context),
311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      dispatcher_host_(dispatcher_host),
321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      allow_association_(true) {
33f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
34f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
35f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)ServiceWorkerProviderHost::~ServiceWorkerProviderHost() {
365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // Clear docurl so the deferred activation of a waiting worker
375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // won't associate the new version with a provider being destroyed.
385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  document_url_ = GURL();
391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (controlling_version_.get())
40116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    controlling_version_->RemoveControllee(this);
411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (associated_registration_.get()) {
421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    DecreaseProcessReference(associated_registration_->pattern());
436e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    associated_registration_->RemoveListener(this);
441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  for (std::vector<GURL>::iterator it = associated_patterns_.begin();
461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci       it != associated_patterns_.end(); ++it) {
471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    DecreaseProcessReference(*it);
481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
496e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)}
506e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
516e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)void ServiceWorkerProviderHost::OnRegistrationFailed(
526e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    ServiceWorkerRegistration* registration) {
531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  DCHECK_EQ(associated_registration_.get(), registration);
541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  DisassociateRegistration();
55a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
56a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
5746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)void ServiceWorkerProviderHost::SetDocumentUrl(const GURL& url) {
5846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  DCHECK(!url.has_ref());
5946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  document_url_ = url;
6046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}
6146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
626e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)void ServiceWorkerProviderHost::SetControllerVersionAttribute(
63116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    ServiceWorkerVersion* version) {
641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (version == controlling_version_.get())
65116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    return;
666e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
676e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  scoped_refptr<ServiceWorkerVersion> previous_version = controlling_version_;
686e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  controlling_version_ = version;
69116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (version)
706e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    version->AddControllee(this);
711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (previous_version.get())
726e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    previous_version->RemoveControllee(this);
73116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
74116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (!dispatcher_host_)
75116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    return;  // Could be NULL in some tests.
76116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
776e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  dispatcher_host_->Send(new ServiceWorkerMsg_SetControllerServiceWorker(
78116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      kDocumentMainThreadId, provider_id(), CreateHandleAndPass(version)));
79116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
80116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
81c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochbool ServiceWorkerProviderHost::SetHostedVersionId(int64 version_id) {
82c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  if (!context_)
83c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    return true;  // System is shutting down.
841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (active_version())
85c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    return false;  // Unexpected bad message.
86c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
87c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  ServiceWorkerVersion* live_version = context_->GetLiveVersion(version_id);
88c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  if (!live_version)
89c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    return true;  // Was deleted before it got started.
90c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
91c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  ServiceWorkerVersionInfo info = live_version->GetInfo();
92c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  if (info.running_status != ServiceWorkerVersion::STARTING ||
93c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      info.process_id != process_id_) {
94c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    // If we aren't trying to start this version in our process
95c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    // something is amiss.
96c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    return false;
97c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  }
98c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
995c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  running_hosted_version_ = live_version;
100c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  return true;
101c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}
102c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
1036e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)void ServiceWorkerProviderHost::AssociateRegistration(
1046e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    ServiceWorkerRegistration* registration) {
1056e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  DCHECK(CanAssociateRegistration(registration));
1061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (associated_registration_.get())
1071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    DecreaseProcessReference(associated_registration_->pattern());
1081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  IncreaseProcessReference(registration->pattern());
1091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (dispatcher_host_) {
1111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    ServiceWorkerRegistrationHandle* handle =
1121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        dispatcher_host_->GetOrCreateRegistrationHandle(
1131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            provider_id(), registration);
1141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    ServiceWorkerVersionAttributes attrs;
1161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    attrs.installing = handle->CreateServiceWorkerHandleAndPass(
1171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        registration->installing_version());
1181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    attrs.waiting = handle->CreateServiceWorkerHandleAndPass(
1191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        registration->waiting_version());
1201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    attrs.active = handle->CreateServiceWorkerHandleAndPass(
1211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        registration->active_version());
1221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    dispatcher_host_->Send(new ServiceWorkerMsg_AssociateRegistration(
1241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        kDocumentMainThreadId, provider_id(), handle->GetObjectInfo(), attrs));
1251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
1261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1276e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  associated_registration_ = registration;
1281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  associated_registration_->AddListener(this);
1296e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  SetControllerVersionAttribute(registration->active_version());
1306e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)}
1316e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
1321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid ServiceWorkerProviderHost::DisassociateRegistration() {
1331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (!associated_registration_.get())
1346e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    return;
1351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  DecreaseProcessReference(associated_registration_->pattern());
1366e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  associated_registration_->RemoveListener(this);
1376e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  associated_registration_ = NULL;
1381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  SetControllerVersionAttribute(NULL);
1391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (dispatcher_host_) {
1411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    dispatcher_host_->Send(new ServiceWorkerMsg_DisassociateRegistration(
1421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        kDocumentMainThreadId, provider_id()));
1431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
1446e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)}
1456e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
1465c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuscoped_ptr<ServiceWorkerRequestHandler>
1475c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo LiuServiceWorkerProviderHost::CreateRequestHandler(
1485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    ResourceType resource_type,
14903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    base::WeakPtr<storage::BlobStorageContext> blob_storage_context,
15003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    scoped_refptr<ResourceRequestBody> body) {
1515c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  if (IsHostToRunningServiceWorker()) {
1525c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    return scoped_ptr<ServiceWorkerRequestHandler>(
1535c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        new ServiceWorkerContextRequestHandler(
154cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)            context_, AsWeakPtr(), blob_storage_context, resource_type));
1555c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  }
1565c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  if (ServiceWorkerUtils::IsMainResourceType(resource_type) ||
1571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      controlling_version()) {
1585c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    return scoped_ptr<ServiceWorkerRequestHandler>(
1595c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        new ServiceWorkerControlleeRequestHandler(
16003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)            context_, AsWeakPtr(), blob_storage_context, resource_type, body));
1615c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  }
1625c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  return scoped_ptr<ServiceWorkerRequestHandler>();
163f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
164f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1656e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)bool ServiceWorkerProviderHost::CanAssociateRegistration(
1666e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    ServiceWorkerRegistration* registration) {
167116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (!context_)
168116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    return false;
1691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (running_hosted_version_.get())
170f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    return false;
1711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (!registration || associated_registration_.get() || !allow_association_)
1726e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    return false;
1736e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  return true;
174f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}
175f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
176010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void ServiceWorkerProviderHost::PostMessage(
177010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    const base::string16& message,
178010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    const std::vector<int>& sent_message_port_ids) {
179010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  if (!dispatcher_host_)
180010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    return;  // Could be NULL in some tests.
181010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
182010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  std::vector<int> new_routing_ids;
183010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  dispatcher_host_->message_port_message_filter()->
184010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      UpdateMessagePortsWithNewRoutes(sent_message_port_ids,
185010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                      &new_routing_ids);
186010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
187010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  dispatcher_host_->Send(
188010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      new ServiceWorkerMsg_MessageToDocument(
189010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          kDocumentMainThreadId, provider_id(),
190010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          message,
191010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          sent_message_port_ids,
192010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          new_routing_ids));
193010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
194010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
1951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid ServiceWorkerProviderHost::AddScopedProcessReferenceToPattern(
1961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const GURL& pattern) {
1971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  associated_patterns_.push_back(pattern);
1981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  IncreaseProcessReference(pattern);
1991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
2001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
201f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)ServiceWorkerObjectInfo ServiceWorkerProviderHost::CreateHandleAndPass(
202f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    ServiceWorkerVersion* version) {
203f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  ServiceWorkerObjectInfo info;
204f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  if (context_ && version) {
205f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    scoped_ptr<ServiceWorkerHandle> handle =
2065f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        ServiceWorkerHandle::Create(context_,
2075f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                    dispatcher_host_,
2085f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                    kDocumentMainThreadId,
2095f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                    provider_id_,
2105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                    version);
211f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    info = handle->GetObjectInfo();
212f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    dispatcher_host_->RegisterServiceWorkerHandle(handle.Pass());
213f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  }
214f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  return info;
215f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}
216f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
2171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid ServiceWorkerProviderHost::IncreaseProcessReference(
2181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const GURL& pattern) {
2191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (context_ && context_->process_manager()) {
2201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    context_->process_manager()->AddProcessReferenceToPattern(
2211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        pattern, process_id_);
2221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
2231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
2241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid ServiceWorkerProviderHost::DecreaseProcessReference(
2261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const GURL& pattern) {
2271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (context_ && context_->process_manager()) {
2281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    context_->process_manager()->RemoveProcessReferenceFromPattern(
2291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        pattern, process_id_);
2301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
2311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
2321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
233f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)bool ServiceWorkerProviderHost::IsContextAlive() {
234f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  return context_ != NULL;
235f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}
236f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
237f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}  // namespace content
238