Changeset 200887 in webkit


Ignore:
Timestamp:
May 13, 2016 3:34:29 PM (8 years ago)
Author:
yoav@yoav.ws
Message:

ResourceTiming entries for cached resources and XHR
https://bugs.webkit.org/show_bug.cgi?id=157669

Reviewed by Alex Christensen.

Source/WebCore:

  • Moves the ResourceTiming storage and addition logic into its own class, so that it can be accessed by both CachedResourceLoader and DocumentThreadableLoader.
  • Using the above, adds ResourceTiming collection into DocumentThreadableLoader, in order to support ResourceTiming entries for XHR based requests.
  • Adds ResourceTiming entries for resources that are reused from the memory cache.

Test: http/tests/performance/performance-resource-timing-cached-entries.html

  • CMakeLists.txt: Add ResourceTimingInformation.
  • WebCore.xcodeproj/project.pbxproj: Add ResourceTimingInformation.
  • loader/DocumentThreadableLoader.cpp:

(WebCore::DocumentThreadableLoader::didFinishLoading): Add a call to addResourceTiming.
(WebCore::DocumentThreadableLoader::loadRequest): Store the initiator information.

  • loader/DocumentThreadableLoader.h:
  • loader/ResourceTimingInformation.cpp: Added.

(WebCore::ResourceTimingInformation::addResourceTiming): Moved addResourceTiming logic from CachedResourceLoader.
(WebCore::ResourceTimingInformation::storeResourceTimingInitiatorInformation): Moved addResourceTiming logic from
CachedResourceLoader. Removed reliance on the committingFirstRealLoad bool when storing initiator info, as I don't
see why it is required, and it made no sense in the context of DocumentThreadableLoader.

  • loader/ResourceTimingInformation.h: Added.
  • loader/cache/CachedResourceLoader.cpp:

(WebCore::CachedResourceLoader::requestResource): Add a ResourceTiming entry when a resource is reused from MemoryCache.
(WebCore::CachedResourceLoader::revalidateResource): Use ResourceTimingInformation::storeResourceTimingInitiatorInformation.
(WebCore::CachedResourceLoader::loadResource): Use ResourceTimingInformation::storeResourceTimingInitiatorInformation.
(WebCore::CachedResourceLoader::loadDone): Use ResourceTimingInformation::addResourceTiming.
(WebCore::CachedResourceLoader::storeResourceTimingInitiatorInformation): Deleted.

  • loader/cache/CachedResourceLoader.h:

LayoutTests:

These tests make sure that cacheable resources as well as XHR based resources
have ResourceTiming entries.

  • http/tests/performance/performance-resource-timing-cached-entries-expected.txt: Added.
  • http/tests/performance/performance-resource-timing-cached-entries.html: Added.
