Title: [194156] trunk/Source
Revision
194156
Author
[email protected]
Date
2015-12-16 10:25:00 -0800 (Wed, 16 Dec 2015)

Log Message

Implement Web Timing when using NETWORK_SESSION
https://bugs.webkit.org/show_bug.cgi?id=152285

Reviewed by Darin Adler.

Source/WebCore:

Covered by existing tests.

* WebCore.xcodeproj/project.pbxproj:
* platform/network/ResourceHandle.h:
* platform/network/ResourceLoadTiming.h:
(WebCore::ResourceLoadTiming::encode):
Moved setCollectsTimingData from ResourceHandle to ResourceLoadTiming.h to be shared 
with WebKit2 when using NETWORK_SESSION, which does not use ResourceHandle.
Also moved getConnectionTimingData to copyTimingData in ResourceLoadTiming for the same reason.
* platform/network/cf/ResourceHandleCFNet.cpp:
(WebCore::ResourceHandle::createCFURLConnection):
(WebCore::ResourceHandle::start):
Use the proper definition of _TimingDataOptionsEnableW3CNavigationTiming.
* platform/network/cocoa/ResourceLoadTiming.mm: Added.
(WebCore::timingValue):
(WebCore::copyTimingData):
Moved from getConnectionTimingData, and use objectForKey instead of valueForKey,
and check to see if there is no object in the dictionary with the given key.
This should never happen with the current CFNetwork implementation, but it's good to check dictionaries.
(WebCore::setCollectsTimingData):
Use _collectTimingDataWithOptions, which should be a slight performance improvement on Mavericks
because we are not collecting unused timing data. Hooray!
* platform/network/mac/ResourceHandleMac.mm:
(WebCore::ResourceHandle::createNSURLConnection):
(WebCore::ResourceHandle::getConnectionTimingData):
(WebCore::ResourceHandle::setCollectsTimingData): Deleted.
* platform/spi/cf/CFNetworkSPI.h:
* platform/spi/cocoa/NSURLConnectionSPI.h:
Moved definitions of SPI to proper SPI headers.

Source/WebKit2:

* NetworkProcess/cocoa/NetworkSessionCocoa.mm:
(-[NetworkSessionDelegate URLSession:dataTask:didReceiveResponse:completionHandler:]):
(WebKit::NetworkSession::NetworkSession):
Use functions moved to ResourceLoadTiming.h.  setCollectsTimingData is for Mavericks, _timingDataOptions is post-Mavericks.

Modified Paths

Added Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (194155 => 194156)


--- trunk/Source/WebCore/ChangeLog	2015-12-16 18:08:57 UTC (rev 194155)
+++ trunk/Source/WebCore/ChangeLog	2015-12-16 18:25:00 UTC (rev 194156)
@@ -1,3 +1,40 @@
+2015-12-16  Alex Christensen  <[email protected]>
+
+        Implement Web Timing when using NETWORK_SESSION
+        https://bugs.webkit.org/show_bug.cgi?id=152285
+
+        Reviewed by Darin Adler.
+
+        Covered by existing tests.
+
+        * WebCore.xcodeproj/project.pbxproj:
+        * platform/network/ResourceHandle.h:
+        * platform/network/ResourceLoadTiming.h:
+        (WebCore::ResourceLoadTiming::encode):
+        Moved setCollectsTimingData from ResourceHandle to ResourceLoadTiming.h to be shared 
+        with WebKit2 when using NETWORK_SESSION, which does not use ResourceHandle.
+        Also moved getConnectionTimingData to copyTimingData in ResourceLoadTiming for the same reason.
+        * platform/network/cf/ResourceHandleCFNet.cpp:
+        (WebCore::ResourceHandle::createCFURLConnection):
+        (WebCore::ResourceHandle::start):
+        Use the proper definition of _TimingDataOptionsEnableW3CNavigationTiming.
+        * platform/network/cocoa/ResourceLoadTiming.mm: Added.
+        (WebCore::timingValue):
+        (WebCore::copyTimingData):
+        Moved from getConnectionTimingData, and use objectForKey instead of valueForKey,
+        and check to see if there is no object in the dictionary with the given key.
+        This should never happen with the current CFNetwork implementation, but it's good to check dictionaries.
+        (WebCore::setCollectsTimingData):
+        Use _collectTimingDataWithOptions, which should be a slight performance improvement on Mavericks
+        because we are not collecting unused timing data. Hooray!
+        * platform/network/mac/ResourceHandleMac.mm:
+        (WebCore::ResourceHandle::createNSURLConnection):
+        (WebCore::ResourceHandle::getConnectionTimingData):
+        (WebCore::ResourceHandle::setCollectsTimingData): Deleted.
+        * platform/spi/cf/CFNetworkSPI.h:
+        * platform/spi/cocoa/NSURLConnectionSPI.h:
+        Moved definitions of SPI to proper SPI headers.
+
 2015-12-16  Beth Dakin  <[email protected]>
 
         Legacy style scrollbars do not change color when you mouse over them if you 

