Commit 2cd52230 authored by Charles Vazac's avatar Charles Vazac Committed by Commit Bot

Fix ServerTiming results for resources that fail TAO check

Per spec (https://w3c.github.io/server-timing/#processing-model),
resources that fail the TAO check should return an empty array for
the serverTiming attribute.

Bug: 802321
Change-Id: I0bca0f38f0a975f7c85f4d8837a901bd8475d9b7
Reviewed-on: https://chromium-review.googlesource.com/870990
Commit-Queue: Yoav Weiss <yoav@yoav.ws>
Reviewed-by: default avatarYoav Weiss <yoav@yoav.ws>
Cr-Commit-Position: refs/heads/master@{#530622}
parent ee5ca493
<!DOCTYPE html>
<head>
<meta charset='utf-8' />
<script src="/resources/testharness.js"></script>
<script src='/resources/testharnessreport.js'></script>
<script src="/common/performance-timeline-utils.js"></script>
<script>
setup({explicit_done: true})
const {location: {href}} = document
const urls = {}
urls['same-origin'] = `${href.substring(0, href.lastIndexOf('/'))}/resources/blue.png`
urls['cross-origin'] = urls['same-origin'].replace('://', '://www.')
Object.keys(urls).forEach(function(key) {
const img = document.createElement('img')
img.src = urls[key]
document.getElementsByTagName('script')[0].parentNode.appendChild(img)
})
window.addEventListener('load', function() {
function assertServerTimingEntries(url, expectedEntryCount) {
test_equals(performance.getEntriesByName(url)[0].serverTiming.length,
expectedEntryCount,
`Expected entry count for ${url}: ${expectedEntryCount}`)
}
assertServerTimingEntries(urls['same-origin'], 1)
assertServerTimingEntries(urls['cross-origin'], 0)
done()
})
</script>
</head>
......@@ -150,8 +150,7 @@ PerformanceNavigationTiming* Performance::CreateNavigationTimingInstance() {
if (!info)
return nullptr;
WebVector<WebServerTimingInfo> server_timing =
PerformanceServerTiming::ParseServerTiming(
*info, PerformanceServerTiming::ShouldAllowTimingDetails::Yes);
PerformanceServerTiming::ParseServerTiming(*info);
if (!server_timing.empty())
UseCounter::Count(GetFrame(), WebFeature::kPerformanceServerTiming);
return new PerformanceNavigationTiming(GetFrame(), info, GetTimeOrigin(),
......
......@@ -378,10 +378,9 @@ WebResourceTimingInfo PerformanceBase::GenerateResourceTiming(
result.did_reuse_connection = final_response.ConnectionReused();
result.allow_negative_values = info.NegativeAllowed();
result.server_timing = PerformanceServerTiming::ParseServerTiming(
info, result.allow_timing_details
? PerformanceServerTiming::ShouldAllowTimingDetails::Yes
: PerformanceServerTiming::ShouldAllowTimingDetails::No);
if (result.allow_timing_details) {
result.server_timing = PerformanceServerTiming::ParseServerTiming(info);
}
if (!result.server_timing.empty()) {
UseCounter::Count(&context_for_use_counter,
WebFeature::kPerformanceServerTiming);
......
......@@ -27,8 +27,7 @@ ScriptValue PerformanceServerTiming::toJSONForBinding(
}
WebVector<WebServerTimingInfo> PerformanceServerTiming::ParseServerTiming(
const ResourceTimingInfo& info,
ShouldAllowTimingDetails should_allow_timing_details) {
const ResourceTimingInfo& info) {
WebVector<WebServerTimingInfo> result;
if (RuntimeEnabledFeatures::ServerTimingEnabled()) {
const ResourceResponse& response = info.FinalResponse();
......@@ -36,12 +35,8 @@ WebVector<WebServerTimingInfo> PerformanceServerTiming::ParseServerTiming(
response.HttpHeaderField(HTTPNames::Server_Timing));
result.reserve(headers->size());
for (const auto& header : *headers) {
if (should_allow_timing_details == ShouldAllowTimingDetails::Yes) {
result.emplace_back(header->Name(), header->Duration(),
header->Description());
} else {
result.emplace_back(header->Name(), 0.0, String());
}
result.emplace_back(header->Name(), header->Duration(),
header->Description());
}
}
return result;
......
......@@ -20,11 +20,6 @@ class CORE_EXPORT PerformanceServerTiming final : public ScriptWrappable {
DEFINE_WRAPPERTYPEINFO();
public:
enum class ShouldAllowTimingDetails {
Yes,
No,
};
~PerformanceServerTiming();
const String& name() const { return name_; }
......@@ -32,8 +27,7 @@ class CORE_EXPORT PerformanceServerTiming final : public ScriptWrappable {
const String& description() const { return description_; }
static WebVector<WebServerTimingInfo> ParseServerTiming(
const ResourceTimingInfo&,
ShouldAllowTimingDetails);
const ResourceTimingInfo&);
static HeapVector<Member<PerformanceServerTiming>> FromParsedServerTiming(
const WebVector<WebServerTimingInfo>&);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment