| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (C) 2009, 2010 Google Inc. All rights reserved. | 2 * Copyright (C) 2009, 2010 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 190 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 201 RefPtr<WaitableEventWithTasks> m_eventWithTasks; | 201 RefPtr<WaitableEventWithTasks> m_eventWithTasks; |
| 202 }; | 202 }; |
| 203 | 203 |
| 204 WorkerThreadableLoader::WorkerThreadableLoader( | 204 WorkerThreadableLoader::WorkerThreadableLoader( |
| 205 WorkerGlobalScope& workerGlobalScope, | 205 WorkerGlobalScope& workerGlobalScope, |
| 206 ThreadableLoaderClient* client, | 206 ThreadableLoaderClient* client, |
| 207 const ThreadableLoaderOptions& options, | 207 const ThreadableLoaderOptions& options, |
| 208 const ResourceLoaderOptions& resourceLoaderOptions, | 208 const ResourceLoaderOptions& resourceLoaderOptions, |
| 209 BlockingBehavior blockingBehavior) | 209 BlockingBehavior blockingBehavior) |
| 210 : m_workerGlobalScope(&workerGlobalScope) | 210 : m_workerGlobalScope(&workerGlobalScope) |
| 211 , m_workerClientWrapper(new ThreadableLoaderClientWrapper(workerGlobalScope,
client)) | 211 , m_workerLoaderProxy(workerGlobalScope.thread()->workerLoaderProxy()) |
| 212 , m_bridge(new Bridge(m_workerClientWrapper, workerGlobalScope.thread()->wor
kerLoaderProxy(), options, resourceLoaderOptions, blockingBehavior)) | 212 , m_client(client) |
| 213 , m_threadableLoaderOptions(options) |
| 214 , m_resourceLoaderOptions(resourceLoaderOptions) |
| 215 , m_blockingBehavior(blockingBehavior) |
| 213 { | 216 { |
| 217 DCHECK(client); |
| 214 } | 218 } |
| 215 | 219 |
| 216 void WorkerThreadableLoader::loadResourceSynchronously(WorkerGlobalScope& worker
GlobalScope, const ResourceRequest& request, ThreadableLoaderClient& client, con
st ThreadableLoaderOptions& options, const ResourceLoaderOptions& resourceLoader
Options) | 220 void WorkerThreadableLoader::loadResourceSynchronously(WorkerGlobalScope& worker
GlobalScope, const ResourceRequest& request, ThreadableLoaderClient& client, con
st ThreadableLoaderOptions& options, const ResourceLoaderOptions& resourceLoader
Options) |
| 217 { | 221 { |
| 218 std::unique_ptr<WorkerThreadableLoader> loader = wrapUnique(new WorkerThread
ableLoader(workerGlobalScope, &client, options, resourceLoaderOptions, LoadSynch
ronously)); | 222 (new WorkerThreadableLoader(workerGlobalScope, &client, options, resourceLoa
derOptions, LoadSynchronously))->start(request); |
| 219 loader->start(request); | |
| 220 } | 223 } |
| 221 | 224 |
| 222 WorkerThreadableLoader::~WorkerThreadableLoader() | 225 WorkerThreadableLoader::~WorkerThreadableLoader() |
| 223 { | 226 { |
| 224 DCHECK(m_workerClientWrapper->done()); | 227 DCHECK(!m_peer); |
| 225 m_bridge->destroy(); | 228 DCHECK(!m_client); |
| 226 } | 229 } |
| 227 | 230 |
| 228 void WorkerThreadableLoader::start(const ResourceRequest& request) | 231 void WorkerThreadableLoader::start(const ResourceRequest& originalRequest) |
| 229 { | 232 { |
| 230 ResourceRequest requestToPass(request); | 233 ResourceRequest request(originalRequest); |
| 231 if (!requestToPass.didSetHTTPReferrer()) | 234 if (!request.didSetHTTPReferrer()) |
| 232 requestToPass.setHTTPReferrer(SecurityPolicy::generateReferrer(m_workerG
lobalScope->getReferrerPolicy(), request.url(), m_workerGlobalScope->outgoingRef
errer())); | 235 request.setHTTPReferrer(SecurityPolicy::generateReferrer(m_workerGlobalS
cope->getReferrerPolicy(), request.url(), m_workerGlobalScope->outgoingReferrer(
))); |
| 233 m_bridge->start(requestToPass, *m_workerGlobalScope); | |
| 234 } | |
| 235 | 236 |
| 236 void WorkerThreadableLoader::overrideTimeout(unsigned long timeoutMilliseconds) | |
| 237 { | |
| 238 m_bridge->overrideTimeout(timeoutMilliseconds); | |
| 239 } | |
| 240 | |
| 241 void WorkerThreadableLoader::cancel() | |
| 242 { | |
| 243 m_bridge->cancel(); | |
| 244 } | |
| 245 | |
| 246 WorkerThreadableLoader::Bridge::Bridge( | |
| 247 ThreadableLoaderClientWrapper* clientWrapper, | |
| 248 PassRefPtr<WorkerLoaderProxy> loaderProxy, | |
| 249 const ThreadableLoaderOptions& threadableLoaderOptions, | |
| 250 const ResourceLoaderOptions& resourceLoaderOptions, | |
| 251 BlockingBehavior blockingBehavior) | |
| 252 : m_clientWrapper(clientWrapper) | |
| 253 , m_loaderProxy(loaderProxy) | |
| 254 , m_threadableLoaderOptions(threadableLoaderOptions) | |
| 255 , m_resourceLoaderOptions(resourceLoaderOptions) | |
| 256 , m_blockingBehavior(blockingBehavior) | |
| 257 { | |
| 258 DCHECK(!isMainThread()); | |
| 259 } | |
| 260 | |
| 261 WorkerThreadableLoader::Bridge::~Bridge() | |
| 262 { | |
| 263 DCHECK(!isMainThread()); | |
| 264 DCHECK(!m_peer); | |
| 265 } | |
| 266 | |
| 267 void WorkerThreadableLoader::Bridge::start(const ResourceRequest& request, const
WorkerGlobalScope& workerGlobalScope) | |
| 268 { | |
| 269 DCHECK(!isMainThread()); | 237 DCHECK(!isMainThread()); |
| 270 RefPtr<WaitableEventWithTasks> eventWithTasks; | 238 RefPtr<WaitableEventWithTasks> eventWithTasks; |
| 271 if (m_blockingBehavior == LoadSynchronously) | 239 if (m_blockingBehavior == LoadSynchronously) |
| 272 eventWithTasks = WaitableEventWithTasks::create(); | 240 eventWithTasks = WaitableEventWithTasks::create(); |
| 273 | 241 |
| 274 m_loaderProxy->postTaskToLoader(BLINK_FROM_HERE, createCrossThreadTask( | 242 m_workerLoaderProxy->postTaskToLoader(BLINK_FROM_HERE, createCrossThreadTask
( |
| 275 &Peer::createAndStart, | 243 &Peer::createAndStart, |
| 276 wrapCrossThreadPersistent(this), | 244 wrapCrossThreadPersistent(this), |
| 277 m_loaderProxy, | 245 m_workerLoaderProxy, |
| 278 wrapCrossThreadPersistent(workerGlobalScope.thread()->getWorkerThreadLif
ecycleContext()), | 246 wrapCrossThreadPersistent(m_workerGlobalScope->thread()->getWorkerThread
LifecycleContext()), |
| 279 request, | 247 request, |
| 280 m_threadableLoaderOptions, | 248 m_threadableLoaderOptions, |
| 281 m_resourceLoaderOptions, | 249 m_resourceLoaderOptions, |
| 282 eventWithTasks)); | 250 eventWithTasks)); |
| 283 | 251 |
| 284 if (m_blockingBehavior == LoadAsynchronously) | 252 if (m_blockingBehavior == LoadAsynchronously) |
| 285 return; | 253 return; |
| 286 | 254 |
| 287 { | 255 { |
| 288 SafePointScope scope(BlinkGC::HeapPointersOnStack); | 256 SafePointScope scope(BlinkGC::HeapPointersOnStack); |
| (...skipping 11 matching lines...) Expand all Loading... |
| 300 // it to ensure it is stored in the crash dump. | 268 // it to ensure it is stored in the crash dump. |
| 301 const void* programCounter = task.m_location.program_counter(); | 269 const void* programCounter = task.m_location.program_counter(); |
| 302 WTF::debug::alias(&programCounter); | 270 WTF::debug::alias(&programCounter); |
| 303 | 271 |
| 304 // m_clientTask contains only CallClosureTasks. So, it's ok to pass | 272 // m_clientTask contains only CallClosureTasks. So, it's ok to pass |
| 305 // the nullptr. | 273 // the nullptr. |
| 306 task.m_task->performTask(nullptr); | 274 task.m_task->performTask(nullptr); |
| 307 } | 275 } |
| 308 } | 276 } |
| 309 | 277 |
| 310 void WorkerThreadableLoader::Bridge::overrideTimeout(unsigned long timeoutMillis
econds) | 278 void WorkerThreadableLoader::overrideTimeout(unsigned long timeoutMilliseconds) |
| 311 { | 279 { |
| 312 DCHECK(!isMainThread()); | 280 DCHECK(!isMainThread()); |
| 313 if (!m_peer) | 281 if (!m_peer) |
| 314 return; | 282 return; |
| 315 m_loaderProxy->postTaskToLoader(BLINK_FROM_HERE, createCrossThreadTask(&Peer
::overrideTimeout, m_peer, timeoutMilliseconds)); | 283 m_workerLoaderProxy->postTaskToLoader(BLINK_FROM_HERE, createCrossThreadTask
(&Peer::overrideTimeout, m_peer, timeoutMilliseconds)); |
| 316 } | 284 } |
| 317 | 285 |
| 318 void WorkerThreadableLoader::Bridge::cancel() | 286 void WorkerThreadableLoader::cancel() |
| 319 { | 287 { |
| 320 DCHECK(!isMainThread()); | 288 DCHECK(!isMainThread()); |
| 321 cancelPeer(); | 289 if (m_peer) { |
| 290 m_workerLoaderProxy->postTaskToLoader(BLINK_FROM_HERE, createCrossThread
Task(&Peer::cancel, m_peer)); |
| 291 m_peer = nullptr; |
| 292 } |
| 322 | 293 |
| 323 if (m_clientWrapper->done()) | 294 if (!m_client) |
| 324 return; | 295 return; |
| 296 |
| 325 // If the client hasn't reached a termination state, then transition it | 297 // If the client hasn't reached a termination state, then transition it |
| 326 // by sending a cancellation error. | 298 // by sending a cancellation error. |
| 327 // Note: no more client callbacks will be done after this method -- the | 299 // Note: no more client callbacks will be done after this method -- the |
| 328 // clearClient() call ensures that. | 300 // clearClient() call ensures that. |
| 329 ResourceError error(String(), 0, String(), String()); | 301 ResourceError error(String(), 0, String(), String()); |
| 330 error.setIsCancellation(true); | 302 error.setIsCancellation(true); |
| 331 m_clientWrapper->didFail(error); | 303 didFail(error); |
| 332 m_clientWrapper->clearClient(); | 304 DCHECK(!m_client); |
| 333 } | 305 } |
| 334 | 306 |
| 335 void WorkerThreadableLoader::Bridge::destroy() | 307 void WorkerThreadableLoader::didStart(Peer* peer) |
| 336 { | |
| 337 DCHECK(!isMainThread()); | |
| 338 cancelPeer(); | |
| 339 m_clientWrapper->clearClient(); | |
| 340 } | |
| 341 | |
| 342 void WorkerThreadableLoader::Bridge::didStart(Peer* peer) | |
| 343 { | 308 { |
| 344 DCHECK(!isMainThread()); | 309 DCHECK(!isMainThread()); |
| 345 DCHECK(!m_peer); | 310 DCHECK(!m_peer); |
| 346 DCHECK(peer); | 311 DCHECK(peer); |
| 347 if (m_clientWrapper->done()) { | 312 if (!m_client) { |
| 348 // The loading is already cancelled. | 313 // The loading is already cancelled. |
| 349 return; | 314 return; |
| 350 } | 315 } |
| 351 | 316 |
| 352 m_peer = peer; | 317 m_peer = peer; |
| 353 } | 318 } |
| 354 | 319 |
| 355 DEFINE_TRACE(WorkerThreadableLoader::Bridge) | 320 void WorkerThreadableLoader::didSendData(unsigned long long bytesSent, unsigned
long long totalBytesToBeSent) |
| 356 { | 321 { |
| 357 visitor->trace(m_clientWrapper); | 322 DCHECK(!isMainThread()); |
| 323 if (!m_client) |
| 324 return; |
| 325 m_client->didSendData(bytesSent, totalBytesToBeSent); |
| 358 } | 326 } |
| 359 | 327 |
| 360 void WorkerThreadableLoader::Bridge::cancelPeer() | 328 void WorkerThreadableLoader::didReceiveResponse(unsigned long identifier, std::u
nique_ptr<CrossThreadResourceResponseData> responseData, std::unique_ptr<WebData
ConsumerHandle> handle) |
| 361 { | 329 { |
| 362 DCHECK(!isMainThread()); | 330 DCHECK(!isMainThread()); |
| 363 if (!m_peer) | 331 if (!m_client) |
| 364 return; | 332 return; |
| 365 m_loaderProxy->postTaskToLoader(BLINK_FROM_HERE, createCrossThreadTask(&Peer
::cancel, m_peer)); | 333 ResourceResponse response(responseData.get()); |
| 334 m_client->didReceiveResponse(identifier, response, std::move(handle)); |
| 335 } |
| 336 |
| 337 void WorkerThreadableLoader::didReceiveData(std::unique_ptr<Vector<char>> data) |
| 338 { |
| 339 DCHECK(!isMainThread()); |
| 340 CHECK_LE(data->size(), std::numeric_limits<unsigned>::max()); |
| 341 if (!m_client) |
| 342 return; |
| 343 m_client->didReceiveData(data->data(), data->size()); |
| 344 } |
| 345 |
| 346 void WorkerThreadableLoader::didReceiveCachedMetadata(std::unique_ptr<Vector<cha
r>> data) |
| 347 { |
| 348 DCHECK(!isMainThread()); |
| 349 if (!m_client) |
| 350 return; |
| 351 m_client->didReceiveCachedMetadata(data->data(), data->size()); |
| 352 } |
| 353 |
| 354 void WorkerThreadableLoader::didFinishLoading(unsigned long identifier, double f
inishTime) |
| 355 { |
| 356 DCHECK(!isMainThread()); |
| 357 if (!m_client) |
| 358 return; |
| 359 auto* client = m_client; |
| 360 m_client = nullptr; |
| 366 m_peer = nullptr; | 361 m_peer = nullptr; |
| 362 client->didFinishLoading(identifier, finishTime); |
| 363 } |
| 364 |
| 365 void WorkerThreadableLoader::didFail(const ResourceError& error) |
| 366 { |
| 367 DCHECK(!isMainThread()); |
| 368 if (!m_client) |
| 369 return; |
| 370 auto* client = m_client; |
| 371 m_client = nullptr; |
| 372 m_peer = nullptr; |
| 373 client->didFail(error); |
| 374 } |
| 375 |
| 376 void WorkerThreadableLoader::didFailAccessControlCheck(const ResourceError& erro
r) |
| 377 { |
| 378 DCHECK(!isMainThread()); |
| 379 if (!m_client) |
| 380 return; |
| 381 auto* client = m_client; |
| 382 m_client = nullptr; |
| 383 m_peer = nullptr; |
| 384 client->didFailAccessControlCheck(error); |
| 385 } |
| 386 |
| 387 void WorkerThreadableLoader::didFailRedirectCheck() |
| 388 { |
| 389 DCHECK(!isMainThread()); |
| 390 if (!m_client) |
| 391 return; |
| 392 auto* client = m_client; |
| 393 m_client = nullptr; |
| 394 m_peer = nullptr; |
| 395 client->didFailRedirectCheck(); |
| 396 } |
| 397 |
| 398 void WorkerThreadableLoader::didDownloadData(int dataLength) |
| 399 { |
| 400 DCHECK(!isMainThread()); |
| 401 if (!m_client) |
| 402 return; |
| 403 m_client->didDownloadData(dataLength); |
| 404 } |
| 405 |
| 406 void WorkerThreadableLoader::didReceiveResourceTiming(std::unique_ptr<CrossThrea
dResourceTimingInfoData> timingData) |
| 407 { |
| 408 DCHECK(!isMainThread()); |
| 409 if (!m_client) |
| 410 return; |
| 411 std::unique_ptr<ResourceTimingInfo> info(ResourceTimingInfo::adopt(std::move
(timingData))); |
| 412 WorkerGlobalScopePerformance::performance(*m_workerGlobalScope)->addResource
Timing(*info); |
| 413 m_client->didReceiveResourceTiming(*info); |
| 414 } |
| 415 |
| 416 DEFINE_TRACE(WorkerThreadableLoader) |
| 417 { |
| 418 visitor->trace(m_workerGlobalScope); |
| 419 ThreadableLoader::trace(visitor); |
| 367 } | 420 } |
| 368 | 421 |
| 369 void WorkerThreadableLoader::Peer::createAndStart( | 422 void WorkerThreadableLoader::Peer::createAndStart( |
| 370 Bridge* bridge, | 423 WorkerThreadableLoader* workerLoader, |
| 371 PassRefPtr<WorkerLoaderProxy> passLoaderProxy, | 424 PassRefPtr<WorkerLoaderProxy> passLoaderProxy, |
| 372 WorkerThreadLifecycleContext* workerThreadLifecycleContext, | 425 WorkerThreadLifecycleContext* workerThreadLifecycleContext, |
| 373 std::unique_ptr<CrossThreadResourceRequestData> request, | 426 std::unique_ptr<CrossThreadResourceRequestData> request, |
| 374 const ThreadableLoaderOptions& options, | 427 const ThreadableLoaderOptions& options, |
| 375 const ResourceLoaderOptions& resourceLoaderOptions, | 428 const ResourceLoaderOptions& resourceLoaderOptions, |
| 376 PassRefPtr<WaitableEventWithTasks> eventWithTasks, | 429 PassRefPtr<WaitableEventWithTasks> eventWithTasks, |
| 377 ExecutionContext* executionContext) | 430 ExecutionContext* executionContext) |
| 378 { | 431 { |
| 379 DCHECK(isMainThread()); | 432 DCHECK(isMainThread()); |
| 380 TaskForwarder* forwarder; | 433 TaskForwarder* forwarder; |
| 381 RefPtr<WorkerLoaderProxy> loaderProxy = passLoaderProxy; | 434 RefPtr<WorkerLoaderProxy> loaderProxy = passLoaderProxy; |
| 382 if (eventWithTasks) | 435 if (eventWithTasks) |
| 383 forwarder = new SyncTaskForwarder(eventWithTasks); | 436 forwarder = new SyncTaskForwarder(eventWithTasks); |
| 384 else | 437 else |
| 385 forwarder = new AsyncTaskForwarder(loaderProxy); | 438 forwarder = new AsyncTaskForwarder(loaderProxy); |
| 386 | 439 |
| 387 Peer* peer = new Peer(forwarder, workerThreadLifecycleContext); | 440 Peer* peer = new Peer(forwarder, workerThreadLifecycleContext); |
| 388 if (peer->wasContextDestroyedBeforeObserverCreation()) { | 441 if (peer->wasContextDestroyedBeforeObserverCreation()) { |
| 389 // The thread is already terminating. | 442 // The thread is already terminating. |
| 390 forwarder->abort(); | 443 forwarder->abort(); |
| 391 peer->m_forwarder = nullptr; | 444 peer->m_forwarder = nullptr; |
| 392 return; | 445 return; |
| 393 } | 446 } |
| 394 peer->m_clientWrapper = bridge->clientWrapper(); | 447 peer->m_workerLoader = workerLoader; |
| 395 peer->start(*toDocument(executionContext), std::move(request), options, reso
urceLoaderOptions); | 448 peer->start(*toDocument(executionContext), std::move(request), options, reso
urceLoaderOptions); |
| 396 forwarder->forwardTask(BLINK_FROM_HERE, createCrossThreadTask(&Bridge::didSt
art, wrapCrossThreadPersistent(bridge), wrapCrossThreadPersistent(peer))); | 449 forwarder->forwardTask(BLINK_FROM_HERE, createCrossThreadTask(&WorkerThreada
bleLoader::didStart, wrapCrossThreadPersistent(workerLoader), wrapCrossThreadPer
sistent(peer))); |
| 397 } | 450 } |
| 398 | 451 |
| 399 WorkerThreadableLoader::Peer::~Peer() | 452 WorkerThreadableLoader::Peer::~Peer() |
| 400 { | 453 { |
| 401 DCHECK(isMainThread()); | 454 DCHECK(isMainThread()); |
| 402 DCHECK(!m_mainThreadLoader); | 455 DCHECK(!m_workerLoader); |
| 403 } | 456 } |
| 404 | 457 |
| 405 void WorkerThreadableLoader::Peer::overrideTimeout(unsigned long timeoutMillisec
onds) | 458 void WorkerThreadableLoader::Peer::overrideTimeout(unsigned long timeoutMillisec
onds) |
| 406 { | 459 { |
| 407 DCHECK(isMainThread()); | 460 DCHECK(isMainThread()); |
| 408 if (!m_mainThreadLoader) | 461 if (!m_mainThreadLoader) |
| 409 return; | 462 return; |
| 410 m_mainThreadLoader->overrideTimeout(timeoutMilliseconds); | 463 m_mainThreadLoader->overrideTimeout(timeoutMilliseconds); |
| 411 } | 464 } |
| 412 | 465 |
| 413 void WorkerThreadableLoader::Peer::cancel() | 466 void WorkerThreadableLoader::Peer::cancel() |
| 414 { | 467 { |
| 415 DCHECK(isMainThread()); | 468 DCHECK(isMainThread()); |
| 416 if (!m_mainThreadLoader) | 469 if (!m_mainThreadLoader) |
| 417 return; | 470 return; |
| 418 m_mainThreadLoader->cancel(); | 471 m_mainThreadLoader->cancel(); |
| 419 m_mainThreadLoader = nullptr; | 472 m_mainThreadLoader = nullptr; |
| 420 } | 473 } |
| 421 | 474 |
| 422 void WorkerThreadableLoader::Peer::didSendData(unsigned long long bytesSent, uns
igned long long totalBytesToBeSent) | 475 void WorkerThreadableLoader::Peer::didSendData(unsigned long long bytesSent, uns
igned long long totalBytesToBeSent) |
| 423 { | 476 { |
| 424 DCHECK(isMainThread()); | 477 DCHECK(isMainThread()); |
| 425 CrossThreadPersistent<ThreadableLoaderClientWrapper> clientWrapper = m_clien
tWrapper.get(); | 478 CrossThreadPersistent<WorkerThreadableLoader> workerLoader = m_workerLoader.
get(); |
| 426 if (!clientWrapper || !m_forwarder) | 479 if (!workerLoader || !m_forwarder) |
| 427 return; | 480 return; |
| 428 m_forwarder->forwardTask(BLINK_FROM_HERE, createCrossThreadTask(&ThreadableL
oaderClientWrapper::didSendData, clientWrapper, bytesSent, totalBytesToBeSent)); | 481 m_forwarder->forwardTask(BLINK_FROM_HERE, createCrossThreadTask(&WorkerThrea
dableLoader::didSendData, workerLoader, bytesSent, totalBytesToBeSent)); |
| 429 } | 482 } |
| 430 | 483 |
| 431 void WorkerThreadableLoader::Peer::didReceiveResponse(unsigned long identifier,
const ResourceResponse& response, std::unique_ptr<WebDataConsumerHandle> handle) | 484 void WorkerThreadableLoader::Peer::didReceiveResponse(unsigned long identifier,
const ResourceResponse& response, std::unique_ptr<WebDataConsumerHandle> handle) |
| 432 { | 485 { |
| 433 DCHECK(isMainThread()); | 486 DCHECK(isMainThread()); |
| 434 CrossThreadPersistent<ThreadableLoaderClientWrapper> clientWrapper = m_clien
tWrapper.get(); | 487 CrossThreadPersistent<WorkerThreadableLoader> workerLoader = m_workerLoader.
get(); |
| 435 if (!clientWrapper || !m_forwarder) | 488 if (!workerLoader || !m_forwarder) |
| 436 return; | 489 return; |
| 437 m_forwarder->forwardTask(BLINK_FROM_HERE, createCrossThreadTask(&ThreadableL
oaderClientWrapper::didReceiveResponse, clientWrapper, identifier, response, pas
sed(std::move(handle)))); | 490 m_forwarder->forwardTask(BLINK_FROM_HERE, createCrossThreadTask(&WorkerThrea
dableLoader::didReceiveResponse, workerLoader, identifier, response, passed(std:
:move(handle)))); |
| 438 } | 491 } |
| 439 | 492 |
| 440 void WorkerThreadableLoader::Peer::didReceiveData(const char* data, unsigned dat
aLength) | 493 void WorkerThreadableLoader::Peer::didReceiveData(const char* data, unsigned dat
aLength) |
| 441 { | 494 { |
| 442 DCHECK(isMainThread()); | 495 DCHECK(isMainThread()); |
| 443 CrossThreadPersistent<ThreadableLoaderClientWrapper> clientWrapper = m_clien
tWrapper.get(); | 496 CrossThreadPersistent<WorkerThreadableLoader> workerLoader = m_workerLoader.
get(); |
| 444 if (!clientWrapper || !m_forwarder) | 497 if (!workerLoader || !m_forwarder) |
| 445 return; | 498 return; |
| 446 m_forwarder->forwardTask(BLINK_FROM_HERE, createCrossThreadTask(&ThreadableL
oaderClientWrapper::didReceiveData, clientWrapper, passed(createVectorFromMemory
Region(data, dataLength)))); | 499 m_forwarder->forwardTask(BLINK_FROM_HERE, createCrossThreadTask(&WorkerThrea
dableLoader::didReceiveData, workerLoader, passed(createVectorFromMemoryRegion(d
ata, dataLength)))); |
| 447 } | 500 } |
| 448 | 501 |
| 449 void WorkerThreadableLoader::Peer::didDownloadData(int dataLength) | 502 void WorkerThreadableLoader::Peer::didDownloadData(int dataLength) |
| 450 { | 503 { |
| 451 DCHECK(isMainThread()); | 504 DCHECK(isMainThread()); |
| 452 CrossThreadPersistent<ThreadableLoaderClientWrapper> clientWrapper = m_clien
tWrapper.get(); | 505 CrossThreadPersistent<WorkerThreadableLoader> workerLoader = m_workerLoader.
get(); |
| 453 if (!clientWrapper || !m_forwarder) | 506 if (!workerLoader || !m_forwarder) |
| 454 return; | 507 return; |
| 455 m_forwarder->forwardTask(BLINK_FROM_HERE, createCrossThreadTask(&ThreadableL
oaderClientWrapper::didDownloadData, clientWrapper, dataLength)); | 508 m_forwarder->forwardTask(BLINK_FROM_HERE, createCrossThreadTask(&WorkerThrea
dableLoader::didDownloadData, workerLoader, dataLength)); |
| 456 } | 509 } |
| 457 | 510 |
| 458 void WorkerThreadableLoader::Peer::didReceiveCachedMetadata(const char* data, in
t dataLength) | 511 void WorkerThreadableLoader::Peer::didReceiveCachedMetadata(const char* data, in
t dataLength) |
| 459 { | 512 { |
| 460 DCHECK(isMainThread()); | 513 DCHECK(isMainThread()); |
| 461 CrossThreadPersistent<ThreadableLoaderClientWrapper> clientWrapper = m_clien
tWrapper.get(); | 514 CrossThreadPersistent<WorkerThreadableLoader> workerLoader = m_workerLoader.
get(); |
| 462 if (!clientWrapper || !m_forwarder) | 515 if (!workerLoader || !m_forwarder) |
| 463 return; | 516 return; |
| 464 m_forwarder->forwardTask(BLINK_FROM_HERE, createCrossThreadTask(&ThreadableL
oaderClientWrapper::didReceiveCachedMetadata, clientWrapper, passed(createVector
FromMemoryRegion(data, dataLength)))); | 517 m_forwarder->forwardTask(BLINK_FROM_HERE, createCrossThreadTask(&WorkerThrea
dableLoader::didReceiveCachedMetadata, workerLoader, passed(createVectorFromMemo
ryRegion(data, dataLength)))); |
| 465 } | 518 } |
| 466 | 519 |
| 467 void WorkerThreadableLoader::Peer::didFinishLoading(unsigned long identifier, do
uble finishTime) | 520 void WorkerThreadableLoader::Peer::didFinishLoading(unsigned long identifier, do
uble finishTime) |
| 468 { | 521 { |
| 469 DCHECK(isMainThread()); | 522 DCHECK(isMainThread()); |
| 470 CrossThreadPersistent<ThreadableLoaderClientWrapper> clientWrapper = m_clien
tWrapper.get(); | 523 CrossThreadPersistent<WorkerThreadableLoader> workerLoader = m_workerLoader.
get(); |
| 471 if (!clientWrapper || !m_forwarder) | 524 if (!workerLoader || !m_forwarder) |
| 472 return; | 525 return; |
| 473 m_forwarder->forwardTaskWithDoneSignal(BLINK_FROM_HERE, createCrossThreadTas
k(&ThreadableLoaderClientWrapper::didFinishLoading, clientWrapper, identifier, f
inishTime)); | 526 m_forwarder->forwardTaskWithDoneSignal(BLINK_FROM_HERE, createCrossThreadTas
k(&WorkerThreadableLoader::didFinishLoading, workerLoader, identifier, finishTim
e)); |
| 474 m_forwarder = nullptr; | 527 m_forwarder = nullptr; |
| 475 } | 528 } |
| 476 | 529 |
| 477 void WorkerThreadableLoader::Peer::didFail(const ResourceError& error) | 530 void WorkerThreadableLoader::Peer::didFail(const ResourceError& error) |
| 478 { | 531 { |
| 479 DCHECK(isMainThread()); | 532 DCHECK(isMainThread()); |
| 480 CrossThreadPersistent<ThreadableLoaderClientWrapper> clientWrapper = m_clien
tWrapper.get(); | 533 CrossThreadPersistent<WorkerThreadableLoader> workerLoader = m_workerLoader.
get(); |
| 481 if (!clientWrapper || !m_forwarder) | 534 if (!workerLoader || !m_forwarder) |
| 482 return; | 535 return; |
| 483 m_forwarder->forwardTaskWithDoneSignal(BLINK_FROM_HERE, createCrossThreadTas
k(&ThreadableLoaderClientWrapper::didFail, clientWrapper, error)); | 536 m_forwarder->forwardTaskWithDoneSignal(BLINK_FROM_HERE, createCrossThreadTas
k(&WorkerThreadableLoader::didFail, workerLoader, error)); |
| 484 m_forwarder = nullptr; | 537 m_forwarder = nullptr; |
| 485 } | 538 } |
| 486 | 539 |
| 487 void WorkerThreadableLoader::Peer::didFailAccessControlCheck(const ResourceError
& error) | 540 void WorkerThreadableLoader::Peer::didFailAccessControlCheck(const ResourceError
& error) |
| 488 { | 541 { |
| 489 DCHECK(isMainThread()); | 542 DCHECK(isMainThread()); |
| 490 CrossThreadPersistent<ThreadableLoaderClientWrapper> clientWrapper = m_clien
tWrapper.get(); | 543 CrossThreadPersistent<WorkerThreadableLoader> workerLoader = m_workerLoader.
get(); |
| 491 if (!clientWrapper || !m_forwarder) | 544 if (!workerLoader || !m_forwarder) |
| 492 return; | 545 return; |
| 493 m_forwarder->forwardTaskWithDoneSignal(BLINK_FROM_HERE, createCrossThreadTas
k(&ThreadableLoaderClientWrapper::didFailAccessControlCheck, clientWrapper, erro
r)); | 546 m_forwarder->forwardTaskWithDoneSignal(BLINK_FROM_HERE, createCrossThreadTas
k(&WorkerThreadableLoader::didFailAccessControlCheck, workerLoader, error)); |
| 494 m_forwarder = nullptr; | 547 m_forwarder = nullptr; |
| 495 } | 548 } |
| 496 | 549 |
| 497 void WorkerThreadableLoader::Peer::didFailRedirectCheck() | 550 void WorkerThreadableLoader::Peer::didFailRedirectCheck() |
| 498 { | 551 { |
| 499 DCHECK(isMainThread()); | 552 DCHECK(isMainThread()); |
| 500 CrossThreadPersistent<ThreadableLoaderClientWrapper> clientWrapper = m_clien
tWrapper.get(); | 553 CrossThreadPersistent<WorkerThreadableLoader> workerLoader = m_workerLoader.
get(); |
| 501 if (!clientWrapper || !m_forwarder) | 554 if (!workerLoader || !m_forwarder) |
| 502 return; | 555 return; |
| 503 m_forwarder->forwardTaskWithDoneSignal(BLINK_FROM_HERE, createCrossThreadTas
k(&ThreadableLoaderClientWrapper::didFailRedirectCheck, clientWrapper)); | 556 m_forwarder->forwardTaskWithDoneSignal(BLINK_FROM_HERE, createCrossThreadTas
k(&WorkerThreadableLoader::didFailRedirectCheck, workerLoader)); |
| 504 m_forwarder = nullptr; | 557 m_forwarder = nullptr; |
| 505 } | 558 } |
| 506 | 559 |
| 507 void WorkerThreadableLoader::Peer::didReceiveResourceTiming(const ResourceTiming
Info& info) | 560 void WorkerThreadableLoader::Peer::didReceiveResourceTiming(const ResourceTiming
Info& info) |
| 508 { | 561 { |
| 509 DCHECK(isMainThread()); | 562 DCHECK(isMainThread()); |
| 510 CrossThreadPersistent<ThreadableLoaderClientWrapper> clientWrapper = m_clien
tWrapper.get(); | 563 CrossThreadPersistent<WorkerThreadableLoader> workerLoader = m_workerLoader.
get(); |
| 511 if (!clientWrapper || !m_forwarder) | 564 if (!workerLoader || !m_forwarder) |
| 512 return; | 565 return; |
| 513 m_forwarder->forwardTask(BLINK_FROM_HERE, createCrossThreadTask(&ThreadableL
oaderClientWrapper::didReceiveResourceTiming, clientWrapper, info)); | 566 m_forwarder->forwardTask(BLINK_FROM_HERE, createCrossThreadTask(&WorkerThrea
dableLoader::didReceiveResourceTiming, workerLoader, info)); |
| 514 } | 567 } |
| 515 | 568 |
| 516 void WorkerThreadableLoader::Peer::contextDestroyed() | 569 void WorkerThreadableLoader::Peer::contextDestroyed() |
| 517 { | 570 { |
| 518 DCHECK(isMainThread()); | 571 DCHECK(isMainThread()); |
| 519 if (m_forwarder) { | 572 if (m_forwarder) { |
| 520 m_forwarder->abort(); | 573 m_forwarder->abort(); |
| 521 m_forwarder = nullptr; | 574 m_forwarder = nullptr; |
| 522 } | 575 } |
| 523 m_clientWrapper = nullptr; | 576 m_workerLoader = nullptr; |
| 524 cancel(); | 577 cancel(); |
| 525 } | 578 } |
| 526 | 579 |
| 527 DEFINE_TRACE(WorkerThreadableLoader::Peer) | 580 DEFINE_TRACE(WorkerThreadableLoader::Peer) |
| 528 { | 581 { |
| 529 visitor->trace(m_forwarder); | 582 visitor->trace(m_forwarder); |
| 583 visitor->trace(m_mainThreadLoader); |
| 530 WorkerThreadLifecycleObserver::trace(visitor); | 584 WorkerThreadLifecycleObserver::trace(visitor); |
| 531 } | 585 } |
| 532 | 586 |
| 533 WorkerThreadableLoader::Peer::Peer(TaskForwarder* forwarder, WorkerThreadLifecyc
leContext* context) | 587 WorkerThreadableLoader::Peer::Peer(TaskForwarder* forwarder, WorkerThreadLifecyc
leContext* context) |
| 534 : WorkerThreadLifecycleObserver(context) | 588 : WorkerThreadLifecycleObserver(context) |
| 535 , m_forwarder(forwarder) | 589 , m_forwarder(forwarder) |
| 536 { | 590 { |
| 537 DCHECK(isMainThread()); | 591 DCHECK(isMainThread()); |
| 538 } | 592 } |
| 539 | 593 |
| 540 void WorkerThreadableLoader::Peer::start( | 594 void WorkerThreadableLoader::Peer::start( |
| 541 Document& document, | 595 Document& document, |
| 542 std::unique_ptr<CrossThreadResourceRequestData> request, | 596 std::unique_ptr<CrossThreadResourceRequestData> request, |
| 543 const ThreadableLoaderOptions& options, | 597 const ThreadableLoaderOptions& options, |
| 544 const ResourceLoaderOptions& originalResourceLoaderOptions) | 598 const ResourceLoaderOptions& originalResourceLoaderOptions) |
| 545 { | 599 { |
| 546 DCHECK(isMainThread()); | 600 DCHECK(isMainThread()); |
| 547 ResourceLoaderOptions resourceLoaderOptions = originalResourceLoaderOptions; | 601 ResourceLoaderOptions resourceLoaderOptions = originalResourceLoaderOptions; |
| 548 resourceLoaderOptions.requestInitiatorContext = WorkerContext; | 602 resourceLoaderOptions.requestInitiatorContext = WorkerContext; |
| 549 m_mainThreadLoader = DocumentThreadableLoader::create(document, this, option
s, resourceLoaderOptions); | 603 m_mainThreadLoader = DocumentThreadableLoader::create(document, this, option
s, resourceLoaderOptions); |
| 550 m_mainThreadLoader->start(ResourceRequest(request.get())); | 604 m_mainThreadLoader->start(ResourceRequest(request.get())); |
| 551 } | 605 } |
| 552 | 606 |
| 553 } // namespace blink | 607 } // namespace blink |
| OLD | NEW |