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

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: fix 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 thread is terminating. 313 // The thread is terminating.
349 m_loaderProxy->postTaskToLoader(BLINK_FROM_HERE, createCrossThreadTask(& Peer::cancel, wrapCrossThreadPersistent(peer))); 314 m_workerLoaderProxy->postTaskToLoader(BLINK_FROM_HERE, createCrossThread Task(&Peer::cancel, wrapCrossThreadPersistent(peer)));
350 return; 315 return;
351 } 316 }
352 317
353 m_peer = peer; 318 m_peer = peer;
354 } 319 }
355 320
356 DEFINE_TRACE(WorkerThreadableLoader::Bridge) 321 void WorkerThreadableLoader::didSendData(unsigned long long bytesSent, unsigned long long totalBytesToBeSent)
357 { 322 {
358 visitor->trace(m_clientWrapper); 323 DCHECK(!isMainThread());
324 if (!m_client)
325 return;
326 m_client->didSendData(bytesSent, totalBytesToBeSent);
359 } 327 }
360 328
361 void WorkerThreadableLoader::Bridge::cancelPeer() 329 void WorkerThreadableLoader::didReceiveResponse(unsigned long identifier, std::u nique_ptr<CrossThreadResourceResponseData> responseData, std::unique_ptr<WebData ConsumerHandle> handle)
362 { 330 {
363 DCHECK(!isMainThread()); 331 DCHECK(!isMainThread());
364 if (!m_peer) 332 if (!m_client)
365 return; 333 return;
366 m_loaderProxy->postTaskToLoader(BLINK_FROM_HERE, createCrossThreadTask(&Peer ::cancel, m_peer)); 334 ResourceResponse response(responseData.get());
335 m_client->didReceiveResponse(identifier, response, std::move(handle));
336 }
337
338 void WorkerThreadableLoader::didReceiveData(std::unique_ptr<Vector<char>> data)
339 {
340 DCHECK(!isMainThread());
341 CHECK_LE(data->size(), std::numeric_limits<unsigned>::max());
342 if (!m_client)
343 return;
344 m_client->didReceiveData(data->data(), data->size());
345 }
346
347 void WorkerThreadableLoader::didReceiveCachedMetadata(std::unique_ptr<Vector<cha r>> data)
348 {
349 DCHECK(!isMainThread());
350 if (!m_client)
351 return;
352 m_client->didReceiveCachedMetadata(data->data(), data->size());
353 }
354
355 void WorkerThreadableLoader::didFinishLoading(unsigned long identifier, double f inishTime)
356 {
357 DCHECK(!isMainThread());
358 if (!m_client)
359 return;
360 auto* client = m_client;
361 m_client = nullptr;
367 m_peer = nullptr; 362 m_peer = nullptr;
363 client->didFinishLoading(identifier, finishTime);
364 }
365
366 void WorkerThreadableLoader::didFail(const ResourceError& error)
367 {
368 DCHECK(!isMainThread());
369 if (!m_client)
370 return;
371 auto* client = m_client;
372 m_client = nullptr;
373 m_peer = nullptr;
374 client->didFail(error);
375 }
376
377 void WorkerThreadableLoader::didFailAccessControlCheck(const ResourceError& erro r)
378 {
379 DCHECK(!isMainThread());
380 if (!m_client)
381 return;
382 auto* client = m_client;
383 m_client = nullptr;
384 m_peer = nullptr;
385 client->didFailAccessControlCheck(error);
386 }
387
388 void WorkerThreadableLoader::didFailRedirectCheck()
389 {
390 DCHECK(!isMainThread());
391 if (!m_client)
392 return;
393 auto* client = m_client;
394 m_client = nullptr;
395 m_peer = nullptr;
396 client->didFailRedirectCheck();
397 }
398
399 void WorkerThreadableLoader::didDownloadData(int dataLength)
400 {
401 DCHECK(!isMainThread());
402 if (!m_client)
403 return;
404 m_client->didDownloadData(dataLength);
405 }
406
407 void WorkerThreadableLoader::didReceiveResourceTiming(std::unique_ptr<CrossThrea dResourceTimingInfoData> timingData)
408 {
409 DCHECK(!isMainThread());
410 if (!m_client)
411 return;
412 std::unique_ptr<ResourceTimingInfo> info(ResourceTimingInfo::adopt(std::move (timingData)));
413 WorkerGlobalScopePerformance::performance(*m_workerGlobalScope)->addResource Timing(*info);
414 m_client->didReceiveResourceTiming(*info);
415 }
416
417 DEFINE_TRACE(WorkerThreadableLoader)
418 {
419 visitor->trace(m_workerGlobalScope);
420 ThreadableLoader::trace(visitor);
368 } 421 }
369 422
370 void WorkerThreadableLoader::Peer::createAndStart( 423 void WorkerThreadableLoader::Peer::createAndStart(
371 Bridge* bridge, 424 WorkerThreadableLoader* workerLoader,
372 PassRefPtr<WorkerLoaderProxy> passLoaderProxy, 425 PassRefPtr<WorkerLoaderProxy> passLoaderProxy,
373 WorkerThreadLifecycleContext* workerThreadLifecycleContext, 426 WorkerThreadLifecycleContext* workerThreadLifecycleContext,
374 std::unique_ptr<CrossThreadResourceRequestData> request, 427 std::unique_ptr<CrossThreadResourceRequestData> request,
375 const ThreadableLoaderOptions& options, 428 const ThreadableLoaderOptions& options,
376 const ResourceLoaderOptions& resourceLoaderOptions, 429 const ResourceLoaderOptions& resourceLoaderOptions,
377 PassRefPtr<WaitableEventWithTasks> eventWithTasks, 430 PassRefPtr<WaitableEventWithTasks> eventWithTasks,
378 ExecutionContext* executionContext) 431 ExecutionContext* executionContext)
379 { 432 {
380 DCHECK(isMainThread()); 433 DCHECK(isMainThread());
381 TaskForwarder* forwarder; 434 TaskForwarder* forwarder;
382 RefPtr<WorkerLoaderProxy> loaderProxy = passLoaderProxy; 435 RefPtr<WorkerLoaderProxy> loaderProxy = passLoaderProxy;
383 if (eventWithTasks) 436 if (eventWithTasks)
384 forwarder = new SyncTaskForwarder(eventWithTasks); 437 forwarder = new SyncTaskForwarder(eventWithTasks);
385 else 438 else
386 forwarder = new AsyncTaskForwarder(loaderProxy); 439 forwarder = new AsyncTaskForwarder(loaderProxy);
387 440
388 Peer* peer = new Peer(forwarder, workerThreadLifecycleContext); 441 Peer* peer = new Peer(forwarder, workerThreadLifecycleContext);
389 if (peer->wasContextDestroyedBeforeObserverCreation()) { 442 if (peer->wasContextDestroyedBeforeObserverCreation()) {
390 // The thread is already terminating. 443 // The thread is already terminating.
391 forwarder->abort(); 444 forwarder->abort();
392 peer->m_forwarder = nullptr; 445 peer->m_forwarder = nullptr;
393 return; 446 return;
394 } 447 }
395 peer->m_clientWrapper = bridge->clientWrapper(); 448 peer->m_workerLoader = workerLoader;
396 peer->start(*toDocument(executionContext), std::move(request), options, reso urceLoaderOptions); 449 peer->start(*toDocument(executionContext), std::move(request), options, reso urceLoaderOptions);
397 forwarder->forwardTask(BLINK_FROM_HERE, createCrossThreadTask(&Bridge::didSt art, wrapCrossThreadPersistent(bridge), wrapCrossThreadPersistent(peer))); 450 forwarder->forwardTask(BLINK_FROM_HERE, createCrossThreadTask(&WorkerThreada bleLoader::didStart, wrapCrossThreadPersistent(workerLoader), wrapCrossThreadPer sistent(peer)));
398 } 451 }
399 452
400 WorkerThreadableLoader::Peer::~Peer() 453 WorkerThreadableLoader::Peer::~Peer()
401 { 454 {
402 DCHECK(isMainThread()); 455 DCHECK(isMainThread());
403 DCHECK(!m_mainThreadLoader); 456 DCHECK(!m_workerLoader);
404 } 457 }
405 458
406 void WorkerThreadableLoader::Peer::overrideTimeout(unsigned long timeoutMillisec onds) 459 void WorkerThreadableLoader::Peer::overrideTimeout(unsigned long timeoutMillisec onds)
407 { 460 {
408 DCHECK(isMainThread()); 461 DCHECK(isMainThread());
409 if (!m_mainThreadLoader) 462 if (!m_mainThreadLoader)
410 return; 463 return;
411 m_mainThreadLoader->overrideTimeout(timeoutMilliseconds); 464 m_mainThreadLoader->overrideTimeout(timeoutMilliseconds);
412 } 465 }
413 466
414 void WorkerThreadableLoader::Peer::cancel() 467 void WorkerThreadableLoader::Peer::cancel()
415 { 468 {
416 DCHECK(isMainThread()); 469 DCHECK(isMainThread());
417 if (!m_mainThreadLoader) 470 if (!m_mainThreadLoader)
418 return; 471 return;
419 m_mainThreadLoader->cancel(); 472 m_mainThreadLoader->cancel();
420 m_mainThreadLoader = nullptr; 473 m_mainThreadLoader = nullptr;
421 } 474 }
422 475
423 void WorkerThreadableLoader::Peer::didSendData(unsigned long long bytesSent, uns igned long long totalBytesToBeSent) 476 void WorkerThreadableLoader::Peer::didSendData(unsigned long long bytesSent, uns igned long long totalBytesToBeSent)
424 { 477 {
425 DCHECK(isMainThread()); 478 DCHECK(isMainThread());
426 CrossThreadPersistent<ThreadableLoaderClientWrapper> clientWrapper = m_clien tWrapper.get(); 479 CrossThreadPersistent<WorkerThreadableLoader> workerLoader = m_workerLoader. get();
427 if (!clientWrapper || !m_forwarder) 480 if (!workerLoader || !m_forwarder)
428 return; 481 return;
429 m_forwarder->forwardTask(BLINK_FROM_HERE, createCrossThreadTask(&ThreadableL oaderClientWrapper::didSendData, clientWrapper, bytesSent, totalBytesToBeSent)); 482 m_forwarder->forwardTask(BLINK_FROM_HERE, createCrossThreadTask(&WorkerThrea dableLoader::didSendData, workerLoader, bytesSent, totalBytesToBeSent));
430 } 483 }
431 484
432 void WorkerThreadableLoader::Peer::didReceiveResponse(unsigned long identifier, const ResourceResponse& response, std::unique_ptr<WebDataConsumerHandle> handle) 485 void WorkerThreadableLoader::Peer::didReceiveResponse(unsigned long identifier, const ResourceResponse& response, std::unique_ptr<WebDataConsumerHandle> handle)
433 { 486 {
434 DCHECK(isMainThread()); 487 DCHECK(isMainThread());
435 CrossThreadPersistent<ThreadableLoaderClientWrapper> clientWrapper = m_clien tWrapper.get(); 488 CrossThreadPersistent<WorkerThreadableLoader> workerLoader = m_workerLoader. get();
436 if (!clientWrapper || !m_forwarder) 489 if (!workerLoader || !m_forwarder)
437 return; 490 return;
438 m_forwarder->forwardTask(BLINK_FROM_HERE, createCrossThreadTask(&ThreadableL oaderClientWrapper::didReceiveResponse, clientWrapper, identifier, response, pas sed(std::move(handle)))); 491 m_forwarder->forwardTask(BLINK_FROM_HERE, createCrossThreadTask(&WorkerThrea dableLoader::didReceiveResponse, workerLoader, identifier, response, passed(std: :move(handle))));
439 } 492 }
440 493
441 void WorkerThreadableLoader::Peer::didReceiveData(const char* data, unsigned dat aLength) 494 void WorkerThreadableLoader::Peer::didReceiveData(const char* data, unsigned dat aLength)
442 { 495 {
443 DCHECK(isMainThread()); 496 DCHECK(isMainThread());
444 CrossThreadPersistent<ThreadableLoaderClientWrapper> clientWrapper = m_clien tWrapper.get(); 497 CrossThreadPersistent<WorkerThreadableLoader> workerLoader = m_workerLoader. get();
445 if (!clientWrapper || !m_forwarder) 498 if (!workerLoader || !m_forwarder)
446 return; 499 return;
447 m_forwarder->forwardTask(BLINK_FROM_HERE, createCrossThreadTask(&ThreadableL oaderClientWrapper::didReceiveData, clientWrapper, passed(createVectorFromMemory Region(data, dataLength)))); 500 m_forwarder->forwardTask(BLINK_FROM_HERE, createCrossThreadTask(&WorkerThrea dableLoader::didReceiveData, workerLoader, passed(createVectorFromMemoryRegion(d ata, dataLength))));
448 } 501 }
449 502
450 void WorkerThreadableLoader::Peer::didDownloadData(int dataLength) 503 void WorkerThreadableLoader::Peer::didDownloadData(int dataLength)
451 { 504 {
452 DCHECK(isMainThread()); 505 DCHECK(isMainThread());
453 CrossThreadPersistent<ThreadableLoaderClientWrapper> clientWrapper = m_clien tWrapper.get(); 506 CrossThreadPersistent<WorkerThreadableLoader> workerLoader = m_workerLoader. get();
454 if (!clientWrapper || !m_forwarder) 507 if (!workerLoader || !m_forwarder)
455 return; 508 return;
456 m_forwarder->forwardTask(BLINK_FROM_HERE, createCrossThreadTask(&ThreadableL oaderClientWrapper::didDownloadData, clientWrapper, dataLength)); 509 m_forwarder->forwardTask(BLINK_FROM_HERE, createCrossThreadTask(&WorkerThrea dableLoader::didDownloadData, workerLoader, dataLength));
457 } 510 }
458 511
459 void WorkerThreadableLoader::Peer::didReceiveCachedMetadata(const char* data, in t dataLength) 512 void WorkerThreadableLoader::Peer::didReceiveCachedMetadata(const char* data, in t dataLength)
460 { 513 {
461 DCHECK(isMainThread()); 514 DCHECK(isMainThread());
462 CrossThreadPersistent<ThreadableLoaderClientWrapper> clientWrapper = m_clien tWrapper.get(); 515 CrossThreadPersistent<WorkerThreadableLoader> workerLoader = m_workerLoader. get();
463 if (!clientWrapper || !m_forwarder) 516 if (!workerLoader || !m_forwarder)
464 return; 517 return;
465 m_forwarder->forwardTask(BLINK_FROM_HERE, createCrossThreadTask(&ThreadableL oaderClientWrapper::didReceiveCachedMetadata, clientWrapper, passed(createVector FromMemoryRegion(data, dataLength)))); 518 m_forwarder->forwardTask(BLINK_FROM_HERE, createCrossThreadTask(&WorkerThrea dableLoader::didReceiveCachedMetadata, workerLoader, passed(createVectorFromMemo ryRegion(data, dataLength))));
466 } 519 }
467 520
468 void WorkerThreadableLoader::Peer::didFinishLoading(unsigned long identifier, do uble finishTime) 521 void WorkerThreadableLoader::Peer::didFinishLoading(unsigned long identifier, do uble finishTime)
469 { 522 {
470 DCHECK(isMainThread()); 523 DCHECK(isMainThread());
471 CrossThreadPersistent<ThreadableLoaderClientWrapper> clientWrapper = m_clien tWrapper.get(); 524 CrossThreadPersistent<WorkerThreadableLoader> workerLoader = m_workerLoader. get();
472 if (!clientWrapper || !m_forwarder) 525 if (!workerLoader || !m_forwarder)
473 return; 526 return;
474 m_forwarder->forwardTaskWithDoneSignal(BLINK_FROM_HERE, createCrossThreadTas k(&ThreadableLoaderClientWrapper::didFinishLoading, clientWrapper, identifier, f inishTime)); 527 m_forwarder->forwardTaskWithDoneSignal(BLINK_FROM_HERE, createCrossThreadTas k(&WorkerThreadableLoader::didFinishLoading, workerLoader, identifier, finishTim e));
475 m_forwarder = nullptr; 528 m_forwarder = nullptr;
476 } 529 }
477 530
478 void WorkerThreadableLoader::Peer::didFail(const ResourceError& error) 531 void WorkerThreadableLoader::Peer::didFail(const ResourceError& error)
479 { 532 {
480 DCHECK(isMainThread()); 533 DCHECK(isMainThread());
481 CrossThreadPersistent<ThreadableLoaderClientWrapper> clientWrapper = m_clien tWrapper.get(); 534 CrossThreadPersistent<WorkerThreadableLoader> workerLoader = m_workerLoader. get();
482 if (!clientWrapper || !m_forwarder) 535 if (!workerLoader || !m_forwarder)
483 return; 536 return;
484 m_forwarder->forwardTaskWithDoneSignal(BLINK_FROM_HERE, createCrossThreadTas k(&ThreadableLoaderClientWrapper::didFail, clientWrapper, error)); 537 m_forwarder->forwardTaskWithDoneSignal(BLINK_FROM_HERE, createCrossThreadTas k(&WorkerThreadableLoader::didFail, workerLoader, error));
485 m_forwarder = nullptr; 538 m_forwarder = nullptr;
486 } 539 }
487 540
488 void WorkerThreadableLoader::Peer::didFailAccessControlCheck(const ResourceError & error) 541 void WorkerThreadableLoader::Peer::didFailAccessControlCheck(const ResourceError & error)
489 { 542 {
490 DCHECK(isMainThread()); 543 DCHECK(isMainThread());
491 CrossThreadPersistent<ThreadableLoaderClientWrapper> clientWrapper = m_clien tWrapper.get(); 544 CrossThreadPersistent<WorkerThreadableLoader> workerLoader = m_workerLoader. get();
492 if (!clientWrapper || !m_forwarder) 545 if (!workerLoader || !m_forwarder)
493 return; 546 return;
494 m_forwarder->forwardTaskWithDoneSignal(BLINK_FROM_HERE, createCrossThreadTas k(&ThreadableLoaderClientWrapper::didFailAccessControlCheck, clientWrapper, erro r)); 547 m_forwarder->forwardTaskWithDoneSignal(BLINK_FROM_HERE, createCrossThreadTas k(&WorkerThreadableLoader::didFailAccessControlCheck, workerLoader, error));
495 m_forwarder = nullptr; 548 m_forwarder = nullptr;
496 } 549 }
497 550
498 void WorkerThreadableLoader::Peer::didFailRedirectCheck() 551 void WorkerThreadableLoader::Peer::didFailRedirectCheck()
499 { 552 {
500 DCHECK(isMainThread()); 553 DCHECK(isMainThread());
501 CrossThreadPersistent<ThreadableLoaderClientWrapper> clientWrapper = m_clien tWrapper.get(); 554 CrossThreadPersistent<WorkerThreadableLoader> workerLoader = m_workerLoader. get();
502 if (!clientWrapper || !m_forwarder) 555 if (!workerLoader || !m_forwarder)
503 return; 556 return;
504 m_forwarder->forwardTaskWithDoneSignal(BLINK_FROM_HERE, createCrossThreadTas k(&ThreadableLoaderClientWrapper::didFailRedirectCheck, clientWrapper)); 557 m_forwarder->forwardTaskWithDoneSignal(BLINK_FROM_HERE, createCrossThreadTas k(&WorkerThreadableLoader::didFailRedirectCheck, workerLoader));
505 m_forwarder = nullptr; 558 m_forwarder = nullptr;
506 } 559 }
507 560
508 void WorkerThreadableLoader::Peer::didReceiveResourceTiming(const ResourceTiming Info& info) 561 void WorkerThreadableLoader::Peer::didReceiveResourceTiming(const ResourceTiming Info& info)
509 { 562 {
510 DCHECK(isMainThread()); 563 DCHECK(isMainThread());
511 CrossThreadPersistent<ThreadableLoaderClientWrapper> clientWrapper = m_clien tWrapper.get(); 564 CrossThreadPersistent<WorkerThreadableLoader> workerLoader = m_workerLoader. get();
512 if (!clientWrapper || !m_forwarder) 565 if (!workerLoader || !m_forwarder)
513 return; 566 return;
514 m_forwarder->forwardTask(BLINK_FROM_HERE, createCrossThreadTask(&ThreadableL oaderClientWrapper::didReceiveResourceTiming, clientWrapper, info)); 567 m_forwarder->forwardTask(BLINK_FROM_HERE, createCrossThreadTask(&WorkerThrea dableLoader::didReceiveResourceTiming, workerLoader, info));
515 } 568 }
516 569
517 void WorkerThreadableLoader::Peer::contextDestroyed() 570 void WorkerThreadableLoader::Peer::contextDestroyed()
518 { 571 {
519 DCHECK(isMainThread()); 572 DCHECK(isMainThread());
520 if (m_forwarder) { 573 if (m_forwarder) {
521 m_forwarder->abort(); 574 m_forwarder->abort();
522 m_forwarder = nullptr; 575 m_forwarder = nullptr;
523 } 576 }
524 m_clientWrapper = nullptr; 577 m_workerLoader = nullptr;
525 cancel(); 578 cancel();
526 } 579 }
527 580
528 DEFINE_TRACE(WorkerThreadableLoader::Peer) 581 DEFINE_TRACE(WorkerThreadableLoader::Peer)
529 { 582 {
530 visitor->trace(m_forwarder); 583 visitor->trace(m_forwarder);
584 visitor->trace(m_mainThreadLoader);
531 WorkerThreadLifecycleObserver::trace(visitor); 585 WorkerThreadLifecycleObserver::trace(visitor);
532 } 586 }
533 587
534 WorkerThreadableLoader::Peer::Peer(TaskForwarder* forwarder, WorkerThreadLifecyc leContext* context) 588 WorkerThreadableLoader::Peer::Peer(TaskForwarder* forwarder, WorkerThreadLifecyc leContext* context)
535 : WorkerThreadLifecycleObserver(context) 589 : WorkerThreadLifecycleObserver(context)
536 , m_forwarder(forwarder) 590 , m_forwarder(forwarder)
537 { 591 {
538 DCHECK(isMainThread()); 592 DCHECK(isMainThread());
539 } 593 }
540 594
541 void WorkerThreadableLoader::Peer::start( 595 void WorkerThreadableLoader::Peer::start(
542 Document& document, 596 Document& document,
543 std::unique_ptr<CrossThreadResourceRequestData> request, 597 std::unique_ptr<CrossThreadResourceRequestData> request,
544 const ThreadableLoaderOptions& options, 598 const ThreadableLoaderOptions& options,
545 const ResourceLoaderOptions& originalResourceLoaderOptions) 599 const ResourceLoaderOptions& originalResourceLoaderOptions)
546 { 600 {
547 DCHECK(isMainThread()); 601 DCHECK(isMainThread());
548 ResourceLoaderOptions resourceLoaderOptions = originalResourceLoaderOptions; 602 ResourceLoaderOptions resourceLoaderOptions = originalResourceLoaderOptions;
549 resourceLoaderOptions.requestInitiatorContext = WorkerContext; 603 resourceLoaderOptions.requestInitiatorContext = WorkerContext;
550 m_mainThreadLoader = DocumentThreadableLoader::create(document, this, option s, resourceLoaderOptions); 604 m_mainThreadLoader = DocumentThreadableLoader::create(document, this, option s, resourceLoaderOptions);
551 m_mainThreadLoader->start(ResourceRequest(request.get())); 605 m_mainThreadLoader->start(ResourceRequest(request.get()));
552 } 606 }
553 607
554 } // namespace blink 608 } // namespace blink
OLDNEW
« no previous file with comments | « third_party/WebKit/Source/core/loader/WorkerThreadableLoader.h ('k') | third_party/WebKit/Source/core/page/EventSource.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698