<!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>[212993] trunk</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/212993">212993</a></dd>
<dt>Author</dt> <dd>joepeck@webkit.org</dd>
<dt>Date</dt> <dd>2017-02-24 21:48:51 -0800 (Fri, 24 Feb 2017)</dd>
</dl>

<h3>Log Message</h3>
<pre>[Resource Timing] Gather timing information with reliable responseEnd time
https://bugs.webkit.org/show_bug.cgi?id=168351

Reviewed by Alex Christensen.

LayoutTests/imported/w3c:

* web-platform-tests/fetch/api/redirect/redirect-count-cross-origin-expected.txt:
* web-platform-tests/fetch/api/redirect/redirect-count-cross-origin-worker-expected.txt:
* web-platform-tests/fetch/api/redirect/redirect-count-expected.txt:
* web-platform-tests/fetch/api/redirect/redirect-count-worker-expected.txt:
* web-platform-tests/fetch/api/redirect/redirect-location-expected.txt:
* web-platform-tests/fetch/api/redirect/redirect-location-worker-expected.txt:
New behavior for too many redirects caused by &lt;rdar://problem/30610988&gt;.

* web-platform-tests/resource-timing/rt-nextHopProtocol-expected.txt: Added.
* web-platform-tests/resource-timing/rt-nextHopProtocol.html: Added.
* web-platform-tests/resource-timing/rt-nextHopProtocol.js: Added.
* web-platform-tests/resource-timing/rt-nextHopProtocol.worker-expected.txt: Added.
* web-platform-tests/resource-timing/rt-nextHopProtocol.worker.html: Added.
* web-platform-tests/resource-timing/rt-nextHopProtocol.worker.js: Added.
New tests specific to just checking the nextHopProtocol property with
a non-cached resource to avoid flakeyness.

Source/WebCore:

This patch replaces the unused `double finishTime` in ResourceLoader's
didFinishLoad with a complete WebCore::NetworkLoadMetrics object. This
allows the NetworkProcess to give complete timing information, and more
final metrics about the load, to WebCore. Currently this is only used
by ResourceTiming, but it will soon be used by Web Inspector as well.
We may also end up extending this to the didFail path as well, since it
is possible that we have some metrics for load failures.

At the same time we want to start moving away from the legacy path that
populated a subset of this information in ResourceResponse's NetworkLoadMetrics.
It doesn't make sense to store this information on the ResourceResponse
for a few reasons: We don't want to store the metrics in our Network Cache and
not all of the load timing metrics have been populated yet (responseEnd).
In an effort to move off of this data we've renamed the accessor to
&quot;deprecatedNetworkLoadMetrics&quot;. There are a few remaining clients
(ResourceHandle, PerformanceTiming, InspectorNetworkAgent) which can be
migrated separately from this patch.

Having both the legacy and new code paths adds a little bit of complexity.
One advantage of the new path is that the complete load timing data
(fetchStart -&gt; dns -&gt; connect -&gt; request -&gt; response -&gt; responseEnd) can
be packaged together. The legacy path could not include a responseEnd, so
WebCore faked that value with its own timestamp. Having the fake responseEnd
caused issues as timestamps / clocks are different between processes. In order
for PerformanceResponseTiming to know whether or not the NetworkLoadMetrics
has the complete network timing metrics it checks isComplete(). If true
it knows it can use the responseEnd time from NetworkLoadMetrics, otherwise
it must fallback to the legacy value from LoadTiming. Once all of the
deprecatedNetworkLoadMetrics clients go away, we should always have the
complete data and this can be eliminated.

Tests: imported/w3c/web-platform-tests/resource-timing/rt-nextHopProtocol.html
       imported/w3c/web-platform-tests/resource-timing/rt-nextHopProtocol.worker.html

* PlatformMac.cmake:
* WebCore.xcodeproj/project.pbxproj:
Rename NetworkLoadTiming -&gt; NetworkLoadMetrics.

* page/PerformanceResourceTiming.cpp:
(WebCore::entryStartTime):
(WebCore::entryEndTime):
(WebCore::PerformanceResourceTiming::PerformanceResourceTiming):
(WebCore::PerformanceResourceTiming::nextHopProtocol):
(WebCore::PerformanceResourceTiming::domainLookupStart):
(WebCore::PerformanceResourceTiming::domainLookupEnd):
(WebCore::PerformanceResourceTiming::connectStart):
(WebCore::PerformanceResourceTiming::connectEnd):
(WebCore::PerformanceResourceTiming::secureConnectionStart):
(WebCore::PerformanceResourceTiming::requestStart):
(WebCore::PerformanceResourceTiming::responseStart):
(WebCore::PerformanceResourceTiming::responseEnd):
(WebCore::PerformanceResourceTiming::networkLoadTimeToDOMHighResTimeStamp):
* page/PerformanceResourceTiming.h:
Mostly just updating names and types. This does however need to get the
correct endTime based on whether the NetworkLoadMetrics are complete
(meaning includes responseEnd) or not (legacy, use LoadTiming value).

* page/PerformanceResourceTiming.idl:
Add nextHopProtocol.

* page/PerformanceTiming.cpp:
(WebCore::PerformanceTiming::domainLookupStart):
(WebCore::PerformanceTiming::domainLookupEnd):
(WebCore::PerformanceTiming::connectStart):
(WebCore::PerformanceTiming::connectEnd):
(WebCore::PerformanceTiming::secureConnectionStart):
(WebCore::PerformanceTiming::requestStart):
(WebCore::PerformanceTiming::responseStart):
(WebCore::PerformanceTiming::resourceLoadTimeRelativeToFetchStart):
* page/PerformanceTiming.h:
Navigation Timing values still uses the NetworkLoadTiming values stored on
the DocumentLoader. This should be moved off of the deprecated path separately.

* platform/network/NetworkLoadMetrics.h: Renamed from Source/WebCore/platform/network/NetworkLoadTiming.h.
(WebCore::NetworkLoadMetrics::NetworkLoadMetrics):
(WebCore::NetworkLoadMetrics::isolatedCopy):
(WebCore::NetworkLoadMetrics::reset):
(WebCore::NetworkLoadMetrics::operator==):
(WebCore::NetworkLoadMetrics::operator!=):
(WebCore::NetworkLoadMetrics::isComplete):
(WebCore::NetworkLoadMetrics::markComplete):
(WebCore::NetworkLoadMetrics::encode):
(WebCore::NetworkLoadMetrics::decode):
Re-introduce a reset() method (for NetworkLoadSoup to reset between redirects).
Add protocolName and &quot;complete&quot; boolean.

* platform/network/cocoa/NetworkLoadMetrics.mm: Renamed from Source/WebCore/platform/network/cocoa/NetworkLoadTiming.mm.
(WebCore::timingValue):
(WebCore::copyTimingData):
(WebCore::setCollectsTimingData):
Use this opportunity to convert NetworkLoadTiming timestamps to WTF::Seconds.
Since we already have to modify all the clients this moves us to use the more
strongly typed units that are less ambiguous then &quot;double&quot;. The rest of the
Performance API has already moved to these units.

* inspector/InspectorNetworkAgent.cpp:
(WebCore::InspectorNetworkAgent::buildObjectForTiming):
(WebCore::InspectorNetworkAgent::buildObjectForResourceResponse):
(WebCore::InspectorNetworkAgent::didFinishLoading):
* inspector/InspectorNetworkAgent.h:
Inspector was the only client of the finishTime, and since the value was
erratically coming from clients in different ways it was almost certainly
inaccurate. Simplify this in preparation for using NetworkLoadMetrics.

* Modules/fetch/FetchLoader.cpp:
(WebCore::FetchLoader::didFinishLoading):
* Modules/fetch/FetchLoader.h:
* fileapi/FileReaderLoader.cpp:
(WebCore::FileReaderLoader::didFinishLoading):
* fileapi/FileReaderLoader.h:
* html/MediaFragmentURIParser.cpp:
(WebCore::MediaFragmentURIParser::parseNPTTime):
* inspector/InspectorInstrumentation.cpp:
(WebCore::InspectorInstrumentation::didFinishLoadingImpl):
* inspector/InspectorInstrumentation.h:
(WebCore::InspectorInstrumentation::didFinishLoading):
* loader/CrossOriginPreflightChecker.cpp:
(WebCore::CrossOriginPreflightChecker::validatePreflightResponse):
* loader/DocumentLoader.cpp:
(WebCore::DocumentLoader::notifyFinished):
(WebCore::DocumentLoader::finishedLoading):
(WebCore::DocumentLoader::continueAfterContentPolicy):
(WebCore::DocumentLoader::maybeLoadEmpty):
* loader/DocumentLoader.h:
* loader/DocumentThreadableLoader.cpp:
(WebCore::DocumentThreadableLoader::didReceiveResponse):
(WebCore::DocumentThreadableLoader::notifyFinished):
(WebCore::DocumentThreadableLoader::didFinishLoading):
(WebCore::DocumentThreadableLoader::loadRequest):
* loader/DocumentThreadableLoader.h:
* loader/NetscapePlugInStreamLoader.cpp:
(WebCore::NetscapePlugInStreamLoader::didFinishLoading):
* loader/NetscapePlugInStreamLoader.h:
* loader/ResourceLoadNotifier.cpp:
(WebCore::ResourceLoadNotifier::didFinishLoad):
(WebCore::ResourceLoadNotifier::dispatchDidFinishLoading):
(WebCore::ResourceLoadNotifier::sendRemainingDelegateMessages):
* loader/ResourceLoadNotifier.h:
* loader/ResourceLoader.cpp:
(WebCore::ResourceLoader::deliverResponseAndData):
(WebCore::ResourceLoader::loadDataURL):
(WebCore::ResourceLoader::didFinishLoading):
(WebCore::ResourceLoader::didFinishLoadingOnePart):
* loader/ResourceLoader.h:
* loader/ResourceTiming.cpp:
(WebCore::ResourceTiming::fromLoad):
(WebCore::ResourceTiming::fromSynchronousLoad):
(WebCore::ResourceTiming::ResourceTiming):
(WebCore::ResourceTiming::isolatedCopy):
* loader/ResourceTiming.h:
(WebCore::ResourceTiming::networkLoadMetrics):
(WebCore::ResourceTiming::ResourceTiming):
(WebCore::ResourceTiming::networkLoadTiming): Deleted.
* loader/SubresourceLoader.cpp:
(WebCore::SubresourceLoader::SubresourceLoader):
(WebCore::SubresourceLoader::willSendRequestInternal):
(WebCore::SubresourceLoader::didReceiveResponse):
(WebCore::SubresourceLoader::didFinishLoading):
(WebCore::SubresourceLoader::reportResourceTiming):
* loader/SubresourceLoader.h:
* loader/ThreadableLoaderClient.h:
(WebCore::ThreadableLoaderClient::didFinishLoading):
* loader/ThreadableLoaderClientWrapper.h:
(WebCore::ThreadableLoaderClientWrapper::didFinishLoading):
* loader/WorkerThreadableLoader.cpp:
(WebCore::WorkerThreadableLoader::MainThreadBridge::didFinishLoading):
* loader/WorkerThreadableLoader.h:
* loader/appcache/ApplicationCacheGroup.cpp:
(WebCore::ApplicationCacheGroup::didFinishLoading):
* loader/appcache/ApplicationCacheGroup.h:
* loader/cache/CachedResource.h:
(WebCore::CachedResource::setLoadFinishTime):
* loader/ios/QuickLook.mm:
(-[WebPreviewLoader connectionDidFinishLoading:]):
* page/EventSource.cpp:
(WebCore::EventSource::didFinishLoading):
* page/EventSource.h:
* platform/graphics/gstreamer/WebKitWebSourceGStreamer.cpp:
(ResourceHandleStreamingClient::didFinishLoading):
* platform/network/BlobResourceHandle.cpp:
(WebCore::doNotifyFinish):
* platform/network/PingHandle.h:
* platform/network/ResourceHandle.h:
* platform/network/ResourceHandleClient.h:
(WebCore::ResourceHandleClient::didFinishLoading):
* platform/network/ResourceResponseBase.cpp:
(WebCore::ResourceResponseBase::crossThreadData):
(WebCore::ResourceResponseBase::fromCrossThreadData):
(WebCore::ResourceResponseBase::compare):
* platform/network/ResourceResponseBase.h:
(WebCore::ResourceResponseBase::deprecatedNetworkLoadMetrics):
(WebCore::ResourceResponseBase::encode):
(WebCore::ResourceResponseBase::decode):
(WebCore::ResourceResponseBase::networkLoadTiming): Deleted.
* platform/network/SynchronousLoaderClient.cpp:
(WebCore::SynchronousLoaderClient::didFinishLoading):
* platform/network/SynchronousLoaderClient.h:
* platform/network/cf/ResourceHandleCFURLConnectionDelegateWithOperationQueue.cpp:
(WebCore::ResourceHandleCFURLConnectionDelegateWithOperationQueue::didReceiveResponse):
(WebCore::ResourceHandleCFURLConnectionDelegateWithOperationQueue::didFinishLoading):
* platform/network/cf/SynchronousResourceHandleCFURLConnectionDelegate.cpp:
(WebCore::SynchronousResourceHandleCFURLConnectionDelegate::didReceiveResponse):
(WebCore::SynchronousResourceHandleCFURLConnectionDelegate::didFinishLoading):
* platform/network/curl/ResourceHandleCurl.cpp:
(WebCore::WebCoreSynchronousLoader::didFinishLoading):
* platform/network/curl/ResourceHandleManager.cpp:
(WebCore::calculateWebTimingInformations):
(WebCore::ResourceHandleManager::downloadTimerCallback):
(WebCore::handleDataURL):
(WebCore::milisecondsSinceRequest): Deleted.
* platform/network/mac/ResourceHandleMac.mm:
(WebCore::ResourceHandle::getConnectionTimingData):
* platform/network/mac/WebCoreResourceHandleAsDelegate.mm:
(-[WebCoreResourceHandleAsDelegate connection:didReceiveResponse:]):
(-[WebCoreResourceHandleAsDelegate connectionDidFinishLoading:]):
* platform/network/mac/WebCoreResourceHandleAsOperationQueueDelegate.mm:
(-[WebCoreResourceHandleAsOperationQueueDelegate connection:didReceiveResponse:]):
(-[WebCoreResourceHandleAsOperationQueueDelegate connectionDidFinishLoading:]):
* platform/network/soup/ResourceHandleSoup.cpp:
(WebCore::restartedCallback):
(WebCore::nextMultipartResponsePartCallback):
(WebCore::sendRequestCallback):
(WebCore::ResourceHandle::didStartRequest):
(WebCore::networkEventCallback):
(WebCore::ResourceHandle::sendPendingRequest):
(WebCore::readCallback):
(WebCore::milisecondsSinceRequest): Deleted.
* workers/WorkerScriptLoader.cpp:
(WebCore::WorkerScriptLoader::didFinishLoading):
* workers/WorkerScriptLoader.h:
* xml/XMLHttpRequest.cpp:
(WebCore::XMLHttpRequest::didFinishLoading):
* xml/XMLHttpRequest.h:
Eliminate the unused finishTime double.

Source/WebKit2:

Change from an unused `double finishTime` to a complete WebCore::NetworkLoadMetrics
object in the didFinishLoad ResourceLoader path. We may also extend this in the
didFail path later on. This allows the NetworkProcess to give complete timing
information, and more final metrics about the load, to WebCore.

* NetworkProcess/NetworkDataTask.h:
(WebKit::NetworkDataTaskClient::didCompleteWithError):
Give the NetworkDataTaskClient a basic didCompleteWithError for a completion
without metrics. For loads that complete with an error, or haven't populated
any metrics, this will pass empty metrics onward.

* NetworkProcess/Downloads/BlobDownloadClient.cpp:
(WebKit::BlobDownloadClient::didFinishLoading):
* NetworkProcess/Downloads/BlobDownloadClient.h:
* NetworkProcess/Downloads/PendingDownload.h:
* NetworkProcess/PingLoad.h:
* NetworkProcess/cache/NetworkCacheSpeculativeLoad.cpp:
(WebKit::NetworkCache::SpeculativeLoad::didFinishLoading):
* NetworkProcess/cache/NetworkCacheSpeculativeLoad.h:
* NetworkProcess/NetworkDataTaskBlob.cpp:
(WebKit::NetworkDataTaskBlob::didFail):
* NetworkProcess/NetworkLoad.cpp:
(WebKit::NetworkLoad::continueWillSendRequest):
(WebKit::NetworkLoad::didCompleteWithError):
(WebKit::NetworkLoad::didFinishLoading):
* NetworkProcess/NetworkLoad.h:
* NetworkProcess/NetworkLoadClient.h:
* NetworkProcess/NetworkResourceLoader.cpp:
(WebKit::NetworkResourceLoader::didFinishLoading):
(WebKit::NetworkResourceLoader::sendResultForCacheEntry):
* NetworkProcess/NetworkResourceLoader.h:
* WebProcess/Network/WebResourceLoader.cpp:
(WebKit::WebResourceLoader::didFinishResourceLoad):
(WebKit::WebResourceLoader::didReceiveResource):
* WebProcess/Network/WebResourceLoader.h:
* WebProcess/Network/WebResourceLoader.messages.in:
Change didFinishLoad paths to take a NetworkLoadMetrics object instead of finishTime.
Change didCompleteWithError pathes to include a NetworkLoadMetrics object instead of finishTime.

* NetworkProcess/cocoa/NetworkDataTaskCocoa.h:
* NetworkProcess/cocoa/NetworkDataTaskCocoa.mm:
(WebKit::NetworkDataTaskCocoa::didCompleteWithError):
Own a NetworkLoadTiming that will be populated with the load.

* NetworkProcess/cocoa/NetworkSessionCocoa.h:
* NetworkProcess/cocoa/NetworkSessionCocoa.mm:
(-[WKNetworkSessionDelegate URLSession:task:didCompleteWithError:]):
(-[WKNetworkSessionDelegate URLSession:task:didFinishCollectingMetrics:]):
(-[WKNetworkSessionDelegate URLSession:dataTask:didReceiveResponse:completionHandler:]):
Populate NetworkLoadMetrics in the didFinishCollectingMetrics NSURLSessionTaskDelegate method.

* NetworkProcess/soup/NetworkDataTaskSoup.cpp:
(WebKit::NetworkDataTaskSoup::NetworkDataTaskSoup):
(WebKit::NetworkDataTaskSoup::timeoutFired):
(WebKit::NetworkDataTaskSoup::didSendRequest):
(WebKit::NetworkDataTaskSoup::dispatchDidReceiveResponse):
(WebKit::NetworkDataTaskSoup::dispatchDidCompleteWithError):
(WebKit::NetworkDataTaskSoup::tlsErrorsChanged):
(WebKit::NetworkDataTaskSoup::continueHTTPRedirection):
(WebKit::NetworkDataTaskSoup::didFinishRead):
(WebKit::NetworkDataTaskSoup::didFinishRequestNextPart):
(WebKit::NetworkDataTaskSoup::didFailDownload):
(WebKit::NetworkDataTaskSoup::didFail):
(WebKit::NetworkDataTaskSoup::networkEvent):
(WebKit::NetworkDataTaskSoup::didStartRequest):
(WebKit::NetworkDataTaskSoup::didRestart):
* NetworkProcess/soup/NetworkDataTaskSoup.h:
Instead of populating the NetworkLoadMetrics on the ResourceResponse, populate
a member variable during the entire load and dispatch didFinishCollectingMetrics
right before didCompleteLoadWithError.

Source/WTF:

* wtf/persistence/Coders.h:
(WTF::Persistence::Coder&lt;Seconds&gt;::encode):
(WTF::Persistence::Coder&lt;Seconds&gt;::decode):

LayoutTests:

* TestExpectations:
Now that nextHopProtocol is available on Mac mark the test as flakey
because the value can be set or not depending on whether or not the
resource was loaded from a cache.

* platform/ios-simulator/TestExpectations:
* platform/gtk/TestExpectations:
* platform/mac/TestExpectations:
* platform/win/TestExpectations:
Mark nextHopProtocol tests as expected to fail on ports that do not
yet support those values. Mark redirect tests as failing on ports
that encounter the CFNetwork issue causing unexpected callbacks.

* performance-api/resource-timing-apis-expected.txt:
* performance-api/resources/resource-timing-api.js:
Progressions.

* platform/mac-elcapitan/imported/w3c/web-platform-tests/resource-timing/test_resource_timing-expected.txt: Added.
* platform/mac/imported/w3c/web-platform-tests/resource-timing/test_resource_timing-expected.txt: Added.
Expected passing values on mac, except el capitan where this new resource timing data is unavailable.</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkLayoutTestsChangeLog">trunk/LayoutTests/ChangeLog</a></li>
<li><a href="#trunkLayoutTestsTestExpectations">trunk/LayoutTests/TestExpectations</a></li>
<li><a href="#trunkLayoutTestsimportedw3cChangeLog">trunk/LayoutTests/imported/w3c/ChangeLog</a></li>
<li><a href="#trunkLayoutTestsperformanceapiresourcetimingapisexpectedtxt">trunk/LayoutTests/performance-api/resource-timing-apis-expected.txt</a></li>
<li><a href="#trunkLayoutTestsperformanceapiresourcesresourcetimingapijs">trunk/LayoutTests/performance-api/resources/resource-timing-api.js</a></li>
<li><a href="#trunkLayoutTestsplatformgtkTestExpectations">trunk/LayoutTests/platform/gtk/TestExpectations</a></li>
<li><a href="#trunkLayoutTestsplatformiossimulatorTestExpectations">trunk/LayoutTests/platform/ios-simulator/TestExpectations</a></li>
<li><a href="#trunkLayoutTestsplatformmacTestExpectations">trunk/LayoutTests/platform/mac/TestExpectations</a></li>
<li><a href="#trunkLayoutTestsplatformmacwk1TestExpectations">trunk/LayoutTests/platform/mac-wk1/TestExpectations</a></li>
<li><a href="#trunkLayoutTestsplatformwinTestExpectations">trunk/LayoutTests/platform/win/TestExpectations</a></li>
<li><a href="#trunkSourceWTFChangeLog">trunk/Source/WTF/ChangeLog</a></li>
<li><a href="#trunkSourceWTFwtfpersistenceCodersh">trunk/Source/WTF/wtf/persistence/Coders.h</a></li>
<li><a href="#trunkSourceWebCoreChangeLog">trunk/Source/WebCore/ChangeLog</a></li>
<li><a href="#trunkSourceWebCoreModulesfetchFetchLoadercpp">trunk/Source/WebCore/Modules/fetch/FetchLoader.cpp</a></li>
<li><a href="#trunkSourceWebCoreModulesfetchFetchLoaderh">trunk/Source/WebCore/Modules/fetch/FetchLoader.h</a></li>
<li><a href="#trunkSourceWebCorePlatformMaccmake">trunk/Source/WebCore/PlatformMac.cmake</a></li>
<li><a href="#trunkSourceWebCoreWebCorexcodeprojprojectpbxproj">trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj</a></li>
<li><a href="#trunkSourceWebCorefileapiFileReaderLoadercpp">trunk/Source/WebCore/fileapi/FileReaderLoader.cpp</a></li>
<li><a href="#trunkSourceWebCorefileapiFileReaderLoaderh">trunk/Source/WebCore/fileapi/FileReaderLoader.h</a></li>
<li><a href="#trunkSourceWebCorehtmlMediaFragmentURIParsercpp">trunk/Source/WebCore/html/MediaFragmentURIParser.cpp</a></li>
<li><a href="#trunkSourceWebCoreinspectorInspectorInstrumentationcpp">trunk/Source/WebCore/inspector/InspectorInstrumentation.cpp</a></li>
<li><a href="#trunkSourceWebCoreinspectorInspectorInstrumentationh">trunk/Source/WebCore/inspector/InspectorInstrumentation.h</a></li>
<li><a href="#trunkSourceWebCoreinspectorInspectorNetworkAgentcpp">trunk/Source/WebCore/inspector/InspectorNetworkAgent.cpp</a></li>
<li><a href="#trunkSourceWebCoreinspectorInspectorNetworkAgenth">trunk/Source/WebCore/inspector/InspectorNetworkAgent.h</a></li>
<li><a href="#trunkSourceWebCoreloaderCrossOriginPreflightCheckercpp">trunk/Source/WebCore/loader/CrossOriginPreflightChecker.cpp</a></li>
<li><a href="#trunkSourceWebCoreloaderDocumentLoadercpp">trunk/Source/WebCore/loader/DocumentLoader.cpp</a></li>
<li><a href="#trunkSourceWebCoreloaderDocumentLoaderh">trunk/Source/WebCore/loader/DocumentLoader.h</a></li>
<li><a href="#trunkSourceWebCoreloaderDocumentThreadableLoadercpp">trunk/Source/WebCore/loader/DocumentThreadableLoader.cpp</a></li>
<li><a href="#trunkSourceWebCoreloaderDocumentThreadableLoaderh">trunk/Source/WebCore/loader/DocumentThreadableLoader.h</a></li>
<li><a href="#trunkSourceWebCoreloaderNetscapePlugInStreamLoadercpp">trunk/Source/WebCore/loader/NetscapePlugInStreamLoader.cpp</a></li>
<li><a href="#trunkSourceWebCoreloaderNetscapePlugInStreamLoaderh">trunk/Source/WebCore/loader/NetscapePlugInStreamLoader.h</a></li>
<li><a href="#trunkSourceWebCoreloaderResourceLoadNotifiercpp">trunk/Source/WebCore/loader/ResourceLoadNotifier.cpp</a></li>
<li><a href="#trunkSourceWebCoreloaderResourceLoadNotifierh">trunk/Source/WebCore/loader/ResourceLoadNotifier.h</a></li>
<li><a href="#trunkSourceWebCoreloaderResourceLoadercpp">trunk/Source/WebCore/loader/ResourceLoader.cpp</a></li>
<li><a href="#trunkSourceWebCoreloaderResourceLoaderh">trunk/Source/WebCore/loader/ResourceLoader.h</a></li>
<li><a href="#trunkSourceWebCoreloaderResourceTimingcpp">trunk/Source/WebCore/loader/ResourceTiming.cpp</a></li>
<li><a href="#trunkSourceWebCoreloaderResourceTimingh">trunk/Source/WebCore/loader/ResourceTiming.h</a></li>
<li><a href="#trunkSourceWebCoreloaderSubresourceLoadercpp">trunk/Source/WebCore/loader/SubresourceLoader.cpp</a></li>
<li><a href="#trunkSourceWebCoreloaderSubresourceLoaderh">trunk/Source/WebCore/loader/SubresourceLoader.h</a></li>
<li><a href="#trunkSourceWebCoreloaderThreadableLoaderClienth">trunk/Source/WebCore/loader/ThreadableLoaderClient.h</a></li>
<li><a href="#trunkSourceWebCoreloaderThreadableLoaderClientWrapperh">trunk/Source/WebCore/loader/ThreadableLoaderClientWrapper.h</a></li>
<li><a href="#trunkSourceWebCoreloaderWorkerThreadableLoadercpp">trunk/Source/WebCore/loader/WorkerThreadableLoader.cpp</a></li>
<li><a href="#trunkSourceWebCoreloaderWorkerThreadableLoaderh">trunk/Source/WebCore/loader/WorkerThreadableLoader.h</a></li>
<li><a href="#trunkSourceWebCoreloaderappcacheApplicationCacheGroupcpp">trunk/Source/WebCore/loader/appcache/ApplicationCacheGroup.cpp</a></li>
<li><a href="#trunkSourceWebCoreloaderappcacheApplicationCacheGrouph">trunk/Source/WebCore/loader/appcache/ApplicationCacheGroup.h</a></li>
<li><a href="#trunkSourceWebCoreloadercacheCachedResourceh">trunk/Source/WebCore/loader/cache/CachedResource.h</a></li>
<li><a href="#trunkSourceWebCoreloaderiosQuickLookmm">trunk/Source/WebCore/loader/ios/QuickLook.mm</a></li>
<li><a href="#trunkSourceWebCorepageEventSourcecpp">trunk/Source/WebCore/page/EventSource.cpp</a></li>
<li><a href="#trunkSourceWebCorepageEventSourceh">trunk/Source/WebCore/page/EventSource.h</a></li>
<li><a href="#trunkSourceWebCorepagePerformanceResourceTimingcpp">trunk/Source/WebCore/page/PerformanceResourceTiming.cpp</a></li>
<li><a href="#trunkSourceWebCorepagePerformanceResourceTimingh">trunk/Source/WebCore/page/PerformanceResourceTiming.h</a></li>
<li><a href="#trunkSourceWebCorepagePerformanceResourceTimingidl">trunk/Source/WebCore/page/PerformanceResourceTiming.idl</a></li>
<li><a href="#trunkSourceWebCorepagePerformanceTimingcpp">trunk/Source/WebCore/page/PerformanceTiming.cpp</a></li>
<li><a href="#trunkSourceWebCorepagePerformanceTimingh">trunk/Source/WebCore/page/PerformanceTiming.h</a></li>
<li><a href="#trunkSourceWebCoreplatformgraphicsgstreamerWebKitWebSourceGStreamercpp">trunk/Source/WebCore/platform/graphics/gstreamer/WebKitWebSourceGStreamer.cpp</a></li>
<li><a href="#trunkSourceWebCoreplatformnetworkBlobResourceHandlecpp">trunk/Source/WebCore/platform/network/BlobResourceHandle.cpp</a></li>
<li><a href="#trunkSourceWebCoreplatformnetworkPingHandleh">trunk/Source/WebCore/platform/network/PingHandle.h</a></li>
<li><a href="#trunkSourceWebCoreplatformnetworkResourceHandleh">trunk/Source/WebCore/platform/network/ResourceHandle.h</a></li>
<li><a href="#trunkSourceWebCoreplatformnetworkResourceHandleClienth">trunk/Source/WebCore/platform/network/ResourceHandleClient.h</a></li>
<li><a href="#trunkSourceWebCoreplatformnetworkResourceResponseBasecpp">trunk/Source/WebCore/platform/network/ResourceResponseBase.cpp</a></li>
<li><a href="#trunkSourceWebCoreplatformnetworkResourceResponseBaseh">trunk/Source/WebCore/platform/network/ResourceResponseBase.h</a></li>
<li><a href="#trunkSourceWebCoreplatformnetworkSynchronousLoaderClientcpp">trunk/Source/WebCore/platform/network/SynchronousLoaderClient.cpp</a></li>
<li><a href="#trunkSourceWebCoreplatformnetworkSynchronousLoaderClienth">trunk/Source/WebCore/platform/network/SynchronousLoaderClient.h</a></li>
<li><a href="#trunkSourceWebCoreplatformnetworkcfResourceHandleCFURLConnectionDelegateWithOperationQueuecpp">trunk/Source/WebCore/platform/network/cf/ResourceHandleCFURLConnectionDelegateWithOperationQueue.cpp</a></li>
<li><a href="#trunkSourceWebCoreplatformnetworkcfSynchronousResourceHandleCFURLConnectionDelegatecpp">trunk/Source/WebCore/platform/network/cf/SynchronousResourceHandleCFURLConnectionDelegate.cpp</a></li>
<li><a href="#trunkSourceWebCoreplatformnetworkcurlResourceHandleCurlcpp">trunk/Source/WebCore/platform/network/curl/ResourceHandleCurl.cpp</a></li>
<li><a href="#trunkSourceWebCoreplatformnetworkcurlResourceHandleManagercpp">trunk/Source/WebCore/platform/network/curl/ResourceHandleManager.cpp</a></li>
<li><a href="#trunkSourceWebCoreplatformnetworkmacResourceHandleMacmm">trunk/Source/WebCore/platform/network/mac/ResourceHandleMac.mm</a></li>
<li><a href="#trunkSourceWebCoreplatformnetworkmacWebCoreResourceHandleAsDelegatemm">trunk/Source/WebCore/platform/network/mac/WebCoreResourceHandleAsDelegate.mm</a></li>
<li><a href="#trunkSourceWebCoreplatformnetworkmacWebCoreResourceHandleAsOperationQueueDelegatemm">trunk/Source/WebCore/platform/network/mac/WebCoreResourceHandleAsOperationQueueDelegate.mm</a></li>
<li><a href="#trunkSourceWebCoreplatformnetworksoupResourceHandleSoupcpp">trunk/Source/WebCore/platform/network/soup/ResourceHandleSoup.cpp</a></li>
<li><a href="#trunkSourceWebCoreworkersWorkerScriptLoadercpp">trunk/Source/WebCore/workers/WorkerScriptLoader.cpp</a></li>
<li><a href="#trunkSourceWebCoreworkersWorkerScriptLoaderh">trunk/Source/WebCore/workers/WorkerScriptLoader.h</a></li>
<li><a href="#trunkSourceWebCorexmlXMLHttpRequestcpp">trunk/Source/WebCore/xml/XMLHttpRequest.cpp</a></li>
<li><a href="#trunkSourceWebCorexmlXMLHttpRequesth">trunk/Source/WebCore/xml/XMLHttpRequest.h</a></li>
<li><a href="#trunkSourceWebKit2ChangeLog">trunk/Source/WebKit2/ChangeLog</a></li>
<li><a href="#trunkSourceWebKit2NetworkProcessDownloadsBlobDownloadClientcpp">trunk/Source/WebKit2/NetworkProcess/Downloads/BlobDownloadClient.cpp</a></li>
<li><a href="#trunkSourceWebKit2NetworkProcessDownloadsBlobDownloadClienth">trunk/Source/WebKit2/NetworkProcess/Downloads/BlobDownloadClient.h</a></li>
<li><a href="#trunkSourceWebKit2NetworkProcessDownloadsPendingDownloadh">trunk/Source/WebKit2/NetworkProcess/Downloads/PendingDownload.h</a></li>
<li><a href="#trunkSourceWebKit2NetworkProcessNetworkDataTaskh">trunk/Source/WebKit2/NetworkProcess/NetworkDataTask.h</a></li>
<li><a href="#trunkSourceWebKit2NetworkProcessNetworkLoadcpp">trunk/Source/WebKit2/NetworkProcess/NetworkLoad.cpp</a></li>
<li><a href="#trunkSourceWebKit2NetworkProcessNetworkLoadh">trunk/Source/WebKit2/NetworkProcess/NetworkLoad.h</a></li>
<li><a href="#trunkSourceWebKit2NetworkProcessNetworkLoadClienth">trunk/Source/WebKit2/NetworkProcess/NetworkLoadClient.h</a></li>
<li><a href="#trunkSourceWebKit2NetworkProcessNetworkResourceLoadercpp">trunk/Source/WebKit2/NetworkProcess/NetworkResourceLoader.cpp</a></li>
<li><a href="#trunkSourceWebKit2NetworkProcessNetworkResourceLoaderh">trunk/Source/WebKit2/NetworkProcess/NetworkResourceLoader.h</a></li>
<li><a href="#trunkSourceWebKit2NetworkProcessPingLoadh">trunk/Source/WebKit2/NetworkProcess/PingLoad.h</a></li>
<li><a href="#trunkSourceWebKit2NetworkProcesscacheNetworkCacheSpeculativeLoadcpp">trunk/Source/WebKit2/NetworkProcess/cache/NetworkCacheSpeculativeLoad.cpp</a></li>
<li><a href="#trunkSourceWebKit2NetworkProcesscacheNetworkCacheSpeculativeLoadh">trunk/Source/WebKit2/NetworkProcess/cache/NetworkCacheSpeculativeLoad.h</a></li>
<li><a href="#trunkSourceWebKit2NetworkProcesscocoaNetworkDataTaskCocoah">trunk/Source/WebKit2/NetworkProcess/cocoa/NetworkDataTaskCocoa.h</a></li>
<li><a href="#trunkSourceWebKit2NetworkProcesscocoaNetworkDataTaskCocoamm">trunk/Source/WebKit2/NetworkProcess/cocoa/NetworkDataTaskCocoa.mm</a></li>
<li><a href="#trunkSourceWebKit2NetworkProcesscocoaNetworkSessionCocoah">trunk/Source/WebKit2/NetworkProcess/cocoa/NetworkSessionCocoa.h</a></li>
<li><a href="#trunkSourceWebKit2NetworkProcesscocoaNetworkSessionCocoamm">trunk/Source/WebKit2/NetworkProcess/cocoa/NetworkSessionCocoa.mm</a></li>
<li><a href="#trunkSourceWebKit2NetworkProcesssoupNetworkDataTaskSoupcpp">trunk/Source/WebKit2/NetworkProcess/soup/NetworkDataTaskSoup.cpp</a></li>
<li><a href="#trunkSourceWebKit2NetworkProcesssoupNetworkDataTaskSouph">trunk/Source/WebKit2/NetworkProcess/soup/NetworkDataTaskSoup.h</a></li>
<li><a href="#trunkSourceWebKit2WebProcessNetworkWebResourceLoadercpp">trunk/Source/WebKit2/WebProcess/Network/WebResourceLoader.cpp</a></li>
<li><a href="#trunkSourceWebKit2WebProcessNetworkWebResourceLoaderh">trunk/Source/WebKit2/WebProcess/Network/WebResourceLoader.h</a></li>
<li><a href="#trunkSourceWebKit2WebProcessNetworkWebResourceLoadermessagesin">trunk/Source/WebKit2/WebProcess/Network/WebResourceLoader.messages.in</a></li>
</ul>

<h3>Added Paths</h3>
<ul>
<li><a href="#trunkLayoutTestsimportedw3cwebplatformtestsresourcetimingrtnextHopProtocolexpectedtxt">trunk/LayoutTests/imported/w3c/web-platform-tests/resource-timing/rt-nextHopProtocol-expected.txt</a></li>
<li><a href="#trunkLayoutTestsimportedw3cwebplatformtestsresourcetimingrtnextHopProtocolhtml">trunk/LayoutTests/imported/w3c/web-platform-tests/resource-timing/rt-nextHopProtocol.html</a></li>
<li><a href="#trunkLayoutTestsimportedw3cwebplatformtestsresourcetimingrtnextHopProtocoljs">trunk/LayoutTests/imported/w3c/web-platform-tests/resource-timing/rt-nextHopProtocol.js</a></li>
<li><a href="#trunkLayoutTestsimportedw3cwebplatformtestsresourcetimingrtnextHopProtocolworkerexpectedtxt">trunk/LayoutTests/imported/w3c/web-platform-tests/resource-timing/rt-nextHopProtocol.worker-expected.txt</a></li>
<li><a href="#trunkLayoutTestsimportedw3cwebplatformtestsresourcetimingrtnextHopProtocolworkerhtml">trunk/LayoutTests/imported/w3c/web-platform-tests/resource-timing/rt-nextHopProtocol.worker.html</a></li>
<li><a href="#trunkLayoutTestsimportedw3cwebplatformtestsresourcetimingrtnextHopProtocolworkerjs">trunk/LayoutTests/imported/w3c/web-platform-tests/resource-timing/rt-nextHopProtocol.worker.js</a></li>
<li>trunk/LayoutTests/platform/mac/imported/w3c/web-platform-tests/resource-timing/</li>
<li><a href="#trunkLayoutTestsplatformmacimportedw3cwebplatformtestsresourcetimingtest_resource_timingexpectedtxt">trunk/LayoutTests/platform/mac/imported/w3c/web-platform-tests/resource-timing/test_resource_timing-expected.txt</a></li>
<li>trunk/LayoutTests/platform/mac-elcapitan/imported/</li>
<li>trunk/LayoutTests/platform/mac-elcapitan/imported/w3c/</li>
<li>trunk/LayoutTests/platform/mac-elcapitan/imported/w3c/web-platform-tests/</li>
<li>trunk/LayoutTests/platform/mac-elcapitan/imported/w3c/web-platform-tests/resource-timing/</li>
<li><a href="#trunkLayoutTestsplatformmacelcapitanimportedw3cwebplatformtestsresourcetimingtest_resource_timingexpectedtxt">trunk/LayoutTests/platform/mac-elcapitan/imported/w3c/web-platform-tests/resource-timing/test_resource_timing-expected.txt</a></li>
<li><a href="#trunkSourceWebCoreplatformnetworkNetworkLoadMetricsh">trunk/Source/WebCore/platform/network/NetworkLoadMetrics.h</a></li>
<li><a href="#trunkSourceWebCoreplatformnetworkcocoaNetworkLoadMetricsmm">trunk/Source/WebCore/platform/network/cocoa/NetworkLoadMetrics.mm</a></li>
</ul>

