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/child/service_worker/service_worker_network_provider.h" 6a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 7a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "base/atomic_sequence_num.h" 8a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "content/child/child_thread.h" 9010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "content/child/service_worker/service_worker_provider_context.h" 10a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "content/common/service_worker/service_worker_messages.h" 11a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 12a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)namespace content { 13a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 14a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)namespace { 15a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 16a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)const char kUserDataKey[] = "SWProviderKey"; 17a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 18a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// Must be unique in the child process. 19a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)int GetNextProviderId() { 20a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) static base::StaticAtomicSequenceNumber sequence; 21a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return sequence.GetNext(); // We start at zero. 22a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 23a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 24a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} // namespace 25a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 26a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void ServiceWorkerNetworkProvider::AttachToDocumentState( 27a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::SupportsUserData* datasource_userdata, 28a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) scoped_ptr<ServiceWorkerNetworkProvider> network_provider) { 29a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) datasource_userdata->SetUserData(&kUserDataKey, network_provider.release()); 30a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 31a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 32a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)ServiceWorkerNetworkProvider* ServiceWorkerNetworkProvider::FromDocumentState( 33a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::SupportsUserData* datasource_userdata) { 34a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return static_cast<ServiceWorkerNetworkProvider*>( 35a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) datasource_userdata->GetUserData(&kUserDataKey)); 36a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 37a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 38a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)ServiceWorkerNetworkProvider::ServiceWorkerNetworkProvider() 39010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) : provider_id_(GetNextProviderId()), 40010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) context_(new ServiceWorkerProviderContext(provider_id_)) { 41a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (!ChildThread::current()) 42a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return; // May be null in some tests. 43a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ChildThread::current()->Send( 44a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) new ServiceWorkerHostMsg_ProviderCreated(provider_id_)); 45a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 46a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 47a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)ServiceWorkerNetworkProvider::~ServiceWorkerNetworkProvider() { 48a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (!ChildThread::current()) 49a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return; // May be null in some tests. 50a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ChildThread::current()->Send( 51a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) new ServiceWorkerHostMsg_ProviderDestroyed(provider_id_)); 52a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 53a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 54e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdochvoid ServiceWorkerNetworkProvider::SetServiceWorkerVersionId( 55e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch int64 version_id) { 56e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch if (!ChildThread::current()) 57e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch return; // May be null in some tests. 58e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch ChildThread::current()->Send( 59e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch new ServiceWorkerHostMsg_SetVersionId(provider_id_, version_id)); 60e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch} 61e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch 62a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} // namespace content 63