Upstream version 7.36.149.0
[platform/framework/web/crosswalk.git] / src / third_party / WebKit / Source / modules / serviceworkers / NavigatorServiceWorker.cpp
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/DOMWindow.h"
10 #include "core/frame/LocalFrame.h"
11 #include "core/frame/Navigator.h"
12 #include "modules/serviceworkers/ServiceWorkerContainer.h"
13
14 namespace WebCore {
15
16 NavigatorServiceWorker::NavigatorServiceWorker(Navigator& navigator)
17     : DOMWindowProperty(navigator.frame())
18 {
19 }
20
21 NavigatorServiceWorker::~NavigatorServiceWorker()
22 {
23 }
24
25 NavigatorServiceWorker* 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
33 NavigatorServiceWorker& 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
45 NavigatorServiceWorker* NavigatorServiceWorker::toNavigatorServiceWorker(Navigator& navigator)
46 {
47     return static_cast<NavigatorServiceWorker*>(WillBeHeapSupplement<Navigator>::from(navigator, supplementName()));
48 }
49
50 const char* NavigatorServiceWorker::supplementName()
51 {
52     return "NavigatorServiceWorker";
53 }
54
55 ServiceWorkerContainer* NavigatorServiceWorker::serviceWorker(Navigator& navigator)
56 {
57     return NavigatorServiceWorker::from(navigator).serviceWorker();
58 }
59
60 ServiceWorkerContainer* 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
69 void NavigatorServiceWorker::willDetachGlobalObjectFromFrame()
70 {
71     if (m_serviceWorker) {
72         m_serviceWorker->detachClient();
73         m_serviceWorker = nullptr;
74     }
75 }
76
77 } // namespace WebCore