blob: 28e04592afd44c3d5d7000f31f8873d5095f81b3 [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_entry_list_impl.h"
#include <algorithm>
#include "cobalt/dom/performance_entry.h"
namespace cobalt {
namespace dom {
namespace {
PerformanceEntryList FilterBufferByNameAndType(
PerformanceEntryList performance_entry_buffer,
const std::string& name,
const base::StringPiece& entry_type) {
// Algorithm for filtering buffers.
// https://www.w3.org/TR/2019/WD-performance-timeline-2-20191024/#filter-buffer-by-name-and-type
// 1. Let the list of entry objects be the empty PerformanceEntryList.
PerformanceEntryList buffer;
// 2. For each PerformanceEntry object (entryObject) in the buffer,
// in chronological order with respect to startTime:
for (const auto& entry : performance_entry_buffer) {
// 2.1 If name is not null and entryObject's name attribute does not
// match name in a case-sensitive manner, go to next entryObject.
bool is_name_not_valid = !name.empty() && name != entry->name();
if (is_name_not_valid) {
continue;
}
// 2.2 If type is not null and entryObject's type attribute does not
// match type in a case-sensitive manner, go to next entryObject.
const PerformanceEntry::EntryType type =
PerformanceEntry::ToEntryTypeEnum(entry_type.as_string());
bool is_entry_type_not_valid = type != PerformanceEntry::kInvalid &&
type != entry->EntryTypeEnum();
if (is_entry_type_not_valid) {
continue;
}
// 2.3 Add entryObject to the list of entry objects.
buffer.push_back(entry);
}
// Sort entry with respect to startTime.
std::sort(buffer.begin(), buffer.end(),
PerformanceEntry::StartTimeCompareLessThan);
// 3. Return the list of entry objects.
return buffer;
}
}
// static
PerformanceEntryList PerformanceEntryListImpl::GetEntries(
PerformanceEntryList performance_entry_buffer) {
std::string empty_name_type;
return FilterBufferByNameAndType(
performance_entry_buffer, empty_name_type, empty_name_type);
}
// static
PerformanceEntryList PerformanceEntryListImpl::GetEntriesByType(
PerformanceEntryList performance_entry_buffer,
const std::string& entry_type) {
std::string empty_name;
return FilterBufferByNameAndType(
performance_entry_buffer, empty_name, entry_type);
}
// static
PerformanceEntryList PerformanceEntryListImpl::GetEntriesByName(
PerformanceEntryList performance_entry_buffer,
const std::string& name,
const base::StringPiece& type) {
if (!type.data()) {
std::string empty_type;
return FilterBufferByNameAndType(
performance_entry_buffer, name, empty_type);
}
return FilterBufferByNameAndType(performance_entry_buffer, name, type);
}
} // namespace dom
} // namespace cobalt