Upstream version 7.36.149.0
[platform/framework/web/crosswalk.git] / src / third_party / WebKit / Source / modules / serviceworkers / NavigatorServiceWorker.cpp
index 29f4910..7591f3b 100644 (file)
@@ -5,13 +5,16 @@
 #include "config.h"
 #include "modules/serviceworkers/NavigatorServiceWorker.h"
 
+#include "core/dom/Document.h"
+#include "core/frame/DOMWindow.h"
+#include "core/frame/LocalFrame.h"
 #include "core/frame/Navigator.h"
 #include "modules/serviceworkers/ServiceWorkerContainer.h"
 
 namespace WebCore {
 
-NavigatorServiceWorker::NavigatorServiceWorker(Navigator* navigator)
-    : DOMWindowProperty(navigator->frame())
+NavigatorServiceWorker::NavigatorServiceWorker(Navigator& navigator)
+    : DOMWindowProperty(navigator.frame())
 {
 }
 
@@ -19,14 +22,29 @@ NavigatorServiceWorker::~NavigatorServiceWorker()
 {
 }
 
-NavigatorServiceWorker* NavigatorServiceWorker::from(Navigator* navigator)
+NavigatorServiceWorker* NavigatorServiceWorker::from(Document& document)
+{
+    if (!document.frame() || !document.frame()->domWindow())
+        return 0;
+    Navigator& navigator = document.frame()->domWindow()->navigator();
+    return &from(navigator);
+}
+
+NavigatorServiceWorker& NavigatorServiceWorker::from(Navigator& navigator)
 {
     NavigatorServiceWorker* supplement = toNavigatorServiceWorker(navigator);
     if (!supplement) {
         supplement = new NavigatorServiceWorker(navigator);
-        provideTo(navigator, supplementName(), adoptPtr(supplement));
+        provideTo(navigator, supplementName(), adoptPtrWillBeNoop(supplement));
+        // Initialize ServiceWorkerContainer too.
+        supplement->serviceWorker();
     }
-    return supplement;
+    return *supplement;
+}
+
+NavigatorServiceWorker* NavigatorServiceWorker::toNavigatorServiceWorker(Navigator& navigator)
+{
+    return static_cast<NavigatorServiceWorker*>(WillBeHeapSupplement<Navigator>::from(navigator, supplementName()));
 }
 
 const char* NavigatorServiceWorker::supplementName()
@@ -34,16 +52,26 @@ const char* NavigatorServiceWorker::supplementName()
     return "NavigatorServiceWorker";
 }
 
-ServiceWorkerContainer* NavigatorServiceWorker::serviceWorker(Navigator* navigator)
+ServiceWorkerContainer* NavigatorServiceWorker::serviceWorker(Navigator& navigator)
 {
-    return NavigatorServiceWorker::from(navigator)->serviceWorker();
+    return NavigatorServiceWorker::from(navigator).serviceWorker();
 }
 
 ServiceWorkerContainer* NavigatorServiceWorker::serviceWorker()
 {
-    if (!m_serviceWorker && frame())
-        m_serviceWorker = ServiceWorkerContainer::create();
+    if (!m_serviceWorker && frame()) {
+        ASSERT(frame()->domWindow());
+        m_serviceWorker = ServiceWorkerContainer::create(frame()->domWindow()->executionContext());
+    }
     return m_serviceWorker.get();
 }
 
+void NavigatorServiceWorker::willDetachGlobalObjectFromFrame()
+{
+    if (m_serviceWorker) {
+        m_serviceWorker->detachClient();
+        m_serviceWorker = nullptr;
+    }
+}
+
 } // namespace WebCore