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 "modules/serviceworkers/NavigatorServiceWorker.h" 7 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" 13 14 namespace WebCore { 15 NavigatorServiceWorker(Navigator & navigator)16NavigatorServiceWorker::NavigatorServiceWorker(Navigator& navigator) 17 : DOMWindowProperty(navigator.frame()) 18 { 19 } 20 ~NavigatorServiceWorker()21NavigatorServiceWorker::~NavigatorServiceWorker() 22 { 23 } 24 from(Document & document)25NavigatorServiceWorker* NavigatorServiceWorker::from(Document& document) 26 { 27 if (!document.frame() || !document.frame()->domWindow()) 28 return 0; 29 Navigator& navigator = document.frame()->domWindow()->navigator(); 30 return &from(navigator); 31 } 32 from(Navigator & navigator)33NavigatorServiceWorker& NavigatorServiceWorker::from(Navigator& navigator) 34 { 35 NavigatorServiceWorker* supplement = toNavigatorServiceWorker(navigator); 36 if (!supplement) { 37 supplement = new NavigatorServiceWorker(navigator); 38 provideTo(navigator, supplementName(), adoptPtrWillBeNoop(supplement)); 39 // Initialize ServiceWorkerContainer too. 40 supplement->serviceWorker(); 41 } 42 return *supplement; 43 } 44 toNavigatorServiceWorker(Navigator & navigator)45NavigatorServiceWorker* NavigatorServiceWorker::toNavigatorServiceWorker(Navigator& navigator) 46 { 47 return static_cast<NavigatorServiceWorker*>(WillBeHeapSupplement<Navigator>::from(navigator, supplementName())); 48 } 49 supplementName()50const char* NavigatorServiceWorker::supplementName() 51 { 52 return "NavigatorServiceWorker"; 53 } 54 serviceWorker(Navigator & navigator)55ServiceWorkerContainer* NavigatorServiceWorker::serviceWorker(Navigator& navigator) 56 { 57 return NavigatorServiceWorker::from(navigator).serviceWorker(); 58 } 59 serviceWorker()60ServiceWorkerContainer* NavigatorServiceWorker::serviceWorker() 61 { 62 if (!m_serviceWorker && frame()) { 63 ASSERT(frame()->domWindow()); 64 m_serviceWorker = ServiceWorkerContainer::create(frame()->domWindow()->executionContext()); 65 } 66 return m_serviceWorker.get(); 67 } 68 willDetachGlobalObjectFromFrame()69void NavigatorServiceWorker::willDetachGlobalObjectFromFrame() 70 { 71 if (m_serviceWorker) { 72 m_serviceWorker->detachClient(); 73 m_serviceWorker = nullptr; 74 } 75 } 76 77 } // namespace WebCore 78