Upstream version 7.36.149.0
[platform/framework/web/crosswalk.git] / src / third_party / WebKit / Source / modules / serviceworkers / NavigatorServiceWorker.cpp
index a5ddd51..7591f3b 100644 (file)
@@ -5,6 +5,9 @@
 #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"
 
@@ -19,12 +22,22 @@ NavigatorServiceWorker::~NavigatorServiceWorker()
 {
 }
 
+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(), adoptPtrWillBeNoop(supplement));
+        // Initialize ServiceWorkerContainer too.
+        supplement->serviceWorker();
     }
     return *supplement;
 }
@@ -39,22 +52,26 @@ const char* NavigatorServiceWorker::supplementName()
     return "NavigatorServiceWorker";
 }
 
-ServiceWorkerContainer* NavigatorServiceWorker::serviceWorker(ExecutionContext* executionContext, Navigator& navigator)
+ServiceWorkerContainer* NavigatorServiceWorker::serviceWorker(Navigator& navigator)
 {
-    return NavigatorServiceWorker::from(navigator).serviceWorker(executionContext);
+    return NavigatorServiceWorker::from(navigator).serviceWorker();
 }
 
-ServiceWorkerContainer* NavigatorServiceWorker::serviceWorker(ExecutionContext* executionContext)
+ServiceWorkerContainer* NavigatorServiceWorker::serviceWorker()
 {
-    if (!m_serviceWorker && frame())
-        m_serviceWorker = ServiceWorkerContainer::create(executionContext);
+    if (!m_serviceWorker && frame()) {
+        ASSERT(frame()->domWindow());
+        m_serviceWorker = ServiceWorkerContainer::create(frame()->domWindow()->executionContext());
+    }
     return m_serviceWorker.get();
 }
 
 void NavigatorServiceWorker::willDetachGlobalObjectFromFrame()
 {
-    m_serviceWorker->detachClient();
-    m_serviceWorker = nullptr;
+    if (m_serviceWorker) {
+        m_serviceWorker->detachClient();
+        m_serviceWorker = nullptr;
+    }
 }
 
 } // namespace WebCore