Modified: trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj (194155 => 194156)


--- trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj	2015-12-16 18:08:57 UTC (rev 194155)
+++ trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj	2015-12-16 18:25:00 UTC (rev 194156)
@@ -2335,6 +2335,7 @@
 		5C4304B6191AEF46000E2BC0 /* JSEXTShaderTextureLOD.h in Headers */ = {isa = PBXBuildFile; fileRef = 5C4304B4191AEF46000E2BC0 /* JSEXTShaderTextureLOD.h */; };
 		5C9A7A751AA0F6EA00958ACF /* DFABytecodeCompiler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5C39305E1AA0F6A90029C816 /* DFABytecodeCompiler.cpp */; };
 		5C9A7A761AA0F6ED00958ACF /* DFABytecodeInterpreter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5C3930601AA0F6A90029C816 /* DFABytecodeInterpreter.cpp */; };
+		5C9B860C1C21E3C900110F36 /* ResourceLoadTiming.mm in Sources */ = {isa = PBXBuildFile; fileRef = 5C9B860B1C21E3C600110F36 /* ResourceLoadTiming.mm */; };
 		5CBC8DAC1AAA302200E1C803 /* MediaAccessibilitySoftLink.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5CBC8DAA1AAA302200E1C803 /* MediaAccessibilitySoftLink.cpp */; };
 		5CBC8DAD1AAA302200E1C803 /* MediaAccessibilitySoftLink.h in Headers */ = {isa = PBXBuildFile; fileRef = 5CBC8DAB1AAA302200E1C803 /* MediaAccessibilitySoftLink.h */; };
 		5CD9F5661AA0F73C00DA45FF /* DFABytecode.h in Headers */ = {isa = PBXBuildFile; fileRef = 5C39305D1AA0F6A90029C816 /* DFABytecode.h */; settings = {ATTRIBUTES = (Private, ); }; };
