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

Changeset 277493 in webkit


Ignore:
Timestamp:
May 14, 2021, 9:56:47 AM (5 years ago)
Author:
achristensen@apple.com
Message:

Resource Timing: secureConnectionStart == 0 when a connection is re-used
​https://bugs.webkit.org/show_bug.cgi?id=225733

Reviewed by Chris Dumez.

LayoutTests/imported/w3c:

  • web-platform-tests/resource-timing/resource_connection_reuse_mixed_content-expected.txt:

Source/WebCore:

Covered by a newly-passing web platform test, which was already passed by Chrome and Firefox.

  • page/PerformanceResourceTiming.cpp:

(WebCore::PerformanceResourceTiming::secureConnectionStart const):

  • platform/network/NetworkLoadMetrics.h:

I use a sentinel value to distinguish no secure connection from a reused secure connection.

  • platform/network/ResourceHandle.h:
  • platform/network/cocoa/NetworkLoadMetrics.mm:

(WebCore::packageTimingData):
(WebCore::copyTimingData):
Introduce a way to get timing data from CFNetwork using a more modern API.
(WebCore::timingValue): Deleted.

  • platform/network/cocoa/WebCoreNSURLSession.mm:

(-[WebCoreNSURLSessionDataTask _timingData]):

  • platform/network/mac/ResourceHandleMac.mm:

(WebCore::ResourceHandle::getConnectionTimingData): Deleted.

  • platform/network/mac/WebCoreResourceHandleAsOperationQueueDelegate.mm:

(-[WebCoreResourceHandleAsOperationQueueDelegate connection:didReceiveResponse:]):

Source/WebKit:

  • NetworkProcess/cocoa/NetworkSessionCocoa.mm:

(-[WKNetworkSessionDelegate URLSession:dataTask:didReceiveResponse:completionHandler:]):

LayoutTests:

