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/LocalDOMWindow.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 DEFINE_EMPTY_DESTRUCTOR_WILL_BE_REMOVED(NavigatorServiceWorker);
23 NavigatorServiceWorker* NavigatorServiceWorker::from(Document& document)
25 if (!document.frame() || !document.frame()->domWindow())
27 Navigator& navigator = *document.frame()->domWindow()->navigator();
28 return &from(navigator);
31 NavigatorServiceWorker& NavigatorServiceWorker::from(Navigator& navigator)
33 NavigatorServiceWorker* supplement = toNavigatorServiceWorker(navigator);
35 supplement = new NavigatorServiceWorker(navigator);
36 provideTo(navigator, supplementName(), adoptPtrWillBeNoop(supplement));
37 // Initialize ServiceWorkerContainer too.
38 supplement->serviceWorker();
43 NavigatorServiceWorker* NavigatorServiceWorker::toNavigatorServiceWorker(Navigator& navigator)
45 return static_cast<NavigatorServiceWorker*>(WillBeHeapSupplement<Navigator>::from(navigator, supplementName()));
48 const char* NavigatorServiceWorker::supplementName()
50 return "NavigatorServiceWorker";
53 ServiceWorkerContainer* NavigatorServiceWorker::serviceWorker(Navigator& navigator)
55 return NavigatorServiceWorker::from(navigator).serviceWorker();
58 ServiceWorkerContainer* NavigatorServiceWorker::serviceWorker()
60 if (!m_serviceWorker && frame()) {
61 ASSERT(frame()->domWindow());
62 m_serviceWorker = ServiceWorkerContainer::create(frame()->domWindow()->executionContext());
64 return m_serviceWorker.get();
67 void NavigatorServiceWorker::willDetachGlobalObjectFromFrame()
69 if (m_serviceWorker) {
70 m_serviceWorker->willBeDetachedFromFrame();
71 m_serviceWorker = nullptr;
75 void NavigatorServiceWorker::trace(Visitor* visitor)
77 visitor->trace(m_serviceWorker);
78 WillBeHeapSupplement<Navigator>::trace(visitor);
79 DOMWindowProperty::trace(visitor);