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.
6 #include "modules/serviceworkers/NavigatorServiceWorker.h"
8 #include "core/dom/Document.h"
9 #include "core/frame/DOMWindow.h"
10 #include "core/frame/LocalFrame.h"
11 #include "core/frame/Navigator.h"
12 #include "modules/serviceworkers/ServiceWorkerContainer.h"
16 NavigatorServiceWorker::NavigatorServiceWorker(Navigator& navigator)
17 : DOMWindowProperty(navigator.frame())
21 NavigatorServiceWorker::~NavigatorServiceWorker()
25 NavigatorServiceWorker* NavigatorServiceWorker::from(Document& document)
27 if (!document.frame() || !document.frame()->domWindow())
29 Navigator& navigator = document.frame()->domWindow()->navigator();
30 return &from(navigator);
33 NavigatorServiceWorker& NavigatorServiceWorker::from(Navigator& navigator)
35 NavigatorServiceWorker* supplement = toNavigatorServiceWorker(navigator);
37 supplement = new NavigatorServiceWorker(navigator);
38 provideTo(navigator, supplementName(), adoptPtrWillBeNoop(supplement));
39 // Initialize ServiceWorkerContainer too.
40 supplement->serviceWorker();
45 NavigatorServiceWorker* NavigatorServiceWorker::toNavigatorServiceWorker(Navigator& navigator)
47 return static_cast<NavigatorServiceWorker*>(WillBeHeapSupplement<Navigator>::from(navigator, supplementName()));
50 const char* NavigatorServiceWorker::supplementName()
52 return "NavigatorServiceWorker";
55 ServiceWorkerContainer* NavigatorServiceWorker::serviceWorker(Navigator& navigator)
57 return NavigatorServiceWorker::from(navigator).serviceWorker();
60 ServiceWorkerContainer* NavigatorServiceWorker::serviceWorker()
62 if (!m_serviceWorker && frame()) {
63 ASSERT(frame()->domWindow());
64 m_serviceWorker = ServiceWorkerContainer::create(frame()->domWindow()->executionContext());
66 return m_serviceWorker.get();
69 void NavigatorServiceWorker::willDetachGlobalObjectFromFrame()
71 if (m_serviceWorker) {
72 m_serviceWorker->detachClient();
73 m_serviceWorker = nullptr;
77 } // namespace WebCore