Location:
trunk
Files:
4 added
8 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r200879 r200887  
     12016-05-13  Yoav Weiss  <yoav@yoav.ws>
     2
     3        ResourceTiming entries for cached resources and XHR
     4        https://bugs.webkit.org/show_bug.cgi?id=157669
     5
     6        Reviewed by Alex Christensen.
     7
     8        These tests make sure that cacheable resources as well as XHR based resources
     9        have ResourceTiming entries.
     10
     11        * http/tests/performance/performance-resource-timing-cached-entries-expected.txt: Added.
     12        * http/tests/performance/performance-resource-timing-cached-entries.html: Added.
     13
    1142016-05-13  Mark Lam  <mark.lam@apple.com>
    215
  • trunk/Source/WebCore/CMakeLists.txt

    r200638 r200887  
    19321932    loader/ResourceLoadStatisticsStore.cpp
    19331933    loader/ResourceLoader.cpp
     1934    loader/ResourceTimingInformation.cpp
    19341935    loader/SinkDocument.cpp
    19351936    loader/SubframeLoader.cpp
  • trunk/Source/WebCore/ChangeLog

    r200876 r200887  
     12016-05-13  Yoav Weiss  <yoav@yoav.ws>
     2
     3        ResourceTiming entries for cached resources and XHR
     4        https://bugs.webkit.org/show_bug.cgi?id=157669
     5
     6        Reviewed by Alex Christensen.
     7
     8         - Moves the ResourceTiming storage and addition logic into its own class, so that it
     9           can be accessed by both CachedResourceLoader and DocumentThreadableLoader.
     10         - Using the above, adds ResourceTiming collection into DocumentThreadableLoader,
     11           in order to support ResourceTiming entries for XHR based requests.
     12         - Adds ResourceTiming entries for resources that are reused from the memory cache.
     13
     14        Test: http/tests/performance/performance-resource-timing-cached-entries.html
     15
     16        * CMakeLists.txt: Add ResourceTimingInformation.
     17        * WebCore.xcodeproj/project.pbxproj: Add ResourceTimingInformation.
     18        * loader/DocumentThreadableLoader.cpp:
     19        (WebCore::DocumentThreadableLoader::didFinishLoading): Add a call to addResourceTiming.
     20        (WebCore::DocumentThreadableLoader::loadRequest): Store the initiator information.
     21        * loader/DocumentThreadableLoader.h:
     22        * loader/ResourceTimingInformation.cpp: Added.
     23        (WebCore::ResourceTimingInformation::addResourceTiming): Moved addResourceTiming logic from CachedResourceLoader.
     24        (WebCore::ResourceTimingInformation::storeResourceTimingInitiatorInformation): Moved addResourceTiming logic from
     25        CachedResourceLoader. Removed reliance on the committingFirstRealLoad bool when storing initiator info, as I don't
     26        see why it is required, and it made no sense in the context of DocumentThreadableLoader.
     27        * loader/ResourceTimingInformation.h: Added.
     28        * loader/cache/CachedResourceLoader.cpp:
     29        (WebCore::CachedResourceLoader::requestResource): Add a ResourceTiming entry when a resource is reused from MemoryCache.
     30        (WebCore::CachedResourceLoader::revalidateResource): Use ResourceTimingInformation::storeResourceTimingInitiatorInformation.
     31        (WebCore::CachedResourceLoader::loadResource): Use ResourceTimingInformation::storeResourceTimingInitiatorInformation.
     32        (WebCore::CachedResourceLoader::loadDone): Use ResourceTimingInformation::addResourceTiming.
     33        (WebCore::CachedResourceLoader::storeResourceTimingInitiatorInformation): Deleted.
     34        * loader/cache/CachedResourceLoader.h:
     35
    1362016-05-13  Doug Russell  <d_russell@apple.com>
    237
  • trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj

    r200866 r200887  
    60086008                CB38FD5B1CD2325B00592A3F /* JSPerformanceResourceTiming.h in Headers */ = {isa = PBXBuildFile; fileRef = CB38FD591CD2314500592A3F /* JSPerformanceResourceTiming.h */; };
    60096009                CB8CF0181A9358D4000D510B /* Microtasks.cpp in Sources */ = {isa = PBXBuildFile; fileRef = CB8CF0151A934B43000D510B /* Microtasks.cpp */; };
     6010                CBC2D22F1CE5B89D00D1880B /* ResourceTimingInformation.cpp in Sources */ = {isa = PBXBuildFile; fileRef = CBC2D22D1CE5B77400D1880B /* ResourceTimingInformation.cpp */; };
     6011                CBC2D2301CE5B8A100D1880B /* ResourceTimingInformation.h in Headers */ = {isa = PBXBuildFile; fileRef = CBC2D22E1CE5B77D00D1880B /* ResourceTimingInformation.h */; settings = {ATTRIBUTES = (Private, ); }; };
    60106012                CCC2B51415F613060048CDD6 /* DeviceClient.h in Headers */ = {isa = PBXBuildFile; fileRef = CCC2B51015F613060048CDD6 /* DeviceClient.h */; settings = {ATTRIBUTES = (Private, ); }; };
    60116013                CCC2B51515F613060048CDD6 /* DeviceController.cpp in Sources */ = {isa = PBXBuildFile; fileRef = CCC2B51115F613060048CDD6 /* DeviceController.cpp */; };
     
    1398913991                CB38FD591CD2314500592A3F /* JSPerformanceResourceTiming.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSPerformanceResourceTiming.h; sourceTree = "<group>"; };
    1399013992                CB8CF0151A934B43000D510B /* Microtasks.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Microtasks.cpp; sourceTree = "<group>"; };
     13993                CBC2D22D1CE5B77400D1880B /* ResourceTimingInformation.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ResourceTimingInformation.cpp; sourceTree = "<group>"; };
     13994                CBC2D22E1CE5B77D00D1880B /* ResourceTimingInformation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ResourceTimingInformation.h; sourceTree = "<group>"; };
    1399113995                CCC2B51015F613060048CDD6 /* DeviceClient.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DeviceClient.h; sourceTree = "<group>"; };
    1399213996                CCC2B51115F613060048CDD6 /* DeviceController.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = DeviceController.cpp; sourceTree = "<group>"; };
     
    2282022824                                7A7CC8361C87506800366243 /* ResourceLoadStatisticsStore.cpp */,
    2282122825                                7A7CC8371C87506800366243 /* ResourceLoadStatisticsStore.h */,
     22826                                CBC2D22D1CE5B77400D1880B /* ResourceTimingInformation.cpp */,
     22827                                CBC2D22E1CE5B77D00D1880B /* ResourceTimingInformation.h */,
    2282222828                                51327D5F11A33A2B004F9D65 /* SinkDocument.cpp */,
    2282322829                                51327D5E11A33A2B004F9D65 /* SinkDocument.h */,
     
    2824528251                                B2227A7D0D00BF220071B782 /* SVGPathSegLinetoVertical.h in Headers */,
    2824628252                                83C1D433178D5AB500141E68 /* SVGPathSegLinetoVerticalAbs.h in Headers */,
     28253                                CBC2D2301CE5B8A100D1880B /* ResourceTimingInformation.h in Headers */,
    2824728254                                83C1D434178D5AB500141E68 /* SVGPathSegLinetoVerticalRel.h in Headers */,
    2824828255                                B2227A810D00BF220071B782 /* SVGPathSegList.h in Headers */,
     
    3210632113                                D7613A501474F13F00DB8606 /* WebKitNamedFlow.cpp in Sources */,
    3210732114                                7C48A6D0191C9D6500026674 /* WebKitNamespace.cpp in Sources */,
     32115                                CBC2D22F1CE5B89D00D1880B /* ResourceTimingInformation.cpp in Sources */,
    3210832116                                A5DEBDA316FB908700836FE0 /* WebKitPlaybackTargetAvailabilityEvent.cpp in Sources */,
    3210932117                                31C0FF240E4CEB6E007D6FE5 /* WebKitTransitionEvent.cpp in Sources */,
  • trunk/Source/WebCore/loader/DocumentThreadableLoader.cpp

    r200320 r200887  
    326326void DocumentThreadableLoader::didFinishLoading(unsigned long identifier, double finishTime)
    327327{
     328    if (RuntimeEnabledFeatures::sharedFeatures().resourceTimingEnabled())
     329        m_resourceTimingInfo.addResourceTiming(m_resource.get(), &m_document);
     330
    328331    if (m_actualRequest) {
    329332        InspectorInstrumentation::didFinishLoading(m_document.frame(), m_document.frame()->loader().documentLoader(), identifier, finishTime);
     
    391394        ASSERT(!m_resource);
    392395        m_resource = m_document.cachedResourceLoader().requestRawResource(newRequest);
    393         if (m_resource)
     396        if (m_resource) {
    394397            m_resource->addClient(this);
     398
     399            if (RuntimeEnabledFeatures::sharedFeatures().resourceTimingEnabled())
     400                m_resourceTimingInfo.storeResourceTimingInitiatorInformation(m_resource, newRequest, m_document.frame());
     401        }
    395402
    396403        return;
  • trunk/Source/WebCore/loader/DocumentThreadableLoader.h

    r199612 r200887  
    3434#include "CachedRawResourceClient.h"
    3535#include "CachedResourceHandle.h"
     36#include "ResourceTimingInformation.h"
    3637#include "ThreadableLoader.h"
    3738
     
    106107        Document& m_document;
    107108        ThreadableLoaderOptions m_options;
     109        ResourceTimingInformation m_resourceTimingInfo;
    108110        bool m_sameOriginRequest;
    109111        bool m_simpleRequest;
  • trunk/Source/WebCore/loader/cache/CachedResourceLoader.cpp

    r200640 r200887  
    619619        logMemoryCacheResourceRequest(frame(), DiagnosticLoggingKeys::inMemoryCacheKey(), DiagnosticLoggingKeys::usedKey());
    620620        memoryCache.resourceAccessed(*resource);
     621        if (RuntimeEnabledFeatures::sharedFeatures().resourceTimingEnabled()) {
     622            m_resourceTimingInfo.storeResourceTimingInitiatorInformation(resource, request, frame());
     623            m_resourceTimingInfo.addResourceTiming(resource.get(), document());
     624        }
    621625        break;
    622626    }
     
    671675    memoryCache.add(*newResource);
    672676    if (RuntimeEnabledFeatures::sharedFeatures().resourceTimingEnabled())
    673         storeResourceTimingInitiatorInformation(resource, request);
     677        m_resourceTimingInfo.storeResourceTimingInitiatorInformation(resource, request, frame());
    674678    return newResource;
    675679}
     
    687691        resource->setOwningCachedResourceLoader(this);
    688692    if (RuntimeEnabledFeatures::sharedFeatures().resourceTimingEnabled())
    689         storeResourceTimingInitiatorInformation(resource, request);
     693        m_resourceTimingInfo.storeResourceTimingInitiatorInformation(resource, request, frame());
    690694    return resource;
    691 }
    692 
    693 void CachedResourceLoader::storeResourceTimingInitiatorInformation(const CachedResourceHandle<CachedResource>& resource, const CachedResourceRequest& request)
    694 {
    695     ASSERT(RuntimeEnabledFeatures::sharedFeatures().resourceTimingEnabled());
    696     if (resource->type() == CachedResource::MainResource) {
    697         // <iframe>s should report the initial navigation requested by the parent document, but not subsequent navigations.
    698         if (frame()->ownerElement() && m_documentLoader->frameLoader()->stateMachine().committingFirstRealLoad()) {
    699             InitiatorInfo info = { frame()->ownerElement()->localName(), monotonicallyIncreasingTime() };
    700             m_initiatorMap.add(resource.get(), info);
    701         }
    702     } else {
    703         InitiatorInfo info = { request.initiatorName(), monotonicallyIncreasingTime() };
    704         m_initiatorMap.add(resource.get(), info);
    705     }
    706695}
    707696
     
    971960
    972961#if ENABLE(WEB_TIMING)
    973     if (RuntimeEnabledFeatures::sharedFeatures().resourceTimingEnabled()
    974         && resource && resource->response().isHTTP()
    975         && ((!resource->errorOccurred() && !resource->wasCanceled()) || resource->response().httpStatusCode() == 304)) {
    976         HashMap<CachedResource*, InitiatorInfo>::iterator initiatorIt = m_initiatorMap.find(resource);
    977         if (initiatorIt != m_initiatorMap.end()) {
    978             ASSERT(document());
    979             Document* initiatorDocument = document();
    980             if (resource->type() == CachedResource::MainResource)
    981                 initiatorDocument = document()->parentDocument();
    982             ASSERT(initiatorDocument);
    983             const InitiatorInfo& info = initiatorIt->value;
    984             initiatorDocument->domWindow()->performance()->addResourceTiming(info.name, initiatorDocument, resource->resourceRequest(), resource->response(), info.startTime, resource->loadFinishTime());
    985             m_initiatorMap.remove(initiatorIt);
    986         }
    987     }
     962    if (RuntimeEnabledFeatures::sharedFeatures().resourceTimingEnabled())
     963        m_resourceTimingInfo.addResourceTiming(resource, document());
    988964#else
    989965    UNUSED_PARAM(resource);
  • trunk/Source/WebCore/loader/cache/CachedResourceLoader.h

    r200320 r200887  
    3232#include "CachedResourceRequest.h"
    3333#include "ResourceLoadPriority.h"
     34#include "ResourceTimingInformation.h"
    3435#include "Timer.h"
    3536#include <wtf/Deque.h>
     
    145146    CachedResourceHandle<CachedResource> revalidateResource(const CachedResourceRequest&, CachedResource*);
    146147    CachedResourceHandle<CachedResource> loadResource(CachedResource::Type, CachedResourceRequest&);
    147     void storeResourceTimingInitiatorInformation(const CachedResourceHandle<CachedResource>&, const CachedResourceRequest&);
    148148    void requestPreload(CachedResource::Type, CachedResourceRequest&, const String& charset);
    149149
     
    178178    Timer m_garbageCollectDocumentResourcesTimer;
    179179
    180     struct InitiatorInfo {
    181         AtomicString name;
    182         double startTime;
    183     };
    184     HashMap<CachedResource*, InitiatorInfo> m_initiatorMap;
     180    ResourceTimingInformation m_resourceTimingInfo;
    185181
    186182    // 29 bits left
Note: See TracChangeset for help on using the changeset viewer.