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

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 173 matching lines...) Expand 10 before | Expand all | Expand 10 after
184 RefPtr<WaitableEventWithTasks> m_eventWithTasks; 184 RefPtr<WaitableEventWithTasks> m_eventWithTasks;
185 }; 185 };
186 186
187 WorkerThreadableLoader::WorkerThreadableLoader( 187 WorkerThreadableLoader::WorkerThreadableLoader(
188 WorkerGlobalScope& workerGlobalScope, 188 WorkerGlobalScope& workerGlobalScope,
189 ThreadableLoaderClient* client, 189 ThreadableLoaderClient* client,
190 const ThreadableLoaderOptions& options, 190 const ThreadableLoaderOptions& options,
191 const ResourceLoaderOptions& resourceLoaderOptions, 191 const ResourceLoaderOptions& resourceLoaderOptions,
192 BlockingBehavior blockingBehavior) 192 BlockingBehavior blockingBehavior)
193 : m_workerGlobalScope(&workerGlobalScope) 193 : m_workerGlobalScope(&workerGlobalScope)
194 , m_workerClientWrapper(new ThreadableLoaderClientWrapper(workerGlobalScope, client)) 194 , m_workerLoaderProxy(workerGlobalScope.thread()->workerLoaderProxy())
195 , m_bridge(new Bridge(m_workerClientWrapper, workerGlobalScope.thread()->wor kerLoaderProxy(), options, resourceLoaderOptions, blockingBehavior)) 195 , m_client(client)
196 , m_threadableLoaderOptions(options)
197 , m_resourceLoaderOptions(resourceLoaderOptions)
198 , m_blockingBehavior(blockingBehavior)
196 { 199 {
200 DCHECK(client);
197 } 201 }
198 202
199 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)
200 { 204 {
201 std::unique_ptr<WorkerThreadableLoader> loader = wrapUnique(new WorkerThread ableLoader(workerGlobalScope, &client, options, resourceLoaderOptions, LoadSynch ronously)); 205 (new WorkerThreadableLoader(workerGlobalScope, &client, options, resourceLoa derOptions, LoadSynchronously))->start(request);
202 loader->start(request);
203 } 206 }
204 207
205 WorkerThreadableLoader::~WorkerThreadableLoader() 208 WorkerThreadableLoader::~WorkerThreadableLoader()
206 { 209 {
207 DCHECK(m_workerClientWrapper->done()); 210 DCHECK(!m_peer);
208 m_bridge->destroy(); 211 DCHECK(!m_client);
209 } 212 }
210 213
211 void WorkerThreadableLoader::start(const ResourceRequest& request) 214 void WorkerThreadableLoader::start(const ResourceRequest& originalRequest)
212 { 215 {
213 ResourceRequest requestToPass(request); 216 ResourceRequest request(originalRequest);
214 if (!requestToPass.didSetHTTPReferrer()) 217 if (!request.didSetHTTPReferrer())
215 requestToPass.setHTTPReferrer(SecurityPolicy::generateReferrer(m_workerG lobalScope->getReferrerPolicy(), request.url(), m_workerGlobalScope->outgoingRef errer())); 218 request.setHTTPReferrer(SecurityPolicy::generateReferrer(m_workerGlobalS cope->getReferrerPolicy(), request.url(), m_workerGlobalScope->outgoingReferrer( )));
216 m_bridge->start(requestToPass, *m_workerGlobalScope);
217 }
218 219
219 void WorkerThreadableLoader::overrideTimeout(unsigned long timeoutMilliseconds)
220 {
221 m_bridge->overrideTimeout(timeoutMilliseconds);
222 }
223
224 void WorkerThreadableLoader::cancel()
225 {
226 m_bridge->cancel();
227 }
228
229 WorkerThreadableLoader::Bridge::Bridge(
230 ThreadableLoaderClientWrapper* clientWrapper,
231 PassRefPtr<WorkerLoaderProxy> loaderProxy,
232 const ThreadableLoaderOptions& threadableLoaderOptions,
233 const ResourceLoaderOptions& resourceLoaderOptions,
234 BlockingBehavior blockingBehavior)
235 : m_clientWrapper(clientWrapper)
236 , m_loaderProxy(loaderProxy)
237 , m_threadableLoaderOptions(threadableLoaderOptions)
238 , m_resourceLoaderOptions(resourceLoaderOptions)
239 , m_blockingBehavior(blockingBehavior)
240 {
241 DCHECK(!isMainThread());
242 }
243
244 WorkerThreadableLoader::Bridge::~Bridge()
245 {
246 DCHECK(!isMainThread());
247 DCHECK(!m_peer);
248 }
249
250 void WorkerThreadableLoader::Bridge::start(const ResourceRequest& request, const WorkerGlobalScope& workerGlobalScope)
251 {
252 DCHECK(!isMainThread()); 220 DCHECK(!isMainThread());
253 RefPtr<WaitableEventWithTasks> eventWithTasks; 221 RefPtr<WaitableEventWithTasks> eventWithTasks;
254 if (m_blockingBehavior == LoadSynchronously) 222 if (m_blockingBehavior == LoadSynchronously)
255 eventWithTasks = WaitableEventWithTasks::create(); 223 eventWithTasks = WaitableEventWithTasks::create();
256 224
257 m_loaderProxy->postTaskToLoader(createCrossThreadTask( 225 m_workerLoaderProxy->postTaskToLoader(createCrossThreadTask(
258 &Peer::createAndStart, 226 &Peer::createAndStart,
259 wrapCrossThreadPersistent(this), 227 wrapCrossThreadPersistent(this),
260 m_loaderProxy, 228 m_workerLoaderProxy,
261 wrapCrossThreadPersistent(workerGlobalScope.thread()->getWorkerThreadLif ecycleContext()), 229 wrapCrossThreadPersistent(m_workerGlobalScope->thread()->getWorkerThread LifecycleContext()),
262 request, 230 request,
263 m_threadableLoaderOptions, 231 m_threadableLoaderOptions,
264 m_resourceLoaderOptions, 232 m_resourceLoaderOptions,
265 eventWithTasks)); 233 eventWithTasks));
266 234
267 if (m_blockingBehavior == LoadAsynchronously) 235 if (m_blockingBehavior == LoadAsynchronously)
268 return; 236 return;
269 237
270 { 238 {
271 SafePointScope scope(BlinkGC::HeapPointersOnStack); 239 SafePointScope scope(BlinkGC::HeapPointersOnStack);
272 eventWithTasks->wait(); 240 eventWithTasks->wait();
273 } 241 }
274 242
275 if (eventWithTasks->isAborted()) { 243 if (eventWithTasks->isAborted()) {
276 // This thread is going to terminate. 244 // This thread is going to terminate.
277 cancel(); 245 cancel();
278 return; 246 return;
279 } 247 }
280 248
281 for (const auto& task : eventWithTasks->take()) { 249 for (const auto& task : eventWithTasks->take()) {
282 // m_clientTask contains only CallClosureTasks. So, it's ok to pass 250 // m_clientTask contains only CallClosureTasks. So, it's ok to pass
283 // the nullptr. 251 // the nullptr.
284 task->performTask(nullptr); 252 task->performTask(nullptr);
285 } 253 }
286 } 254 }
287 255
288 void WorkerThreadableLoader::Bridge::overrideTimeout(unsigned long timeoutMillis econds) 256 void WorkerThreadableLoader::overrideTimeout(unsigned long timeoutMilliseconds)
289 { 257 {
290 DCHECK(!isMainThread()); 258 DCHECK(!isMainThread());
291 if (!m_peer) 259 if (!m_peer)
292 return; 260 return;
293 m_loaderProxy->postTaskToLoader(createCrossThreadTask(&Peer::overrideTimeout , m_peer, timeoutMilliseconds)); 261 m_workerLoaderProxy->postTaskToLoader(createCrossThreadTask(&Peer::overrideT imeout, m_peer, timeoutMilliseconds));
294 } 262 }
295 263
296 void WorkerThreadableLoader::Bridge::cancel() 264 void WorkerThreadableLoader::cancel()
297 { 265 {
298 DCHECK(!isMainThread()); 266 DCHECK(!isMainThread());
299 cancelPeer(); 267 if (m_peer) {
268 m_workerLoaderProxy->postTaskToLoader(createCrossThreadTask(&Peer::cance l, m_peer));
269 m_peer = nullptr;
270 }
300 271
301 if (m_clientWrapper->done()) 272 if (!m_client)
302 return; 273 return;
274
303 // 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
304 // by sending a cancellation error. 276 // by sending a cancellation error.
305 // 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
306 // clearClient() call ensures that. 278 // clearClient() call ensures that.
307 ResourceError error(String(), 0, String(), String()); 279 ResourceError error(String(), 0, String(), String());
308 error.setIsCancellation(true); 280 error.setIsCancellation(true);
309 m_clientWrapper->didFail(error); 281 didFail(error);
310 m_clientWrapper->clearClient(); 282 DCHECK(!m_client);
311 } 283 }
312 284
313 void WorkerThreadableLoader::Bridge::destroy() 285 void WorkerThreadableLoader::didStart(Peer* peer)
314 {
315 DCHECK(!isMainThread());
316 cancelPeer();
317 m_clientWrapper->clearClient();
318 }
319
320 void WorkerThreadableLoader::Bridge::didStart(Peer* peer)
321 { 286 {
322 DCHECK(!isMainThread()); 287 DCHECK(!isMainThread());
323 DCHECK(!m_peer); 288 DCHECK(!m_peer);
324 DCHECK(peer); 289 DCHECK(peer);
325 if (m_clientWrapper->done()) { 290 if (!m_client) {
326 // The loading is already cancelled. 291 // The loading is already cancelled.
327 return; 292 return;
328 } 293 }
329 294
330 m_peer = peer; 295 m_peer = peer;
331 } 296 }
332 297
333 DEFINE_TRACE(WorkerThreadableLoader::Bridge) 298 void WorkerThreadableLoader::didSendData(unsigned long long bytesSent, unsigned long long totalBytesToBeSent)
334 { 299 {
335 visitor->trace(m_clientWrapper); 300 DCHECK(!isMainThread());
301 if (!m_client)
302 return;
303 m_client->didSendData(bytesSent, totalBytesToBeSent);
336 } 304 }
337 305
338 void WorkerThreadableLoader::Bridge::cancelPeer() 306 void WorkerThreadableLoader::didReceiveResponse(unsigned long identifier, std::u nique_ptr<CrossThreadResourceResponseData> responseData, std::unique_ptr<WebData ConsumerHandle> handle)
339 { 307 {
340 DCHECK(!isMainThread()); 308 DCHECK(!isMainThread());
341 if (!m_peer) 309 if (!m_client)
342 return; 310 return;
343 m_loaderProxy->postTaskToLoader(createCrossThreadTask(&Peer::cancel, m_peer) ); 311 ResourceResponse response(responseData.get());
312 m_client->didReceiveResponse(identifier, response, std::move(handle));
313 }
314
315 void WorkerThreadableLoader::didReceiveData(std::unique_ptr<Vector<char>> data)
316 {
317 DCHECK(!isMainThread());
318 CHECK_LE(data->size(), std::numeric_limits<unsigned>::max());
319 if (!m_client)
320 return;
321 m_client->didReceiveData(data->data(), data->size());
322 }
323
324 void WorkerThreadableLoader::didReceiveCachedMetadata(std::unique_ptr<Vector<cha r>> data)
325 {
326 DCHECK(!isMainThread());
327 if (!m_client)
328 return;
329 m_client->didReceiveCachedMetadata(data->data(), data->size());
330 }
331
332 void WorkerThreadableLoader::didFinishLoading(unsigned long identifier, double f inishTime)
333 {
334 DCHECK(!isMainThread());
335 if (!m_client)
336 return;
337 auto* client = m_client;
338 m_client = nullptr;
344 m_peer = nullptr; 339 m_peer = nullptr;
340 client->didFinishLoading(identifier, finishTime);
341 }
342
343 void WorkerThreadableLoader::didFail(const ResourceError& error)
344 {
345 DCHECK(!isMainThread());
346 if (!m_client)
347 return;
348 auto* client = m_client;
349 m_client = nullptr;
350 m_peer = nullptr;
351 client->didFail(error);
352 }
353
354 void WorkerThreadableLoader::didFailAccessControlCheck(const ResourceError& erro r)
355 {
356 DCHECK(!isMainThread());
357 if (!m_client)
358 return;
359 auto* client = m_client;
360 m_client = nullptr;
361 m_peer = nullptr;
362 client->didFailAccessControlCheck(error);
363 }
364
365 void WorkerThreadableLoader::didFailRedirectCheck()
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->didFailRedirectCheck();
374 }
375
376 void WorkerThreadableLoader::didDownloadData(int dataLength)
377 {
378 DCHECK(!isMainThread());
379 if (!m_client)
380 return;
381 m_client->didDownloadData(dataLength);
382 }
383
384 void WorkerThreadableLoader::didReceiveResourceTiming(std::unique_ptr<CrossThrea dResourceTimingInfoData> timingData)
385 {
386 DCHECK(!isMainThread());
387 if (!m_client)
388 return;
389 std::unique_ptr<ResourceTimingInfo> info(ResourceTimingInfo::adopt(std::move (timingData)));
390 WorkerGlobalScopePerformance::performance(*m_workerGlobalScope)->addResource Timing(*info);
391 m_client->didReceiveResourceTiming(*info);
392 }
393
394 DEFINE_TRACE(WorkerThreadableLoader)
395 {
396 visitor->trace(m_workerGlobalScope);
397 ThreadableLoader::trace(visitor);
345 } 398 }
346 399
347 void WorkerThreadableLoader::Peer::createAndStart( 400 void WorkerThreadableLoader::Peer::createAndStart(
348 Bridge* bridge, 401 WorkerThreadableLoader* workerLoader,
349 PassRefPtr<WorkerLoaderProxy> passLoaderProxy, 402 PassRefPtr<WorkerLoaderProxy> passLoaderProxy,
350 WorkerThreadLifecycleContext* workerThreadLifecycleContext, 403 WorkerThreadLifecycleContext* workerThreadLifecycleContext,
351 std::unique_ptr<CrossThreadResourceRequestData> request, 404 std::unique_ptr<CrossThreadResourceRequestData> request,
352 const ThreadableLoaderOptions& options, 405 const ThreadableLoaderOptions& options,
353 const ResourceLoaderOptions& resourceLoaderOptions, 406 const ResourceLoaderOptions& resourceLoaderOptions,
354 PassRefPtr<WaitableEventWithTasks> eventWithTasks, 407 PassRefPtr<WaitableEventWithTasks> eventWithTasks,
355 ExecutionContext* executionContext) 408 ExecutionContext* executionContext)
356 { 409 {
357 DCHECK(isMainThread()); 410 DCHECK(isMainThread());
358 TaskForwarder* forwarder; 411 TaskForwarder* forwarder;
359 RefPtr<WorkerLoaderProxy> loaderProxy = passLoaderProxy; 412 RefPtr<WorkerLoaderProxy> loaderProxy = passLoaderProxy;
360 if (eventWithTasks) 413 if (eventWithTasks)
361 forwarder = new SyncTaskForwarder(eventWithTasks); 414 forwarder = new SyncTaskForwarder(eventWithTasks);
362 else 415 else
363 forwarder = new AsyncTaskForwarder(loaderProxy); 416 forwarder = new AsyncTaskForwarder(loaderProxy);
364 417
365 Peer* peer = new Peer(forwarder, workerThreadLifecycleContext); 418 Peer* peer = new Peer(forwarder, workerThreadLifecycleContext);
366 if (peer->wasContextDestroyedBeforeObserverCreation()) { 419 if (peer->wasContextDestroyedBeforeObserverCreation()) {
367 // The thread is already terminating. 420 // The thread is already terminating.
368 forwarder->abort(); 421 forwarder->abort();
369 peer->m_forwarder = nullptr; 422 peer->m_forwarder = nullptr;
370 return; 423 return;
371 } 424 }
372 peer->m_clientWrapper = bridge->clientWrapper(); 425 peer->m_workerLoader = workerLoader;
373 peer->start(*toDocument(executionContext), std::move(request), options, reso urceLoaderOptions); 426 peer->start(*toDocument(executionContext), std::move(request), options, reso urceLoaderOptions);
374 forwarder->forwardTask(createCrossThreadTask(&Bridge::didStart, wrapCrossThr eadPersistent(bridge), wrapCrossThreadPersistent(peer))); 427 forwarder->forwardTask(createCrossThreadTask(&WorkerThreadableLoader::didSta rt, wrapCrossThreadPersistent(workerLoader), wrapCrossThreadPersistent(peer)));
375 } 428 }
376 429
377 WorkerThreadableLoader::Peer::~Peer() 430 WorkerThreadableLoader::Peer::~Peer()
378 { 431 {
379 DCHECK(isMainThread()); 432 DCHECK(isMainThread());
haraken 2016/07/29 14:52:51 Can we add DCHECK(!m_workerLoader)?
yhirano 2016/08/01 06:20:06 Done.
380 DCHECK(!m_mainThreadLoader);
haraken 2016/07/29 14:52:51 Why do we need to remove the DCHECK?
yhirano 2016/08/01 06:20:06 Generally I don't like to enforce clearing Member
381 } 433 }
382 434
383 void WorkerThreadableLoader::Peer::overrideTimeout(unsigned long timeoutMillisec onds) 435 void WorkerThreadableLoader::Peer::overrideTimeout(unsigned long timeoutMillisec onds)
384 { 436 {
385 DCHECK(isMainThread()); 437 DCHECK(isMainThread());
386 if (!m_mainThreadLoader) 438 if (!m_mainThreadLoader)
387 return; 439 return;
388 m_mainThreadLoader->overrideTimeout(timeoutMilliseconds); 440 m_mainThreadLoader->overrideTimeout(timeoutMilliseconds);
389 } 441 }
390 442
391 void WorkerThreadableLoader::Peer::cancel() 443 void WorkerThreadableLoader::Peer::cancel()
392 { 444 {
393 DCHECK(isMainThread()); 445 DCHECK(isMainThread());
394 if (!m_mainThreadLoader) 446 if (!m_mainThreadLoader)
395 return; 447 return;
396 m_mainThreadLoader->cancel(); 448 m_mainThreadLoader->cancel();
397 m_mainThreadLoader = nullptr; 449 m_mainThreadLoader = nullptr;
398 } 450 }
399 451
400 void WorkerThreadableLoader::Peer::didSendData(unsigned long long bytesSent, uns igned long long totalBytesToBeSent) 452 void WorkerThreadableLoader::Peer::didSendData(unsigned long long bytesSent, uns igned long long totalBytesToBeSent)
401 { 453 {
402 DCHECK(isMainThread()); 454 DCHECK(isMainThread());
403 CrossThreadPersistent<ThreadableLoaderClientWrapper> clientWrapper = m_clien tWrapper.get(); 455 CrossThreadPersistent<WorkerThreadableLoader> workerLoader = m_workerLoader. get();
404 if (!clientWrapper || !m_forwarder) 456 if (!workerLoader || !m_forwarder)
405 return; 457 return;
406 m_forwarder->forwardTask(createCrossThreadTask(&ThreadableLoaderClientWrappe r::didSendData, clientWrapper, bytesSent, totalBytesToBeSent)); 458 m_forwarder->forwardTask(createCrossThreadTask(&WorkerThreadableLoader::didS endData, workerLoader, bytesSent, totalBytesToBeSent));
407 } 459 }
408 460
409 void WorkerThreadableLoader::Peer::didReceiveResponse(unsigned long identifier, const ResourceResponse& response, std::unique_ptr<WebDataConsumerHandle> handle) 461 void WorkerThreadableLoader::Peer::didReceiveResponse(unsigned long identifier, const ResourceResponse& response, std::unique_ptr<WebDataConsumerHandle> handle)
410 { 462 {
411 DCHECK(isMainThread()); 463 DCHECK(isMainThread());
412 CrossThreadPersistent<ThreadableLoaderClientWrapper> clientWrapper = m_clien tWrapper.get(); 464 CrossThreadPersistent<WorkerThreadableLoader> workerLoader = m_workerLoader. get();
413 if (!clientWrapper || !m_forwarder) 465 if (!workerLoader || !m_forwarder)
414 return; 466 return;
415 m_forwarder->forwardTask(createCrossThreadTask(&ThreadableLoaderClientWrappe r::didReceiveResponse, clientWrapper, identifier, response, passed(std::move(han dle)))); 467 m_forwarder->forwardTask(createCrossThreadTask(&WorkerThreadableLoader::didR eceiveResponse, workerLoader, identifier, response, passed(std::move(handle))));
416 } 468 }
417 469
418 void WorkerThreadableLoader::Peer::didReceiveData(const char* data, unsigned dat aLength) 470 void WorkerThreadableLoader::Peer::didReceiveData(const char* data, unsigned dat aLength)
419 { 471 {
420 DCHECK(isMainThread()); 472 DCHECK(isMainThread());
421 CrossThreadPersistent<ThreadableLoaderClientWrapper> clientWrapper = m_clien tWrapper.get(); 473 CrossThreadPersistent<WorkerThreadableLoader> workerLoader = m_workerLoader. get();
422 if (!clientWrapper || !m_forwarder) 474 if (!workerLoader || !m_forwarder)
423 return; 475 return;
424 m_forwarder->forwardTask(createCrossThreadTask(&ThreadableLoaderClientWrappe r::didReceiveData, clientWrapper, passed(createVectorFromMemoryRegion(data, data Length)))); 476 m_forwarder->forwardTask(createCrossThreadTask(&WorkerThreadableLoader::didR eceiveData, workerLoader, passed(createVectorFromMemoryRegion(data, dataLength)) ));
425 } 477 }
426 478
427 void WorkerThreadableLoader::Peer::didDownloadData(int dataLength) 479 void WorkerThreadableLoader::Peer::didDownloadData(int dataLength)
428 { 480 {
429 DCHECK(isMainThread()); 481 DCHECK(isMainThread());
430 CrossThreadPersistent<ThreadableLoaderClientWrapper> clientWrapper = m_clien tWrapper.get(); 482 CrossThreadPersistent<WorkerThreadableLoader> workerLoader = m_workerLoader. get();
431 if (!clientWrapper || !m_forwarder) 483 if (!workerLoader || !m_forwarder)
432 return; 484 return;
433 m_forwarder->forwardTask(createCrossThreadTask(&ThreadableLoaderClientWrappe r::didDownloadData, clientWrapper, dataLength)); 485 m_forwarder->forwardTask(createCrossThreadTask(&WorkerThreadableLoader::didD ownloadData, workerLoader, dataLength));
434 } 486 }
435 487
436 void WorkerThreadableLoader::Peer::didReceiveCachedMetadata(const char* data, in t dataLength) 488 void WorkerThreadableLoader::Peer::didReceiveCachedMetadata(const char* data, in t dataLength)
437 { 489 {
438 DCHECK(isMainThread()); 490 DCHECK(isMainThread());
439 CrossThreadPersistent<ThreadableLoaderClientWrapper> clientWrapper = m_clien tWrapper.get(); 491 CrossThreadPersistent<WorkerThreadableLoader> workerLoader = m_workerLoader. get();
440 if (!clientWrapper || !m_forwarder) 492 if (!workerLoader || !m_forwarder)
441 return; 493 return;
442 m_forwarder->forwardTask(createCrossThreadTask(&ThreadableLoaderClientWrappe r::didReceiveCachedMetadata, clientWrapper, passed(createVectorFromMemoryRegion( data, dataLength)))); 494 m_forwarder->forwardTask(createCrossThreadTask(&WorkerThreadableLoader::didR eceiveCachedMetadata, workerLoader, passed(createVectorFromMemoryRegion(data, da taLength))));
443 } 495 }
444 496
445 void WorkerThreadableLoader::Peer::didFinishLoading(unsigned long identifier, do uble finishTime) 497 void WorkerThreadableLoader::Peer::didFinishLoading(unsigned long identifier, do uble finishTime)
446 { 498 {
447 DCHECK(isMainThread()); 499 DCHECK(isMainThread());
448 CrossThreadPersistent<ThreadableLoaderClientWrapper> clientWrapper = m_clien tWrapper.get(); 500 CrossThreadPersistent<WorkerThreadableLoader> workerLoader = m_workerLoader. get();
449 if (!clientWrapper || !m_forwarder) 501 if (!workerLoader || !m_forwarder)
450 return; 502 return;
451 m_forwarder->forwardTaskWithDoneSignal(createCrossThreadTask(&ThreadableLoad erClientWrapper::didFinishLoading, clientWrapper, identifier, finishTime)); 503 m_forwarder->forwardTaskWithDoneSignal(createCrossThreadTask(&WorkerThreadab leLoader::didFinishLoading, workerLoader, identifier, finishTime));
452 m_forwarder = nullptr; 504 m_forwarder = nullptr;
453 } 505 }
454 506
455 void WorkerThreadableLoader::Peer::didFail(const ResourceError& error) 507 void WorkerThreadableLoader::Peer::didFail(const ResourceError& error)
456 { 508 {
457 DCHECK(isMainThread()); 509 DCHECK(isMainThread());
458 CrossThreadPersistent<ThreadableLoaderClientWrapper> clientWrapper = m_clien tWrapper.get(); 510 CrossThreadPersistent<WorkerThreadableLoader> workerLoader = m_workerLoader. get();
459 if (!clientWrapper || !m_forwarder) 511 if (!workerLoader || !m_forwarder)
460 return; 512 return;
461 m_forwarder->forwardTaskWithDoneSignal(createCrossThreadTask(&ThreadableLoad erClientWrapper::didFail, clientWrapper, error)); 513 m_forwarder->forwardTaskWithDoneSignal(createCrossThreadTask(&WorkerThreadab leLoader::didFail, workerLoader, error));
462 m_forwarder = nullptr; 514 m_forwarder = nullptr;
463 } 515 }
464 516
465 void WorkerThreadableLoader::Peer::didFailAccessControlCheck(const ResourceError & error) 517 void WorkerThreadableLoader::Peer::didFailAccessControlCheck(const ResourceError & error)
466 { 518 {
467 DCHECK(isMainThread()); 519 DCHECK(isMainThread());
468 CrossThreadPersistent<ThreadableLoaderClientWrapper> clientWrapper = m_clien tWrapper.get(); 520 CrossThreadPersistent<WorkerThreadableLoader> workerLoader = m_workerLoader. get();
469 if (!clientWrapper || !m_forwarder) 521 if (!workerLoader || !m_forwarder)
470 return; 522 return;
471 m_forwarder->forwardTaskWithDoneSignal(createCrossThreadTask(&ThreadableLoad erClientWrapper::didFailAccessControlCheck, clientWrapper, error)); 523 m_forwarder->forwardTaskWithDoneSignal(createCrossThreadTask(&WorkerThreadab leLoader::didFailAccessControlCheck, workerLoader, error));
472 m_forwarder = nullptr; 524 m_forwarder = nullptr;
473 } 525 }
474 526
475 void WorkerThreadableLoader::Peer::didFailRedirectCheck() 527 void WorkerThreadableLoader::Peer::didFailRedirectCheck()
476 { 528 {
477 DCHECK(isMainThread()); 529 DCHECK(isMainThread());
478 CrossThreadPersistent<ThreadableLoaderClientWrapper> clientWrapper = m_clien tWrapper.get(); 530 CrossThreadPersistent<WorkerThreadableLoader> workerLoader = m_workerLoader. get();
479 if (!clientWrapper || !m_forwarder) 531 if (!workerLoader || !m_forwarder)
480 return; 532 return;
481 m_forwarder->forwardTaskWithDoneSignal(createCrossThreadTask(&ThreadableLoad erClientWrapper::didFailRedirectCheck, clientWrapper)); 533 m_forwarder->forwardTaskWithDoneSignal(createCrossThreadTask(&WorkerThreadab leLoader::didFailRedirectCheck, workerLoader));
482 m_forwarder = nullptr; 534 m_forwarder = nullptr;
483 } 535 }
484 536
485 void WorkerThreadableLoader::Peer::didReceiveResourceTiming(const ResourceTiming Info& info) 537 void WorkerThreadableLoader::Peer::didReceiveResourceTiming(const ResourceTiming Info& info)
486 { 538 {
487 DCHECK(isMainThread()); 539 DCHECK(isMainThread());
488 CrossThreadPersistent<ThreadableLoaderClientWrapper> clientWrapper = m_clien tWrapper.get(); 540 CrossThreadPersistent<WorkerThreadableLoader> workerLoader = m_workerLoader. get();
489 if (!clientWrapper || !m_forwarder) 541 if (!workerLoader || !m_forwarder)
490 return; 542 return;
491 m_forwarder->forwardTask(createCrossThreadTask(&ThreadableLoaderClientWrappe r::didReceiveResourceTiming, clientWrapper, info)); 543 m_forwarder->forwardTask(createCrossThreadTask(&WorkerThreadableLoader::didR eceiveResourceTiming, workerLoader, info));
492 } 544 }
493 545
494 void WorkerThreadableLoader::Peer::contextDestroyed() 546 void WorkerThreadableLoader::Peer::contextDestroyed()
495 { 547 {
496 DCHECK(isMainThread()); 548 DCHECK(isMainThread());
497 if (m_forwarder) { 549 if (m_forwarder) {
498 m_forwarder->abort(); 550 m_forwarder->abort();
499 m_forwarder = nullptr; 551 m_forwarder = nullptr;
500 } 552 }
501 m_clientWrapper = nullptr; 553 m_workerLoader = nullptr;
502 cancel(); 554 cancel();
503 } 555 }
504 556
505 DEFINE_TRACE(WorkerThreadableLoader::Peer) 557 DEFINE_TRACE(WorkerThreadableLoader::Peer)
506 { 558 {
507 visitor->trace(m_forwarder); 559 visitor->trace(m_forwarder);
560 visitor->trace(m_mainThreadLoader);
508 WorkerThreadLifecycleObserver::trace(visitor); 561 WorkerThreadLifecycleObserver::trace(visitor);
509 } 562 }
510 563
511 WorkerThreadableLoader::Peer::Peer(TaskForwarder* forwarder, WorkerThreadLifecyc leContext* context) 564 WorkerThreadableLoader::Peer::Peer(TaskForwarder* forwarder, WorkerThreadLifecyc leContext* context)
512 : WorkerThreadLifecycleObserver(context) 565 : WorkerThreadLifecycleObserver(context)
513 , m_forwarder(forwarder) 566 , m_forwarder(forwarder)
514 { 567 {
515 DCHECK(isMainThread()); 568 DCHECK(isMainThread());
516 } 569 }
517 570
518 void WorkerThreadableLoader::Peer::start( 571 void WorkerThreadableLoader::Peer::start(
519 Document& document, 572 Document& document,
520 std::unique_ptr<CrossThreadResourceRequestData> request, 573 std::unique_ptr<CrossThreadResourceRequestData> request,
521 const ThreadableLoaderOptions& options, 574 const ThreadableLoaderOptions& options,
522 const ResourceLoaderOptions& originalResourceLoaderOptions) 575 const ResourceLoaderOptions& originalResourceLoaderOptions)
523 { 576 {
524 DCHECK(isMainThread()); 577 DCHECK(isMainThread());
525 ResourceLoaderOptions resourceLoaderOptions = originalResourceLoaderOptions; 578 ResourceLoaderOptions resourceLoaderOptions = originalResourceLoaderOptions;
526 resourceLoaderOptions.requestInitiatorContext = WorkerContext; 579 resourceLoaderOptions.requestInitiatorContext = WorkerContext;
527 m_mainThreadLoader = DocumentThreadableLoader::create(document, this, option s, resourceLoaderOptions); 580 m_mainThreadLoader = DocumentThreadableLoader::create(document, this, option s, resourceLoaderOptions);
528 m_mainThreadLoader->start(ResourceRequest(request.get())); 581 m_mainThreadLoader->start(ResourceRequest(request.get()));
529 } 582 }
530 583
531 } // namespace blink 584 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698