| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (C) 2013 Google Inc. All rights reserved. | 2 * Copyright (C) 2013 Google Inc. All rights reserved. |
| 3 * | 3 * |
| 4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
| 5 * modification, are permitted provided that the following conditions are | 5 * modification, are permitted provided that the following conditions are |
| 6 * met: | 6 * met: |
| 7 * | 7 * |
| 8 * * Redistributions of source code must retain the above copyright | 8 * * Redistributions of source code must retain the above copyright |
| 9 * notice, this list of conditions and the following disclaimer. | 9 * notice, this list of conditions and the following disclaimer. |
| 10 * * Redistributions in binary form must reproduce the above | 10 * * Redistributions in binary form must reproduce the above |
| (...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 80 } | 80 } |
| 81 | 81 |
| 82 WebEmbeddedWorkerImpl::WebEmbeddedWorkerImpl(PassOwnPtr<WebServiceWorkerContextC
lient> client, PassOwnPtr<WebWorkerContentSettingsClientProxy> ContentSettingsCl
ient) | 82 WebEmbeddedWorkerImpl::WebEmbeddedWorkerImpl(PassOwnPtr<WebServiceWorkerContextC
lient> client, PassOwnPtr<WebWorkerContentSettingsClientProxy> ContentSettingsCl
ient) |
| 83 : m_workerContextClient(client) | 83 : m_workerContextClient(client) |
| 84 , m_contentSettingsClient(ContentSettingsClient) | 84 , m_contentSettingsClient(ContentSettingsClient) |
| 85 , m_workerInspectorProxy(WorkerInspectorProxy::create()) | 85 , m_workerInspectorProxy(WorkerInspectorProxy::create()) |
| 86 , m_webView(nullptr) | 86 , m_webView(nullptr) |
| 87 , m_mainFrame(nullptr) | 87 , m_mainFrame(nullptr) |
| 88 , m_loadingShadowPage(false) | 88 , m_loadingShadowPage(false) |
| 89 , m_askedToTerminate(false) | 89 , m_askedToTerminate(false) |
| 90 , m_pauseAfterDownloadState(DontPauseAfterDownload) |
| 90 , m_waitingForDebuggerState(NotWaitingForDebugger) | 91 , m_waitingForDebuggerState(NotWaitingForDebugger) |
| 91 { | 92 { |
| 92 runningWorkerInstances().add(this); | 93 runningWorkerInstances().add(this); |
| 93 } | 94 } |
| 94 | 95 |
| 95 WebEmbeddedWorkerImpl::~WebEmbeddedWorkerImpl() | 96 WebEmbeddedWorkerImpl::~WebEmbeddedWorkerImpl() |
| 96 { | 97 { |
| 97 // Prevent onScriptLoaderFinished from deleting 'this'. | 98 // Prevent onScriptLoaderFinished from deleting 'this'. |
| 98 m_askedToTerminate = true; | 99 m_askedToTerminate = true; |
| 99 | 100 |
| (...skipping 16 matching lines...) Expand all Loading... |
| 116 m_mainFrame->close(); | 117 m_mainFrame->close(); |
| 117 if (m_loaderProxy) | 118 if (m_loaderProxy) |
| 118 m_loaderProxy->detachProvider(this); | 119 m_loaderProxy->detachProvider(this); |
| 119 } | 120 } |
| 120 | 121 |
| 121 void WebEmbeddedWorkerImpl::startWorkerContext( | 122 void WebEmbeddedWorkerImpl::startWorkerContext( |
| 122 const WebEmbeddedWorkerStartData& data) | 123 const WebEmbeddedWorkerStartData& data) |
| 123 { | 124 { |
| 124 ASSERT(!m_askedToTerminate); | 125 ASSERT(!m_askedToTerminate); |
| 125 ASSERT(!m_mainScriptLoader); | 126 ASSERT(!m_mainScriptLoader); |
| 127 ASSERT(m_pauseAfterDownloadState == DontPauseAfterDownload); |
| 126 m_workerStartData = data; | 128 m_workerStartData = data; |
| 129 if (data.pauseAfterDownloadMode == WebEmbeddedWorkerStartData::PauseAfterDow
nload) |
| 130 m_pauseAfterDownloadState = DoPauseAfterDownload; |
| 127 prepareShadowPageForLoader(); | 131 prepareShadowPageForLoader(); |
| 128 } | 132 } |
| 129 | 133 |
| 130 void WebEmbeddedWorkerImpl::terminateWorkerContext() | 134 void WebEmbeddedWorkerImpl::terminateWorkerContext() |
| 131 { | 135 { |
| 132 if (m_askedToTerminate) | 136 if (m_askedToTerminate) |
| 133 return; | 137 return; |
| 134 m_askedToTerminate = true; | 138 m_askedToTerminate = true; |
| 135 if (m_loadingShadowPage) { | 139 if (m_loadingShadowPage) { |
| 136 // This deletes 'this'. | 140 // This deletes 'this'. |
| 137 m_workerContextClient->workerContextFailedToStart(); | 141 m_workerContextClient->workerContextFailedToStart(); |
| 138 return; | 142 return; |
| 139 } | 143 } |
| 140 if (m_mainScriptLoader) { | 144 if (m_mainScriptLoader) { |
| 141 m_mainScriptLoader->cancel(); | 145 m_mainScriptLoader->cancel(); |
| 142 m_mainScriptLoader.clear(); | 146 m_mainScriptLoader.clear(); |
| 143 // This deletes 'this'. | 147 // This deletes 'this'. |
| 144 m_workerContextClient->workerContextFailedToStart(); | 148 m_workerContextClient->workerContextFailedToStart(); |
| 145 return; | 149 return; |
| 146 } | 150 } |
| 147 if (!m_workerThread) { | 151 if (!m_workerThread) { |
| 148 // The worker thread has not been created yet if the worker is asked to | 152 // The worker thread has not been created yet if the worker is asked to |
| 149 // terminate during waiting for debugger. | 153 // terminate during waiting for debugger or paused after download. |
| 150 ASSERT(m_workerStartData.waitForDebuggerMode == WebEmbeddedWorkerStartDa
ta::WaitForDebugger); | 154 ASSERT(m_workerStartData.waitForDebuggerMode == WebEmbeddedWorkerStartDa
ta::WaitForDebugger || m_pauseAfterDownloadState == IsPausedAfterDownload); |
| 151 // This deletes 'this'. | 155 // This deletes 'this'. |
| 152 m_workerContextClient->workerContextFailedToStart(); | 156 m_workerContextClient->workerContextFailedToStart(); |
| 153 return; | 157 return; |
| 154 } | 158 } |
| 155 m_workerThread->terminate(); | 159 m_workerThread->terminate(); |
| 156 m_workerInspectorProxy->workerThreadTerminated(); | 160 m_workerInspectorProxy->workerThreadTerminated(); |
| 157 } | 161 } |
| 158 | 162 |
| 163 void WebEmbeddedWorkerImpl::resumeAfterDownload() |
| 164 { |
| 165 ASSERT(!m_askedToTerminate); |
| 166 ASSERT(m_pauseAfterDownloadState == IsPausedAfterDownload); |
| 167 |
| 168 m_pauseAfterDownloadState = DontPauseAfterDownload; |
| 169 startWorkerThread(); |
| 170 } |
| 171 |
| 159 void WebEmbeddedWorkerImpl::attachDevTools(const WebString& hostId, int sessionI
d) | 172 void WebEmbeddedWorkerImpl::attachDevTools(const WebString& hostId, int sessionI
d) |
| 160 { | 173 { |
| 161 WebDevToolsAgent* devtoolsAgent = m_mainFrame->devToolsAgent(); | 174 WebDevToolsAgent* devtoolsAgent = m_mainFrame->devToolsAgent(); |
| 162 if (devtoolsAgent) | 175 if (devtoolsAgent) |
| 163 devtoolsAgent->attach(hostId, sessionId); | 176 devtoolsAgent->attach(hostId, sessionId); |
| 164 } | 177 } |
| 165 | 178 |
| 166 void WebEmbeddedWorkerImpl::reattachDevTools(const WebString& hostId, int sessio
nId, const WebString& savedState) | 179 void WebEmbeddedWorkerImpl::reattachDevTools(const WebString& hostId, int sessio
nId, const WebString& savedState) |
| 167 { | 180 { |
| 168 WebDevToolsAgent* devtoolsAgent = m_mainFrame->devToolsAgent(); | 181 WebDevToolsAgent* devtoolsAgent = m_mainFrame->devToolsAgent(); |
| (...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 229 settings->setStrictMixedContentChecking(true); | 242 settings->setStrictMixedContentChecking(true); |
| 230 settings->setAllowDisplayOfInsecureContent(false); | 243 settings->setAllowDisplayOfInsecureContent(false); |
| 231 settings->setAllowRunningOfInsecureContent(false); | 244 settings->setAllowRunningOfInsecureContent(false); |
| 232 m_mainFrame = toWebLocalFrameImpl(WebLocalFrame::create(WebTreeScopeType::Do
cument, this)); | 245 m_mainFrame = toWebLocalFrameImpl(WebLocalFrame::create(WebTreeScopeType::Do
cument, this)); |
| 233 m_webView->setMainFrame(m_mainFrame.get()); | 246 m_webView->setMainFrame(m_mainFrame.get()); |
| 234 m_mainFrame->setDevToolsAgentClient(this); | 247 m_mainFrame->setDevToolsAgentClient(this); |
| 235 | 248 |
| 236 // If we were asked to wait for debugger then it is the good time to do that
. | 249 // If we were asked to wait for debugger then it is the good time to do that
. |
| 237 m_workerContextClient->workerReadyForInspection(); | 250 m_workerContextClient->workerReadyForInspection(); |
| 238 if (m_workerStartData.waitForDebuggerMode == WebEmbeddedWorkerStartData::Wai
tForDebugger) { | 251 if (m_workerStartData.waitForDebuggerMode == WebEmbeddedWorkerStartData::Wai
tForDebugger) { |
| 239 m_waitingForDebuggerState = WaitingForDebuggerBeforeLoadingScript; | 252 m_waitingForDebuggerState = WaitingForDebugger; |
| 240 return; | 253 return; |
| 241 } | 254 } |
| 242 | 255 |
| 243 loadShadowPage(); | 256 loadShadowPage(); |
| 244 } | 257 } |
| 245 | 258 |
| 246 void WebEmbeddedWorkerImpl::loadShadowPage() | 259 void WebEmbeddedWorkerImpl::loadShadowPage() |
| 247 { | 260 { |
| 248 // Construct substitute data source for the 'shadow page'. We only need it | 261 // Construct substitute data source for the 'shadow page'. We only need it |
| 249 // to have same origin as the worker so the loading checks work correctly. | 262 // to have same origin as the worker so the loading checks work correctly. |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 283 // invoked and |this| might have been deleted at this point. | 296 // invoked and |this| might have been deleted at this point. |
| 284 } | 297 } |
| 285 | 298 |
| 286 void WebEmbeddedWorkerImpl::sendProtocolMessage(int sessionId, int callId, const
WebString& message, const WebString& state) | 299 void WebEmbeddedWorkerImpl::sendProtocolMessage(int sessionId, int callId, const
WebString& message, const WebString& state) |
| 287 { | 300 { |
| 288 m_workerContextClient->sendDevToolsMessage(sessionId, callId, message, state
); | 301 m_workerContextClient->sendDevToolsMessage(sessionId, callId, message, state
); |
| 289 } | 302 } |
| 290 | 303 |
| 291 void WebEmbeddedWorkerImpl::resumeStartup() | 304 void WebEmbeddedWorkerImpl::resumeStartup() |
| 292 { | 305 { |
| 293 WaitingForDebuggerState waitingForDebuggerState = m_waitingForDebuggerState; | 306 bool wasWaiting = (m_waitingForDebuggerState == WaitingForDebugger); |
| 294 m_waitingForDebuggerState = NotWaitingForDebugger; | 307 m_waitingForDebuggerState = NotWaitingForDebugger; |
| 295 if (waitingForDebuggerState == WaitingForDebuggerBeforeLoadingScript) | 308 if (wasWaiting) |
| 296 loadShadowPage(); | 309 loadShadowPage(); |
| 297 else if (waitingForDebuggerState == WaitingForDebuggerAfterScriptLoaded) | |
| 298 startWorkerThread(); | |
| 299 } | 310 } |
| 300 | 311 |
| 301 void WebEmbeddedWorkerImpl::onScriptLoaderFinished() | 312 void WebEmbeddedWorkerImpl::onScriptLoaderFinished() |
| 302 { | 313 { |
| 303 ASSERT(m_mainScriptLoader); | 314 ASSERT(m_mainScriptLoader); |
| 304 | 315 |
| 305 if (m_askedToTerminate) | 316 if (m_askedToTerminate) |
| 306 return; | 317 return; |
| 307 | 318 |
| 308 if (m_mainScriptLoader->failed()) { | 319 if (m_mainScriptLoader->failed()) { |
| 309 m_mainScriptLoader.clear(); | 320 m_mainScriptLoader.clear(); |
| 310 // This deletes 'this'. | 321 // This deletes 'this'. |
| 311 m_workerContextClient->workerContextFailedToStart(); | 322 m_workerContextClient->workerContextFailedToStart(); |
| 312 return; | 323 return; |
| 313 } | 324 } |
| 314 m_workerContextClient->workerScriptLoaded(); | 325 m_workerContextClient->workerScriptLoaded(); |
| 315 | 326 |
| 316 Platform::current()->histogramCustomCounts("ServiceWorker.ScriptSize", m_mai
nScriptLoader->script().length(), 1000, 5000000, 50); | 327 Platform::current()->histogramCustomCounts("ServiceWorker.ScriptSize", m_mai
nScriptLoader->script().length(), 1000, 5000000, 50); |
| 317 if (m_mainScriptLoader->cachedMetadata()) | 328 if (m_mainScriptLoader->cachedMetadata()) |
| 318 Platform::current()->histogramCustomCounts("ServiceWorker.ScriptCachedMe
tadataSize", m_mainScriptLoader->cachedMetadata()->size(), 1000, 50000000, 50); | 329 Platform::current()->histogramCustomCounts("ServiceWorker.ScriptCachedMe
tadataSize", m_mainScriptLoader->cachedMetadata()->size(), 1000, 50000000, 50); |
| 319 | 330 |
| 331 if (m_pauseAfterDownloadState == DoPauseAfterDownload) { |
| 332 m_pauseAfterDownloadState = IsPausedAfterDownload; |
| 333 return; |
| 334 } |
| 320 startWorkerThread(); | 335 startWorkerThread(); |
| 321 } | 336 } |
| 322 | 337 |
| 323 void WebEmbeddedWorkerImpl::startWorkerThread() | 338 void WebEmbeddedWorkerImpl::startWorkerThread() |
| 324 { | 339 { |
| 340 ASSERT(m_pauseAfterDownloadState == DontPauseAfterDownload); |
| 325 ASSERT(!m_askedToTerminate); | 341 ASSERT(!m_askedToTerminate); |
| 326 | 342 |
| 327 Document* document = m_mainFrame->frame()->document(); | 343 Document* document = m_mainFrame->frame()->document(); |
| 328 | 344 |
| 329 WorkerThreadStartMode startMode = DontPauseWorkerGlobalScopeOnStart; | 345 WorkerThreadStartMode startMode = DontPauseWorkerGlobalScopeOnStart; |
| 330 if (InspectorInstrumentation::shouldPauseDedicatedWorkerOnStart(document)) | 346 if (InspectorInstrumentation::shouldPauseDedicatedWorkerOnStart(document)) |
| 331 startMode = PauseWorkerGlobalScopeOnStart; | 347 startMode = PauseWorkerGlobalScopeOnStart; |
| 332 | 348 |
| 333 // FIXME: this document's origin is pristine and without any extra privilege
s. (crbug.com/254993) | 349 // FIXME: this document's origin is pristine and without any extra privilege
s. (crbug.com/254993) |
| 334 SecurityOrigin* starterOrigin = document->securityOrigin(); | 350 SecurityOrigin* starterOrigin = document->securityOrigin(); |
| (...skipping 21 matching lines...) Expand all Loading... |
| 356 m_mainScriptLoader.clear(); | 372 m_mainScriptLoader.clear(); |
| 357 | 373 |
| 358 m_workerGlobalScopeProxy = ServiceWorkerGlobalScopeProxy::create(*this, *doc
ument, *m_workerContextClient); | 374 m_workerGlobalScopeProxy = ServiceWorkerGlobalScopeProxy::create(*this, *doc
ument, *m_workerContextClient); |
| 359 m_loaderProxy = WorkerLoaderProxy::create(this); | 375 m_loaderProxy = WorkerLoaderProxy::create(this); |
| 360 m_workerThread = ServiceWorkerThread::create(m_loaderProxy, *m_workerGlobalS
copeProxy); | 376 m_workerThread = ServiceWorkerThread::create(m_loaderProxy, *m_workerGlobalS
copeProxy); |
| 361 m_workerThread->start(startupData.release()); | 377 m_workerThread->start(startupData.release()); |
| 362 m_workerInspectorProxy->workerThreadCreated(document, m_workerThread.get(),
scriptURL); | 378 m_workerInspectorProxy->workerThreadCreated(document, m_workerThread.get(),
scriptURL); |
| 363 } | 379 } |
| 364 | 380 |
| 365 } // namespace blink | 381 } // namespace blink |
| OLD | NEW |