blob: 12cc886e0b8d77e33bf2753d868f36e4e524b3a0 [file] [log] [blame]
/*
* Copyright (C) 2021 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.
*/
#include "config.h"
#include "NetworkLoadMetrics.h"
#include <wtf/NeverDestroyed.h>
namespace WebCore {
NetworkLoadMetrics::NetworkLoadMetrics() = default;
void NetworkLoadMetrics::updateFromFinalMetrics(const NetworkLoadMetrics& other)
{
MonotonicTime originalRedirectStart = redirectStart;
MonotonicTime originalFetchStart = fetchStart;
MonotonicTime originalDomainLookupStart = domainLookupStart;
MonotonicTime originalDomainLookupEnd = domainLookupEnd;
MonotonicTime originalConnectStart = connectStart;
MonotonicTime originalSecureConnectionStart = secureConnectionStart;
MonotonicTime originalConnectEnd = connectEnd;
MonotonicTime originalRequestStart = requestStart;
MonotonicTime originalResponseStart = responseStart;
MonotonicTime originalResponseEnd = responseEnd;
MonotonicTime originalWorkerStart = workerStart;
*this = other;
if (!redirectStart)
redirectStart = originalRedirectStart;
if (!fetchStart)
fetchStart = originalFetchStart;
if (!domainLookupStart)
domainLookupStart = originalDomainLookupStart;
if (!domainLookupEnd)
domainLookupEnd = originalDomainLookupEnd;
if (!connectStart)
connectStart = originalConnectStart;
if (!secureConnectionStart)
secureConnectionStart = originalSecureConnectionStart;
if (!connectEnd)
connectEnd = originalConnectEnd;
if (!requestStart)
requestStart = originalRequestStart;
if (!responseStart)
responseStart = originalResponseStart;
if (!responseEnd)
responseEnd = originalResponseEnd;
if (!workerStart)
workerStart = originalWorkerStart;
if (!responseEnd)
responseEnd = MonotonicTime::now();
complete = true;
}
const NetworkLoadMetrics& NetworkLoadMetrics::emptyMetrics()
{
static NeverDestroyed<NetworkLoadMetrics> metrics;
return metrics.get();
}
Ref<AdditionalNetworkLoadMetricsForWebInspector> AdditionalNetworkLoadMetricsForWebInspector::isolatedCopy()
{
auto copy = AdditionalNetworkLoadMetricsForWebInspector::create();
copy->priority = priority;
copy->remoteAddress = remoteAddress.isolatedCopy();
copy->connectionIdentifier = connectionIdentifier.isolatedCopy();
copy->tlsProtocol = tlsProtocol.isolatedCopy();
copy->tlsCipher = tlsCipher.isolatedCopy();
copy->requestHeaders = requestHeaders.isolatedCopy();
copy->requestHeaderBytesSent = requestHeaderBytesSent;
copy->responseHeaderBytesReceived = responseHeaderBytesReceived;
copy->requestBodyBytesSent = requestBodyBytesSent;
copy->isProxyConnection = isProxyConnection;
return copy;
}
NetworkLoadMetrics NetworkLoadMetrics::isolatedCopy() const
{
NetworkLoadMetrics copy;
copy.redirectStart = redirectStart.isolatedCopy();
copy.fetchStart = fetchStart.isolatedCopy();
copy.domainLookupStart = domainLookupStart.isolatedCopy();
copy.domainLookupEnd = domainLookupEnd.isolatedCopy();
copy.connectStart = connectStart.isolatedCopy();
copy.secureConnectionStart = secureConnectionStart.isolatedCopy();
copy.connectEnd = connectEnd.isolatedCopy();
copy.requestStart = requestStart.isolatedCopy();
copy.responseStart = responseStart.isolatedCopy();
copy.responseEnd = responseEnd.isolatedCopy();
copy.workerStart = workerStart.isolatedCopy();
copy.protocol = protocol.isolatedCopy();
copy.redirectCount = redirectCount;
copy.complete = complete;
copy.cellular = cellular;
copy.expensive = expensive;
copy.constrained = constrained;
copy.multipath = multipath;
copy.isReusedConnection = isReusedConnection;
copy.failsTAOCheck = failsTAOCheck;
copy.hasCrossOriginRedirect = hasCrossOriginRedirect;
copy.privacyStance = privacyStance;
copy.responseBodyBytesReceived = responseBodyBytesReceived;
copy.responseBodyDecodedSize = responseBodyDecodedSize;
if (additionalNetworkLoadMetricsForWebInspector)
copy.additionalNetworkLoadMetricsForWebInspector = additionalNetworkLoadMetricsForWebInspector->isolatedCopy();
return copy;
}
} // namespace WebCore