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