haikuwebkit/Source/WebCore/loader/ServerTiming.h

70 lines
2.4 KiB
C
Raw Permalink Normal View History

Add the PerformanceServerTiming Interface which makes Server-Timing header timing values available to JavaScript running in the browser. https://bugs.webkit.org/show_bug.cgi?id=175569 Patch by Charles Vazac <cvazac@gmail.com> on 2018-05-15 Reviewed by Youenn Fablet. Tests were imported from web-platform-tests: WebKit/LayoutTests/imported/w3c/web-platform-tests/server-timing/* LayoutTests/imported/w3c: * web-platform-tests/server-timing/cross_origin.html: Added. * web-platform-tests/server-timing/navigation_timing_idl.html: Added. * web-platform-tests/server-timing/navigation_timing_idl.https.html: Added. * web-platform-tests/server-timing/resources/blue.png: Added. * web-platform-tests/server-timing/resources/blue.png.sub.headers: Added. * web-platform-tests/server-timing/resources/blue_tao.png: Added. * web-platform-tests/server-timing/resources/blue_tao.png.sub.headers: Added. * web-platform-tests/server-timing/resources/green.png: Added. * web-platform-tests/server-timing/resources/green.png.sub.headers: Added. * web-platform-tests/server-timing/resources/parsing/0.js: Added. * web-platform-tests/server-timing/resources/parsing/0.js.sub.headers: Added. * web-platform-tests/server-timing/resources/parsing/1.js: Added. * web-platform-tests/server-timing/resources/parsing/1.js.sub.headers: Added. * web-platform-tests/server-timing/resources/parsing/10.js: Added. * web-platform-tests/server-timing/resources/parsing/10.js.sub.headers: Added. * web-platform-tests/server-timing/resources/parsing/11.js: Added. * web-platform-tests/server-timing/resources/parsing/11.js.sub.headers: Added. * web-platform-tests/server-timing/resources/parsing/12.js: Added. * web-platform-tests/server-timing/resources/parsing/12.js.sub.headers: Added. * web-platform-tests/server-timing/resources/parsing/13.js: Added. * web-platform-tests/server-timing/resources/parsing/13.js.sub.headers: Added. * web-platform-tests/server-timing/resources/parsing/14.js: Added. * web-platform-tests/server-timing/resources/parsing/14.js.sub.headers: Added. * web-platform-tests/server-timing/resources/parsing/15.js: Added. * web-platform-tests/server-timing/resources/parsing/15.js.sub.headers: Added. * web-platform-tests/server-timing/resources/parsing/16.js: Added. * web-platform-tests/server-timing/resources/parsing/16.js.sub.headers: Added. * web-platform-tests/server-timing/resources/parsing/17.js: Added. * web-platform-tests/server-timing/resources/parsing/17.js.sub.headers: Added. * web-platform-tests/server-timing/resources/parsing/18.js: Added. * web-platform-tests/server-timing/resources/parsing/18.js.sub.headers: Added. * web-platform-tests/server-timing/resources/parsing/19.js: Added. * web-platform-tests/server-timing/resources/parsing/19.js.sub.headers: Added. * web-platform-tests/server-timing/resources/parsing/2.js: Added. * web-platform-tests/server-timing/resources/parsing/2.js.sub.headers: Added. * web-platform-tests/server-timing/resources/parsing/20.js: Added. * web-platform-tests/server-timing/resources/parsing/20.js.sub.headers: Added. * web-platform-tests/server-timing/resources/parsing/21.js: Added. * web-platform-tests/server-timing/resources/parsing/21.js.sub.headers: Added. * web-platform-tests/server-timing/resources/parsing/22.js: Added. * web-platform-tests/server-timing/resources/parsing/22.js.sub.headers: Added. * web-platform-tests/server-timing/resources/parsing/23.js: Added. * web-platform-tests/server-timing/resources/parsing/23.js.sub.headers: Added. * web-platform-tests/server-timing/resources/parsing/24.js: Added. * web-platform-tests/server-timing/resources/parsing/24.js.sub.headers: Added. * web-platform-tests/server-timing/resources/parsing/25.js: Added. * web-platform-tests/server-timing/resources/parsing/25.js.sub.headers: Added. * web-platform-tests/server-timing/resources/parsing/26.js: Added. * web-platform-tests/server-timing/resources/parsing/26.js.sub.headers: Added. * web-platform-tests/server-timing/resources/parsing/27.js: Added. * web-platform-tests/server-timing/resources/parsing/27.js.sub.headers: Added. * web-platform-tests/server-timing/resources/parsing/28.js: Added. * web-platform-tests/server-timing/resources/parsing/28.js.sub.headers: Added. * web-platform-tests/server-timing/resources/parsing/29.js: Added. * web-platform-tests/server-timing/resources/parsing/29.js.sub.headers: Added. * web-platform-tests/server-timing/resources/parsing/3.js: Added. * web-platform-tests/server-timing/resources/parsing/3.js.sub.headers: Added. * web-platform-tests/server-timing/resources/parsing/30.js: Added. * web-platform-tests/server-timing/resources/parsing/30.js.sub.headers: Added. * web-platform-tests/server-timing/resources/parsing/31.js: Added. * web-platform-tests/server-timing/resources/parsing/31.js.sub.headers: Added. * web-platform-tests/server-timing/resources/parsing/32.js: Added. * web-platform-tests/server-timing/resources/parsing/32.js.sub.headers: Added. * web-platform-tests/server-timing/resources/parsing/33.js: Added. * web-platform-tests/server-timing/resources/parsing/33.js.sub.headers: Added. * web-platform-tests/server-timing/resources/parsing/34.js: Added. * web-platform-tests/server-timing/resources/parsing/34.js.sub.headers: Added. * web-platform-tests/server-timing/resources/parsing/35.js: Added. * web-platform-tests/server-timing/resources/parsing/35.js.sub.headers: Added. * web-platform-tests/server-timing/resources/parsing/36.js: Added. * web-platform-tests/server-timing/resources/parsing/36.js.sub.headers: Added. * web-platform-tests/server-timing/resources/parsing/37.js: Added. * web-platform-tests/server-timing/resources/parsing/37.js.sub.headers: Added. * web-platform-tests/server-timing/resources/parsing/38.js: Added. * web-platform-tests/server-timing/resources/parsing/38.js.sub.headers: Added. * web-platform-tests/server-timing/resources/parsing/39.js: Added. * web-platform-tests/server-timing/resources/parsing/39.js.sub.headers: Added. * web-platform-tests/server-timing/resources/parsing/4.js: Added. * web-platform-tests/server-timing/resources/parsing/4.js.sub.headers: Added. * web-platform-tests/server-timing/resources/parsing/40.js: Added. * web-platform-tests/server-timing/resources/parsing/40.js.sub.headers: Added. * web-platform-tests/server-timing/resources/parsing/41.js: Added. * web-platform-tests/server-timing/resources/parsing/41.js.sub.headers: Added. * web-platform-tests/server-timing/resources/parsing/42.js: Added. * web-platform-tests/server-timing/resources/parsing/42.js.sub.headers: Added. * web-platform-tests/server-timing/resources/parsing/43.js: Added. * web-platform-tests/server-timing/resources/parsing/43.js.sub.headers: Added. * web-platform-tests/server-timing/resources/parsing/44.js: Added. * web-platform-tests/server-timing/resources/parsing/44.js.sub.headers: Added. * web-platform-tests/server-timing/resources/parsing/45.js: Added. * web-platform-tests/server-timing/resources/parsing/45.js.sub.headers: Added. * web-platform-tests/server-timing/resources/parsing/46.js: Added. * web-platform-tests/server-timing/resources/parsing/46.js.sub.headers: Added. * web-platform-tests/server-timing/resources/parsing/47.js: Added. * web-platform-tests/server-timing/resources/parsing/47.js.sub.headers: Added. * web-platform-tests/server-timing/resources/parsing/48.js: Added. * web-platform-tests/server-timing/resources/parsing/48.js.sub.headers: Added. * web-platform-tests/server-timing/resources/parsing/49.js: Added. * web-platform-tests/server-timing/resources/parsing/49.js.sub.headers: Added. * web-platform-tests/server-timing/resources/parsing/5.js: Added. * web-platform-tests/server-timing/resources/parsing/5.js.sub.headers: Added. * web-platform-tests/server-timing/resources/parsing/50.js: Added. * web-platform-tests/server-timing/resources/parsing/50.js.sub.headers: Added. * web-platform-tests/server-timing/resources/parsing/51.js: Added. * web-platform-tests/server-timing/resources/parsing/51.js.sub.headers: Added. * web-platform-tests/server-timing/resources/parsing/52.js: Added. * web-platform-tests/server-timing/resources/parsing/52.js.sub.headers: Added. * web-platform-tests/server-timing/resources/parsing/53.js: Added. * web-platform-tests/server-timing/resources/parsing/53.js.sub.headers: Added. * web-platform-tests/server-timing/resources/parsing/54.js: Added. * web-platform-tests/server-timing/resources/parsing/54.js.sub.headers: Added. * web-platform-tests/server-timing/resources/parsing/55.js: Added. * web-platform-tests/server-timing/resources/parsing/55.js.sub.headers: Added. * web-platform-tests/server-timing/resources/parsing/56.js: Added. * web-platform-tests/server-timing/resources/parsing/56.js.sub.headers: Added. * web-platform-tests/server-timing/resources/parsing/57.js: Added. * web-platform-tests/server-timing/resources/parsing/57.js.sub.headers: Added. * web-platform-tests/server-timing/resources/parsing/58.js: Added. * web-platform-tests/server-timing/resources/parsing/58.js.sub.headers: Added. * web-platform-tests/server-timing/resources/parsing/59.js: Added. * web-platform-tests/server-timing/resources/parsing/59.js.sub.headers: Added. * web-platform-tests/server-timing/resources/parsing/6.js: Added. * web-platform-tests/server-timing/resources/parsing/6.js.sub.headers: Added. * web-platform-tests/server-timing/resources/parsing/60.js: Added. * web-platform-tests/server-timing/resources/parsing/60.js.sub.headers: Added. * web-platform-tests/server-timing/resources/parsing/61.js: Added. * web-platform-tests/server-timing/resources/parsing/61.js.sub.headers: Added. * web-platform-tests/server-timing/resources/parsing/62.js: Added. * web-platform-tests/server-timing/resources/parsing/62.js.sub.headers: Added. * web-platform-tests/server-timing/resources/parsing/63.js: Added. * web-platform-tests/server-timing/resources/parsing/63.js.sub.headers: Added. * web-platform-tests/server-timing/resources/parsing/64.js: Added. * web-platform-tests/server-timing/resources/parsing/64.js.sub.headers: Added. * web-platform-tests/server-timing/resources/parsing/65.js: Added. * web-platform-tests/server-timing/resources/parsing/65.js.sub.headers: Added. * web-platform-tests/server-timing/resources/parsing/66.js: Added. * web-platform-tests/server-timing/resources/parsing/66.js.sub.headers: Added. * web-platform-tests/server-timing/resources/parsing/67.js: Added. * web-platform-tests/server-timing/resources/parsing/67.js.sub.headers: Added. * web-platform-tests/server-timing/resources/parsing/68.js: Added. * web-platform-tests/server-timing/resources/parsing/68.js.sub.headers: Added. * web-platform-tests/server-timing/resources/parsing/69.js: Added. * web-platform-tests/server-timing/resources/parsing/69.js.sub.headers: Added. * web-platform-tests/server-timing/resources/parsing/7.js: Added. * web-platform-tests/server-timing/resources/parsing/7.js.sub.headers: Added. * web-platform-tests/server-timing/resources/parsing/70.js: Added. * web-platform-tests/server-timing/resources/parsing/70.js.sub.headers: Added. * web-platform-tests/server-timing/resources/parsing/71.js: Added. * web-platform-tests/server-timing/resources/parsing/71.js.sub.headers: Added. * web-platform-tests/server-timing/resources/parsing/72.js: Added. * web-platform-tests/server-timing/resources/parsing/72.js.sub.headers: Added. * web-platform-tests/server-timing/resources/parsing/73.js: Added. * web-platform-tests/server-timing/resources/parsing/73.js.sub.headers: Added. * web-platform-tests/server-timing/resources/parsing/74.js: Added. * web-platform-tests/server-timing/resources/parsing/74.js.sub.headers: Added. * web-platform-tests/server-timing/resources/parsing/75.js: Added. * web-platform-tests/server-timing/resources/parsing/75.js.sub.headers: Added. * web-platform-tests/server-timing/resources/parsing/76.js: Added. * web-platform-tests/server-timing/resources/parsing/76.js.sub.headers: Added. * web-platform-tests/server-timing/resources/parsing/77.js: Added. * web-platform-tests/server-timing/resources/parsing/77.js.sub.headers: Added. * web-platform-tests/server-timing/resources/parsing/78.js: Added. * web-platform-tests/server-timing/resources/parsing/78.js.sub.headers: Added. * web-platform-tests/server-timing/resources/parsing/79.js: Added. * web-platform-tests/server-timing/resources/parsing/79.js.sub.headers: Added. * web-platform-tests/server-timing/resources/parsing/8.js: Added. * web-platform-tests/server-timing/resources/parsing/8.js.sub.headers: Added. * web-platform-tests/server-timing/resources/parsing/80.js: Added. * web-platform-tests/server-timing/resources/parsing/80.js.sub.headers: Added. * web-platform-tests/server-timing/resources/parsing/81.js: Added. * web-platform-tests/server-timing/resources/parsing/81.js.sub.headers: Added. * web-platform-tests/server-timing/resources/parsing/82.js: Added. * web-platform-tests/server-timing/resources/parsing/82.js.sub.headers: Added. * web-platform-tests/server-timing/resources/parsing/83.js: Added. * web-platform-tests/server-timing/resources/parsing/83.js.sub.headers: Added. * web-platform-tests/server-timing/resources/parsing/9.js: Added. * web-platform-tests/server-timing/resources/parsing/9.js.sub.headers: Added. * web-platform-tests/server-timing/resources/parsing/w3c-import.log: Added. * web-platform-tests/server-timing/resources/w3c-import.log: Added. * web-platform-tests/server-timing/resource_timing_idl.html: Added. * web-platform-tests/server-timing/resource_timing_idl.https.html: Added. * web-platform-tests/server-timing/server_timing_header-parsing.html: Added. * web-platform-tests/server-timing/server_timing_header-parsing.https.html: Added. * web-platform-tests/server-timing/test_server_timing.html: Added. * web-platform-tests/server-timing/test_server_timing.html.sub.headers: Added. * web-platform-tests/server-timing/test_server_timing.https.html: Added. * web-platform-tests/server-timing/test_server_timing.https.html.sub.headers: Added. * web-platform-tests/server-timing/w3c-import.log: Added. Source/WebCore: * Sources.txt: Added references to HeaderFieldTokenizer.cpp, ServerTiming.cpp, and ServerTimingParser.cpp. * WebCore.xcodeproj/project.pbxproj: Added various files. * loader/HeaderFieldTokenizer.cpp: Added. (WebCore::HeaderFieldTokenizer::HeaderFieldTokenizer): Added class for tokenizing header values. (WebCore::HeaderFieldTokenizer::consume): Added method to consume a specified character. (WebCore::HeaderFieldTokenizer::consumeQuotedString): Added method to consume a quote-string. (WebCore::HeaderFieldTokenizer::consumeToken): Added a method to consume a token. (WebCore::HeaderFieldTokenizer::consumeTokenOrQuotedString): Added method to consume a quote-string or quote-string, depending on net character. (WebCore::HeaderFieldTokenizer::skipSpaces): Added method to skip whitespace. (WebCore::HeaderFieldTokenizer::consumeBeforeAnyCharMatch): Added method to advance the cursor up until any of a list of characters. * loader/HeaderFieldTokenizer.h: Added. * loader/HTTPHeaderField.cpp: Expose isTokenCharacter and isWhitespace. * loader/HTTPHeaderField.h: Expose isTokenCharacter and isWhitespace. * loader/PolicyChecker.cpp: Added #include so source compiled on my machine. * loader/ResourceTiming.cpp: (WebCore::ResourceTiming::ResourceTiming): Added call to initServerTiming to parse the header. (WebCore::ResourceTiming::initServerTiming): Added method to parse the header. (WebCore::ResourceTiming::populateServerTiming): Added method to populate the server timing entries on a PerformanceResourceTiming object. (WebCore::ResourceTiming::isolatedCopy const): Added code to copy over the server timing entries. * loader/ResourceTiming.h: (WebCore::ResourceTiming::ResourceTiming): Accept collection of server timing entries in c'tor. * loader/ServerTiming.cpp: Added. (WebCore::ServerTiming::setParameter): Set named parameters, ignoring unrecognized or duplicates. (WebCore::ServerTiming::isolatedCopy const): Return a new pointer to the object. * loader/ServerTiming.h: Added. (WebCore::ServerTiming::ServerTiming): Added struct for the data needed by a server timing entry. (WebCore::ServerTiming::name const): Added name field of a server timing entry. (WebCore::ServerTiming::duration const): Added duration field of a server timing entry. (WebCore::ServerTiming::description const): Added description field of a server timing entry. * loader/ServerTimingParser.cpp: Added. (WebCore::ServerTimingParser::parseServerTiming): Parses the header generating a collection of server timing structs. * loader/ServerTimingParser.h: Added. * loader/WorkerThreadableLoader.h: Fix build. * page/Performance.cpp: (WebCore::Performance::addResourceTiming): Fixed a typo. * page/PerformanceResourceTiming.cpp: (WebCore::PerformanceResourceTiming::PerformanceResourceTiming): Given a ResourceTiming object, populate our collection of PerformanceServerTiming objects. * page/PerformanceResourceTiming.h: Added serverTiming member and getter. * page/PerformanceResourceTiming.idl: Added serverTiming member to interface. * platform/network/HTTPHeaderNames.in: Added "Server-Timing" to the header enum. * platform/network/ResourceResponseBase.cpp: Added "Server-Timing" to isSafeCrossOriginResponseHeader whitelist. LayoutTests: * imported/w3c/web-platform-tests/server-timing/cross_origin-expected.txt: Added. * imported/w3c/web-platform-tests/server-timing/resource_timing_idl-expected.txt: Added. * imported/w3c/web-platform-tests/server-timing/resource_timing_idl.https-expected.txt: Added. * imported/w3c/web-platform-tests/server-timing/server_timing_header-parsing-expected.txt: Added. * imported/w3c/web-platform-tests/server-timing/server_timing_header-parsing.https-expected.txt: Added. Canonical link: https://commits.webkit.org/201126@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@231813 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2018-05-15 19:24:30 +00:00
/*
* Copyright (C) 2018 Akamai Technologies 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. AND ITS CONTRIBUTORS ``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 ITS 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 <wtf/text/WTFString.h>
namespace WebCore {
struct ServerTiming {
String name;
double duration = 0;
String description;
bool durationSet = false;
bool descriptionSet = false;
ServerTiming(String&& name);
ServerTiming(String&& name, double duration, String&& description);
ServerTiming(String&& name, double duration, String&& description, bool durationSet, bool descriptionSet);
void setParameter(const String&, const String&);
ServerTiming isolatedCopy() const;
};
inline ServerTiming::ServerTiming(String&& name)
: name(WTFMove(name))
{
}
inline ServerTiming::ServerTiming(String&& name, double duration, String&& description)
: name(WTFMove(name))
, duration(duration)
, description(WTFMove(description))
{
}
inline ServerTiming::ServerTiming(String&& name, double duration, String&& description, bool durationSet, bool descriptionSet)
: name(WTFMove(name))
, duration(duration)
, description(WTFMove(description))
, durationSet(durationSet)
, descriptionSet(descriptionSet)
{
}
} // namespace WebCore