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 774c4de1b00618e1224eb4232513eb4c1cf6d042..39c74eb8e225a46996a824d6c2f7f19aaae6b657 100644 |
--- a/third_party/WebKit/Source/web/WebEmbeddedWorkerImpl.cpp |
+++ b/third_party/WebKit/Source/web/WebEmbeddedWorkerImpl.cpp |
@@ -87,6 +87,7 @@ WebEmbeddedWorkerImpl::WebEmbeddedWorkerImpl(PassOwnPtr<WebServiceWorkerContextC |
, m_mainFrame(nullptr) |
, m_loadingShadowPage(false) |
, m_askedToTerminate(false) |
+ , m_pauseAfterDownloadState(DontPauseAfterDownload) |
, m_waitingForDebuggerState(NotWaitingForDebugger) |
{ |
runningWorkerInstances().add(this); |
@@ -123,7 +124,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(); |
} |
@@ -146,8 +150,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; |
@@ -156,6 +160,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(); |
@@ -236,7 +249,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; |
} |
@@ -290,12 +303,10 @@ 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() |
@@ -317,11 +328,16 @@ void WebEmbeddedWorkerImpl::onScriptLoaderFinished() |
if (m_mainScriptLoader->cachedMetadata()) |
Platform::current()->histogramCustomCounts("ServiceWorker.ScriptCachedMetadataSize", m_mainScriptLoader->cachedMetadata()->size(), 1000, 50000000, 50); |
+ 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(); |