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