blob: 6581eff38d573cdf63d760afa7eaf5c5c02994c7 [file] [log] [blame]
// Copyright 2020 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef COMPONENTS_PERFORMANCE_MANAGER_EMBEDDER_GRAPH_FEATURES_H_
#define COMPONENTS_PERFORMANCE_MANAGER_EMBEDDER_GRAPH_FEATURES_H_
#include <cstdint>
#include "base/feature_list.h"
#include "components/performance_manager/public/features.h"
#include "ui/base/device_form_factor.h"
namespace performance_manager {
class Graph;
// A helper for configuring and enabling Graph features. This object is
// constexpr so that it can be easily used with static storage without
// requiring an initializer.
class GraphFeatures {
public:
// Returns a configuration with no graph features. Mostly intended for
// unittests, where tests pick and choose exactly which decorators they want.
static constexpr GraphFeatures WithNone() { return GraphFeatures(); }
// Returns a configuration with the minimal set of graph features required
// for content_shell to work.
static constexpr GraphFeatures WithMinimal() {
return GraphFeatures().EnableMinimal();
}
// Returns a configuration with the default set of graph features shipped
// with a full-featured Chromium browser.
static constexpr GraphFeatures WithDefault() {
return GraphFeatures().EnableDefault();
}
// Helper for housing the actual configuration data.
union Flags {
uint32_t flags;
struct {
// When adding new features here, the following also needs to happen:
// (1) Add a corresponding EnableFeatureFoo() member function.
// (2) Add the feature to EnableDefault() if necessary.
// (3) Add the feature to the implementation of ConfigureGraph().
bool frame_visibility_decorator : 1;
bool frozen_frame_aggregator : 1;
bool important_frame_decorator : 1;
bool metrics_collector : 1;
bool node_impl_describers : 1;
bool page_aggregator : 1;
bool page_load_tracker_decorator : 1;
bool performance_scenarios : 1;
bool priority_tracking : 1;
bool process_hosted_content_types_aggregator : 1;
bool resource_attribution_scheduler : 1;
bool site_data_recorder : 1;
bool tab_page_decorator : 1;
bool v8_context_tracker : 1;
};
};
constexpr GraphFeatures() = default;
constexpr GraphFeatures(const GraphFeatures& other) = default;
GraphFeatures& operator=(const GraphFeatures& other) = default;
constexpr GraphFeatures& EnableFrameVisibilityDecorator() {
flags_.frame_visibility_decorator = true;
return *this;
}
constexpr GraphFeatures& EnableFrozenFrameAggregator() {
flags_.frozen_frame_aggregator = true;
return *this;
}
constexpr GraphFeatures& EnableImportantFrameDecorator() {
flags_.important_frame_decorator = true;
return *this;
}
constexpr GraphFeatures& EnablePerformanceScenarios() {
flags_.performance_scenarios = true;
return *this;
}
constexpr GraphFeatures& EnableMetricsCollector() {
flags_.metrics_collector = true;
return *this;
}
constexpr GraphFeatures& EnableNodeImplDescribers() {
flags_.node_impl_describers = true;
return *this;
}
constexpr GraphFeatures& EnablePageAggregator() {
flags_.page_aggregator = true;
return *this;
}
constexpr GraphFeatures& EnablePageLoadTrackerDecorator() {
flags_.page_load_tracker_decorator = true;
return *this;
}
constexpr GraphFeatures& EnablePriorityTracking() {
EnableFrameVisibilityDecorator();
EnableImportantFrameDecorator();
flags_.priority_tracking = true;
return *this;
}
constexpr GraphFeatures& EnableProcessHostedContentTypesAggregator() {
flags_.process_hosted_content_types_aggregator = true;
return *this;
}
constexpr GraphFeatures& EnableResourceAttributionScheduler() {
flags_.resource_attribution_scheduler = true;
return *this;
}
constexpr GraphFeatures& EnableSiteDataRecorder() {
flags_.site_data_recorder = true;
return *this;
}
constexpr GraphFeatures& EnableTabPageDecorator() {
flags_.tab_page_decorator = true;
return *this;
}
constexpr GraphFeatures& EnableV8ContextTracker() {
flags_.v8_context_tracker = true;
return *this;
}
// Helper to enable the minimal set of features required for a content_shell
// browser to work.
constexpr GraphFeatures& EnableMinimal() {
EnableV8ContextTracker();
return *this;
}
// Helper to enable the default set of features. This is only intended for use
// from production code.
GraphFeatures& EnableDefault() {
EnableFrameVisibilityDecorator();
EnableFrozenFrameAggregator();
EnableImportantFrameDecorator();
EnableMetricsCollector();
EnableNodeImplDescribers();
EnablePageAggregator();
EnablePageLoadTrackerDecorator();
EnablePerformanceScenarios();
EnablePriorityTracking();
EnableProcessHostedContentTypesAggregator();
EnableResourceAttributionScheduler();
EnableTabPageDecorator();
EnableV8ContextTracker();
if (ui::GetDeviceFormFactor() == ui::DEVICE_FORM_FACTOR_DESKTOP) {
EnableSiteDataRecorder();
}
return *this;
}
// Accessor for the current set of flags_.
constexpr const Flags& flags() const { return flags_; }
// Applies the configuration specified on this object to the provided
// graph. This will unconditionally try to install all of the enabled
// features, even if they have already been installed; it is generally
// preferable to call this exactly once on a brand new |graph| instance that
// has had no features installed. Otherwise, it is safe to call this to
// install new features that the caller knows have not yet been installed.
void ConfigureGraph(Graph* graph) const;
private:
Flags flags_ = {0};
};
} // namespace performance_manager
#endif // COMPONENTS_PERFORMANCE_MANAGER_EMBEDDER_GRAPH_FEATURES_H_