Index: third_party/WebKit/Source/web/WebEmbeddedWorkerImpl.cpp |
diff --git a/third_party/WebKit/Source/web/WebEmbeddedWorkerImpl.cpp b/third_party/WebKit/Source/web/WebEmbeddedWorkerImpl.cpp |
index 303b19e23f291aed8f8284c243a84ac51b70e6dc..a933efb7ed5e498c903ac7b50f3f1aa6ac22c9d2 100644 |
--- a/third_party/WebKit/Source/web/WebEmbeddedWorkerImpl.cpp |
+++ b/third_party/WebKit/Source/web/WebEmbeddedWorkerImpl.cpp |
@@ -88,6 +88,7 @@ WebEmbeddedWorkerImpl::WebEmbeddedWorkerImpl(PassOwnPtr<WebServiceWorkerContextC |
, m_mainFrame(nullptr) |
, m_loadingShadowPage(false) |
, m_askedToTerminate(false) |
+ , m_pauseAfterDownloadState(DontPauseAfterDownload) |
, m_waitingForDebuggerState(NotWaitingForDebugger) |
{ |
runningWorkerInstances().add(this); |
@@ -124,7 +125,10 @@ void WebEmbeddedWorkerImpl::startWorkerContext( |
{ |
ASSERT(!m_askedToTerminate); |
ASSERT(!m_mainScriptLoader); |
+ ASSERT(m_pauseAfterDownloadState == DontPauseAfterDownload); |
m_workerStartData = data; |
+ if (data.pauseAfterDownloadMode == WebEmbeddedWorkerStartData::PauseAfterDownload) |
+ m_pauseAfterDownloadState = DoPauseAfterDownload; |
prepareShadowPageForLoader(); |
} |
@@ -147,8 +151,8 @@ void WebEmbeddedWorkerImpl::terminateWorkerContext() |
} |
if (!m_workerThread) { |
// The worker thread has not been created yet if the worker is asked to |
- // terminate during waiting for debugger. |
- ASSERT(m_workerStartData.waitForDebuggerMode == WebEmbeddedWorkerStartData::WaitForDebugger); |
+ // terminate during waiting for debugger or paused after download. |
+ ASSERT(m_workerStartData.waitForDebuggerMode == WebEmbeddedWorkerStartData::WaitForDebugger || m_pauseAfterDownloadState == IsPausedAfterDownload); |
// This deletes 'this'. |
m_workerContextClient->workerContextFailedToStart(); |
return; |
@@ -157,6 +161,15 @@ void WebEmbeddedWorkerImpl::terminateWorkerContext() |
m_workerInspectorProxy->workerThreadTerminated(); |
} |
+void WebEmbeddedWorkerImpl::resumeAfterDownload() |
+{ |
+ ASSERT(!m_askedToTerminate); |
+ ASSERT(m_pauseAfterDownloadState == IsPausedAfterDownload); |
+ |
+ m_pauseAfterDownloadState = DontPauseAfterDownload; |
+ startWorkerThread(); |
+} |
+ |
void WebEmbeddedWorkerImpl::attachDevTools(const WebString& hostId, int sessionId) |
{ |
WebDevToolsAgent* devtoolsAgent = m_mainFrame->devToolsAgent(); |
@@ -237,7 +250,7 @@ void WebEmbeddedWorkerImpl::prepareShadowPageForLoader() |
// If we were asked to wait for debugger then it is the good time to do that. |
m_workerContextClient->workerReadyForInspection(); |
if (m_workerStartData.waitForDebuggerMode == WebEmbeddedWorkerStartData::WaitForDebugger) { |
- m_waitingForDebuggerState = WaitingForDebuggerBeforeLoadingScript; |
+ m_waitingForDebuggerState = WaitingForDebugger; |
return; |
} |
@@ -291,18 +304,15 @@ void WebEmbeddedWorkerImpl::sendProtocolMessage(int sessionId, int callId, const |
void WebEmbeddedWorkerImpl::resumeStartup() |
{ |
- WaitingForDebuggerState waitingForDebuggerState = m_waitingForDebuggerState; |
+ bool wasWaiting = (m_waitingForDebuggerState == WaitingForDebugger); |
m_waitingForDebuggerState = NotWaitingForDebugger; |
- if (waitingForDebuggerState == WaitingForDebuggerBeforeLoadingScript) |
+ if (wasWaiting) |
loadShadowPage(); |
- else if (waitingForDebuggerState == WaitingForDebuggerAfterScriptLoaded) |
- startWorkerThread(); |
} |
void WebEmbeddedWorkerImpl::onScriptLoaderFinished() |
{ |
ASSERT(m_mainScriptLoader); |
- |
if (m_askedToTerminate) |
return; |
@@ -321,11 +331,16 @@ void WebEmbeddedWorkerImpl::onScriptLoaderFinished() |
scriptCachedMetadataSizeHistogram.count(m_mainScriptLoader->cachedMetadata()->size()); |
} |
+ if (m_pauseAfterDownloadState == DoPauseAfterDownload) { |
+ m_pauseAfterDownloadState = IsPausedAfterDownload; |
+ return; |
+ } |
startWorkerThread(); |
} |
void WebEmbeddedWorkerImpl::startWorkerThread() |
{ |
+ ASSERT(m_pauseAfterDownloadState == DontPauseAfterDownload); |
ASSERT(!m_askedToTerminate); |
Document* document = m_mainFrame->frame()->document(); |