<h3>Removed Paths</h3>
<ul>
<li><a href="#trunkSourceWebCoreplatformnetworkNetworkLoadTimingh">trunk/Source/WebCore/platform/network/NetworkLoadTiming.h</a></li>
<li><a href="#trunkSourceWebCoreplatformnetworkcocoaNetworkLoadTimingmm">trunk/Source/WebCore/platform/network/cocoa/NetworkLoadTiming.mm</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkLayoutTestsChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/ChangeLog (212992 => 212993)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/ChangeLog        2017-02-25 04:54:36 UTC (rev 212992)
+++ trunk/LayoutTests/ChangeLog        2017-02-25 05:48:51 UTC (rev 212993)
</span><span class="lines">@@ -1,3 +1,31 @@
</span><ins>+2017-02-24  Joseph Pecoraro  &lt;pecoraro@apple.com&gt;
+
+        [Resource Timing] Gather timing information with reliable responseEnd time
+        https://bugs.webkit.org/show_bug.cgi?id=168351
+
+        Reviewed by Alex Christensen.
+
+        * TestExpectations:
+        Now that nextHopProtocol is available on Mac mark the test as flakey
+        because the value can be set or not depending on whether or not the
+        resource was loaded from a cache.
+
+        * platform/ios-simulator/TestExpectations:
+        * platform/gtk/TestExpectations:
+        * platform/mac/TestExpectations:
+        * platform/win/TestExpectations:
+        Mark nextHopProtocol tests as expected to fail on ports that do not
+        yet support those values. Mark redirect tests as failing on ports
+        that encounter the CFNetwork issue causing unexpected callbacks.
+
+        * performance-api/resource-timing-apis-expected.txt:
+        * performance-api/resources/resource-timing-api.js:
+        Progressions.
+
+        * platform/mac-elcapitan/imported/w3c/web-platform-tests/resource-timing/test_resource_timing-expected.txt: Added.
+        * platform/mac/imported/w3c/web-platform-tests/resource-timing/test_resource_timing-expected.txt: Added.
+        Expected passing values on mac, except el capitan where this new resource timing data is unavailable.
+
</ins><span class="cx"> 2017-02-24  Chris Dumez  &lt;cdumez@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Unreviewed, rolling out r212944.
</span></span></pre></div>
<a id="trunkLayoutTestsTestExpectations"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/TestExpectations (212992 => 212993)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/TestExpectations        2017-02-25 04:54:36 UTC (rev 212992)
+++ trunk/LayoutTests/TestExpectations        2017-02-25 05:48:51 UTC (rev 212993)
</span><span class="lines">@@ -312,6 +312,7 @@
</span><span class="cx"> webkit.org/b/168357 imported/w3c/web-platform-tests/resource-timing/rt-initiatorType-media.html [ Failure ]
</span><span class="cx"> webkit.org/b/168448 imported/w3c/web-platform-tests/resource-timing/rt-shared-resource-in-frames.html [ Pass Failure ]
</span><span class="cx"> webkit.org/b/168448 imported/w3c/web-platform-tests/resource-timing/rt-shared-resource-in-workers.html [ Pass Failure ]
</span><ins>+imported/w3c/web-platform-tests/resource-timing/test_resource_timing.html [ Pass Failure ]
</ins><span class="cx"> 
</span><span class="cx"> webkit.org/b/161176 [ Debug ] imported/w3c/web-platform-tests/url/url-setters.html [ Skip ]
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkLayoutTestsimportedw3cChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/imported/w3c/ChangeLog (212992 => 212993)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/imported/w3c/ChangeLog        2017-02-25 04:54:36 UTC (rev 212992)
+++ trunk/LayoutTests/imported/w3c/ChangeLog        2017-02-25 05:48:51 UTC (rev 212993)
</span><span class="lines">@@ -1,3 +1,27 @@
</span><ins>+2017-02-24  Joseph Pecoraro  &lt;pecoraro@apple.com&gt;
+
+        [Resource Timing] Gather timing information with reliable responseEnd time
+        https://bugs.webkit.org/show_bug.cgi?id=168351
+
+        Reviewed by Alex Christensen.
+
+        * web-platform-tests/fetch/api/redirect/redirect-count-cross-origin-expected.txt:
+        * web-platform-tests/fetch/api/redirect/redirect-count-cross-origin-worker-expected.txt:
+        * web-platform-tests/fetch/api/redirect/redirect-count-expected.txt:
+        * web-platform-tests/fetch/api/redirect/redirect-count-worker-expected.txt:
+        * web-platform-tests/fetch/api/redirect/redirect-location-expected.txt:
+        * web-platform-tests/fetch/api/redirect/redirect-location-worker-expected.txt:
+        New behavior for too many redirects caused by &lt;rdar://problem/30610988&gt;.
+
+        * web-platform-tests/resource-timing/rt-nextHopProtocol-expected.txt: Added.
+        * web-platform-tests/resource-timing/rt-nextHopProtocol.html: Added.
+        * web-platform-tests/resource-timing/rt-nextHopProtocol.js: Added.
+        * web-platform-tests/resource-timing/rt-nextHopProtocol.worker-expected.txt: Added.
+        * web-platform-tests/resource-timing/rt-nextHopProtocol.worker.html: Added.
+        * web-platform-tests/resource-timing/rt-nextHopProtocol.worker.js: Added.
+        New tests specific to just checking the nextHopProtocol property with
+        a non-cached resource to avoid flakeyness.
+
</ins><span class="cx"> 2017-02-24  Chris Dumez  &lt;cdumez@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Unreviewed, rolling out r212944.
</span></span></pre></div>
<a id="trunkLayoutTestsimportedw3cwebplatformtestsresourcetimingrtnextHopProtocolexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/imported/w3c/web-platform-tests/resource-timing/rt-nextHopProtocol-expected.txt (0 => 212993)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/imported/w3c/web-platform-tests/resource-timing/rt-nextHopProtocol-expected.txt                                (rev 0)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/resource-timing/rt-nextHopProtocol-expected.txt        2017-02-25 05:48:51 UTC (rev 212993)
</span><span class="lines">@@ -0,0 +1,5 @@
</span><ins>+Resource Timing: nextHopProtocol
+
+
+PASS nextHopProtocol is expected to be 'http1/1' 
+
</ins></span></pre></div>
<a id="trunkLayoutTestsimportedw3cwebplatformtestsresourcetimingrtnextHopProtocolhtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/imported/w3c/web-platform-tests/resource-timing/rt-nextHopProtocol.html (0 => 212993)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/imported/w3c/web-platform-tests/resource-timing/rt-nextHopProtocol.html                                (rev 0)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/resource-timing/rt-nextHopProtocol.html        2017-02-25 05:48:51 UTC (rev 212993)
</span><span class="lines">@@ -0,0 +1,18 @@
</span><ins>+&lt;!DOCTYPE html&gt;
+&lt;html&gt;
+&lt;head&gt;
+&lt;meta charset=&quot;utf-8&quot;&gt;
+&lt;title&gt;Resource Timing - nextHopProtocol&lt;/title&gt;
+&lt;meta name=&quot;author&quot; title=&quot;JosephPecoraro&quot; href=&quot;mailto:joepeck@webkit.org&quot;&gt;
+&lt;meta name=&quot;assert&quot; content=&quot;Resource Timing nextHopProtocol&quot;&gt;
+&lt;link rel=&quot;help&quot; href=&quot;https://w3c.github.io/resource-timing/#dom-performanceresourcetiming-nexthopprotocol&quot;&gt;
+&lt;script src=&quot;/resources/testharness.js&quot;&gt;&lt;/script&gt;
+&lt;script src=&quot;/resources/testharnessreport.js&quot;&gt;&lt;/script&gt;
+&lt;script src=&quot;resources/rt-utilities.js&quot;&gt;&lt;/script&gt;
+&lt;/head&gt;
+&lt;body&gt;
+&lt;h1&gt;Resource Timing: nextHopProtocol&lt;/h1&gt;
+&lt;div id=&quot;log&quot;&gt;&lt;/div&gt;
+&lt;script src=&quot;rt-nextHopProtocol.js&quot;&gt;&lt;/script&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="trunkLayoutTestsimportedw3cwebplatformtestsresourcetimingrtnextHopProtocoljs"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/imported/w3c/web-platform-tests/resource-timing/rt-nextHopProtocol.js (0 => 212993)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/imported/w3c/web-platform-tests/resource-timing/rt-nextHopProtocol.js                                (rev 0)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/resource-timing/rt-nextHopProtocol.js        2017-02-25 05:48:51 UTC (rev 212993)
</span><span class="lines">@@ -0,0 +1,5 @@
</span><ins>+promise_test(function(t) {
+    return loadResources(1).then(function([entry]) {
+        assert_equals(entry.nextHopProtocol, &quot;http/1.1&quot;);
+    });
+}, &quot;nextHopProtocol is expected to be 'http1/1'&quot;, {timeout: 3000});
</ins></span></pre></div>
<a id="trunkLayoutTestsimportedw3cwebplatformtestsresourcetimingrtnextHopProtocolworkerexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/imported/w3c/web-platform-tests/resource-timing/rt-nextHopProtocol.worker-expected.txt (0 => 212993)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/imported/w3c/web-platform-tests/resource-timing/rt-nextHopProtocol.worker-expected.txt                                (rev 0)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/resource-timing/rt-nextHopProtocol.worker-expected.txt        2017-02-25 05:48:51 UTC (rev 212993)
</span><span class="lines">@@ -0,0 +1,4 @@
</span><ins>+
+PASS Must have PerformanceObserver and PerformanceResourceTiming in DedicatedWorkerGlobalScope 
+PASS nextHopProtocol is expected to be 'http1/1' 
+
</ins></span></pre></div>
<a id="trunkLayoutTestsimportedw3cwebplatformtestsresourcetimingrtnextHopProtocolworkerhtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/imported/w3c/web-platform-tests/resource-timing/rt-nextHopProtocol.worker.html ( => )</h4>
<pre class="diff"><span>
<span class="info">Added: trunk/LayoutTests/imported/w3c/web-platform-tests/resource-timing/rt-nextHopProtocol.worker.js
===================================================================
</span><del>--- trunk/LayoutTests/imported/w3c/web-platform-tests/resource-timing/rt-nextHopProtocol.worker.js                                (rev 0)
</del><ins>+++ trunk/LayoutTests/imported/w3c/web-platform-tests/resource-timing/rt-nextHopProtocol.worker.js        2017-02-25 05:48:51 UTC (rev 212993)
</ins><span class="lines">@@ -0,0 +1,13 @@
</span><ins>+importScripts(&quot;/resources/testharness.js&quot;);
+importScripts(&quot;resources/rt-utilities.js&quot;);
+
+(function() {
+    if (!testNecessaryPerformanceFeatures()) {
+        done();
+        return;
+    }
+
+    importScripts(&quot;rt-nextHopProtocol.js&quot;);
+
+    done();
+})();
</ins></span></pre></div>
<a id="trunkLayoutTestsperformanceapiresourcetimingapisexpectedtxt"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/performance-api/resource-timing-apis-expected.txt (212992 => 212993)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/performance-api/resource-timing-apis-expected.txt        2017-02-25 04:54:36 UTC (rev 212992)
+++ trunk/LayoutTests/performance-api/resource-timing-apis-expected.txt        2017-02-25 05:48:51 UTC (rev 212993)
</span><span class="lines">@@ -6,7 +6,7 @@
</span><span class="cx"> PerformanceResourceTiming
</span><span class="cx"> PASS PerformanceResourceTiming is defined.
</span><span class="cx"> PASS &quot;initiatorType&quot; in PerformanceResourceTiming.prototype is true
</span><del>-FAIL &quot;nextHopProtocol&quot; in PerformanceResourceTiming.prototype should be true. Was false.
</del><ins>+PASS &quot;nextHopProtocol&quot; in PerformanceResourceTiming.prototype is true
</ins><span class="cx"> PASS &quot;workerStart&quot; in PerformanceResourceTiming.prototype is true
</span><span class="cx"> PASS &quot;redirectStart&quot; in PerformanceResourceTiming.prototype is true
</span><span class="cx"> PASS &quot;redirectEnd&quot; in PerformanceResourceTiming.prototype is true
</span><span class="lines">@@ -37,7 +37,7 @@
</span><span class="cx"> [Worker] PerformanceResourceTiming
</span><span class="cx"> PASS [Worker] PerformanceResourceTiming is defined.
</span><span class="cx"> PASS [Worker] &quot;initiatorType&quot; in PerformanceResourceTiming.prototype is true
</span><del>-FAIL [Worker] &quot;nextHopProtocol&quot; in PerformanceResourceTiming.prototype should be true. Was false.
</del><ins>+PASS [Worker] &quot;nextHopProtocol&quot; in PerformanceResourceTiming.prototype is true
</ins><span class="cx"> PASS [Worker] &quot;workerStart&quot; in PerformanceResourceTiming.prototype is true
</span><span class="cx"> PASS [Worker] &quot;redirectStart&quot; in PerformanceResourceTiming.prototype is true
</span><span class="cx"> PASS [Worker] &quot;redirectEnd&quot; in PerformanceResourceTiming.prototype is true
</span></span></pre></div>
<a id="trunkLayoutTestsperformanceapiresourcesresourcetimingapijs"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/performance-api/resources/resource-timing-api.js (212992 => 212993)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/performance-api/resources/resource-timing-api.js        2017-02-25 04:54:36 UTC (rev 212992)
+++ trunk/LayoutTests/performance-api/resources/resource-timing-api.js        2017-02-25 05:48:51 UTC (rev 212993)
</span><span class="lines">@@ -7,7 +7,7 @@
</span><span class="cx"> debug(&quot;PerformanceResourceTiming&quot;);
</span><span class="cx"> shouldBeDefined(&quot;PerformanceResourceTiming&quot;);
</span><span class="cx"> shouldBeTrue(`&quot;initiatorType&quot; in PerformanceResourceTiming.prototype`);
</span><del>-shouldBeTrue(`&quot;nextHopProtocol&quot; in PerformanceResourceTiming.prototype`); // Not yet implemented.
</del><ins>+shouldBeTrue(`&quot;nextHopProtocol&quot; in PerformanceResourceTiming.prototype`);
</ins><span class="cx"> shouldBeTrue(`&quot;workerStart&quot; in PerformanceResourceTiming.prototype`);
</span><span class="cx"> shouldBeTrue(`&quot;redirectStart&quot; in PerformanceResourceTiming.prototype`);
</span><span class="cx"> shouldBeTrue(`&quot;redirectEnd&quot; in PerformanceResourceTiming.prototype`);
</span></span></pre></div>
<a id="trunkLayoutTestsplatformgtkTestExpectations"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/platform/gtk/TestExpectations (212992 => 212993)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/platform/gtk/TestExpectations        2017-02-25 04:54:36 UTC (rev 212992)
+++ trunk/LayoutTests/platform/gtk/TestExpectations        2017-02-25 05:48:51 UTC (rev 212993)
</span><span class="lines">@@ -2840,6 +2840,9 @@
</span><span class="cx"> webkit.org/b/167999 imported/w3c/web-platform-tests/fetch/api/redirect/redirect-count.html [ Failure ]
</span><span class="cx"> webkit.org/b/167999 imported/w3c/web-platform-tests/fetch/api/redirect/redirect-location.html [ Failure ]
</span><span class="cx"> 
</span><ins>+webkit.org/b/168543 imported/w3c/web-platform-tests/resource-timing/rt-nextHopProtocol.html [ Failure ]
+webkit.org/b/168543 imported/w3c/web-platform-tests/resource-timing/rt-nextHopProtocol.worker.html [ Failure ]
+
</ins><span class="cx"> webkit.org/b/145260 media/audio-playback-restriction-play.html [ Failure ]
</span><span class="cx"> 
</span><span class="cx"> webkit.org/b/168188 fast/events/ime-compositionend-on-selection-change.html [ Failure ]
</span></span></pre></div>
<a id="trunkLayoutTestsplatformiossimulatorTestExpectations"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/platform/ios-simulator/TestExpectations (212992 => 212993)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/platform/ios-simulator/TestExpectations        2017-02-25 04:54:36 UTC (rev 212992)
+++ trunk/LayoutTests/platform/ios-simulator/TestExpectations        2017-02-25 05:48:51 UTC (rev 212993)
</span><span class="lines">@@ -2877,6 +2877,14 @@
</span><span class="cx"> webkit.org/b/168215 imported/w3c/web-platform-tests/html/semantics/text-level-semantics/the-a-element/a-download-click.html [ Skip ]
</span><span class="cx"> webkit.org/b/168215 imported/w3c/web-platform-tests/html/semantics/embedded-content/the-area-element/area-download-click.html [ Skip ]
</span><span class="cx"> 
</span><ins>+# &lt;rdar://problem/30610988&gt;
+imported/w3c/web-platform-tests/fetch/api/redirect/redirect-count-cross-origin-worker.html [ Failure ]
+imported/w3c/web-platform-tests/fetch/api/redirect/redirect-count-cross-origin.html [ Failure ]
+imported/w3c/web-platform-tests/fetch/api/redirect/redirect-count-worker.html [ Failure ]
+imported/w3c/web-platform-tests/fetch/api/redirect/redirect-count.html [ Failure ]
+imported/w3c/web-platform-tests/fetch/api/redirect/redirect-location-worker.html [ Failure ]
+imported/w3c/web-platform-tests/fetch/api/redirect/redirect-location.html [ Failure ]
+
</ins><span class="cx"> # rdar://problem/23643423
</span><span class="cx"> [ Debug ] fast/frames/exponential-frames.html [ Skip ]
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkLayoutTestsplatformmacTestExpectations"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/platform/mac/TestExpectations (212992 => 212993)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/platform/mac/TestExpectations        2017-02-25 04:54:36 UTC (rev 212992)
+++ trunk/LayoutTests/platform/mac/TestExpectations        2017-02-25 05:48:51 UTC (rev 212993)
</span><span class="lines">@@ -1535,4 +1535,16 @@
</span><span class="cx"> 
</span><span class="cx"> webkit.org/b/212466 [ ElCapitan ] js/dom/gc-slot-visitor-parallel-drain-pings-runloop-when-done.html [ Skip ]
</span><span class="cx"> 
</span><ins>+# Resource Timing networking data not yet available without Network Session.
+[ ElCapitan ] imported/w3c/web-platform-tests/resource-timing/rt-nextHopProtocol.html [ Failure ]
+[ ElCapitan ] imported/w3c/web-platform-tests/resource-timing/rt-nextHopProtocol.worker.html [ Failure ]
+
+# &lt;rdar://problem/30610988&gt;
+[ Sierra+ ] imported/w3c/web-platform-tests/fetch/api/redirect/redirect-count-cross-origin-worker.html [ Failure ]
+[ Sierra+ ] imported/w3c/web-platform-tests/fetch/api/redirect/redirect-count-cross-origin.html [ Failure ]
+[ Sierra+ ] imported/w3c/web-platform-tests/fetch/api/redirect/redirect-count-worker.html [ Failure ]
+[ Sierra+ ] imported/w3c/web-platform-tests/fetch/api/redirect/redirect-count.html [ Failure ]
+[ Sierra+ ] imported/w3c/web-platform-tests/fetch/api/redirect/redirect-location-worker.html [ Failure ]
+[ Sierra+ ] imported/w3c/web-platform-tests/fetch/api/redirect/redirect-location.html [ Failure ]
+
</ins><span class="cx"> webkit.org/b/168503 editing/pasteboard/drag-drop-copy-content.html [ Failure ]
</span></span></pre></div>
<a id="trunkLayoutTestsplatformmacimportedw3cwebplatformtestsresourcetimingtest_resource_timingexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/platform/mac/imported/w3c/web-platform-tests/resource-timing/test_resource_timing-expected.txt (0 => 212993)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/platform/mac/imported/w3c/web-platform-tests/resource-timing/test_resource_timing-expected.txt                                (rev 0)
+++ trunk/LayoutTests/platform/mac/imported/w3c/web-platform-tests/resource-timing/test_resource_timing-expected.txt        2017-02-25 05:48:51 UTC (rev 212993)
</span><span class="lines">@@ -0,0 +1,34 @@
</span><ins>+Description
+
+NOTE: Due to caching behavior in the browser, it is possible that when revisiting this page, some resources may not have to be fetched from the network. As a result, the performance timeline will not contain entries for these resources. This test will fail if any entries are missing to ensure that all resources are fetched from the network and entries for these resources exist in the Performance Timeline. If revisiting this page, please either perform a full reload of the page or clear the cache between visits.
+
+
+PASS window.performance.getEntriesByName() and window.performance.getEntriesByNameType() return same data (iframe) 
+PASS PerformanceEntry has correct name, initiatorType, startTime, and duration (iframe) 
+PASS PerformanceEntry has correct order of timing attributes (iframe) 
+FAIL PerformanceEntry has correct network transfer attributes (iframe) assert_equals: encodedBodySize size expected (number) 215 but got (undefined) undefined
+PASS PerformanceEntry has correct protocol attribute (iframe) 
+PASS window.performance.getEntriesByName() and window.performance.getEntriesByNameType() return same data (img) 
+PASS PerformanceEntry has correct name, initiatorType, startTime, and duration (img) 
+PASS PerformanceEntry has correct order of timing attributes (img) 
+FAIL PerformanceEntry has correct network transfer attributes (img) assert_equals: encodedBodySize size expected (number) 249 but got (undefined) undefined
+PASS PerformanceEntry has correct protocol attribute (img) 
+PASS window.performance.getEntriesByName() and window.performance.getEntriesByNameType() return same data (link) 
+PASS PerformanceEntry has correct name, initiatorType, startTime, and duration (link) 
+PASS PerformanceEntry has correct order of timing attributes (link) 
+FAIL PerformanceEntry has correct network transfer attributes (link) assert_equals: encodedBodySize size expected (number) 44 but got (undefined) undefined
+PASS PerformanceEntry has correct protocol attribute (link) 
+PASS window.performance.getEntriesByName() and window.performance.getEntriesByNameType() return same data (script) 
+PASS PerformanceEntry has correct name, initiatorType, startTime, and duration (script) 
+PASS PerformanceEntry has correct order of timing attributes (script) 
+FAIL PerformanceEntry has correct network transfer attributes (script) assert_equals: encodedBodySize size expected (number) 133 but got (undefined) undefined
+PASS PerformanceEntry has correct protocol attribute (script) 
+PASS window.performance.getEntriesByName() and window.performance.getEntriesByNameType() return same data (xmlhttprequest) 
+PASS PerformanceEntry has correct name, initiatorType, startTime, and duration (xmlhttprequest) 
+PASS PerformanceEntry has correct order of timing attributes (xmlhttprequest) 
+FAIL PerformanceEntry has correct network transfer attributes (xmlhttprequest) assert_equals: encodedBodySize size expected (number) 112 but got (undefined) undefined
+PASS PerformanceEntry has correct protocol attribute (xmlhttprequest) 
+PASS window.performance Resource Timing Entries exist 
+PASS window.performance Resource Timing Entries exist 1 
+PASS window.performance Resource Timing Entries exist 2 
+
</ins></span></pre></div>
<a id="trunkLayoutTestsplatformmacelcapitanimportedw3cwebplatformtestsresourcetimingtest_resource_timingexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/platform/mac-elcapitan/imported/w3c/web-platform-tests/resource-timing/test_resource_timing-expected.txt (0 => 212993)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/platform/mac-elcapitan/imported/w3c/web-platform-tests/resource-timing/test_resource_timing-expected.txt                                (rev 0)
+++ trunk/LayoutTests/platform/mac-elcapitan/imported/w3c/web-platform-tests/resource-timing/test_resource_timing-expected.txt        2017-02-25 05:48:51 UTC (rev 212993)
</span><span class="lines">@@ -0,0 +1,34 @@
</span><ins>+Description
+
+NOTE: Due to caching behavior in the browser, it is possible that when revisiting this page, some resources may not have to be fetched from the network. As a result, the performance timeline will not contain entries for these resources. This test will fail if any entries are missing to ensure that all resources are fetched from the network and entries for these resources exist in the Performance Timeline. If revisiting this page, please either perform a full reload of the page or clear the cache between visits.
+
+
+PASS window.performance.getEntriesByName() and window.performance.getEntriesByNameType() return same data (iframe) 
+PASS PerformanceEntry has correct name, initiatorType, startTime, and duration (iframe) 
+PASS PerformanceEntry has correct order of timing attributes (iframe) 
+FAIL PerformanceEntry has correct network transfer attributes (iframe) assert_equals: encodedBodySize size expected (number) 215 but got (undefined) undefined
+FAIL PerformanceEntry has correct protocol attribute (iframe) assert_equals: expected protocol expected (string) &quot;http/1.1&quot; but got (undefined) undefined
+PASS window.performance.getEntriesByName() and window.performance.getEntriesByNameType() return same data (img) 
+PASS PerformanceEntry has correct name, initiatorType, startTime, and duration (img) 
+PASS PerformanceEntry has correct order of timing attributes (img) 
+FAIL PerformanceEntry has correct network transfer attributes (img) assert_equals: encodedBodySize size expected (number) 249 but got (undefined) undefined
+FAIL PerformanceEntry has correct protocol attribute (img) assert_equals: expected protocol expected (string) &quot;http/1.1&quot; but got (undefined) undefined
+PASS window.performance.getEntriesByName() and window.performance.getEntriesByNameType() return same data (link) 
+PASS PerformanceEntry has correct name, initiatorType, startTime, and duration (link) 
+PASS PerformanceEntry has correct order of timing attributes (link) 
+FAIL PerformanceEntry has correct network transfer attributes (link) assert_equals: encodedBodySize size expected (number) 44 but got (undefined) undefined
+FAIL PerformanceEntry has correct protocol attribute (link) assert_equals: expected protocol expected (string) &quot;http/1.1&quot; but got (undefined) undefined
+PASS window.performance.getEntriesByName() and window.performance.getEntriesByNameType() return same data (script) 
+PASS PerformanceEntry has correct name, initiatorType, startTime, and duration (script) 
+PASS PerformanceEntry has correct order of timing attributes (script) 
+FAIL PerformanceEntry has correct network transfer attributes (script) assert_equals: encodedBodySize size expected (number) 133 but got (undefined) undefined
+FAIL PerformanceEntry has correct protocol attribute (script) assert_equals: expected protocol expected (string) &quot;http/1.1&quot; but got (undefined) undefined
+PASS window.performance.getEntriesByName() and window.performance.getEntriesByNameType() return same data (xmlhttprequest) 
+PASS PerformanceEntry has correct name, initiatorType, startTime, and duration (xmlhttprequest) 
+PASS PerformanceEntry has correct order of timing attributes (xmlhttprequest) 
+FAIL PerformanceEntry has correct network transfer attributes (xmlhttprequest) assert_equals: encodedBodySize size expected (number) 112 but got (undefined) undefined
+FAIL PerformanceEntry has correct protocol attribute (xmlhttprequest) assert_equals: expected protocol expected (string) &quot;http/1.1&quot; but got (undefined) undefined
+PASS window.performance Resource Timing Entries exist 
+PASS window.performance Resource Timing Entries exist 1 
+PASS window.performance Resource Timing Entries exist 2 
+
</ins></span></pre></div>
<a id="trunkLayoutTestsplatformmacwk1TestExpectations"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/platform/mac-wk1/TestExpectations (212992 => 212993)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/platform/mac-wk1/TestExpectations        2017-02-25 04:54:36 UTC (rev 212992)
+++ trunk/LayoutTests/platform/mac-wk1/TestExpectations        2017-02-25 05:48:51 UTC (rev 212993)
</span><span class="lines">@@ -295,6 +295,10 @@
</span><span class="cx"> webkit.org/b/163361 imported/w3c/web-platform-tests/html/webappapis/animation-frames/callback-invoked.html [ Pass Failure ]
</span><span class="cx"> webkit.org/b/163361 imported/w3c/web-platform-tests/html/webappapis/animation-frames/callback-multicalls.html [ Pass Failure ]
</span><span class="cx"> 
</span><ins>+# Resource Timing networking data not yet available in WebKit1.
+imported/w3c/web-platform-tests/resource-timing/rt-nextHopProtocol.html [ Failure ]
+imported/w3c/web-platform-tests/resource-timing/rt-nextHopProtocol.worker.html [ Failure ]
+
</ins><span class="cx"> webkit.org/b/164491 [ Yosemite ElCapitan ] fast/visual-viewport/rtl-zoomed-rects.html [ Failure ]
</span><span class="cx"> 
</span><span class="cx"> webkit.org/b/164933 http/tests/misc/link-rel-icon-beforeload.html [ Failure ]
</span></span></pre></div>
<a id="trunkLayoutTestsplatformwinTestExpectations"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/platform/win/TestExpectations (212992 => 212993)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/platform/win/TestExpectations        2017-02-25 04:54:36 UTC (rev 212992)
+++ trunk/LayoutTests/platform/win/TestExpectations        2017-02-25 05:48:51 UTC (rev 212993)
</span><span class="lines">@@ -3785,6 +3785,10 @@
</span><span class="cx"> # webrtc not supported
</span><span class="cx"> imported/w3c/web-platform-tests/webrtc [ Skip ]
</span><span class="cx"> 
</span><ins>+# Resource Timing networking data not yet available.
+imported/w3c/web-platform-tests/resource-timing/rt-nextHopProtocol.html [ Failure ]
+imported/w3c/web-platform-tests/resource-timing/rt-nextHopProtocol.worker.html [ Failure ]
+
</ins><span class="cx"> # WebCrypto tests are failing.
</span><span class="cx"> webkit.org/b/165090 imported/w3c/WebCryptoAPI [ Skip ]
</span><span class="cx"> webkit.org/b/165090 imported/w3c/web-platform-tests/WebCryptoAPI [ Skip ]
</span></span></pre></div>
<a id="trunkSourceWTFChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WTF/ChangeLog (212992 => 212993)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WTF/ChangeLog        2017-02-25 04:54:36 UTC (rev 212992)
+++ trunk/Source/WTF/ChangeLog        2017-02-25 05:48:51 UTC (rev 212993)
</span><span class="lines">@@ -1,3 +1,14 @@
</span><ins>+2017-02-24  Joseph Pecoraro  &lt;pecoraro@apple.com&gt;
+
+        [Resource Timing] Gather timing information with reliable responseEnd time
+        https://bugs.webkit.org/show_bug.cgi?id=168351
+
+        Reviewed by Alex Christensen.
+
+        * wtf/persistence/Coders.h:
+        (WTF::Persistence::Coder&lt;Seconds&gt;::encode):
+        (WTF::Persistence::Coder&lt;Seconds&gt;::decode):
+
</ins><span class="cx"> 2017-02-24  Keith Miller  &lt;keith_miller@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Rubber-stamped by Chris Dumez.
</span></span></pre></div>
<a id="trunkSourceWTFwtfpersistenceCodersh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WTF/wtf/persistence/Coders.h (212992 => 212993)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WTF/wtf/persistence/Coders.h        2017-02-25 04:54:36 UTC (rev 212992)
+++ trunk/Source/WTF/wtf/persistence/Coders.h        2017-02-25 05:48:51 UTC (rev 212993)
</span><span class="lines">@@ -30,6 +30,7 @@
</span><span class="cx"> #include &lt;wtf/HashMap.h&gt;
</span><span class="cx"> #include &lt;wtf/HashSet.h&gt;
</span><span class="cx"> #include &lt;wtf/SHA1.h&gt;
</span><ins>+#include &lt;wtf/Seconds.h&gt;
</ins><span class="cx"> #include &lt;wtf/Vector.h&gt;
</span><span class="cx"> #include &lt;wtf/persistence/Decoder.h&gt;
</span><span class="cx"> #include &lt;wtf/persistence/Encoder.h&gt;
</span><span class="lines">@@ -278,6 +279,23 @@
</span><span class="cx">     }
</span><span class="cx"> };
</span><span class="cx"> 
</span><ins>+template&lt;&gt; struct Coder&lt;Seconds&gt; {
+    static void encode(Encoder&amp; encoder, const Seconds&amp; seconds)
+    {
+        encoder &lt;&lt; seconds.value();
+    }
+
+    static bool decode(Decoder&amp; decoder, Seconds&amp; result)
+    {
+        double value;
+        if (!decoder.decode(value))
+            return false;
+
+        result = Seconds(value);
+        return true;
+    }
+};
+
</ins><span class="cx"> template&lt;&gt; struct Coder&lt;AtomicString&gt; {
</span><span class="cx">     WTF_EXPORT_PRIVATE static void encode(Encoder&amp;, const AtomicString&amp;);
</span><span class="cx">     WTF_EXPORT_PRIVATE static bool decode(Decoder&amp;, AtomicString&amp;);
</span></span></pre></div>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (212992 => 212993)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog        2017-02-25 04:54:36 UTC (rev 212992)
+++ trunk/Source/WebCore/ChangeLog        2017-02-25 05:48:51 UTC (rev 212993)
</span><span class="lines">@@ -1,3 +1,245 @@
</span><ins>+2017-02-24  Joseph Pecoraro  &lt;pecoraro@apple.com&gt;
+
+        [Resource Timing] Gather timing information with reliable responseEnd time
+        https://bugs.webkit.org/show_bug.cgi?id=168351
+
+        Reviewed by Alex Christensen.
+
+        This patch replaces the unused `double finishTime` in ResourceLoader's
+        didFinishLoad with a complete WebCore::NetworkLoadMetrics object. This
+        allows the NetworkProcess to give complete timing information, and more
+        final metrics about the load, to WebCore. Currently this is only used
+        by ResourceTiming, but it will soon be used by Web Inspector as well.
+        We may also end up extending this to the didFail path as well, since it
+        is possible that we have some metrics for load failures.
+
+        At the same time we want to start moving away from the legacy path that
+        populated a subset of this information in ResourceResponse's NetworkLoadMetrics.
+        It doesn't make sense to store this information on the ResourceResponse
+        for a few reasons: We don't want to store the metrics in our Network Cache and
+        not all of the load timing metrics have been populated yet (responseEnd).
+        In an effort to move off of this data we've renamed the accessor to
+        &quot;deprecatedNetworkLoadMetrics&quot;. There are a few remaining clients
+        (ResourceHandle, PerformanceTiming, InspectorNetworkAgent) which can be
+        migrated separately from this patch.
+
+        Having both the legacy and new code paths adds a little bit of complexity.
+        One advantage of the new path is that the complete load timing data
+        (fetchStart -&gt; dns -&gt; connect -&gt; request -&gt; response -&gt; responseEnd) can
+        be packaged together. The legacy path could not include a responseEnd, so
+        WebCore faked that value with its own timestamp. Having the fake responseEnd
+        caused issues as timestamps / clocks are different between processes. In order
+        for PerformanceResponseTiming to know whether or not the NetworkLoadMetrics
+        has the complete network timing metrics it checks isComplete(). If true
+        it knows it can use the responseEnd time from NetworkLoadMetrics, otherwise
+        it must fallback to the legacy value from LoadTiming. Once all of the
+        deprecatedNetworkLoadMetrics clients go away, we should always have the
+        complete data and this can be eliminated.
+
+        Tests: imported/w3c/web-platform-tests/resource-timing/rt-nextHopProtocol.html
+               imported/w3c/web-platform-tests/resource-timing/rt-nextHopProtocol.worker.html
+
+        * PlatformMac.cmake:
+        * WebCore.xcodeproj/project.pbxproj:
+        Rename NetworkLoadTiming -&gt; NetworkLoadMetrics.
+
+        * page/PerformanceResourceTiming.cpp:
+        (WebCore::entryStartTime):
+        (WebCore::entryEndTime):
+        (WebCore::PerformanceResourceTiming::PerformanceResourceTiming):
+        (WebCore::PerformanceResourceTiming::nextHopProtocol):
+        (WebCore::PerformanceResourceTiming::domainLookupStart):
+        (WebCore::PerformanceResourceTiming::domainLookupEnd):
+        (WebCore::PerformanceResourceTiming::connectStart):
+        (WebCore::PerformanceResourceTiming::connectEnd):
+        (WebCore::PerformanceResourceTiming::secureConnectionStart):
+        (WebCore::PerformanceResourceTiming::requestStart):
+        (WebCore::PerformanceResourceTiming::responseStart):
+        (WebCore::PerformanceResourceTiming::responseEnd):
+        (WebCore::PerformanceResourceTiming::networkLoadTimeToDOMHighResTimeStamp):
+        * page/PerformanceResourceTiming.h:
+        Mostly just updating names and types. This does however need to get the
+        correct endTime based on whether the NetworkLoadMetrics are complete
+        (meaning includes responseEnd) or not (legacy, use LoadTiming value).
+
+        * page/PerformanceResourceTiming.idl:
+        Add nextHopProtocol.
+
+        * page/PerformanceTiming.cpp:
+        (WebCore::PerformanceTiming::domainLookupStart):
+        (WebCore::PerformanceTiming::domainLookupEnd):
+        (WebCore::PerformanceTiming::connectStart):
+        (WebCore::PerformanceTiming::connectEnd):
+        (WebCore::PerformanceTiming::secureConnectionStart):
+        (WebCore::PerformanceTiming::requestStart):
+        (WebCore::PerformanceTiming::responseStart):
+        (WebCore::PerformanceTiming::resourceLoadTimeRelativeToFetchStart):
+        * page/PerformanceTiming.h:
+        Navigation Timing values still uses the NetworkLoadTiming values stored on
+        the DocumentLoader. This should be moved off of the deprecated path separately.
+
+        * platform/network/NetworkLoadMetrics.h: Renamed from Source/WebCore/platform/network/NetworkLoadTiming.h.
+        (WebCore::NetworkLoadMetrics::NetworkLoadMetrics):
+        (WebCore::NetworkLoadMetrics::isolatedCopy):
+        (WebCore::NetworkLoadMetrics::reset):
+        (WebCore::NetworkLoadMetrics::operator==):
+        (WebCore::NetworkLoadMetrics::operator!=):
+        (WebCore::NetworkLoadMetrics::isComplete):
+        (WebCore::NetworkLoadMetrics::markComplete):
+        (WebCore::NetworkLoadMetrics::encode):
+        (WebCore::NetworkLoadMetrics::decode):
+        Re-introduce a reset() method (for NetworkLoadSoup to reset between redirects).
+        Add protocolName and &quot;complete&quot; boolean.
+
+        * platform/network/cocoa/NetworkLoadMetrics.mm: Renamed from Source/WebCore/platform/network/cocoa/NetworkLoadTiming.mm.
+        (WebCore::timingValue):
+        (WebCore::copyTimingData):
+        (WebCore::setCollectsTimingData):
+        Use this opportunity to convert NetworkLoadTiming timestamps to WTF::Seconds.
+        Since we already have to modify all the clients this moves us to use the more
+        strongly typed units that are less ambiguous then &quot;double&quot;. The rest of the
+        Performance API has already moved to these units.
+
+        * inspector/InspectorNetworkAgent.cpp:
+        (WebCore::InspectorNetworkAgent::buildObjectForTiming):
+        (WebCore::InspectorNetworkAgent::buildObjectForResourceResponse):
+        (WebCore::InspectorNetworkAgent::didFinishLoading):
+        * inspector/InspectorNetworkAgent.h:
+        Inspector was the only client of the finishTime, and since the value was
+        erratically coming from clients in different ways it was almost certainly
+        inaccurate. Simplify this in preparation for using NetworkLoadMetrics.
+
+        * Modules/fetch/FetchLoader.cpp:
+        (WebCore::FetchLoader::didFinishLoading):
+        * Modules/fetch/FetchLoader.h:
+        * fileapi/FileReaderLoader.cpp:
+        (WebCore::FileReaderLoader::didFinishLoading):
+        * fileapi/FileReaderLoader.h:
+        * html/MediaFragmentURIParser.cpp:
+        (WebCore::MediaFragmentURIParser::parseNPTTime):
+        * inspector/InspectorInstrumentation.cpp:
+        (WebCore::InspectorInstrumentation::didFinishLoadingImpl):
+        * inspector/InspectorInstrumentation.h:
+        (WebCore::InspectorInstrumentation::didFinishLoading):
+        * loader/CrossOriginPreflightChecker.cpp:
+        (WebCore::CrossOriginPreflightChecker::validatePreflightResponse):
+        * loader/DocumentLoader.cpp:
+        (WebCore::DocumentLoader::notifyFinished):
+        (WebCore::DocumentLoader::finishedLoading):
+        (WebCore::DocumentLoader::continueAfterContentPolicy):
+        (WebCore::DocumentLoader::maybeLoadEmpty):
+        * loader/DocumentLoader.h:
+        * loader/DocumentThreadableLoader.cpp:
+        (WebCore::DocumentThreadableLoader::didReceiveResponse):
+        (WebCore::DocumentThreadableLoader::notifyFinished):
+        (WebCore::DocumentThreadableLoader::didFinishLoading):
+        (WebCore::DocumentThreadableLoader::loadRequest):
+        * loader/DocumentThreadableLoader.h:
+        * loader/NetscapePlugInStreamLoader.cpp:
+        (WebCore::NetscapePlugInStreamLoader::didFinishLoading):
+        * loader/NetscapePlugInStreamLoader.h:
+        * loader/ResourceLoadNotifier.cpp:
+        (WebCore::ResourceLoadNotifier::didFinishLoad):
+        (WebCore::ResourceLoadNotifier::dispatchDidFinishLoading):
+        (WebCore::ResourceLoadNotifier::sendRemainingDelegateMessages):
+        * loader/ResourceLoadNotifier.h:
+        * loader/ResourceLoader.cpp:
+        (WebCore::ResourceLoader::deliverResponseAndData):
+        (WebCore::ResourceLoader::loadDataURL):
+        (WebCore::ResourceLoader::didFinishLoading):
+        (WebCore::ResourceLoader::didFinishLoadingOnePart):
+        * loader/ResourceLoader.h:
+        * loader/ResourceTiming.cpp:
+        (WebCore::ResourceTiming::fromLoad):
+        (WebCore::ResourceTiming::fromSynchronousLoad):
+        (WebCore::ResourceTiming::ResourceTiming):
+        (WebCore::ResourceTiming::isolatedCopy):
+        * loader/ResourceTiming.h:
+        (WebCore::ResourceTiming::networkLoadMetrics):
+        (WebCore::ResourceTiming::ResourceTiming):
+        (WebCore::ResourceTiming::networkLoadTiming): Deleted.
+        * loader/SubresourceLoader.cpp:
+        (WebCore::SubresourceLoader::SubresourceLoader):
+        (WebCore::SubresourceLoader::willSendRequestInternal):
+        (WebCore::SubresourceLoader::didReceiveResponse):
+        (WebCore::SubresourceLoader::didFinishLoading):
+        (WebCore::SubresourceLoader::reportResourceTiming):
+        * loader/SubresourceLoader.h:
+        * loader/ThreadableLoaderClient.h:
+        (WebCore::ThreadableLoaderClient::didFinishLoading):
+        * loader/ThreadableLoaderClientWrapper.h:
+        (WebCore::ThreadableLoaderClientWrapper::didFinishLoading):
+        * loader/WorkerThreadableLoader.cpp:
+        (WebCore::WorkerThreadableLoader::MainThreadBridge::didFinishLoading):
+        * loader/WorkerThreadableLoader.h:
+        * loader/appcache/ApplicationCacheGroup.cpp:
+        (WebCore::ApplicationCacheGroup::didFinishLoading):
+        * loader/appcache/ApplicationCacheGroup.h:
+        * loader/cache/CachedResource.h:
+        (WebCore::CachedResource::setLoadFinishTime):
+        * loader/ios/QuickLook.mm:
+        (-[WebPreviewLoader connectionDidFinishLoading:]):
+        * page/EventSource.cpp:
+        (WebCore::EventSource::didFinishLoading):
+        * page/EventSource.h:
+        * platform/graphics/gstreamer/WebKitWebSourceGStreamer.cpp:
+        (ResourceHandleStreamingClient::didFinishLoading):
+        * platform/network/BlobResourceHandle.cpp:
+        (WebCore::doNotifyFinish):
+        * platform/network/PingHandle.h:
+        * platform/network/ResourceHandle.h:
+        * platform/network/ResourceHandleClient.h:
+        (WebCore::ResourceHandleClient::didFinishLoading):
+        * platform/network/ResourceResponseBase.cpp:
+        (WebCore::ResourceResponseBase::crossThreadData):
+        (WebCore::ResourceResponseBase::fromCrossThreadData):
+        (WebCore::ResourceResponseBase::compare):
+        * platform/network/ResourceResponseBase.h:
+        (WebCore::ResourceResponseBase::deprecatedNetworkLoadMetrics):
+        (WebCore::ResourceResponseBase::encode):
+        (WebCore::ResourceResponseBase::decode):
+        (WebCore::ResourceResponseBase::networkLoadTiming): Deleted.
+        * platform/network/SynchronousLoaderClient.cpp:
+        (WebCore::SynchronousLoaderClient::didFinishLoading):
+        * platform/network/SynchronousLoaderClient.h:
+        * platform/network/cf/ResourceHandleCFURLConnectionDelegateWithOperationQueue.cpp:
+        (WebCore::ResourceHandleCFURLConnectionDelegateWithOperationQueue::didReceiveResponse):
+        (WebCore::ResourceHandleCFURLConnectionDelegateWithOperationQueue::didFinishLoading):
+        * platform/network/cf/SynchronousResourceHandleCFURLConnectionDelegate.cpp:
+        (WebCore::SynchronousResourceHandleCFURLConnectionDelegate::didReceiveResponse):
+        (WebCore::SynchronousResourceHandleCFURLConnectionDelegate::didFinishLoading):
+        * platform/network/curl/ResourceHandleCurl.cpp:
+        (WebCore::WebCoreSynchronousLoader::didFinishLoading):
+        * platform/network/curl/ResourceHandleManager.cpp:
+        (WebCore::calculateWebTimingInformations):
+        (WebCore::ResourceHandleManager::downloadTimerCallback):
+        (WebCore::handleDataURL):
+        (WebCore::milisecondsSinceRequest): Deleted.
+        * platform/network/mac/ResourceHandleMac.mm:
+        (WebCore::ResourceHandle::getConnectionTimingData):
+        * platform/network/mac/WebCoreResourceHandleAsDelegate.mm:
+        (-[WebCoreResourceHandleAsDelegate connection:didReceiveResponse:]):
+        (-[WebCoreResourceHandleAsDelegate connectionDidFinishLoading:]):
+        * platform/network/mac/WebCoreResourceHandleAsOperationQueueDelegate.mm:
+        (-[WebCoreResourceHandleAsOperationQueueDelegate connection:didReceiveResponse:]):
+        (-[WebCoreResourceHandleAsOperationQueueDelegate connectionDidFinishLoading:]):
+        * platform/network/soup/ResourceHandleSoup.cpp:
+        (WebCore::restartedCallback):
+        (WebCore::nextMultipartResponsePartCallback):
+        (WebCore::sendRequestCallback):
+        (WebCore::ResourceHandle::didStartRequest):
+        (WebCore::networkEventCallback):
+        (WebCore::ResourceHandle::sendPendingRequest):
+        (WebCore::readCallback):
+        (WebCore::milisecondsSinceRequest): Deleted.
+        * workers/WorkerScriptLoader.cpp:
+        (WebCore::WorkerScriptLoader::didFinishLoading):
+        * workers/WorkerScriptLoader.h:
+        * xml/XMLHttpRequest.cpp:
+        (WebCore::XMLHttpRequest::didFinishLoading):
+        * xml/XMLHttpRequest.h:
+        Eliminate the unused finishTime double.
+
</ins><span class="cx"> 2017-02-24  Chris Dumez  &lt;cdumez@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Unreviewed GTK build fix after r212965
</span></span></pre></div>
<a id="trunkSourceWebCoreModulesfetchFetchLoadercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/Modules/fetch/FetchLoader.cpp (212992 => 212993)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/Modules/fetch/FetchLoader.cpp        2017-02-25 04:54:36 UTC (rev 212992)
+++ trunk/Source/WebCore/Modules/fetch/FetchLoader.cpp        2017-02-25 05:48:51 UTC (rev 212993)
</span><span class="lines">@@ -141,7 +141,7 @@
</span><span class="cx">     m_consumer-&gt;append(value, size);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void FetchLoader::didFinishLoading(unsigned long, double)
</del><ins>+void FetchLoader::didFinishLoading(unsigned long)
</ins><span class="cx"> {
</span><span class="cx">     m_client.didSucceed();
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceWebCoreModulesfetchFetchLoaderh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/Modules/fetch/FetchLoader.h (212992 => 212993)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/Modules/fetch/FetchLoader.h        2017-02-25 04:54:36 UTC (rev 212992)
+++ trunk/Source/WebCore/Modules/fetch/FetchLoader.h        2017-02-25 05:48:51 UTC (rev 212993)
</span><span class="lines">@@ -57,7 +57,7 @@
</span><span class="cx">     // ThreadableLoaderClient API.
</span><span class="cx">     void didReceiveResponse(unsigned long, const ResourceResponse&amp;) final;
</span><span class="cx">     void didReceiveData(const char*, int) final;
</span><del>-    void didFinishLoading(unsigned long, double) final;
</del><ins>+    void didFinishLoading(unsigned long) final;
</ins><span class="cx">     void didFail(const ResourceError&amp;) final;
</span><span class="cx"> 
</span><span class="cx"> private:
</span></span></pre></div>
<a id="trunkSourceWebCorePlatformMaccmake"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/PlatformMac.cmake (212992 => 212993)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/PlatformMac.cmake        2017-02-25 04:54:36 UTC (rev 212992)
+++ trunk/Source/WebCore/PlatformMac.cmake        2017-02-25 05:48:51 UTC (rev 212993)
</span><span class="lines">@@ -525,7 +525,7 @@
</span><span class="cx">     platform/network/cf/SynchronousResourceHandleCFURLConnectionDelegate.cpp
</span><span class="cx"> 
</span><span class="cx">     platform/network/cocoa/CredentialCocoa.mm
</span><del>-    platform/network/cocoa/NetworkLoadTiming.mm
</del><ins>+    platform/network/cocoa/NetworkLoadMetrics.mm
</ins><span class="cx">     platform/network/cocoa/ProtectionSpaceCocoa.mm
</span><span class="cx">     platform/network/cocoa/ResourceRequestCocoa.mm
</span><span class="cx">     platform/network/cocoa/ResourceResponseCocoa.mm
</span></span></pre></div>
<a id="trunkSourceWebCoreWebCorexcodeprojprojectpbxproj"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj (212992 => 212993)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj        2017-02-25 04:54:36 UTC (rev 212992)
+++ trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj        2017-02-25 05:48:51 UTC (rev 212993)
</span><span class="lines">@@ -2448,7 +2448,7 @@
</span><span class="cx">                 5C7C88D81D0F1F4A009D2F6D /* SocketProvider.h in Headers */ = {isa = PBXBuildFile; fileRef = 5C7C88D71D0F1F2B009D2F6D /* SocketProvider.h */; settings = {ATTRIBUTES = (Private, ); }; };
</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><del>-                5C9B860C1C21E3C900110F36 /* NetworkLoadTiming.mm in Sources */ = {isa = PBXBuildFile; fileRef = 5C9B860B1C21E3C600110F36 /* NetworkLoadTiming.mm */; };
</del><ins>+                5C9B860C1C21E3C900110F36 /* NetworkLoadMetrics.mm in Sources */ = {isa = PBXBuildFile; fileRef = 5C9B860B1C21E3C600110F36 /* NetworkLoadMetrics.mm */; };
</ins><span class="cx">                 5C9EF1711DFF71CC00A452E3 /* XPathGrammar.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5C9EF16F1DFF719900A452E3 /* XPathGrammar.cpp */; };
</span><span class="cx">                 5CB37FFE1C62D28C00F20188 /* ScrollAnimatorMock.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5CB37FFC1C62D27800F20188 /* ScrollAnimatorMock.cpp */; };
</span><span class="cx">                 5CB37FFF1C62D2A100F20188 /* ScrollAnimatorMock.h in Headers */ = {isa = PBXBuildFile; fileRef = 5CB37FFD1C62D27800F20188 /* ScrollAnimatorMock.h */; };
</span><span class="lines">@@ -3286,7 +3286,7 @@
</span><span class="cx">                 8A413AE11207BBA50082016E /* ScriptRunner.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8A413ADF1207BBA50082016E /* ScriptRunner.cpp */; };
</span><span class="cx">                 8A7CC96B12076D73001D4588 /* PendingScript.h in Headers */ = {isa = PBXBuildFile; fileRef = 8A7CC96A12076D73001D4588 /* PendingScript.h */; settings = {ATTRIBUTES = (Private, ); }; };
</span><span class="cx">                 8A7CC97012076F8A001D4588 /* PendingScript.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8A7CC96F12076F8A001D4588 /* PendingScript.cpp */; };
</span><del>-                8A81BF8511DCFD9000DA2B98 /* NetworkLoadTiming.h in Headers */ = {isa = PBXBuildFile; fileRef = 8A81BF8411DCFD9000DA2B98 /* NetworkLoadTiming.h */; settings = {ATTRIBUTES = (Private, ); }; };
</del><ins>+                8A81BF8511DCFD9000DA2B98 /* NetworkLoadMetrics.h in Headers */ = {isa = PBXBuildFile; fileRef = 8A81BF8411DCFD9000DA2B98 /* NetworkLoadMetrics.h */; settings = {ATTRIBUTES = (Private, ); }; };
</ins><span class="cx">                 8A844D0511D3C18E0014065C /* Performance.h in Headers */ = {isa = PBXBuildFile; fileRef = 8A844D0211D3C18E0014065C /* Performance.h */; };
</span><span class="cx">                 8A9A587011E84C36008ACFD1 /* JSPerformanceNavigation.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8A9A586E11E84C35008ACFD1 /* JSPerformanceNavigation.cpp */; };
</span><span class="cx">                 8A9A587111E84C36008ACFD1 /* JSPerformanceNavigation.h in Headers */ = {isa = PBXBuildFile; fileRef = 8A9A586F11E84C36008ACFD1 /* JSPerformanceNavigation.h */; };
</span><span class="lines">@@ -9843,7 +9843,7 @@
</span><span class="cx">                 5C6E653F1D5CEDC900F7862E /* URLParser.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = URLParser.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 5C6E65401D5CEDC900F7862E /* URLParser.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = URLParser.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 5C7C88D71D0F1F2B009D2F6D /* SocketProvider.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SocketProvider.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><del>-                5C9B860B1C21E3C600110F36 /* NetworkLoadTiming.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = NetworkLoadTiming.mm; sourceTree = &quot;&lt;group&gt;&quot;; };
</del><ins>+                5C9B860B1C21E3C600110F36 /* NetworkLoadMetrics.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = NetworkLoadMetrics.mm; sourceTree = &quot;&lt;group&gt;&quot;; };
</ins><span class="cx">                 5C9EF16F1DFF719900A452E3 /* XPathGrammar.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = XPathGrammar.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 5C9EF1701DFF719900A452E3 /* XPathGrammar.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = XPathGrammar.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 5CB37FFC1C62D27800F20188 /* ScrollAnimatorMock.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ScrollAnimatorMock.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="lines">@@ -11019,7 +11019,7 @@
</span><span class="cx">                 8A413ADF1207BBA50082016E /* ScriptRunner.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ScriptRunner.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 8A7CC96A12076D73001D4588 /* PendingScript.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PendingScript.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 8A7CC96F12076F8A001D4588 /* PendingScript.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = PendingScript.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><del>-                8A81BF8411DCFD9000DA2B98 /* NetworkLoadTiming.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NetworkLoadTiming.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</del><ins>+                8A81BF8411DCFD9000DA2B98 /* NetworkLoadMetrics.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NetworkLoadMetrics.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</ins><span class="cx">                 8A844D0211D3C18E0014065C /* Performance.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Performance.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 8A844D0311D3C18E0014065C /* Performance.idl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = Performance.idl; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 8A9A586E11E84C35008ACFD1 /* JSPerformanceNavigation.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = JSPerformanceNavigation.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="lines">@@ -18018,7 +18018,7 @@
</span><span class="cx">                                 37DDCD9213844FD50008B793 /* MIMEHeader.cpp */,
</span><span class="cx">                                 37DDCD9313844FD50008B793 /* MIMEHeader.h */,
</span><span class="cx">                                 628D214B12131ED10055DCFC /* NetworkingContext.h */,
</span><del>-                                8A81BF8411DCFD9000DA2B98 /* NetworkLoadTiming.h */,
</del><ins>+                                8A81BF8411DCFD9000DA2B98 /* NetworkLoadMetrics.h */,
</ins><span class="cx">                                 1A7FA61A0DDA3BBE0028F8A5 /* NetworkStateNotifier.cpp */,
</span><span class="cx">                                 1A7FA6180DDA3B3A0028F8A5 /* NetworkStateNotifier.h */,
</span><span class="cx">                                 5C3C856C1D5A7AD30088B9EC /* NetworkStorageSession.cpp */,
</span><span class="lines">@@ -18816,7 +18816,7 @@
</span><span class="cx">                         children = (
</span><span class="cx">                                 3792917C1987678F00F4B661 /* CredentialCocoa.h */,
</span><span class="cx">                                 3792917B1987678F00F4B661 /* CredentialCocoa.mm */,
</span><del>-                                5C9B860B1C21E3C600110F36 /* NetworkLoadTiming.mm */,
</del><ins>+                                5C9B860B1C21E3C600110F36 /* NetworkLoadMetrics.mm */,
</ins><span class="cx">                                 372ADA37197F47B900FC501E /* ProtectionSpaceCocoa.h */,
</span><span class="cx">                                 372ADA39197F687600FC501E /* ProtectionSpaceCocoa.mm */,
</span><span class="cx">                                 7E7DE1FC195CEF260035363B /* ResourceRequestCocoa.mm */,
</span><span class="lines">@@ -27472,7 +27472,7 @@
</span><span class="cx">                                 656D37430ADBA5DE00A4554D /* NetscapePlugInStreamLoader.h in Headers */,
</span><span class="cx">                                 A19D934B1AA11B1E00B46C24 /* NetworkExtensionContentFilter.h in Headers */,
</span><span class="cx">                                 628D214C12131ED10055DCFC /* NetworkingContext.h in Headers */,
</span><del>-                                8A81BF8511DCFD9000DA2B98 /* NetworkLoadTiming.h in Headers */,
</del><ins>+                                8A81BF8511DCFD9000DA2B98 /* NetworkLoadMetrics.h in Headers */,
</ins><span class="cx">                                 59C27F07138D28CF0079B7E2 /* NetworkResourcesData.h in Headers */,
</span><span class="cx">                                 1A7FA6190DDA3B3A0028F8A5 /* NetworkStateNotifier.h in Headers */,
</span><span class="cx">                                 E13EF3441684ECF40034C83F /* NetworkStorageSession.h in Headers */,
</span><span class="lines">@@ -31308,7 +31308,7 @@
</span><span class="cx">                                 996E59DE1DF01285006612B9 /* NavigatorWebDriver.cpp in Sources */,
</span><span class="cx">                                 5D874F130D161D3200796C3B /* NetscapePlugInStreamLoader.cpp in Sources */,
</span><span class="cx">                                 A19D934A1AA11B1E00B46C24 /* NetworkExtensionContentFilter.mm in Sources */,
</span><del>-                                5C9B860C1C21E3C900110F36 /* NetworkLoadTiming.mm in Sources */,
</del><ins>+                                5C9B860C1C21E3C900110F36 /* NetworkLoadMetrics.mm in Sources */,
</ins><span class="cx">                                 59C27F05138D28C10079B7E2 /* NetworkResourcesData.cpp in Sources */,
</span><span class="cx">                                 1A7FA61B0DDA3BBE0028F8A5 /* NetworkStateNotifier.cpp in Sources */,
</span><span class="cx">                                 443F04270E75C8FB007E5407 /* NetworkStateNotifierIOS.mm in Sources */,
</span></span></pre></div>
<a id="trunkSourceWebCorefileapiFileReaderLoadercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/fileapi/FileReaderLoader.cpp (212992 => 212993)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/fileapi/FileReaderLoader.cpp        2017-02-25 04:54:36 UTC (rev 212992)
+++ trunk/Source/WebCore/fileapi/FileReaderLoader.cpp        2017-02-25 05:48:51 UTC (rev 212993)
</span><span class="lines">@@ -215,7 +215,7 @@
</span><span class="cx">         m_client-&gt;didReceiveData();
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void FileReaderLoader::didFinishLoading(unsigned long, double)
</del><ins>+void FileReaderLoader::didFinishLoading(unsigned long)
</ins><span class="cx"> {
</span><span class="cx">     if (m_variableLength &amp;&amp; m_totalBytes &gt; m_bytesLoaded) {
</span><span class="cx">         RefPtr&lt;ArrayBuffer&gt; newData = m_rawData-&gt;slice(0, m_bytesLoaded);
</span></span></pre></div>
<a id="trunkSourceWebCorefileapiFileReaderLoaderh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/fileapi/FileReaderLoader.h (212992 => 212993)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/fileapi/FileReaderLoader.h        2017-02-25 04:54:36 UTC (rev 212992)
+++ trunk/Source/WebCore/fileapi/FileReaderLoader.h        2017-02-25 05:48:51 UTC (rev 212993)
</span><span class="lines">@@ -70,7 +70,7 @@
</span><span class="cx">     // ThreadableLoaderClient
</span><span class="cx">     void didReceiveResponse(unsigned long, const ResourceResponse&amp;) override;
</span><span class="cx">     void didReceiveData(const char*, int) override;
</span><del>-    void didFinishLoading(unsigned long, double) override;
</del><ins>+    void didFinishLoading(unsigned long) override;
</ins><span class="cx">     void didFail(const ResourceError&amp;) override;
</span><span class="cx"> 
</span><span class="cx">     String stringResult();
</span></span></pre></div>
<a id="trunkSourceWebCorehtmlMediaFragmentURIParsercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/html/MediaFragmentURIParser.cpp (212992 => 212993)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/html/MediaFragmentURIParser.cpp        2017-02-25 04:54:36 UTC (rev 212992)
+++ trunk/Source/WebCore/html/MediaFragmentURIParser.cpp        2017-02-25 05:48:51 UTC (rev 212993)
</span><span class="lines">@@ -244,7 +244,7 @@
</span><span class="cx"> 
</span><span class="cx">     // http://www.w3.org/2008/WebVideo/Fragments/WD-media-fragments-spec/#npttimedef
</span><span class="cx">     // Normal Play Time can either be specified as seconds, with an optional
</span><del>-    // fractional part to indicate miliseconds, or as colon-separated hours,
</del><ins>+    // fractional part to indicate milliseconds, or as colon-separated hours,
</ins><span class="cx">     // minutes and seconds (again with an optional fraction). Minutes and
</span><span class="cx">     // seconds must be specified as exactly two digits, hours and fractional
</span><span class="cx">     // seconds can be any number of digits. The hours, minutes and seconds
</span></span></pre></div>
<a id="trunkSourceWebCoreinspectorInspectorInstrumentationcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/inspector/InspectorInstrumentation.cpp (212992 => 212993)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/inspector/InspectorInstrumentation.cpp        2017-02-25 04:54:36 UTC (rev 212992)
+++ trunk/Source/WebCore/inspector/InspectorInstrumentation.cpp        2017-02-25 05:48:51 UTC (rev 212993)
</span><span class="lines">@@ -605,13 +605,13 @@
</span><span class="cx">         networkAgent-&gt;didReceiveData(identifier, data, dataLength, encodedDataLength);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void InspectorInstrumentation::didFinishLoadingImpl(InstrumentingAgents&amp; instrumentingAgents, unsigned long identifier, DocumentLoader* loader, double finishTime)
</del><ins>+void InspectorInstrumentation::didFinishLoadingImpl(InstrumentingAgents&amp; instrumentingAgents, unsigned long identifier, DocumentLoader* loader)
</ins><span class="cx"> {
</span><span class="cx">     if (!loader)
</span><span class="cx">         return;
</span><span class="cx"> 
</span><span class="cx">     if (InspectorNetworkAgent* networkAgent = instrumentingAgents.inspectorNetworkAgent())
</span><del>-        networkAgent-&gt;didFinishLoading(identifier, *loader, finishTime);
</del><ins>+        networkAgent-&gt;didFinishLoading(identifier, *loader);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void InspectorInstrumentation::didFailLoadingImpl(InstrumentingAgents&amp; instrumentingAgents, unsigned long identifier, DocumentLoader* loader, const ResourceError&amp; error)
</span></span></pre></div>
<a id="trunkSourceWebCoreinspectorInspectorInstrumentationh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/inspector/InspectorInstrumentation.h (212992 => 212993)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/inspector/InspectorInstrumentation.h        2017-02-25 04:54:36 UTC (rev 212992)
+++ trunk/Source/WebCore/inspector/InspectorInstrumentation.h        2017-02-25 05:48:51 UTC (rev 212993)
</span><span class="lines">@@ -157,7 +157,7 @@
</span><span class="cx">     static void didReceiveResourceResponse(Frame&amp;, unsigned long identifier, DocumentLoader*, const ResourceResponse&amp;, ResourceLoader*);
</span><span class="cx">     static void didReceiveThreadableLoaderResponse(DocumentThreadableLoader&amp;, unsigned long identifier);
</span><span class="cx">     static void didReceiveData(Frame*, unsigned long identifier, const char* data, int dataLength, int encodedDataLength);
</span><del>-    static void didFinishLoading(Frame*, DocumentLoader*, unsigned long identifier, double finishTime);
</del><ins>+    static void didFinishLoading(Frame*, DocumentLoader*, unsigned long identifier);
</ins><span class="cx">     static void didFailLoading(Frame*, DocumentLoader*, unsigned long identifier, const ResourceError&amp;);
</span><span class="cx">     static void continueAfterXFrameOptionsDenied(Frame&amp;, unsigned long identifier, DocumentLoader&amp;, const ResourceResponse&amp;);
</span><span class="cx">     static void continueWithPolicyDownload(Frame&amp;, unsigned long identifier, DocumentLoader&amp;, const ResourceResponse&amp;);
</span><span class="lines">@@ -327,7 +327,7 @@
</span><span class="cx">     static void didReceiveResourceResponseImpl(InstrumentingAgents&amp;, unsigned long identifier, DocumentLoader*, const ResourceResponse&amp;, ResourceLoader*);
</span><span class="cx">     static void didReceiveThreadableLoaderResponseImpl(InstrumentingAgents&amp;, DocumentThreadableLoader&amp;, unsigned long identifier);
</span><span class="cx">     static void didReceiveDataImpl(InstrumentingAgents&amp;, unsigned long identifier, const char* data, int dataLength, int encodedDataLength);
</span><del>-    static void didFinishLoadingImpl(InstrumentingAgents&amp;, unsigned long identifier, DocumentLoader*, double finishTime);
</del><ins>+    static void didFinishLoadingImpl(InstrumentingAgents&amp;, unsigned long identifier, DocumentLoader*);
</ins><span class="cx">     static void didFailLoadingImpl(InstrumentingAgents&amp;, unsigned long identifier, DocumentLoader*, const ResourceError&amp;);
</span><span class="cx">     static void didFinishXHRLoadingImpl(InstrumentingAgents&amp;, unsigned long identifier, std::optional&lt;String&gt; decodedText, const String&amp; url, const String&amp; sendURL, unsigned sendLineNumber, unsigned sendColumnNumber);
</span><span class="cx">     static void willLoadXHRSynchronouslyImpl(InstrumentingAgents&amp;);
</span><span class="lines">@@ -863,10 +863,10 @@
</span><span class="cx">         didReceiveDataImpl(*instrumentingAgents, identifier, data, dataLength, encodedDataLength);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-inline void InspectorInstrumentation::didFinishLoading(Frame* frame, DocumentLoader* loader, unsigned long identifier, double finishTime)
</del><ins>+inline void InspectorInstrumentation::didFinishLoading(Frame* frame, DocumentLoader* loader, unsigned long identifier)
</ins><span class="cx"> {
</span><span class="cx">     if (InstrumentingAgents* instrumentingAgents = instrumentingAgentsForFrame(frame))
</span><del>-        didFinishLoadingImpl(*instrumentingAgents, identifier, loader, finishTime);
</del><ins>+        didFinishLoadingImpl(*instrumentingAgents, identifier, loader);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> inline void InspectorInstrumentation::didFailLoading(Frame* frame, DocumentLoader* loader, unsigned long identifier, const ResourceError&amp; error)
</span></span></pre></div>
<a id="trunkSourceWebCoreinspectorInspectorNetworkAgentcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/inspector/InspectorNetworkAgent.cpp (212992 => 212993)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/inspector/InspectorNetworkAgent.cpp        2017-02-25 04:54:36 UTC (rev 212992)
+++ trunk/Source/WebCore/inspector/InspectorNetworkAgent.cpp        2017-02-25 05:48:51 UTC (rev 212993)
</span><span class="lines">@@ -114,7 +114,7 @@
</span><span class="cx">         m_responseText.append(m_decoder-&gt;decode(data, dataLength));
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    void didFinishLoading(unsigned long, double) override
</del><ins>+    void didFinishLoading(unsigned long) override
</ins><span class="cx">     {
</span><span class="cx">         if (m_decoder)
</span><span class="cx">             m_responseText.append(m_decoder-&gt;flush());
</span><span class="lines">@@ -179,7 +179,7 @@
</span><span class="cx">     return headersObject;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-Ref&lt;Inspector::Protocol::Network::ResourceTiming&gt; InspectorNetworkAgent::buildObjectForTiming(const NetworkLoadTiming&amp; timing, ResourceLoader&amp; resourceLoader)
</del><ins>+Ref&lt;Inspector::Protocol::Network::ResourceTiming&gt; InspectorNetworkAgent::buildObjectForTiming(const NetworkLoadMetrics&amp; timing, ResourceLoader&amp; resourceLoader)
</ins><span class="cx"> {
</span><span class="cx">     MonotonicTime startTime = resourceLoader.loadTiming().startTime();
</span><span class="cx">     double startTimeInInspector = m_environment.executionStopwatch()-&gt;elapsedTimeSince(startTime);
</span><span class="lines">@@ -186,13 +186,13 @@
</span><span class="cx"> 
</span><span class="cx">     return Inspector::Protocol::Network::ResourceTiming::create()
</span><span class="cx">         .setStartTime(startTimeInInspector)
</span><del>-        .setDomainLookupStart(timing.domainLookupStart)
-        .setDomainLookupEnd(timing.domainLookupEnd)
-        .setConnectStart(timing.connectStart)
-        .setConnectEnd(timing.connectEnd)
-        .setSecureConnectionStart(timing.secureConnectionStart)
-        .setRequestStart(timing.requestStart)
-        .setResponseStart(timing.responseStart)
</del><ins>+        .setDomainLookupStart(timing.domainLookupStart.milliseconds())
+        .setDomainLookupEnd(timing.domainLookupEnd.milliseconds())
+        .setConnectStart(timing.connectStart.milliseconds())
+        .setConnectEnd(timing.connectEnd.milliseconds())
+        .setSecureConnectionStart(timing.secureConnectionStart.milliseconds())
+        .setRequestStart(timing.requestStart.milliseconds())
+        .setResponseStart(timing.responseStart.milliseconds())
</ins><span class="cx">         .release();
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -229,7 +229,7 @@
</span><span class="cx"> 
</span><span class="cx">     responseObject-&gt;setFromDiskCache(response.source() == ResourceResponse::Source::DiskCache || response.source() == ResourceResponse::Source::DiskCacheAfterValidation);
</span><span class="cx">     if (resourceLoader)
</span><del>-        responseObject-&gt;setTiming(buildObjectForTiming(response.networkLoadTiming(), *resourceLoader));
</del><ins>+        responseObject-&gt;setTiming(buildObjectForTiming(response.deprecatedNetworkLoadMetrics(), *resourceLoader));
</ins><span class="cx"> 
</span><span class="cx">     return WTFMove(responseObject);
</span><span class="cx"> }
</span><span class="lines">@@ -380,11 +380,14 @@
</span><span class="cx">     m_frontendDispatcher-&gt;dataReceived(requestId, timestamp(), dataLength, encodedDataLength);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void InspectorNetworkAgent::didFinishLoading(unsigned long identifier, DocumentLoader&amp; loader, double finishTime)
</del><ins>+void InspectorNetworkAgent::didFinishLoading(unsigned long identifier, DocumentLoader&amp; loader)
</ins><span class="cx"> {
</span><span class="cx">     if (m_hiddenRequestIdentifiers.remove(identifier))
</span><span class="cx">         return;
</span><span class="cx"> 
</span><ins>+    // FIXME: Inspector should make use of NetworkLoadMetrics.
+    double elapsedFinishTime = timestamp();
+
</ins><span class="cx">     String requestId = IdentifiersFactory::requestId(identifier);
</span><span class="cx">     if (m_resourcesData-&gt;resourceType(requestId) == InspectorPageAgent::DocumentResource)
</span><span class="cx">         m_resourcesData-&gt;addResourceSharedBuffer(requestId, loader.frameLoader()-&gt;documentLoader()-&gt;mainResourceData(), loader.frame()-&gt;document()-&gt;encoding());
</span><span class="lines">@@ -391,8 +394,6 @@
</span><span class="cx"> 
</span><span class="cx">     m_resourcesData-&gt;maybeDecodeDataToContent(requestId);
</span><span class="cx"> 
</span><del>-    double elapsedFinishTime = finishTime ? m_environment.executionStopwatch()-&gt;elapsedTimeSince(MonotonicTime::fromRawSeconds(finishTime)) : timestamp();
-
</del><span class="cx">     String sourceMappingURL;
</span><span class="cx">     NetworkResourcesData::ResourceData const* resourceData = m_resourcesData-&gt;data(requestId);
</span><span class="cx">     if (resourceData &amp;&amp; resourceData-&gt;cachedResource())
</span></span></pre></div>
<a id="trunkSourceWebCoreinspectorInspectorNetworkAgenth"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/inspector/InspectorNetworkAgent.h (212992 => 212993)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/inspector/InspectorNetworkAgent.h        2017-02-25 04:54:36 UTC (rev 212992)
+++ trunk/Source/WebCore/inspector/InspectorNetworkAgent.h        2017-02-25 05:48:51 UTC (rev 212993)
</span><span class="lines">@@ -49,7 +49,7 @@
</span><span class="cx"> class DocumentLoader;
</span><span class="cx"> class DocumentThreadableLoader;
</span><span class="cx"> class InspectorPageAgent;
</span><del>-class NetworkLoadTiming;
</del><ins>+class NetworkLoadMetrics;
</ins><span class="cx"> class NetworkResourcesData;
</span><span class="cx"> class ResourceError;
</span><span class="cx"> class ResourceLoader;
</span><span class="lines">@@ -79,7 +79,7 @@
</span><span class="cx">     void markResourceAsCached(unsigned long identifier);
</span><span class="cx">     void didReceiveResponse(unsigned long identifier, DocumentLoader&amp;, const ResourceResponse&amp;, ResourceLoader*);
</span><span class="cx">     void didReceiveData(unsigned long identifier, const char* data, int dataLength, int encodedDataLength);
</span><del>-    void didFinishLoading(unsigned long identifier, DocumentLoader&amp;, double finishTime);
</del><ins>+    void didFinishLoading(unsigned long identifier, DocumentLoader&amp;);
</ins><span class="cx">     void didFailLoading(unsigned long identifier, DocumentLoader&amp;, const ResourceError&amp;);
</span><span class="cx">     void didLoadResourceFromMemoryCache(DocumentLoader&amp;, CachedResource&amp;);
</span><span class="cx">     void didReceiveThreadableLoaderResponse(unsigned long identifier, DocumentThreadableLoader&amp;);
</span><span class="lines">@@ -117,7 +117,7 @@
</span><span class="cx"> private:
</span><span class="cx">     void enable();
</span><span class="cx"> 
</span><del>-    Ref&lt;Inspector::Protocol::Network::ResourceTiming&gt; buildObjectForTiming(const NetworkLoadTiming&amp;, ResourceLoader&amp;);
</del><ins>+    Ref&lt;Inspector::Protocol::Network::ResourceTiming&gt; buildObjectForTiming(const NetworkLoadMetrics&amp;, ResourceLoader&amp;);
</ins><span class="cx">     RefPtr&lt;Inspector::Protocol::Network::Response&gt; buildObjectForResourceResponse(const ResourceResponse&amp;, ResourceLoader*);
</span><span class="cx">     Ref&lt;Inspector::Protocol::Network::CachedResource&gt; buildObjectForCachedResource(CachedResource*);
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCoreloaderCrossOriginPreflightCheckercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/loader/CrossOriginPreflightChecker.cpp (212992 => 212993)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/loader/CrossOriginPreflightChecker.cpp        2017-02-25 04:54:36 UTC (rev 212992)
+++ trunk/Source/WebCore/loader/CrossOriginPreflightChecker.cpp        2017-02-25 05:48:51 UTC (rev 212993)
</span><span class="lines">@@ -83,7 +83,7 @@
</span><span class="cx">     // This is only showing success preflight requests and responses but we should show network events
</span><span class="cx">     // for preflight failures and distinguish them better from non-preflight requests.
</span><span class="cx">     InspectorInstrumentation::didReceiveResourceResponse(*frame, identifier, frame-&gt;loader().documentLoader(), response, nullptr);
</span><del>-    InspectorInstrumentation::didFinishLoading(frame, frame-&gt;loader().documentLoader(), identifier, 0);
</del><ins>+    InspectorInstrumentation::didFinishLoading(frame, frame-&gt;loader().documentLoader(), identifier);
</ins><span class="cx"> 
</span><span class="cx">     CrossOriginPreflightResultCache::singleton().appendEntry(loader.securityOrigin().toString(), request.url(), WTFMove(result));
</span><span class="cx">     loader.preflightSuccess(WTFMove(request));
</span></span></pre></div>
<a id="trunkSourceWebCoreloaderDocumentLoadercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/loader/DocumentLoader.cpp (212992 => 212993)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/loader/DocumentLoader.cpp        2017-02-25 04:54:36 UTC (rev 212992)
+++ trunk/Source/WebCore/loader/DocumentLoader.cpp        2017-02-25 05:48:51 UTC (rev 212993)
</span><span class="lines">@@ -363,7 +363,7 @@
</span><span class="cx">     ASSERT_UNUSED(resource, m_mainResource == &amp;resource);
</span><span class="cx">     ASSERT(m_mainResource);
</span><span class="cx">     if (!m_mainResource-&gt;errorOccurred() &amp;&amp; !m_mainResource-&gt;wasCanceled()) {
</span><del>-        finishedLoading(m_mainResource-&gt;loadFinishTime());
</del><ins>+        finishedLoading();
</ins><span class="cx">         return;
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="lines">@@ -375,7 +375,7 @@
</span><span class="cx">     mainReceivedError(m_mainResource-&gt;resourceError());
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void DocumentLoader::finishedLoading(double finishTime)
</del><ins>+void DocumentLoader::finishedLoading()
</ins><span class="cx"> {
</span><span class="cx">     // There is a bug in CFNetwork where callbacks can be dispatched even when loads are deferred.
</span><span class="cx">     // See &lt;rdar://problem/6304600&gt; for more details.
</span><span class="lines">@@ -392,16 +392,12 @@
</span><span class="cx">         // cancel the already-finished substitute load.
</span><span class="cx">         unsigned long identifier = m_identifierForLoadWithoutResourceLoader;
</span><span class="cx">         m_identifierForLoadWithoutResourceLoader = 0;
</span><del>-        frameLoader()-&gt;notifier().dispatchDidFinishLoading(this, identifier, finishTime);
</del><ins>+        frameLoader()-&gt;notifier().dispatchDidFinishLoading(this, identifier);
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     maybeFinishLoadingMultipartContent();
</span><span class="cx"> 
</span><del>-    MonotonicTime responseEndTime = MonotonicTime::fromRawSeconds(finishTime);
-    if (!responseEndTime)
-        responseEndTime = m_timeOfLastDataReceived;
-    if (!responseEndTime)
-        responseEndTime = MonotonicTime::now();
</del><ins>+    MonotonicTime responseEndTime = m_timeOfLastDataReceived ? m_timeOfLastDataReceived : MonotonicTime::now();
</ins><span class="cx">     timing().setResponseEnd(responseEndTime);
</span><span class="cx"> 
</span><span class="cx">     commitIfReady();
</span><span class="lines">@@ -812,7 +808,7 @@
</span><span class="cx">         if (content &amp;&amp; content-&gt;size())
</span><span class="cx">             dataReceived(content-&gt;data(), content-&gt;size());
</span><span class="cx">         if (isLoadingMainResource())
</span><del>-            finishedLoading(0);
</del><ins>+            finishedLoading();
</ins><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -1425,7 +1421,7 @@
</span><span class="cx"> 
</span><span class="cx">     String mimeType = shouldLoadEmpty ? &quot;text/html&quot; : frameLoader()-&gt;client().generatedMIMETypeForURLScheme(m_request.url().protocol().toStringWithoutCopying());
</span><span class="cx">     m_response = ResourceResponse(m_request.url(), mimeType, 0, String());
</span><del>-    finishedLoading(monotonicallyIncreasingTime());
</del><ins>+    finishedLoading();
</ins><span class="cx">     return true;
</span><span class="cx"> }
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCoreloaderDocumentLoaderh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/loader/DocumentLoader.h (212992 => 212993)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/loader/DocumentLoader.h        2017-02-25 04:54:36 UTC (rev 212992)
+++ trunk/Source/WebCore/loader/DocumentLoader.h        2017-02-25 05:48:51 UTC (rev 212993)
</span><span class="lines">@@ -319,7 +319,7 @@
</span><span class="cx"> #endif
</span><span class="cx"> 
</span><span class="cx">     void willSendRequest(ResourceRequest&amp;, const ResourceResponse&amp;);
</span><del>-    void finishedLoading(double finishTime);
</del><ins>+    void finishedLoading();
</ins><span class="cx">     void mainReceivedError(const ResourceError&amp;);
</span><span class="cx">     WEBCORE_EXPORT void redirectReceived(CachedResource&amp;, ResourceRequest&amp;, const ResourceResponse&amp;) override;
</span><span class="cx">     WEBCORE_EXPORT void responseReceived(CachedResource&amp;, const ResourceResponse&amp;) override;
</span></span></pre></div>
<a id="trunkSourceWebCoreloaderDocumentThreadableLoadercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/loader/DocumentThreadableLoader.cpp (212992 => 212993)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/loader/DocumentThreadableLoader.cpp        2017-02-25 04:54:36 UTC (rev 212992)
+++ trunk/Source/WebCore/loader/DocumentThreadableLoader.cpp        2017-02-25 05:48:51 UTC (rev 212993)
</span><span class="lines">@@ -306,7 +306,7 @@
</span><span class="cx">         if (tainting == ResourceResponse::Tainting::Opaque) {
</span><span class="cx">             clearResource();
</span><span class="cx">             if (m_client)
</span><del>-                m_client-&gt;didFinishLoading(identifier, 0.0);
</del><ins>+                m_client-&gt;didFinishLoading(identifier);
</ins><span class="cx">         }
</span><span class="cx">     } else {
</span><span class="cx">         ASSERT(response.type() == ResourceResponse::Type::Opaqueredirect);
</span><span class="lines">@@ -355,13 +355,13 @@
</span><span class="cx">     if (m_resource-&gt;errorOccurred())
</span><span class="cx">         didFail(m_resource-&gt;identifier(), m_resource-&gt;resourceError());
</span><span class="cx">     else
</span><del>-        didFinishLoading(m_resource-&gt;identifier(), m_resource-&gt;loadFinishTime());
</del><ins>+        didFinishLoading(m_resource-&gt;identifier());
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-void DocumentThreadableLoader::didFinishLoading(unsigned long identifier, double finishTime)
</del><ins>+void DocumentThreadableLoader::didFinishLoading(unsigned long identifier)
</ins><span class="cx"> {
</span><span class="cx">     ASSERT(m_client);
</span><del>-    m_client-&gt;didFinishLoading(identifier, finishTime);
</del><ins>+    m_client-&gt;didFinishLoading(identifier);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void DocumentThreadableLoader::didFail(unsigned long, const ResourceError&amp; error)
</span><span class="lines">@@ -461,7 +461,7 @@
</span><span class="cx">             // We don't want XMLHttpRequest to raise an exception for file:// resources, see &lt;rdar://problem/4962298&gt;.
</span><span class="cx">             // FIXME: XMLHttpRequest quirks should be in XMLHttpRequest code, not in DocumentThreadableLoader.cpp.
</span><span class="cx">             didReceiveResponse(identifier, response, ResourceResponse::Tainting::Basic);
</span><del>-            didFinishLoading(identifier, 0.0);
</del><ins>+            didFinishLoading(identifier);
</ins><span class="cx">             return;
</span><span class="cx">         }
</span><span class="cx">         logErrorAndFail(error);
</span><span class="lines">@@ -504,7 +504,7 @@
</span><span class="cx"> 
</span><span class="cx"> #if ENABLE(WEB_TIMING)
</span><span class="cx">     if (RuntimeEnabledFeatures::sharedFeatures().resourceTimingEnabled()) {
</span><del>-        ResourceTiming resourceTiming = ResourceTiming::fromSynchronousLoad(requestURL, m_options.initiator, loadTiming, response.networkLoadTiming(), response, securityOrigin());
</del><ins>+        ResourceTiming resourceTiming = ResourceTiming::fromSynchronousLoad(requestURL, m_options.initiator, loadTiming, response.deprecatedNetworkLoadMetrics(), response, securityOrigin());
</ins><span class="cx">         if (options().initiatorContext == InitiatorContext::Worker)
</span><span class="cx">             finishedTimingForWorkerLoad(resourceTiming);
</span><span class="cx">         else {
</span><span class="lines">@@ -514,7 +514,7 @@
</span><span class="cx">     }
</span><span class="cx"> #endif
</span><span class="cx"> 
</span><del>-    didFinishLoading(identifier, 0.0);
</del><ins>+    didFinishLoading(identifier);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> bool DocumentThreadableLoader::isAllowedByContentSecurityPolicy(const URL&amp; url, ContentSecurityPolicy::RedirectResponseReceived redirectResponseReceived)
</span></span></pre></div>
<a id="trunkSourceWebCoreloaderDocumentThreadableLoaderh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/loader/DocumentThreadableLoader.h (212992 => 212993)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/loader/DocumentThreadableLoader.h        2017-02-25 04:54:36 UTC (rev 212992)
+++ trunk/Source/WebCore/loader/DocumentThreadableLoader.h        2017-02-25 05:48:51 UTC (rev 212993)
</span><span class="lines">@@ -89,7 +89,7 @@
</span><span class="cx"> 
</span><span class="cx">         void didReceiveResponse(unsigned long identifier, const ResourceResponse&amp;, ResourceResponse::Tainting);
</span><span class="cx">         void didReceiveData(unsigned long identifier, const char* data, int dataLength);
</span><del>-        void didFinishLoading(unsigned long identifier, double finishTime);
</del><ins>+        void didFinishLoading(unsigned long identifier);
</ins><span class="cx">         void didFail(unsigned long identifier, const ResourceError&amp;);
</span><span class="cx">         void makeCrossOriginAccessRequest(ResourceRequest&amp;&amp;);
</span><span class="cx">         void makeSimpleCrossOriginAccessRequest(ResourceRequest&amp;&amp;);
</span></span></pre></div>
<a id="trunkSourceWebCoreloaderNetscapePlugInStreamLoadercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/loader/NetscapePlugInStreamLoader.cpp (212992 => 212993)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/loader/NetscapePlugInStreamLoader.cpp        2017-02-25 04:54:36 UTC (rev 212992)
+++ trunk/Source/WebCore/loader/NetscapePlugInStreamLoader.cpp        2017-02-25 05:48:51 UTC (rev 212993)
</span><span class="lines">@@ -146,7 +146,7 @@
</span><span class="cx">     ResourceLoader::didReceiveDataOrBuffer(data, length, WTFMove(buffer), encodedDataLength, dataPayloadType);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void NetscapePlugInStreamLoader::didFinishLoading(double finishTime)
</del><ins>+void NetscapePlugInStreamLoader::didFinishLoading(const NetworkLoadMetrics&amp; networkLoadMetrics)
</ins><span class="cx"> {
</span><span class="cx">     Ref&lt;NetscapePlugInStreamLoader&gt; protectedThis(*this);
</span><span class="cx"> 
</span><span class="lines">@@ -153,7 +153,7 @@
</span><span class="cx">     notifyDone();
</span><span class="cx"> 
</span><span class="cx">     m_client-&gt;didFinishLoading(this);
</span><del>-    ResourceLoader::didFinishLoading(finishTime);
</del><ins>+    ResourceLoader::didFinishLoading(networkLoadMetrics);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void NetscapePlugInStreamLoader::didFail(const ResourceError&amp; error)
</span></span></pre></div>
<a id="trunkSourceWebCoreloaderNetscapePlugInStreamLoaderh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/loader/NetscapePlugInStreamLoader.h (212992 => 212993)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/loader/NetscapePlugInStreamLoader.h        2017-02-25 04:54:36 UTC (rev 212992)
+++ trunk/Source/WebCore/loader/NetscapePlugInStreamLoader.h        2017-02-25 05:48:51 UTC (rev 212993)
</span><span class="lines">@@ -62,7 +62,7 @@
</span><span class="cx">     void didReceiveResponse(const ResourceResponse&amp;) override;
</span><span class="cx">     void didReceiveData(const char*, unsigned, long long encodedDataLength, DataPayloadType) override;
</span><span class="cx">     void didReceiveBuffer(Ref&lt;SharedBuffer&gt;&amp;&amp;, long long encodedDataLength, DataPayloadType) override;
</span><del>-    void didFinishLoading(double finishTime) override;
</del><ins>+    void didFinishLoading(const NetworkLoadMetrics&amp;) override;
</ins><span class="cx">     void didFail(const ResourceError&amp;) override;
</span><span class="cx"> 
</span><span class="cx">     void releaseResources() override;
</span></span></pre></div>
<a id="trunkSourceWebCoreloaderResourceLoadNotifiercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/loader/ResourceLoadNotifier.cpp (212992 => 212993)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/loader/ResourceLoadNotifier.cpp        2017-02-25 04:54:36 UTC (rev 212992)
+++ trunk/Source/WebCore/loader/ResourceLoadNotifier.cpp        2017-02-25 05:48:51 UTC (rev 212993)
</span><span class="lines">@@ -87,11 +87,14 @@
</span><span class="cx">     dispatchDidReceiveData(loader-&gt;documentLoader(), loader-&gt;identifier(), data, dataLength, encodedDataLength);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void ResourceLoadNotifier::didFinishLoad(ResourceLoader* loader, double finishTime)
</del><ins>+void ResourceLoadNotifier::didFinishLoad(ResourceLoader* loader, const NetworkLoadMetrics&amp;)
</ins><span class="cx"> {    
</span><span class="cx">     if (Page* page = m_frame.page())
</span><span class="cx">         page-&gt;progress().completeProgress(loader-&gt;identifier());
</span><del>-    dispatchDidFinishLoading(loader-&gt;documentLoader(), loader-&gt;identifier(), finishTime);
</del><ins>+
+    // FIXME: Inspector should make use of NetworkLoadMetrics.
+
+    dispatchDidFinishLoading(loader-&gt;documentLoader(), loader-&gt;identifier());
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void ResourceLoadNotifier::didFailToLoad(ResourceLoader* loader, const ResourceError&amp; error)
</span><span class="lines">@@ -159,13 +162,13 @@
</span><span class="cx">     InspectorInstrumentation::didReceiveData(&amp;m_frame, identifier, data, dataLength, encodedDataLength);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void ResourceLoadNotifier::dispatchDidFinishLoading(DocumentLoader* loader, unsigned long identifier, double finishTime)
</del><ins>+void ResourceLoadNotifier::dispatchDidFinishLoading(DocumentLoader* loader, unsigned long identifier)
</ins><span class="cx"> {
</span><span class="cx">     // Notifying the FrameLoaderClient may cause the frame to be destroyed.
</span><span class="cx">     Ref&lt;Frame&gt; protect(m_frame);
</span><span class="cx">     m_frame.loader().client().dispatchDidFinishLoading(loader, identifier);
</span><span class="cx"> 
</span><del>-    InspectorInstrumentation::didFinishLoading(&amp;m_frame, loader, identifier, finishTime);
</del><ins>+    InspectorInstrumentation::didFinishLoading(&amp;m_frame, loader, identifier);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void ResourceLoadNotifier::dispatchDidFailLoading(DocumentLoader* loader, unsigned long identifier, const ResourceError&amp; error)
</span><span class="lines">@@ -194,7 +197,7 @@
</span><span class="cx">         dispatchDidReceiveData(loader, identifier, data, dataLength, encodedDataLength);
</span><span class="cx"> 
</span><span class="cx">     if (error.isNull())
</span><del>-        dispatchDidFinishLoading(loader, identifier, 0);
</del><ins>+        dispatchDidFinishLoading(loader, identifier);
</ins><span class="cx">     else
</span><span class="cx">         dispatchDidFailLoading(loader, identifier, error);
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceWebCoreloaderResourceLoadNotifierh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/loader/ResourceLoadNotifier.h (212992 => 212993)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/loader/ResourceLoadNotifier.h        2017-02-25 04:54:36 UTC (rev 212992)
+++ trunk/Source/WebCore/loader/ResourceLoadNotifier.h        2017-02-25 05:48:51 UTC (rev 212993)
</span><span class="lines">@@ -36,11 +36,11 @@
</span><span class="cx"> class AuthenticationChallenge;
</span><span class="cx"> class DocumentLoader;
</span><span class="cx"> class Frame;
</span><del>-class Page;
</del><ins>+class NetworkLoadMetrics;
</ins><span class="cx"> class ResourceError;
</span><span class="cx"> class ResourceLoader;
</span><ins>+class ResourceRequest;
</ins><span class="cx"> class ResourceResponse;
</span><del>-class ResourceRequest;
</del><span class="cx"> 
</span><span class="cx"> class ResourceLoadNotifier {
</span><span class="cx">     WTF_MAKE_NONCOPYABLE(ResourceLoadNotifier);
</span><span class="lines">@@ -53,7 +53,7 @@
</span><span class="cx">     void willSendRequest(ResourceLoader*, ResourceRequest&amp;, const ResourceResponse&amp; redirectResponse);
</span><span class="cx">     void didReceiveResponse(ResourceLoader*, const ResourceResponse&amp;);
</span><span class="cx">     void didReceiveData(ResourceLoader*, const char*, int dataLength, int encodedDataLength);
</span><del>-    void didFinishLoad(ResourceLoader*, double finishTime);
</del><ins>+    void didFinishLoad(ResourceLoader*, const NetworkLoadMetrics&amp;);
</ins><span class="cx">     void didFailToLoad(ResourceLoader*, const ResourceError&amp;);
</span><span class="cx"> 
</span><span class="cx">     void assignIdentifierToInitialRequest(unsigned long identifier, DocumentLoader*, const ResourceRequest&amp;);
</span><span class="lines">@@ -60,7 +60,7 @@
</span><span class="cx">     void dispatchWillSendRequest(DocumentLoader*, unsigned long identifier, ResourceRequest&amp;, const ResourceResponse&amp; redirectResponse);
</span><span class="cx">     void dispatchDidReceiveResponse(DocumentLoader*, unsigned long identifier, const ResourceResponse&amp;, ResourceLoader* = nullptr);
</span><span class="cx">     void dispatchDidReceiveData(DocumentLoader*, unsigned long identifier, const char* data, int dataLength, int encodedDataLength);
</span><del>-    void dispatchDidFinishLoading(DocumentLoader*, unsigned long identifier, double finishTime);
</del><ins>+    void dispatchDidFinishLoading(DocumentLoader*, unsigned long identifier);
</ins><span class="cx">     void dispatchDidFailLoading(DocumentLoader*, unsigned long identifier, const ResourceError&amp;);
</span><span class="cx"> 
</span><span class="cx">     void sendRemainingDelegateMessages(DocumentLoader*, unsigned long identifier, const ResourceRequest&amp;, const ResourceResponse&amp;, const char* data, int dataLength, int encodedDataLength, const ResourceError&amp;);
</span></span></pre></div>
<a id="trunkSourceWebCoreloaderResourceLoadercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/loader/ResourceLoader.cpp (212992 => 212993)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/loader/ResourceLoader.cpp        2017-02-25 04:54:36 UTC (rev 212992)
+++ trunk/Source/WebCore/loader/ResourceLoader.cpp        2017-02-25 05:48:51 UTC (rev 212993)
</span><span class="lines">@@ -181,7 +181,8 @@
</span><span class="cx">             return;
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    didFinishLoading(0);
</del><ins>+    NetworkLoadMetrics emptyMetrics;
+    didFinishLoading(emptyMetrics);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void ResourceLoader::start()
</span><span class="lines">@@ -271,8 +272,10 @@
</span><span class="cx">         if (!protectedThis-&gt;reachedTerminalState() &amp;&amp; dataSize)
</span><span class="cx">             protectedThis-&gt;didReceiveBuffer(result.data.releaseNonNull(), dataSize, DataPayloadWholeResource);
</span><span class="cx"> 
</span><del>-        if (!protectedThis-&gt;reachedTerminalState())
-            protectedThis-&gt;didFinishLoading(currentTime());
</del><ins>+        if (!protectedThis-&gt;reachedTerminalState()) {
+            NetworkLoadMetrics emptyMetrics;
+            protectedThis-&gt;didFinishLoading(emptyMetrics);
+        }
</ins><span class="cx">     });
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -488,9 +491,9 @@
</span><span class="cx">         frameLoader()-&gt;notifier().didReceiveData(this, buffer ? buffer-&gt;data() : data, buffer ? buffer-&gt;size() : length, static_cast&lt;int&gt;(encodedDataLength));
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void ResourceLoader::didFinishLoading(double finishTime)
</del><ins>+void ResourceLoader::didFinishLoading(const NetworkLoadMetrics&amp; networkLoadMetrics)
</ins><span class="cx"> {
</span><del>-    didFinishLoadingOnePart(finishTime);
</del><ins>+    didFinishLoadingOnePart(networkLoadMetrics);
</ins><span class="cx"> 
</span><span class="cx">     // If the load has been cancelled by a delegate in response to didFinishLoad(), do not release
</span><span class="cx">     // the resources a second time, they have been released by cancel.
</span><span class="lines">@@ -499,7 +502,7 @@
</span><span class="cx">     releaseResources();
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void ResourceLoader::didFinishLoadingOnePart(double finishTime)
</del><ins>+void ResourceLoader::didFinishLoadingOnePart(const NetworkLoadMetrics&amp; networkLoadMetrics)
</ins><span class="cx"> {
</span><span class="cx">     // If load has been cancelled after finishing (which could happen with a
</span><span class="cx">     // JavaScript that changes the window location), do nothing.
</span><span class="lines">@@ -511,7 +514,7 @@
</span><span class="cx">         return;
</span><span class="cx">     m_notifiedLoadComplete = true;
</span><span class="cx">     if (m_options.sendLoadCallbacks == SendCallbacks)
</span><del>-        frameLoader()-&gt;notifier().didFinishLoad(this, finishTime);
</del><ins>+        frameLoader()-&gt;notifier().didFinishLoad(this, networkLoadMetrics);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void ResourceLoader::didFail(const ResourceError&amp; error)
</span><span class="lines">@@ -645,9 +648,10 @@
</span><span class="cx">     didReceiveBuffer(WTFMove(buffer), encodedDataLength, DataPayloadBytes);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void ResourceLoader::didFinishLoading(ResourceHandle*, double finishTime)
</del><ins>+void ResourceLoader::didFinishLoading(ResourceHandle*)
</ins><span class="cx"> {
</span><del>-    didFinishLoading(finishTime);
</del><ins>+    NetworkLoadMetrics emptyMetrics;
+    didFinishLoading(emptyMetrics);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void ResourceLoader::didFail(ResourceHandle*, const ResourceError&amp; error)
</span></span></pre></div>
<a id="trunkSourceWebCoreloaderResourceLoaderh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/loader/ResourceLoader.h (212992 => 212993)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/loader/ResourceLoader.h        2017-02-25 04:54:36 UTC (rev 212992)
+++ trunk/Source/WebCore/loader/ResourceLoader.h        2017-02-25 05:48:51 UTC (rev 212993)
</span><span class="lines">@@ -50,6 +50,7 @@
</span><span class="cx"> class DocumentLoader;
</span><span class="cx"> class Frame;
</span><span class="cx"> class FrameLoader;
</span><ins>+class NetworkLoadMetrics;
</ins><span class="cx"> class QuickLookHandle;
</span><span class="cx"> class URL;
</span><span class="cx"> 
</span><span class="lines">@@ -102,7 +103,7 @@
</span><span class="cx">     virtual void didReceiveResponse(const ResourceResponse&amp;);
</span><span class="cx">     virtual void didReceiveData(const char*, unsigned, long long encodedDataLength, DataPayloadType);
</span><span class="cx">     virtual void didReceiveBuffer(Ref&lt;SharedBuffer&gt;&amp;&amp;, long long encodedDataLength, DataPayloadType);
</span><del>-    virtual void didFinishLoading(double finishTime);
</del><ins>+    virtual void didFinishLoading(const NetworkLoadMetrics&amp;);
</ins><span class="cx">     virtual void didFail(const ResourceError&amp;);
</span><span class="cx"> #if USE(NETWORK_CFDATA_ARRAY_CALLBACK)
</span><span class="cx">     virtual void didReceiveDataArray(CFArrayRef dataArray);
</span><span class="lines">@@ -152,7 +153,7 @@
</span><span class="cx"> protected:
</span><span class="cx">     ResourceLoader(Frame&amp;, ResourceLoaderOptions);
</span><span class="cx"> 
</span><del>-    void didFinishLoadingOnePart(double finishTime);
</del><ins>+    void didFinishLoadingOnePart(const NetworkLoadMetrics&amp;);
</ins><span class="cx">     void cleanupForError(const ResourceError&amp;);
</span><span class="cx"> 
</span><span class="cx">     bool wasCancelled() const { return m_cancellationStatus &gt;= Cancelled; }
</span><span class="lines">@@ -191,7 +192,7 @@
</span><span class="cx">     void didReceiveResponse(ResourceHandle*, ResourceResponse&amp;&amp;) override;
</span><span class="cx">     void didReceiveData(ResourceHandle*, const char*, unsigned, int encodedDataLength) override;
</span><span class="cx">     void didReceiveBuffer(ResourceHandle*, Ref&lt;SharedBuffer&gt;&amp;&amp;, int encodedDataLength) override;
</span><del>-    void didFinishLoading(ResourceHandle*, double finishTime) override;
</del><ins>+    void didFinishLoading(ResourceHandle*) override;
</ins><span class="cx">     void didFail(ResourceHandle*, const ResourceError&amp;) override;
</span><span class="cx">     void wasBlocked(ResourceHandle*) override;
</span><span class="cx">     void cannotShowURL(ResourceHandle*) override;
</span></span></pre></div>
<a id="trunkSourceWebCoreloaderResourceTimingcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/loader/ResourceTiming.cpp (212992 => 212993)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/loader/ResourceTiming.cpp        2017-02-25 04:54:36 UTC (rev 212992)
+++ trunk/Source/WebCore/loader/ResourceTiming.cpp        2017-02-25 05:48:51 UTC (rev 212993)
</span><span class="lines">@@ -60,14 +60,14 @@
</span><span class="cx">     return ResourceTiming(url, initiator, loadTiming);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-ResourceTiming ResourceTiming::fromLoad(CachedResource&amp; resource, const String&amp; initiator, const LoadTiming&amp; loadTiming, const SecurityOrigin&amp; securityOrigin)
</del><ins>+ResourceTiming ResourceTiming::fromLoad(CachedResource&amp; resource, const String&amp; initiator, const LoadTiming&amp; loadTiming, const NetworkLoadMetrics&amp; networkLoadMetrics, const SecurityOrigin&amp; securityOrigin)
</ins><span class="cx"> {
</span><del>-    return ResourceTiming(resource, initiator, loadTiming, securityOrigin);
</del><ins>+    return ResourceTiming(resource, initiator, loadTiming, networkLoadMetrics, securityOrigin);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-ResourceTiming ResourceTiming::fromSynchronousLoad(const URL&amp; url, const String&amp; initiator, const LoadTiming&amp; loadTiming, const NetworkLoadTiming&amp; networkLoadTiming, const ResourceResponse&amp; response, const SecurityOrigin&amp; securityOrigin)
</del><ins>+ResourceTiming ResourceTiming::fromSynchronousLoad(const URL&amp; url, const String&amp; initiator, const LoadTiming&amp; loadTiming, const NetworkLoadMetrics&amp; networkLoadMetrics, const ResourceResponse&amp; response, const SecurityOrigin&amp; securityOrigin)
</ins><span class="cx"> {
</span><del>-    return ResourceTiming(url, initiator, loadTiming, networkLoadTiming, response, securityOrigin);
</del><ins>+    return ResourceTiming(url, initiator, loadTiming, networkLoadMetrics, response, securityOrigin);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> ResourceTiming::ResourceTiming(const URL&amp; url, const String&amp; initiator, const LoadTiming&amp; loadTiming)
</span><span class="lines">@@ -78,20 +78,20 @@
</span><span class="cx"> {
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-ResourceTiming::ResourceTiming(CachedResource&amp; resource, const String&amp; initiator, const LoadTiming&amp; loadTiming, const SecurityOrigin&amp; securityOrigin)
</del><ins>+ResourceTiming::ResourceTiming(CachedResource&amp; resource, const String&amp; initiator, const LoadTiming&amp; loadTiming, const NetworkLoadMetrics&amp; networkLoadMetrics, const SecurityOrigin&amp; securityOrigin)
</ins><span class="cx">     : m_url(resource.resourceRequest().url())
</span><span class="cx">     , m_initiator(initiator)
</span><span class="cx">     , m_loadTiming(loadTiming)
</span><del>-    , m_networkLoadTiming(resource.response().networkLoadTiming())
</del><ins>+    , m_networkLoadMetrics(networkLoadMetrics)
</ins><span class="cx">     , m_allowTimingDetails(passesTimingAllowCheck(resource.response(), securityOrigin))
</span><span class="cx"> {
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-ResourceTiming::ResourceTiming(const URL&amp; url, const String&amp; initiator, const LoadTiming&amp; loadTiming, const NetworkLoadTiming&amp; networkLoadTiming, const ResourceResponse&amp; response, const SecurityOrigin&amp; securityOrigin)
</del><ins>+ResourceTiming::ResourceTiming(const URL&amp; url, const String&amp; initiator, const LoadTiming&amp; loadTiming, const NetworkLoadMetrics&amp; networkLoadMetrics, const ResourceResponse&amp; response, const SecurityOrigin&amp; securityOrigin)
</ins><span class="cx">     : m_url(url)
</span><span class="cx">     , m_initiator(initiator)
</span><span class="cx">     , m_loadTiming(loadTiming)
</span><del>-    , m_networkLoadTiming(networkLoadTiming)
</del><ins>+    , m_networkLoadMetrics(networkLoadMetrics)
</ins><span class="cx">     , m_allowTimingDetails(passesTimingAllowCheck(response, securityOrigin))
</span><span class="cx"> {
</span><span class="cx"> }
</span><span class="lines">@@ -98,7 +98,7 @@
</span><span class="cx"> 
</span><span class="cx"> ResourceTiming ResourceTiming::isolatedCopy() const
</span><span class="cx"> {
</span><del>-    return ResourceTiming(m_url.isolatedCopy(), m_initiator.isolatedCopy(), m_loadTiming.isolatedCopy(), m_networkLoadTiming.isolatedCopy(), m_allowTimingDetails);
</del><ins>+    return ResourceTiming(m_url.isolatedCopy(), m_initiator.isolatedCopy(), m_loadTiming.isolatedCopy(), m_networkLoadMetrics.isolatedCopy(), m_allowTimingDetails);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> } // namespace WebCore
</span></span></pre></div>
<a id="trunkSourceWebCoreloaderResourceTimingh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/loader/ResourceTiming.h (212992 => 212993)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/loader/ResourceTiming.h        2017-02-25 04:54:36 UTC (rev 212992)
+++ trunk/Source/WebCore/loader/ResourceTiming.h        2017-02-25 05:48:51 UTC (rev 212993)
</span><span class="lines">@@ -26,7 +26,7 @@
</span><span class="cx"> #pragma once
</span><span class="cx"> 
</span><span class="cx"> #include &quot;LoadTiming.h&quot;
</span><del>-#include &quot;NetworkLoadTiming.h&quot;
</del><ins>+#include &quot;NetworkLoadMetrics.h&quot;
</ins><span class="cx"> #include &quot;URL.h&quot;
</span><span class="cx"> 
</span><span class="cx"> namespace WebCore {
</span><span class="lines">@@ -39,13 +39,13 @@
</span><span class="cx">     WTF_MAKE_FAST_ALLOCATED;
</span><span class="cx"> public:
</span><span class="cx">     static ResourceTiming fromCache(const URL&amp;, const String&amp; initiator, const LoadTiming&amp;);
</span><del>-    static ResourceTiming fromLoad(CachedResource&amp;, const String&amp; initiator, const LoadTiming&amp;, const SecurityOrigin&amp;);
-    static ResourceTiming fromSynchronousLoad(const URL&amp;, const String&amp; initiator, const LoadTiming&amp;, const NetworkLoadTiming&amp;, const ResourceResponse&amp;, const SecurityOrigin&amp;);
</del><ins>+    static ResourceTiming fromLoad(CachedResource&amp;, const String&amp; initiator, const LoadTiming&amp;, const NetworkLoadMetrics&amp;, const SecurityOrigin&amp;);
+    static ResourceTiming fromSynchronousLoad(const URL&amp;, const String&amp; initiator, const LoadTiming&amp;, const NetworkLoadMetrics&amp;, const ResourceResponse&amp;, const SecurityOrigin&amp;);
</ins><span class="cx"> 
</span><span class="cx">     URL url() const { return m_url; }
</span><span class="cx">     String initiator() const { return m_initiator; }
</span><span class="cx">     LoadTiming loadTiming() const { return m_loadTiming; }
</span><del>-    NetworkLoadTiming networkLoadTiming() const { return m_networkLoadTiming; }
</del><ins>+    NetworkLoadMetrics networkLoadMetrics() const { return m_networkLoadMetrics; }
</ins><span class="cx">     bool allowTimingDetails() const { return m_allowTimingDetails; }
</span><span class="cx"> 
</span><span class="cx">     ResourceTiming isolatedCopy() const;
</span><span class="lines">@@ -53,14 +53,14 @@
</span><span class="cx">     void overrideInitiatorName(const String&amp; name) { m_initiator = name; }
</span><span class="cx"> 
</span><span class="cx"> private:
</span><del>-    ResourceTiming(CachedResource&amp;, const String&amp; initiator, const LoadTiming&amp;, const SecurityOrigin&amp;);
-    ResourceTiming(const URL&amp;, const String&amp; initiator, const LoadTiming&amp;, const NetworkLoadTiming&amp;, const ResourceResponse&amp;, const SecurityOrigin&amp;);
</del><ins>+    ResourceTiming(CachedResource&amp;, const String&amp; initiator, const LoadTiming&amp;, const NetworkLoadMetrics&amp;, const SecurityOrigin&amp;);
+    ResourceTiming(const URL&amp;, const String&amp; initiator, const LoadTiming&amp;, const NetworkLoadMetrics&amp;, const ResourceResponse&amp;, const SecurityOrigin&amp;);
</ins><span class="cx">     ResourceTiming(const URL&amp;, const String&amp; initiator, const LoadTiming&amp;);
</span><del>-    ResourceTiming(const URL&amp; url, const String&amp; initiator, const LoadTiming&amp; loadTiming, const NetworkLoadTiming&amp; networkLoadTiming, bool allowTimingDetails)
</del><ins>+    ResourceTiming(const URL&amp; url, const String&amp; initiator, const LoadTiming&amp; loadTiming, const NetworkLoadMetrics&amp; networkLoadMetrics, bool allowTimingDetails)
</ins><span class="cx">         : m_url(url)
</span><span class="cx">         , m_initiator(initiator)
</span><span class="cx">         , m_loadTiming(loadTiming)
</span><del>-        , m_networkLoadTiming(networkLoadTiming)
</del><ins>+        , m_networkLoadMetrics(networkLoadMetrics)
</ins><span class="cx">         , m_allowTimingDetails(allowTimingDetails)
</span><span class="cx">     {
</span><span class="cx">     }
</span><span class="lines">@@ -68,7 +68,7 @@
</span><span class="cx">     URL m_url;
</span><span class="cx">     String m_initiator;
</span><span class="cx">     LoadTiming m_loadTiming;
</span><del>-    NetworkLoadTiming m_networkLoadTiming;
</del><ins>+    NetworkLoadMetrics m_networkLoadMetrics;
</ins><span class="cx">     bool m_allowTimingDetails { false };
</span><span class="cx"> };
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCoreloaderSubresourceLoadercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/loader/SubresourceLoader.cpp (212992 => 212993)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/loader/SubresourceLoader.cpp        2017-02-25 04:54:36 UTC (rev 212992)
+++ trunk/Source/WebCore/loader/SubresourceLoader.cpp        2017-02-25 05:48:51 UTC (rev 212993)
</span><span class="lines">@@ -81,7 +81,6 @@
</span><span class="cx"> SubresourceLoader::SubresourceLoader(Frame&amp; frame, CachedResource&amp; resource, const ResourceLoaderOptions&amp; options)
</span><span class="cx">     : ResourceLoader(frame, options)
</span><span class="cx">     , m_resource(&amp;resource)
</span><del>-    , m_loadingMultipartContent(false)
</del><span class="cx">     , m_state(Uninitialized)
</span><span class="cx">     , m_requestCountTracker(std::in_place, frame.document()-&gt;cachedResourceLoader(), resource)
</span><span class="cx"> {
</span><span class="lines">@@ -192,7 +191,8 @@
</span><span class="cx">             opaqueRedirectedResponse.setURL(redirectResponse.url());
</span><span class="cx">             opaqueRedirectedResponse.setType(ResourceResponse::Type::Opaqueredirect);
</span><span class="cx">             m_resource-&gt;responseReceived(opaqueRedirectedResponse);
</span><del>-            didFinishLoading(currentTime());
</del><ins>+            NetworkLoadMetrics emptyMetrics;
+            didFinishLoading(emptyMetrics);
</ins><span class="cx">             return;
</span><span class="cx">         } else if (m_redirectCount++ &gt;= options().maxRedirectCount) {
</span><span class="cx">             cancel(ResourceError(String(), 0, request().url(), ASCIILiteral(&quot;Too many redirections&quot;), ResourceError::Type::General));
</span><span class="lines">@@ -283,8 +283,12 @@
</span><span class="cx">     }
</span><span class="cx"> #endif
</span><span class="cx"> 
</span><del>-    // We want redirect responses to be processed through willSendRequestInternal. The only exception is redirection with no Location headers.
</del><ins>+    // We want redirect responses to be processed through willSendRequestInternal.
+    // The only exception is redirection with no Location headers. Or in rare circumstances,
+    // cases of too many redirects from CFNetwork (&lt;rdar://problem/30610988&gt;).
+#if !PLATFORM(COCOA)
</ins><span class="cx">     ASSERT(response.httpStatusCode() &lt; 300 || response.httpStatusCode() &gt;= 400 || response.httpStatusCode() == 304 || !response.httpHeaderField(HTTPHeaderName::Location));
</span><ins>+#endif
</ins><span class="cx"> 
</span><span class="cx">     // Reference the object in this method since the additional processing can do
</span><span class="cx">     // anything including removing the last reference to this object; one example of this is 3266216.
</span><span class="lines">@@ -347,8 +351,9 @@
</span><span class="cx">         clearResourceData();
</span><span class="cx">         // Since a subresource loader does not load multipart sections progressively, data was delivered to the loader all at once.
</span><span class="cx">         // After the first multipart section is complete, signal to delegates that this load is &quot;finished&quot;
</span><ins>+        NetworkLoadMetrics emptyMetrics;
</ins><span class="cx">         m_documentLoader-&gt;subresourceLoaderFinishedLoadingOnePart(this);
</span><del>-        didFinishLoadingOnePart(0);
</del><ins>+        didFinishLoadingOnePart(emptyMetrics);
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     checkForHTTPStatusCodeError();
</span><span class="lines">@@ -510,7 +515,7 @@
</span><span class="cx">     return true;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void SubresourceLoader::didFinishLoading(double finishTime)
</del><ins>+void SubresourceLoader::didFinishLoading(const NetworkLoadMetrics&amp; networkLoadMetrics)
</ins><span class="cx"> {
</span><span class="cx"> #if USE(QUICK_LOOK)
</span><span class="cx">     if (auto quickLookHandle = m_quickLookHandle.get()) {
</span><span class="lines">@@ -531,23 +536,21 @@
</span><span class="cx">     Ref&lt;SubresourceLoader&gt; protectedThis(*this);
</span><span class="cx">     CachedResourceHandle&lt;CachedResource&gt; protectResource(m_resource);
</span><span class="cx"> 
</span><del>-    // FIXME: &lt;https://webkit.org/b/168351&gt; [Resource Timing] Gather timing information with reliable responseEnd time
-    // The finishTime that is passed in is from the NetworkProcess and is more accurate.
-    // However, all other load times are generated from the web process or offsets.
-    // Mixing times from different processes can cause the finish time to be earlier than
-    // the response received time due to inter-process communication lag. This could be solved
-    // by gathering NetworkLoadTiming information at completion time instead of at
-    // didReceiveResponse time.
-    UNUSED_PARAM(finishTime);
-    MonotonicTime responseEndTime = MonotonicTime::now();
-    m_loadTiming.setResponseEnd(responseEndTime);
</del><ins>+    // FIXME: Remove this with deprecatedNetworkLoadMetrics.
+    m_loadTiming.setResponseEnd(MonotonicTime::now());
</ins><span class="cx"> 
</span><span class="cx"> #if ENABLE(WEB_TIMING)
</span><del>-    reportResourceTiming();
</del><ins>+    if (networkLoadMetrics.isComplete())
+        reportResourceTiming(networkLoadMetrics);
+    else {
+        // This is the legacy path for platforms (and ResourceHandle paths) that do not provide
+        // complete load metrics in didFinishLoad. In those cases, fall back to the possibility
+        // that they populated partial load timing information on the ResourceResponse.
+        reportResourceTiming(m_resource-&gt;response().deprecatedNetworkLoadMetrics());
+    }
</ins><span class="cx"> #endif
</span><span class="cx"> 
</span><span class="cx">     m_state = Finishing;
</span><del>-    m_resource-&gt;setLoadFinishTime(responseEndTime.secondsSinceEpoch().seconds()); // FIXME: Users of the loadFinishTime should use the LoadTiming struct instead.
</del><span class="cx">     m_resource-&gt;finishLoading(resourceData());
</span><span class="cx"> 
</span><span class="cx">     if (wasCancelled())
</span><span class="lines">@@ -554,7 +557,7 @@
</span><span class="cx">         return;
</span><span class="cx">     m_resource-&gt;finish();
</span><span class="cx">     ASSERT(!reachedTerminalState());
</span><del>-    didFinishLoadingOnePart(responseEndTime.secondsSinceEpoch().seconds());
</del><ins>+    didFinishLoadingOnePart(m_resource-&gt;response().deprecatedNetworkLoadMetrics());
</ins><span class="cx">     notifyDone();
</span><span class="cx">     if (reachedTerminalState())
</span><span class="cx">         return;
</span><span class="lines">@@ -662,7 +665,7 @@
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> #if ENABLE(WEB_TIMING)
</span><del>-void SubresourceLoader::reportResourceTiming()
</del><ins>+void SubresourceLoader::reportResourceTiming(const NetworkLoadMetrics&amp; networkLoadMetrics)
</ins><span class="cx"> {
</span><span class="cx">     if (!RuntimeEnabledFeatures::sharedFeatures().resourceTimingEnabled())
</span><span class="cx">         return;
</span><span class="lines">@@ -673,9 +676,9 @@
</span><span class="cx">     Document* document = m_documentLoader-&gt;cachedResourceLoader().document();
</span><span class="cx">     if (!document)
</span><span class="cx">         return;
</span><del>-    
</del><ins>+
</ins><span class="cx">     SecurityOrigin&amp; origin = m_origin ? *m_origin : document-&gt;securityOrigin();
</span><del>-    ResourceTiming resourceTiming = ResourceTiming::fromLoad(*m_resource, m_resource-&gt;initiatorName(), m_loadTiming, origin);
</del><ins>+    ResourceTiming resourceTiming = ResourceTiming::fromLoad(*m_resource, m_resource-&gt;initiatorName(), m_loadTiming, networkLoadMetrics, origin);
</ins><span class="cx"> 
</span><span class="cx">     // Worker resources loaded here are all CachedRawResources loaded through WorkerThreadableLoader.
</span><span class="cx">     // Pass the ResourceTiming information on so that WorkerThreadableLoader may add them to the
</span></span></pre></div>
<a id="trunkSourceWebCoreloaderSubresourceLoaderh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/loader/SubresourceLoader.h (212992 => 212993)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/loader/SubresourceLoader.h        2017-02-25 04:54:36 UTC (rev 212992)
+++ trunk/Source/WebCore/loader/SubresourceLoader.h        2017-02-25 05:48:51 UTC (rev 212993)
</span><span class="lines">@@ -30,7 +30,6 @@
</span><span class="cx"> 
</span><span class="cx"> #include &quot;FrameLoaderTypes.h&quot;
</span><span class="cx"> #include &quot;ResourceLoader.h&quot;
</span><del>-
</del><span class="cx"> #include &lt;wtf/text/WTFString.h&gt;
</span><span class="cx">  
</span><span class="cx"> namespace WebCore {
</span><span class="lines">@@ -37,7 +36,7 @@
</span><span class="cx"> 
</span><span class="cx"> class CachedResource;
</span><span class="cx"> class CachedResourceLoader;
</span><del>-class Document;
</del><ins>+class NetworkLoadMetrics;
</ins><span class="cx"> class ResourceRequest;
</span><span class="cx"> class SecurityOrigin;
</span><span class="cx"> 
</span><span class="lines">@@ -71,7 +70,7 @@
</span><span class="cx">     void didReceiveResponse(const ResourceResponse&amp;) override;
</span><span class="cx">     void didReceiveData(const char*, unsigned, long long encodedDataLength, DataPayloadType) override;
</span><span class="cx">     void didReceiveBuffer(Ref&lt;SharedBuffer&gt;&amp;&amp;, long long encodedDataLength, DataPayloadType) override;
</span><del>-    void didFinishLoading(double finishTime) override;
</del><ins>+    void didFinishLoading(const NetworkLoadMetrics&amp;) override;
</ins><span class="cx">     void didFail(const ResourceError&amp;) override;
</span><span class="cx">     void willCancel(const ResourceError&amp;) override;
</span><span class="cx">     void didCancel(const ResourceError&amp;) override;
</span><span class="lines">@@ -103,7 +102,7 @@
</span><span class="cx">     void notifyDone();
</span><span class="cx"> 
</span><span class="cx"> #if ENABLE(WEB_TIMING)
</span><del>-    void reportResourceTiming();
</del><ins>+    void reportResourceTiming(const NetworkLoadMetrics&amp;);
</ins><span class="cx"> #endif
</span><span class="cx"> 
</span><span class="cx"> #if USE(QUICK_LOOK)
</span><span class="lines">@@ -135,11 +134,11 @@
</span><span class="cx">     ResourceRequest m_iOSOriginalRequest;
</span><span class="cx"> #endif
</span><span class="cx">     CachedResource* m_resource;
</span><del>-    bool m_loadingMultipartContent;
</del><span class="cx">     SubresourceLoaderState m_state;
</span><span class="cx">     std::optional&lt;RequestCountTracker&gt; m_requestCountTracker;
</span><span class="cx">     RefPtr&lt;SecurityOrigin&gt; m_origin;
</span><span class="cx">     unsigned m_redirectCount { 0 };
</span><ins>+    bool m_loadingMultipartContent { false };
</ins><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceWebCoreloaderThreadableLoaderClienth"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/loader/ThreadableLoaderClient.h (212992 => 212993)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/loader/ThreadableLoaderClient.h        2017-02-25 04:54:36 UTC (rev 212992)
+++ trunk/Source/WebCore/loader/ThreadableLoaderClient.h        2017-02-25 05:48:51 UTC (rev 212993)
</span><span class="lines">@@ -43,7 +43,7 @@
</span><span class="cx"> 
</span><span class="cx">         virtual void didReceiveResponse(unsigned long /*identifier*/, const ResourceResponse&amp;) { }
</span><span class="cx">         virtual void didReceiveData(const char*, int /*dataLength*/) { }
</span><del>-        virtual void didFinishLoading(unsigned long /*identifier*/, double /*finishTime*/) { }
</del><ins>+        virtual void didFinishLoading(unsigned long /*identifier*/) { }
</ins><span class="cx">         virtual void didFail(const ResourceError&amp;) { }
</span><span class="cx"> 
</span><span class="cx"> #if ENABLE(WEB_TIMING)
</span></span></pre></div>
<a id="trunkSourceWebCoreloaderThreadableLoaderClientWrapperh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/loader/ThreadableLoaderClientWrapper.h (212992 => 212993)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/loader/ThreadableLoaderClientWrapper.h        2017-02-25 04:54:36 UTC (rev 212992)
+++ trunk/Source/WebCore/loader/ThreadableLoaderClientWrapper.h        2017-02-25 05:48:51 UTC (rev 212993)
</span><span class="lines">@@ -73,11 +73,11 @@
</span><span class="cx">             m_client-&gt;didReceiveData(data, dataLength);
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    void didFinishLoading(unsigned long identifier, double finishTime)
</del><ins>+    void didFinishLoading(unsigned long identifier)
</ins><span class="cx">     {
</span><span class="cx">         m_done = true;
</span><span class="cx">         if (m_client)
</span><del>-            m_client-&gt;didFinishLoading(identifier, finishTime);
</del><ins>+            m_client-&gt;didFinishLoading(identifier);
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     void didFail(const ResourceError&amp; error)
</span></span></pre></div>
<a id="trunkSourceWebCoreloaderWorkerThreadableLoadercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/loader/WorkerThreadableLoader.cpp (212992 => 212993)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/loader/WorkerThreadableLoader.cpp        2017-02-25 04:54:36 UTC (rev 212992)
+++ trunk/Source/WebCore/loader/WorkerThreadableLoader.cpp        2017-02-25 05:48:51 UTC (rev 212993)
</span><span class="lines">@@ -201,12 +201,12 @@
</span><span class="cx">     }, m_taskMode);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void WorkerThreadableLoader::MainThreadBridge::didFinishLoading(unsigned long identifier, double finishTime)
</del><ins>+void WorkerThreadableLoader::MainThreadBridge::didFinishLoading(unsigned long identifier)
</ins><span class="cx"> {
</span><span class="cx">     m_loadingFinished = true;
</span><del>-    m_loaderProxy.postTaskForModeToWorkerGlobalScope([protectedWorkerClientWrapper = makeRef(*m_workerClientWrapper), identifier, finishTime] (ScriptExecutionContext&amp; context) mutable {
</del><ins>+    m_loaderProxy.postTaskForModeToWorkerGlobalScope([protectedWorkerClientWrapper = makeRef(*m_workerClientWrapper), identifier] (ScriptExecutionContext&amp; context) mutable {
</ins><span class="cx">         ASSERT_UNUSED(context, context.isWorkerGlobalScope());
</span><del>-        protectedWorkerClientWrapper-&gt;didFinishLoading(identifier, finishTime);
</del><ins>+        protectedWorkerClientWrapper-&gt;didFinishLoading(identifier);
</ins><span class="cx">     }, m_taskMode);
</span><span class="cx"> }
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCoreloaderWorkerThreadableLoaderh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/loader/WorkerThreadableLoader.h (212992 => 212993)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/loader/WorkerThreadableLoader.h        2017-02-25 04:54:36 UTC (rev 212992)
+++ trunk/Source/WebCore/loader/WorkerThreadableLoader.h        2017-02-25 05:48:51 UTC (rev 212993)
</span><span class="lines">@@ -101,7 +101,7 @@
</span><span class="cx">             void didSendData(unsigned long long bytesSent, unsigned long long totalBytesToBeSent) override;
</span><span class="cx">             void didReceiveResponse(unsigned long identifier, const ResourceResponse&amp;) override;
</span><span class="cx">             void didReceiveData(const char*, int dataLength) override;
</span><del>-            void didFinishLoading(unsigned long identifier, double finishTime) override;
</del><ins>+            void didFinishLoading(unsigned long identifier) override;
</ins><span class="cx">             void didFail(const ResourceError&amp;) override;
</span><span class="cx"> 
</span><span class="cx"> #if ENABLE(WEB_TIMING)
</span></span></pre></div>
<a id="trunkSourceWebCoreloaderappcacheApplicationCacheGroupcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/loader/appcache/ApplicationCacheGroup.cpp (212992 => 212993)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/loader/appcache/ApplicationCacheGroup.cpp        2017-02-25 04:54:36 UTC (rev 212992)
+++ trunk/Source/WebCore/loader/appcache/ApplicationCacheGroup.cpp        2017-02-25 05:48:51 UTC (rev 212993)
</span><span class="lines">@@ -570,9 +570,9 @@
</span><span class="cx">     m_currentResource-&gt;data().append(data, length);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void ApplicationCacheGroup::didFinishLoading(ResourceHandle* handle, double finishTime)
</del><ins>+void ApplicationCacheGroup::didFinishLoading(ResourceHandle* handle)
</ins><span class="cx"> {
</span><del>-    InspectorInstrumentation::didFinishLoading(m_frame, m_frame-&gt;loader().documentLoader(), m_currentResourceIdentifier, finishTime);
</del><ins>+    InspectorInstrumentation::didFinishLoading(m_frame, m_frame-&gt;loader().documentLoader(), m_currentResourceIdentifier);
</ins><span class="cx"> 
</span><span class="cx">     if (handle == m_manifestHandle) {
</span><span class="cx">         didFinishLoadingManifest();
</span></span></pre></div>
<a id="trunkSourceWebCoreloaderappcacheApplicationCacheGrouph"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/loader/appcache/ApplicationCacheGroup.h (212992 => 212993)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/loader/appcache/ApplicationCacheGroup.h        2017-02-25 04:54:36 UTC (rev 212992)
+++ trunk/Source/WebCore/loader/appcache/ApplicationCacheGroup.h        2017-02-25 05:48:51 UTC (rev 212993)
</span><span class="lines">@@ -108,9 +108,10 @@
</span><span class="cx">     // the existing client callback cannot be used, so assume that any client that enables application cache also wants it to use credential storage.
</span><span class="cx">     bool shouldUseCredentialStorage(ResourceHandle*) override { return true; }
</span><span class="cx"> 
</span><ins>+    // ResourceHandleClient
</ins><span class="cx">     void didReceiveResponse(ResourceHandle*, ResourceResponse&amp;&amp;) override;
</span><span class="cx">     void didReceiveData(ResourceHandle*, const char*, unsigned length, int encodedDataLength) override;
</span><del>-    void didFinishLoading(ResourceHandle*, double finishTime) override;
</del><ins>+    void didFinishLoading(ResourceHandle*) override;
</ins><span class="cx">     void didFail(ResourceHandle*, const ResourceError&amp;) override;
</span><span class="cx"> 
</span><span class="cx">     void didReceiveManifestResponse(const ResourceResponse&amp;);
</span></span></pre></div>
<a id="trunkSourceWebCoreloadercacheCachedResourceh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/loader/cache/CachedResource.h (212992 => 212993)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/loader/cache/CachedResource.h        2017-02-25 04:54:36 UTC (rev 212992)
+++ trunk/Source/WebCore/loader/cache/CachedResource.h        2017-02-25 05:48:51 UTC (rev 212993)
</span><span class="lines">@@ -260,9 +260,6 @@
</span><span class="cx"> 
</span><span class="cx">     virtual void didRetrieveDerivedDataFromCache(const String&amp; /* type */, SharedBuffer&amp;) { }
</span><span class="cx"> 
</span><del>-    void setLoadFinishTime(double finishTime) { m_loadFinishTime = finishTime; }
-    double loadFinishTime() const { return m_loadFinishTime; }
-
</del><span class="cx"> #if USE(FOUNDATION) || USE(SOUP)
</span><span class="cx">     WEBCORE_EXPORT void tryReplaceEncodedData(SharedBuffer&amp;);
</span><span class="cx"> #endif
</span><span class="lines">@@ -323,7 +320,6 @@
</span><span class="cx">     AtomicString m_initiatorName;
</span><span class="cx"> 
</span><span class="cx">     double m_lastDecodedAccessTime { 0 }; // Used as a &quot;thrash guard&quot; in the cache
</span><del>-    double m_loadFinishTime { 0 };
</del><span class="cx"> 
</span><span class="cx">     unsigned m_encodedSize { 0 };
</span><span class="cx">     unsigned m_decodedSize { 0 };
</span></span></pre></div>
<a id="trunkSourceWebCoreloaderiosQuickLookmm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/loader/ios/QuickLook.mm (212992 => 212993)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/loader/ios/QuickLook.mm        2017-02-25 04:54:36 UTC (rev 212992)
+++ trunk/Source/WebCore/loader/ios/QuickLook.mm        2017-02-25 05:48:51 UTC (rev 212993)
</span><span class="lines">@@ -40,6 +40,7 @@
</span><span class="cx"> #import &quot;ResourceLoader.h&quot;
</span><span class="cx"> #import &quot;ResourceRequest.h&quot;
</span><span class="cx"> #import &quot;SharedBuffer.h&quot;
</span><ins>+#import &lt;WebCore/NetworkLoadMetrics.h&gt;
</ins><span class="cx"> #import &lt;wtf/NeverDestroyed.h&gt;
</span><span class="cx"> #import &lt;wtf/Vector.h&gt;
</span><span class="cx"> #import &lt;wtf/text/WTFString.h&gt;
</span><span class="lines">@@ -230,7 +231,9 @@
</span><span class="cx"> {
</span><span class="cx">     ASSERT_UNUSED(connection, !connection);
</span><span class="cx">     ASSERT(_hasSentDidReceiveResponse);
</span><del>-    _resourceLoader-&gt;didFinishLoading(0);
</del><ins>+
+    NetworkLoadMetrics emptyMetrics;
+    _resourceLoader-&gt;didFinishLoading(emptyMetrics);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> static inline bool isQuickLookPasswordError(NSError *error)
</span></span></pre></div>
<a id="trunkSourceWebCorepageEventSourcecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/page/EventSource.cpp (212992 => 212993)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/page/EventSource.cpp        2017-02-25 04:54:36 UTC (rev 212992)
+++ trunk/Source/WebCore/page/EventSource.cpp        2017-02-25 05:48:51 UTC (rev 212993)
</span><span class="lines">@@ -213,7 +213,7 @@
</span><span class="cx">     parseEventStream();
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void EventSource::didFinishLoading(unsigned long, double)
</del><ins>+void EventSource::didFinishLoading(unsigned long)
</ins><span class="cx"> {
</span><span class="cx">     ASSERT(m_state == OPEN);
</span><span class="cx">     ASSERT(m_requestInFlight);
</span></span></pre></div>
<a id="trunkSourceWebCorepageEventSourceh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/page/EventSource.h (212992 => 212993)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/page/EventSource.h        2017-02-25 04:54:36 UTC (rev 212992)
+++ trunk/Source/WebCore/page/EventSource.h        2017-02-25 05:48:51 UTC (rev 212993)
</span><span class="lines">@@ -81,7 +81,7 @@
</span><span class="cx">     // ThreadableLoaderClient
</span><span class="cx">     void didReceiveResponse(unsigned long, const ResourceResponse&amp;) final;
</span><span class="cx">     void didReceiveData(const char*, int) final;
</span><del>-    void didFinishLoading(unsigned long, double) final;
</del><ins>+    void didFinishLoading(unsigned long) final;
</ins><span class="cx">     void didFail(const ResourceError&amp;) final;
</span><span class="cx"> 
</span><span class="cx">     void stop() final;
</span></span></pre></div>
<a id="trunkSourceWebCorepagePerformanceResourceTimingcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/page/PerformanceResourceTiming.cpp (212992 => 212993)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/page/PerformanceResourceTiming.cpp        2017-02-25 04:54:36 UTC (rev 212992)
+++ trunk/Source/WebCore/page/PerformanceResourceTiming.cpp        2017-02-25 05:48:51 UTC (rev 212993)
</span><span class="lines">@@ -1,4 +1,5 @@
</span><span class="cx"> /*
</span><ins>+ * Copyright (C) 2017 Apple Inc. All rights reserved.
</ins><span class="cx">  * Copyright (C) 2012 Google Inc. All rights reserved.
</span><span class="cx">  * Copyright (C) 2012 Intel Inc. All rights reserved.
</span><span class="cx">  *
</span><span class="lines">@@ -53,6 +54,21 @@
</span><span class="cx">     return Performance::reduceTimeResolution(seconds).milliseconds();
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+static double entryStartTime(MonotonicTime timeOrigin, const ResourceTiming&amp; resourceTiming)
+{
+    return monotonicTimeToDOMHighResTimeStamp(timeOrigin, resourceTiming.loadTiming().startTime());
+}
+
+static double entryEndTime(MonotonicTime timeOrigin, const ResourceTiming&amp; resourceTiming)
+{
+    if (resourceTiming.networkLoadMetrics().isComplete()) {
+        Seconds endTime = (resourceTiming.loadTiming().fetchStart() + resourceTiming.networkLoadMetrics().responseEnd) - timeOrigin;
+        return Performance::reduceTimeResolution(endTime).milliseconds();
+    }
+
+    return monotonicTimeToDOMHighResTimeStamp(timeOrigin, resourceTiming.loadTiming().responseEnd());
+}
+
</ins><span class="cx"> Ref&lt;PerformanceResourceTiming&gt; PerformanceResourceTiming::create(MonotonicTime timeOrigin, ResourceTiming&amp;&amp; resourceTiming)
</span><span class="cx"> {
</span><span class="cx">     return adoptRef(*new PerformanceResourceTiming(timeOrigin, WTFMove(resourceTiming)));
</span><span class="lines">@@ -59,11 +75,11 @@
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> PerformanceResourceTiming::PerformanceResourceTiming(MonotonicTime timeOrigin, ResourceTiming&amp;&amp; resourceTiming)
</span><del>-    : PerformanceEntry(PerformanceEntry::Type::Resource, resourceTiming.url().string(), ASCIILiteral(&quot;resource&quot;), monotonicTimeToDOMHighResTimeStamp(timeOrigin, resourceTiming.loadTiming().startTime()), monotonicTimeToDOMHighResTimeStamp(timeOrigin, resourceTiming.loadTiming().responseEnd()))
</del><ins>+    : PerformanceEntry(PerformanceEntry::Type::Resource, resourceTiming.url().string(), ASCIILiteral(&quot;resource&quot;), entryStartTime(timeOrigin, resourceTiming), entryEndTime(timeOrigin, resourceTiming))
</ins><span class="cx">     , m_initiatorType(resourceTiming.initiator())
</span><span class="cx">     , m_timeOrigin(timeOrigin)
</span><span class="cx">     , m_loadTiming(resourceTiming.loadTiming())
</span><del>-    , m_networkLoadTiming(resourceTiming.networkLoadTiming())
</del><ins>+    , m_networkLoadMetrics(resourceTiming.networkLoadMetrics())
</ins><span class="cx">     , m_shouldReportDetails(resourceTiming.allowTimingDetails())
</span><span class="cx"> {
</span><span class="cx"> }
</span><span class="lines">@@ -72,6 +88,11 @@
</span><span class="cx"> {
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+String PerformanceResourceTiming::nextHopProtocol() const
+{
+    return m_networkLoadMetrics.protocol;
+}
+
</ins><span class="cx"> double PerformanceResourceTiming::workerStart() const
</span><span class="cx"> {
</span><span class="cx">     return 0.0;
</span><span class="lines">@@ -106,10 +127,10 @@
</span><span class="cx">     if (!m_shouldReportDetails)
</span><span class="cx">         return 0.0;
</span><span class="cx"> 
</span><del>-    if (m_networkLoadTiming.domainLookupStart &lt;= 0)
</del><ins>+    if (m_networkLoadMetrics.domainLookupStart &lt;= 0_ms)
</ins><span class="cx">         return fetchStart();
</span><span class="cx"> 
</span><del>-    return networkLoadTimeToDOMHighResTimeStamp(m_networkLoadTiming.domainLookupStart);
</del><ins>+    return networkLoadTimeToDOMHighResTimeStamp(m_networkLoadMetrics.domainLookupStart);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> double PerformanceResourceTiming::domainLookupEnd() const
</span><span class="lines">@@ -117,10 +138,10 @@
</span><span class="cx">     if (!m_shouldReportDetails)
</span><span class="cx">         return 0.0;
</span><span class="cx"> 
</span><del>-    if (m_networkLoadTiming.domainLookupEnd &lt;= 0)
</del><ins>+    if (m_networkLoadMetrics.domainLookupEnd &lt;= 0_ms)
</ins><span class="cx">         return domainLookupStart();
</span><span class="cx"> 
</span><del>-    return networkLoadTimeToDOMHighResTimeStamp(m_networkLoadTiming.domainLookupEnd);
</del><ins>+    return networkLoadTimeToDOMHighResTimeStamp(m_networkLoadMetrics.domainLookupEnd);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> double PerformanceResourceTiming::connectStart() const
</span><span class="lines">@@ -128,16 +149,10 @@
</span><span class="cx">     if (!m_shouldReportDetails)
</span><span class="cx">         return 0.0;
</span><span class="cx"> 
</span><del>-    // connectStart will be -1 when a network request is not made.
-    if (m_networkLoadTiming.connectStart &lt;= 0)
</del><ins>+    if (m_networkLoadMetrics.connectStart &lt;= 0_ms)
</ins><span class="cx">         return domainLookupEnd();
</span><span class="cx"> 
</span><del>-    // connectStart includes any DNS time, so we may need to trim that off.
-    double connectStart = m_networkLoadTiming.connectStart;
-    if (m_networkLoadTiming.domainLookupEnd &gt;= 0)
-        connectStart = m_networkLoadTiming.domainLookupEnd;
-
-    return networkLoadTimeToDOMHighResTimeStamp(connectStart);
</del><ins>+    return networkLoadTimeToDOMHighResTimeStamp(m_networkLoadMetrics.connectStart);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> double PerformanceResourceTiming::connectEnd() const
</span><span class="lines">@@ -145,11 +160,10 @@
</span><span class="cx">     if (!m_shouldReportDetails)
</span><span class="cx">         return 0.0;
</span><span class="cx"> 
</span><del>-    // connectStart will be -1 when a network request is not made.
-    if (m_networkLoadTiming.connectEnd &lt;= 0)
</del><ins>+    if (m_networkLoadMetrics.connectEnd &lt;= 0_ms)
</ins><span class="cx">         return connectStart();
</span><span class="cx"> 
</span><del>-    return networkLoadTimeToDOMHighResTimeStamp(m_networkLoadTiming.connectEnd);
</del><ins>+    return networkLoadTimeToDOMHighResTimeStamp(m_networkLoadMetrics.connectEnd);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> double PerformanceResourceTiming::secureConnectionStart() const
</span><span class="lines">@@ -157,10 +171,10 @@
</span><span class="cx">     if (!m_shouldReportDetails)
</span><span class="cx">         return 0.0;
</span><span class="cx"> 
</span><del>-    if (m_networkLoadTiming.secureConnectionStart &lt; 0) // Secure connection not negotiated.
</del><ins>+    if (m_networkLoadMetrics.secureConnectionStart &lt;= 0_ms)
</ins><span class="cx">         return 0.0;
</span><span class="cx"> 
</span><del>-    return networkLoadTimeToDOMHighResTimeStamp(m_networkLoadTiming.secureConnectionStart);
</del><ins>+    return networkLoadTimeToDOMHighResTimeStamp(m_networkLoadMetrics.secureConnectionStart);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> double PerformanceResourceTiming::requestStart() const
</span><span class="lines">@@ -169,10 +183,10 @@
</span><span class="cx">         return 0.0;
</span><span class="cx"> 
</span><span class="cx">     // requestStart is 0 when a network request is not made.
</span><del>-    if (m_networkLoadTiming.requestStart &lt;= 0)
</del><ins>+    if (m_networkLoadMetrics.requestStart &lt;= 0_ms)
</ins><span class="cx">         return connectEnd();
</span><span class="cx"> 
</span><del>-    return networkLoadTimeToDOMHighResTimeStamp(m_networkLoadTiming.requestStart);
</del><ins>+    return networkLoadTimeToDOMHighResTimeStamp(m_networkLoadMetrics.requestStart);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> double PerformanceResourceTiming::responseStart() const
</span><span class="lines">@@ -181,26 +195,43 @@
</span><span class="cx">         return 0.0;
</span><span class="cx"> 
</span><span class="cx">     // responseStart is 0 when a network request is not made.
</span><del>-    if (m_networkLoadTiming.responseStart &lt;= 0)
</del><ins>+    if (m_networkLoadMetrics.responseStart &lt;= 0_ms)
</ins><span class="cx">         return requestStart();
</span><span class="cx"> 
</span><del>-    return networkLoadTimeToDOMHighResTimeStamp(m_networkLoadTiming.responseStart);
</del><ins>+    return networkLoadTimeToDOMHighResTimeStamp(m_networkLoadMetrics.responseStart);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> double PerformanceResourceTiming::responseEnd() const
</span><span class="cx"> {
</span><span class="cx">     // responseEnd is a required property.
</span><del>-    ASSERT(m_loadTiming.responseEnd());
</del><ins>+    ASSERT(m_networkLoadMetrics.isComplete() || m_loadTiming.responseEnd());
</ins><span class="cx"> 
</span><ins>+    if (m_networkLoadMetrics.isComplete()) {
+        // responseEnd is 0 when a network request is not made.
+        // This should mean all other properties are empty.
+        if (m_networkLoadMetrics.responseEnd &lt;= 0_ms) {
+            ASSERT(m_networkLoadMetrics.responseStart &lt;= 0_ms);
+            ASSERT(m_networkLoadMetrics.requestStart &lt;= 0_ms);
+            ASSERT(m_networkLoadMetrics.requestStart &lt;= 0_ms);
+            ASSERT(m_networkLoadMetrics.secureConnectionStart &lt;= 0_ms);
+            ASSERT(m_networkLoadMetrics.connectEnd &lt;= 0_ms);
+            ASSERT(m_networkLoadMetrics.connectStart &lt;= 0_ms);
+            ASSERT(m_networkLoadMetrics.domainLookupEnd &lt;= 0_ms);
+            ASSERT(m_networkLoadMetrics.domainLookupStart &lt;= 0_ms);
+            return fetchStart();
+        }
+
+        return networkLoadTimeToDOMHighResTimeStamp(m_networkLoadMetrics.responseEnd);
+    }
+
</ins><span class="cx">     return monotonicTimeToDOMHighResTimeStamp(m_timeOrigin, m_loadTiming.responseEnd());
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-double PerformanceResourceTiming::networkLoadTimeToDOMHighResTimeStamp(double deltaMilliseconds) const
</del><ins>+double PerformanceResourceTiming::networkLoadTimeToDOMHighResTimeStamp(Seconds delta) const
</ins><span class="cx"> {
</span><del>-    ASSERT(deltaMilliseconds);
-    MonotonicTime combined = m_loadTiming.fetchStart() + Seconds::fromMilliseconds(deltaMilliseconds);
-    Seconds delta = combined - m_timeOrigin;
-    return Performance::reduceTimeResolution(delta).milliseconds();
</del><ins>+    ASSERT(delta);
+    Seconds final = (m_loadTiming.fetchStart() + delta) - m_timeOrigin;
+    return Performance::reduceTimeResolution(final).milliseconds();
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> } // namespace WebCore
</span></span></pre></div>
<a id="trunkSourceWebCorepagePerformanceResourceTimingh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/page/PerformanceResourceTiming.h (212992 => 212993)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/page/PerformanceResourceTiming.h        2017-02-25 04:54:36 UTC (rev 212992)
+++ trunk/Source/WebCore/page/PerformanceResourceTiming.h        2017-02-25 05:48:51 UTC (rev 212993)
</span><span class="lines">@@ -34,7 +34,7 @@
</span><span class="cx"> #if ENABLE(WEB_TIMING)
</span><span class="cx"> 
</span><span class="cx"> #include &quot;LoadTiming.h&quot;
</span><del>-#include &quot;NetworkLoadTiming.h&quot;
</del><ins>+#include &quot;NetworkLoadMetrics.h&quot;
</ins><span class="cx"> #include &quot;PerformanceEntry.h&quot;
</span><span class="cx"> #include &lt;wtf/RefPtr.h&gt;
</span><span class="cx"> #include &lt;wtf/text/WTFString.h&gt;
</span><span class="lines">@@ -48,6 +48,7 @@
</span><span class="cx">     static Ref&lt;PerformanceResourceTiming&gt; create(MonotonicTime timeOrigin, ResourceTiming&amp;&amp;);
</span><span class="cx"> 
</span><span class="cx">     AtomicString initiatorType() const { return m_initiatorType; }
</span><ins>+    String nextHopProtocol() const;
</ins><span class="cx"> 
</span><span class="cx">     double workerStart() const;
</span><span class="cx">     double redirectStart() const;
</span><span class="lines">@@ -66,12 +67,12 @@
</span><span class="cx">     PerformanceResourceTiming(MonotonicTime timeOrigin, ResourceTiming&amp;&amp;);
</span><span class="cx">     ~PerformanceResourceTiming();
</span><span class="cx"> 
</span><del>-    double networkLoadTimeToDOMHighResTimeStamp(double deltaMilliseconds) const;
</del><ins>+    double networkLoadTimeToDOMHighResTimeStamp(Seconds) const;
</ins><span class="cx"> 
</span><span class="cx">     AtomicString m_initiatorType;
</span><span class="cx">     MonotonicTime m_timeOrigin;
</span><span class="cx">     LoadTiming m_loadTiming;
</span><del>-    NetworkLoadTiming m_networkLoadTiming;
</del><ins>+    NetworkLoadMetrics m_networkLoadMetrics;
</ins><span class="cx">     bool m_shouldReportDetails;
</span><span class="cx"> };
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCorepagePerformanceResourceTimingidl"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/page/PerformanceResourceTiming.idl (212992 => 212993)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/page/PerformanceResourceTiming.idl        2017-02-25 04:54:36 UTC (rev 212992)
+++ trunk/Source/WebCore/page/PerformanceResourceTiming.idl        2017-02-25 05:48:51 UTC (rev 212993)
</span><span class="lines">@@ -38,6 +38,7 @@
</span><span class="cx">     Exposed=(Window,Worker),
</span><span class="cx"> ] interface PerformanceResourceTiming : PerformanceEntry {
</span><span class="cx">     readonly attribute DOMString initiatorType;
</span><ins>+    readonly attribute DOMString nextHopProtocol;
</ins><span class="cx"> 
</span><span class="cx">     readonly attribute DOMHighResTimeStamp workerStart;
</span><span class="cx">     readonly attribute DOMHighResTimeStamp redirectStart;
</span></span></pre></div>
<a id="trunkSourceWebCorepagePerformanceTimingcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/page/PerformanceTiming.cpp (212992 => 212993)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/page/PerformanceTiming.cpp        2017-02-25 04:54:36 UTC (rev 212992)
+++ trunk/Source/WebCore/page/PerformanceTiming.cpp        2017-02-25 05:48:51 UTC (rev 212993)
</span><span class="lines">@@ -39,7 +39,7 @@
</span><span class="cx"> #include &quot;Frame.h&quot;
</span><span class="cx"> #include &quot;FrameLoader.h&quot;
</span><span class="cx"> #include &quot;LoadTiming.h&quot;
</span><del>-#include &quot;NetworkLoadTiming.h&quot;
</del><ins>+#include &quot;NetworkLoadMetrics.h&quot;
</ins><span class="cx"> #include &quot;Performance.h&quot;
</span><span class="cx"> #include &quot;ResourceResponse.h&quot;
</span><span class="cx"> #include &lt;wtf/CurrentTime.h&gt;
</span><span class="lines">@@ -123,11 +123,11 @@
</span><span class="cx">     if (!loader)
</span><span class="cx">         return fetchStart();
</span><span class="cx">     
</span><del>-    const NetworkLoadTiming&amp; timing = loader-&gt;response().networkLoadTiming();
</del><ins>+    const NetworkLoadMetrics&amp; timing = loader-&gt;response().deprecatedNetworkLoadMetrics();
</ins><span class="cx">     
</span><span class="cx">     // This will be -1 when a DNS request is not performed.
</span><span class="cx">     // Rather than exposing a special value that indicates no DNS, we &quot;backfill&quot; with fetchStart.
</span><del>-    if (timing.domainLookupStart &lt; 0)
</del><ins>+    if (timing.domainLookupStart &lt; 0_ms)
</ins><span class="cx">         return fetchStart();
</span><span class="cx"> 
</span><span class="cx">     return resourceLoadTimeRelativeToFetchStart(timing.domainLookupStart);
</span><span class="lines">@@ -139,11 +139,11 @@
</span><span class="cx">     if (!loader)
</span><span class="cx">         return domainLookupStart();
</span><span class="cx">     
</span><del>-    const NetworkLoadTiming&amp; timing = loader-&gt;response().networkLoadTiming();
</del><ins>+    const NetworkLoadMetrics&amp; timing = loader-&gt;response().deprecatedNetworkLoadMetrics();
</ins><span class="cx">     
</span><span class="cx">     // This will be -1 when a DNS request is not performed.
</span><span class="cx">     // Rather than exposing a special value that indicates no DNS, we &quot;backfill&quot; with domainLookupStart.
</span><del>-    if (timing.domainLookupEnd &lt; 0)
</del><ins>+    if (timing.domainLookupEnd &lt; 0_ms)
</ins><span class="cx">         return domainLookupStart();
</span><span class="cx"> 
</span><span class="cx">     return resourceLoadTimeRelativeToFetchStart(timing.domainLookupEnd);
</span><span class="lines">@@ -155,17 +155,17 @@
</span><span class="cx">     if (!loader)
</span><span class="cx">         return domainLookupEnd();
</span><span class="cx"> 
</span><del>-    const NetworkLoadTiming&amp; timing = loader-&gt;response().networkLoadTiming();
</del><ins>+    const NetworkLoadMetrics&amp; timing = loader-&gt;response().deprecatedNetworkLoadMetrics();
</ins><span class="cx">     
</span><span class="cx">     // connectStart will be -1 when a network request is not made.
</span><span class="cx">     // Rather than exposing a special value that indicates no new connection, we &quot;backfill&quot; with domainLookupEnd.
</span><del>-    double connectStart = timing.connectStart;
-    if (connectStart &lt; 0)
</del><ins>+    Seconds connectStart = timing.connectStart;
+    if (connectStart &lt; 0_ms)
</ins><span class="cx">         return domainLookupEnd();
</span><span class="cx"> 
</span><del>-    // NetworkLoadTiming's connect phase includes DNS, however Navigation Timing's
</del><ins>+    // NetworkLoadMetrics's connect phase includes DNS, however Navigation Timing's
</ins><span class="cx">     // connect phase should not. So if there is DNS time, trim it from the start.
</span><del>-    if (timing.domainLookupEnd &gt;= 0 &amp;&amp; timing.domainLookupEnd &gt; connectStart)
</del><ins>+    if (timing.domainLookupEnd &gt;= 0_ms &amp;&amp; timing.domainLookupEnd &gt; connectStart)
</ins><span class="cx">         connectStart = timing.domainLookupEnd;
</span><span class="cx"> 
</span><span class="cx">     return resourceLoadTimeRelativeToFetchStart(connectStart);
</span><span class="lines">@@ -177,11 +177,11 @@
</span><span class="cx">     if (!loader)
</span><span class="cx">         return connectStart();
</span><span class="cx"> 
</span><del>-    const NetworkLoadTiming&amp; timing = loader-&gt;response().networkLoadTiming();
</del><ins>+    const NetworkLoadMetrics&amp; timing = loader-&gt;response().deprecatedNetworkLoadMetrics();
</ins><span class="cx">     
</span><span class="cx">     // connectEnd will be -1 when a network request is not made.
</span><span class="cx">     // Rather than exposing a special value that indicates no new connection, we &quot;backfill&quot; with connectStart.
</span><del>-    if (timing.connectEnd &lt; 0)
</del><ins>+    if (timing.connectEnd &lt; 0_ms)
</ins><span class="cx">         return connectStart();
</span><span class="cx"> 
</span><span class="cx">     return resourceLoadTimeRelativeToFetchStart(timing.connectEnd);
</span><span class="lines">@@ -193,9 +193,9 @@
</span><span class="cx">     if (!loader)
</span><span class="cx">         return 0;
</span><span class="cx"> 
</span><del>-    const NetworkLoadTiming&amp; timing = loader-&gt;response().networkLoadTiming();
</del><ins>+    const NetworkLoadMetrics&amp; timing = loader-&gt;response().deprecatedNetworkLoadMetrics();
</ins><span class="cx">     
</span><del>-    if (timing.secureConnectionStart &lt; 0)
</del><ins>+    if (timing.secureConnectionStart &lt; 0_ms)
</ins><span class="cx">         return 0;
</span><span class="cx"> 
</span><span class="cx">     return resourceLoadTimeRelativeToFetchStart(timing.secureConnectionStart);
</span><span class="lines">@@ -207,9 +207,9 @@
</span><span class="cx">     if (!loader)
</span><span class="cx">         return connectEnd();
</span><span class="cx">     
</span><del>-    const NetworkLoadTiming&amp; timing = loader-&gt;response().networkLoadTiming();
</del><ins>+    const NetworkLoadMetrics&amp; timing = loader-&gt;response().deprecatedNetworkLoadMetrics();
</ins><span class="cx">     
</span><del>-    ASSERT(timing.requestStart &gt;= 0);
</del><ins>+    ASSERT(timing.requestStart &gt;= 0_ms);
</ins><span class="cx">     return resourceLoadTimeRelativeToFetchStart(timing.requestStart);
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -219,9 +219,9 @@
</span><span class="cx">     if (!loader)
</span><span class="cx">         return requestStart();
</span><span class="cx"> 
</span><del>-    const NetworkLoadTiming&amp; timing = loader-&gt;response().networkLoadTiming();
</del><ins>+    const NetworkLoadMetrics&amp; timing = loader-&gt;response().deprecatedNetworkLoadMetrics();
</ins><span class="cx">     
</span><del>-    ASSERT(timing.responseStart &gt;= 0);
</del><ins>+    ASSERT(timing.responseStart &gt;= 0_ms);
</ins><span class="cx">     return resourceLoadTimeRelativeToFetchStart(timing.responseStart);
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -326,9 +326,9 @@
</span><span class="cx">     return &amp;loader-&gt;timing();
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-unsigned long long PerformanceTiming::resourceLoadTimeRelativeToFetchStart(double relativeMilliseconds) const
</del><ins>+unsigned long long PerformanceTiming::resourceLoadTimeRelativeToFetchStart(Seconds delta) const
</ins><span class="cx"> {
</span><del>-    ASSERT(relativeMilliseconds &gt;= 0);
</del><ins>+    ASSERT(delta &gt;= 0_ms);
</ins><span class="cx"> 
</span><span class="cx">     LoadTiming* timing = loadTiming();
</span><span class="cx">     if (!timing)
</span><span class="lines">@@ -335,7 +335,7 @@
</span><span class="cx">         return 0;
</span><span class="cx"> 
</span><span class="cx">     WallTime fetchStart = timing-&gt;monotonicTimeToPseudoWallTime(timing-&gt;fetchStart());
</span><del>-    WallTime combined = fetchStart + Seconds::fromMilliseconds(relativeMilliseconds);
</del><ins>+    WallTime combined = fetchStart + delta;
</ins><span class="cx">     Seconds reduced = Performance::reduceTimeResolution(combined.secondsSinceEpoch());
</span><span class="cx">     return static_cast&lt;unsigned long long&gt;(reduced.milliseconds());
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceWebCorepagePerformanceTimingh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/page/PerformanceTiming.h (212992 => 212993)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/page/PerformanceTiming.h        2017-02-25 04:54:36 UTC (rev 212992)
+++ trunk/Source/WebCore/page/PerformanceTiming.h        2017-02-25 05:48:51 UTC (rev 212993)
</span><span class="lines">@@ -76,7 +76,7 @@
</span><span class="cx">     const DocumentTiming* documentTiming() const;
</span><span class="cx">     DocumentLoader* documentLoader() const;
</span><span class="cx">     LoadTiming* loadTiming() const;
</span><del>-    unsigned long long resourceLoadTimeRelativeToFetchStart(double) const;
</del><ins>+    unsigned long long resourceLoadTimeRelativeToFetchStart(Seconds) const;
</ins><span class="cx">     unsigned long long monotonicTimeToIntegerMilliseconds(MonotonicTime) const;
</span><span class="cx"> };
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformgraphicsgstreamerWebKitWebSourceGStreamercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/graphics/gstreamer/WebKitWebSourceGStreamer.cpp (212992 => 212993)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/gstreamer/WebKitWebSourceGStreamer.cpp        2017-02-25 04:54:36 UTC (rev 212992)
+++ trunk/Source/WebCore/platform/graphics/gstreamer/WebKitWebSourceGStreamer.cpp        2017-02-25 05:48:51 UTC (rev 212993)
</span><span class="lines">@@ -103,7 +103,7 @@
</span><span class="cx">         void didReceiveResponse(ResourceHandle*, ResourceResponse&amp;&amp;) override;
</span><span class="cx">         void didReceiveData(ResourceHandle*, const char*, unsigned, int) override;
</span><span class="cx">         void didReceiveBuffer(ResourceHandle*, Ref&lt;SharedBuffer&gt;&amp;&amp;, int encodedLength) override;
</span><del>-        void didFinishLoading(ResourceHandle*, double /*finishTime*/) override;
</del><ins>+        void didFinishLoading(ResourceHandle*) override;
</ins><span class="cx">         void didFail(ResourceHandle*, const ResourceError&amp;) override;
</span><span class="cx">         void wasBlocked(ResourceHandle*) override;
</span><span class="cx">         void cannotShowURL(ResourceHandle*) override;
</span><span class="lines">@@ -1172,7 +1172,7 @@
</span><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void ResourceHandleStreamingClient::didFinishLoading(ResourceHandle*, double)
</del><ins>+void ResourceHandleStreamingClient::didFinishLoading(ResourceHandle*)
</ins><span class="cx"> {
</span><span class="cx">     handleNotifyFinished();
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformnetworkBlobResourceHandlecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/network/BlobResourceHandle.cpp (212992 => 212993)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/network/BlobResourceHandle.cpp        2017-02-25 04:54:36 UTC (rev 212992)
+++ trunk/Source/WebCore/platform/network/BlobResourceHandle.cpp        2017-02-25 05:48:51 UTC (rev 212993)
</span><span class="lines">@@ -621,7 +621,7 @@
</span><span class="cx">     if (!handle.client())
</span><span class="cx">         return;
</span><span class="cx"> 
</span><del>-    handle.client()-&gt;didFinishLoading(&amp;handle, 0);
</del><ins>+    handle.client()-&gt;didFinishLoading(&amp;handle);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void BlobResourceHandle::notifyFinish()
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformnetworkNetworkLoadMetricshfromrev212992trunkSourceWebCoreplatformnetworkNetworkLoadTimingh"></a>
<div class="copfile"><h4>Copied: trunk/Source/WebCore/platform/network/NetworkLoadMetrics.h (from rev 212992, trunk/Source/WebCore/platform/network/NetworkLoadTiming.h) (0 => 212993)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/network/NetworkLoadMetrics.h                                (rev 0)
+++ trunk/Source/WebCore/platform/network/NetworkLoadMetrics.h        2017-02-25 05:48:51 UTC (rev 212993)
</span><span class="lines">@@ -0,0 +1,158 @@
</span><ins>+/*
+ * Copyright (C) 2010 Google, Inc. All Rights Reserved.
+ * Copyright (C) 2014-2017 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.
+ */
+
+#pragma once
+
+#include &lt;wtf/Seconds.h&gt;
+#include &lt;wtf/text/WTFString.h&gt;
+
+#if PLATFORM(COCOA)
+OBJC_CLASS NSDictionary;
+#endif
+
+namespace WebCore {
+
+class NetworkLoadMetrics {
+public:
+    NetworkLoadMetrics()
+    {
+        reset();
+    }
+
+    NetworkLoadMetrics isolatedCopy() const
+    {
+        NetworkLoadMetrics copy;
+
+        copy.domainLookupStart = domainLookupStart;
+        copy.domainLookupEnd = domainLookupEnd;
+        copy.connectStart = connectStart;
+        copy.secureConnectionStart = secureConnectionStart;
+        copy.connectEnd = connectEnd;
+        copy.requestStart = requestStart;
+        copy.responseStart = responseStart;
+        copy.responseEnd = responseEnd;
+        copy.complete = complete;
+        copy.protocol = protocol.isolatedCopy();
+
+        return copy;
+    }
+
+    void reset()
+    {
+        domainLookupStart = Seconds(-1);
+        domainLookupEnd = Seconds(-1);
+        connectStart = Seconds(-1);
+        secureConnectionStart = Seconds(-1);
+        connectEnd = Seconds(-1);
+        requestStart = Seconds(0);
+        responseStart = Seconds(0);
+        responseEnd = Seconds(0);
+        protocol = String();
+        complete = false;
+    }
+
+    bool operator==(const NetworkLoadMetrics&amp; other) const
+    {
+        return domainLookupStart == other.domainLookupStart
+            &amp;&amp; domainLookupEnd == other.domainLookupEnd
+            &amp;&amp; connectStart == other.connectStart
+            &amp;&amp; secureConnectionStart == other.secureConnectionStart
+            &amp;&amp; connectEnd == other.connectEnd
+            &amp;&amp; requestStart == other.requestStart
+            &amp;&amp; responseStart == other.responseStart
+            &amp;&amp; responseEnd == other.responseEnd
+            &amp;&amp; complete == other.complete
+            &amp;&amp; protocol == other.protocol;
+    }
+
+    bool operator!=(const NetworkLoadMetrics&amp; other) const
+    {
+        return !(*this == other);
+    }
+
+    bool isComplete() const { return complete; }
+    void markComplete() { complete = true; }
+
+    template&lt;class Encoder&gt; void encode(Encoder&amp;) const;
+    template&lt;class Decoder&gt; static bool decode(Decoder&amp;, NetworkLoadMetrics&amp;);
+
+    // These should be treated as deltas to LoadTiming's fetchStart.
+    // They should be in ascending order as listed here.
+    Seconds domainLookupStart;     // -1 if no DNS.
+    Seconds domainLookupEnd;       // -1 if no DNS.
+    Seconds connectStart;          // -1 if reused connection.
+    Seconds secureConnectionStart; // -1 if no secure connection.
+    Seconds connectEnd;            // -1 if reused connection.
+    Seconds requestStart;
+    Seconds responseStart;
+    Seconds responseEnd;
+
+    // Whether or not all of the properties (0 or otherwise) have been set.
+    bool complete { false };
+
+    // ALPN Protocol ID: https://w3c.github.io/resource-timing/#bib-RFC7301
+    String protocol;
+};
+
+#if PLATFORM(COCOA)
+WEBCORE_EXPORT void copyTimingData(NSDictionary *timingData, NetworkLoadMetrics&amp;);
+#endif
+
+#if PLATFORM(COCOA) &amp;&amp; !HAVE(TIMINGDATAOPTIONS)
+WEBCORE_EXPORT void setCollectsTimingData();
+#endif
+
+template&lt;class Encoder&gt;
+void NetworkLoadMetrics::encode(Encoder&amp; encoder) const
+{
+    encoder &lt;&lt; domainLookupStart;
+    encoder &lt;&lt; domainLookupEnd;
+    encoder &lt;&lt; connectStart;
+    encoder &lt;&lt; secureConnectionStart;
+    encoder &lt;&lt; connectEnd;
+    encoder &lt;&lt; requestStart;
+    encoder &lt;&lt; responseStart;
+    encoder &lt;&lt; responseEnd;
+    encoder &lt;&lt; complete;
+    encoder &lt;&lt; protocol;
+}
+
+template&lt;class Decoder&gt;
+bool NetworkLoadMetrics::decode(Decoder&amp; decoder, NetworkLoadMetrics&amp; timing)
+{
+    return decoder.decode(timing.domainLookupStart)
+        &amp;&amp; decoder.decode(timing.domainLookupEnd)
+        &amp;&amp; decoder.decode(timing.connectStart)
+        &amp;&amp; decoder.decode(timing.secureConnectionStart)
+        &amp;&amp; decoder.decode(timing.connectEnd)
+        &amp;&amp; decoder.decode(timing.requestStart)
+        &amp;&amp; decoder.decode(timing.responseStart)
+        &amp;&amp; decoder.decode(timing.responseEnd)
+        &amp;&amp; decoder.decode(timing.complete)
+        &amp;&amp; decoder.decode(timing.protocol);
+}
+
+}
</ins></span></pre></div>
<a id="trunkSourceWebCoreplatformnetworkNetworkLoadTimingh"></a>
<div class="delfile"><h4>Deleted: trunk/Source/WebCore/platform/network/NetworkLoadTiming.h (212992 => 212993)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/network/NetworkLoadTiming.h        2017-02-25 04:54:36 UTC (rev 212992)
+++ trunk/Source/WebCore/platform/network/NetworkLoadTiming.h        2017-02-25 05:48:51 UTC (rev 212993)
</span><span class="lines">@@ -1,138 +0,0 @@
</span><del>-/*
- * Copyright (C) 2010 Google, Inc. All Rights Reserved.
- * Copyright (C) 2014 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.
- */
-
-#pragma once
-
-#if PLATFORM(COCOA)
-OBJC_CLASS NSDictionary;
-#endif
-
-namespace WebCore {
-    
-class NetworkLoadTiming {
-public:
-    NetworkLoadTiming()
-        : domainLookupStart(-1)
-        , domainLookupEnd(-1)
-        , connectStart(-1)
-        , connectEnd(-1)
-        , requestStart(0)
-        , responseStart(0)
-        , secureConnectionStart(-1)
-    {
-    }
-
-    NetworkLoadTiming(const NetworkLoadTiming&amp; other)
-        : domainLookupStart(other.domainLookupStart)
-        , domainLookupEnd(other.domainLookupEnd)
-        , connectStart(other.connectStart)
-        , connectEnd(other.connectEnd)
-        , requestStart(other.requestStart)
-        , responseStart(other.responseStart)
-        , secureConnectionStart(other.secureConnectionStart)
-    {
-    }
-
-    NetworkLoadTiming&amp; operator=(const NetworkLoadTiming&amp; other)
-    {
-        domainLookupStart = other.domainLookupStart;
-        domainLookupEnd = other.domainLookupEnd;
-        connectStart = other.connectStart;
-        connectEnd = other.connectEnd;
-        requestStart = other.requestStart;
-        responseStart = other.responseStart;
-        secureConnectionStart = other.secureConnectionStart;
-        return *this;
-    }
-
-    NetworkLoadTiming isolatedCopy() const
-    {
-        // There are currently no members that need isolated copies, so we can use the copy constructor.
-        return *this;
-    }
-    
-    bool operator==(const NetworkLoadTiming&amp; other) const
-    {
-        return domainLookupStart == other.domainLookupStart
-            &amp;&amp; domainLookupEnd == other.domainLookupEnd
-            &amp;&amp; connectStart == other.connectStart
-            &amp;&amp; connectEnd == other.connectEnd
-            &amp;&amp; requestStart == other.requestStart
-            &amp;&amp; responseStart == other.responseStart
-            &amp;&amp; secureConnectionStart == other.secureConnectionStart;
-    }
-
-    bool operator!=(const NetworkLoadTiming&amp; other) const
-    {
-        return !(*this == other);
-    }
-
-    template&lt;class Encoder&gt; void encode(Encoder&amp;) const;
-    template&lt;class Decoder&gt; static bool decode(Decoder&amp;, NetworkLoadTiming&amp;);
-
-    // These are millisecond deltas from the start time.
-    double domainLookupStart;
-    double domainLookupEnd;
-    double connectStart;
-    double connectEnd;
-    double requestStart;
-    double responseStart;
-    double secureConnectionStart;
-};
-
-#if PLATFORM(COCOA)
-WEBCORE_EXPORT void copyTimingData(NSDictionary *timingData, NetworkLoadTiming&amp;);
-#endif
-
-#if PLATFORM(COCOA) &amp;&amp; !HAVE(TIMINGDATAOPTIONS)
-WEBCORE_EXPORT void setCollectsTimingData();
-#endif
-    
-template&lt;class Encoder&gt;
-void NetworkLoadTiming::encode(Encoder&amp; encoder) const
-{
-    encoder &lt;&lt; domainLookupStart;
-    encoder &lt;&lt; domainLookupEnd;
-    encoder &lt;&lt; connectStart;
-    encoder &lt;&lt; connectEnd;
-    encoder &lt;&lt; requestStart;
-    encoder &lt;&lt; responseStart;
-    encoder &lt;&lt; secureConnectionStart;
-}
-
-template&lt;class Decoder&gt;
-bool NetworkLoadTiming::decode(Decoder&amp; decoder, NetworkLoadTiming&amp; timing)
-{
-    return decoder.decode(timing.domainLookupStart)
-        &amp;&amp; decoder.decode(timing.domainLookupEnd)
-        &amp;&amp; decoder.decode(timing.connectStart)
-        &amp;&amp; decoder.decode(timing.connectEnd)
-        &amp;&amp; decoder.decode(timing.requestStart)
-        &amp;&amp; decoder.decode(timing.responseStart)
-        &amp;&amp; decoder.decode(timing.secureConnectionStart);
-}
-
-}
</del></span></pre></div>
<a id="trunkSourceWebCoreplatformnetworkPingHandleh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/network/PingHandle.h (212992 => 212993)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/network/PingHandle.h        2017-02-25 04:54:36 UTC (rev 212992)
+++ trunk/Source/WebCore/platform/network/PingHandle.h        2017-02-25 05:48:51 UTC (rev 212993)
</span><span class="lines">@@ -71,7 +71,7 @@
</span><span class="cx">     }
</span><span class="cx">     void didReceiveResponse(ResourceHandle*, ResourceResponse&amp;&amp;) final { delete this; }
</span><span class="cx">     void didReceiveBuffer(ResourceHandle*, Ref&lt;SharedBuffer&gt;&amp;&amp;, int) final { delete this; };
</span><del>-    void didFinishLoading(ResourceHandle*, double) final { delete this; }
</del><ins>+    void didFinishLoading(ResourceHandle*) final { delete this; }
</ins><span class="cx">     void didFail(ResourceHandle*, const ResourceError&amp;) final { delete this; }
</span><span class="cx">     bool shouldUseCredentialStorage(ResourceHandle*) final { return m_shouldUseCredentialStorage; }
</span><span class="cx">     bool usesAsyncCallbacks() final { return m_usesAsyncCallbacks == UsesAsyncCallbacks::Yes; }
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformnetworkResourceHandleh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/network/ResourceHandle.h (212992 => 212993)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/network/ResourceHandle.h        2017-02-25 04:54:36 UTC (rev 212992)
+++ trunk/Source/WebCore/platform/network/ResourceHandle.h        2017-02-25 05:48:51 UTC (rev 212993)
</span><span class="lines">@@ -83,7 +83,7 @@
</span><span class="cx"> class ResourceError;
</span><span class="cx"> class ResourceHandleClient;
</span><span class="cx"> class ResourceHandleInternal;
</span><del>-class NetworkLoadTiming;
</del><ins>+class NetworkLoadMetrics;
</ins><span class="cx"> class ResourceRequest;
</span><span class="cx"> class ResourceResponse;
</span><span class="cx"> class SoupNetworkSession;
</span><span class="lines">@@ -132,9 +132,9 @@
</span><span class="cx">         
</span><span class="cx"> #if PLATFORM(COCOA) &amp;&amp; ENABLE(WEB_TIMING)
</span><span class="cx"> #if USE(CFURLCONNECTION)
</span><del>-    static void getConnectionTimingData(CFURLConnectionRef, NetworkLoadTiming&amp;);
</del><ins>+    static void getConnectionTimingData(CFURLConnectionRef, NetworkLoadMetrics&amp;);
</ins><span class="cx"> #else
</span><del>-    static void getConnectionTimingData(NSURLConnection *, NetworkLoadTiming&amp;);
</del><ins>+    static void getConnectionTimingData(NSURLConnection *, NetworkLoadMetrics&amp;);
</ins><span class="cx"> #endif
</span><span class="cx"> #endif
</span><span class="cx">         
</span><span class="lines">@@ -178,7 +178,7 @@
</span><span class="cx">     void ensureReadBuffer();
</span><span class="cx">     size_t currentStreamPosition() const;
</span><span class="cx">     void didStartRequest();
</span><del>-    double m_requestTime;
</del><ins>+    MonotonicTime m_requestTime;
</ins><span class="cx"> #endif
</span><span class="cx"> 
</span><span class="cx">     bool hasAuthenticationChallenge() const;
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformnetworkResourceHandleClienth"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/network/ResourceHandleClient.h (212992 => 212993)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/network/ResourceHandleClient.h        2017-02-25 04:54:36 UTC (rev 212992)
+++ trunk/Source/WebCore/platform/network/ResourceHandleClient.h        2017-02-25 05:48:51 UTC (rev 212993)
</span><span class="lines">@@ -71,7 +71,7 @@
</span><span class="cx">         virtual void didReceiveData(ResourceHandle*, const char*, unsigned, int /*encodedDataLength*/) { }
</span><span class="cx">         WEBCORE_EXPORT virtual void didReceiveBuffer(ResourceHandle*, Ref&lt;SharedBuffer&gt;&amp;&amp;, int encodedDataLength);
</span><span class="cx">         
</span><del>-        virtual void didFinishLoading(ResourceHandle*, double /*finishTime*/) { }
</del><ins>+        virtual void didFinishLoading(ResourceHandle*) { }
</ins><span class="cx">         virtual void didFail(ResourceHandle*, const ResourceError&amp;) { }
</span><span class="cx">         virtual void wasBlocked(ResourceHandle*) { }
</span><span class="cx">         virtual void cannotShowURL(ResourceHandle*) { }
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformnetworkResourceResponseBasecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/network/ResourceResponseBase.cpp (212992 => 212993)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/network/ResourceResponseBase.cpp        2017-02-25 04:54:36 UTC (rev 212992)
+++ trunk/Source/WebCore/platform/network/ResourceResponseBase.cpp        2017-02-25 05:48:51 UTC (rev 212993)
</span><span class="lines">@@ -71,7 +71,7 @@
</span><span class="cx">     data.httpVersion = httpVersion().isolatedCopy();
</span><span class="cx"> 
</span><span class="cx">     data.httpHeaderFields = httpHeaderFields().isolatedCopy();
</span><del>-    data.networkLoadTiming = m_networkLoadTiming.isolatedCopy();
</del><ins>+    data.networkLoadMetrics = m_networkLoadMetrics.isolatedCopy();
</ins><span class="cx">     data.type = m_type;
</span><span class="cx">     data.isRedirected = m_isRedirected;
</span><span class="cx"> 
</span><span class="lines">@@ -92,7 +92,7 @@
</span><span class="cx">     response.setHTTPVersion(data.httpVersion);
</span><span class="cx"> 
</span><span class="cx">     response.m_httpHeaderFields = WTFMove(data.httpHeaderFields);
</span><del>-    response.m_networkLoadTiming = data.networkLoadTiming;
</del><ins>+    response.m_networkLoadMetrics = data.networkLoadMetrics;
</ins><span class="cx">     response.m_type = data.type;
</span><span class="cx">     response.m_isRedirected = data.isRedirected;
</span><span class="cx"> 
</span><span class="lines">@@ -595,7 +595,7 @@
</span><span class="cx">         return false;
</span><span class="cx">     if (a.httpHeaderFields() != b.httpHeaderFields())
</span><span class="cx">         return false;
</span><del>-    if (a.networkLoadTiming() != b.networkLoadTiming())
</del><ins>+    if (a.deprecatedNetworkLoadMetrics() != b.deprecatedNetworkLoadMetrics())
</ins><span class="cx">         return false;
</span><span class="cx">     return ResourceResponse::platformCompare(a, b);
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformnetworkResourceResponseBaseh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/network/ResourceResponseBase.h (212992 => 212993)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/network/ResourceResponseBase.h        2017-02-25 04:54:36 UTC (rev 212992)
+++ trunk/Source/WebCore/platform/network/ResourceResponseBase.h        2017-02-25 05:48:51 UTC (rev 212993)
</span><span class="lines">@@ -29,7 +29,7 @@
</span><span class="cx"> #include &quot;CacheValidation.h&quot;
</span><span class="cx"> #include &quot;CertificateInfo.h&quot;
</span><span class="cx"> #include &quot;HTTPHeaderMap.h&quot;
</span><del>-#include &quot;NetworkLoadTiming.h&quot;
</del><ins>+#include &quot;NetworkLoadMetrics.h&quot;
</ins><span class="cx"> #include &quot;ParsedContentRange.h&quot;
</span><span class="cx"> #include &quot;URL.h&quot;
</span><span class="cx"> #include &lt;wtf/SHA1.h&gt;
</span><span class="lines">@@ -58,7 +58,7 @@
</span><span class="cx">         String httpStatusText;
</span><span class="cx">         String httpVersion;
</span><span class="cx">         HTTPHeaderMap httpHeaderFields;
</span><del>-        NetworkLoadTiming networkLoadTiming;
</del><ins>+        NetworkLoadMetrics networkLoadMetrics;
</ins><span class="cx">         Type type;
</span><span class="cx">         bool isRedirected;
</span><span class="cx">     };
</span><span class="lines">@@ -140,7 +140,10 @@
</span><span class="cx">     const std::optional&lt;SHA1::Digest&gt;&amp; cacheBodyKey() const { return m_cacheBodyKey; }
</span><span class="cx">     void setCacheBodyKey(const SHA1::Digest&amp; key) { m_cacheBodyKey = key; }
</span><span class="cx"> 
</span><del>-    NetworkLoadTiming&amp; networkLoadTiming() const { return m_networkLoadTiming; }
</del><ins>+    // FIXME: This should be eliminated from ResourceResponse.
+    // Network loading metrics should be delivered via didFinishLoad
+    // and should not be part of the ResourceResponse.
+    NetworkLoadMetrics&amp; deprecatedNetworkLoadMetrics() const { return m_networkLoadMetrics; }
</ins><span class="cx"> 
</span><span class="cx">     // The ResourceResponse subclass may &quot;shadow&quot; this method to provide platform-specific memory usage information
</span><span class="cx">     unsigned memoryUsage() const
</span><span class="lines">@@ -192,7 +195,7 @@
</span><span class="cx">     AtomicString m_httpStatusText;
</span><span class="cx">     AtomicString m_httpVersion;
</span><span class="cx">     HTTPHeaderMap m_httpHeaderFields;
</span><del>-    mutable NetworkLoadTiming m_networkLoadTiming;
</del><ins>+    mutable NetworkLoadMetrics m_networkLoadMetrics;
</ins><span class="cx"> 
</span><span class="cx">     mutable std::optional&lt;CertificateInfo&gt; m_certificateInfo;
</span><span class="cx"> 
</span><span class="lines">@@ -240,10 +243,10 @@
</span><span class="cx">     encoder &lt;&lt; m_httpVersion;
</span><span class="cx">     encoder &lt;&lt; m_httpHeaderFields;
</span><span class="cx"> 
</span><del>-    // We don't want to put the networkLoadTiming info
</del><ins>+    // We don't want to put the networkLoadMetrics info
</ins><span class="cx">     // into the disk cache, because we will never use the old info.
</span><span class="cx">     if (Encoder::isIPCEncoder)
</span><del>-        encoder &lt;&lt; m_networkLoadTiming;
</del><ins>+        encoder &lt;&lt; m_networkLoadMetrics;
</ins><span class="cx"> 
</span><span class="cx">     encoder &lt;&lt; m_httpStatusCode;
</span><span class="cx">     encoder &lt;&lt; m_certificateInfo;
</span><span class="lines">@@ -279,8 +282,8 @@
</span><span class="cx">         return false;
</span><span class="cx">     if (!decoder.decode(response.m_httpHeaderFields))
</span><span class="cx">         return false;
</span><del>-    // The networkLoadTiming info is only send over IPC and not stored in disk cache.
-    if (Decoder::isIPCDecoder &amp;&amp; !decoder.decode(response.m_networkLoadTiming))
</del><ins>+    // The networkLoadMetrics info is only send over IPC and not stored in disk cache.
+    if (Decoder::isIPCDecoder &amp;&amp; !decoder.decode(response.m_networkLoadMetrics))
</ins><span class="cx">         return false;
</span><span class="cx">     if (!decoder.decode(response.m_httpStatusCode))
</span><span class="cx">         return false;
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformnetworkSynchronousLoaderClientcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/network/SynchronousLoaderClient.cpp (212992 => 212993)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/network/SynchronousLoaderClient.cpp        2017-02-25 04:54:36 UTC (rev 212992)
+++ trunk/Source/WebCore/platform/network/SynchronousLoaderClient.cpp        2017-02-25 05:48:51 UTC (rev 212993)
</span><span class="lines">@@ -72,7 +72,7 @@
</span><span class="cx">     m_data.append(data, length);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void SynchronousLoaderClient::didFinishLoading(ResourceHandle*, double)
</del><ins>+void SynchronousLoaderClient::didFinishLoading(ResourceHandle*)
</ins><span class="cx"> {
</span><span class="cx">     m_isDone = true;
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformnetworkSynchronousLoaderClienth"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/network/SynchronousLoaderClient.h (212992 => 212993)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/network/SynchronousLoaderClient.h        2017-02-25 04:54:36 UTC (rev 212992)
+++ trunk/Source/WebCore/platform/network/SynchronousLoaderClient.h        2017-02-25 05:48:51 UTC (rev 212993)
</span><span class="lines">@@ -50,7 +50,7 @@
</span><span class="cx">     void didReceiveAuthenticationChallenge(ResourceHandle*, const AuthenticationChallenge&amp;) override;
</span><span class="cx">     void didReceiveResponse(ResourceHandle*, ResourceResponse&amp;&amp;) override;
</span><span class="cx">     void didReceiveData(ResourceHandle*, const char*, unsigned, int /*encodedDataLength*/) override;
</span><del>-    void didFinishLoading(ResourceHandle*, double /*finishTime*/) override;
</del><ins>+    void didFinishLoading(ResourceHandle*) override;
</ins><span class="cx">     void didFail(ResourceHandle*, const ResourceError&amp;) override;
</span><span class="cx"> #if USE(PROTECTION_SPACE_AUTH_CALLBACK)
</span><span class="cx">     bool canAuthenticateAgainstProtectionSpace(ResourceHandle*, const ProtectionSpace&amp;) override;
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformnetworkcfResourceHandleCFURLConnectionDelegateWithOperationQueuecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/network/cf/ResourceHandleCFURLConnectionDelegateWithOperationQueue.cpp (212992 => 212993)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/network/cf/ResourceHandleCFURLConnectionDelegateWithOperationQueue.cpp        2017-02-25 04:54:36 UTC (rev 212992)
+++ trunk/Source/WebCore/platform/network/cf/ResourceHandleCFURLConnectionDelegateWithOperationQueue.cpp        2017-02-25 05:48:51 UTC (rev 212993)
</span><span class="lines">@@ -156,7 +156,7 @@
</span><span class="cx">         
</span><span class="cx">         ResourceResponse resourceResponse(cfResponse);
</span><span class="cx"> #if ENABLE(WEB_TIMING)
</span><del>-        ResourceHandle::getConnectionTimingData(connection, resourceResponse.networkLoadTiming());
</del><ins>+        ResourceHandle::getConnectionTimingData(connection, resourceResponse.deprecatedNetworkLoadMetrics());
</ins><span class="cx"> #else
</span><span class="cx">         UNUSED_PARAM(connection);
</span><span class="cx"> #endif
</span><span class="lines">@@ -195,7 +195,7 @@
</span><span class="cx"> 
</span><span class="cx">         LOG(Network, &quot;CFNet - ResourceHandleCFURLConnectionDelegateWithOperationQueue::didFinishLoading(handle=%p) (%s)&quot;, m_handle, m_handle-&gt;firstRequest().url().string().utf8().data());
</span><span class="cx"> 
</span><del>-        m_handle-&gt;client()-&gt;didFinishLoading(m_handle, 0);
</del><ins>+        m_handle-&gt;client()-&gt;didFinishLoading(m_handle);
</ins><span class="cx">     });
</span><span class="cx"> }
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformnetworkcfSynchronousResourceHandleCFURLConnectionDelegatecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/network/cf/SynchronousResourceHandleCFURLConnectionDelegate.cpp (212992 => 212993)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/network/cf/SynchronousResourceHandleCFURLConnectionDelegate.cpp        2017-02-25 04:54:36 UTC (rev 212992)
+++ trunk/Source/WebCore/platform/network/cf/SynchronousResourceHandleCFURLConnectionDelegate.cpp        2017-02-25 05:48:51 UTC (rev 212993)
</span><span class="lines">@@ -171,7 +171,7 @@
</span><span class="cx"> 
</span><span class="cx">     ResourceResponse resourceResponse(cfResponse);
</span><span class="cx"> #if PLATFORM(COCOA) &amp;&amp; ENABLE(WEB_TIMING)
</span><del>-    ResourceHandle::getConnectionTimingData(connection, resourceResponse.networkLoadTiming());
</del><ins>+    ResourceHandle::getConnectionTimingData(connection, resourceResponse.deprecatedNetworkLoadMetrics());
</ins><span class="cx"> #else
</span><span class="cx">     UNUSED_PARAM(connection);
</span><span class="cx"> #endif
</span><span class="lines">@@ -192,7 +192,7 @@
</span><span class="cx">     LOG(Network, &quot;CFNet - SynchronousResourceHandleCFURLConnectionDelegate::didFinishLoading(handle=%p) (%s)&quot;, m_handle, m_handle-&gt;firstRequest().url().string().utf8().data());
</span><span class="cx"> 
</span><span class="cx">     if (ResourceHandleClient* client = m_handle-&gt;client())
</span><del>-        client-&gt;didFinishLoading(m_handle, 0);
</del><ins>+        client-&gt;didFinishLoading(m_handle);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void SynchronousResourceHandleCFURLConnectionDelegate::didFail(CFErrorRef error)
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformnetworkcocoaNetworkLoadMetricsmmfromrev212992trunkSourceWebCoreplatformnetworkcocoaNetworkLoadTimingmm"></a>
<div class="copfile"><h4>Copied: trunk/Source/WebCore/platform/network/cocoa/NetworkLoadMetrics.mm (from rev 212992, trunk/Source/WebCore/platform/network/cocoa/NetworkLoadTiming.mm) (0 => 212993)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/network/cocoa/NetworkLoadMetrics.mm                                (rev 0)
+++ trunk/Source/WebCore/platform/network/cocoa/NetworkLoadMetrics.mm        2017-02-25 05:48:51 UTC (rev 212993)
</span><span class="lines">@@ -0,0 +1,79 @@
</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;NetworkLoadMetrics.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, NetworkLoadMetrics&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 = Seconds(domainLookupStart &lt;= 0 ? Seconds(-1) : Seconds::fromMilliseconds(domainLookupStart - referenceStart));
+    timing.domainLookupEnd = Seconds(domainLookupEnd &lt;= 0 ? Seconds(-1) : Seconds::fromMilliseconds(domainLookupEnd - referenceStart));
+    timing.connectStart = Seconds(connectStart &lt;= 0 ? Seconds(-1) : Seconds::fromMilliseconds(connectStart - referenceStart));
+    timing.secureConnectionStart = Seconds(secureConnectionStart &lt;= 0 ? Seconds(-1) : Seconds::fromMilliseconds(secureConnectionStart - referenceStart));
+    timing.connectEnd = Seconds(connectEnd &lt;= 0 ? Seconds(-1) : Seconds::fromMilliseconds(connectEnd - referenceStart));
+    timing.requestStart = Seconds(requestStart &lt;= 0 ? Seconds(0) : Seconds::fromMilliseconds(requestStart - referenceStart));
+    timing.responseStart = Seconds(responseStart &lt;= 0 ? Seconds(0) : Seconds::fromMilliseconds(responseStart - referenceStart));
+
+    // NOTE: responseEnd is not populated in this code path.
+}
+
+#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="trunkSourceWebCoreplatformnetworkcocoaNetworkLoadTimingmm"></a>
<div class="delfile"><h4>Deleted: trunk/Source/WebCore/platform/network/cocoa/NetworkLoadTiming.mm (212992 => 212993)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/network/cocoa/NetworkLoadTiming.mm        2017-02-25 04:54:36 UTC (rev 212992)
+++ trunk/Source/WebCore/platform/network/cocoa/NetworkLoadTiming.mm        2017-02-25 05:48:51 UTC (rev 212993)
</span><span class="lines">@@ -1,77 +0,0 @@
</span><del>-/*
- * 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;NetworkLoadTiming.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, NetworkLoadTiming&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
-    
-}
</del></span></pre></div>
<a id="trunkSourceWebCoreplatformnetworkcurlResourceHandleCurlcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/network/curl/ResourceHandleCurl.cpp (212992 => 212993)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/network/curl/ResourceHandleCurl.cpp        2017-02-25 04:54:36 UTC (rev 212992)
+++ trunk/Source/WebCore/platform/network/curl/ResourceHandleCurl.cpp        2017-02-25 05:48:51 UTC (rev 212993)
</span><span class="lines">@@ -48,7 +48,7 @@
</span><span class="cx"> 
</span><span class="cx">     virtual void didReceiveResponse(ResourceHandle*, const ResourceResponse&amp;);
</span><span class="cx">     virtual void didReceiveData(ResourceHandle*, const char*, unsigned, int encodedDataLength);
</span><del>-    virtual void didFinishLoading(ResourceHandle*, double /*finishTime*/);
</del><ins>+    virtual void didFinishLoading(ResourceHandle*);
</ins><span class="cx">     virtual void didFail(ResourceHandle*, const ResourceError&amp;);
</span><span class="cx"> 
</span><span class="cx">     ResourceResponse resourceResponse() const { return m_response; }
</span><span class="lines">@@ -75,7 +75,7 @@
</span><span class="cx">     m_data.append(data, length);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void WebCoreSynchronousLoader::didFinishLoading(ResourceHandle*, double)
</del><ins>+void WebCoreSynchronousLoader::didFinishLoading(ResourceHandle*)
</ins><span class="cx"> {
</span><span class="cx"> }
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformnetworkcurlResourceHandleManagercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/network/curl/ResourceHandleManager.cpp (212992 => 212993)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/network/curl/ResourceHandleManager.cpp        2017-02-25 04:54:36 UTC (rev 212992)
+++ trunk/Source/WebCore/platform/network/curl/ResourceHandleManager.cpp        2017-02-25 05:48:51 UTC (rev 212993)
</span><span class="lines">@@ -170,14 +170,8 @@
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> #if ENABLE(WEB_TIMING)
</span><del>-static double milisecondsSinceRequest(double requestTime)
-{
-    return (monotonicallyIncreasingTime() - requestTime) * 1000.0;
-}
-
</del><span class="cx"> static void calculateWebTimingInformations(ResourceHandleInternal* d)
</span><span class="cx"> {
</span><del>-    double startTransfertTime = 0;
</del><span class="cx">     double preTransferTime = 0;
</span><span class="cx">     double dnslookupTime = 0;
</span><span class="cx">     double connectTime = 0;
</span><span class="lines">@@ -186,20 +180,19 @@
</span><span class="cx">     curl_easy_getinfo(d-&gt;m_handle, CURLINFO_NAMELOOKUP_TIME, &amp;dnslookupTime);
</span><span class="cx">     curl_easy_getinfo(d-&gt;m_handle, CURLINFO_CONNECT_TIME, &amp;connectTime);
</span><span class="cx">     curl_easy_getinfo(d-&gt;m_handle, CURLINFO_APPCONNECT_TIME, &amp;appConnectTime);
</span><del>-    curl_easy_getinfo(d-&gt;m_handle, CURLINFO_STARTTRANSFER_TIME, &amp;startTransfertTime);
</del><span class="cx">     curl_easy_getinfo(d-&gt;m_handle, CURLINFO_PRETRANSFER_TIME, &amp;preTransferTime);
</span><span class="cx"> 
</span><del>-    d-&gt;m_response.networkLoadTiming().domainLookupStart = 0;
-    d-&gt;m_response.networkLoadTiming().domainLookupEnd = dnslookupTime * 1000;
</del><ins>+    d-&gt;m_response.deprecatedNetworkLoadMetrics().domainLookupStart = Seconds(0);
+    d-&gt;m_response.deprecatedNetworkLoadMetrics().domainLookupEnd = Seconds(dnslookupTime);
</ins><span class="cx"> 
</span><del>-    d-&gt;m_response.networkLoadTiming().connectStart = dnslookupTime * 1000;
-    d-&gt;m_response.networkLoadTiming().connectEnd = connectTime * 1000;
</del><ins>+    d-&gt;m_response.deprecatedNetworkLoadMetrics().connectStart = Seconds(dnslookupTime);
+    d-&gt;m_response.deprecatedNetworkLoadMetrics().connectEnd = Seconds(connectTime);
</ins><span class="cx"> 
</span><del>-    d-&gt;m_response.networkLoadTiming().requestStart = connectTime * 1000;
-    d-&gt;m_response.networkLoadTiming().responseStart = preTransferTime * 1000;
</del><ins>+    d-&gt;m_response.deprecatedNetworkLoadMetrics().requestStart = Seconds(connectTime);
+    d-&gt;m_response.deprecatedNetworkLoadMetrics().responseStart = Seconds(preTransferTime);
</ins><span class="cx"> 
</span><span class="cx">     if (appConnectTime)
</span><del>-        d-&gt;m_response.networkLoadTiming().secureConnectionStart = connectTime * 1000;
</del><ins>+        d-&gt;m_response.deprecatedNetworkLoadMetrics().secureConnectionStart = Seconds(connectTime);
</ins><span class="cx"> }
</span><span class="cx"> #endif
</span><span class="cx"> 
</span><span class="lines">@@ -677,7 +670,7 @@
</span><span class="cx">         // find the node which has same d-&gt;m_handle as completed transfer
</span><span class="cx">         CURL* handle = msg-&gt;easy_handle;
</span><span class="cx">         ASSERT(handle);
</span><del>-        ResourceHandle* job = 0;
</del><ins>+        ResourceHandle* job = nullptr;
</ins><span class="cx">         CURLcode err = curl_easy_getinfo(handle, CURLINFO_PRIVATE, &amp;job);
</span><span class="cx">         ASSERT_UNUSED(err, CURLE_OK == err);
</span><span class="cx">         ASSERT(job);
</span><span class="lines">@@ -711,7 +704,7 @@
</span><span class="cx">                 d-&gt;m_multipartHandle-&gt;contentEnded();
</span><span class="cx"> 
</span><span class="cx">             if (d-&gt;client()) {
</span><del>-                d-&gt;client()-&gt;didFinishLoading(job, 0);
</del><ins>+                d-&gt;client()-&gt;didFinishLoading(job);
</ins><span class="cx">                 CurlCacheManager::getInstance().didFinishLoading(*job);
</span><span class="cx">             }
</span><span class="cx">         } else {
</span><span class="lines">@@ -972,7 +965,7 @@
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     if (handle-&gt;client())
</span><del>-        handle-&gt;client()-&gt;didFinishLoading(handle, 0);
</del><ins>+        handle-&gt;client()-&gt;didFinishLoading(handle);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void ResourceHandleManager::dispatchSynchronousJob(ResourceHandle* job)
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformnetworkmacResourceHandleMacmm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/network/mac/ResourceHandleMac.mm (212992 => 212993)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/network/mac/ResourceHandleMac.mm        2017-02-25 04:54:36 UTC (rev 212992)
+++ trunk/Source/WebCore/platform/network/mac/ResourceHandleMac.mm        2017-02-25 05:48:51 UTC (rev 212993)
</span><span class="lines">@@ -736,7 +736,7 @@
</span><span class="cx"> 
</span><span class="cx"> #if USE(CFURLCONNECTION)
</span><span class="cx">     
</span><del>-void ResourceHandle::getConnectionTimingData(CFURLConnectionRef connection, NetworkLoadTiming&amp; timing)
</del><ins>+void ResourceHandle::getConnectionTimingData(CFURLConnectionRef connection, NetworkLoadMetrics&amp; timing)
</ins><span class="cx"> {
</span><span class="cx">     copyTimingData((__bridge NSDictionary*)adoptCF(_CFURLConnectionCopyTimingData(connection)).get(), timing);
</span><span class="cx"> }
</span><span class="lines">@@ -743,7 +743,7 @@
</span><span class="cx">     
</span><span class="cx"> #else
</span><span class="cx">     
</span><del>-void ResourceHandle::getConnectionTimingData(NSURLConnection *connection, NetworkLoadTiming&amp; timing)
</del><ins>+void ResourceHandle::getConnectionTimingData(NSURLConnection *connection, NetworkLoadMetrics&amp; timing)
</ins><span class="cx"> {
</span><span class="cx">     copyTimingData([connection _timingData], timing);
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformnetworkmacWebCoreResourceHandleAsDelegatemm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/network/mac/WebCoreResourceHandleAsDelegate.mm (212992 => 212993)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/network/mac/WebCoreResourceHandleAsDelegate.mm        2017-02-25 04:54:36 UTC (rev 212992)
+++ trunk/Source/WebCore/platform/network/mac/WebCoreResourceHandleAsDelegate.mm        2017-02-25 05:48:51 UTC (rev 212993)
</span><span class="lines">@@ -145,7 +145,7 @@
</span><span class="cx">     ResourceResponse resourceResponse(response);
</span><span class="cx">     resourceResponse.setSource(ResourceResponse::Source::Network);
</span><span class="cx"> #if ENABLE(WEB_TIMING)
</span><del>-    ResourceHandle::getConnectionTimingData(connection, resourceResponse.networkLoadTiming());
</del><ins>+    ResourceHandle::getConnectionTimingData(connection, resourceResponse.deprecatedNetworkLoadMetrics());
</ins><span class="cx"> #else
</span><span class="cx">     UNUSED_PARAM(connection);
</span><span class="cx"> #endif
</span><span class="lines">@@ -215,7 +215,7 @@
</span><span class="cx">     if (!m_handle || !m_handle-&gt;client())
</span><span class="cx">         return;
</span><span class="cx"> 
</span><del>-    m_handle-&gt;client()-&gt;didFinishLoading(m_handle, 0);
</del><ins>+    m_handle-&gt;client()-&gt;didFinishLoading(m_handle);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> - (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformnetworkmacWebCoreResourceHandleAsOperationQueueDelegatemm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/network/mac/WebCoreResourceHandleAsOperationQueueDelegate.mm (212992 => 212993)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/network/mac/WebCoreResourceHandleAsOperationQueueDelegate.mm        2017-02-25 04:54:36 UTC (rev 212992)
+++ trunk/Source/WebCore/platform/network/mac/WebCoreResourceHandleAsOperationQueueDelegate.mm        2017-02-25 05:48:51 UTC (rev 212993)
</span><span class="lines">@@ -195,7 +195,7 @@
</span><span class="cx">         
</span><span class="cx">         ResourceResponse resourceResponse(r);
</span><span class="cx"> #if ENABLE(WEB_TIMING)
</span><del>-        ResourceHandle::getConnectionTimingData(connection, resourceResponse.networkLoadTiming());
</del><ins>+        ResourceHandle::getConnectionTimingData(connection, resourceResponse.deprecatedNetworkLoadMetrics());
</ins><span class="cx"> #else
</span><span class="cx">         UNUSED_PARAM(connection);
</span><span class="cx"> #endif
</span><span class="lines">@@ -274,7 +274,7 @@
</span><span class="cx">         if (!m_handle || !m_handle-&gt;client())
</span><span class="cx">             return;
</span><span class="cx"> 
</span><del>-        m_handle-&gt;client()-&gt;didFinishLoading(m_handle, 0);
</del><ins>+        m_handle-&gt;client()-&gt;didFinishLoading(m_handle);
</ins><span class="cx">     });
</span><span class="cx"> }
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformnetworksoupResourceHandleSoupcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/network/soup/ResourceHandleSoup.cpp (212992 => 212993)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/network/soup/ResourceHandleSoup.cpp        2017-02-25 04:54:36 UTC (rev 212992)
+++ trunk/Source/WebCore/platform/network/soup/ResourceHandleSoup.cpp        2017-02-25 05:48:51 UTC (rev 212993)
</span><span class="lines">@@ -68,9 +68,6 @@
</span><span class="cx"> static void cleanupSoupRequestOperation(ResourceHandle*, bool isDestroying = false);
</span><span class="cx"> static void sendRequestCallback(GObject*, GAsyncResult*, gpointer);
</span><span class="cx"> static void readCallback(GObject*, GAsyncResult*, gpointer);
</span><del>-#if ENABLE(WEB_TIMING)
-static double milisecondsSinceRequest(double requestTime);
-#endif
</del><span class="cx"> static void continueAfterDidReceiveResponse(ResourceHandle*);
</span><span class="cx"> 
</span><span class="cx"> ResourceHandleInternal::~ResourceHandleInternal()
</span><span class="lines">@@ -247,7 +244,7 @@
</span><span class="cx">     if (!handle || handle-&gt;cancelledOrClientless())
</span><span class="cx">         return;
</span><span class="cx"> 
</span><del>-    handle-&gt;m_requestTime = monotonicallyIncreasingTime();
</del><ins>+    handle-&gt;m_requestTime = MonotonicTime::now();
</ins><span class="cx"> }
</span><span class="cx"> #endif
</span><span class="cx"> 
</span><span class="lines">@@ -468,7 +465,7 @@
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     if (!d-&gt;m_inputStream) {
</span><del>-        handle-&gt;client()-&gt;didFinishLoading(handle.get(), 0);
</del><ins>+        handle-&gt;client()-&gt;didFinishLoading(handle.get());
</ins><span class="cx">         cleanupSoupRequestOperation(handle.get());
</span><span class="cx">         return;
</span><span class="cx">     }
</span><span class="lines">@@ -530,7 +527,7 @@
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx"> #if ENABLE(WEB_TIMING)
</span><del>-    d-&gt;m_response.networkLoadTiming().responseStart = milisecondsSinceRequest(handle-&gt;m_requestTime);
</del><ins>+    d-&gt;m_response.deprecatedNetworkLoadMetrics().responseStart = MonotonicTime::now() - handle-&gt;m_requestTime;
</ins><span class="cx"> #endif
</span><span class="cx"> 
</span><span class="cx">     if (soupMessage &amp;&amp; d-&gt;m_response.isMultipart())
</span><span class="lines">@@ -567,14 +564,9 @@
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> #if ENABLE(WEB_TIMING)
</span><del>-static double milisecondsSinceRequest(double requestTime)
-{
-    return (monotonicallyIncreasingTime() - requestTime) * 1000.0;
-}
-
</del><span class="cx"> void ResourceHandle::didStartRequest()
</span><span class="cx"> {
</span><del>-    getInternal()-&gt;m_response.networkLoadTiming().requestStart = milisecondsSinceRequest(m_requestTime);
</del><ins>+    getInternal()-&gt;m_response.deprecatedNetworkLoadMetrics().requestStart = MonotonicTime::now() - m_requestTime;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> #if SOUP_CHECK_VERSION(2, 49, 91)
</span><span class="lines">@@ -594,24 +586,24 @@
</span><span class="cx">         return;
</span><span class="cx"> 
</span><span class="cx">     ResourceHandleInternal* d = handle-&gt;getInternal();
</span><del>-    double deltaTime = milisecondsSinceRequest(handle-&gt;m_requestTime);
</del><ins>+    Seconds deltaTime = MonotonicTime::now() - handle-&gt;m_requestTime;
</ins><span class="cx">     switch (event) {
</span><span class="cx">     case G_SOCKET_CLIENT_RESOLVING:
</span><del>-        d-&gt;m_response.networkLoadTiming().domainLookupStart = deltaTime;
</del><ins>+        d-&gt;m_response.deprecatedNetworkLoadMetrics().domainLookupStart = deltaTime;
</ins><span class="cx">         break;
</span><span class="cx">     case G_SOCKET_CLIENT_RESOLVED:
</span><del>-        d-&gt;m_response.networkLoadTiming().domainLookupEnd = deltaTime;
</del><ins>+        d-&gt;m_response.deprecatedNetworkLoadMetrics().domainLookupEnd = deltaTime;
</ins><span class="cx">         break;
</span><span class="cx">     case G_SOCKET_CLIENT_CONNECTING:
</span><del>-        d-&gt;m_response.networkLoadTiming().connectStart = deltaTime;
-        if (d-&gt;m_response.networkLoadTiming().domainLookupStart != -1) {
</del><ins>+        d-&gt;m_response.deprecatedNetworkLoadMetrics().connectStart = deltaTime;
+        if (d-&gt;m_response.deprecatedNetworkLoadMetrics().domainLookupStart != Seconds(-1)) {
</ins><span class="cx">             // WebCore/inspector/front-end/RequestTimingView.js assumes
</span><span class="cx">             // that DNS time is included in connection time so must
</span><span class="cx">             // substract here the DNS delta that will be added later (see
</span><span class="cx">             // WebInspector.RequestTimingView.createTimingTable in the
</span><span class="cx">             // file above for more details).
</span><del>-            d-&gt;m_response.networkLoadTiming().connectStart -=
-                d-&gt;m_response.networkLoadTiming().domainLookupEnd - d-&gt;m_response.networkLoadTiming().domainLookupStart;
</del><ins>+            d-&gt;m_response.deprecatedNetworkLoadMetrics().connectStart -=
+                d-&gt;m_response.deprecatedNetworkLoadMetrics().domainLookupEnd - d-&gt;m_response.deprecatedNetworkLoadMetrics().domainLookupStart;
</ins><span class="cx">         }
</span><span class="cx">         break;
</span><span class="cx">     case G_SOCKET_CLIENT_CONNECTED:
</span><span class="lines">@@ -623,12 +615,12 @@
</span><span class="cx">     case G_SOCKET_CLIENT_PROXY_NEGOTIATED:
</span><span class="cx">         break;
</span><span class="cx">     case G_SOCKET_CLIENT_TLS_HANDSHAKING:
</span><del>-        d-&gt;m_response.networkLoadTiming().secureConnectionStart = deltaTime;
</del><ins>+        d-&gt;m_response.deprecatedNetworkLoadMetrics().secureConnectionStart = deltaTime;
</ins><span class="cx">         break;
</span><span class="cx">     case G_SOCKET_CLIENT_TLS_HANDSHAKED:
</span><span class="cx">         break;
</span><span class="cx">     case G_SOCKET_CLIENT_COMPLETE:
</span><del>-        d-&gt;m_response.networkLoadTiming().connectEnd = deltaTime;
</del><ins>+        d-&gt;m_response.deprecatedNetworkLoadMetrics().connectEnd = deltaTime;
</ins><span class="cx">         break;
</span><span class="cx">     default:
</span><span class="cx">         ASSERT_NOT_REACHED();
</span><span class="lines">@@ -776,7 +768,7 @@
</span><span class="cx"> void ResourceHandle::sendPendingRequest()
</span><span class="cx"> {
</span><span class="cx"> #if ENABLE(WEB_TIMING)
</span><del>-    m_requestTime = monotonicallyIncreasingTime();
</del><ins>+    m_requestTime = MonotonicTime::now();
</ins><span class="cx"> #endif
</span><span class="cx"> 
</span><span class="cx">     if (d-&gt;m_firstRequest.timeoutInterval() &gt; 0)
</span><span class="lines">@@ -1020,7 +1012,7 @@
</span><span class="cx"> 
</span><span class="cx">         g_input_stream_close(d-&gt;m_inputStream.get(), 0, 0);
</span><span class="cx"> 
</span><del>-        handle-&gt;client()-&gt;didFinishLoading(handle.get(), 0);
</del><ins>+        handle-&gt;client()-&gt;didFinishLoading(handle.get());
</ins><span class="cx">         cleanupSoupRequestOperation(handle.get());
</span><span class="cx">         return;
</span><span class="cx">     }
</span></span></pre></div>
<a id="trunkSourceWebCoreworkersWorkerScriptLoadercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/workers/WorkerScriptLoader.cpp (212992 => 212993)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/workers/WorkerScriptLoader.cpp        2017-02-25 04:54:36 UTC (rev 212992)
+++ trunk/Source/WebCore/workers/WorkerScriptLoader.cpp        2017-02-25 05:48:51 UTC (rev 212993)
</span><span class="lines">@@ -144,7 +144,7 @@
</span><span class="cx">     m_script.append(m_decoder-&gt;decode(data, len));
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void WorkerScriptLoader::didFinishLoading(unsigned long identifier, double)
</del><ins>+void WorkerScriptLoader::didFinishLoading(unsigned long identifier)
</ins><span class="cx"> {
</span><span class="cx">     if (m_failed) {
</span><span class="cx">         notifyError();
</span></span></pre></div>
<a id="trunkSourceWebCoreworkersWorkerScriptLoaderh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/workers/WorkerScriptLoader.h (212992 => 212993)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/workers/WorkerScriptLoader.h        2017-02-25 04:54:36 UTC (rev 212992)
+++ trunk/Source/WebCore/workers/WorkerScriptLoader.h        2017-02-25 05:48:51 UTC (rev 212993)
</span><span class="lines">@@ -64,7 +64,7 @@
</span><span class="cx"> 
</span><span class="cx">         void didReceiveResponse(unsigned long identifier, const ResourceResponse&amp;) override;
</span><span class="cx">         void didReceiveData(const char* data, int dataLength) override;
</span><del>-        void didFinishLoading(unsigned long identifier, double) override;
</del><ins>+        void didFinishLoading(unsigned long identifier) override;
</ins><span class="cx">         void didFail(const ResourceError&amp;) override;
</span><span class="cx"> 
</span><span class="cx">     private:
</span></span></pre></div>
<a id="trunkSourceWebCorexmlXMLHttpRequestcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/xml/XMLHttpRequest.cpp (212992 => 212993)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/xml/XMLHttpRequest.cpp        2017-02-25 04:54:36 UTC (rev 212992)
+++ trunk/Source/WebCore/xml/XMLHttpRequest.cpp        2017-02-25 05:48:51 UTC (rev 212993)
</span><span class="lines">@@ -1029,7 +1029,7 @@
</span><span class="cx">     networkError();
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void XMLHttpRequest::didFinishLoading(unsigned long identifier, double)
</del><ins>+void XMLHttpRequest::didFinishLoading(unsigned long identifier)
</ins><span class="cx"> {
</span><span class="cx">     if (m_error)
</span><span class="cx">         return;
</span></span></pre></div>
<a id="trunkSourceWebCorexmlXMLHttpRequesth"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/xml/XMLHttpRequest.h (212992 => 212993)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/xml/XMLHttpRequest.h        2017-02-25 04:54:36 UTC (rev 212992)
+++ trunk/Source/WebCore/xml/XMLHttpRequest.h        2017-02-25 05:48:51 UTC (rev 212993)
</span><span class="lines">@@ -149,7 +149,7 @@
</span><span class="cx">     void didSendData(unsigned long long bytesSent, unsigned long long totalBytesToBeSent) override;
</span><span class="cx">     void didReceiveResponse(unsigned long identifier, const ResourceResponse&amp;) override;
</span><span class="cx">     void didReceiveData(const char* data, int dataLength) override;
</span><del>-    void didFinishLoading(unsigned long identifier, double finishTime) override;
</del><ins>+    void didFinishLoading(unsigned long identifier) override;
</ins><span class="cx">     void didFail(const ResourceError&amp;) override;
</span><span class="cx"> 
</span><span class="cx">     bool responseIsXML() const;
</span></span></pre></div>
<a id="trunkSourceWebKit2ChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/ChangeLog (212992 => 212993)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/ChangeLog        2017-02-25 04:54:36 UTC (rev 212992)
+++ trunk/Source/WebKit2/ChangeLog        2017-02-25 05:48:51 UTC (rev 212993)
</span><span class="lines">@@ -1,3 +1,81 @@
</span><ins>+2017-02-24  Joseph Pecoraro  &lt;pecoraro@apple.com&gt;
+
+        [Resource Timing] Gather timing information with reliable responseEnd time
+        https://bugs.webkit.org/show_bug.cgi?id=168351
+
+        Reviewed by Alex Christensen.
+
+        Change from an unused `double finishTime` to a complete WebCore::NetworkLoadMetrics
+        object in the didFinishLoad ResourceLoader path. We may also extend this in the
+        didFail path later on. This allows the NetworkProcess to give complete timing
+        information, and more final metrics about the load, to WebCore.
+
+        * NetworkProcess/NetworkDataTask.h:
+        (WebKit::NetworkDataTaskClient::didCompleteWithError):
+        Give the NetworkDataTaskClient a basic didCompleteWithError for a completion
+        without metrics. For loads that complete with an error, or haven't populated
+        any metrics, this will pass empty metrics onward.
+
+        * NetworkProcess/Downloads/BlobDownloadClient.cpp:
+        (WebKit::BlobDownloadClient::didFinishLoading):
+        * NetworkProcess/Downloads/BlobDownloadClient.h:
+        * NetworkProcess/Downloads/PendingDownload.h:
+        * NetworkProcess/PingLoad.h:
+        * NetworkProcess/cache/NetworkCacheSpeculativeLoad.cpp:
+        (WebKit::NetworkCache::SpeculativeLoad::didFinishLoading):
+        * NetworkProcess/cache/NetworkCacheSpeculativeLoad.h:
+        * NetworkProcess/NetworkDataTaskBlob.cpp:
+        (WebKit::NetworkDataTaskBlob::didFail):
+        * NetworkProcess/NetworkLoad.cpp:
+        (WebKit::NetworkLoad::continueWillSendRequest):
+        (WebKit::NetworkLoad::didCompleteWithError):
+        (WebKit::NetworkLoad::didFinishLoading):
+        * NetworkProcess/NetworkLoad.h:
+        * NetworkProcess/NetworkLoadClient.h:
+        * NetworkProcess/NetworkResourceLoader.cpp:
+        (WebKit::NetworkResourceLoader::didFinishLoading):
+        (WebKit::NetworkResourceLoader::sendResultForCacheEntry):
+        * NetworkProcess/NetworkResourceLoader.h:
+        * WebProcess/Network/WebResourceLoader.cpp:
+        (WebKit::WebResourceLoader::didFinishResourceLoad):
+        (WebKit::WebResourceLoader::didReceiveResource):
+        * WebProcess/Network/WebResourceLoader.h:
+        * WebProcess/Network/WebResourceLoader.messages.in:
+        Change didFinishLoad paths to take a NetworkLoadMetrics object instead of finishTime.
+        Change didCompleteWithError pathes to include a NetworkLoadMetrics object instead of finishTime.
+
+        * NetworkProcess/cocoa/NetworkDataTaskCocoa.h:
+        * NetworkProcess/cocoa/NetworkDataTaskCocoa.mm:
+        (WebKit::NetworkDataTaskCocoa::didCompleteWithError):
+        Own a NetworkLoadTiming that will be populated with the load.
+
+        * NetworkProcess/cocoa/NetworkSessionCocoa.h:
+        * NetworkProcess/cocoa/NetworkSessionCocoa.mm:
+        (-[WKNetworkSessionDelegate URLSession:task:didCompleteWithError:]):
+        (-[WKNetworkSessionDelegate URLSession:task:didFinishCollectingMetrics:]):
+        (-[WKNetworkSessionDelegate URLSession:dataTask:didReceiveResponse:completionHandler:]):
+        Populate NetworkLoadMetrics in the didFinishCollectingMetrics NSURLSessionTaskDelegate method.
+
+        * NetworkProcess/soup/NetworkDataTaskSoup.cpp:
+        (WebKit::NetworkDataTaskSoup::NetworkDataTaskSoup):
+        (WebKit::NetworkDataTaskSoup::timeoutFired):
+        (WebKit::NetworkDataTaskSoup::didSendRequest):
+        (WebKit::NetworkDataTaskSoup::dispatchDidReceiveResponse):
+        (WebKit::NetworkDataTaskSoup::dispatchDidCompleteWithError):
+        (WebKit::NetworkDataTaskSoup::tlsErrorsChanged):
+        (WebKit::NetworkDataTaskSoup::continueHTTPRedirection):
+        (WebKit::NetworkDataTaskSoup::didFinishRead):
+        (WebKit::NetworkDataTaskSoup::didFinishRequestNextPart):
+        (WebKit::NetworkDataTaskSoup::didFailDownload):
+        (WebKit::NetworkDataTaskSoup::didFail):
+        (WebKit::NetworkDataTaskSoup::networkEvent):
+        (WebKit::NetworkDataTaskSoup::didStartRequest):
+        (WebKit::NetworkDataTaskSoup::didRestart):
+        * NetworkProcess/soup/NetworkDataTaskSoup.h:
+        Instead of populating the NetworkLoadMetrics on the ResourceResponse, populate
+        a member variable during the entire load and dispatch didFinishCollectingMetrics
+        right before didCompleteLoadWithError.
+
</ins><span class="cx"> 2017-02-24  Chris Dumez  &lt;cdumez@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Unreviewed, rolling out r212944.
</span></span></pre></div>
<a id="trunkSourceWebKit2NetworkProcessDownloadsBlobDownloadClientcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/NetworkProcess/Downloads/BlobDownloadClient.cpp (212992 => 212993)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/NetworkProcess/Downloads/BlobDownloadClient.cpp        2017-02-25 04:54:36 UTC (rev 212992)
+++ trunk/Source/WebKit2/NetworkProcess/Downloads/BlobDownloadClient.cpp        2017-02-25 05:48:51 UTC (rev 212993)
</span><span class="lines">@@ -77,7 +77,7 @@
</span><span class="cx">     m_download.didReceiveData(buffer-&gt;size());
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void BlobDownloadClient::didFinishLoading(ResourceHandle*, double)
</del><ins>+void BlobDownloadClient::didFinishLoading(ResourceHandle*)
</ins><span class="cx"> {
</span><span class="cx">     closeFile(m_destinationFile);
</span><span class="cx">     m_download.didFinish();
</span></span></pre></div>
<a id="trunkSourceWebKit2NetworkProcessDownloadsBlobDownloadClienth"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/NetworkProcess/Downloads/BlobDownloadClient.h (212992 => 212993)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/NetworkProcess/Downloads/BlobDownloadClient.h        2017-02-25 04:54:36 UTC (rev 212992)
+++ trunk/Source/WebKit2/NetworkProcess/Downloads/BlobDownloadClient.h        2017-02-25 05:48:51 UTC (rev 212993)
</span><span class="lines">@@ -47,7 +47,7 @@
</span><span class="cx">     // ResourceHandleClient
</span><span class="cx">     void didReceiveResponseAsync(WebCore::ResourceHandle*, WebCore::ResourceResponse&amp;&amp;) final;
</span><span class="cx">     void didReceiveBuffer(WebCore::ResourceHandle*, Ref&lt;WebCore::SharedBuffer&gt;&amp;&amp;, int reportedEncodedDataLength) final;
</span><del>-    void didFinishLoading(WebCore::ResourceHandle*, double finishTime) final;
</del><ins>+    void didFinishLoading(WebCore::ResourceHandle*) final;
</ins><span class="cx">     void didFail(WebCore::ResourceHandle*, const WebCore::ResourceError&amp;) final;
</span><span class="cx">     bool usesAsyncCallbacks() final { return true; }
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebKit2NetworkProcessDownloadsPendingDownloadh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/NetworkProcess/Downloads/PendingDownload.h (212992 => 212993)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/NetworkProcess/Downloads/PendingDownload.h        2017-02-25 04:54:36 UTC (rev 212992)
+++ trunk/Source/WebKit2/NetworkProcess/Downloads/PendingDownload.h        2017-02-25 05:48:51 UTC (rev 212993)
</span><span class="lines">@@ -64,7 +64,7 @@
</span><span class="cx">     void willSendRedirectedRequest(WebCore::ResourceRequest&amp;&amp;, WebCore::ResourceRequest&amp;&amp; redirectRequest, WebCore::ResourceResponse&amp;&amp; redirectResponse) override;
</span><span class="cx">     ShouldContinueDidReceiveResponse didReceiveResponse(WebCore::ResourceResponse&amp;&amp;) override { return ShouldContinueDidReceiveResponse::No; };
</span><span class="cx">     void didReceiveBuffer(Ref&lt;WebCore::SharedBuffer&gt;&amp;&amp;, int reportedEncodedDataLength) override { };
</span><del>-    void didFinishLoading(double finishTime) override { };
</del><ins>+    void didFinishLoading(const WebCore::NetworkLoadMetrics&amp;) override { };
</ins><span class="cx">     void didFailLoading(const WebCore::ResourceError&amp;) override;
</span><span class="cx"> 
</span><span class="cx">     // MessageSender.
</span></span></pre></div>
<a id="trunkSourceWebKit2NetworkProcessNetworkDataTaskh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/NetworkProcess/NetworkDataTask.h (212992 => 212993)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/NetworkProcess/NetworkDataTask.h        2017-02-25 04:54:36 UTC (rev 212992)
+++ trunk/Source/WebKit2/NetworkProcess/NetworkDataTask.h        2017-02-25 05:48:51 UTC (rev 212993)
</span><span class="lines">@@ -31,6 +31,7 @@
</span><span class="cx"> #include &quot;SandboxExtension.h&quot;
</span><span class="cx"> #include &lt;WebCore/Credential.h&gt;
</span><span class="cx"> #include &lt;WebCore/FrameLoaderTypes.h&gt;
</span><ins>+#include &lt;WebCore/NetworkLoadMetrics.h&gt;
</ins><span class="cx"> #include &lt;WebCore/ResourceHandleTypes.h&gt;
</span><span class="cx"> #include &lt;WebCore/ResourceLoaderOptions.h&gt;
</span><span class="cx"> #include &lt;WebCore/ResourceRequest.h&gt;
</span><span class="lines">@@ -63,11 +64,17 @@
</span><span class="cx">     virtual void didReceiveChallenge(const WebCore::AuthenticationChallenge&amp;, ChallengeCompletionHandler&amp;&amp;) = 0;
</span><span class="cx">     virtual void didReceiveResponseNetworkSession(WebCore::ResourceResponse&amp;&amp;, ResponseCompletionHandler&amp;&amp;) = 0;
</span><span class="cx">     virtual void didReceiveData(Ref&lt;WebCore::SharedBuffer&gt;&amp;&amp;) = 0;
</span><del>-    virtual void didCompleteWithError(const WebCore::ResourceError&amp;) = 0;
</del><ins>+    virtual void didCompleteWithError(const WebCore::ResourceError&amp;, const WebCore::NetworkLoadMetrics&amp;) = 0;
</ins><span class="cx">     virtual void didSendData(uint64_t totalBytesSent, uint64_t totalBytesExpectedToSend) = 0;
</span><span class="cx">     virtual void wasBlocked() = 0;
</span><span class="cx">     virtual void cannotShowURL() = 0;
</span><del>-    
</del><ins>+
+    void didCompleteWithError(const WebCore::ResourceError&amp; error)
+    {
+        WebCore::NetworkLoadMetrics emptyMetrics;
+        didCompleteWithError(error, emptyMetrics);
+    }
+
</ins><span class="cx">     virtual ~NetworkDataTaskClient() { }
</span><span class="cx"> };
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebKit2NetworkProcessNetworkLoadcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/NetworkProcess/NetworkLoad.cpp (212992 => 212993)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/NetworkProcess/NetworkLoad.cpp        2017-02-25 04:54:36 UTC (rev 212992)
+++ trunk/Source/WebKit2/NetworkProcess/NetworkLoad.cpp        2017-02-25 05:48:51 UTC (rev 212993)
</span><span class="lines">@@ -199,7 +199,8 @@
</span><span class="cx">     auto redirectCompletionHandler = std::exchange(m_redirectCompletionHandler, nullptr);
</span><span class="cx">     ASSERT(redirectCompletionHandler);
</span><span class="cx">     if (m_currentRequest.isNull()) {
</span><del>-        didCompleteWithError(cancelledError(m_currentRequest));
</del><ins>+        NetworkLoadMetrics emptyMetrics;
+        didCompleteWithError(cancelledError(m_currentRequest), emptyMetrics);
</ins><span class="cx">         if (redirectCompletionHandler)
</span><span class="cx">             redirectCompletionHandler({ });
</span><span class="cx">         return;
</span><span class="lines">@@ -408,7 +409,7 @@
</span><span class="cx">     m_client.get().didReceiveBuffer(WTFMove(buffer), size);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void NetworkLoad::didCompleteWithError(const ResourceError&amp; error)
</del><ins>+void NetworkLoad::didCompleteWithError(const ResourceError&amp; error, const WebCore::NetworkLoadMetrics&amp; networkLoadMetrics)
</ins><span class="cx"> {
</span><span class="cx">     ASSERT(!m_throttle);
</span><span class="cx"> 
</span><span class="lines">@@ -418,7 +419,7 @@
</span><span class="cx"> #endif
</span><span class="cx"> 
</span><span class="cx">     if (error.isNull())
</span><del>-        m_client.get().didFinishLoading(WTF::monotonicallyIncreasingTime());
</del><ins>+        m_client.get().didFinishLoading(networkLoadMetrics);
</ins><span class="cx">     else
</span><span class="cx">         m_client.get().didFailLoading(error);
</span><span class="cx"> }
</span><span class="lines">@@ -469,10 +470,11 @@
</span><span class="cx">     m_client.get().didReceiveBuffer(WTFMove(buffer), reportedEncodedDataLength);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void NetworkLoad::didFinishLoading(ResourceHandle* handle, double finishTime)
</del><ins>+void NetworkLoad::didFinishLoading(ResourceHandle* handle)
</ins><span class="cx"> {
</span><span class="cx">     ASSERT_UNUSED(handle, handle == m_handle);
</span><del>-    m_client.get().didFinishLoading(finishTime);
</del><ins>+    NetworkLoadMetrics emptyMetrics;
+    m_client.get().didFinishLoading(emptyMetrics);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void NetworkLoad::didFail(ResourceHandle* handle, const ResourceError&amp; error)
</span></span></pre></div>
<a id="trunkSourceWebKit2NetworkProcessNetworkLoadh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/NetworkProcess/NetworkLoad.h (212992 => 212993)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/NetworkProcess/NetworkLoad.h        2017-02-25 04:54:36 UTC (rev 212992)
+++ trunk/Source/WebKit2/NetworkProcess/NetworkLoad.h        2017-02-25 05:48:51 UTC (rev 212993)
</span><span class="lines">@@ -118,7 +118,7 @@
</span><span class="cx">     void didReceiveResponseAsync(WebCore::ResourceHandle*, WebCore::ResourceResponse&amp;&amp;) final;
</span><span class="cx">     void didReceiveData(WebCore::ResourceHandle*, const char*, unsigned, int encodedDataLength) final;
</span><span class="cx">     void didReceiveBuffer(WebCore::ResourceHandle*, Ref&lt;WebCore::SharedBuffer&gt;&amp;&amp;, int reportedEncodedDataLength) final;
</span><del>-    void didFinishLoading(WebCore::ResourceHandle*, double finishTime) final;
</del><ins>+    void didFinishLoading(WebCore::ResourceHandle*) final;
</ins><span class="cx">     void didFail(WebCore::ResourceHandle*, const WebCore::ResourceError&amp;) final;
</span><span class="cx">     void wasBlocked(WebCore::ResourceHandle*) final;
</span><span class="cx">     void cannotShowURL(WebCore::ResourceHandle*) final;
</span><span class="lines">@@ -133,7 +133,7 @@
</span><span class="cx">     void didReceiveChallenge(const WebCore::AuthenticationChallenge&amp;, ChallengeCompletionHandler&amp;&amp;) final;
</span><span class="cx">     void didReceiveResponseNetworkSession(WebCore::ResourceResponse&amp;&amp;, ResponseCompletionHandler&amp;&amp;) final;
</span><span class="cx">     void didReceiveData(Ref&lt;WebCore::SharedBuffer&gt;&amp;&amp;) final;
</span><del>-    void didCompleteWithError(const WebCore::ResourceError&amp;) final;
</del><ins>+    void didCompleteWithError(const WebCore::ResourceError&amp;, const WebCore::NetworkLoadMetrics&amp;) final;
</ins><span class="cx">     void didSendData(uint64_t totalBytesSent, uint64_t totalBytesExpectedToSend) final;
</span><span class="cx">     void wasBlocked() final;
</span><span class="cx">     void cannotShowURL() final;
</span></span></pre></div>
<a id="trunkSourceWebKit2NetworkProcessNetworkLoadClienth"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/NetworkProcess/NetworkLoadClient.h (212992 => 212993)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/NetworkProcess/NetworkLoadClient.h        2017-02-25 04:54:36 UTC (rev 212992)
+++ trunk/Source/WebKit2/NetworkProcess/NetworkLoadClient.h        2017-02-25 05:48:51 UTC (rev 212993)
</span><span class="lines">@@ -35,6 +35,7 @@
</span><span class="cx"> #endif
</span><span class="cx"> 
</span><span class="cx"> namespace WebCore {
</span><ins>+class NetworkLoadMetrics;
</ins><span class="cx"> class ProtectionSpace;
</span><span class="cx"> class SharedBuffer;
</span><span class="cx"> }
</span><span class="lines">@@ -55,7 +56,7 @@
</span><span class="cx">     enum class ShouldContinueDidReceiveResponse { No, Yes };
</span><span class="cx">     virtual ShouldContinueDidReceiveResponse didReceiveResponse(WebCore::ResourceResponse&amp;&amp;) = 0;
</span><span class="cx">     virtual void didReceiveBuffer(Ref&lt;WebCore::SharedBuffer&gt;&amp;&amp;, int reportedEncodedDataLength) = 0;
</span><del>-    virtual void didFinishLoading(double finishTime) = 0;
</del><ins>+    virtual void didFinishLoading(const WebCore::NetworkLoadMetrics&amp;) = 0;
</ins><span class="cx">     virtual void didFailLoading(const WebCore::ResourceError&amp;) = 0;
</span><span class="cx"> };
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebKit2NetworkProcessNetworkResourceLoadercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/NetworkProcess/NetworkResourceLoader.cpp (212992 => 212993)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/NetworkProcess/NetworkResourceLoader.cpp        2017-02-25 04:54:36 UTC (rev 212992)
+++ trunk/Source/WebKit2/NetworkProcess/NetworkResourceLoader.cpp        2017-02-25 05:48:51 UTC (rev 212993)
</span><span class="lines">@@ -42,6 +42,7 @@
</span><span class="cx"> #include &lt;WebCore/CertificateInfo.h&gt;
</span><span class="cx"> #include &lt;WebCore/DiagnosticLoggingKeys.h&gt;
</span><span class="cx"> #include &lt;WebCore/HTTPHeaderNames.h&gt;
</span><ins>+#include &lt;WebCore/NetworkLoadMetrics.h&gt;
</ins><span class="cx"> #include &lt;WebCore/ProtectionSpace.h&gt;
</span><span class="cx"> #include &lt;WebCore/SharedBuffer.h&gt;
</span><span class="cx"> #include &lt;WebCore/SynchronousLoaderClient.h&gt;
</span><span class="lines">@@ -390,7 +391,7 @@
</span><span class="cx">     sendBuffer(buffer, encodedDataLength);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void NetworkResourceLoader::didFinishLoading(double finishTime)
</del><ins>+void NetworkResourceLoader::didFinishLoading(const NetworkLoadMetrics&amp; networkLoadMetrics)
</ins><span class="cx"> {
</span><span class="cx">     RELEASE_LOG_IF_ALLOWED(&quot;didFinishLoading: (pageID = %&quot; PRIu64 &quot;, frameID = %&quot; PRIu64 &quot;, resourceID = %&quot; PRIu64 &quot;)&quot;, m_parameters.webPageID, m_parameters.webFrameID, m_parameters.identifier);
</span><span class="cx"> 
</span><span class="lines">@@ -411,7 +412,7 @@
</span><span class="cx">             // FIXME: Pass a real value or remove the encoded data size feature.
</span><span class="cx">             sendBuffer(*m_bufferedData, -1);
</span><span class="cx">         }
</span><del>-        send(Messages::WebResourceLoader::DidFinishResourceLoad(finishTime));
</del><ins>+        send(Messages::WebResourceLoader::DidFinishResourceLoad(networkLoadMetrics));
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx"> #if ENABLE(NETWORK_CACHE)
</span><span class="lines">@@ -606,13 +607,16 @@
</span><span class="cx"> {
</span><span class="cx"> #if ENABLE(SHAREABLE_RESOURCE)
</span><span class="cx">     if (!entry-&gt;shareableResourceHandle().isNull()) {
</span><del>-        send(Messages::WebResourceLoader::DidReceiveResource(entry-&gt;shareableResourceHandle(), currentTime()));
</del><ins>+        send(Messages::WebResourceLoader::DidReceiveResource(entry-&gt;shareableResourceHandle()));
</ins><span class="cx">         return;
</span><span class="cx">     }
</span><span class="cx"> #endif
</span><span class="cx"> 
</span><ins>+    WebCore::NetworkLoadMetrics networkLoadMetrics;
+    networkLoadMetrics.markComplete();
+
</ins><span class="cx">     sendBuffer(*entry-&gt;buffer(), entry-&gt;buffer()-&gt;size());
</span><del>-    send(Messages::WebResourceLoader::DidFinishResourceLoad(currentTime()));
</del><ins>+    send(Messages::WebResourceLoader::DidFinishResourceLoad(networkLoadMetrics));
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void NetworkResourceLoader::validateCacheEntry(std::unique_ptr&lt;NetworkCache::Entry&gt; entry)
</span></span></pre></div>
<a id="trunkSourceWebKit2NetworkProcessNetworkResourceLoaderh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/NetworkProcess/NetworkResourceLoader.h (212992 => 212993)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/NetworkProcess/NetworkResourceLoader.h        2017-02-25 04:54:36 UTC (rev 212992)
+++ trunk/Source/WebKit2/NetworkProcess/NetworkResourceLoader.h        2017-02-25 05:48:51 UTC (rev 212993)
</span><span class="lines">@@ -94,7 +94,7 @@
</span><span class="cx">     void willSendRedirectedRequest(WebCore::ResourceRequest&amp;&amp;, WebCore::ResourceRequest&amp;&amp; redirectRequest, WebCore::ResourceResponse&amp;&amp;) override;
</span><span class="cx">     ShouldContinueDidReceiveResponse didReceiveResponse(WebCore::ResourceResponse&amp;&amp;) override;
</span><span class="cx">     void didReceiveBuffer(Ref&lt;WebCore::SharedBuffer&gt;&amp;&amp;, int reportedEncodedDataLength) override;
</span><del>-    void didFinishLoading(double finishTime) override;
</del><ins>+    void didFinishLoading(const WebCore::NetworkLoadMetrics&amp;) override;
</ins><span class="cx">     void didFailLoading(const WebCore::ResourceError&amp;) override;
</span><span class="cx"> 
</span><span class="cx">     void convertToDownload(DownloadID, const WebCore::ResourceRequest&amp;, const WebCore::ResourceResponse&amp;);
</span></span></pre></div>
<a id="trunkSourceWebKit2NetworkProcessPingLoadh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/NetworkProcess/PingLoad.h (212992 => 212993)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/NetworkProcess/PingLoad.h        2017-02-25 04:54:36 UTC (rev 212992)
+++ trunk/Source/WebKit2/NetworkProcess/PingLoad.h        2017-02-25 05:48:51 UTC (rev 212993)
</span><span class="lines">@@ -65,7 +65,7 @@
</span><span class="cx">         delete this;
</span><span class="cx">     }
</span><span class="cx">     void didReceiveData(Ref&lt;WebCore::SharedBuffer&gt;&amp;&amp;) final { ASSERT_NOT_REACHED(); }
</span><del>-    void didCompleteWithError(const WebCore::ResourceError&amp;) final { delete this; }
</del><ins>+    void didCompleteWithError(const WebCore::ResourceError&amp;, const WebCore::NetworkLoadMetrics&amp;) final { delete this; }
</ins><span class="cx">     void didSendData(uint64_t totalBytesSent, uint64_t totalBytesExpectedToSend) final { }
</span><span class="cx">     void wasBlocked() final { delete this; }
</span><span class="cx">     void cannotShowURL() final { delete this; }
</span></span></pre></div>
<a id="trunkSourceWebKit2NetworkProcesscacheNetworkCacheSpeculativeLoadcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/NetworkProcess/cache/NetworkCacheSpeculativeLoad.cpp (212992 => 212993)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/NetworkProcess/cache/NetworkCacheSpeculativeLoad.cpp        2017-02-25 04:54:36 UTC (rev 212992)
+++ trunk/Source/WebKit2/NetworkProcess/cache/NetworkCacheSpeculativeLoad.cpp        2017-02-25 05:48:51 UTC (rev 212993)
</span><span class="lines">@@ -116,7 +116,7 @@
</span><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void SpeculativeLoad::didFinishLoading(double finishTime)
</del><ins>+void SpeculativeLoad::didFinishLoading(const WebCore::NetworkLoadMetrics&amp;)
</ins><span class="cx"> {
</span><span class="cx">     if (m_didComplete)
</span><span class="cx">         return;
</span></span></pre></div>
<a id="trunkSourceWebKit2NetworkProcesscacheNetworkCacheSpeculativeLoadh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/NetworkProcess/cache/NetworkCacheSpeculativeLoad.h (212992 => 212993)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/NetworkProcess/cache/NetworkCacheSpeculativeLoad.h        2017-02-25 04:54:36 UTC (rev 212992)
+++ trunk/Source/WebKit2/NetworkProcess/cache/NetworkCacheSpeculativeLoad.h        2017-02-25 05:48:51 UTC (rev 212993)
</span><span class="lines">@@ -61,7 +61,7 @@
</span><span class="cx">     void willSendRedirectedRequest(WebCore::ResourceRequest&amp;&amp;, WebCore::ResourceRequest&amp;&amp; redirectRequest, WebCore::ResourceResponse&amp;&amp; redirectResponse) override;
</span><span class="cx">     ShouldContinueDidReceiveResponse didReceiveResponse(WebCore::ResourceResponse&amp;&amp;) override;
</span><span class="cx">     void didReceiveBuffer(Ref&lt;WebCore::SharedBuffer&gt;&amp;&amp;, int reportedEncodedDataLength) override;
</span><del>-    void didFinishLoading(double finishTime) override;
</del><ins>+    void didFinishLoading(const WebCore::NetworkLoadMetrics&amp;) override;
</ins><span class="cx">     void didFailLoading(const WebCore::ResourceError&amp;) override;
</span><span class="cx"> 
</span><span class="cx">     void didComplete();
</span></span></pre></div>
<a id="trunkSourceWebKit2NetworkProcesscocoaNetworkDataTaskCocoah"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/NetworkProcess/cocoa/NetworkDataTaskCocoa.h (212992 => 212993)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/NetworkProcess/cocoa/NetworkDataTaskCocoa.h        2017-02-25 04:54:36 UTC (rev 212992)
+++ trunk/Source/WebKit2/NetworkProcess/cocoa/NetworkDataTaskCocoa.h        2017-02-25 05:48:51 UTC (rev 212993)
</span><span class="lines">@@ -28,6 +28,7 @@
</span><span class="cx"> #if USE(NETWORK_SESSION)
</span><span class="cx"> 
</span><span class="cx"> #include &quot;NetworkDataTask.h&quot;
</span><ins>+#include &lt;WebCore/NetworkLoadMetrics.h&gt;
</ins><span class="cx"> #include &lt;wtf/RetainPtr.h&gt;
</span><span class="cx"> 
</span><span class="cx"> OBJC_CLASS NSURLSessionDataTask;
</span><span class="lines">@@ -50,7 +51,7 @@
</span><span class="cx"> 
</span><span class="cx">     void didSendData(uint64_t totalBytesSent, uint64_t totalBytesExpectedToSend);
</span><span class="cx">     void didReceiveChallenge(const WebCore::AuthenticationChallenge&amp;, ChallengeCompletionHandler&amp;&amp;);
</span><del>-    void didCompleteWithError(const WebCore::ResourceError&amp;);
</del><ins>+    void didCompleteWithError(const WebCore::ResourceError&amp;, const WebCore::NetworkLoadMetrics&amp;);
</ins><span class="cx">     void didReceiveData(Ref&lt;WebCore::SharedBuffer&gt;&amp;&amp;);
</span><span class="cx"> 
</span><span class="cx">     void willPerformHTTPRedirection(WebCore::ResourceResponse&amp;&amp;, WebCore::ResourceRequest&amp;&amp;, RedirectCompletionHandler&amp;&amp;);
</span><span class="lines">@@ -67,6 +68,8 @@
</span><span class="cx"> 
</span><span class="cx">     bool allowsSpecificHTTPSCertificateForHost(const WebCore::AuthenticationChallenge&amp;) override;
</span><span class="cx"> 
</span><ins>+    WebCore::NetworkLoadMetrics&amp; networkLoadMetrics() { return m_networkLoadMetrics; }
+
</ins><span class="cx"> private:
</span><span class="cx">     NetworkDataTaskCocoa(NetworkSession&amp;, NetworkDataTaskClient&amp;, const WebCore::ResourceRequest&amp;, WebCore::StoredCredentials, WebCore::ContentSniffingPolicy, bool shouldClearReferrerOnHTTPSToHTTPRedirect);
</span><span class="cx"> 
</span><span class="lines">@@ -74,6 +77,7 @@
</span><span class="cx"> 
</span><span class="cx">     RefPtr&lt;SandboxExtension&gt; m_sandboxExtension;
</span><span class="cx">     RetainPtr&lt;NSURLSessionDataTask&gt; m_task;
</span><ins>+    WebCore::NetworkLoadMetrics m_networkLoadMetrics;
</ins><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> WebCore::Credential serverTrustCredential(const WebCore::AuthenticationChallenge&amp;);
</span></span></pre></div>
<a id="trunkSourceWebKit2NetworkProcesscocoaNetworkDataTaskCocoamm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/NetworkProcess/cocoa/NetworkDataTaskCocoa.mm (212992 => 212993)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/NetworkProcess/cocoa/NetworkDataTaskCocoa.mm        2017-02-25 04:54:36 UTC (rev 212992)
+++ trunk/Source/WebKit2/NetworkProcess/cocoa/NetworkDataTaskCocoa.mm        2017-02-25 05:48:51 UTC (rev 212993)
</span><span class="lines">@@ -150,10 +150,10 @@
</span><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void NetworkDataTaskCocoa::didCompleteWithError(const WebCore::ResourceError&amp; error)
</del><ins>+void NetworkDataTaskCocoa::didCompleteWithError(const WebCore::ResourceError&amp; error, const WebCore::NetworkLoadMetrics&amp; networkLoadMetrics)
</ins><span class="cx"> {
</span><span class="cx">     if (m_client)
</span><del>-        m_client-&gt;didCompleteWithError(error);
</del><ins>+        m_client-&gt;didCompleteWithError(error, networkLoadMetrics);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void NetworkDataTaskCocoa::didReceiveData(Ref&lt;WebCore::SharedBuffer&gt;&amp;&amp; data)
</span></span></pre></div>
<a id="trunkSourceWebKit2NetworkProcesscocoaNetworkSessionCocoah"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/NetworkProcess/cocoa/NetworkSessionCocoa.h (212992 => 212993)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/NetworkProcess/cocoa/NetworkSessionCocoa.h        2017-02-25 04:54:36 UTC (rev 212992)
+++ trunk/Source/WebKit2/NetworkProcess/cocoa/NetworkSessionCocoa.h        2017-02-25 05:48:51 UTC (rev 212993)
</span><span class="lines">@@ -34,6 +34,7 @@
</span><span class="cx"> #include &quot;DownloadID.h&quot;
</span><span class="cx"> #include &quot;NetworkDataTaskCocoa.h&quot;
</span><span class="cx"> #include &quot;NetworkSession.h&quot;
</span><ins>+#include &lt;WebCore/NetworkLoadMetrics.h&gt;
</ins><span class="cx"> #include &lt;wtf/HashMap.h&gt;
</span><span class="cx"> 
</span><span class="cx"> namespace WebKit {
</span></span></pre></div>
<a id="trunkSourceWebKit2NetworkProcesscocoaNetworkSessionCocoamm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/NetworkProcess/cocoa/NetworkSessionCocoa.mm (212992 => 212993)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/NetworkProcess/cocoa/NetworkSessionCocoa.mm        2017-02-25 04:54:36 UTC (rev 212992)
+++ trunk/Source/WebKit2/NetworkProcess/cocoa/NetworkSessionCocoa.mm        2017-02-25 05:48:51 UTC (rev 212993)
</span><span class="lines">@@ -41,7 +41,6 @@
</span><span class="cx"> #import &lt;WebCore/CFNetworkSPI.h&gt;
</span><span class="cx"> #import &lt;WebCore/Credential.h&gt;
</span><span class="cx"> #import &lt;WebCore/FrameLoaderTypes.h&gt;
</span><del>-#import &lt;WebCore/NetworkLoadTiming.h&gt;
</del><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><span class="lines">@@ -242,7 +241,7 @@
</span><span class="cx">     LOG(NetworkSession, &quot;%llu didCompleteWithError %@&quot;, task.taskIdentifier, error);
</span><span class="cx">     auto storedCredentials = _withCredentials ? WebCore::StoredCredentials::AllowStoredCredentials : WebCore::StoredCredentials::DoNotAllowStoredCredentials;
</span><span class="cx">     if (auto* networkDataTask = _session-&gt;dataTaskForIdentifier(task.taskIdentifier, storedCredentials))
</span><del>-        networkDataTask-&gt;didCompleteWithError(error);
</del><ins>+        networkDataTask-&gt;didCompleteWithError(error, networkDataTask-&gt;networkLoadMetrics());
</ins><span class="cx">     else if (error) {
</span><span class="cx">         auto downloadID = _session-&gt;takeDownloadID(task.taskIdentifier);
</span><span class="cx">         if (downloadID.downloadID()) {
</span><span class="lines">@@ -262,6 +261,39 @@
</span><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+- (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didFinishCollectingMetrics:(NSURLSessionTaskMetrics *)metrics
+{
+    if (!_session)
+        return;
+
+    LOG(NetworkSession, &quot;%llu didFinishCollectingMetrics&quot;, task.taskIdentifier);
+    auto storedCredentials = _withCredentials ? WebCore::StoredCredentials::AllowStoredCredentials : WebCore::StoredCredentials::DoNotAllowStoredCredentials;
+    if (auto* networkDataTask = _session-&gt;dataTaskForIdentifier(task.taskIdentifier, storedCredentials)) {
+        NSURLSessionTaskTransactionMetrics *m = metrics.transactionMetrics.lastObject;
+        NSDate *fetchStartDate = m.fetchStartDate;
+        NSTimeInterval domainLookupStartInterval = m.domainLookupStartDate ? [m.domainLookupStartDate timeIntervalSinceDate:fetchStartDate] : -1;
+        NSTimeInterval domainLookupEndInterval = m.domainLookupEndDate ? [m.domainLookupEndDate timeIntervalSinceDate:fetchStartDate] : -1;
+        NSTimeInterval connectStartInterval = m.connectStartDate ? [m.connectStartDate timeIntervalSinceDate:fetchStartDate] : -1;
+        NSTimeInterval secureConnectionStartInterval = m.secureConnectionStartDate ? [m.secureConnectionStartDate timeIntervalSinceDate:fetchStartDate] : -1;
+        NSTimeInterval connectEndInterval = m.connectEndDate ? [m.connectEndDate timeIntervalSinceDate:fetchStartDate] : -1;
+        NSTimeInterval requestStartInterval = [m.requestStartDate timeIntervalSinceDate:fetchStartDate];
+        NSTimeInterval responseStartInterval = [m.responseStartDate timeIntervalSinceDate:fetchStartDate];
+        NSTimeInterval responseEndInterval = [m.responseEndDate timeIntervalSinceDate:fetchStartDate];
+
+        auto&amp; networkLoadMetrics = networkDataTask-&gt;networkLoadMetrics();
+        networkLoadMetrics.domainLookupStart = Seconds(domainLookupStartInterval);
+        networkLoadMetrics.domainLookupEnd = Seconds(domainLookupEndInterval);
+        networkLoadMetrics.connectStart = Seconds(connectStartInterval);
+        networkLoadMetrics.secureConnectionStart = Seconds(secureConnectionStartInterval);
+        networkLoadMetrics.connectEnd = Seconds(connectEndInterval);
+        networkLoadMetrics.requestStart = Seconds(requestStartInterval);
+        networkLoadMetrics.responseStart = Seconds(responseStartInterval);
+        networkLoadMetrics.responseEnd = Seconds(responseEndInterval);
+        networkLoadMetrics.markComplete();
+        networkLoadMetrics.protocol = String(m.networkProtocolName);
+    }
+}
+
</ins><span class="cx"> - (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveResponse:(NSURLResponse *)response completionHandler:(void (^)(NSURLSessionResponseDisposition disposition))completionHandler
</span><span class="cx"> {
</span><span class="cx">     if (!_session) {
</span><span class="lines">@@ -287,7 +319,10 @@
</span><span class="cx">         // all the fields when sending the response to the WebContent process over IPC.
</span><span class="cx">         resourceResponse.disableLazyInitialization();
</span><span class="cx"> 
</span><del>-        copyTimingData([dataTask _timingData], resourceResponse.networkLoadTiming());
</del><ins>+        // FIXME: This cannot be eliminated until other code no longer relies on ResourceResponse's
+        // NetworkLoadMetrics. For example, PerformanceTiming.
+        copyTimingData([dataTask _timingData], resourceResponse.deprecatedNetworkLoadMetrics());
+
</ins><span class="cx">         auto completionHandlerCopy = Block_copy(completionHandler);
</span><span class="cx">         networkDataTask-&gt;didReceiveResponse(WTFMove(resourceResponse), [completionHandlerCopy, taskIdentifier](WebCore::PolicyAction policyAction) {
</span><span class="cx">             LOG(NetworkSession, &quot;%llu didReceiveResponse completionHandler (%d)&quot;, taskIdentifier, policyAction);
</span></span></pre></div>
<a id="trunkSourceWebKit2NetworkProcesssoupNetworkDataTaskSoupcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/NetworkProcess/soup/NetworkDataTaskSoup.cpp (212992 => 212993)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/NetworkProcess/soup/NetworkDataTaskSoup.cpp        2017-02-25 04:54:36 UTC (rev 212992)
+++ trunk/Source/WebKit2/NetworkProcess/soup/NetworkDataTaskSoup.cpp        2017-02-25 05:48:51 UTC (rev 212993)
</span><span class="lines">@@ -60,7 +60,7 @@
</span><span class="cx">     auto request = requestWithCredentials;
</span><span class="cx">     if (request.url().protocolIsInHTTPFamily()) {
</span><span class="cx"> #if ENABLE(WEB_TIMING)
</span><del>-        m_startTime = monotonicallyIncreasingTimeMS();
</del><ins>+        m_startTime = MonotonicTime::now();
</ins><span class="cx"> #endif
</span><span class="cx">         auto url = request.url();
</span><span class="cx">         if (m_storedCredentials == AllowStoredCredentials) {
</span><span class="lines">@@ -283,7 +283,7 @@
</span><span class="cx"> 
</span><span class="cx">     RefPtr&lt;NetworkDataTaskSoup&gt; protectedThis(this);
</span><span class="cx">     invalidateAndCancel();
</span><del>-    m_client-&gt;didCompleteWithError(ResourceError::timeoutError(m_firstRequest.url()));
</del><ins>+    dispatchDidCompleteWithError(ResourceError::timeoutError(m_firstRequest.url()));
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void NetworkDataTaskSoup::startTimeout()
</span><span class="lines">@@ -341,7 +341,7 @@
</span><span class="cx">             m_inputStream = WTFMove(inputStream);
</span><span class="cx"> 
</span><span class="cx"> #if ENABLE(WEB_TIMING)
</span><del>-        m_response.networkLoadTiming().responseStart = monotonicallyIncreasingTimeMS() - m_startTime;
</del><ins>+        m_networkLoadMetrics.responseStart = MonotonicTime::now() - m_startTime;
</ins><span class="cx"> #endif
</span><span class="cx">     } else {
</span><span class="cx">         m_response.setURL(m_firstRequest.url());
</span><span class="lines">@@ -362,6 +362,19 @@
</span><span class="cx"> {
</span><span class="cx">     ASSERT(!m_response.isNull());
</span><span class="cx"> 
</span><ins>+#if ENABLE(WEB_TIMING)
+    // FIXME: Remove this once nobody depends on deprecatedNetworkLoadMetrics.
+    NetworkLoadMetrics&amp; deprecatedResponseMetrics = m_response.deprecatedNetworkLoadMetrics();
+    deprecatedResponseMetrics.responseStart = m_networkLoadMetrics.responseStart;
+    deprecatedResponseMetrics.domainLookupStart = m_networkLoadMetrics.domainLookupStart;
+    deprecatedResponseMetrics.domainLookupEnd = m_networkLoadMetrics.domainLookupEnd;
+    deprecatedResponseMetrics.connectStart = m_networkLoadMetrics.connectStart;
+    deprecatedResponseMetrics.secureConnectionStart = m_networkLoadMetrics.secureConnectionStart;
+    deprecatedResponseMetrics.connectEnd = m_networkLoadMetrics.connectEnd;
+    deprecatedResponseMetrics.requestStart = m_networkLoadMetrics.requestStart;
+    deprecatedResponseMetrics.responseStart = m_networkLoadMetrics.responseStart;
+#endif
+
</ins><span class="cx">     didReceiveResponse(ResourceResponse(m_response), [this, protectedThis = makeRef(*this)](PolicyAction policyAction) {
</span><span class="cx">         if (m_state == State::Canceling || m_state == State::Completed) {
</span><span class="cx">             clearRequest();
</span><span class="lines">@@ -388,6 +401,16 @@
</span><span class="cx">     });
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+void NetworkDataTaskSoup::dispatchDidCompleteWithError(const ResourceError&amp; error)
+{
+#if ENABLE(WEB_TIMING)
+    m_networkLoadMetrics.responseEnd = MonotonicTime::now() - m_startTime;
+    m_networkLoadMetrics.markComplete();
+#endif
+
+    m_client-&gt;didCompleteWithError(error, m_networkLoadMetrics);
+}
+
</ins><span class="cx"> void NetworkDataTaskSoup::tlsErrorsChangedCallback(SoupMessage* soupMessage, GParamSpec*, NetworkDataTaskSoup* task)
</span><span class="cx"> {
</span><span class="cx">     if (task-&gt;state() == State::Canceling || task-&gt;state() == State::Completed || !task-&gt;m_client) {
</span><span class="lines">@@ -408,7 +431,7 @@
</span><span class="cx"> 
</span><span class="cx">         RefPtr&lt;NetworkDataTaskSoup&gt; protectedThis(this);
</span><span class="cx">         invalidateAndCancel();
</span><del>-        m_client-&gt;didCompleteWithError(error);
</del><ins>+        dispatchDidCompleteWithError(error);
</ins><span class="cx">     });
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -660,8 +683,10 @@
</span><span class="cx">         auto request = newRequest;
</span><span class="cx">         if (request.url().protocolIsInHTTPFamily()) {
</span><span class="cx"> #if ENABLE(WEB_TIMING)
</span><del>-            if (isCrossOrigin)
-                m_startTime = monotonicallyIncreasingTimeMS();
</del><ins>+            if (isCrossOrigin) {
+                m_startTime = MonotonicTime::now();
+                m_networkLoadMetrics.reset();
+            }
</ins><span class="cx"> #endif
</span><span class="cx">             applyAuthenticationToRequest(request);
</span><span class="cx">         }
</span><span class="lines">@@ -737,7 +762,7 @@
</span><span class="cx"> 
</span><span class="cx">     clearRequest();
</span><span class="cx">     ASSERT(m_client);
</span><del>-    m_client-&gt;didCompleteWithError({ });
</del><ins>+    dispatchDidCompleteWithError({ });
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void NetworkDataTaskSoup::requestNextPartCallback(SoupMultipartInputStream* multipartInputStream, GAsyncResult* result, NetworkDataTaskSoup* task)
</span><span class="lines">@@ -790,7 +815,7 @@
</span><span class="cx">     ASSERT(m_multipartInputStream);
</span><span class="cx">     g_input_stream_close(G_INPUT_STREAM(m_multipartInputStream.get()), nullptr, nullptr);
</span><span class="cx">     clearRequest();
</span><del>-    m_client-&gt;didCompleteWithError({ });
</del><ins>+    dispatchDidCompleteWithError({ });
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void NetworkDataTaskSoup::gotHeadersCallback(SoupMessage* soupMessage, NetworkDataTaskSoup* task)
</span><span class="lines">@@ -974,7 +999,7 @@
</span><span class="cx">     clearRequest();
</span><span class="cx">     cleanDownloadFiles();
</span><span class="cx">     if (m_client)
</span><del>-        m_client-&gt;didCompleteWithError(error);
</del><ins>+        dispatchDidCompleteWithError(error);
</ins><span class="cx">     else {
</span><span class="cx">         auto* download = NetworkProcess::singleton().downloadManager().download(m_pendingDownloadID);
</span><span class="cx">         ASSERT(download);
</span><span class="lines">@@ -1003,7 +1028,7 @@
</span><span class="cx"> 
</span><span class="cx">     clearRequest();
</span><span class="cx">     ASSERT(m_client);
</span><del>-    m_client-&gt;didCompleteWithError(error);
</del><ins>+    dispatchDidCompleteWithError(error);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> #if ENABLE(WEB_TIMING)
</span><span class="lines">@@ -1018,17 +1043,16 @@
</span><span class="cx"> 
</span><span class="cx"> void NetworkDataTaskSoup::networkEvent(GSocketClientEvent event)
</span><span class="cx"> {
</span><del>-    double deltaTime = monotonicallyIncreasingTimeMS() - m_startTime;
-    auto&amp; loadTiming = m_response.networkLoadTiming();
</del><ins>+    Seconds deltaTime = MonotonicTime::now() - m_startTime;
</ins><span class="cx">     switch (event) {
</span><span class="cx">     case G_SOCKET_CLIENT_RESOLVING:
</span><del>-        loadTiming.domainLookupStart = deltaTime;
</del><ins>+        m_networkLoadMetrics.domainLookupStart = deltaTime;
</ins><span class="cx">         break;
</span><span class="cx">     case G_SOCKET_CLIENT_RESOLVED:
</span><del>-        loadTiming.domainLookupEnd = deltaTime;
</del><ins>+        m_networkLoadMetrics.domainLookupEnd = deltaTime;
</ins><span class="cx">         break;
</span><span class="cx">     case G_SOCKET_CLIENT_CONNECTING:
</span><del>-        loadTiming.connectStart = deltaTime;
</del><ins>+        m_networkLoadMetrics.connectStart = deltaTime;
</ins><span class="cx">         break;
</span><span class="cx">     case G_SOCKET_CLIENT_CONNECTED:
</span><span class="cx">         // Web Timing considers that connection time involves dns, proxy &amp; TLS negotiation...
</span><span class="lines">@@ -1039,12 +1063,12 @@
</span><span class="cx">     case G_SOCKET_CLIENT_PROXY_NEGOTIATED:
</span><span class="cx">         break;
</span><span class="cx">     case G_SOCKET_CLIENT_TLS_HANDSHAKING:
</span><del>-        loadTiming.secureConnectionStart = deltaTime;
</del><ins>+        m_networkLoadMetrics.secureConnectionStart = deltaTime;
</ins><span class="cx">         break;
</span><span class="cx">     case G_SOCKET_CLIENT_TLS_HANDSHAKED:
</span><span class="cx">         break;
</span><span class="cx">     case G_SOCKET_CLIENT_COMPLETE:
</span><del>-        loadTiming.connectEnd = deltaTime;
</del><ins>+        m_networkLoadMetrics.connectEnd = deltaTime;
</ins><span class="cx">         break;
</span><span class="cx">     default:
</span><span class="cx">         ASSERT_NOT_REACHED();
</span><span class="lines">@@ -1077,7 +1101,7 @@
</span><span class="cx"> 
</span><span class="cx"> void NetworkDataTaskSoup::didStartRequest()
</span><span class="cx"> {
</span><del>-    m_response.networkLoadTiming().requestStart = monotonicallyIncreasingTimeMS() - m_startTime;
</del><ins>+    m_networkLoadMetrics.requestStart = MonotonicTime::now() - m_startTime;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void NetworkDataTaskSoup::restartedCallback(SoupMessage* soupMessage, NetworkDataTaskSoup* task)
</span><span class="lines">@@ -1093,7 +1117,8 @@
</span><span class="cx"> 
</span><span class="cx"> void NetworkDataTaskSoup::didRestart()
</span><span class="cx"> {
</span><del>-    m_startTime = monotonicallyIncreasingTimeMS();
</del><ins>+    m_startTime = MonotonicTime::now();
+    m_networkLoadMetrics.reset();
</ins><span class="cx"> }
</span><span class="cx"> #endif // ENABLE(WEB_TIMING)
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebKit2NetworkProcesssoupNetworkDataTaskSouph"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/NetworkProcess/soup/NetworkDataTaskSoup.h (212992 => 212993)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/NetworkProcess/soup/NetworkDataTaskSoup.h        2017-02-25 04:54:36 UTC (rev 212992)
+++ trunk/Source/WebKit2/NetworkProcess/soup/NetworkDataTaskSoup.h        2017-02-25 05:48:51 UTC (rev 212993)
</span><span class="lines">@@ -26,6 +26,7 @@
</span><span class="cx"> #pragma once
</span><span class="cx"> 
</span><span class="cx"> #include &quot;NetworkDataTask.h&quot;
</span><ins>+#include &lt;WebCore/NetworkLoadMetrics.h&gt;
</ins><span class="cx"> #include &lt;WebCore/ProtectionSpace.h&gt;
</span><span class="cx"> #include &lt;WebCore/ResourceResponse.h&gt;
</span><span class="cx"> #include &lt;wtf/RunLoop.h&gt;
</span><span class="lines">@@ -63,6 +64,7 @@
</span><span class="cx">     static void sendRequestCallback(SoupRequest*, GAsyncResult*, NetworkDataTaskSoup*);
</span><span class="cx">     void didSendRequest(GRefPtr&lt;GInputStream&gt;&amp;&amp;);
</span><span class="cx">     void dispatchDidReceiveResponse();
</span><ins>+    void dispatchDidCompleteWithError(const WebCore::ResourceError&amp;);
</ins><span class="cx"> 
</span><span class="cx">     static void tlsErrorsChangedCallback(SoupMessage*, GParamSpec*, NetworkDataTaskSoup*);
</span><span class="cx">     void tlsErrorsChanged();
</span><span class="lines">@@ -136,7 +138,8 @@
</span><span class="cx">     GRefPtr&lt;GOutputStream&gt; m_downloadOutputStream;
</span><span class="cx">     bool m_allowOverwriteDownload { false };
</span><span class="cx"> #if ENABLE(WEB_TIMING)
</span><del>-    double m_startTime { 0 };
</del><ins>+    WebCore::NetworkLoadMetrics m_networkLoadMetrics;
+    MonotonicTime m_startTime;
</ins><span class="cx"> #endif
</span><span class="cx">     RunLoop::Timer&lt;NetworkDataTaskSoup&gt; m_timeoutSource;
</span><span class="cx"> };
</span></span></pre></div>
<a id="trunkSourceWebKit2WebProcessNetworkWebResourceLoadercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/WebProcess/Network/WebResourceLoader.cpp (212992 => 212993)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/WebProcess/Network/WebResourceLoader.cpp        2017-02-25 04:54:36 UTC (rev 212992)
+++ trunk/Source/WebKit2/WebProcess/Network/WebResourceLoader.cpp        2017-02-25 05:48:51 UTC (rev 212993)
</span><span class="lines">@@ -143,12 +143,12 @@
</span><span class="cx">     m_coreLoader-&gt;didRetrieveDerivedDataFromCache(type, buffer.get());
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void WebResourceLoader::didFinishResourceLoad(double finishTime)
</del><ins>+void WebResourceLoader::didFinishResourceLoad(const NetworkLoadMetrics&amp; networkLoadMetrics)
</ins><span class="cx"> {
</span><span class="cx">     LOG(Network, &quot;(WebProcess) WebResourceLoader::didFinishResourceLoad for '%s'&quot;, m_coreLoader-&gt;url().string().latin1().data());
</span><span class="cx">     RELEASE_LOG_IF_ALLOWED(&quot;didFinishResourceLoad: (pageID = %&quot; PRIu64 &quot;, frameID = %&quot; PRIu64 &quot;, resourceID = %&quot; PRIu64 &quot;)&quot;, m_trackingParameters.pageID, m_trackingParameters.frameID, m_trackingParameters.resourceID);
</span><span class="cx"> 
</span><del>-    m_coreLoader-&gt;didFinishLoading(finishTime);
</del><ins>+    m_coreLoader-&gt;didFinishLoading(networkLoadMetrics);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void WebResourceLoader::didFailResourceLoad(const ResourceError&amp; error)
</span><span class="lines">@@ -162,7 +162,7 @@
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> #if ENABLE(SHAREABLE_RESOURCE)
</span><del>-void WebResourceLoader::didReceiveResource(const ShareableResource::Handle&amp; handle, double finishTime)
</del><ins>+void WebResourceLoader::didReceiveResource(const ShareableResource::Handle&amp; handle)
</ins><span class="cx"> {
</span><span class="cx">     LOG(Network, &quot;(WebProcess) WebResourceLoader::didReceiveResource for '%s'&quot;, m_coreLoader-&gt;url().string().latin1().data());
</span><span class="cx">     RELEASE_LOG_IF_ALLOWED(&quot;didReceiveResource: (pageID = %&quot; PRIu64 &quot;, frameID = %&quot; PRIu64 &quot;, resourceID = %&quot; PRIu64 &quot;)&quot;, m_trackingParameters.pageID, m_trackingParameters.frameID, m_trackingParameters.resourceID);
</span><span class="lines">@@ -189,7 +189,8 @@
</span><span class="cx">     if (!m_coreLoader)
</span><span class="cx">         return;
</span><span class="cx"> 
</span><del>-    m_coreLoader-&gt;didFinishLoading(finishTime);
</del><ins>+    NetworkLoadMetrics emptyMetrics;
+    m_coreLoader-&gt;didFinishLoading(emptyMetrics);
</ins><span class="cx"> }
</span><span class="cx"> #endif
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebKit2WebProcessNetworkWebResourceLoaderh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/WebProcess/Network/WebResourceLoader.h (212992 => 212993)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/WebProcess/Network/WebResourceLoader.h        2017-02-25 04:54:36 UTC (rev 212992)
+++ trunk/Source/WebKit2/WebProcess/Network/WebResourceLoader.h        2017-02-25 05:48:51 UTC (rev 212993)
</span><span class="lines">@@ -23,8 +23,7 @@
</span><span class="cx">  * THE POSSIBILITY OF SUCH DAMAGE.
</span><span class="cx">  */
</span><span class="cx"> 
</span><del>-#ifndef WebResourceLoader_h
-#define WebResourceLoader_h
</del><ins>+#pragma once
</ins><span class="cx"> 
</span><span class="cx"> #include &quot;Connection.h&quot;
</span><span class="cx"> #include &quot;MessageSender.h&quot;
</span><span class="lines">@@ -37,6 +36,7 @@
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> namespace WebCore {
</span><ins>+class NetworkLoadMetrics;
</ins><span class="cx"> class ResourceError;
</span><span class="cx"> class ResourceLoader;
</span><span class="cx"> class ResourceRequest;
</span><span class="lines">@@ -79,10 +79,10 @@
</span><span class="cx">     void didReceiveResponse(const WebCore::ResourceResponse&amp;, bool needsContinueDidReceiveResponseMessage);
</span><span class="cx">     void didReceiveData(const IPC::DataReference&amp;, int64_t encodedDataLength);
</span><span class="cx">     void didRetrieveDerivedData(const String&amp; type, const IPC::DataReference&amp;);
</span><del>-    void didFinishResourceLoad(double finishTime);
</del><ins>+    void didFinishResourceLoad(const WebCore::NetworkLoadMetrics&amp;);
</ins><span class="cx">     void didFailResourceLoad(const WebCore::ResourceError&amp;);
</span><span class="cx"> #if ENABLE(SHAREABLE_RESOURCE)
</span><del>-    void didReceiveResource(const ShareableResource::Handle&amp;, double finishTime);
</del><ins>+    void didReceiveResource(const ShareableResource::Handle&amp;);
</ins><span class="cx"> #endif
</span><span class="cx"> 
</span><span class="cx">     RefPtr&lt;WebCore::ResourceLoader&gt; m_coreLoader;
</span><span class="lines">@@ -91,5 +91,3 @@
</span><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> } // namespace WebKit
</span><del>-
-#endif // WebResourceLoader_h
</del></span></pre></div>
<a id="trunkSourceWebKit2WebProcessNetworkWebResourceLoadermessagesin"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/WebProcess/Network/WebResourceLoader.messages.in (212992 => 212993)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/WebProcess/Network/WebResourceLoader.messages.in        2017-02-25 04:54:36 UTC (rev 212992)
+++ trunk/Source/WebKit2/WebProcess/Network/WebResourceLoader.messages.in        2017-02-25 05:48:51 UTC (rev 212993)
</span><span class="lines">@@ -25,12 +25,12 @@
</span><span class="cx">     DidSendData(uint64_t bytesSent, uint64_t totalBytesToBeSent)
</span><span class="cx">     DidReceiveResponse(WebCore::ResourceResponse response, bool needsContinueDidReceiveResponseMessage)
</span><span class="cx">     DidReceiveData(IPC::DataReference data, int64_t encodedDataLength)
</span><del>-    DidFinishResourceLoad(double finishTime)
</del><ins>+    DidFinishResourceLoad(WebCore::NetworkLoadMetrics networkLoadMetrics)
</ins><span class="cx">     DidRetrieveDerivedData(String type, IPC::DataReference data)
</span><span class="cx">     DidFailResourceLoad(WebCore::ResourceError error)
</span><span class="cx"> 
</span><span class="cx"> #if ENABLE(SHAREABLE_RESOURCE)
</span><span class="cx">     // DidReceiveResource is for when we have the entire resource data available at once, such as when the resource is cached in memory
</span><del>-    DidReceiveResource(WebKit::ShareableResource::Handle resource, double finishTime)
</del><ins>+    DidReceiveResource(WebKit::ShareableResource::Handle resource)
</ins><span class="cx"> #endif
</span><span class="cx"> }
</span></span></pre>
</div>
</div>

</body>
</html>