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 |