1d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved. 2d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 3d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)// found in the LICENSE file. 4d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) 5d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)#include "config.h" 6d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)#include "ServiceWorkerContainerClient.h" 7d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) 8d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)#include "core/dom/Document.h" 9d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)#include "core/dom/ExecutionContext.h" 10d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)#include "core/frame/LocalFrame.h" 11d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)#include "core/loader/FrameLoaderClient.h" 12d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)#include "core/workers/WorkerGlobalScope.h" 13d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)#include "public/platform/WebServiceWorkerProvider.h" 14d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) 15c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)namespace blink { 16d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) 17e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)PassOwnPtrWillBeRawPtr<ServiceWorkerContainerClient> ServiceWorkerContainerClient::create(PassOwnPtr<WebServiceWorkerProvider> provider) 18d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){ 19f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu return adoptPtrWillBeNoop(new ServiceWorkerContainerClient(provider)); 20d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)} 21d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) 22d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)ServiceWorkerContainerClient::~ServiceWorkerContainerClient() 23d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){ 24d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)} 25d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) 26d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)const char* ServiceWorkerContainerClient::supplementName() 27d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){ 28d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) return "ServiceWorkerContainerClient"; 29d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)} 30d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) 31d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)ServiceWorkerContainerClient* ServiceWorkerContainerClient::from(ExecutionContext* context) 32d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){ 33d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) if (context->isDocument()) { 34d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) Document* document = toDocument(context); 35aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch if (!document->frame()) 36aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch return 0; 37aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch 38aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch ServiceWorkerContainerClient* client = static_cast<ServiceWorkerContainerClient*>(DocumentSupplement::from(document, supplementName())); 39d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) if (client) 40d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) return client; 41d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) 42aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch // If it's not provided yet, create it lazily. 43f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu document->DocumentSupplementable::provideSupplement(ServiceWorkerContainerClient::supplementName(), ServiceWorkerContainerClient::create(document->frame()->loader().client()->createServiceWorkerProvider())); 44aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch return static_cast<ServiceWorkerContainerClient*>(DocumentSupplement::from(document, supplementName())); 45d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) } 46d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) 47d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) ASSERT(context->isWorkerGlobalScope()); 48f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu return static_cast<ServiceWorkerContainerClient*>(WillBeHeapSupplement<WorkerClients>::from(toWorkerGlobalScope(context)->clients(), supplementName())); 49d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)} 50d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) 51e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)ServiceWorkerContainerClient::ServiceWorkerContainerClient(PassOwnPtr<WebServiceWorkerProvider> provider) 52d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) : m_provider(provider) 53d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){ 54d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)} 55d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) 56e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)void provideServiceWorkerContainerClientToWorker(WorkerClients* clients, PassOwnPtr<WebServiceWorkerProvider> provider) 57d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){ 58d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) clients->provideSupplement(ServiceWorkerContainerClient::supplementName(), ServiceWorkerContainerClient::create(provider)); 59d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)} 60d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) 61c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)} // namespace blink 62