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

Side by Side Diff: third_party/WebKit/Source/platform/loader/fetch/ResourceFetcher.cpp

Issue 2701753003: [WIP] off-main-thread loading
Patch Set: small fix Created 3 years, 8 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) 1998 Lars Knoll (knoll@mpi-hd.mpg.de) 2 Copyright (C) 1998 Lars Knoll (knoll@mpi-hd.mpg.de)
3 Copyright (C) 2001 Dirk Mueller (mueller@kde.org) 3 Copyright (C) 2001 Dirk Mueller (mueller@kde.org)
4 Copyright (C) 2002 Waldo Bastian (bastian@kde.org) 4 Copyright (C) 2002 Waldo Bastian (bastian@kde.org)
5 Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Apple Inc. All 5 Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Apple Inc. All
6 rights reserved. 6 rights reserved.
7 Copyright (C) 2009 Torch Mobile Inc. http://www.torchmobile.com/ 7 Copyright (C) 2009 Torch Mobile Inc. http://www.torchmobile.com/
8 8
9 This library is free software; you can redistribute it and/or 9 This library is free software; you can redistribute it and/or
10 modify it under the terms of the GNU Library General Public 10 modify it under the terms of the GNU Library General Public
(...skipping 402 matching lines...) Expand 10 before | Expand all | Expand 10 after
413 // Fall back to the network if the archive doesn't contain the resource. 413 // Fall back to the network if the archive doesn't contain the resource.
414 if (!archiveResource) 414 if (!archiveResource)
415 return nullptr; 415 return nullptr;
416 data = archiveResource->data(); 416 data = archiveResource->data();
417 response.setURL(url); 417 response.setURL(url);
418 response.setMimeType(archiveResource->mimeType()); 418 response.setMimeType(archiveResource->mimeType());
419 response.setExpectedContentLength(data->size()); 419 response.setExpectedContentLength(data->size());
420 response.setTextEncodingName(archiveResource->textEncoding()); 420 response.setTextEncodingName(archiveResource->textEncoding());
421 } 421 }
422 422
423 Resource* resource = factory.create(request.resourceRequest(), 423 Resource* resource =
424 request.options(), request.charset()); 424 factory.create(request.resourceRequest(), request.options(),
425 request.charset(), &context());
425 resource->setNeedsSynchronousCacheHit(substituteData.forceSynchronousLoad()); 426 resource->setNeedsSynchronousCacheHit(substituteData.forceSynchronousLoad());
426 // FIXME: We should provide a body stream here. 427 // FIXME: We should provide a body stream here.
427 resource->responseReceived(response, nullptr); 428 resource->responseReceived(response, nullptr);
428 resource->setDataBufferingPolicy(BufferData); 429 resource->setDataBufferingPolicy(BufferData);
429 if (data->size()) 430 if (data->size())
430 resource->setResourceBuffer(data); 431 resource->setResourceBuffer(data);
431 resource->setIdentifier(createUniqueIdentifier()); 432 resource->setIdentifier(createUniqueIdentifier());
432 resource->setCacheIdentifier(cacheIdentifier); 433 resource->setCacheIdentifier(cacheIdentifier);
433 resource->finish(); 434 resource->finish();
434 435
435 if (!substituteData.isValid()) 436 if (!substituteData.isValid())
436 memoryCache()->add(resource); 437 memoryCache()->add(resource);
437 438
438 return resource; 439 return resource;
439 } 440 }
440 441
441 Resource* ResourceFetcher::resourceForBlockedRequest( 442 Resource* ResourceFetcher::resourceForBlockedRequest(
442 const FetchRequest& request, 443 const FetchRequest& request,
443 const ResourceFactory& factory, 444 const ResourceFactory& factory,
444 ResourceRequestBlockedReason blockedReason) { 445 ResourceRequestBlockedReason blockedReason) {
445 Resource* resource = factory.create(request.resourceRequest(), 446 Resource* resource =
446 request.options(), request.charset()); 447 factory.create(request.resourceRequest(), request.options(),
448 request.charset(), &context());
447 resource->error(ResourceError::cancelledDueToAccessCheckError(request.url(), 449 resource->error(ResourceError::cancelledDueToAccessCheckError(request.url(),
448 blockedReason)); 450 blockedReason));
449 return resource; 451 return resource;
450 } 452 }
451 453
452 void ResourceFetcher::makePreloadedResourceBlockOnloadIfNeeded( 454 void ResourceFetcher::makePreloadedResourceBlockOnloadIfNeeded(
453 Resource* resource, 455 Resource* resource,
454 const FetchRequest& request) { 456 const FetchRequest& request) {
455 // TODO(yoav): Test that non-blocking resources (video/audio/track) continue 457 // TODO(yoav): Test that non-blocking resources (video/audio/track) continue
456 // to not-block even after being preloaded and discovered. 458 // to not-block even after being preloaded and discovered.
(...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after
575 bool isStaticData = isDataUrl || substituteData.isValid() || m_archive; 577 bool isStaticData = isDataUrl || substituteData.isValid() || m_archive;
576 if (isStaticData) { 578 if (isStaticData) {
577 resource = resourceForStaticData(request, factory, substituteData); 579 resource = resourceForStaticData(request, factory, substituteData);
578 // Abort the request if the archive doesn't contain the resource, except in 580 // Abort the request if the archive doesn't contain the resource, except in
579 // the case of data URLs which might have resources such as fonts that need 581 // the case of data URLs which might have resources such as fonts that need
580 // to be decoded only on demand. These data URLs are allowed to be 582 // to be decoded only on demand. These data URLs are allowed to be
581 // processed using the normal ResourceFetcher machinery. 583 // processed using the normal ResourceFetcher machinery.
582 if (!resource && !isDataUrl && m_archive) 584 if (!resource && !isDataUrl && m_archive)
583 return nullptr; 585 return nullptr;
584 } 586 }
585 if (!resource) { 587 if (!resource && isMainThread()) {
586 resource = 588 resource =
587 memoryCache()->resourceForURL(request.url(), getCacheIdentifier()); 589 memoryCache()->resourceForURL(request.url(), getCacheIdentifier());
588 } 590 }
589 591
590 // If we got a preloaded resource from the cache for a non-preload request, 592 // If we got a preloaded resource from the cache for a non-preload request,
591 // we may need to make it block the onload event. 593 // we may need to make it block the onload event.
592 makePreloadedResourceBlockOnloadIfNeeded(resource, request); 594 makePreloadedResourceBlockOnloadIfNeeded(resource, request);
593 595
594 const RevalidationPolicy policy = determineRevalidationPolicy( 596 const RevalidationPolicy policy = determineRevalidationPolicy(
595 factory.type(), request, resource, isStaticData); 597 factory.type(), request, resource, isStaticData);
(...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after
724 revalidatingRequest.setHTTPHeaderField(HTTPNames::If_None_Match, eTag); 726 revalidatingRequest.setHTTPHeaderField(HTTPNames::If_None_Match, eTag);
725 727
726 resource->setRevalidatingRequest(revalidatingRequest); 728 resource->setRevalidatingRequest(revalidatingRequest);
727 } 729 }
728 730
729 Resource* ResourceFetcher::createResourceForLoading( 731 Resource* ResourceFetcher::createResourceForLoading(
730 FetchRequest& request, 732 FetchRequest& request,
731 const String& charset, 733 const String& charset,
732 const ResourceFactory& factory) { 734 const ResourceFactory& factory) {
733 const String cacheIdentifier = getCacheIdentifier(); 735 const String cacheIdentifier = getCacheIdentifier();
734 DCHECK(!memoryCache()->resourceForURL(request.resourceRequest().url(), 736
737 DCHECK(!isMainThread() ||
738 !memoryCache()->resourceForURL(request.resourceRequest().url(),
735 cacheIdentifier)); 739 cacheIdentifier));
736 740
737 RESOURCE_LOADING_DVLOG(1) << "Loading Resource for " 741 RESOURCE_LOADING_DVLOG(1) << "Loading Resource for "
738 << request.resourceRequest().url().elidedString(); 742 << request.resourceRequest().url().elidedString();
739 743
740 Resource* resource = 744 Resource* resource = factory.create(request.resourceRequest(),
741 factory.create(request.resourceRequest(), request.options(), charset); 745 request.options(), charset, &context());
742 resource->setLinkPreload(request.isLinkPreload()); 746 resource->setLinkPreload(request.isLinkPreload());
743 if (request.isSpeculativePreload()) { 747 if (request.isSpeculativePreload()) {
744 resource->setPreloadDiscoveryTime(request.preloadDiscoveryTime()); 748 resource->setPreloadDiscoveryTime(request.preloadDiscoveryTime());
745 } 749 }
746 resource->setCacheIdentifier(cacheIdentifier); 750 resource->setCacheIdentifier(cacheIdentifier);
747 751
748 // - Don't add main resource to cache to prevent reuse. 752 // - Don't add main resource to cache to prevent reuse.
749 // - Don't add the resource if its body will not be stored. 753 // - Don't add the resource if its body will not be stored.
750 if (factory.type() != Resource::MainResource && 754 if (isMainThread() && factory.type() != Resource::MainResource &&
751 request.options().dataBufferingPolicy != DoNotBufferData) { 755 request.options().dataBufferingPolicy != DoNotBufferData) {
752 memoryCache()->add(resource); 756 memoryCache()->add(resource);
753 } 757 }
754 return resource; 758 return resource;
755 } 759 }
756 760
757 void ResourceFetcher::storePerformanceTimingInitiatorInformation( 761 void ResourceFetcher::storePerformanceTimingInitiatorInformation(
758 Resource* resource) { 762 Resource* resource) {
759 const AtomicString& fetchInitiator = resource->options().initiatorInfo.name; 763 const AtomicString& fetchInitiator = resource->options().initiatorInfo.name;
760 if (fetchInitiator == FetchInitiatorTypeNames::internal) 764 if (fetchInitiator == FetchInitiatorTypeNames::internal)
(...skipping 487 matching lines...) Expand 10 before | Expand all | Expand 10 after
1248 DCHECK(loader); 1252 DCHECK(loader);
1249 // TODO(yoav): Convert CHECK to DCHECK if no crash reports come in. 1253 // TODO(yoav): Convert CHECK to DCHECK if no crash reports come in.
1250 CHECK(m_loaders.contains(loader)); 1254 CHECK(m_loaders.contains(loader));
1251 m_nonBlockingLoaders.insert(loader); 1255 m_nonBlockingLoaders.insert(loader);
1252 m_loaders.erase(loader); 1256 m_loaders.erase(loader);
1253 } 1257 }
1254 1258
1255 bool ResourceFetcher::startLoad(Resource* resource) { 1259 bool ResourceFetcher::startLoad(Resource* resource) {
1256 DCHECK(resource); 1260 DCHECK(resource);
1257 DCHECK(resource->stillNeedsLoad()); 1261 DCHECK(resource->stillNeedsLoad());
1258 if (!context().shouldLoadNewResource(resource->getType())) { 1262 if (isMainThread() && !context().shouldLoadNewResource(resource->getType())) {
1259 memoryCache()->remove(resource); 1263 memoryCache()->remove(resource);
1260 return false; 1264 return false;
1261 } 1265 }
1262 1266
1263 ResourceRequest request(resource->resourceRequest()); 1267 ResourceRequest request(resource->resourceRequest());
1264 ResourceResponse response; 1268 ResourceResponse response;
1265 1269
1266 blink::probe::PlatformSendRequest probe(&context(), resource->identifier(), 1270 blink::probe::PlatformSendRequest probe(&context(), resource->identifier(),
1267 request, response, 1271 request, response,
1268 resource->options().initiatorInfo); 1272 resource->options().initiatorInfo);
(...skipping 302 matching lines...) Expand 10 before | Expand all | Expand 10 after
1571 visitor->trace(m_context); 1575 visitor->trace(m_context);
1572 visitor->trace(m_archive); 1576 visitor->trace(m_archive);
1573 visitor->trace(m_loaders); 1577 visitor->trace(m_loaders);
1574 visitor->trace(m_nonBlockingLoaders); 1578 visitor->trace(m_nonBlockingLoaders);
1575 visitor->trace(m_documentResources); 1579 visitor->trace(m_documentResources);
1576 visitor->trace(m_preloads); 1580 visitor->trace(m_preloads);
1577 visitor->trace(m_resourceTimingInfoMap); 1581 visitor->trace(m_resourceTimingInfoMap);
1578 } 1582 }
1579 1583
1580 } // namespace blink 1584 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698