| 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();
|
|
|