<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>[194156] trunk/Source</title>
</head>
<body>

<style type="text/css"><!--
#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dl.meta dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt;  }
#msg dl a { font-weight: bold}
#msg dl a:link    { color:#fc3; }
#msg dl a:active  { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre { overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; }
#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; }
#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; }
#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; }
#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; }
#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; }
#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; }
#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; }
#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; }
#logmsg pre { background: #eee; padding: 1em; }
#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;}
#logmsg dl { margin: 0; }
#logmsg dt { font-weight: bold; }
#logmsg dd { margin: 0; padding: 0 0 0.5em 0; }
#logmsg dd:before { content:'\00bb';}
#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; }
#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; }
#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; }
#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; }
#logmsg table th.Corner { text-align: left; }
#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff  {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<div id="msg">
<dl class="meta">
<dt>Revision</dt> <dd><a href="http://trac.webkit.org/projects/webkit/changeset/194156">194156</a></dd>
<dt>Author</dt> <dd>achristensen@apple.com</dd>
<dt>Date</dt> <dd>2015-12-16 10:25:00 -0800 (Wed, 16 Dec 2015)</dd>
</dl>

<h3>Log Message</h3>
<pre>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.</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceWebCoreChangeLog">trunk/Source/WebCore/ChangeLog</a></li>
<li><a href="#trunkSourceWebCoreWebCorexcodeprojprojectpbxproj">trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj</a></li>
<li><a href="#trunkSourceWebCoreplatformnetworkResourceHandleh">trunk/Source/WebCore/platform/network/ResourceHandle.h</a></li>
<li><a href="#trunkSourceWebCoreplatformnetworkResourceLoadTimingh">trunk/Source/WebCore/platform/network/ResourceLoadTiming.h</a></li>
<li><a href="#trunkSourceWebCoreplatformnetworkcfResourceHandleCFNetcpp">trunk/Source/WebCore/platform/network/cf/ResourceHandleCFNet.cpp</a></li>
<li><a href="#trunkSourceWebCoreplatformnetworkmacResourceHandleMacmm">trunk/Source/WebCore/platform/network/mac/ResourceHandleMac.mm</a></li>
<li><a href="#trunkSourceWebCoreplatformspicfCFNetworkSPIh">trunk/Source/WebCore/platform/spi/cf/CFNetworkSPI.h</a></li>
<li><a href="#trunkSourceWebCoreplatformspicocoaNSURLConnectionSPIh">trunk/Source/WebCore/platform/spi/cocoa/NSURLConnectionSPI.h</a></li>
<li><a href="#trunkSourceWebKit2ChangeLog">trunk/Source/WebKit2/ChangeLog</a></li>
<li><a href="#trunkSourceWebKit2NetworkProcesscocoaNetworkSessionCocoamm">trunk/Source/WebKit2/NetworkProcess/cocoa/NetworkSessionCocoa.mm</a></li>
</ul>

