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 |