OLD | NEW |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 |
OLD | NEW |