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

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

Issue 2647643004: Report nav timing 2 instance as soon as it's requested. (Closed)
Patch Set: make a copy of navigationTimingInfo for ResourceFetcher Created 3 years, 10 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 635 matching lines...) Expand 10 before | Expand all | Expand 10 after
646 if (request.requestContext() == WebURLRequest::RequestContextUnspecified) 646 if (request.requestContext() == WebURLRequest::RequestContextUnspecified)
647 determineRequestContext(request, type); 647 determineRequestContext(request, type);
648 if (type == Resource::LinkPrefetch) 648 if (type == Resource::LinkPrefetch)
649 request.setHTTPHeaderField(HTTPNames::Purpose, "prefetch"); 649 request.setHTTPHeaderField(HTTPNames::Purpose, "prefetch");
650 650
651 context().addAdditionalRequestHeaders( 651 context().addAdditionalRequestHeaders(
652 request, 652 request,
653 (type == Resource::MainResource) ? FetchMainResource : FetchSubresource); 653 (type == Resource::MainResource) ? FetchMainResource : FetchSubresource);
654 } 654 }
655 655
656 std::unique_ptr<ResourceTimingInfo> ResourceFetcher::getNavigationTimingInfo() {
657 return std::move(m_navigationTimingInfo);
658 }
659
656 void ResourceFetcher::initializeRevalidation( 660 void ResourceFetcher::initializeRevalidation(
657 ResourceRequest& revalidatingRequest, 661 ResourceRequest& revalidatingRequest,
658 Resource* resource) { 662 Resource* resource) {
659 DCHECK(resource); 663 DCHECK(resource);
660 DCHECK(memoryCache()->contains(resource)); 664 DCHECK(memoryCache()->contains(resource));
661 DCHECK(resource->isLoaded()); 665 DCHECK(resource->isLoaded());
662 DCHECK(resource->canUseCacheValidator()); 666 DCHECK(resource->canUseCacheValidator());
663 DCHECK(!resource->isCacheValidator()); 667 DCHECK(!resource->isCacheValidator());
664 DCHECK(!context().isControlledByServiceWorker()); 668 DCHECK(!context().isControlledByServiceWorker());
665 669
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after
735 double startTime = resource->resourceRequest().navigationStartTime() 739 double startTime = resource->resourceRequest().navigationStartTime()
736 ? resource->resourceRequest().navigationStartTime() 740 ? resource->resourceRequest().navigationStartTime()
737 : monotonicallyIncreasingTime(); 741 : monotonicallyIncreasingTime();
738 742
739 // This buffer is created and populated for providing transferSize 743 // This buffer is created and populated for providing transferSize
740 // and redirect timing opt-in information. 744 // and redirect timing opt-in information.
741 if (isMainResource) { 745 if (isMainResource) {
742 DCHECK(!m_navigationTimingInfo); 746 DCHECK(!m_navigationTimingInfo);
743 m_navigationTimingInfo = 747 m_navigationTimingInfo =
744 ResourceTimingInfo::create(fetchInitiator, startTime, isMainResource); 748 ResourceTimingInfo::create(fetchInitiator, startTime, isMainResource);
749 m_navigationTimingInfoRef = m_navigationTimingInfo.get();
745 } 750 }
746 751
747 std::unique_ptr<ResourceTimingInfo> info = 752 std::unique_ptr<ResourceTimingInfo> info =
748 ResourceTimingInfo::create(fetchInitiator, startTime, isMainResource); 753 ResourceTimingInfo::create(fetchInitiator, startTime, isMainResource);
749 754
750 if (resource->isCacheValidator()) { 755 if (resource->isCacheValidator()) {
751 const AtomicString& timingAllowOrigin = 756 const AtomicString& timingAllowOrigin =
752 resource->response().httpHeaderField(HTTPNames::Timing_Allow_Origin); 757 resource->response().httpHeaderField(HTTPNames::Timing_Allow_Origin);
753 if (!timingAllowOrigin.isEmpty()) 758 if (!timingAllowOrigin.isEmpty())
754 info->setOriginalTimingAllowOrigin(timingAllowOrigin); 759 info->setOriginalTimingAllowOrigin(timingAllowOrigin);
755 } 760 }
756 761
757 if (!isMainResource || 762 if (!isMainResource ||
758 context().updateTimingInfoForIFrameNavigation(info.get())) { 763 context().updateTimingInfoForIFrameNavigation(info.get())) {
759 m_resourceTimingInfoMap.add(resource, std::move(info)); 764 m_resourceTimingInfoMap.add(resource, std::move(info));
760 } 765 }
761 } 766 }
762 767
763 void ResourceFetcher::recordResourceTimingOnRedirect( 768 void ResourceFetcher::recordResourceTimingOnRedirect(
764 Resource* resource, 769 Resource* resource,
765 const ResourceResponse& redirectResponse, 770 const ResourceResponse& redirectResponse,
766 bool crossOrigin) { 771 bool crossOrigin) {
767 ResourceTimingInfoMap::iterator it = m_resourceTimingInfoMap.find(resource); 772 ResourceTimingInfoMap::iterator it = m_resourceTimingInfoMap.find(resource);
768 if (it != m_resourceTimingInfoMap.end()) { 773 if (it != m_resourceTimingInfoMap.end()) {
769 it->value->addRedirect(redirectResponse, crossOrigin); 774 it->value->addRedirect(redirectResponse, crossOrigin);
770 } 775 }
771 776
772 if (resource->getType() == Resource::MainResource) { 777 if (resource->getType() == Resource::MainResource) {
773 DCHECK(m_navigationTimingInfo); 778 DCHECK(m_navigationTimingInfoRef);
774 m_navigationTimingInfo->addRedirect(redirectResponse, crossOrigin); 779 m_navigationTimingInfoRef->addRedirect(redirectResponse, crossOrigin);
775 } 780 }
776 } 781 }
777 782
778 ResourceFetcher::RevalidationPolicy 783 ResourceFetcher::RevalidationPolicy
779 ResourceFetcher::determineRevalidationPolicy(Resource::Type type, 784 ResourceFetcher::determineRevalidationPolicy(Resource::Type type,
780 const FetchRequest& fetchRequest, 785 const FetchRequest& fetchRequest,
781 Resource* existingResource, 786 Resource* existingResource,
782 bool isStaticData) const { 787 bool isStaticData) const {
783 const ResourceRequest& request = fetchRequest.resourceRequest(); 788 const ResourceRequest& request = fetchRequest.resourceRequest();
784 789
(...skipping 322 matching lines...) Expand 10 before | Expand all | Expand 10 after
1107 } 1112 }
1108 1113
1109 ArchiveResource* ResourceFetcher::createArchive(Resource* resource) { 1114 ArchiveResource* ResourceFetcher::createArchive(Resource* resource) {
1110 // Only the top-frame can load MHTML. 1115 // Only the top-frame can load MHTML.
1111 if (!context().isMainFrame()) 1116 if (!context().isMainFrame())
1112 return nullptr; 1117 return nullptr;
1113 m_archive = MHTMLArchive::create(resource->url(), resource->resourceBuffer()); 1118 m_archive = MHTMLArchive::create(resource->url(), resource->resourceBuffer());
1114 return m_archive ? m_archive->mainResource() : nullptr; 1119 return m_archive ? m_archive->mainResource() : nullptr;
1115 } 1120 }
1116 1121
1117 ResourceTimingInfo* ResourceFetcher::getNavigationTimingInfo() {
1118 return m_navigationTimingInfo.get();
1119 }
1120
1121 void ResourceFetcher::handleLoadCompletion(Resource* resource) { 1122 void ResourceFetcher::handleLoadCompletion(Resource* resource) {
1122 context().didLoadResource(resource); 1123 context().didLoadResource(resource);
1123 1124
1124 resource->reloadIfLoFiOrPlaceholderImage(this, Resource::kReloadIfNeeded); 1125 resource->reloadIfLoFiOrPlaceholderImage(this, Resource::kReloadIfNeeded);
1125 } 1126 }
1126 1127
1127 void ResourceFetcher::handleLoaderFinish(Resource* resource, 1128 void ResourceFetcher::handleLoaderFinish(Resource* resource,
1128 double finishTime, 1129 double finishTime,
1129 LoaderFinishType type) { 1130 LoaderFinishType type) {
1130 DCHECK(resource); 1131 DCHECK(resource);
1131 1132
1132 ResourceLoader* loader = resource->loader(); 1133 ResourceLoader* loader = resource->loader();
1133 if (type == DidFinishFirstPartInMultipart) { 1134 if (type == DidFinishFirstPartInMultipart) {
1134 // When loading a multipart resource, make the loader non-block when 1135 // When loading a multipart resource, make the loader non-block when
1135 // finishing loading the first part. 1136 // finishing loading the first part.
1136 moveResourceLoaderToNonBlocking(loader); 1137 moveResourceLoaderToNonBlocking(loader);
1137 } else { 1138 } else {
1138 removeResourceLoader(loader); 1139 removeResourceLoader(loader);
1139 DCHECK(!m_nonBlockingLoaders.contains(loader)); 1140 DCHECK(!m_nonBlockingLoaders.contains(loader));
1140 } 1141 }
1141 DCHECK(!m_loaders.contains(loader)); 1142 DCHECK(!m_loaders.contains(loader));
1142 1143
1143 const int64_t encodedDataLength = resource->response().encodedDataLength(); 1144 const int64_t encodedDataLength = resource->response().encodedDataLength();
1144 1145
1145 if (resource->getType() == Resource::MainResource) { 1146 if (resource->getType() == Resource::MainResource) {
1146 DCHECK(m_navigationTimingInfo); 1147 DCHECK(m_navigationTimingInfoRef);
1147 // Store redirect responses that were packed inside the final response. 1148 // Store redirect responses that were packed inside the final response.
1148 addRedirectsToTimingInfo(resource, m_navigationTimingInfo.get()); 1149 addRedirectsToTimingInfo(resource, m_navigationTimingInfoRef);
1149 if (resource->response().isHTTP()) { 1150 if (resource->response().isHTTP()) {
1150 populateTimingInfo(m_navigationTimingInfo.get(), resource); 1151 populateTimingInfo(m_navigationTimingInfoRef, resource);
1151 m_navigationTimingInfo->addFinalTransferSize( 1152 m_navigationTimingInfoRef->addFinalTransferSize(
1152 encodedDataLength == -1 ? 0 : encodedDataLength); 1153 encodedDataLength == -1 ? 0 : encodedDataLength);
1153 } 1154 }
1154 } 1155 }
1155 if (std::unique_ptr<ResourceTimingInfo> info = 1156 if (std::unique_ptr<ResourceTimingInfo> info =
1156 m_resourceTimingInfoMap.take(resource)) { 1157 m_resourceTimingInfoMap.take(resource)) {
1157 // Store redirect responses that were packed inside the final response. 1158 // Store redirect responses that were packed inside the final response.
1158 addRedirectsToTimingInfo(resource, info.get()); 1159 addRedirectsToTimingInfo(resource, info.get());
1159 1160
1160 if (resource->response().isHTTP() && 1161 if (resource->response().isHTTP() &&
1161 resource->response().httpStatusCode() < 400) { 1162 resource->response().httpStatusCode() < 400) {
(...skipping 363 matching lines...) Expand 10 before | Expand all | Expand 10 after
1525 visitor->trace(m_context); 1526 visitor->trace(m_context);
1526 visitor->trace(m_archive); 1527 visitor->trace(m_archive);
1527 visitor->trace(m_loaders); 1528 visitor->trace(m_loaders);
1528 visitor->trace(m_nonBlockingLoaders); 1529 visitor->trace(m_nonBlockingLoaders);
1529 visitor->trace(m_documentResources); 1530 visitor->trace(m_documentResources);
1530 visitor->trace(m_preloads); 1531 visitor->trace(m_preloads);
1531 visitor->trace(m_resourceTimingInfoMap); 1532 visitor->trace(m_resourceTimingInfoMap);
1532 } 1533 }
1533 1534
1534 } // namespace blink 1535 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698