Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1105)

Side by Side Diff: third_party/WebKit/Source/core/loader/WorkerThreadableLoader.cpp

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

Powered by Google App Engine
This is Rietveld 408576698