|  | // Copyright 2015 The Chromium Authors | 
|  | // Use of this source code is governed by a BSD-style license that can be | 
|  | // found in the LICENSE file. | 
|  |  | 
|  | #ifndef CONTENT_BROWSER_TRACING_BACKGROUND_TRACING_CONFIG_IMPL_H_ | 
|  | #define CONTENT_BROWSER_TRACING_BACKGROUND_TRACING_CONFIG_IMPL_H_ | 
|  |  | 
|  | #include <memory> | 
|  | #include <string> | 
|  | #include <vector> | 
|  |  | 
|  | #include "base/gtest_prod_util.h" | 
|  | #include "base/trace_event/trace_config.h" | 
|  | #include "build/build_config.h" | 
|  | #include "content/common/content_export.h" | 
|  | #include "content/public/browser/background_tracing_config.h" | 
|  |  | 
|  | namespace content { | 
|  | class BackgroundTracingRule; | 
|  |  | 
|  | class CONTENT_EXPORT BackgroundTracingConfigImpl | 
|  | : public BackgroundTracingConfig { | 
|  | public: | 
|  | explicit BackgroundTracingConfigImpl(TracingMode tracing_mode); | 
|  |  | 
|  | BackgroundTracingConfigImpl(const BackgroundTracingConfigImpl&) = delete; | 
|  | BackgroundTracingConfigImpl& operator=(const BackgroundTracingConfigImpl&) = | 
|  | delete; | 
|  |  | 
|  | ~BackgroundTracingConfigImpl() override; | 
|  |  | 
|  | // From BackgroundTracingConfig | 
|  | base::Value::Dict ToDict() override; | 
|  |  | 
|  | void SetPackageNameFilteringEnabled(bool) override; | 
|  |  | 
|  | enum CategoryPreset { | 
|  | CATEGORY_PRESET_UNSET, | 
|  | CUSTOM_CATEGORY_PRESET, | 
|  | CUSTOM_TRACE_CONFIG, | 
|  | BENCHMARK_STARTUP, | 
|  | }; | 
|  |  | 
|  | CategoryPreset category_preset() const { return category_preset_; } | 
|  | void set_category_preset(CategoryPreset category_preset) { | 
|  | category_preset_ = category_preset; | 
|  | } | 
|  |  | 
|  | const std::vector<std::unique_ptr<BackgroundTracingRule>>& rules() const { | 
|  | return rules_; | 
|  | } | 
|  |  | 
|  | void AddPreemptiveRule(const base::Value::Dict& dict); | 
|  | void AddReactiveRule( | 
|  | const base::Value::Dict& dict, | 
|  | BackgroundTracingConfigImpl::CategoryPreset category_preset); | 
|  | void AddSystemRule(const base::Value::Dict& dict); | 
|  |  | 
|  | base::trace_event::TraceConfig GetTraceConfig() const; | 
|  | const std::string& enabled_data_sources() const { | 
|  | return enabled_data_sources_; | 
|  | } | 
|  |  | 
|  | size_t GetTraceUploadLimitKb() const; | 
|  | int interning_reset_interval_ms() const { | 
|  | return interning_reset_interval_ms_; | 
|  | } | 
|  |  | 
|  | void set_requires_anonymized_data(bool value) { | 
|  | requires_anonymized_data_ = value; | 
|  | } | 
|  | bool requires_anonymized_data() const { return requires_anonymized_data_; } | 
|  |  | 
|  | static std::unique_ptr<BackgroundTracingConfigImpl> PreemptiveFromDict( | 
|  | const base::Value::Dict& dict); | 
|  | static std::unique_ptr<BackgroundTracingConfigImpl> ReactiveFromDict( | 
|  | const base::Value::Dict& dict); | 
|  | static std::unique_ptr<BackgroundTracingConfigImpl> SystemFromDict( | 
|  | const base::Value::Dict& dict); | 
|  |  | 
|  | static std::unique_ptr<BackgroundTracingConfigImpl> FromDict( | 
|  | base::Value::Dict&& dict); | 
|  |  | 
|  | static std::string CategoryPresetToString( | 
|  | BackgroundTracingConfigImpl::CategoryPreset category_preset); | 
|  | static bool StringToCategoryPreset( | 
|  | const std::string& category_preset_string, | 
|  | BackgroundTracingConfigImpl::CategoryPreset* category_preset); | 
|  |  | 
|  | private: | 
|  | FRIEND_TEST_ALL_PREFIXES(BackgroundTracingConfigTest, | 
|  | ValidPreemptiveConfigToString); | 
|  |  | 
|  | #if BUILDFLAG(IS_ANDROID) | 
|  | constexpr static int kMaxBufferSizeKb = 4 * 1024; | 
|  | // ~1MB compressed size. | 
|  | constexpr static int kUploadLimitKb = 5 * 1024; | 
|  | #else | 
|  | constexpr static int kMaxBufferSizeKb = 25 * 1024; | 
|  | // Less than 10MB compressed size. | 
|  | constexpr static int kUploadLimitKb = 30 * 1024; | 
|  | #endif | 
|  |  | 
|  | static base::trace_event::TraceConfig GetConfigForCategoryPreset( | 
|  | BackgroundTracingConfigImpl::CategoryPreset, | 
|  | base::trace_event::TraceRecordMode); | 
|  |  | 
|  | BackgroundTracingRule* AddRule(const base::Value::Dict& dict); | 
|  | void SetBufferSizeLimits(const base::Value::Dict* dict); | 
|  | int GetMaximumTraceBufferSizeKb() const; | 
|  |  | 
|  | // A trace config extracted from the "trace_config" field of the input | 
|  | // dictionnary. | 
|  | base::trace_event::TraceConfig trace_config_; | 
|  | CategoryPreset category_preset_; | 
|  | std::vector<std::unique_ptr<BackgroundTracingRule>> rules_; | 
|  | std::string custom_categories_; | 
|  | std::string enabled_data_sources_; | 
|  |  | 
|  | bool requires_anonymized_data_ = false; | 
|  |  | 
|  | // The default memory overhead of running background tracing for various | 
|  | // scenarios. These are configurable by experiments. | 
|  | int low_ram_buffer_size_kb_ = 200; | 
|  | int medium_ram_buffer_size_kb_ = 2 * 1024; | 
|  | // Connectivity is also relevant for setting the buffer size because the | 
|  | // uploader will fail if we sent large trace and device runs on mobile | 
|  | // network. | 
|  | int mobile_network_buffer_size_kb_ = 300; | 
|  | int max_buffer_size_kb_ = kMaxBufferSizeKb; | 
|  |  | 
|  | // All the upload limits below are set for uncompressed trace log. On | 
|  | // compression the data size usually reduces by 3x for size < 10MB, and the | 
|  | // compression ratio grows up to 8x if the buffer size is around 100MB. | 
|  | int upload_limit_network_kb_ = 1024; | 
|  | int upload_limit_kb_ = kUploadLimitKb; | 
|  | int interning_reset_interval_ms_ = 5000; | 
|  | }; | 
|  |  | 
|  | }  // namespace content | 
|  |  | 
|  | #endif  // CONTENT_BROWSER_TRACING_BACKGROUND_TRACING_CONFIG_IMPL_H_ |