| 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 189 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 200 DCHECK(client); | 200 DCHECK(client); |
| 201 } | 201 } |
| 202 | 202 |
| 203 void WorkerThreadableLoader::loadResourceSynchronously(WorkerGlobalScope& worker
GlobalScope, const ResourceRequest& request, ThreadableLoaderClient& client, con
st ThreadableLoaderOptions& options, const ResourceLoaderOptions& resourceLoader
Options) | 203 void WorkerThreadableLoader::loadResourceSynchronously(WorkerGlobalScope& worker
GlobalScope, const ResourceRequest& request, ThreadableLoaderClient& client, con
st ThreadableLoaderOptions& options, const ResourceLoaderOptions& resourceLoader
Options) |
| 204 { | 204 { |
| 205 (new WorkerThreadableLoader(workerGlobalScope, &client, options, resourceLoa
derOptions, LoadSynchronously))->start(request); | 205 (new WorkerThreadableLoader(workerGlobalScope, &client, options, resourceLoa
derOptions, LoadSynchronously))->start(request); |
| 206 } | 206 } |
| 207 | 207 |
| 208 WorkerThreadableLoader::~WorkerThreadableLoader() | 208 WorkerThreadableLoader::~WorkerThreadableLoader() |
| 209 { | 209 { |
| 210 DCHECK(!m_peer); | 210 DCHECK(!m_mainThreadLoaderHolder); |
| 211 DCHECK(!m_client); | 211 DCHECK(!m_client); |
| 212 } | 212 } |
| 213 | 213 |
| 214 void WorkerThreadableLoader::start(const ResourceRequest& originalRequest) | 214 void WorkerThreadableLoader::start(const ResourceRequest& originalRequest) |
| 215 { | 215 { |
| 216 ResourceRequest request(originalRequest); | 216 ResourceRequest request(originalRequest); |
| 217 if (!request.didSetHTTPReferrer()) | 217 if (!request.didSetHTTPReferrer()) |
| 218 request.setHTTPReferrer(SecurityPolicy::generateReferrer(m_workerGlobalS
cope->getReferrerPolicy(), request.url(), m_workerGlobalScope->outgoingReferrer(
))); | 218 request.setHTTPReferrer(SecurityPolicy::generateReferrer(m_workerGlobalS
cope->getReferrerPolicy(), request.url(), m_workerGlobalScope->outgoingReferrer(
))); |
| 219 | 219 |
| 220 DCHECK(!isMainThread()); | 220 DCHECK(!isMainThread()); |
| 221 RefPtr<WaitableEventWithTasks> eventWithTasks; | 221 RefPtr<WaitableEventWithTasks> eventWithTasks; |
| 222 if (m_blockingBehavior == LoadSynchronously) | 222 if (m_blockingBehavior == LoadSynchronously) |
| 223 eventWithTasks = WaitableEventWithTasks::create(); | 223 eventWithTasks = WaitableEventWithTasks::create(); |
| 224 | 224 |
| 225 m_workerLoaderProxy->postTaskToLoader(createCrossThreadTask( | 225 m_workerLoaderProxy->postTaskToLoader(createCrossThreadTask( |
| 226 &Peer::createAndStart, | 226 &MainThreadLoaderHolder::createAndStart, |
| 227 wrapCrossThreadPersistent(this), | 227 wrapCrossThreadPersistent(this), |
| 228 m_workerLoaderProxy, | 228 m_workerLoaderProxy, |
| 229 wrapCrossThreadPersistent(m_workerGlobalScope->thread()->getWorkerThread
LifecycleContext()), | 229 wrapCrossThreadPersistent(m_workerGlobalScope->thread()->getWorkerThread
LifecycleContext()), |
| 230 request, | 230 request, |
| 231 m_threadableLoaderOptions, | 231 m_threadableLoaderOptions, |
| 232 m_resourceLoaderOptions, | 232 m_resourceLoaderOptions, |
| 233 eventWithTasks)); | 233 eventWithTasks)); |
| 234 | 234 |
| 235 if (m_blockingBehavior == LoadAsynchronously) | 235 if (m_blockingBehavior == LoadAsynchronously) |
| 236 return; | 236 return; |
| (...skipping 12 matching lines...) Expand all Loading... |
| 249 for (const auto& task : eventWithTasks->take()) { | 249 for (const auto& task : eventWithTasks->take()) { |
| 250 // m_clientTask contains only CallClosureTasks. So, it's ok to pass | 250 // m_clientTask contains only CallClosureTasks. So, it's ok to pass |
| 251 // the nullptr. | 251 // the nullptr. |
| 252 task->performTask(nullptr); | 252 task->performTask(nullptr); |
| 253 } | 253 } |
| 254 } | 254 } |
| 255 | 255 |
| 256 void WorkerThreadableLoader::overrideTimeout(unsigned long timeoutMilliseconds) | 256 void WorkerThreadableLoader::overrideTimeout(unsigned long timeoutMilliseconds) |
| 257 { | 257 { |
| 258 DCHECK(!isMainThread()); | 258 DCHECK(!isMainThread()); |
| 259 if (!m_peer) | 259 if (!m_mainThreadLoaderHolder) |
| 260 return; | 260 return; |
| 261 m_workerLoaderProxy->postTaskToLoader(createCrossThreadTask(&Peer::overrideT
imeout, m_peer, timeoutMilliseconds)); | 261 m_workerLoaderProxy->postTaskToLoader(createCrossThreadTask(&MainThreadLoade
rHolder::overrideTimeout, m_mainThreadLoaderHolder, timeoutMilliseconds)); |
| 262 } | 262 } |
| 263 | 263 |
| 264 void WorkerThreadableLoader::cancel() | 264 void WorkerThreadableLoader::cancel() |
| 265 { | 265 { |
| 266 DCHECK(!isMainThread()); | 266 DCHECK(!isMainThread()); |
| 267 if (m_peer) { | 267 if (m_mainThreadLoaderHolder) { |
| 268 m_workerLoaderProxy->postTaskToLoader(createCrossThreadTask(&Peer::cance
l, m_peer)); | 268 m_workerLoaderProxy->postTaskToLoader(createCrossThreadTask(&MainThreadL
oaderHolder::cancel, m_mainThreadLoaderHolder)); |
| 269 m_peer = nullptr; | 269 m_mainThreadLoaderHolder = nullptr; |
| 270 } | 270 } |
| 271 | 271 |
| 272 if (!m_client) | 272 if (!m_client) |
| 273 return; | 273 return; |
| 274 | 274 |
| 275 // If the client hasn't reached a termination state, then transition it | 275 // If the client hasn't reached a termination state, then transition it |
| 276 // by sending a cancellation error. | 276 // by sending a cancellation error. |
| 277 // Note: no more client callbacks will be done after this method -- the | 277 // Note: no more client callbacks will be done after this method -- the |
| 278 // clearClient() call ensures that. | 278 // clearClient() call ensures that. |
| 279 ResourceError error(String(), 0, String(), String()); | 279 ResourceError error(String(), 0, String(), String()); |
| 280 error.setIsCancellation(true); | 280 error.setIsCancellation(true); |
| 281 didFail(error); | 281 didFail(error); |
| 282 DCHECK(!m_client); | 282 DCHECK(!m_client); |
| 283 } | 283 } |
| 284 | 284 |
| 285 void WorkerThreadableLoader::didStart(Peer* peer) | 285 void WorkerThreadableLoader::didStart(MainThreadLoaderHolder* mainThreadLoaderHo
lder) |
| 286 { | 286 { |
| 287 DCHECK(!isMainThread()); | 287 DCHECK(!isMainThread()); |
| 288 DCHECK(!m_peer); | 288 DCHECK(!m_mainThreadLoaderHolder); |
| 289 DCHECK(peer); | 289 DCHECK(mainThreadLoaderHolder); |
| 290 if (!m_client) { | 290 if (!m_client) { |
| 291 // The loading is already cancelled. | 291 // The loading is already cancelled. |
| 292 return; | 292 return; |
| 293 } | 293 } |
| 294 | 294 |
| 295 m_peer = peer; | 295 m_mainThreadLoaderHolder = mainThreadLoaderHolder; |
| 296 } | 296 } |
| 297 | 297 |
| 298 void WorkerThreadableLoader::didSendData(unsigned long long bytesSent, unsigned
long long totalBytesToBeSent) | 298 void WorkerThreadableLoader::didSendData(unsigned long long bytesSent, unsigned
long long totalBytesToBeSent) |
| 299 { | 299 { |
| 300 DCHECK(!isMainThread()); | 300 DCHECK(!isMainThread()); |
| 301 if (!m_client) | 301 if (!m_client) |
| 302 return; | 302 return; |
| 303 m_client->didSendData(bytesSent, totalBytesToBeSent); | 303 m_client->didSendData(bytesSent, totalBytesToBeSent); |
| 304 } | 304 } |
| 305 | 305 |
| (...skipping 23 matching lines...) Expand all Loading... |
| 329 m_client->didReceiveCachedMetadata(data->data(), data->size()); | 329 m_client->didReceiveCachedMetadata(data->data(), data->size()); |
| 330 } | 330 } |
| 331 | 331 |
| 332 void WorkerThreadableLoader::didFinishLoading(unsigned long identifier, double f
inishTime) | 332 void WorkerThreadableLoader::didFinishLoading(unsigned long identifier, double f
inishTime) |
| 333 { | 333 { |
| 334 DCHECK(!isMainThread()); | 334 DCHECK(!isMainThread()); |
| 335 if (!m_client) | 335 if (!m_client) |
| 336 return; | 336 return; |
| 337 auto* client = m_client; | 337 auto* client = m_client; |
| 338 m_client = nullptr; | 338 m_client = nullptr; |
| 339 m_peer = nullptr; | 339 m_mainThreadLoaderHolder = nullptr; |
| 340 client->didFinishLoading(identifier, finishTime); | 340 client->didFinishLoading(identifier, finishTime); |
| 341 } | 341 } |
| 342 | 342 |
| 343 void WorkerThreadableLoader::didFail(const ResourceError& error) | 343 void WorkerThreadableLoader::didFail(const ResourceError& error) |
| 344 { | 344 { |
| 345 DCHECK(!isMainThread()); | 345 DCHECK(!isMainThread()); |
| 346 if (!m_client) | 346 if (!m_client) |
| 347 return; | 347 return; |
| 348 auto* client = m_client; | 348 auto* client = m_client; |
| 349 m_client = nullptr; | 349 m_client = nullptr; |
| 350 m_peer = nullptr; | 350 m_mainThreadLoaderHolder = nullptr; |
| 351 client->didFail(error); | 351 client->didFail(error); |
| 352 } | 352 } |
| 353 | 353 |
| 354 void WorkerThreadableLoader::didFailAccessControlCheck(const ResourceError& erro
r) | 354 void WorkerThreadableLoader::didFailAccessControlCheck(const ResourceError& erro
r) |
| 355 { | 355 { |
| 356 DCHECK(!isMainThread()); | 356 DCHECK(!isMainThread()); |
| 357 if (!m_client) | 357 if (!m_client) |
| 358 return; | 358 return; |
| 359 auto* client = m_client; | 359 auto* client = m_client; |
| 360 m_client = nullptr; | 360 m_client = nullptr; |
| 361 m_peer = nullptr; | 361 m_mainThreadLoaderHolder = nullptr; |
| 362 client->didFailAccessControlCheck(error); | 362 client->didFailAccessControlCheck(error); |
| 363 } | 363 } |
| 364 | 364 |
| 365 void WorkerThreadableLoader::didFailRedirectCheck() | 365 void WorkerThreadableLoader::didFailRedirectCheck() |
| 366 { | 366 { |
| 367 DCHECK(!isMainThread()); | 367 DCHECK(!isMainThread()); |
| 368 if (!m_client) | 368 if (!m_client) |
| 369 return; | 369 return; |
| 370 auto* client = m_client; | 370 auto* client = m_client; |
| 371 m_client = nullptr; | 371 m_client = nullptr; |
| 372 m_peer = nullptr; | 372 m_mainThreadLoaderHolder = nullptr; |
| 373 client->didFailRedirectCheck(); | 373 client->didFailRedirectCheck(); |
| 374 } | 374 } |
| 375 | 375 |
| 376 void WorkerThreadableLoader::didDownloadData(int dataLength) | 376 void WorkerThreadableLoader::didDownloadData(int dataLength) |
| 377 { | 377 { |
| 378 DCHECK(!isMainThread()); | 378 DCHECK(!isMainThread()); |
| 379 if (!m_client) | 379 if (!m_client) |
| 380 return; | 380 return; |
| 381 m_client->didDownloadData(dataLength); | 381 m_client->didDownloadData(dataLength); |
| 382 } | 382 } |
| 383 | 383 |
| 384 void WorkerThreadableLoader::didReceiveResourceTiming(std::unique_ptr<CrossThrea
dResourceTimingInfoData> timingData) | 384 void WorkerThreadableLoader::didReceiveResourceTiming(std::unique_ptr<CrossThrea
dResourceTimingInfoData> timingData) |
| 385 { | 385 { |
| 386 DCHECK(!isMainThread()); | 386 DCHECK(!isMainThread()); |
| 387 if (!m_client) | 387 if (!m_client) |
| 388 return; | 388 return; |
| 389 std::unique_ptr<ResourceTimingInfo> info(ResourceTimingInfo::adopt(std::move
(timingData))); | 389 std::unique_ptr<ResourceTimingInfo> info(ResourceTimingInfo::adopt(std::move
(timingData))); |
| 390 WorkerGlobalScopePerformance::performance(*m_workerGlobalScope)->addResource
Timing(*info); | 390 WorkerGlobalScopePerformance::performance(*m_workerGlobalScope)->addResource
Timing(*info); |
| 391 m_client->didReceiveResourceTiming(*info); | 391 m_client->didReceiveResourceTiming(*info); |
| 392 } | 392 } |
| 393 | 393 |
| 394 DEFINE_TRACE(WorkerThreadableLoader) | 394 DEFINE_TRACE(WorkerThreadableLoader) |
| 395 { | 395 { |
| 396 visitor->trace(m_workerGlobalScope); | 396 visitor->trace(m_workerGlobalScope); |
| 397 ThreadableLoader::trace(visitor); | 397 ThreadableLoader::trace(visitor); |
| 398 } | 398 } |
| 399 | 399 |
| 400 void WorkerThreadableLoader::Peer::createAndStart( | 400 void WorkerThreadableLoader::MainThreadLoaderHolder::createAndStart( |
| 401 WorkerThreadableLoader* workerLoader, | 401 WorkerThreadableLoader* workerLoader, |
| 402 PassRefPtr<WorkerLoaderProxy> passLoaderProxy, | 402 PassRefPtr<WorkerLoaderProxy> passLoaderProxy, |
| 403 WorkerThreadLifecycleContext* workerThreadLifecycleContext, | 403 WorkerThreadLifecycleContext* workerThreadLifecycleContext, |
| 404 std::unique_ptr<CrossThreadResourceRequestData> request, | 404 std::unique_ptr<CrossThreadResourceRequestData> request, |
| 405 const ThreadableLoaderOptions& options, | 405 const ThreadableLoaderOptions& options, |
| 406 const ResourceLoaderOptions& resourceLoaderOptions, | 406 const ResourceLoaderOptions& resourceLoaderOptions, |
| 407 PassRefPtr<WaitableEventWithTasks> eventWithTasks, | 407 PassRefPtr<WaitableEventWithTasks> eventWithTasks, |
| 408 ExecutionContext* executionContext) | 408 ExecutionContext* executionContext) |
| 409 { | 409 { |
| 410 DCHECK(isMainThread()); | 410 DCHECK(isMainThread()); |
| 411 TaskForwarder* forwarder; | 411 TaskForwarder* forwarder; |
| 412 RefPtr<WorkerLoaderProxy> loaderProxy = passLoaderProxy; | 412 RefPtr<WorkerLoaderProxy> loaderProxy = passLoaderProxy; |
| 413 if (eventWithTasks) | 413 if (eventWithTasks) |
| 414 forwarder = new SyncTaskForwarder(eventWithTasks); | 414 forwarder = new SyncTaskForwarder(eventWithTasks); |
| 415 else | 415 else |
| 416 forwarder = new AsyncTaskForwarder(loaderProxy); | 416 forwarder = new AsyncTaskForwarder(loaderProxy); |
| 417 | 417 |
| 418 Peer* peer = new Peer(forwarder, workerThreadLifecycleContext); | 418 MainThreadLoaderHolder* mainThreadLoaderHolder = new MainThreadLoaderHolder(
forwarder, workerThreadLifecycleContext); |
| 419 if (peer->wasContextDestroyedBeforeObserverCreation()) { | 419 if (mainThreadLoaderHolder->wasContextDestroyedBeforeObserverCreation()) { |
| 420 // The thread is already terminating. | 420 // The thread is already terminating. |
| 421 forwarder->abort(); | 421 forwarder->abort(); |
| 422 peer->m_forwarder = nullptr; | 422 mainThreadLoaderHolder->m_forwarder = nullptr; |
| 423 return; | 423 return; |
| 424 } | 424 } |
| 425 peer->m_workerLoader = workerLoader; | 425 mainThreadLoaderHolder->m_workerLoader = workerLoader; |
| 426 peer->start(*toDocument(executionContext), std::move(request), options, reso
urceLoaderOptions); | 426 mainThreadLoaderHolder->start(*toDocument(executionContext), std::move(reque
st), options, resourceLoaderOptions); |
| 427 forwarder->forwardTask(createCrossThreadTask(&WorkerThreadableLoader::didSta
rt, wrapCrossThreadPersistent(workerLoader), wrapCrossThreadPersistent(peer))); | 427 forwarder->forwardTask(createCrossThreadTask(&WorkerThreadableLoader::didSta
rt, wrapCrossThreadPersistent(workerLoader), wrapCrossThreadPersistent(mainThrea
dLoaderHolder))); |
| 428 } | 428 } |
| 429 | 429 |
| 430 WorkerThreadableLoader::Peer::~Peer() | 430 WorkerThreadableLoader::MainThreadLoaderHolder::~MainThreadLoaderHolder() |
| 431 { | 431 { |
| 432 DCHECK(isMainThread()); | 432 DCHECK(isMainThread()); |
| 433 } | 433 } |
| 434 | 434 |
| 435 void WorkerThreadableLoader::Peer::overrideTimeout(unsigned long timeoutMillisec
onds) | 435 void WorkerThreadableLoader::MainThreadLoaderHolder::overrideTimeout(unsigned lo
ng timeoutMilliseconds) |
| 436 { | 436 { |
| 437 DCHECK(isMainThread()); | 437 DCHECK(isMainThread()); |
| 438 if (!m_mainThreadLoader) | 438 if (!m_mainThreadLoader) |
| 439 return; | 439 return; |
| 440 m_mainThreadLoader->overrideTimeout(timeoutMilliseconds); | 440 m_mainThreadLoader->overrideTimeout(timeoutMilliseconds); |
| 441 } | 441 } |
| 442 | 442 |
| 443 void WorkerThreadableLoader::Peer::cancel() | 443 void WorkerThreadableLoader::MainThreadLoaderHolder::cancel() |
| 444 { | 444 { |
| 445 DCHECK(isMainThread()); | 445 DCHECK(isMainThread()); |
| 446 if (!m_mainThreadLoader) | 446 if (!m_mainThreadLoader) |
| 447 return; | 447 return; |
| 448 m_mainThreadLoader->cancel(); | 448 m_mainThreadLoader->cancel(); |
| 449 m_mainThreadLoader = nullptr; | 449 m_mainThreadLoader = nullptr; |
| 450 } | 450 } |
| 451 | 451 |
| 452 void WorkerThreadableLoader::Peer::didSendData(unsigned long long bytesSent, uns
igned long long totalBytesToBeSent) | 452 void WorkerThreadableLoader::MainThreadLoaderHolder::didSendData(unsigned long l
ong bytesSent, unsigned long long totalBytesToBeSent) |
| 453 { | 453 { |
| 454 DCHECK(isMainThread()); | 454 DCHECK(isMainThread()); |
| 455 CrossThreadPersistent<WorkerThreadableLoader> workerLoader = m_workerLoader.
get(); | 455 CrossThreadPersistent<WorkerThreadableLoader> workerLoader = m_workerLoader.
get(); |
| 456 if (!workerLoader || !m_forwarder) | 456 if (!workerLoader || !m_forwarder) |
| 457 return; | 457 return; |
| 458 m_forwarder->forwardTask(createCrossThreadTask(&WorkerThreadableLoader::didS
endData, workerLoader, bytesSent, totalBytesToBeSent)); | 458 m_forwarder->forwardTask(createCrossThreadTask(&WorkerThreadableLoader::didS
endData, workerLoader, bytesSent, totalBytesToBeSent)); |
| 459 } | 459 } |
| 460 | 460 |
| 461 void WorkerThreadableLoader::Peer::didReceiveResponse(unsigned long identifier,
const ResourceResponse& response, std::unique_ptr<WebDataConsumerHandle> handle) | 461 void WorkerThreadableLoader::MainThreadLoaderHolder::didReceiveResponse(unsigned
long identifier, const ResourceResponse& response, std::unique_ptr<WebDataConsu
merHandle> handle) |
| 462 { | 462 { |
| 463 DCHECK(isMainThread()); | 463 DCHECK(isMainThread()); |
| 464 CrossThreadPersistent<WorkerThreadableLoader> workerLoader = m_workerLoader.
get(); | 464 CrossThreadPersistent<WorkerThreadableLoader> workerLoader = m_workerLoader.
get(); |
| 465 if (!workerLoader || !m_forwarder) | 465 if (!workerLoader || !m_forwarder) |
| 466 return; | 466 return; |
| 467 m_forwarder->forwardTask(createCrossThreadTask(&WorkerThreadableLoader::didR
eceiveResponse, workerLoader, identifier, response, passed(std::move(handle)))); | 467 m_forwarder->forwardTask(createCrossThreadTask(&WorkerThreadableLoader::didR
eceiveResponse, workerLoader, identifier, response, passed(std::move(handle)))); |
| 468 } | 468 } |
| 469 | 469 |
| 470 void WorkerThreadableLoader::Peer::didReceiveData(const char* data, unsigned dat
aLength) | 470 void WorkerThreadableLoader::MainThreadLoaderHolder::didReceiveData(const char*
data, unsigned dataLength) |
| 471 { | 471 { |
| 472 DCHECK(isMainThread()); | 472 DCHECK(isMainThread()); |
| 473 CrossThreadPersistent<WorkerThreadableLoader> workerLoader = m_workerLoader.
get(); | 473 CrossThreadPersistent<WorkerThreadableLoader> workerLoader = m_workerLoader.
get(); |
| 474 if (!workerLoader || !m_forwarder) | 474 if (!workerLoader || !m_forwarder) |
| 475 return; | 475 return; |
| 476 m_forwarder->forwardTask(createCrossThreadTask(&WorkerThreadableLoader::didR
eceiveData, workerLoader, passed(createVectorFromMemoryRegion(data, dataLength))
)); | 476 m_forwarder->forwardTask(createCrossThreadTask(&WorkerThreadableLoader::didR
eceiveData, workerLoader, passed(createVectorFromMemoryRegion(data, dataLength))
)); |
| 477 } | 477 } |
| 478 | 478 |
| 479 void WorkerThreadableLoader::Peer::didDownloadData(int dataLength) | 479 void WorkerThreadableLoader::MainThreadLoaderHolder::didDownloadData(int dataLen
gth) |
| 480 { | 480 { |
| 481 DCHECK(isMainThread()); | 481 DCHECK(isMainThread()); |
| 482 CrossThreadPersistent<WorkerThreadableLoader> workerLoader = m_workerLoader.
get(); | 482 CrossThreadPersistent<WorkerThreadableLoader> workerLoader = m_workerLoader.
get(); |
| 483 if (!workerLoader || !m_forwarder) | 483 if (!workerLoader || !m_forwarder) |
| 484 return; | 484 return; |
| 485 m_forwarder->forwardTask(createCrossThreadTask(&WorkerThreadableLoader::didD
ownloadData, workerLoader, dataLength)); | 485 m_forwarder->forwardTask(createCrossThreadTask(&WorkerThreadableLoader::didD
ownloadData, workerLoader, dataLength)); |
| 486 } | 486 } |
| 487 | 487 |
| 488 void WorkerThreadableLoader::Peer::didReceiveCachedMetadata(const char* data, in
t dataLength) | 488 void WorkerThreadableLoader::MainThreadLoaderHolder::didReceiveCachedMetadata(co
nst char* data, int dataLength) |
| 489 { | 489 { |
| 490 DCHECK(isMainThread()); | 490 DCHECK(isMainThread()); |
| 491 CrossThreadPersistent<WorkerThreadableLoader> workerLoader = m_workerLoader.
get(); | 491 CrossThreadPersistent<WorkerThreadableLoader> workerLoader = m_workerLoader.
get(); |
| 492 if (!workerLoader || !m_forwarder) | 492 if (!workerLoader || !m_forwarder) |
| 493 return; | 493 return; |
| 494 m_forwarder->forwardTask(createCrossThreadTask(&WorkerThreadableLoader::didR
eceiveCachedMetadata, workerLoader, passed(createVectorFromMemoryRegion(data, da
taLength)))); | 494 m_forwarder->forwardTask(createCrossThreadTask(&WorkerThreadableLoader::didR
eceiveCachedMetadata, workerLoader, passed(createVectorFromMemoryRegion(data, da
taLength)))); |
| 495 } | 495 } |
| 496 | 496 |
| 497 void WorkerThreadableLoader::Peer::didFinishLoading(unsigned long identifier, do
uble finishTime) | 497 void WorkerThreadableLoader::MainThreadLoaderHolder::didFinishLoading(unsigned l
ong identifier, double finishTime) |
| 498 { | 498 { |
| 499 DCHECK(isMainThread()); | 499 DCHECK(isMainThread()); |
| 500 CrossThreadPersistent<WorkerThreadableLoader> workerLoader = m_workerLoader.
get(); | 500 CrossThreadPersistent<WorkerThreadableLoader> workerLoader = m_workerLoader.
get(); |
| 501 if (!workerLoader || !m_forwarder) | 501 if (!workerLoader || !m_forwarder) |
| 502 return; | 502 return; |
| 503 m_forwarder->forwardTaskWithDoneSignal(createCrossThreadTask(&WorkerThreadab
leLoader::didFinishLoading, workerLoader, identifier, finishTime)); | 503 m_forwarder->forwardTaskWithDoneSignal(createCrossThreadTask(&WorkerThreadab
leLoader::didFinishLoading, workerLoader, identifier, finishTime)); |
| 504 m_forwarder = nullptr; | 504 m_forwarder = nullptr; |
| 505 } | 505 } |
| 506 | 506 |
| 507 void WorkerThreadableLoader::Peer::didFail(const ResourceError& error) | 507 void WorkerThreadableLoader::MainThreadLoaderHolder::didFail(const ResourceError
& error) |
| 508 { | 508 { |
| 509 DCHECK(isMainThread()); | 509 DCHECK(isMainThread()); |
| 510 CrossThreadPersistent<WorkerThreadableLoader> workerLoader = m_workerLoader.
get(); | 510 CrossThreadPersistent<WorkerThreadableLoader> workerLoader = m_workerLoader.
get(); |
| 511 if (!workerLoader || !m_forwarder) | 511 if (!workerLoader || !m_forwarder) |
| 512 return; | 512 return; |
| 513 m_forwarder->forwardTaskWithDoneSignal(createCrossThreadTask(&WorkerThreadab
leLoader::didFail, workerLoader, error)); | 513 m_forwarder->forwardTaskWithDoneSignal(createCrossThreadTask(&WorkerThreadab
leLoader::didFail, workerLoader, error)); |
| 514 m_forwarder = nullptr; | 514 m_forwarder = nullptr; |
| 515 } | 515 } |
| 516 | 516 |
| 517 void WorkerThreadableLoader::Peer::didFailAccessControlCheck(const ResourceError
& error) | 517 void WorkerThreadableLoader::MainThreadLoaderHolder::didFailAccessControlCheck(c
onst ResourceError& error) |
| 518 { | 518 { |
| 519 DCHECK(isMainThread()); | 519 DCHECK(isMainThread()); |
| 520 CrossThreadPersistent<WorkerThreadableLoader> workerLoader = m_workerLoader.
get(); | 520 CrossThreadPersistent<WorkerThreadableLoader> workerLoader = m_workerLoader.
get(); |
| 521 if (!workerLoader || !m_forwarder) | 521 if (!workerLoader || !m_forwarder) |
| 522 return; | 522 return; |
| 523 m_forwarder->forwardTaskWithDoneSignal(createCrossThreadTask(&WorkerThreadab
leLoader::didFailAccessControlCheck, workerLoader, error)); | 523 m_forwarder->forwardTaskWithDoneSignal(createCrossThreadTask(&WorkerThreadab
leLoader::didFailAccessControlCheck, workerLoader, error)); |
| 524 m_forwarder = nullptr; | 524 m_forwarder = nullptr; |
| 525 } | 525 } |
| 526 | 526 |
| 527 void WorkerThreadableLoader::Peer::didFailRedirectCheck() | 527 void WorkerThreadableLoader::MainThreadLoaderHolder::didFailRedirectCheck() |
| 528 { | 528 { |
| 529 DCHECK(isMainThread()); | 529 DCHECK(isMainThread()); |
| 530 CrossThreadPersistent<WorkerThreadableLoader> workerLoader = m_workerLoader.
get(); | 530 CrossThreadPersistent<WorkerThreadableLoader> workerLoader = m_workerLoader.
get(); |
| 531 if (!workerLoader || !m_forwarder) | 531 if (!workerLoader || !m_forwarder) |
| 532 return; | 532 return; |
| 533 m_forwarder->forwardTaskWithDoneSignal(createCrossThreadTask(&WorkerThreadab
leLoader::didFailRedirectCheck, workerLoader)); | 533 m_forwarder->forwardTaskWithDoneSignal(createCrossThreadTask(&WorkerThreadab
leLoader::didFailRedirectCheck, workerLoader)); |
| 534 m_forwarder = nullptr; | 534 m_forwarder = nullptr; |
| 535 } | 535 } |
| 536 | 536 |
| 537 void WorkerThreadableLoader::Peer::didReceiveResourceTiming(const ResourceTiming
Info& info) | 537 void WorkerThreadableLoader::MainThreadLoaderHolder::didReceiveResourceTiming(co
nst ResourceTimingInfo& info) |
| 538 { | 538 { |
| 539 DCHECK(isMainThread()); | 539 DCHECK(isMainThread()); |
| 540 CrossThreadPersistent<WorkerThreadableLoader> workerLoader = m_workerLoader.
get(); | 540 CrossThreadPersistent<WorkerThreadableLoader> workerLoader = m_workerLoader.
get(); |
| 541 if (!workerLoader || !m_forwarder) | 541 if (!workerLoader || !m_forwarder) |
| 542 return; | 542 return; |
| 543 m_forwarder->forwardTask(createCrossThreadTask(&WorkerThreadableLoader::didR
eceiveResourceTiming, workerLoader, info)); | 543 m_forwarder->forwardTask(createCrossThreadTask(&WorkerThreadableLoader::didR
eceiveResourceTiming, workerLoader, info)); |
| 544 } | 544 } |
| 545 | 545 |
| 546 void WorkerThreadableLoader::Peer::contextDestroyed() | 546 void WorkerThreadableLoader::MainThreadLoaderHolder::contextDestroyed() |
| 547 { | 547 { |
| 548 DCHECK(isMainThread()); | 548 DCHECK(isMainThread()); |
| 549 if (m_forwarder) { | 549 if (m_forwarder) { |
| 550 m_forwarder->abort(); | 550 m_forwarder->abort(); |
| 551 m_forwarder = nullptr; | 551 m_forwarder = nullptr; |
| 552 } | 552 } |
| 553 m_workerLoader = nullptr; | 553 m_workerLoader = nullptr; |
| 554 cancel(); | 554 cancel(); |
| 555 } | 555 } |
| 556 | 556 |
| 557 DEFINE_TRACE(WorkerThreadableLoader::Peer) | 557 DEFINE_TRACE(WorkerThreadableLoader::MainThreadLoaderHolder) |
| 558 { | 558 { |
| 559 visitor->trace(m_forwarder); | 559 visitor->trace(m_forwarder); |
| 560 visitor->trace(m_mainThreadLoader); | 560 visitor->trace(m_mainThreadLoader); |
| 561 WorkerThreadLifecycleObserver::trace(visitor); | 561 WorkerThreadLifecycleObserver::trace(visitor); |
| 562 } | 562 } |
| 563 | 563 |
| 564 WorkerThreadableLoader::Peer::Peer(TaskForwarder* forwarder, WorkerThreadLifecyc
leContext* context) | 564 WorkerThreadableLoader::MainThreadLoaderHolder::MainThreadLoaderHolder(TaskForwa
rder* forwarder, WorkerThreadLifecycleContext* context) |
| 565 : WorkerThreadLifecycleObserver(context) | 565 : WorkerThreadLifecycleObserver(context) |
| 566 , m_forwarder(forwarder) | 566 , m_forwarder(forwarder) |
| 567 { | 567 { |
| 568 DCHECK(isMainThread()); | 568 DCHECK(isMainThread()); |
| 569 } | 569 } |
| 570 | 570 |
| 571 void WorkerThreadableLoader::Peer::start( | 571 void WorkerThreadableLoader::MainThreadLoaderHolder::start( |
| 572 Document& document, | 572 Document& document, |
| 573 std::unique_ptr<CrossThreadResourceRequestData> request, | 573 std::unique_ptr<CrossThreadResourceRequestData> request, |
| 574 const ThreadableLoaderOptions& options, | 574 const ThreadableLoaderOptions& options, |
| 575 const ResourceLoaderOptions& originalResourceLoaderOptions) | 575 const ResourceLoaderOptions& originalResourceLoaderOptions) |
| 576 { | 576 { |
| 577 DCHECK(isMainThread()); | 577 DCHECK(isMainThread()); |
| 578 ResourceLoaderOptions resourceLoaderOptions = originalResourceLoaderOptions; | 578 ResourceLoaderOptions resourceLoaderOptions = originalResourceLoaderOptions; |
| 579 resourceLoaderOptions.requestInitiatorContext = WorkerContext; | 579 resourceLoaderOptions.requestInitiatorContext = WorkerContext; |
| 580 m_mainThreadLoader = DocumentThreadableLoader::create(document, this, option
s, resourceLoaderOptions); | 580 m_mainThreadLoader = DocumentThreadableLoader::create(document, this, option
s, resourceLoaderOptions); |
| 581 m_mainThreadLoader->start(ResourceRequest(request.get())); | 581 m_mainThreadLoader->start(ResourceRequest(request.get())); |
| 582 } | 582 } |
| 583 | 583 |
| 584 } // namespace blink | 584 } // namespace blink |
| OLD | NEW |