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

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 ResourceTimingInfo ref-counted 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 294 matching lines...) Expand 10 before | Expand all | Expand 10 after
305 request.resourceRequest().requestContext()); 305 request.resourceRequest().requestContext());
306 } 306 }
307 307
308 if (isStaticData) 308 if (isStaticData)
309 return; 309 return;
310 310
311 if (type == ResourceLoadingFromCache && !resource->stillNeedsLoad() && 311 if (type == ResourceLoadingFromCache && !resource->stillNeedsLoad() &&
312 !m_validatedURLs.contains(request.resourceRequest().url())) { 312 !m_validatedURLs.contains(request.resourceRequest().url())) {
313 // Resources loaded from memory cache should be reported the first time 313 // Resources loaded from memory cache should be reported the first time
314 // they're used. 314 // they're used.
315 std::unique_ptr<ResourceTimingInfo> info = ResourceTimingInfo::create( 315 RefPtr<ResourceTimingInfo> info = ResourceTimingInfo::create(
316 request.options().initiatorInfo.name, monotonicallyIncreasingTime(), 316 request.options().initiatorInfo.name, monotonicallyIncreasingTime(),
317 resource->getType() == Resource::MainResource); 317 resource->getType() == Resource::MainResource);
318 populateTimingInfo(info.get(), resource); 318 populateTimingInfo(info.get(), resource);
319 info->clearLoadTimings(); 319 info->clearLoadTimings();
320 info->setLoadFinishTime(info->initialTime()); 320 info->setLoadFinishTime(info->initialTime());
321 m_scheduledResourceTimingReports.push_back(std::move(info)); 321 m_scheduledResourceTimingReports.push_back(info.release());
322 if (!m_resourceTimingReportTimer.isActive()) 322 if (!m_resourceTimingReportTimer.isActive())
323 m_resourceTimingReportTimer.startOneShot(0, BLINK_FROM_HERE); 323 m_resourceTimingReportTimer.startOneShot(0, BLINK_FROM_HERE);
324 } 324 }
325 325
326 if (m_validatedURLs.size() >= kMaxValidatedURLsSize) { 326 if (m_validatedURLs.size() >= kMaxValidatedURLsSize) {
327 m_validatedURLs.clear(); 327 m_validatedURLs.clear();
328 } 328 }
329 m_validatedURLs.insert(request.resourceRequest().url()); 329 m_validatedURLs.insert(request.resourceRequest().url());
330 } 330 }
331 331
(...skipping 294 matching lines...) Expand 10 before | Expand all | Expand 10 after
626 return nullptr; 626 return nullptr;
627 scopedResourceLoadTracker.resourceLoadContinuesBeyondScope(); 627 scopedResourceLoadTracker.resourceLoadContinuesBeyondScope();
628 628
629 DCHECK(!resource->errorOccurred() || 629 DCHECK(!resource->errorOccurred() ||
630 request.options().synchronousPolicy == RequestSynchronously); 630 request.options().synchronousPolicy == RequestSynchronously);
631 return resource; 631 return resource;
632 } 632 }
633 633
634 void ResourceFetcher::resourceTimingReportTimerFired(TimerBase* timer) { 634 void ResourceFetcher::resourceTimingReportTimerFired(TimerBase* timer) {
635 DCHECK_EQ(timer, &m_resourceTimingReportTimer); 635 DCHECK_EQ(timer, &m_resourceTimingReportTimer);
636 Vector<std::unique_ptr<ResourceTimingInfo>> timingReports; 636 Vector<RefPtr<ResourceTimingInfo>> timingReports;
637 timingReports.swap(m_scheduledResourceTimingReports); 637 timingReports.swap(m_scheduledResourceTimingReports);
638 for (const auto& timingInfo : timingReports) 638 for (const auto& timingInfo : timingReports)
639 context().addResourceTiming(*timingInfo); 639 context().addResourceTiming(*timingInfo);
640 } 640 }
641 641
642 void ResourceFetcher::determineRequestContext(ResourceRequest& request, 642 void ResourceFetcher::determineRequestContext(ResourceRequest& request,
643 Resource::Type type, 643 Resource::Type type,
644 bool isMainFrame) { 644 bool isMainFrame) {
645 WebURLRequest::RequestContext requestContext = 645 WebURLRequest::RequestContext requestContext =
646 requestContextFromType(isMainFrame, type); 646 requestContextFromType(isMainFrame, type);
(...skipping 16 matching lines...) Expand all
663 if (request.requestContext() == WebURLRequest::RequestContextUnspecified) 663 if (request.requestContext() == WebURLRequest::RequestContextUnspecified)
664 determineRequestContext(request, type); 664 determineRequestContext(request, type);
665 if (type == Resource::LinkPrefetch) 665 if (type == Resource::LinkPrefetch)
666 request.setHTTPHeaderField(HTTPNames::Purpose, "prefetch"); 666 request.setHTTPHeaderField(HTTPNames::Purpose, "prefetch");
667 667
668 context().addAdditionalRequestHeaders( 668 context().addAdditionalRequestHeaders(
669 request, 669 request,
670 (type == Resource::MainResource) ? FetchMainResource : FetchSubresource); 670 (type == Resource::MainResource) ? FetchMainResource : FetchSubresource);
671 } 671 }
672 672
673 ResourceTimingInfo* ResourceFetcher::getNavigationTimingInfo() {
Kunihiko Sakamoto 2017/02/13 08:22:29 Why is this moved from line 1134?
sunjian 2017/02/14 21:29:03 I think i deleted it because i thought i didn't ne
Kunihiko Sakamoto 2017/02/15 06:35:30 I see. Can you move it back to original position,
sunjian 2017/02/15 20:30:28 Done.
674 return m_navigationTimingInfo.get();
675 }
676
673 void ResourceFetcher::initializeRevalidation( 677 void ResourceFetcher::initializeRevalidation(
674 ResourceRequest& revalidatingRequest, 678 ResourceRequest& revalidatingRequest,
675 Resource* resource) { 679 Resource* resource) {
676 DCHECK(resource); 680 DCHECK(resource);
677 DCHECK(memoryCache()->contains(resource)); 681 DCHECK(memoryCache()->contains(resource));
678 DCHECK(resource->isLoaded()); 682 DCHECK(resource->isLoaded());
679 DCHECK(resource->canUseCacheValidator()); 683 DCHECK(resource->canUseCacheValidator());
680 DCHECK(!resource->isCacheValidator()); 684 DCHECK(!resource->isCacheValidator());
681 DCHECK(!context().isControlledByServiceWorker()); 685 DCHECK(!context().isControlledByServiceWorker());
682 686
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after
754 : monotonicallyIncreasingTime(); 758 : monotonicallyIncreasingTime();
755 759
756 // This buffer is created and populated for providing transferSize 760 // This buffer is created and populated for providing transferSize
757 // and redirect timing opt-in information. 761 // and redirect timing opt-in information.
758 if (isMainResource) { 762 if (isMainResource) {
759 DCHECK(!m_navigationTimingInfo); 763 DCHECK(!m_navigationTimingInfo);
760 m_navigationTimingInfo = 764 m_navigationTimingInfo =
761 ResourceTimingInfo::create(fetchInitiator, startTime, isMainResource); 765 ResourceTimingInfo::create(fetchInitiator, startTime, isMainResource);
762 } 766 }
763 767
764 std::unique_ptr<ResourceTimingInfo> info = 768 RefPtr<ResourceTimingInfo> info =
765 ResourceTimingInfo::create(fetchInitiator, startTime, isMainResource); 769 ResourceTimingInfo::create(fetchInitiator, startTime, isMainResource);
766 770
767 if (resource->isCacheValidator()) { 771 if (resource->isCacheValidator()) {
768 const AtomicString& timingAllowOrigin = 772 const AtomicString& timingAllowOrigin =
769 resource->response().httpHeaderField(HTTPNames::Timing_Allow_Origin); 773 resource->response().httpHeaderField(HTTPNames::Timing_Allow_Origin);
770 if (!timingAllowOrigin.isEmpty()) 774 if (!timingAllowOrigin.isEmpty())
771 info->setOriginalTimingAllowOrigin(timingAllowOrigin); 775 info->setOriginalTimingAllowOrigin(timingAllowOrigin);
772 } 776 }
773 777
774 if (!isMainResource || 778 if (!isMainResource ||
775 context().updateTimingInfoForIFrameNavigation(info.get())) { 779 context().updateTimingInfoForIFrameNavigation(info.get())) {
776 m_resourceTimingInfoMap.add(resource, std::move(info)); 780 m_resourceTimingInfoMap.add(resource, info.release());
777 } 781 }
778 } 782 }
779 783
780 void ResourceFetcher::recordResourceTimingOnRedirect( 784 void ResourceFetcher::recordResourceTimingOnRedirect(
781 Resource* resource, 785 Resource* resource,
782 const ResourceResponse& redirectResponse, 786 const ResourceResponse& redirectResponse,
783 bool crossOrigin) { 787 bool crossOrigin) {
784 ResourceTimingInfoMap::iterator it = m_resourceTimingInfoMap.find(resource); 788 ResourceTimingInfoMap::iterator it = m_resourceTimingInfoMap.find(resource);
785 if (it != m_resourceTimingInfoMap.end()) { 789 if (it != m_resourceTimingInfoMap.end()) {
786 it->value->addRedirect(redirectResponse, crossOrigin); 790 it->value->addRedirect(redirectResponse, crossOrigin);
(...skipping 337 matching lines...) Expand 10 before | Expand all | Expand 10 after
1124 } 1128 }
1125 1129
1126 ArchiveResource* ResourceFetcher::createArchive(Resource* resource) { 1130 ArchiveResource* ResourceFetcher::createArchive(Resource* resource) {
1127 // Only the top-frame can load MHTML. 1131 // Only the top-frame can load MHTML.
1128 if (!context().isMainFrame()) 1132 if (!context().isMainFrame())
1129 return nullptr; 1133 return nullptr;
1130 m_archive = MHTMLArchive::create(resource->url(), resource->resourceBuffer()); 1134 m_archive = MHTMLArchive::create(resource->url(), resource->resourceBuffer());
1131 return m_archive ? m_archive->mainResource() : nullptr; 1135 return m_archive ? m_archive->mainResource() : nullptr;
1132 } 1136 }
1133 1137
1134 ResourceTimingInfo* ResourceFetcher::getNavigationTimingInfo() {
1135 return m_navigationTimingInfo.get();
1136 }
1137
1138 void ResourceFetcher::handleLoadCompletion(Resource* resource) { 1138 void ResourceFetcher::handleLoadCompletion(Resource* resource) {
1139 context().didLoadResource(resource); 1139 context().didLoadResource(resource);
1140 1140
1141 resource->reloadIfLoFiOrPlaceholderImage(this, Resource::kReloadIfNeeded); 1141 resource->reloadIfLoFiOrPlaceholderImage(this, Resource::kReloadIfNeeded);
1142 } 1142 }
1143 1143
1144 void ResourceFetcher::handleLoaderFinish(Resource* resource, 1144 void ResourceFetcher::handleLoaderFinish(Resource* resource,
1145 double finishTime, 1145 double finishTime,
1146 LoaderFinishType type) { 1146 LoaderFinishType type) {
1147 DCHECK(resource); 1147 DCHECK(resource);
(...skipping 14 matching lines...) Expand all
1162 if (resource->getType() == Resource::MainResource) { 1162 if (resource->getType() == Resource::MainResource) {
1163 DCHECK(m_navigationTimingInfo); 1163 DCHECK(m_navigationTimingInfo);
1164 // Store redirect responses that were packed inside the final response. 1164 // Store redirect responses that were packed inside the final response.
1165 addRedirectsToTimingInfo(resource, m_navigationTimingInfo.get()); 1165 addRedirectsToTimingInfo(resource, m_navigationTimingInfo.get());
1166 if (resource->response().isHTTP()) { 1166 if (resource->response().isHTTP()) {
1167 populateTimingInfo(m_navigationTimingInfo.get(), resource); 1167 populateTimingInfo(m_navigationTimingInfo.get(), resource);
1168 m_navigationTimingInfo->addFinalTransferSize( 1168 m_navigationTimingInfo->addFinalTransferSize(
1169 encodedDataLength == -1 ? 0 : encodedDataLength); 1169 encodedDataLength == -1 ? 0 : encodedDataLength);
1170 } 1170 }
1171 } 1171 }
1172 if (std::unique_ptr<ResourceTimingInfo> info = 1172 if (RefPtr<ResourceTimingInfo> info =
1173 m_resourceTimingInfoMap.take(resource)) { 1173 m_resourceTimingInfoMap.take(resource)) {
1174 // Store redirect responses that were packed inside the final response. 1174 // Store redirect responses that were packed inside the final response.
1175 addRedirectsToTimingInfo(resource, info.get()); 1175 addRedirectsToTimingInfo(resource, info.get());
1176 1176
1177 if (resource->response().isHTTP() && 1177 if (resource->response().isHTTP() &&
1178 resource->response().httpStatusCode() < 400) { 1178 resource->response().httpStatusCode() < 400) {
1179 populateTimingInfo(info.get(), resource); 1179 populateTimingInfo(info.get(), resource);
1180 info->setLoadFinishTime(finishTime); 1180 info->setLoadFinishTime(finishTime);
1181 // encodedDataLength == -1 means "not available". 1181 // encodedDataLength == -1 means "not available".
1182 // TODO(ricea): Find cases where it is not available but the 1182 // TODO(ricea): Find cases where it is not available but the
(...skipping 360 matching lines...) Expand 10 before | Expand all | Expand 10 after
1543 visitor->trace(m_context); 1543 visitor->trace(m_context);
1544 visitor->trace(m_archive); 1544 visitor->trace(m_archive);
1545 visitor->trace(m_loaders); 1545 visitor->trace(m_loaders);
1546 visitor->trace(m_nonBlockingLoaders); 1546 visitor->trace(m_nonBlockingLoaders);
1547 visitor->trace(m_documentResources); 1547 visitor->trace(m_documentResources);
1548 visitor->trace(m_preloads); 1548 visitor->trace(m_preloads);
1549 visitor->trace(m_resourceTimingInfoMap); 1549 visitor->trace(m_resourceTimingInfoMap);
1550 } 1550 }
1551 1551
1552 } // namespace blink 1552 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698