@@ -9787,6 +9788,7 @@
 		5C4304AF191AC908000E2BC0 /* EXTShaderTextureLOD.idl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = EXTShaderTextureLOD.idl; sourceTree = "<group>"; };
 		5C4304B3191AEF46000E2BC0 /* JSEXTShaderTextureLOD.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = JSEXTShaderTextureLOD.cpp; sourceTree = "<group>"; };
 		5C4304B4191AEF46000E2BC0 /* JSEXTShaderTextureLOD.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSEXTShaderTextureLOD.h; sourceTree = "<group>"; };
+		5C9B860B1C21E3C600110F36 /* ResourceLoadTiming.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = ResourceLoadTiming.mm; sourceTree = "<group>"; };
 		5CBC8DAA1AAA302200E1C803 /* MediaAccessibilitySoftLink.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = MediaAccessibilitySoftLink.cpp; sourceTree = "<group>"; };
 		5CBC8DAB1AAA302200E1C803 /* MediaAccessibilitySoftLink.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MediaAccessibilitySoftLink.h; sourceTree = "<group>"; };
 		5CDFA6C71AA4F2DA00EA8746 /* ContentExtensionActions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ContentExtensionActions.h; sourceTree = "<group>"; };
@@ -17859,6 +17861,7 @@
 		7E7DE1FE195CEF2D0035363B /* cocoa */ = {
 			isa = PBXGroup;
 			children = (
+				5C9B860B1C21E3C600110F36 /* ResourceLoadTiming.mm */,
 				3792917C1987678F00F4B661 /* CredentialCocoa.h */,
 				3792917B1987678F00F4B661 /* CredentialCocoa.mm */,
 				372ADA37197F47B900FC501E /* ProtectionSpaceCocoa.h */,
@@ -31550,6 +31553,7 @@
 				93F19B0308245E59001E9ABC /* XSLStyleSheetLibxslt.cpp in Sources */,
 				E1F1E82F0C3C2BB9006DB391 /* XSLTExtensions.cpp in Sources */,
 				93F19B0408245E59001E9ABC /* XSLTProcessor.cpp in Sources */,
+				5C9B860C1C21E3C900110F36 /* ResourceLoadTiming.mm in Sources */,
 				93F19B0508245E59001E9ABC /* XSLTProcessorLibxslt.cpp in Sources */,
 				E1BE512D0CF6C512002EA959 /* XSLTUnicodeSort.cpp in Sources */,
 				977E2E0E12F0FC9C00C13379 /* XSSAuditor.cpp in Sources */,

Modified: trunk/Source/WebCore/platform/network/ResourceHandle.h (194155 => 194156)


--- trunk/Source/WebCore/platform/network/ResourceHandle.h	2015-12-16 18:08:57 UTC (rev 194155)
+++ trunk/Source/WebCore/platform/network/ResourceHandle.h	2015-12-16 18:25:00 UTC (rev 194156)
@@ -135,7 +135,6 @@
 #endif
         
 #if PLATFORM(COCOA) && ENABLE(WEB_TIMING)
-    void setCollectsTimingData();
 #if USE(CFNETWORK)
     static void getConnectionTimingData(CFURLConnectionRef, ResourceLoadTiming&);
 #else
@@ -285,10 +284,6 @@
     void createNSURLConnection(id delegate, bool shouldUseCredentialStorage, bool shouldContentSniff, SchedulingBehavior, NSDictionary *connectionProperties);
 #endif
 
-#if PLATFORM(COCOA) && ENABLE(WEB_TIMING)
-static void getConnectionTimingData(NSDictionary *timingData, ResourceLoadTiming&);
-#endif
-
 #if USE(SOUP)
     void timeoutFired();
 #endif

Modified: trunk/Source/WebCore/platform/network/ResourceLoadTiming.h (194155 => 194156)


--- trunk/Source/WebCore/platform/network/ResourceLoadTiming.h	2015-12-16 18:08:57 UTC (rev 194155)
+++ trunk/Source/WebCore/platform/network/ResourceLoadTiming.h	2015-12-16 18:25:00 UTC (rev 194156)
@@ -27,6 +27,10 @@
 #ifndef ResourceLoadTiming_h
 #define ResourceLoadTiming_h
 
+#if PLATFORM(COCOA)
+OBJC_CLASS NSDictionary;
+#endif
+
 namespace WebCore {
     
 class ResourceLoadTiming {
@@ -94,6 +98,14 @@
     int secureConnectionStart;
 };
 
+#if PLATFORM(COCOA)
+WEBCORE_EXPORT void copyTimingData(NSDictionary *timingData, ResourceLoadTiming&);
+#endif
+
+#if PLATFORM(COCOA) && !HAVE(TIMINGDATAOPTIONS)
+WEBCORE_EXPORT void setCollectsTimingData();
+#endif
+    
 template<class Encoder>
 void ResourceLoadTiming::encode(Encoder& encoder) const
 {

Modified: trunk/Source/WebCore/platform/network/cf/ResourceHandleCFNet.cpp (194155 => 194156)


--- trunk/Source/WebCore/platform/network/cf/ResourceHandleCFNet.cpp	2015-12-16 18:08:57 UTC (rev 194155)
+++ trunk/Source/WebCore/platform/network/cf/ResourceHandleCFNet.cpp	2015-12-16 18:25:00 UTC (rev 194156)
@@ -207,8 +207,7 @@
     else
         propertiesDictionary = adoptCF(CFDictionaryCreateMutable(kCFAllocatorDefault, 0, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks));
 #if HAVE(TIMINGDATAOPTIONS)
-    const int64_t TimingDataOptionsEnableW3CNavigationTiming = (1 << 0);
-    auto enableW3CNavigationTiming = adoptCF(CFNumberCreate(kCFAllocatorDefault, kCFNumberSInt64Type, &TimingDataOptionsEnableW3CNavigationTiming));
+    auto enableW3CNavigationTiming = adoptCF(CFNumberCreate(kCFAllocatorDefault, kCFNumberSInt64Type, &_TimingDataOptionsEnableW3CNavigationTiming));
     auto timingDataOptionsDictionary = adoptCF(CFDictionaryCreateMutable(kCFAllocatorDefault, 0, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks));
     CFDictionaryAddValue(timingDataOptionsDictionary.get(), CFSTR("_kCFURLConnectionPropertyTimingDataOptions"), enableW3CNavigationTiming.get());
     CFDictionaryAddValue(propertiesDictionary.get(), CFSTR("kCFURLConnectionURLConnectionProperties"), timingDataOptionsDictionary.get());
@@ -252,7 +251,7 @@
 
     bool shouldUseCredentialStorage = !client() || client()->shouldUseCredentialStorage(this);
 
-#if ENABLE(WEB_TIMING) && PLATFORM(COCOA)
+#if ENABLE(WEB_TIMING) && PLATFORM(COCOA) && !HAVE(TIMINGDATAOPTIONS)
     setCollectsTimingData();
 #endif
 

Added: trunk/Source/WebCore/platform/network/cocoa/ResourceLoadTiming.mm (0 => 194156)


--- trunk/Source/WebCore/platform/network/cocoa/ResourceLoadTiming.mm	                        (rev 0)
+++ trunk/Source/WebCore/platform/network/cocoa/ResourceLoadTiming.mm	2015-12-16 18:25:00 UTC (rev 194156)
@@ -0,0 +1,77 @@
+/*
+ * Copyright (C) 2015 Apple, Inc.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#import "config.h"
+#import "ResourceLoadTiming.h"
+
+#import <WebCore/NSURLConnectionSPI.h>
+
+namespace WebCore {
+
+static double timingValue(NSDictionary *timingData, NSString *key)
+{
+    if (id object = [timingData objectForKey:key])
+        return [object doubleValue];
+    return 0.0;
+}
+    
+void copyTimingData(NSDictionary *timingData, ResourceLoadTiming& timing)
+{
+    if (!timingData)
+        return;
+    
+    // This is not the navigationStart time in monotonic time, but the other times are relative to this time
+    // and only the differences between times are stored.
+    double referenceStart = timingValue(timingData, @"_kCFNTimingDataFetchStart");
+    
+    double domainLookupStart = timingValue(timingData, @"_kCFNTimingDataDomainLookupStart");
+    double domainLookupEnd = timingValue(timingData, @"_kCFNTimingDataDomainLookupEnd");
+    double connectStart = timingValue(timingData, @"_kCFNTimingDataConnectStart");
+    double secureConnectionStart = timingValue(timingData, @"_kCFNTimingDataSecureConnectionStart");
+    double connectEnd = timingValue(timingData, @"_kCFNTimingDataConnectEnd");
+    double requestStart = timingValue(timingData, @"_kCFNTimingDataRequestStart");
+    double responseStart = timingValue(timingData, @"_kCFNTimingDataResponseStart");
+    
+    timing.domainLookupStart = domainLookupStart <= 0 ? -1 : (domainLookupStart - referenceStart) * 1000;
+    timing.domainLookupEnd = domainLookupEnd <= 0 ? -1 : (domainLookupEnd - referenceStart) * 1000;
+    timing.connectStart = connectStart <= 0 ? -1 : (connectStart - referenceStart) * 1000;
+    timing.secureConnectionStart = secureConnectionStart <= 0 ? -1 : (secureConnectionStart - referenceStart) * 1000;
+    timing.connectEnd = connectEnd <= 0 ? -1 : (connectEnd - referenceStart) * 1000;
+    timing.requestStart = requestStart <= 0 ? 0 : (requestStart - referenceStart) * 1000;
+    timing.responseStart = responseStart <= 0 ? 0 : (responseStart - referenceStart) * 1000;
+}
+
+#if !HAVE(TIMINGDATAOPTIONS)
+void setCollectsTimingData()
+{
+    static dispatch_once_t onceToken;
+    dispatch_once(&onceToken, ^{
+        [NSURLConnection _setCollectsTimingData:YES];
+        [NSURLConnection _collectTimingDataWithOptions:TimingDataCollectionNStatsOff | TimingDataCollectionConnectionDataOff];
+    });
+}
+#endif
+    
+}

Modified: trunk/Source/WebCore/platform/network/mac/ResourceHandleMac.mm (194155 => 194156)


--- trunk/Source/WebCore/platform/network/mac/ResourceHandleMac.mm	2015-12-16 18:08:57 UTC (rev 194155)
+++ trunk/Source/WebCore/platform/network/mac/ResourceHandleMac.mm	2015-12-16 18:25:00 UTC (rev 194156)
@@ -66,17 +66,6 @@
 }
 #endif // USE(CFNETWORK)
 
-#if __has_include(<Foundation/NSURLConnectionPrivate.h>)
-#import <Foundation/NSURLConnectionPrivate.h>
-#else
-@interface NSURLConnection (TimingData)
-#if !HAVE(TIMINGDATAOPTIONS)
-+ (void)_setCollectsTimingData:(BOOL)collect;
-#endif
-- (NSDictionary *)_timingData;
-@end
-#endif
-
 #if PLATFORM(IOS)
 #import "CFNetworkSPI.h"
 #import "RuntimeApplicationChecksIOS.h"
@@ -145,7 +134,7 @@
 void ResourceHandle::createNSURLConnection(id delegate, bool shouldUseCredentialStorage, bool shouldContentSniff, SchedulingBehavior schedulingBehavior, NSDictionary *connectionProperties)
 #endif
 {
-#if ENABLE(WEB_TIMING)
+#if ENABLE(WEB_TIMING) && !HAVE(TIMINGDATAOPTIONS)
     setCollectsTimingData();
 #endif
 
@@ -224,8 +213,7 @@
     const bool usesCache = true;
 #endif
 #if HAVE(TIMINGDATAOPTIONS)
-    const int64_t TimingDataOptionsEnableW3CNavigationTiming = (1 << 0);
-    [propertyDictionary setObject:@{@"_kCFURLConnectionPropertyTimingDataOptions": @(TimingDataOptionsEnableW3CNavigationTiming)} forKey:@"kCFURLConnectionURLConnectionProperties"];
+    [propertyDictionary setObject:@{@"_kCFURLConnectionPropertyTimingDataOptions": @(_TimingDataOptionsEnableW3CNavigationTiming)} forKey:@"kCFURLConnectionURLConnectionProperties"];
 #endif
     d->m_connection = adoptNS([[NSURLConnection alloc] _initWithRequest:nsRequest delegate:delegate usesCache:usesCache maxContentLength:0 startImmediately:NO connectionProperties:propertyDictionary]);
 }
@@ -739,55 +727,19 @@
 #endif // !USE(CFNETWORK)
     
 #if ENABLE(WEB_TIMING)
-    
-void ResourceHandle::getConnectionTimingData(NSDictionary *timingData, ResourceLoadTiming& timing)
-{
-    if (!timingData)
-        return;
 
-    // This is not the navigationStart time in monotonic time, but the other times are relative to this time
-    // and only the differences between times are stored.
-    double referenceStart = [[timingData valueForKey:@"_kCFNTimingDataFetchStart"] doubleValue];
-            
-    double domainLookupStart = [[timingData valueForKey:@"_kCFNTimingDataDomainLookupStart"] doubleValue];
-    double domainLookupEnd = [[timingData valueForKey:@"_kCFNTimingDataDomainLookupEnd"] doubleValue];
-    double connectStart = [[timingData valueForKey:@"_kCFNTimingDataConnectStart"] doubleValue];
-    double secureConnectionStart = [[timingData valueForKey:@"_kCFNTimingDataSecureConnectionStart"] doubleValue];
-    double connectEnd = [[timingData valueForKey:@"_kCFNTimingDataConnectEnd"] doubleValue];
-    double requestStart = [[timingData valueForKey:@"_kCFNTimingDataRequestStart"] doubleValue];
-    double responseStart = [[timingData valueForKey:@"_kCFNTimingDataResponseStart"] doubleValue];
-        
-    timing.domainLookupStart = domainLookupStart <= 0 ? -1 : (domainLookupStart - referenceStart) * 1000;
-    timing.domainLookupEnd = domainLookupEnd <= 0 ? -1 : (domainLookupEnd - referenceStart) * 1000;
-    timing.connectStart = connectStart <= 0 ? -1 : (connectStart - referenceStart) * 1000;
-    timing.secureConnectionStart = secureConnectionStart <= 0 ? -1 : (secureConnectionStart - referenceStart) * 1000;
-    timing.connectEnd = connectEnd <= 0 ? -1 : (connectEnd - referenceStart) * 1000;
-    timing.requestStart = requestStart <= 0 ? 0 : (requestStart - referenceStart) * 1000;
-    timing.responseStart = responseStart <= 0 ? 0 : (responseStart - referenceStart) * 1000;
-}
-
-void ResourceHandle::setCollectsTimingData()
-{
-#if !HAVE(TIMINGDATAOPTIONS)
-    static dispatch_once_t onceToken;
-    dispatch_once(&onceToken, ^{
-        [NSURLConnection _setCollectsTimingData:YES];
-    });
-#endif
-}
-
 #if USE(CFNETWORK)
     
 void ResourceHandle::getConnectionTimingData(CFURLConnectionRef connection, ResourceLoadTiming& timing)
 {
-    getConnectionTimingData((__bridge NSDictionary*)(adoptCF(_CFURLConnectionCopyTimingData(connection)).get()), timing);
+    copyTimingData((__bridge NSDictionary*)adoptCF(_CFURLConnectionCopyTimingData(connection)).get(), timing);
 }
     
 #else
     
 void ResourceHandle::getConnectionTimingData(NSURLConnection *connection, ResourceLoadTiming& timing)
 {
-    getConnectionTimingData([connection _timingData], timing);
+    copyTimingData([connection _timingData], timing);
 }
     
 #endif

Modified: trunk/Source/WebCore/platform/spi/cf/CFNetworkSPI.h (194155 => 194156)


--- trunk/Source/WebCore/platform/spi/cf/CFNetworkSPI.h	2015-12-16 18:08:57 UTC (rev 194155)
+++ trunk/Source/WebCore/platform/spi/cf/CFNetworkSPI.h	2015-12-16 18:25:00 UTC (rev 194156)
@@ -51,8 +51,19 @@
 #endif
 #endif // defined(__OBJC__) && (PLATFORM(IOS) || __MAC_OS_X_VERSION_MIN_REQUIRED >= 101000)
 
-#else
+#else // PLATFORM(WIN) || USE(APPLE_INTERNAL_SDK)
 
+#if defined(__OBJC__)
+@interface NSURLSessionTask (TimingData)
+- (NSDictionary *)_timingData;
+@end
+#endif
+
+typedef CF_ENUM(int64_t, _TimingDataOptions)
+{
+    _TimingDataOptionsEnableW3CNavigationTiming = (1 << 0)
+};
+
 typedef struct OpaqueCFHTTPCookieStorage* CFHTTPCookieStorageRef;
 typedef const struct _CFCachedURLResponse* CFCachedURLResponseRef;
 typedef const struct _CFURLCache* CFURLCacheRef;

Modified: trunk/Source/WebCore/platform/spi/cocoa/NSURLConnectionSPI.h (194155 => 194156)


--- trunk/Source/WebCore/platform/spi/cocoa/NSURLConnectionSPI.h	2015-12-16 18:08:57 UTC (rev 194155)
+++ trunk/Source/WebCore/platform/spi/cocoa/NSURLConnectionSPI.h	2015-12-16 18:25:00 UTC (rev 194156)
@@ -29,9 +29,21 @@
 
 #else
 
+enum {
+    TimingDataCollectionDefault = 0,
+    TimingDataCollectionNStatsOff = 1,
+    TimingDataCollectionConnectionDataOff = 2,
+};
+typedef NSUInteger TimingDataCollection;
+
 @interface NSURLConnection ()
 + (CFRunLoopRef)resourceLoaderRunLoop;
 - (void)setDefersCallbacks:(BOOL)defers;
+#if PLATFORM(MAC) && __MAC_OS_X_VERSION_MIN_REQUIRED < 101100
++ (void)_setCollectsTimingData:(BOOL)collect;
++ (void)_collectTimingDataWithOptions:(TimingDataCollection)options;
+#endif
+- (NSDictionary *)_timingData;
 @end
 
 #endif

Modified: trunk/Source/WebKit2/ChangeLog (194155 => 194156)


--- trunk/Source/WebKit2/ChangeLog	2015-12-16 18:08:57 UTC (rev 194155)
+++ trunk/Source/WebKit2/ChangeLog	2015-12-16 18:25:00 UTC (rev 194156)
@@ -1,3 +1,15 @@
+2015-12-16  Alex Christensen  <[email protected]>
+
+        Implement Web Timing when using NETWORK_SESSION
+        https://bugs.webkit.org/show_bug.cgi?id=152285
+
+        Reviewed by Darin Adler.
+
+        * NetworkProcess/cocoa/NetworkSessionCocoa.mm:
+        (-[NetworkSessionDelegate URLSession:dataTask:didReceiveResponse:completionHandler:]):
+        (WebKit::NetworkSession::NetworkSession):
+        Use functions moved to ResourceLoadTiming.h.  setCollectsTimingData is for Mavericks, _timingDataOptions is post-Mavericks.
+
 2015-12-16  Youenn Fablet  <[email protected]>
 
         [Fetch API] Add fetch API compile time flag

Modified: trunk/Source/WebKit2/NetworkProcess/cocoa/NetworkSessionCocoa.mm (194155 => 194156)


--- trunk/Source/WebKit2/NetworkProcess/cocoa/NetworkSessionCocoa.mm	2015-12-16 18:08:57 UTC (rev 194155)
+++ trunk/Source/WebKit2/NetworkProcess/cocoa/NetworkSessionCocoa.mm	2015-12-16 18:25:00 UTC (rev 194156)
@@ -37,6 +37,7 @@
 #import <WebCore/NetworkStorageSession.h>
 #import <WebCore/NotImplemented.h>
 #import <WebCore/ResourceError.h>
+#import <WebCore/ResourceLoadTiming.h>
 #import <WebCore/ResourceRequest.h>
 #import <WebCore/ResourceResponse.h>
 #import <WebCore/SharedBuffer.h>
@@ -142,6 +143,7 @@
         if (auto* client = networkingTask->client()) {
             ASSERT(isMainThread());
             WebCore::ResourceResponse resourceResponse(response);
+            copyTimingData([dataTask _timingData], resourceResponse.resourceLoadTiming());
             auto completionHandlerCopy = Block_copy(completionHandler);
             client->didReceiveResponse(resourceResponse, [completionHandlerCopy](WebCore::PolicyAction policyAction)
                 {
@@ -214,6 +216,13 @@
     m_sessionDelegate = adoptNS([[NetworkSessionDelegate alloc] initWithNetworkSession:*this]);
 
     NSURLSessionConfiguration *configuration = configurationForType(type);
+
+#if HAVE(TIMINGDATAOPTIONS)
+    configuration._timingDataOptions = _TimingDataOptionsEnableW3CNavigationTiming;
+#else
+    setCollectsTimingData();
+#endif
+
     if (auto* storageSession = SessionTracker::storageSession(sessionID)) {
         if (CFHTTPCookieStorageRef storage = storageSession->cookieStorage().get())
             configuration.HTTPCookieStorage = [[[NSHTTPCookieStorage alloc] _initWithCFHTTPCookieStorage:storage] autorelease];
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to