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