Upstream version 5.34.104.0
[platform/framework/web/crosswalk.git] / src / third_party / WebKit / Source / web / WebEmbeddedWorkerImpl.cpp
index 37fb485..dc692bc 100644 (file)
@@ -31,6 +31,7 @@
 #include "config.h"
 #include "WebEmbeddedWorkerImpl.h"
 
+#include "ServiceWorkerGlobalScopeClientImpl.h"
 #include "ServiceWorkerGlobalScopeProxy.h"
 #include "WebDataSourceImpl.h"
 #include "WebFrameImpl.h"
@@ -111,11 +112,11 @@ public:
         toWebFrameImpl(m_embeddedWorker.m_mainFrame)->frame()->document()->postTask(task);
     }
 
-    virtual bool postTaskForModeToWorkerGlobalScope(PassOwnPtr<ExecutionContextTask> task, const String& mode) OVERRIDE
+    virtual bool postTaskToWorkerGlobalScope(PassOwnPtr<ExecutionContextTask> task) OVERRIDE
     {
         if (m_embeddedWorker.m_askedToTerminate || !m_embeddedWorker.m_workerThread)
             return false;
-        return m_embeddedWorker.m_workerThread->runLoop().postTaskForMode(task, mode);
+        return m_embeddedWorker.m_workerThread->runLoop().postTask(task);
     }
 
 private:
@@ -217,8 +218,9 @@ void WebEmbeddedWorkerImpl::onScriptLoaderFinished()
     ASSERT(m_mainScriptLoader);
 
     if (m_mainScriptLoader->failed() || m_askedToTerminate) {
-        m_workerContextClient->workerContextFailedToStart();
         m_mainScriptLoader.clear();
+        // This may delete 'this'.
+        m_workerContextClient->workerContextFailedToStart();
         return;
     }
 
@@ -226,8 +228,13 @@ void WebEmbeddedWorkerImpl::onScriptLoaderFinished()
         (m_workerStartData.startMode == WebEmbeddedWorkerStartModePauseOnStart)
         ? PauseWorkerGlobalScopeOnStart : DontPauseWorkerGlobalScopeOnStart;
 
+    // This is to be owned by ServiceWorker's WorkerGlobalScope, and is
+    // guaranteed to be around while the WorkerGlobalScope is alive.
+    WebServiceWorkerContextClient* contextClient = m_workerContextClient.get();
+
     OwnPtr<WorkerClients> workerClients = WorkerClients::create();
     providePermissionClientToWorker(workerClients.get(), m_permissionClient.release());
+    provideServiceWorkerGlobalScopeClientToWorker(workerClients.get(), ServiceWorkerGlobalScopeClientImpl::create(m_workerContextClient.release()));
 
     OwnPtr<WorkerThreadStartupData> startupData =
         WorkerThreadStartupData::create(
@@ -242,7 +249,7 @@ void WebEmbeddedWorkerImpl::onScriptLoaderFinished()
 
     m_mainScriptLoader.clear();
 
-    m_workerGlobalScopeProxy = ServiceWorkerGlobalScopeProxy::create(*this, *toWebFrameImpl(m_mainFrame)->frame()->document(), m_workerContextClient.release());
+    m_workerGlobalScopeProxy = ServiceWorkerGlobalScopeProxy::create(*this, *toWebFrameImpl(m_mainFrame)->frame()->document(), *contextClient);
     m_loaderProxy = LoaderProxy::create(*this);
 
     m_workerThread = ServiceWorkerThread::create(*m_loaderProxy, *m_workerGlobalScopeProxy, startupData.release());