| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (C) 2009 Google Inc. All rights reserved. | 2 * Copyright (C) 2009 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 24 matching lines...) Expand all Loading... |
| 35 #include "core/events/MessageEvent.h" | 35 #include "core/events/MessageEvent.h" |
| 36 #include "core/html/HTMLFormElement.h" | 36 #include "core/html/HTMLFormElement.h" |
| 37 #include "core/inspector/ConsoleMessage.h" | 37 #include "core/inspector/ConsoleMessage.h" |
| 38 #include "core/inspector/InspectorInstrumentation.h" | 38 #include "core/inspector/InspectorInstrumentation.h" |
| 39 #include "core/inspector/WorkerDebuggerAgent.h" | 39 #include "core/inspector/WorkerDebuggerAgent.h" |
| 40 #include "core/inspector/WorkerInspectorController.h" | 40 #include "core/inspector/WorkerInspectorController.h" |
| 41 #include "core/loader/FrameLoadRequest.h" | 41 #include "core/loader/FrameLoadRequest.h" |
| 42 #include "core/loader/FrameLoader.h" | 42 #include "core/loader/FrameLoader.h" |
| 43 #include "core/page/Page.h" | 43 #include "core/page/Page.h" |
| 44 #include "core/workers/SharedWorkerGlobalScope.h" | 44 #include "core/workers/SharedWorkerGlobalScope.h" |
| 45 #include "core/workers/SharedWorkerThread.h" | 45 #include "core/workers/SharedWorkerScript.h" |
| 46 #include "core/workers/WorkerClients.h" | 46 #include "core/workers/WorkerClients.h" |
| 47 #include "core/workers/WorkerGlobalScope.h" | 47 #include "core/workers/WorkerGlobalScope.h" |
| 48 #include "core/workers/WorkerInspectorProxy.h" | 48 #include "core/workers/WorkerInspectorProxy.h" |
| 49 #include "core/workers/WorkerLoaderProxy.h" | 49 #include "core/workers/WorkerLoaderProxy.h" |
| 50 #include "core/workers/WorkerScriptLoader.h" | 50 #include "core/workers/WorkerScriptLoader.h" |
| 51 #include "core/workers/WorkerThreadStartupData.h" | 51 #include "core/workers/WorkerScriptStartupData.h" |
| 52 #include "platform/RuntimeEnabledFeatures.h" | 52 #include "platform/RuntimeEnabledFeatures.h" |
| 53 #include "platform/ThreadSafeFunctional.h" | 53 #include "platform/ThreadSafeFunctional.h" |
| 54 #include "platform/heap/Handle.h" | 54 #include "platform/heap/Handle.h" |
| 55 #include "platform/network/ContentSecurityPolicyParsers.h" | 55 #include "platform/network/ContentSecurityPolicyParsers.h" |
| 56 #include "platform/network/ResourceResponse.h" | 56 #include "platform/network/ResourceResponse.h" |
| 57 #include "platform/weborigin/KURL.h" | 57 #include "platform/weborigin/KURL.h" |
| 58 #include "platform/weborigin/SecurityOrigin.h" | 58 #include "platform/weborigin/SecurityOrigin.h" |
| 59 #include "public/platform/WebFileError.h" | 59 #include "public/platform/WebFileError.h" |
| 60 #include "public/platform/WebMessagePortChannel.h" | 60 #include "public/platform/WebMessagePortChannel.h" |
| 61 #include "public/platform/WebString.h" | 61 #include "public/platform/WebString.h" |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 95 ASSERT(m_webView); | 95 ASSERT(m_webView); |
| 96 // Detach the client before closing the view to avoid getting called back. | 96 // Detach the client before closing the view to avoid getting called back. |
| 97 m_mainFrame->setClient(0); | 97 m_mainFrame->setClient(0); |
| 98 | 98 |
| 99 m_webView->close(); | 99 m_webView->close(); |
| 100 m_mainFrame->close(); | 100 m_mainFrame->close(); |
| 101 if (m_loaderProxy) | 101 if (m_loaderProxy) |
| 102 m_loaderProxy->detachProvider(this); | 102 m_loaderProxy->detachProvider(this); |
| 103 } | 103 } |
| 104 | 104 |
| 105 void WebSharedWorkerImpl::terminateWorkerThread() | 105 void WebSharedWorkerImpl::terminateWorkerScript() |
| 106 { | 106 { |
| 107 if (m_askedToTerminate) | 107 if (m_askedToTerminate) |
| 108 return; | 108 return; |
| 109 m_askedToTerminate = true; | 109 m_askedToTerminate = true; |
| 110 if (m_mainScriptLoader) { | 110 if (m_mainScriptLoader) { |
| 111 m_mainScriptLoader->cancel(); | 111 m_mainScriptLoader->cancel(); |
| 112 m_mainScriptLoader.clear(); | 112 m_mainScriptLoader.clear(); |
| 113 m_client->workerScriptLoadFailed(); | 113 m_client->workerScriptLoadFailed(); |
| 114 delete this; | 114 delete this; |
| 115 return; | 115 return; |
| 116 } | 116 } |
| 117 if (m_workerThread) | 117 if (m_workerScript) |
| 118 m_workerThread->terminate(); | 118 m_workerScript->terminate(); |
| 119 m_workerInspectorProxy->workerThreadTerminated(); | 119 m_workerInspectorProxy->workerScriptTerminated(); |
| 120 } | 120 } |
| 121 | 121 |
| 122 void WebSharedWorkerImpl::initializeLoader() | 122 void WebSharedWorkerImpl::initializeLoader() |
| 123 { | 123 { |
| 124 // Create 'shadow page'. This page is never displayed, it is used to proxy t
he | 124 // Create 'shadow page'. This page is never displayed, it is used to proxy t
he |
| 125 // loading requests from the worker context to the rest of WebKit and Chromi
um | 125 // loading requests from the worker context to the rest of WebKit and Chromi
um |
| 126 // infrastructure. | 126 // infrastructure. |
| 127 ASSERT(!m_webView); | 127 ASSERT(!m_webView); |
| 128 m_webView = WebView::create(0); | 128 m_webView = WebView::create(0); |
| 129 // FIXME: http://crbug.com/363843. This needs to find a better way to | 129 // FIXME: http://crbug.com/363843. This needs to find a better way to |
| (...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 237 | 237 |
| 238 void WebSharedWorkerImpl::workerGlobalScopeClosed() | 238 void WebSharedWorkerImpl::workerGlobalScopeClosed() |
| 239 { | 239 { |
| 240 Platform::current()->mainThread()->taskRunner()->postTask(BLINK_FROM_HERE, t
hreadSafeBind(&WebSharedWorkerImpl::workerGlobalScopeClosedOnMainThread, AllowCr
ossThreadAccess(this))); | 240 Platform::current()->mainThread()->taskRunner()->postTask(BLINK_FROM_HERE, t
hreadSafeBind(&WebSharedWorkerImpl::workerGlobalScopeClosedOnMainThread, AllowCr
ossThreadAccess(this))); |
| 241 } | 241 } |
| 242 | 242 |
| 243 void WebSharedWorkerImpl::workerGlobalScopeClosedOnMainThread() | 243 void WebSharedWorkerImpl::workerGlobalScopeClosedOnMainThread() |
| 244 { | 244 { |
| 245 m_client->workerContextClosed(); | 245 m_client->workerContextClosed(); |
| 246 | 246 |
| 247 terminateWorkerThread(); | 247 terminateWorkerScript(); |
| 248 } | 248 } |
| 249 | 249 |
| 250 void WebSharedWorkerImpl::workerGlobalScopeStarted(WorkerGlobalScope*) | 250 void WebSharedWorkerImpl::workerGlobalScopeStarted(WorkerGlobalScope*) |
| 251 { | 251 { |
| 252 } | 252 } |
| 253 | 253 |
| 254 void WebSharedWorkerImpl::workerThreadTerminated() | 254 void WebSharedWorkerImpl::workerScriptTerminated() |
| 255 { | 255 { |
| 256 Platform::current()->mainThread()->taskRunner()->postTask(BLINK_FROM_HERE, t
hreadSafeBind(&WebSharedWorkerImpl::workerThreadTerminatedOnMainThread, AllowCro
ssThreadAccess(this))); | 256 Platform::current()->mainThread()->taskRunner()->postTask(BLINK_FROM_HERE, t
hreadSafeBind(&WebSharedWorkerImpl::workerScriptTerminatedOnMainThread, AllowCro
ssThreadAccess(this))); |
| 257 } | 257 } |
| 258 | 258 |
| 259 void WebSharedWorkerImpl::workerThreadTerminatedOnMainThread() | 259 void WebSharedWorkerImpl::workerScriptTerminatedOnMainThread() |
| 260 { | 260 { |
| 261 m_client->workerContextDestroyed(); | 261 m_client->workerContextDestroyed(); |
| 262 // The lifetime of this proxy is controlled by the worker context. | 262 // The lifetime of this proxy is controlled by the worker context. |
| 263 delete this; | 263 delete this; |
| 264 } | 264 } |
| 265 | 265 |
| 266 // WorkerLoaderProxyProvider ---------------------------------------------------
-------- | 266 // WorkerLoaderProxyProvider ---------------------------------------------------
-------- |
| 267 | 267 |
| 268 void WebSharedWorkerImpl::postTaskToLoader(PassOwnPtr<ExecutionContextTask> task
) | 268 void WebSharedWorkerImpl::postTaskToLoader(PassOwnPtr<ExecutionContextTask> task
) |
| 269 { | 269 { |
| 270 m_mainFrame->frame()->document()->postTask(BLINK_FROM_HERE, task); | 270 m_mainFrame->frame()->document()->postTask(BLINK_FROM_HERE, task); |
| 271 } | 271 } |
| 272 | 272 |
| 273 bool WebSharedWorkerImpl::postTaskToWorkerGlobalScope(PassOwnPtr<ExecutionContex
tTask> task) | 273 bool WebSharedWorkerImpl::postTaskToWorkerGlobalScope(PassOwnPtr<ExecutionContex
tTask> task) |
| 274 { | 274 { |
| 275 m_workerThread->postTask(BLINK_FROM_HERE, task); | 275 m_workerScript->postTask(BLINK_FROM_HERE, task); |
| 276 return true; | 276 return true; |
| 277 } | 277 } |
| 278 | 278 |
| 279 void WebSharedWorkerImpl::connect(WebMessagePortChannel* webChannel) | 279 void WebSharedWorkerImpl::connect(WebMessagePortChannel* webChannel) |
| 280 { | 280 { |
| 281 workerThread()->postTask( | 281 workerScript()->postTask( |
| 282 BLINK_FROM_HERE, createCrossThreadTask(&connectTask, adoptPtr(webChannel
))); | 282 BLINK_FROM_HERE, createCrossThreadTask(&connectTask, adoptPtr(webChannel
))); |
| 283 } | 283 } |
| 284 | 284 |
| 285 void WebSharedWorkerImpl::connectTask(PassOwnPtr<WebMessagePortChannel> channel,
ExecutionContext* context) | 285 void WebSharedWorkerImpl::connectTask(PassOwnPtr<WebMessagePortChannel> channel,
ExecutionContext* context) |
| 286 { | 286 { |
| 287 // Wrap the passed-in channel in a MessagePort, and send it off via a connec
t event. | 287 // Wrap the passed-in channel in a MessagePort, and send it off via a connec
t event. |
| 288 MessagePort* port = MessagePort::create(*context); | 288 MessagePort* port = MessagePort::create(*context); |
| 289 port->entangle(channel); | 289 port->entangle(channel); |
| 290 WorkerGlobalScope* workerGlobalScope = toWorkerGlobalScope(context); | 290 WorkerGlobalScope* workerGlobalScope = toWorkerGlobalScope(context); |
| 291 ASSERT_WITH_SECURITY_IMPLICATION(workerGlobalScope->isSharedWorkerGlobalScop
e()); | 291 ASSERT_WITH_SECURITY_IMPLICATION(workerGlobalScope->isSharedWorkerGlobalScop
e()); |
| (...skipping 23 matching lines...) Expand all Loading... |
| 315 m_mainScriptLoader->cancel(); | 315 m_mainScriptLoader->cancel(); |
| 316 m_client->workerScriptLoadFailed(); | 316 m_client->workerScriptLoadFailed(); |
| 317 | 317 |
| 318 // The SharedWorker was unable to load the initial script, so | 318 // The SharedWorker was unable to load the initial script, so |
| 319 // shut it down right here. | 319 // shut it down right here. |
| 320 delete this; | 320 delete this; |
| 321 return; | 321 return; |
| 322 } | 322 } |
| 323 | 323 |
| 324 Document* document = m_mainFrame->frame()->document(); | 324 Document* document = m_mainFrame->frame()->document(); |
| 325 WorkerThreadStartMode startMode = DontPauseWorkerGlobalScopeOnStart; | 325 WorkerScriptStartMode startMode = DontPauseWorkerGlobalScopeOnStart; |
| 326 if (InspectorInstrumentation::shouldPauseDedicatedWorkerOnStart(document)) | 326 if (InspectorInstrumentation::shouldPauseDedicatedWorkerOnStart(document)) |
| 327 startMode = PauseWorkerGlobalScopeOnStart; | 327 startMode = PauseWorkerGlobalScopeOnStart; |
| 328 | 328 |
| 329 // FIXME: this document's origin is pristine and without any extra privilege
s. (crbug.com/254993) | 329 // FIXME: this document's origin is pristine and without any extra privilege
s. (crbug.com/254993) |
| 330 SecurityOrigin* starterOrigin = document->securityOrigin(); | 330 SecurityOrigin* starterOrigin = document->securityOrigin(); |
| 331 | 331 |
| 332 OwnPtrWillBeRawPtr<WorkerClients> workerClients = WorkerClients::create(); | 332 OwnPtrWillBeRawPtr<WorkerClients> workerClients = WorkerClients::create(); |
| 333 provideLocalFileSystemToWorker(workerClients.get(), LocalFileSystemClient::c
reate()); | 333 provideLocalFileSystemToWorker(workerClients.get(), LocalFileSystemClient::c
reate()); |
| 334 WebSecurityOrigin webSecurityOrigin(m_loadingDocument->securityOrigin()); | 334 WebSecurityOrigin webSecurityOrigin(m_loadingDocument->securityOrigin()); |
| 335 provideContentSettingsClientToWorker(workerClients.get(), adoptPtr(m_client-
>createWorkerContentSettingsClientProxy(webSecurityOrigin))); | 335 provideContentSettingsClientToWorker(workerClients.get(), adoptPtr(m_client-
>createWorkerContentSettingsClientProxy(webSecurityOrigin))); |
| 336 RefPtrWillBeRawPtr<ContentSecurityPolicy> contentSecurityPolicy = m_mainScri
ptLoader->releaseContentSecurityPolicy(); | 336 RefPtrWillBeRawPtr<ContentSecurityPolicy> contentSecurityPolicy = m_mainScri
ptLoader->releaseContentSecurityPolicy(); |
| 337 OwnPtr<WorkerThreadStartupData> startupData = WorkerThreadStartupData::creat
e( | 337 OwnPtr<WorkerScriptStartupData> startupData = WorkerScriptStartupData::creat
e( |
| 338 m_url, | 338 m_url, |
| 339 m_loadingDocument->userAgent(), | 339 m_loadingDocument->userAgent(), |
| 340 m_mainScriptLoader->script(), | 340 m_mainScriptLoader->script(), |
| 341 nullptr, | 341 nullptr, |
| 342 startMode, | 342 startMode, |
| 343 contentSecurityPolicy ? contentSecurityPolicy->headers() : nullptr, | 343 contentSecurityPolicy ? contentSecurityPolicy->headers() : nullptr, |
| 344 starterOrigin, | 344 starterOrigin, |
| 345 workerClients.release()); | 345 workerClients.release()); |
| 346 m_loaderProxy = WorkerLoaderProxy::create(this); | 346 m_loaderProxy = WorkerLoaderProxy::create(this); |
| 347 setWorkerThread(SharedWorkerThread::create(m_name, m_loaderProxy, *this)); | 347 setWorkerScript(SharedWorkerScript::create(m_name, m_loaderProxy, *this)); |
| 348 InspectorInstrumentation::scriptImported(m_loadingDocument.get(), m_mainScri
ptLoader->identifier(), m_mainScriptLoader->script()); | 348 InspectorInstrumentation::scriptImported(m_loadingDocument.get(), m_mainScri
ptLoader->identifier(), m_mainScriptLoader->script()); |
| 349 m_mainScriptLoader.clear(); | 349 m_mainScriptLoader.clear(); |
| 350 | 350 |
| 351 workerThread()->start(startupData.release()); | 351 workerScript()->start(startupData.release()); |
| 352 m_workerInspectorProxy->workerThreadCreated(m_loadingDocument.get(), workerT
hread(), m_url); | 352 m_workerInspectorProxy->workerScriptCreated(m_loadingDocument.get(), workerS
cript(), m_url); |
| 353 m_client->workerScriptLoaded(); | 353 m_client->workerScriptLoaded(); |
| 354 } | 354 } |
| 355 | 355 |
| 356 void WebSharedWorkerImpl::terminateWorkerContext() | 356 void WebSharedWorkerImpl::terminateWorkerContext() |
| 357 { | 357 { |
| 358 terminateWorkerThread(); | 358 terminateWorkerScript(); |
| 359 } | 359 } |
| 360 | 360 |
| 361 void WebSharedWorkerImpl::pauseWorkerContextOnStart() | 361 void WebSharedWorkerImpl::pauseWorkerContextOnStart() |
| 362 { | 362 { |
| 363 m_pauseWorkerContextOnStart = true; | 363 m_pauseWorkerContextOnStart = true; |
| 364 } | 364 } |
| 365 | 365 |
| 366 void WebSharedWorkerImpl::attachDevTools(const WebString& hostId, int sessionId) | 366 void WebSharedWorkerImpl::attachDevTools(const WebString& hostId, int sessionId) |
| 367 { | 367 { |
| 368 WebDevToolsAgent* devtoolsAgent = m_mainFrame->devToolsAgent(); | 368 WebDevToolsAgent* devtoolsAgent = m_mainFrame->devToolsAgent(); |
| (...skipping 24 matching lines...) Expand all Loading... |
| 393 if (devtoolsAgent) | 393 if (devtoolsAgent) |
| 394 devtoolsAgent->dispatchOnInspectorBackend(sessionId, message); | 394 devtoolsAgent->dispatchOnInspectorBackend(sessionId, message); |
| 395 } | 395 } |
| 396 | 396 |
| 397 WebSharedWorker* WebSharedWorker::create(WebSharedWorkerClient* client) | 397 WebSharedWorker* WebSharedWorker::create(WebSharedWorkerClient* client) |
| 398 { | 398 { |
| 399 return new WebSharedWorkerImpl(client); | 399 return new WebSharedWorkerImpl(client); |
| 400 } | 400 } |
| 401 | 401 |
| 402 } // namespace blink | 402 } // namespace blink |
| OLD | NEW |