Location:
trunk
Files:
14 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r277488 r277493  
     12021-05-14  Alex Christensen  <achristensen@webkit.org>
     2
     3        Resource Timing: secureConnectionStart == 0 when a connection is re-used
     4        https://bugs.webkit.org/show_bug.cgi?id=225733
     5
     6        Reviewed by Chris Dumez.
     7
     8        * TestExpectations:
     9
    1102021-05-14  Amir Mark Jr  <amir_mark@apple.com>
    211
  • trunk/LayoutTests/TestExpectations

    r277468 r277493  
    941941imported/w3c/web-platform-tests/resource-timing/crossorigin-sandwich-TAO.sub.html [ Pass Failure ]
    942942imported/w3c/web-platform-tests/resource-timing/crossorigin-sandwich-partial-TAO.sub.html [ Pass Failure ]
    943 imported/w3c/web-platform-tests/resource-timing/resource_connection_reuse_mixed_content.html [ Pass Failure ]
    944943
    945944imported/w3c/web-platform-tests/mediacapture-streams/MediaStream-default-feature-policy.https.html [ DumpJSConsoleLogInStdErr ]
  • trunk/LayoutTests/imported/w3c/ChangeLog

    r277468 r277493  
     12021-05-14  Alex Christensen  <achristensen@webkit.org>
     2
     3        Resource Timing: secureConnectionStart == 0 when a connection is re-used
     4        https://bugs.webkit.org/show_bug.cgi?id=225733
     5
     6        Reviewed by Chris Dumez.
     7
     8        * web-platform-tests/resource-timing/resource_connection_reuse_mixed_content-expected.txt:
     9
    1102021-05-13  Dean Jackson  <dino@apple.com>
    211
  • trunk/LayoutTests/imported/w3c/web-platform-tests/resource-timing/resource_connection_reuse_mixed_content-expected.txt

    r267647 r277493  
    99PASS connectStart and fetchStart should be the same
    1010PASS connectEnd and fetchStart should be the same
    11 FAIL secureConnectionStart and fetchStart should be the same assert_equals: secureConnectionStart and fetchStart should be the same expected 0 but got 18.000000000000004
     11PASS secureConnectionStart and fetchStart should be the same
    1212PASS domainLookupStart and fetchStart should be the same
    1313PASS domainLookupEnd and fetchStart should be the same
  • trunk/Source/WebCore/ChangeLog

    r277492 r277493  
     12021-05-14  Alex Christensen  <achristensen@webkit.org>
     2
     3        Resource Timing: secureConnectionStart == 0 when a connection is re-used
     4        https://bugs.webkit.org/show_bug.cgi?id=225733
     5
     6        Reviewed by Chris Dumez.
     7
     8        Covered by a newly-passing web platform test, which was already passed by Chrome and Firefox.
     9
     10        * page/PerformanceResourceTiming.cpp:
     11        (WebCore::PerformanceResourceTiming::secureConnectionStart const):
     12        * platform/network/NetworkLoadMetrics.h:
     13        I use a sentinel value to distinguish no secure connection from a reused secure connection.
     14        * platform/network/ResourceHandle.h:
     15        * platform/network/cocoa/NetworkLoadMetrics.mm:
     16        (WebCore::packageTimingData):
     17        (WebCore::copyTimingData):
     18        Introduce a way to get timing data from CFNetwork using a more modern API.
     19        (WebCore::timingValue): Deleted.
     20        * platform/network/cocoa/WebCoreNSURLSession.mm:
     21        (-[WebCoreNSURLSessionDataTask _timingData]):
     22        * platform/network/mac/ResourceHandleMac.mm:
     23        (WebCore::ResourceHandle::getConnectionTimingData): Deleted.
     24        * platform/network/mac/WebCoreResourceHandleAsOperationQueueDelegate.mm:
     25        (-[WebCoreResourceHandleAsOperationQueueDelegate connection:didReceiveResponse:]):
     26
    1272021-05-14  Chris Dumez  <cdumez@apple.com>
    228
  • trunk/Source/WebCore/page/PerformanceResourceTiming.cpp

    r257766 r277493  
    177177        return 0.0;
    178178
     179    if (m_networkLoadMetrics.secureConnectionStart == reusedTLSConnectionSentinel)
     180        return fetchStart();
     181
    179182    if (m_networkLoadMetrics.secureConnectionStart <= 0_ms)
    180183        return 0.0;
  • trunk/Source/WebCore/platform/network/NetworkLoadMetrics.h

    r277038 r277493  
    4747
    4848#if PLATFORM(COCOA)
    49 OBJC_CLASS NSDictionary;
     49OBJC_CLASS NSURLConnection;
     50OBJC_CLASS NSURLResponse;
     51OBJC_CLASS NSURLSessionTaskTransactionMetrics;
    5052#endif
    5153
    … …  
    6062
    6163NETWORK_LOAD_METRICS_ADDITIONS_1;
     64
     65constexpr Seconds reusedTLSConnectionSentinel { -2 };
    6266
    6367class NetworkLoadMetricsWithoutNonTimingData {
    … …  
    197201
    198202#if PLATFORM(COCOA)
    199 WEBCORE_EXPORT Box<NetworkLoadMetrics> copyTimingData(NSDictionary *timingData);
     203Box<NetworkLoadMetrics> copyTimingData(NSURLConnection *, NSURLResponse *);
     204WEBCORE_EXPORT Box<NetworkLoadMetrics> copyTimingData(NSURLSessionTaskTransactionMetrics *incompleteMetrics);
    200205#endif
    201206
  • trunk/Source/WebCore/platform/network/ResourceHandle.h

    r259575 r277493  
    129129
    130130#if PLATFORM(COCOA)
    131 #if USE(CFURLCONNECTION)
    132     static Box<NetworkLoadMetrics> getConnectionTimingData(CFURLConnectionRef);
    133 #else
    134     static Box<NetworkLoadMetrics> getConnectionTimingData(NSURLConnection *);
    135 #endif
    136 #endif
    137 
    138 #if PLATFORM(COCOA)
    139131    void schedule(WTF::SchedulePair&);
    140132    void unschedule(WTF::SchedulePair&);
  • trunk/Source/WebCore/platform/network/cocoa/NetworkLoadMetrics.mm

    r261597 r277493  
    3131namespace WebCore {
    3232
    33 static double timingValue(NSDictionary *timingData, NSString *key)
     33static Box<NetworkLoadMetrics> packageTimingData(double fetchStart, double domainLookupStart, double domainLookupEnd, double connectStart, double secureConnectionStart, double connectEnd, double requestStart, double responseStart, bool reusedTLSConnection, NSString *protocol)
    3434{
    35     if (id object = [timingData objectForKey:key])
    36         return [object doubleValue];
    37     return 0.0;
     35    auto timing = Box<NetworkLoadMetrics>::create();
     36
     37    timing->fetchStart = Seconds(fetchStart);
     38    timing->domainLookupStart = Seconds(domainLookupStart <= 0 ? -1 : domainLookupStart - fetchStart);
     39    timing->domainLookupEnd = Seconds(domainLookupEnd <= 0 ? -1 : domainLookupEnd - fetchStart);
     40    timing->connectStart = Seconds(connectStart <= 0 ? -1 : connectStart - fetchStart);
     41    if (reusedTLSConnection && [protocol isEqualToString:@"https"])
     42        timing->secureConnectionStart = reusedTLSConnectionSentinel;
     43    else
     44        timing->secureConnectionStart = Seconds(secureConnectionStart <= 0 ? -1 : secureConnectionStart - fetchStart);
     45    timing->connectEnd = Seconds(connectEnd <= 0 ? -1 : connectEnd - fetchStart);
     46    timing->requestStart = Seconds(requestStart <= 0 ? 0 : requestStart - fetchStart);
     47    timing->responseStart = Seconds(responseStart <= 0 ? 0 : responseStart - fetchStart);
     48
     49    // NOTE: responseEnd is not populated in this code path.
     50
     51    return timing;
    3852}
    39    
    40 Box<NetworkLoadMetrics> copyTimingData(NSDictionary *timingData)
     53
     54Box<NetworkLoadMetrics> copyTimingData(NSURLSessionTaskTransactionMetrics *incompleteMetrics)
    4155{
     56    return packageTimingData(
     57        incompleteMetrics.fetchStartDate.timeIntervalSince1970,
     58        incompleteMetrics.domainLookupStartDate.timeIntervalSince1970,
     59        incompleteMetrics.domainLookupEndDate.timeIntervalSince1970,
     60        incompleteMetrics.connectStartDate.timeIntervalSince1970,
     61        incompleteMetrics.secureConnectionStartDate.timeIntervalSince1970,
     62        incompleteMetrics.connectEndDate.timeIntervalSince1970,
     63        incompleteMetrics.requestStartDate.timeIntervalSince1970,
     64        incompleteMetrics.responseStartDate.timeIntervalSince1970,
     65        incompleteMetrics.reusedConnection,
     66        incompleteMetrics.response.URL.scheme
     67    );
     68}
     69
     70Box<NetworkLoadMetrics> copyTimingData(NSURLConnection *connection, NSURLResponse *response)
     71{
     72    NSDictionary *timingData = [connection _timingData];
    4273    if (!timingData)
    4374        return nullptr;
    4475
    45     Box<NetworkLoadMetrics> timing = Box<NetworkLoadMetrics>::create();
     76    auto timingValue = [](NSDictionary *timingData, NSString *key) {
     77        if (id object = [timingData objectForKey:key])
     78            return [object doubleValue];
     79        return 0.0;
     80    };
    4681
    47     // This is not the navigationStart time in monotonic time, but the other times are relative to this time
    48     // and only the differences between times are stored.
    49     double referenceStart = timingValue(timingData, @"_kCFNTimingDataFetchStart");
    50 
    51     double domainLookupStart = timingValue(timingData, @"_kCFNTimingDataDomainLookupStart");
    52     double domainLookupEnd = timingValue(timingData, @"_kCFNTimingDataDomainLookupEnd");
    53     double connectStart = timingValue(timingData, @"_kCFNTimingDataConnectStart");
    54     double secureConnectionStart = timingValue(timingData, @"_kCFNTimingDataSecureConnectionStart");
    55     double connectEnd = timingValue(timingData, @"_kCFNTimingDataConnectEnd");
    56     double requestStart = timingValue(timingData, @"_kCFNTimingDataRequestStart");
    57     double responseStart = timingValue(timingData, @"_kCFNTimingDataResponseStart");
    58 
    59     timing->fetchStart = Seconds(referenceStart);
    60     timing->domainLookupStart = Seconds(domainLookupStart <= 0 ? -1 : domainLookupStart - referenceStart);
    61     timing->domainLookupEnd = Seconds(domainLookupEnd <= 0 ? -1 : domainLookupEnd - referenceStart);
    62     timing->connectStart = Seconds(connectStart <= 0 ? -1 : connectStart - referenceStart);
    63     timing->secureConnectionStart = Seconds(secureConnectionStart <= 0 ? -1 : secureConnectionStart - referenceStart);
    64     timing->connectEnd = Seconds(connectEnd <= 0 ? -1 : connectEnd - referenceStart);
    65     timing->requestStart = Seconds(requestStart <= 0 ? 0 : requestStart - referenceStart);
    66     timing->responseStart = Seconds(responseStart <= 0 ? 0 : responseStart - referenceStart);
    67 
    68     // NOTE: responseEnd is not populated in this code path.
    69     return timing;
     82    return packageTimingData(
     83        timingValue(timingData, @"_kCFNTimingDataFetchStart"),
     84        timingValue(timingData, @"_kCFNTimingDataDomainLookupStart"),
     85        timingValue(timingData, @"_kCFNTimingDataDomainLookupEnd"),
     86        timingValue(timingData, @"_kCFNTimingDataConnectStart"),
     87        timingValue(timingData, @"_kCFNTimingDataSecureConnectionStart"),
     88        timingValue(timingData, @"_kCFNTimingDataConnectEnd"),
     89        timingValue(timingData, @"_kCFNTimingDataRequestStart"),
     90        timingValue(timingData, @"_kCFNTimingDataResponseStart"),
     91        timingValue(timingData, @"_kCFNTimingDataConnectionReused"),
     92        response.URL.scheme
     93    );
    7094}
    7195   
  • trunk/Source/WebCore/platform/network/cocoa/WebCoreNSURLSession.mm

    r277038 r277493  
    803803- (NSDictionary *)_timingData
    804804{
    805     // FIXME: return a dictionary sourced from ResourceHandle::getConnectionTimingData().
     805    // FIXME: Make sure nobody is using this and remove this. It is replaced by WebCoreNSURLSessionTaskTransactionMetrics.
    806806    return @{ };
    807807}
  • trunk/Source/WebCore/platform/network/mac/ResourceHandleMac.mm

    r274931 r277493  
    654654}
    655655
    656 Box<NetworkLoadMetrics> ResourceHandle::getConnectionTimingData(NSURLConnection *connection)
    657 {
    658     return copyTimingData([connection _timingData]);
    659 }
    660 
    661656} // namespace WebCore
  • trunk/Source/WebCore/platform/network/mac/WebCoreResourceHandleAsOperationQueueDelegate.mm

    r264993 r277493  
    253253        ResourceResponse resourceResponse(r.get());
    254254        resourceResponse.setSource(ResourceResponse::Source::Network);
    255         resourceResponse.setDeprecatedNetworkLoadMetrics(ResourceHandle::getConnectionTimingData(connection.get()));
     255        resourceResponse.setDeprecatedNetworkLoadMetrics(copyTimingData(connection.get(), r.get()));
    256256
    257257        m_handle->didReceiveResponse(WTFMove(resourceResponse), [self, protectedSelf = WTFMove(protectedSelf)] {
  • trunk/Source/WebKit/ChangeLog

    r277492 r277493  
     12021-05-14  Alex Christensen  <achristensen@webkit.org>
     2
     3        Resource Timing: secureConnectionStart == 0 when a connection is re-used
     4        https://bugs.webkit.org/show_bug.cgi?id=225733
     5
     6        Reviewed by Chris Dumez.
     7
     8        * NetworkProcess/cocoa/NetworkSessionCocoa.mm:
     9        (-[WKNetworkSessionDelegate URLSession:dataTask:didReceiveResponse:completionHandler:]):
     10
    1112021-05-14  Chris Dumez  <cdumez@apple.com>
    212
  • trunk/Source/WebKit/NetworkProcess/cocoa/NetworkSessionCocoa.mm

    r277055 r277493  
    879879
    880880        NegotiatedLegacyTLS negotiatedLegacyTLS = NegotiatedLegacyTLS::No;
     881        NSURLSessionTaskTransactionMetrics *metrics = dataTask._incompleteTaskMetrics.transactionMetrics.lastObject;
    881882#if HAVE(TLS_PROTOCOL_VERSION_T)
    882         NSURLSessionTaskTransactionMetrics *metrics = dataTask._incompleteTaskMetrics.transactionMetrics.lastObject;
    883883        auto tlsVersion = (tls_protocol_version_t)metrics.negotiatedTLSProtocolVersion.unsignedShortValue;
    884884        if (tlsVersion == tls_protocol_version_TLSv10 || tlsVersion == tls_protocol_version_TLSv11)
    … …  
    907907        resourceResponse.disableLazyInitialization();
    908908
    909         // FIXME: This cannot be eliminated until other code no longer relies on ResourceResponse's
    910         // NetworkLoadMetrics. For example, PerformanceTiming.
    911         resourceResponse.setDeprecatedNetworkLoadMetrics(WebCore::copyTimingData([dataTask _timingData]));
     909        resourceResponse.setDeprecatedNetworkLoadMetrics(WebCore::copyTimingData(metrics));
    912910
    913911        networkDataTask->didReceiveResponse(WTFMove(resourceResponse), negotiatedLegacyTLS, [completionHandler = makeBlockPtr(completionHandler), taskIdentifier](WebCore::PolicyAction policyAction) {
Note: See TracChangeset for help on using the changeset viewer.