⚠ Archived content — this site is no longer maintained.   Current WebKit documentation is at docs.webkit.org.

Changeset 169082 in webkit


Ignore:
Timestamp:
May 19, 2014, 4:45:54 PM (12 years ago)
Author:
achristensen@apple.com
Message:

Collect web timing data on iOS.
​https://bugs.webkit.org/show_bug.cgi?id=133075

Reviewed by Sam Weinig.

  • platform/network/ResourceHandle.h:

Added setCollectsTimingData wrapper and getConnectionTimingData declarations.
getConnectionTimingData with a dictionary parameter is a private helper function.

  • platform/network/cf/ResourceHandleCFNet.cpp:

(WebCore::ResourceHandle::start):
Call setCollectsTimingData wrapper when creating a connection to ensure that timing data is collected.

  • platform/network/cf/ResourceHandleCFURLConnectionDelegate.cpp:

(WebCore::ResourceHandleCFURLConnectionDelegate::didReceiveResponseCallback):

  • platform/network/cf/ResourceHandleCFURLConnectionDelegate.h:
  • platform/network/cf/ResourceHandleCFURLConnectionDelegateWithOperationQueue.cpp:

(WebCore::ResourceHandleCFURLConnectionDelegateWithOperationQueue::didReceiveResponse):

  • platform/network/cf/ResourceHandleCFURLConnectionDelegateWithOperationQueue.h:
  • platform/network/cf/SynchronousResourceHandleCFURLConnectionDelegate.cpp:

(WebCore::SynchronousResourceHandleCFURLConnectionDelegate::didReceiveResponse):

  • platform/network/cf/SynchronousResourceHandleCFURLConnectionDelegate.h:

Pass the CFURLConnectionRef to didReceiveResponse to get timing data from.

  • platform/network/mac/ResourceHandleMac.mm:

(WebCore::ResourceHandle::getConnectionTimingData):
Moved from getTimingData to compile regardless of using CFNetwork and added wrapper with CFDictionaryRef.
(WebCore::ResourceHandle::setCollectsTimingData):
Added wrapper to call objc function from c++.
(WebCore::ResourceHandle::getTimingData):
Renamed to getConnectionTimingData.

  • platform/network/mac/WebCoreResourceHandleAsDelegate.mm:

(-[WebCoreResourceHandleAsDelegate connection:didReceiveResponse:]):

  • platform/network/mac/WebCoreResourceHandleAsOperationQueueDelegate.mm:

(-[WebCoreResourceHandleAsOperationQueueDelegate connection:didReceiveResponse:]):
Updated function name from getTimingData to getConnectionTimingData.

