blob: f3bb1e89a6f6ab02ebf894ddcbba2e84b6d3d0c0 [file] [log] [blame]
// Copyright 2021 The Cobalt Authors. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
#include "cobalt/dom/performance_resource_timing.h"
#include "cobalt/dom/performance.h"
namespace cobalt {
namespace dom {
namespace {
const char kPerformanceResourceTimingCacheMode[] = "local";
const uint64_t kPerformanceResourceTimingHeaderSize = 300;
} // namespace
PerformanceResourceTiming::PerformanceResourceTiming(
const std::string& name, DOMHighResTimeStamp start_time,
DOMHighResTimeStamp end_time)
: PerformanceEntry(name, start_time, end_time) {}
PerformanceResourceTiming::PerformanceResourceTiming(
const net::LoadTimingInfo& timing_info, const std::string& initiator_type,
const std::string& requested_url, Performance* performance,
base::TimeTicks time_origin)
: PerformanceEntry(requested_url,
Performance::MonotonicTimeToDOMHighResTimeStamp(
time_origin, timing_info.request_start),
Performance::MonotonicTimeToDOMHighResTimeStamp(
time_origin, timing_info.receive_headers_end)),
initiator_type_(initiator_type),
cache_mode_(kPerformanceResourceTimingCacheMode),
timing_info_(timing_info),
time_origin_(time_origin),
timing_info_response_end_(performance->Now()) {}
std::string PerformanceResourceTiming::initiator_type() const {
return initiator_type_;
}
DOMHighResTimeStamp PerformanceResourceTiming::fetch_start() const {
if (timing_info_.request_start.is_null()) {
return PerformanceEntry::start_time();
}
return Performance::MonotonicTimeToDOMHighResTimeStamp(
time_origin_, timing_info_.request_start);
}
DOMHighResTimeStamp PerformanceResourceTiming::domain_lookup_start() const {
if (timing_info_.connect_timing.dns_start.is_null()) {
return PerformanceEntry::start_time();
}
return Performance::MonotonicTimeToDOMHighResTimeStamp(
time_origin_, timing_info_.connect_timing.dns_start);
}
DOMHighResTimeStamp PerformanceResourceTiming::domain_lookup_end() const {
if (timing_info_.connect_timing.dns_end.is_null()) {
return PerformanceEntry::start_time();
}
return Performance::MonotonicTimeToDOMHighResTimeStamp(
time_origin_, timing_info_.connect_timing.dns_end);
}
DOMHighResTimeStamp PerformanceResourceTiming::connect_start() const {
if (timing_info_.connect_timing.connect_start.is_null()) {
return PerformanceEntry::start_time();
}
return Performance::MonotonicTimeToDOMHighResTimeStamp(
time_origin_, timing_info_.connect_timing.connect_start);
}
DOMHighResTimeStamp PerformanceResourceTiming::connect_end() const {
if (timing_info_.connect_timing.connect_end.is_null()) {
return PerformanceEntry::start_time();
}
return Performance::MonotonicTimeToDOMHighResTimeStamp(
time_origin_, timing_info_.connect_timing.connect_end);
}
DOMHighResTimeStamp PerformanceResourceTiming::secure_connection_start() const {
if (timing_info_.connect_timing.ssl_start.is_null()) {
return 0.0;
}
return Performance::MonotonicTimeToDOMHighResTimeStamp(
time_origin_, timing_info_.connect_timing.ssl_start);
}
DOMHighResTimeStamp PerformanceResourceTiming::request_start() const {
if (timing_info_.send_start.is_null()) {
return PerformanceEntry::start_time();
}
return Performance::MonotonicTimeToDOMHighResTimeStamp(
time_origin_, timing_info_.send_start);
}
DOMHighResTimeStamp PerformanceResourceTiming::response_start() const {
if (timing_info_.receive_headers_end.is_null()) {
PerformanceEntry::start_time();
}
return Performance::MonotonicTimeToDOMHighResTimeStamp(
time_origin_, timing_info_.receive_headers_end);
}
DOMHighResTimeStamp PerformanceResourceTiming::response_end() const {
return timing_info_response_end_;
}
uint64_t PerformanceResourceTiming::transfer_size() const {
// Cobalt does not support cache mode.
// The transferSize getter steps are to perform the following steps:
// https://www.w3.org/TR/resource-timing-2/#dom-performanceresourcetiming-transfersize
// 1. If this's cache mode is "local", then return 0.
// 2. If this's cache mode is "validated", then return 300.
// 3. Return this's timing info's encoded body size plus 300.
return timing_info_.encoded_body_size + kPerformanceResourceTimingHeaderSize;
}
uint64_t PerformanceResourceTiming::encoded_body_size() const {
return timing_info_.encoded_body_size;
}
void PerformanceResourceTiming::SetResourceTimingEntry(
const net::LoadTimingInfo& timing_info, const std::string& initiator_type,
const std::string& requested_url, const std::string& cache_mode) {
// To setup the resource timing entry for PerformanceResourceTiming entry
// given DOMString initiatorType, DOMString requestedURL, fetch timing info
// timingInfo, and a DOMString cacheMode, perform the following steps:
// https://www.w3.org/TR/2021/WD-resource-timing-2-20210414/#dfn-setup-the-resource-timing-entry
// 1. Assert that cacheMode is the empty string or "local".
DCHECK(cache_mode.empty() || cache_mode == "local");
// 2. Set entry's initiator type to initiatorType.
initiator_type_ = initiator_type;
// 3. Set entry's requested URL to requestedURL.
requested_url_ = requested_url;
// 4. Set entry's timing info to timingInfo.
timing_info_ = timing_info;
// 5. Set entry's cache mode to cacheMode.
cache_mode_ = cache_mode;
}
} // namespace dom
} // namespace cobalt