X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=src%2Fthird_party%2FWebKit%2FSource%2Fweb%2FWebEmbeddedWorkerImpl.cpp;h=b3f8f36b1bc0eff5a8d86837432b38bcba00da2d;hb=4a1a0bdd01eef90b0826a0e761d3379d3715c10f;hp=25a22ce17c7b41314c3c222d42bc02e0d8e97b35;hpb=b1be5ca53587d23e7aeb77b26861fdc0a181ffd8;p=platform%2Fframework%2Fweb%2Fcrosswalk.git diff --git a/src/third_party/WebKit/Source/web/WebEmbeddedWorkerImpl.cpp b/src/third_party/WebKit/Source/web/WebEmbeddedWorkerImpl.cpp index 25a22ce..b3f8f36 100644 --- a/src/third_party/WebKit/Source/web/WebEmbeddedWorkerImpl.cpp +++ b/src/third_party/WebKit/Source/web/WebEmbeddedWorkerImpl.cpp @@ -48,6 +48,7 @@ #include "platform/SharedBuffer.h" #include "platform/heap/Handle.h" #include "platform/network/ContentSecurityPolicyParsers.h" +#include "public/platform/WebURLRequest.h" #include "public/web/WebServiceWorkerContextClient.h" #include "public/web/WebServiceWorkerNetworkProvider.h" #include "public/web/WebSettings.h" @@ -60,7 +61,7 @@ #include "web/WorkerPermissionClient.h" #include "wtf/Functional.h" -using namespace WebCore; +using namespace blink; namespace blink { @@ -81,7 +82,7 @@ public: { ASSERT(loadingContext); m_callback = callback; - m_scriptLoader->setTargetType(ResourceRequest::TargetIsServiceWorker); + m_scriptLoader->setRequestContext(blink::WebURLRequest::RequestContextServiceWorker); m_scriptLoader->loadAsynchronously( *loadingContext, scriptURL, DenyCrossOriginRequests, this); } @@ -125,7 +126,8 @@ public: { if (m_embeddedWorker.m_askedToTerminate || !m_embeddedWorker.m_workerThread) return false; - return m_embeddedWorker.m_workerThread->runLoop().postTask(task); + m_embeddedWorker.m_workerThread->postTask(task); + return !m_embeddedWorker.m_workerThread->terminated(); } private: @@ -145,6 +147,12 @@ WebEmbeddedWorker* WebEmbeddedWorker::create( return new WebEmbeddedWorkerImpl(adoptPtr(client), adoptPtr(permissionClient)); } +static HashSet& runningWorkerInstances() +{ + DEFINE_STATIC_LOCAL(HashSet, set, ()); + return set; +} + WebEmbeddedWorkerImpl::WebEmbeddedWorkerImpl( PassOwnPtr client, PassOwnPtr permissionClient) @@ -155,10 +163,13 @@ WebEmbeddedWorkerImpl::WebEmbeddedWorkerImpl( , m_askedToTerminate(false) , m_pauseAfterDownloadState(DontPauseAfterDownload) { + runningWorkerInstances().add(this); } WebEmbeddedWorkerImpl::~WebEmbeddedWorkerImpl() { + ASSERT(runningWorkerInstances().contains(this)); + runningWorkerInstances().remove(this); ASSERT(m_webView); // Detach the client before closing the view to avoid getting called back. @@ -168,6 +179,14 @@ WebEmbeddedWorkerImpl::~WebEmbeddedWorkerImpl() m_mainFrame->close(); } +void WebEmbeddedWorkerImpl::terminateAll() +{ + HashSet instances = runningWorkerInstances(); + for (HashSet::iterator it = instances.begin(), itEnd = instances.end(); it != itEnd; ++it) { + (*it)->terminateWorkerContext(); + } +} + void WebEmbeddedWorkerImpl::startWorkerContext( const WebEmbeddedWorkerStartData& data) { @@ -185,8 +204,18 @@ void WebEmbeddedWorkerImpl::terminateWorkerContext() if (m_askedToTerminate) return; m_askedToTerminate = true; - if (m_mainScriptLoader) + if (m_mainScriptLoader) { m_mainScriptLoader->cancel(); + m_mainScriptLoader.clear(); + // This may delete 'this'. + m_workerContextClient->workerContextFailedToStart(); + return; + } + if (m_pauseAfterDownloadState == IsPausedAfterDownload) { + // This may delete 'this'. + m_workerContextClient->workerContextFailedToStart(); + return; + } if (m_workerThread) m_workerThread->stop(); } @@ -224,6 +253,7 @@ void dispatchOnInspectorBackendTask(ExecutionContext* context, const String& mes void WebEmbeddedWorkerImpl::resumeAfterDownload() { + ASSERT(!m_askedToTerminate); bool wasPaused = (m_pauseAfterDownloadState == IsPausedAfterDownload); m_pauseAfterDownloadState = DontPauseAfterDownload; if (wasPaused) @@ -233,29 +263,31 @@ void WebEmbeddedWorkerImpl::resumeAfterDownload() void WebEmbeddedWorkerImpl::resumeWorkerContext() { if (m_workerThread) - m_workerThread->runLoop().postDebuggerTask(createCallbackTask(resumeWorkerContextTask, true)); + m_workerThread->postDebuggerTask(createCrossThreadTask(resumeWorkerContextTask, true)); } void WebEmbeddedWorkerImpl::attachDevTools() { if (m_workerThread) - m_workerThread->runLoop().postDebuggerTask(createCallbackTask(connectToWorkerContextInspectorTask, true)); + m_workerThread->postDebuggerTask(createCrossThreadTask(connectToWorkerContextInspectorTask, true)); } void WebEmbeddedWorkerImpl::reattachDevTools(const WebString& savedState) { - m_workerThread->runLoop().postDebuggerTask(createCallbackTask(reconnectToWorkerContextInspectorTask, String(savedState))); + m_workerThread->postDebuggerTask(createCrossThreadTask(reconnectToWorkerContextInspectorTask, String(savedState))); } void WebEmbeddedWorkerImpl::detachDevTools() { - m_workerThread->runLoop().postDebuggerTask(createCallbackTask(disconnectFromWorkerContextInspectorTask, true)); + m_workerThread->postDebuggerTask(createCrossThreadTask(disconnectFromWorkerContextInspectorTask, true)); } void WebEmbeddedWorkerImpl::dispatchDevToolsMessage(const WebString& message) { - m_workerThread->runLoop().postDebuggerTask(createCallbackTask(dispatchOnInspectorBackendTask, String(message))); - WorkerDebuggerAgent::interruptAndDispatchInspectorCommands(m_workerThread.get()); + if (m_askedToTerminate) + return; + m_workerThread->postDebuggerTask(createCrossThreadTask(dispatchOnInspectorBackendTask, String(message))); + m_workerThread->interruptAndDispatchInspectorCommands(); } void WebEmbeddedWorkerImpl::prepareShadowPageForLoader() @@ -310,7 +342,10 @@ void WebEmbeddedWorkerImpl::onScriptLoaderFinished() { ASSERT(m_mainScriptLoader); - if (m_mainScriptLoader->failed() || m_askedToTerminate) { + if (m_askedToTerminate) + return; + + if (m_mainScriptLoader->failed()) { m_mainScriptLoader.clear(); // This may delete 'this'. m_workerContextClient->workerContextFailedToStart(); @@ -328,12 +363,10 @@ void WebEmbeddedWorkerImpl::onScriptLoaderFinished() void WebEmbeddedWorkerImpl::startWorkerThread() { ASSERT(m_pauseAfterDownloadState == DontPauseAfterDownload); - if (m_askedToTerminate) - return; + ASSERT(!m_askedToTerminate); - // FIXME: startMode is deprecated, switch to waitForDebuggerMode once chromium is setting that value. WorkerThreadStartMode startMode = - (m_workerStartData.startMode == WebEmbeddedWorkerStartModePauseOnStart) + (m_workerStartData.waitForDebuggerMode == WebEmbeddedWorkerStartData::WaitForDebugger) ? PauseWorkerGlobalScopeOnStart : DontPauseWorkerGlobalScopeOnStart; OwnPtrWillBeRawPtr workerClients = WorkerClients::create();