source: webkit/trunk/Source/WebCore/loader/HeaderFieldTokenizer.cpp

Last change on this file was 231813, checked in by [email protected], 7 years ago

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 <[email protected]> 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.
File size: 3.4 KB
Line 
1/*
2 * Copyright 2017 The Chromium Authors. All rights reserved.
3 * Copyright (C) 2018 Akamai Technologies Inc. All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright
11 * notice, this list of conditions and the following disclaimer in the
12 * documentation and/or other materials provided with the distribution.
13 *
14 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
15 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
16 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
17 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
18 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
19 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
20 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
21 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
22 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
23 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
24 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25 */
26
27#include "config.h"
28#include "HeaderFieldTokenizer.h"
29
30#include "HTTPHeaderField.h"
31#include <wtf/text/StringBuilder.h>
32
33namespace WebCore {
34
35HeaderFieldTokenizer::HeaderFieldTokenizer(const String& headerField)
36 : m_input(headerField)
37{
38 skipSpaces();
39}
40
41bool HeaderFieldTokenizer::consume(UChar c)
42{
43 ASSERT(c != ' ' && c != '\t');
44
45 if (isConsumed() || m_input[m_index] != c)
46 return false;
47
48 ++m_index;
49 skipSpaces();
50 return true;
51}
52
53String HeaderFieldTokenizer::consumeQuotedString()
54{
55 StringBuilder builder;
56
57 ASSERT(m_input[m_index] == '"');
58 ++m_index;
59
60 while (!isConsumed()) {
61 if (m_input[m_index] == '"') {
62 String output = builder.toString();
63 ++m_index;
64 skipSpaces();
65 return output;
66 }
67 if (m_input[m_index] == '\\') {
68 ++m_index;
69 if (isConsumed())
70 return String();
71 }
72 builder.append(m_input[m_index]);
73 ++m_index;
74 }
75 return String();
76}
77
78String HeaderFieldTokenizer::consumeToken()
79{
80 auto start = m_index;
81 while (!isConsumed() && RFC7230::isTokenCharacter(m_input[m_index]))
82 ++m_index;
83
84 if (start == m_index)
85 return String();
86
87 String output = m_input.substring(start, m_index - start);
88 skipSpaces();
89 return output;
90}
91
92String HeaderFieldTokenizer::consumeTokenOrQuotedString()
93{
94 if (isConsumed())
95 return String();
96
97 if (m_input[m_index] == '"')
98 return consumeQuotedString();
99
100 return consumeToken();
101}
102
103void HeaderFieldTokenizer::skipSpaces()
104{
105 while (!isConsumed() && RFC7230::isWhitespace(m_input[m_index]))
106 ++m_index;
107}
108
109void HeaderFieldTokenizer::consumeBeforeAnyCharMatch(const Vector<UChar>& chars)
110{
111 ASSERT(chars.size() > 0U && chars.size() < 3U);
112
113 while (!isConsumed()) {
114 for (const auto& c : chars) {
115 if (c == m_input[m_index])
116 return;
117 }
118
119 ++m_index;
120 }
121}
122
123} // namespace WebCore
Note: See TracBrowser for help on using the repository browser.