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