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