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 |