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