<h3>Added Paths</h3>
<ul>
<li><a href="#trunkSourceWebCoreplatformnetworkcocoaResourceLoadTimingmm">trunk/Source/WebCore/platform/network/cocoa/ResourceLoadTiming.mm</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (194155 => 194156)</h4>
<pre class="diff"><span>
<span class="info">--- 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)
</span><span class="lines">@@ -1,3 +1,40 @@
</span><ins>+2015-12-16  Alex Christensen  &lt;achristensen@webkit.org&gt;
+
+        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.
+
</ins><span class="cx"> 2015-12-16  Beth Dakin  &lt;bdakin@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Legacy style scrollbars do not change color when you mouse over them if you 
</span></span></pre></div>
<a id="trunkSourceWebCoreWebCorexcodeprojprojectpbxproj"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj (194155 => 194156)</h4>
<pre class="diff"><span>
<span class="info">--- 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)
</span><span class="lines">@@ -2335,6 +2335,7 @@
</span><span class="cx">                 5C4304B6191AEF46000E2BC0 /* JSEXTShaderTextureLOD.h in Headers */ = {isa = PBXBuildFile; fileRef = 5C4304B4191AEF46000E2BC0 /* JSEXTShaderTextureLOD.h */; };
</span><span class="cx">                 5C9A7A751AA0F6EA00958ACF /* DFABytecodeCompiler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5C39305E1AA0F6A90029C816 /* DFABytecodeCompiler.cpp */; };
</span><span class="cx">                 5C9A7A761AA0F6ED00958ACF /* DFABytecodeInterpreter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5C3930601AA0F6A90029C816 /* DFABytecodeInterpreter.cpp */; };
</span><ins>+                5C9B860C1C21E3C900110F36 /* ResourceLoadTiming.mm in Sources */ = {isa = PBXBuildFile; fileRef = 5C9B860B1C21E3C600110F36 /* ResourceLoadTiming.mm */; };
</ins><span class="cx">                 5CBC8DAC1AAA302200E1C803 /* MediaAccessibilitySoftLink.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5CBC8DAA1AAA302200E1C803 /* MediaAccessibilitySoftLink.cpp */; };
</span><span class="cx">                 5CBC8DAD1AAA302200E1C803 /* MediaAccessibilitySoftLink.h in Headers */ = {isa = PBXBuildFile; fileRef = 5CBC8DAB1AAA302200E1C803 /* MediaAccessibilitySoftLink.h */; };
</span><span class="cx">                 5CD9F5661AA0F73C00DA45FF /* DFABytecode.h in Headers */ = {isa = PBXBuildFile; fileRef = 5C39305D1AA0F6A90029C816 /* DFABytecode.h */; settings = {ATTRIBUTES = (Private, ); }; };
</span><span class="lines">@@ -9787,6 +9788,7 @@
</span><span class="cx">                 5C4304AF191AC908000E2BC0 /* EXTShaderTextureLOD.idl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = EXTShaderTextureLOD.idl; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 5C4304B3191AEF46000E2BC0 /* JSEXTShaderTextureLOD.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = JSEXTShaderTextureLOD.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 5C4304B4191AEF46000E2BC0 /* JSEXTShaderTextureLOD.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSEXTShaderTextureLOD.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><ins>+                5C9B860B1C21E3C600110F36 /* ResourceLoadTiming.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = ResourceLoadTiming.mm; sourceTree = &quot;&lt;group&gt;&quot;; };
</ins><span class="cx">                 5CBC8DAA1AAA302200E1C803 /* MediaAccessibilitySoftLink.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = MediaAccessibilitySoftLink.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 5CBC8DAB1AAA302200E1C803 /* MediaAccessibilitySoftLink.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MediaAccessibilitySoftLink.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 5CDFA6C71AA4F2DA00EA8746 /* ContentExtensionActions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ContentExtensionActions.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="lines">@@ -17859,6 +17861,7 @@
</span><span class="cx">                 7E7DE1FE195CEF2D0035363B /* cocoa */ = {
</span><span class="cx">                         isa = PBXGroup;
</span><span class="cx">                         children = (
</span><ins>+                                5C9B860B1C21E3C600110F36 /* ResourceLoadTiming.mm */,
</ins><span class="cx">                                 3792917C1987678F00F4B661 /* CredentialCocoa.h */,
</span><span class="cx">                                 3792917B1987678F00F4B661 /* CredentialCocoa.mm */,
</span><span class="cx">                                 372ADA37197F47B900FC501E /* ProtectionSpaceCocoa.h */,
</span><span class="lines">@@ -31550,6 +31553,7 @@
</span><span class="cx">                                 93F19B0308245E59001E9ABC /* XSLStyleSheetLibxslt.cpp in Sources */,
</span><span class="cx">                                 E1F1E82F0C3C2BB9006DB391 /* XSLTExtensions.cpp in Sources */,
</span><span class="cx">                                 93F19B0408245E59001E9ABC /* XSLTProcessor.cpp in Sources */,
</span><ins>+                                5C9B860C1C21E3C900110F36 /* ResourceLoadTiming.mm in Sources */,
</ins><span class="cx">                                 93F19B0508245E59001E9ABC /* XSLTProcessorLibxslt.cpp in Sources */,
</span><span class="cx">                                 E1BE512D0CF6C512002EA959 /* XSLTUnicodeSort.cpp in Sources */,
</span><span class="cx">                                 977E2E0E12F0FC9C00C13379 /* XSSAuditor.cpp in Sources */,
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformnetworkResourceHandleh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/network/ResourceHandle.h (194155 => 194156)</h4>
<pre class="diff"><span>
<span class="info">--- 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)
</span><span class="lines">@@ -135,7 +135,6 @@
</span><span class="cx"> #endif
</span><span class="cx">         
</span><span class="cx"> #if PLATFORM(COCOA) &amp;&amp; ENABLE(WEB_TIMING)
</span><del>-    void setCollectsTimingData();
</del><span class="cx"> #if USE(CFNETWORK)
</span><span class="cx">     static void getConnectionTimingData(CFURLConnectionRef, ResourceLoadTiming&amp;);
</span><span class="cx"> #else
</span><span class="lines">@@ -285,10 +284,6 @@
</span><span class="cx">     void createNSURLConnection(id delegate, bool shouldUseCredentialStorage, bool shouldContentSniff, SchedulingBehavior, NSDictionary *connectionProperties);
</span><span class="cx"> #endif
</span><span class="cx"> 
</span><del>-#if PLATFORM(COCOA) &amp;&amp; ENABLE(WEB_TIMING)
-static void getConnectionTimingData(NSDictionary *timingData, ResourceLoadTiming&amp;);
-#endif
-
</del><span class="cx"> #if USE(SOUP)
</span><span class="cx">     void timeoutFired();
</span><span class="cx"> #endif
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformnetworkResourceLoadTimingh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/network/ResourceLoadTiming.h (194155 => 194156)</h4>
<pre class="diff"><span>
<span class="info">--- 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)
</span><span class="lines">@@ -27,6 +27,10 @@
</span><span class="cx"> #ifndef ResourceLoadTiming_h
</span><span class="cx"> #define ResourceLoadTiming_h
</span><span class="cx"> 
</span><ins>+#if PLATFORM(COCOA)
+OBJC_CLASS NSDictionary;
+#endif
+
</ins><span class="cx"> namespace WebCore {
</span><span class="cx">     
</span><span class="cx"> class ResourceLoadTiming {
</span><span class="lines">@@ -94,6 +98,14 @@
</span><span class="cx">     int secureConnectionStart;
</span><span class="cx"> };
</span><span class="cx"> 
</span><ins>+#if PLATFORM(COCOA)
+WEBCORE_EXPORT void copyTimingData(NSDictionary *timingData, ResourceLoadTiming&amp;);
+#endif
+
+#if PLATFORM(COCOA) &amp;&amp; !HAVE(TIMINGDATAOPTIONS)
+WEBCORE_EXPORT void setCollectsTimingData();
+#endif
+    
</ins><span class="cx"> template&lt;class Encoder&gt;
</span><span class="cx"> void ResourceLoadTiming::encode(Encoder&amp; encoder) const
</span><span class="cx"> {
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformnetworkcfResourceHandleCFNetcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/network/cf/ResourceHandleCFNet.cpp (194155 => 194156)</h4>
<pre class="diff"><span>
<span class="info">--- 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)
</span><span class="lines">@@ -207,8 +207,7 @@
</span><span class="cx">     else
</span><span class="cx">         propertiesDictionary = adoptCF(CFDictionaryCreateMutable(kCFAllocatorDefault, 0, &amp;kCFTypeDictionaryKeyCallBacks, &amp;kCFTypeDictionaryValueCallBacks));
</span><span class="cx"> #if HAVE(TIMINGDATAOPTIONS)
</span><del>-    const int64_t TimingDataOptionsEnableW3CNavigationTiming = (1 &lt;&lt; 0);
-    auto enableW3CNavigationTiming = adoptCF(CFNumberCreate(kCFAllocatorDefault, kCFNumberSInt64Type, &amp;TimingDataOptionsEnableW3CNavigationTiming));
</del><ins>+    auto enableW3CNavigationTiming = adoptCF(CFNumberCreate(kCFAllocatorDefault, kCFNumberSInt64Type, &amp;_TimingDataOptionsEnableW3CNavigationTiming));
</ins><span class="cx">     auto timingDataOptionsDictionary = adoptCF(CFDictionaryCreateMutable(kCFAllocatorDefault, 0, &amp;kCFTypeDictionaryKeyCallBacks, &amp;kCFTypeDictionaryValueCallBacks));
</span><span class="cx">     CFDictionaryAddValue(timingDataOptionsDictionary.get(), CFSTR(&quot;_kCFURLConnectionPropertyTimingDataOptions&quot;), enableW3CNavigationTiming.get());
</span><span class="cx">     CFDictionaryAddValue(propertiesDictionary.get(), CFSTR(&quot;kCFURLConnectionURLConnectionProperties&quot;), timingDataOptionsDictionary.get());
</span><span class="lines">@@ -252,7 +251,7 @@
</span><span class="cx"> 
</span><span class="cx">     bool shouldUseCredentialStorage = !client() || client()-&gt;shouldUseCredentialStorage(this);
</span><span class="cx"> 
</span><del>-#if ENABLE(WEB_TIMING) &amp;&amp; PLATFORM(COCOA)
</del><ins>+#if ENABLE(WEB_TIMING) &amp;&amp; PLATFORM(COCOA) &amp;&amp; !HAVE(TIMINGDATAOPTIONS)
</ins><span class="cx">     setCollectsTimingData();
</span><span class="cx"> #endif
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformnetworkcocoaResourceLoadTimingmm"></a>
<div class="addfile"><h4>Added: trunk/Source/WebCore/platform/network/cocoa/ResourceLoadTiming.mm (0 => 194156)</h4>
<pre class="diff"><span>
<span class="info">--- 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)
</span><span class="lines">@@ -0,0 +1,77 @@
</span><ins>+/*
+ * 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 &quot;config.h&quot;
+#import &quot;ResourceLoadTiming.h&quot;
+
+#import &lt;WebCore/NSURLConnectionSPI.h&gt;
+
+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&amp; 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, @&quot;_kCFNTimingDataFetchStart&quot;);
+    
+    double domainLookupStart = timingValue(timingData, @&quot;_kCFNTimingDataDomainLookupStart&quot;);
+    double domainLookupEnd = timingValue(timingData, @&quot;_kCFNTimingDataDomainLookupEnd&quot;);
+    double connectStart = timingValue(timingData, @&quot;_kCFNTimingDataConnectStart&quot;);
+    double secureConnectionStart = timingValue(timingData, @&quot;_kCFNTimingDataSecureConnectionStart&quot;);
+    double connectEnd = timingValue(timingData, @&quot;_kCFNTimingDataConnectEnd&quot;);
+    double requestStart = timingValue(timingData, @&quot;_kCFNTimingDataRequestStart&quot;);
+    double responseStart = timingValue(timingData, @&quot;_kCFNTimingDataResponseStart&quot;);
+    
+    timing.domainLookupStart = domainLookupStart &lt;= 0 ? -1 : (domainLookupStart - referenceStart) * 1000;
+    timing.domainLookupEnd = domainLookupEnd &lt;= 0 ? -1 : (domainLookupEnd - referenceStart) * 1000;
+    timing.connectStart = connectStart &lt;= 0 ? -1 : (connectStart - referenceStart) * 1000;
+    timing.secureConnectionStart = secureConnectionStart &lt;= 0 ? -1 : (secureConnectionStart - referenceStart) * 1000;
+    timing.connectEnd = connectEnd &lt;= 0 ? -1 : (connectEnd - referenceStart) * 1000;
+    timing.requestStart = requestStart &lt;= 0 ? 0 : (requestStart - referenceStart) * 1000;
+    timing.responseStart = responseStart &lt;= 0 ? 0 : (responseStart - referenceStart) * 1000;
+}
+
+#if !HAVE(TIMINGDATAOPTIONS)
+void setCollectsTimingData()
+{
+    static dispatch_once_t onceToken;
+    dispatch_once(&amp;onceToken, ^{
+        [NSURLConnection _setCollectsTimingData:YES];
+        [NSURLConnection _collectTimingDataWithOptions:TimingDataCollectionNStatsOff | TimingDataCollectionConnectionDataOff];
+    });
+}
+#endif
+    
+}
</ins></span></pre></div>
<a id="trunkSourceWebCoreplatformnetworkmacResourceHandleMacmm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/network/mac/ResourceHandleMac.mm (194155 => 194156)</h4>
<pre class="diff"><span>
<span class="info">--- 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)
</span><span class="lines">@@ -66,17 +66,6 @@
</span><span class="cx"> }
</span><span class="cx"> #endif // USE(CFNETWORK)
</span><span class="cx"> 
</span><del>-#if __has_include(&lt;Foundation/NSURLConnectionPrivate.h&gt;)
-#import &lt;Foundation/NSURLConnectionPrivate.h&gt;
-#else
-@interface NSURLConnection (TimingData)
-#if !HAVE(TIMINGDATAOPTIONS)
-+ (void)_setCollectsTimingData:(BOOL)collect;
-#endif
-- (NSDictionary *)_timingData;
-@end
-#endif
-
</del><span class="cx"> #if PLATFORM(IOS)
</span><span class="cx"> #import &quot;CFNetworkSPI.h&quot;
</span><span class="cx"> #import &quot;RuntimeApplicationChecksIOS.h&quot;
</span><span class="lines">@@ -145,7 +134,7 @@
</span><span class="cx"> void ResourceHandle::createNSURLConnection(id delegate, bool shouldUseCredentialStorage, bool shouldContentSniff, SchedulingBehavior schedulingBehavior, NSDictionary *connectionProperties)
</span><span class="cx"> #endif
</span><span class="cx"> {
</span><del>-#if ENABLE(WEB_TIMING)
</del><ins>+#if ENABLE(WEB_TIMING) &amp;&amp; !HAVE(TIMINGDATAOPTIONS)
</ins><span class="cx">     setCollectsTimingData();
</span><span class="cx"> #endif
</span><span class="cx"> 
</span><span class="lines">@@ -224,8 +213,7 @@
</span><span class="cx">     const bool usesCache = true;
</span><span class="cx"> #endif
</span><span class="cx"> #if HAVE(TIMINGDATAOPTIONS)
</span><del>-    const int64_t TimingDataOptionsEnableW3CNavigationTiming = (1 &lt;&lt; 0);
-    [propertyDictionary setObject:@{@&quot;_kCFURLConnectionPropertyTimingDataOptions&quot;: @(TimingDataOptionsEnableW3CNavigationTiming)} forKey:@&quot;kCFURLConnectionURLConnectionProperties&quot;];
</del><ins>+    [propertyDictionary setObject:@{@&quot;_kCFURLConnectionPropertyTimingDataOptions&quot;: @(_TimingDataOptionsEnableW3CNavigationTiming)} forKey:@&quot;kCFURLConnectionURLConnectionProperties&quot;];
</ins><span class="cx"> #endif
</span><span class="cx">     d-&gt;m_connection = adoptNS([[NSURLConnection alloc] _initWithRequest:nsRequest delegate:delegate usesCache:usesCache maxContentLength:0 startImmediately:NO connectionProperties:propertyDictionary]);
</span><span class="cx"> }
</span><span class="lines">@@ -739,55 +727,19 @@
</span><span class="cx"> #endif // !USE(CFNETWORK)
</span><span class="cx">     
</span><span class="cx"> #if ENABLE(WEB_TIMING)
</span><del>-    
-void ResourceHandle::getConnectionTimingData(NSDictionary *timingData, ResourceLoadTiming&amp; timing)
-{
-    if (!timingData)
-        return;
</del><span class="cx"> 
</span><del>-    // 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:@&quot;_kCFNTimingDataFetchStart&quot;] doubleValue];
-            
-    double domainLookupStart = [[timingData valueForKey:@&quot;_kCFNTimingDataDomainLookupStart&quot;] doubleValue];
-    double domainLookupEnd = [[timingData valueForKey:@&quot;_kCFNTimingDataDomainLookupEnd&quot;] doubleValue];
-    double connectStart = [[timingData valueForKey:@&quot;_kCFNTimingDataConnectStart&quot;] doubleValue];
-    double secureConnectionStart = [[timingData valueForKey:@&quot;_kCFNTimingDataSecureConnectionStart&quot;] doubleValue];
-    double connectEnd = [[timingData valueForKey:@&quot;_kCFNTimingDataConnectEnd&quot;] doubleValue];
-    double requestStart = [[timingData valueForKey:@&quot;_kCFNTimingDataRequestStart&quot;] doubleValue];
-    double responseStart = [[timingData valueForKey:@&quot;_kCFNTimingDataResponseStart&quot;] doubleValue];
-        
-    timing.domainLookupStart = domainLookupStart &lt;= 0 ? -1 : (domainLookupStart - referenceStart) * 1000;
-    timing.domainLookupEnd = domainLookupEnd &lt;= 0 ? -1 : (domainLookupEnd - referenceStart) * 1000;
-    timing.connectStart = connectStart &lt;= 0 ? -1 : (connectStart - referenceStart) * 1000;
-    timing.secureConnectionStart = secureConnectionStart &lt;= 0 ? -1 : (secureConnectionStart - referenceStart) * 1000;
-    timing.connectEnd = connectEnd &lt;= 0 ? -1 : (connectEnd - referenceStart) * 1000;
-    timing.requestStart = requestStart &lt;= 0 ? 0 : (requestStart - referenceStart) * 1000;
-    timing.responseStart = responseStart &lt;= 0 ? 0 : (responseStart - referenceStart) * 1000;
-}
-
-void ResourceHandle::setCollectsTimingData()
-{
-#if !HAVE(TIMINGDATAOPTIONS)
-    static dispatch_once_t onceToken;
-    dispatch_once(&amp;onceToken, ^{
-        [NSURLConnection _setCollectsTimingData:YES];
-    });
-#endif
-}
-
</del><span class="cx"> #if USE(CFNETWORK)
</span><span class="cx">     
</span><span class="cx"> void ResourceHandle::getConnectionTimingData(CFURLConnectionRef connection, ResourceLoadTiming&amp; timing)
</span><span class="cx"> {
</span><del>-    getConnectionTimingData((__bridge NSDictionary*)(adoptCF(_CFURLConnectionCopyTimingData(connection)).get()), timing);
</del><ins>+    copyTimingData((__bridge NSDictionary*)adoptCF(_CFURLConnectionCopyTimingData(connection)).get(), timing);
</ins><span class="cx"> }
</span><span class="cx">     
</span><span class="cx"> #else
</span><span class="cx">     
</span><span class="cx"> void ResourceHandle::getConnectionTimingData(NSURLConnection *connection, ResourceLoadTiming&amp; timing)
</span><span class="cx"> {
</span><del>-    getConnectionTimingData([connection _timingData], timing);
</del><ins>+    copyTimingData([connection _timingData], timing);
</ins><span class="cx"> }
</span><span class="cx">     
</span><span class="cx"> #endif
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformspicfCFNetworkSPIh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/spi/cf/CFNetworkSPI.h (194155 => 194156)</h4>
<pre class="diff"><span>
<span class="info">--- 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)
</span><span class="lines">@@ -51,8 +51,19 @@
</span><span class="cx"> #endif
</span><span class="cx"> #endif // defined(__OBJC__) &amp;&amp; (PLATFORM(IOS) || __MAC_OS_X_VERSION_MIN_REQUIRED &gt;= 101000)
</span><span class="cx"> 
</span><del>-#else
</del><ins>+#else // PLATFORM(WIN) || USE(APPLE_INTERNAL_SDK)
</ins><span class="cx"> 
</span><ins>+#if defined(__OBJC__)
+@interface NSURLSessionTask (TimingData)
+- (NSDictionary *)_timingData;
+@end
+#endif
+
+typedef CF_ENUM(int64_t, _TimingDataOptions)
+{
+    _TimingDataOptionsEnableW3CNavigationTiming = (1 &lt;&lt; 0)
+};
+
</ins><span class="cx"> typedef struct OpaqueCFHTTPCookieStorage* CFHTTPCookieStorageRef;
</span><span class="cx"> typedef const struct _CFCachedURLResponse* CFCachedURLResponseRef;
</span><span class="cx"> typedef const struct _CFURLCache* CFURLCacheRef;
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformspicocoaNSURLConnectionSPIh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/spi/cocoa/NSURLConnectionSPI.h (194155 => 194156)</h4>
<pre class="diff"><span>
<span class="info">--- 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)
</span><span class="lines">@@ -29,9 +29,21 @@
</span><span class="cx"> 
</span><span class="cx"> #else
</span><span class="cx"> 
</span><ins>+enum {
+    TimingDataCollectionDefault = 0,
+    TimingDataCollectionNStatsOff = 1,
+    TimingDataCollectionConnectionDataOff = 2,
+};
+typedef NSUInteger TimingDataCollection;
+
</ins><span class="cx"> @interface NSURLConnection ()
</span><span class="cx"> + (CFRunLoopRef)resourceLoaderRunLoop;
</span><span class="cx"> - (void)setDefersCallbacks:(BOOL)defers;
</span><ins>+#if PLATFORM(MAC) &amp;&amp; __MAC_OS_X_VERSION_MIN_REQUIRED &lt; 101100
++ (void)_setCollectsTimingData:(BOOL)collect;
++ (void)_collectTimingDataWithOptions:(TimingDataCollection)options;
+#endif
+- (NSDictionary *)_timingData;
</ins><span class="cx"> @end
</span><span class="cx"> 
</span><span class="cx"> #endif
</span></span></pre></div>
<a id="trunkSourceWebKit2ChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/ChangeLog (194155 => 194156)</h4>
<pre class="diff"><span>
<span class="info">--- 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)
</span><span class="lines">@@ -1,3 +1,15 @@
</span><ins>+2015-12-16  Alex Christensen  &lt;achristensen@webkit.org&gt;
+
+        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.
+
</ins><span class="cx"> 2015-12-16  Youenn Fablet  &lt;youenn.fablet@crf.canon.fr&gt;
</span><span class="cx"> 
</span><span class="cx">         [Fetch API] Add fetch API compile time flag
</span></span></pre></div>
<a id="trunkSourceWebKit2NetworkProcesscocoaNetworkSessionCocoamm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/NetworkProcess/cocoa/NetworkSessionCocoa.mm (194155 => 194156)</h4>
<pre class="diff"><span>
<span class="info">--- 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)
</span><span class="lines">@@ -37,6 +37,7 @@
</span><span class="cx"> #import &lt;WebCore/NetworkStorageSession.h&gt;
</span><span class="cx"> #import &lt;WebCore/NotImplemented.h&gt;
</span><span class="cx"> #import &lt;WebCore/ResourceError.h&gt;
</span><ins>+#import &lt;WebCore/ResourceLoadTiming.h&gt;
</ins><span class="cx"> #import &lt;WebCore/ResourceRequest.h&gt;
</span><span class="cx"> #import &lt;WebCore/ResourceResponse.h&gt;
</span><span class="cx"> #import &lt;WebCore/SharedBuffer.h&gt;
</span><span class="lines">@@ -142,6 +143,7 @@
</span><span class="cx">         if (auto* client = networkingTask-&gt;client()) {
</span><span class="cx">             ASSERT(isMainThread());
</span><span class="cx">             WebCore::ResourceResponse resourceResponse(response);
</span><ins>+            copyTimingData([dataTask _timingData], resourceResponse.resourceLoadTiming());
</ins><span class="cx">             auto completionHandlerCopy = Block_copy(completionHandler);
</span><span class="cx">             client-&gt;didReceiveResponse(resourceResponse, [completionHandlerCopy](WebCore::PolicyAction policyAction)
</span><span class="cx">                 {
</span><span class="lines">@@ -214,6 +216,13 @@
</span><span class="cx">     m_sessionDelegate = adoptNS([[NetworkSessionDelegate alloc] initWithNetworkSession:*this]);
</span><span class="cx"> 
</span><span class="cx">     NSURLSessionConfiguration *configuration = configurationForType(type);
</span><ins>+
+#if HAVE(TIMINGDATAOPTIONS)
+    configuration._timingDataOptions = _TimingDataOptionsEnableW3CNavigationTiming;
+#else
+    setCollectsTimingData();
+#endif
+
</ins><span class="cx">     if (auto* storageSession = SessionTracker::storageSession(sessionID)) {
</span><span class="cx">         if (CFHTTPCookieStorageRef storage = storageSession-&gt;cookieStorage().get())
</span><span class="cx">             configuration.HTTPCookieStorage = [[[NSHTTPCookieStorage alloc] _initWithCFHTTPCookieStorage:storage] autorelease];
</span></span></pre>
</div>
</div>

</body>
</html>