Location:
trunk/Source/WebCore
Files:
12 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r169081 r169082  
     12014-05-19  Alex Christensen  <achristensen@webkit.org>
     2
     3        Collect web timing data on iOS.
     4        https://bugs.webkit.org/show_bug.cgi?id=133075
     5
     6        Reviewed by Sam Weinig.
     7
     8        * platform/network/ResourceHandle.h:
     9        Added setCollectsTimingData wrapper and getConnectionTimingData declarations.
     10        getConnectionTimingData with a dictionary parameter is a private helper function.
     11        * platform/network/cf/ResourceHandleCFNet.cpp:
     12        (WebCore::ResourceHandle::start):
     13        Call setCollectsTimingData wrapper when creating a connection to ensure that timing data is collected.
     14        * platform/network/cf/ResourceHandleCFURLConnectionDelegate.cpp:
     15        (WebCore::ResourceHandleCFURLConnectionDelegate::didReceiveResponseCallback):
     16        * platform/network/cf/ResourceHandleCFURLConnectionDelegate.h:
     17        * platform/network/cf/ResourceHandleCFURLConnectionDelegateWithOperationQueue.cpp:
     18        (WebCore::ResourceHandleCFURLConnectionDelegateWithOperationQueue::didReceiveResponse):
     19        * platform/network/cf/ResourceHandleCFURLConnectionDelegateWithOperationQueue.h:
     20        * platform/network/cf/SynchronousResourceHandleCFURLConnectionDelegate.cpp:
     21        (WebCore::SynchronousResourceHandleCFURLConnectionDelegate::didReceiveResponse):
     22        * platform/network/cf/SynchronousResourceHandleCFURLConnectionDelegate.h:
     23        Pass the CFURLConnectionRef to didReceiveResponse to get timing data from.
     24        * platform/network/mac/ResourceHandleMac.mm:
     25        (WebCore::ResourceHandle::getConnectionTimingData):
     26        Moved from getTimingData to compile regardless of using CFNetwork and added wrapper with CFDictionaryRef.
     27        (WebCore::ResourceHandle::setCollectsTimingData):
     28        Added wrapper to call objc function from c++.
     29        (WebCore::ResourceHandle::getTimingData):
     30        Renamed to getConnectionTimingData.
     31        * platform/network/mac/WebCoreResourceHandleAsDelegate.mm:
     32        (-[WebCoreResourceHandleAsDelegate connection:didReceiveResponse:]):
     33        * platform/network/mac/WebCoreResourceHandleAsOperationQueueDelegate.mm:
     34        (-[WebCoreResourceHandleAsOperationQueueDelegate connection:didReceiveResponse:]):
     35        Updated function name from getTimingData to getConnectionTimingData.
     36
    1372014-05-19  Chris Fleizach  <cfleizach@apple.com>
    238
  • trunk/Source/WebCore/platform/network/ResourceHandle.h

    r168909 r169082  
    132132    void didCancelAuthenticationChallenge(const AuthenticationChallenge&);
    133133    NSURLConnection *connection() const;
    134     static void getTimingData(NSURLConnection*, ResourceLoadTiming&);
    135134    id makeDelegate(bool);
    136135    id delegate();
    137136    void releaseDelegate();
    138137#endif
    139 
     138       
     139#if PLATFORM(COCOA) && ENABLE(WEB_TIMING)
     140#if USE(CFNETWORK)
     141    void setCollectsTimingData();
     142    static void getConnectionTimingData(CFURLConnectionRef, ResourceLoadTiming&);
     143#else
     144    static void getConnectionTimingData(NSURLConnection *, ResourceLoadTiming&);
     145#endif
     146#endif
     147       
    140148#if PLATFORM(COCOA)
    141149    void schedule(WTF::SchedulePair&);
    … …  
    290298#endif
    291299
     300#if PLATFORM(COCOA) && ENABLE(WEB_TIMING)
     301static void getConnectionTimingData(NSDictionary *timingData, ResourceLoadTiming&);
     302#endif
     303
    292304    friend class ResourceHandleInternal;
    293305    OwnPtr<ResourceHandleInternal> d;
  • trunk/Source/WebCore/platform/network/cf/ResourceHandleCFNet.cpp

    r168504 r169082  
    255255
    256256    LOG(Network, "CFNet - Starting URL %s (handle=%p, conn=%p)", firstRequest().url().string().utf8().data(), this, d->m_connection.get());
    257 
     257   
     258#if ENABLE(WEB_TIMING)
     259    setCollectsTimingData();
     260#endif
     261   
    258262    return true;
    259263}
  • trunk/Source/WebCore/platform/network/cf/ResourceHandleCFURLConnectionDelegate.cpp

    r165676 r169082  
    6262}
    6363
    64 void ResourceHandleCFURLConnectionDelegate::didReceiveResponseCallback(CFURLConnectionRef, CFURLResponseRef cfResponse, const void* clientInfo)
    65 {
    66     static_cast<ResourceHandleCFURLConnectionDelegate*>(const_cast<void*>(clientInfo))->didReceiveResponse(cfResponse);
     64void ResourceHandleCFURLConnectionDelegate::didReceiveResponseCallback(CFURLConnectionRef connection, CFURLResponseRef cfResponse, const void* clientInfo)
     65{
     66    static_cast<ResourceHandleCFURLConnectionDelegate*>(const_cast<void*>(clientInfo))->didReceiveResponse(connection, cfResponse);
    6767}
    6868
  • trunk/Source/WebCore/platform/network/cf/ResourceHandleCFURLConnectionDelegate.h

    r168248 r169082  
    7777
    7878    virtual CFURLRequestRef willSendRequest(CFURLRequestRef, CFURLResponseRef) = 0;
    79     virtual void didReceiveResponse(CFURLResponseRef) = 0;
     79    virtual void didReceiveResponse(CFURLConnectionRef, CFURLResponseRef) = 0;
    8080    virtual void didReceiveData(CFDataRef, CFIndex originalLength) = 0;
    8181    virtual void didFinishLoading() = 0;
  • trunk/Source/WebCore/platform/network/cf/ResourceHandleCFURLConnectionDelegateWithOperationQueue.cpp

    r168248 r169082  
    109109}
    110110
    111 void ResourceHandleCFURLConnectionDelegateWithOperationQueue::didReceiveResponse(CFURLResponseRef cfResponse)
     111void ResourceHandleCFURLConnectionDelegateWithOperationQueue::didReceiveResponse(CFURLConnectionRef connection, CFURLResponseRef cfResponse)
    112112{
    113113    RefPtr<ResourceHandleCFURLConnectionDelegateWithOperationQueue> protector(this);
    … …  
    132132            wkSetCFURLResponseMIMEType(cfResponse, CFSTR("text/html"));
    133133#endif // !PLATFORM(IOS)
    134 
    135         m_handle->client()->didReceiveResponseAsync(m_handle, cfResponse);
     134       
     135        ResourceResponse resourceResponse(cfResponse);
     136#if ENABLE(WEB_TIMING)
     137        ResourceHandle::getConnectionTimingData(connection, resourceResponse.resourceLoadTiming());
     138#else
     139        UNUSED_PARAM(connection);
     140#endif
     141       
     142        m_handle->client()->didReceiveResponseAsync(m_handle, resourceResponse);
    136143    });
    137144    dispatch_semaphore_wait(m_semaphore, DISPATCH_TIME_FOREVER);
  • trunk/Source/WebCore/platform/network/cf/ResourceHandleCFURLConnectionDelegateWithOperationQueue.h

    r168248 r169082  
    4848
    4949    virtual CFURLRequestRef willSendRequest(CFURLRequestRef, CFURLResponseRef) override;
    50     virtual void didReceiveResponse(CFURLResponseRef) override;
     50    virtual void didReceiveResponse(CFURLConnectionRef, CFURLResponseRef) override;
    5151    virtual void didReceiveData(CFDataRef, CFIndex originalLength) override;
    5252    virtual void didFinishLoading() override;
  • trunk/Source/WebCore/platform/network/cf/SynchronousResourceHandleCFURLConnectionDelegate.cpp

    r168248 r169082  
    112112#endif // !PLATFORM(COCOA)
    113113
    114 void SynchronousResourceHandleCFURLConnectionDelegate::didReceiveResponse(CFURLResponseRef cfResponse)
     114void SynchronousResourceHandleCFURLConnectionDelegate::didReceiveResponse(CFURLConnectionRef connection, CFURLResponseRef cfResponse)
    115115{
    116116    LOG(Network, "CFNet - SynchronousResourceHandleCFURLConnectionDelegate::didReceiveResponse(handle=%p) (%s)", m_handle, m_handle->firstRequest().url().string().utf8().data());
    … …  
    144144        cfResponse = m_handle->quickLookHandle()->cfResponse();
    145145#endif
    146 
    147     m_handle->client()->didReceiveResponse(m_handle, cfResponse);
     146   
     147    ResourceResponse resourceResponse(cfResponse);
     148#if ENABLE(WEB_TIMING)
     149    ResourceHandle::getConnectionTimingData(connection, resourceResponse.resourceLoadTiming());
     150#else
     151    UNUSED_PARAM(connection);
     152#endif
     153   
     154    m_handle->client()->didReceiveResponse(m_handle, resourceResponse);
    148155}
    149156
  • trunk/Source/WebCore/platform/network/cf/SynchronousResourceHandleCFURLConnectionDelegate.h

    r168248 r169082  
    4949
    5050    virtual CFURLRequestRef willSendRequest(CFURLRequestRef, CFURLResponseRef) override;
    51     virtual void didReceiveResponse(CFURLResponseRef) override;
     51    virtual void didReceiveResponse(CFURLConnectionRef, CFURLResponseRef) override;
    5252    virtual CFCachedURLResponseRef willCacheResponse(CFCachedURLResponseRef) override;
    5353    virtual void didReceiveChallenge(CFURLAuthChallengeRef) override;
  • trunk/Source/WebCore/platform/network/mac/ResourceHandleMac.mm

    r168858 r169082  
    2626#import "config.h"
    2727#import "ResourceHandleInternal.h"
    28 
    29 #if !USE(CFNETWORK)
    3028
    3129#import "AuthenticationChallenge.h"
    … …  
    8886
    8987namespace WebCore {
    90 
     88   
     89#if !USE(CFNETWORK)
     90   
    9191static void applyBasicAuthorizationHeader(ResourceRequest& request, const Credential& credential)
    9292{
    … …  
    369369{
    370370    return d->m_connection.get();
    371 }
    372    
    373 void ResourceHandle::getTimingData(NSURLConnection *connection, ResourceLoadTiming& timing)
    374 {
    375 #if ENABLE(WEB_TIMING)
    376     if (NSDictionary *timingData = [connection _timingData]) {
    377         // This is not the navigationStart time in monotonic time, but the other times are relative to this time
    378         // and only the differences between times are stored.
    379         double referenceStart = [[timingData valueForKey:@"_kCFNTimingDataTimingDataInit"] doubleValue];
    380        
    381         double domainLookupStart = [[timingData valueForKey:@"_kCFNTimingDataDomainLookupStart"] doubleValue];
    382         double domainLookupEnd = [[timingData valueForKey:@"_kCFNTimingDataDomainLookupEnd"] doubleValue];
    383         double connectStart = [[timingData valueForKey:@"_kCFNTimingDataConnectStart"] doubleValue];
    384         double secureConnectionStart = [[timingData valueForKey:@"_kCFNTimingDataSecureConnectionStart"] doubleValue];
    385         double connectEnd = [[timingData valueForKey:@"_kCFNTimingDataConnectEnd"] doubleValue];
    386         double requestStart = [[timingData valueForKey:@"_kCFNTimingDataRequestStart"] doubleValue];
    387         double responseStart = [[timingData valueForKey:@"_kCFNTimingDataResponseStart"] doubleValue];
    388        
    389         timing.domainLookupStart = domainLookupStart <= 0 ? -1 : (domainLookupStart - referenceStart) * 1000;
    390         timing.domainLookupEnd = domainLookupEnd <= 0 ? -1 : (domainLookupEnd - referenceStart) * 1000;
    391         timing.connectStart = connectStart <= 0 ? -1 : (connectStart - referenceStart) * 1000;
    392         timing.secureConnectionStart = secureConnectionStart <= 0 ? -1 : (secureConnectionStart - referenceStart) * 1000;
    393         timing.connectEnd = connectEnd <= 0 ? -1 : (connectEnd - referenceStart) * 1000;
    394         timing.requestStart = requestStart <= 0 ? -1 : (requestStart - referenceStart) * 1000;
    395         timing.responseStart = responseStart <= 0 ? -1 : (responseStart - referenceStart) * 1000;
    396     }
    397 #else
    398     UNUSED_PARAM(connection);
    399     UNUSED_PARAM(timing);
    400 #endif
    401371}
    402372   
    … …  
    736706    [(id)delegate() continueWillCacheResponse:response];
    737707}
    738 
     708   
     709#endif // !USE(CFNETWORK)
     710   
     711#if ENABLE(WEB_TIMING)
     712   
     713void ResourceHandle::getConnectionTimingData(NSDictionary *timingData, ResourceLoadTiming& timing)
     714{
     715    if (!timingData)
     716        return;
     717
     718    // This is not the navigationStart time in monotonic time, but the other times are relative to this time
     719    // and only the differences between times are stored.
     720    double referenceStart = [[timingData valueForKey:@"_kCFNTimingDataTimingDataInit"] doubleValue];
     721           
     722    double domainLookupStart = [[timingData valueForKey:@"_kCFNTimingDataDomainLookupStart"] doubleValue];
     723    double domainLookupEnd = [[timingData valueForKey:@"_kCFNTimingDataDomainLookupEnd"] doubleValue];
     724    double connectStart = [[timingData valueForKey:@"_kCFNTimingDataConnectStart"] doubleValue];
     725    double secureConnectionStart = [[timingData valueForKey:@"_kCFNTimingDataSecureConnectionStart"] doubleValue];
     726    double connectEnd = [[timingData valueForKey:@"_kCFNTimingDataConnectEnd"] doubleValue];
     727    double requestStart = [[timingData valueForKey:@"_kCFNTimingDataRequestStart"] doubleValue];
     728    double responseStart = [[timingData valueForKey:@"_kCFNTimingDataResponseStart"] doubleValue];
     729       
     730    timing.domainLookupStart = domainLookupStart <= 0 ? -1 : (domainLookupStart - referenceStart) * 1000;
     731    timing.domainLookupEnd = domainLookupEnd <= 0 ? -1 : (domainLookupEnd - referenceStart) * 1000;
     732    timing.connectStart = connectStart <= 0 ? -1 : (connectStart - referenceStart) * 1000;
     733    timing.secureConnectionStart = secureConnectionStart <= 0 ? -1 : (secureConnectionStart - referenceStart) * 1000;
     734    timing.connectEnd = connectEnd <= 0 ? -1 : (connectEnd - referenceStart) * 1000;
     735    timing.requestStart = requestStart <= 0 ? -1 : (requestStart - referenceStart) * 1000;
     736    timing.responseStart = responseStart <= 0 ? -1 : (responseStart - referenceStart) * 1000;
     737}
     738   
     739#if USE(CFNETWORK)
     740   
     741void ResourceHandle::setCollectsTimingData()
     742{
     743    [NSURLConnection _setCollectsTimingData:YES];
     744}
     745   
     746void ResourceHandle::getConnectionTimingData(CFURLConnectionRef connection, ResourceLoadTiming& timing)
     747{
     748    getConnectionTimingData((__bridge NSDictionary*)(adoptCF(_CFURLConnectionCopyTimingData(connection)).get()), timing);
     749}
     750   
     751#else
     752   
     753void ResourceHandle::getConnectionTimingData(NSURLConnection *connection, ResourceLoadTiming& timing)
     754{
     755    getConnectionTimingData([connection _timingData], timing);
     756}
     757   
     758#endif
     759   
     760#endif // ENABLE(WEB_TIMING)
    739761
    740762} // namespace WebCore
    741763
    742 #endif // !USE(CFNETWORK)
  • trunk/Source/WebCore/platform/network/mac/WebCoreResourceHandleAsDelegate.mm

    r168849 r169082  
    173173    ResourceResponse resourceResponse(r);
    174174#if ENABLE(WEB_TIMING)
    175     ResourceHandle::getTimingData(connection, resourceResponse.resourceLoadTiming());
     175    ResourceHandle::getConnectionTimingData(connection, resourceResponse.resourceLoadTiming());
    176176#else
    177177    UNUSED_PARAM(connection);
  • trunk/Source/WebCore/platform/network/mac/WebCoreResourceHandleAsOperationQueueDelegate.mm

    r168849 r169082  
    215215        ResourceResponse resourceResponse(r);
    216216#if ENABLE(WEB_TIMING)
    217         ResourceHandle::getTimingData(connection, resourceResponse.resourceLoadTiming());
     217        ResourceHandle::getConnectionTimingData(connection, resourceResponse.resourceLoadTiming());
    218218#else
    219219        UNUSED_PARAM(connection);
Note: See TracChangeset for help on using the changeset viewer.