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 |