1b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// Copyright (c) 2015 The Chromium Authors. All rights reserved.
2b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// Use of this source code is governed by a BSD-style license that can be
3b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// found in the LICENSE file.
4b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
5b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#include "base/trace_event/trace_config.h"
6b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
70d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko#include <stddef.h>
80d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko
90d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko#include <utility>
100d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko
11b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#include "base/json/json_reader.h"
12b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#include "base/json/json_writer.h"
1394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#include "base/memory/ptr_util.h"
14b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#include "base/strings/string_split.h"
150d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko#include "base/trace_event/memory_dump_manager.h"
160d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko#include "base/trace_event/memory_dump_request_args.h"
17b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#include "base/trace_event/trace_event.h"
18b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
19b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratnamespace base {
20b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratnamespace trace_event {
21b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
22b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratnamespace {
23b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
24b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// String options that can be used to initialize TraceOptions.
25b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratconst char kRecordUntilFull[] = "record-until-full";
26b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratconst char kRecordContinuously[] = "record-continuously";
27b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratconst char kRecordAsMuchAsPossible[] = "record-as-much-as-possible";
28b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratconst char kTraceToConsole[] = "trace-to-console";
29b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratconst char kEnableSystrace[] = "enable-systrace";
30b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratconst char kEnableArgumentFilter[] = "enable-argument-filter";
31b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
32b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// String parameters that can be used to parse the trace config string.
33b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratconst char kRecordModeParam[] = "record_mode";
34b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratconst char kEnableSystraceParam[] = "enable_systrace";
35b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratconst char kEnableArgumentFilterParam[] = "enable_argument_filter";
36b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
370d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko// String parameters that is used to parse memory dump config in trace config
380d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko// string.
390d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenkoconst char kMemoryDumpConfigParam[] = "memory_dump_config";
400c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavezconst char kAllowedDumpModesParam[] = "allowed_dump_modes";
410d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenkoconst char kTriggersParam[] = "triggers";
4236040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abeconst char kTriggerModeParam[] = "mode";
4336040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abeconst char kMinTimeBetweenDumps[] = "min_time_between_dumps_ms";
4436040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abeconst char kTriggerTypeParam[] = "type";
4536040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abeconst char kPeriodicIntervalLegacyParam[] = "periodic_interval_ms";
4694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavezconst char kHeapProfilerOptions[] = "heap_profiler_options";
4794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavezconst char kBreakdownThresholdBytes[] = "breakdown_threshold_bytes";
480d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko
4936040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe// String parameters used to parse category event filters.
5036040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abeconst char kEventFiltersParam[] = "event_filters";
5136040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abeconst char kFilterPredicateParam[] = "filter_predicate";
5236040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abeconst char kFilterArgsParam[] = "filter_args";
5336040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe
540d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko// Default configuration of memory dumps.
5594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavezconst TraceConfig::MemoryDumpConfig::Trigger kDefaultHeavyMemoryDumpTrigger = {
5636040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe    2000,  // min_time_between_dumps_ms
5736040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe    MemoryDumpLevelOfDetail::DETAILED, MemoryDumpType::PERIODIC_INTERVAL};
5894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavezconst TraceConfig::MemoryDumpConfig::Trigger kDefaultLightMemoryDumpTrigger = {
5936040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe    250,  // min_time_between_dumps_ms
6036040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe    MemoryDumpLevelOfDetail::LIGHT, MemoryDumpType::PERIODIC_INTERVAL};
610d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko
620d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenkoclass ConvertableTraceConfigToTraceFormat
630d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko    : public base::trace_event::ConvertableToTraceFormat {
640d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko public:
650d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko  explicit ConvertableTraceConfigToTraceFormat(const TraceConfig& trace_config)
660d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko      : trace_config_(trace_config) {}
6736040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe
6845779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko  ~ConvertableTraceConfigToTraceFormat() override {}
690c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez
700d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko  void AppendAsTraceFormat(std::string* out) const override {
710d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko    out->append(trace_config_.ToString());
720d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko  }
730d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko
740d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko private:
750d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko  const TraceConfig trace_config_;
760d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko};
770d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko
780c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavezstd::set<MemoryDumpLevelOfDetail> GetDefaultAllowedMemoryDumpModes() {
790c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  std::set<MemoryDumpLevelOfDetail> all_modes;
800c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  for (uint32_t mode = static_cast<uint32_t>(MemoryDumpLevelOfDetail::FIRST);
810c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez       mode <= static_cast<uint32_t>(MemoryDumpLevelOfDetail::LAST); mode++) {
820c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    all_modes.insert(static_cast<MemoryDumpLevelOfDetail>(mode));
830c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  }
840c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  return all_modes;
850c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez}
86b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
870c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez}  // namespace
8894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
890c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector ChavezTraceConfig::MemoryDumpConfig::HeapProfiler::HeapProfiler()
900c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    : breakdown_threshold_bytes(kDefaultBreakdownThresholdBytes) {}
9194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
9294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavezvoid TraceConfig::MemoryDumpConfig::HeapProfiler::Clear() {
9394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez  breakdown_threshold_bytes = kDefaultBreakdownThresholdBytes;
9494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez}
9594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
960c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavezvoid TraceConfig::ResetMemoryDumpConfig(
970c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    const TraceConfig::MemoryDumpConfig& memory_dump_config) {
980c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  memory_dump_config_.Clear();
990c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  memory_dump_config_ = memory_dump_config;
1000c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez}
1010c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez
1020c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector ChavezTraceConfig::MemoryDumpConfig::MemoryDumpConfig() {}
10394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
10494ffa55491333f3dcc701befd0d2652922916d99Luis Hector ChavezTraceConfig::MemoryDumpConfig::MemoryDumpConfig(
10594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez    const MemoryDumpConfig& other) = default;
10694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
1070c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector ChavezTraceConfig::MemoryDumpConfig::~MemoryDumpConfig() {}
10894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
10994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavezvoid TraceConfig::MemoryDumpConfig::Clear() {
1100c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  allowed_dump_modes.clear();
11194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez  triggers.clear();
11294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez  heap_profiler_options.Clear();
11394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez}
11494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
11536040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abevoid TraceConfig::MemoryDumpConfig::Merge(
11636040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe    const TraceConfig::MemoryDumpConfig& config) {
11736040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe  triggers.insert(triggers.end(), config.triggers.begin(),
11836040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe                  config.triggers.end());
11936040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe  allowed_dump_modes.insert(config.allowed_dump_modes.begin(),
12036040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe                            config.allowed_dump_modes.end());
12136040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe  heap_profiler_options.breakdown_threshold_bytes =
12236040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe      std::min(heap_profiler_options.breakdown_threshold_bytes,
12336040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe               config.heap_profiler_options.breakdown_threshold_bytes);
12436040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe}
12536040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe
12636040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko AbeTraceConfig::EventFilterConfig::EventFilterConfig(
12736040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe    const std::string& predicate_name)
12836040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe    : predicate_name_(predicate_name) {}
12936040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe
13036040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko AbeTraceConfig::EventFilterConfig::~EventFilterConfig() {}
13136040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe
13236040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko AbeTraceConfig::EventFilterConfig::EventFilterConfig(const EventFilterConfig& tc) {
13336040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe  *this = tc;
13436040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe}
13536040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe
13636040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko AbeTraceConfig::EventFilterConfig& TraceConfig::EventFilterConfig::operator=(
13736040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe    const TraceConfig::EventFilterConfig& rhs) {
13836040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe  if (this == &rhs)
13936040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe    return *this;
14036040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe
14136040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe  predicate_name_ = rhs.predicate_name_;
142319afc59a539d6261307aadbdab4d4ee93eaf1ffJakub Pawlowski  category_filter_ = rhs.category_filter_;
143319afc59a539d6261307aadbdab4d4ee93eaf1ffJakub Pawlowski
14436040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe  if (rhs.args_)
14536040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe    args_ = rhs.args_->CreateDeepCopy();
14636040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe
14736040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe  return *this;
14836040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe}
14936040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe
150319afc59a539d6261307aadbdab4d4ee93eaf1ffJakub Pawlowskivoid TraceConfig::EventFilterConfig::InitializeFromConfigDict(
151319afc59a539d6261307aadbdab4d4ee93eaf1ffJakub Pawlowski    const base::DictionaryValue* event_filter) {
152319afc59a539d6261307aadbdab4d4ee93eaf1ffJakub Pawlowski  category_filter_.InitializeFromConfigDict(*event_filter);
153319afc59a539d6261307aadbdab4d4ee93eaf1ffJakub Pawlowski
154319afc59a539d6261307aadbdab4d4ee93eaf1ffJakub Pawlowski  const base::DictionaryValue* args_dict = nullptr;
155319afc59a539d6261307aadbdab4d4ee93eaf1ffJakub Pawlowski  if (event_filter->GetDictionary(kFilterArgsParam, &args_dict))
156319afc59a539d6261307aadbdab4d4ee93eaf1ffJakub Pawlowski    args_ = args_dict->CreateDeepCopy();
15736040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe}
15836040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe
159319afc59a539d6261307aadbdab4d4ee93eaf1ffJakub Pawlowskivoid TraceConfig::EventFilterConfig::SetCategoryFilter(
160319afc59a539d6261307aadbdab4d4ee93eaf1ffJakub Pawlowski    const TraceConfigCategoryFilter& category_filter) {
161319afc59a539d6261307aadbdab4d4ee93eaf1ffJakub Pawlowski  category_filter_ = category_filter;
16236040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe}
16336040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe
164319afc59a539d6261307aadbdab4d4ee93eaf1ffJakub Pawlowskivoid TraceConfig::EventFilterConfig::ToDict(
165319afc59a539d6261307aadbdab4d4ee93eaf1ffJakub Pawlowski    DictionaryValue* filter_dict) const {
166319afc59a539d6261307aadbdab4d4ee93eaf1ffJakub Pawlowski  filter_dict->SetString(kFilterPredicateParam, predicate_name());
167319afc59a539d6261307aadbdab4d4ee93eaf1ffJakub Pawlowski
168319afc59a539d6261307aadbdab4d4ee93eaf1ffJakub Pawlowski  category_filter_.ToDict(filter_dict);
169319afc59a539d6261307aadbdab4d4ee93eaf1ffJakub Pawlowski
170319afc59a539d6261307aadbdab4d4ee93eaf1ffJakub Pawlowski  if (args_)
171319afc59a539d6261307aadbdab4d4ee93eaf1ffJakub Pawlowski    filter_dict->Set(kFilterArgsParam, args_->CreateDeepCopy());
17236040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe}
17336040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe
17436040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abebool TraceConfig::EventFilterConfig::GetArgAsSet(
17536040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe    const char* key,
17636040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe    std::unordered_set<std::string>* out_set) const {
17736040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe  const ListValue* list = nullptr;
17836040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe  if (!args_->GetList(key, &list))
17936040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe    return false;
18036040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe  for (size_t i = 0; i < list->GetSize(); ++i) {
18136040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe    std::string value;
18236040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe    if (list->GetString(i, &value))
18336040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe      out_set->insert(value);
18436040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe  }
18536040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe  return true;
18636040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe}
18736040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe
18836040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abebool TraceConfig::EventFilterConfig::IsCategoryGroupEnabled(
189f810b5921dde57180956b9eadf39a3a2b8cb5855Hidehiko Abe    const StringPiece& category_group_name) const {
190319afc59a539d6261307aadbdab4d4ee93eaf1ffJakub Pawlowski  return category_filter_.IsCategoryGroupEnabled(category_group_name);
19136040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe}
19236040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe
193b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratTraceConfig::TraceConfig() {
194b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  InitializeDefault();
195b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat}
196b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
1970c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector ChavezTraceConfig::TraceConfig(StringPiece category_filter_string,
1980c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez                         StringPiece trace_options_string) {
199b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  InitializeFromStrings(category_filter_string, trace_options_string);
200b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat}
201b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
2020c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector ChavezTraceConfig::TraceConfig(StringPiece category_filter_string,
203b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat                         TraceRecordMode record_mode) {
204b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  std::string trace_options_string;
205b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  switch (record_mode) {
206b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    case RECORD_UNTIL_FULL:
207b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat      trace_options_string = kRecordUntilFull;
208b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat      break;
209b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    case RECORD_CONTINUOUSLY:
210b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat      trace_options_string = kRecordContinuously;
211b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat      break;
212b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    case RECORD_AS_MUCH_AS_POSSIBLE:
213b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat      trace_options_string = kRecordAsMuchAsPossible;
214b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat      break;
215b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    case ECHO_TO_CONSOLE:
216b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat      trace_options_string = kTraceToConsole;
217b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat      break;
218b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    default:
219b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat      NOTREACHED();
220b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  }
221b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  InitializeFromStrings(category_filter_string, trace_options_string);
222b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat}
223b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
22494ffa55491333f3dcc701befd0d2652922916d99Luis Hector ChavezTraceConfig::TraceConfig(const DictionaryValue& config) {
22594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez  InitializeFromConfigDict(config);
22694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez}
22794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
2280c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector ChavezTraceConfig::TraceConfig(StringPiece config_string) {
229b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  if (!config_string.empty())
230b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    InitializeFromConfigString(config_string);
231b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  else
232b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    InitializeDefault();
233b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat}
234b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
235b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratTraceConfig::TraceConfig(const TraceConfig& tc)
236b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    : record_mode_(tc.record_mode_),
237b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat      enable_systrace_(tc.enable_systrace_),
238b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat      enable_argument_filter_(tc.enable_argument_filter_),
239319afc59a539d6261307aadbdab4d4ee93eaf1ffJakub Pawlowski      category_filter_(tc.category_filter_),
2400d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko      memory_dump_config_(tc.memory_dump_config_),
24136040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe      event_filters_(tc.event_filters_) {}
242b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
243b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratTraceConfig::~TraceConfig() {
244b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat}
245b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
246b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratTraceConfig& TraceConfig::operator=(const TraceConfig& rhs) {
247b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  if (this == &rhs)
248b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    return *this;
249b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
250b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  record_mode_ = rhs.record_mode_;
251b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  enable_systrace_ = rhs.enable_systrace_;
252b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  enable_argument_filter_ = rhs.enable_argument_filter_;
253319afc59a539d6261307aadbdab4d4ee93eaf1ffJakub Pawlowski  category_filter_ = rhs.category_filter_;
2540d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko  memory_dump_config_ = rhs.memory_dump_config_;
25536040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe  event_filters_ = rhs.event_filters_;
256b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  return *this;
257b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat}
258b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
259b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratconst TraceConfig::StringList& TraceConfig::GetSyntheticDelayValues() const {
260319afc59a539d6261307aadbdab4d4ee93eaf1ffJakub Pawlowski  return category_filter_.synthetic_delays();
261b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat}
262b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
263b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratstd::string TraceConfig::ToString() const {
2640c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  std::unique_ptr<DictionaryValue> dict = ToDict();
265b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  std::string json;
2660c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  JSONWriter::Write(*dict, &json);
267b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  return json;
268b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat}
269b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
27094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavezstd::unique_ptr<ConvertableToTraceFormat>
27194ffa55491333f3dcc701befd0d2652922916d99Luis Hector ChavezTraceConfig::AsConvertableToTraceFormat() const {
27236040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe  return MakeUnique<ConvertableTraceConfigToTraceFormat>(*this);
2730d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko}
2740d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko
275b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratstd::string TraceConfig::ToCategoryFilterString() const {
276319afc59a539d6261307aadbdab4d4ee93eaf1ffJakub Pawlowski  return category_filter_.ToFilterString();
277b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat}
278b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
279b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratbool TraceConfig::IsCategoryGroupEnabled(
280f810b5921dde57180956b9eadf39a3a2b8cb5855Hidehiko Abe    const StringPiece& category_group_name) const {
281b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  // TraceLog should call this method only as part of enabling/disabling
282b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  // categories.
283319afc59a539d6261307aadbdab4d4ee93eaf1ffJakub Pawlowski  return category_filter_.IsCategoryGroupEnabled(category_group_name);
284b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat}
285b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
286b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratvoid TraceConfig::Merge(const TraceConfig& config) {
287b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  if (record_mode_ != config.record_mode_
288b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat      || enable_systrace_ != config.enable_systrace_
289b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat      || enable_argument_filter_ != config.enable_argument_filter_) {
290b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    DLOG(ERROR) << "Attempting to merge trace config with a different "
291b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat                << "set of options.";
292b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  }
293b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
294319afc59a539d6261307aadbdab4d4ee93eaf1ffJakub Pawlowski  category_filter_.Merge(config.category_filter_);
295b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
29636040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe  memory_dump_config_.Merge(config.memory_dump_config_);
2970d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko
29836040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe  event_filters_.insert(event_filters_.end(), config.event_filters().begin(),
29936040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe                        config.event_filters().end());
300b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat}
301b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
302b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratvoid TraceConfig::Clear() {
303b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  record_mode_ = RECORD_UNTIL_FULL;
304b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  enable_systrace_ = false;
305b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  enable_argument_filter_ = false;
306319afc59a539d6261307aadbdab4d4ee93eaf1ffJakub Pawlowski  category_filter_.Clear();
30794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez  memory_dump_config_.Clear();
30836040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe  event_filters_.clear();
309b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat}
310b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
311b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratvoid TraceConfig::InitializeDefault() {
312b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  record_mode_ = RECORD_UNTIL_FULL;
313b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  enable_systrace_ = false;
314b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  enable_argument_filter_ = false;
315b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat}
316b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
31794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavezvoid TraceConfig::InitializeFromConfigDict(const DictionaryValue& dict) {
318b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  record_mode_ = RECORD_UNTIL_FULL;
319b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  std::string record_mode;
32094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez  if (dict.GetString(kRecordModeParam, &record_mode)) {
321b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    if (record_mode == kRecordUntilFull) {
322b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat      record_mode_ = RECORD_UNTIL_FULL;
323b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    } else if (record_mode == kRecordContinuously) {
324b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat      record_mode_ = RECORD_CONTINUOUSLY;
325b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    } else if (record_mode == kTraceToConsole) {
326b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat      record_mode_ = ECHO_TO_CONSOLE;
327b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    } else if (record_mode == kRecordAsMuchAsPossible) {
328b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat      record_mode_ = RECORD_AS_MUCH_AS_POSSIBLE;
329b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    }
330b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  }
331b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
3320c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  bool val;
3330c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  enable_systrace_ = dict.GetBoolean(kEnableSystraceParam, &val) ? val : false;
3340c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  enable_argument_filter_ =
3350c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez      dict.GetBoolean(kEnableArgumentFilterParam, &val) ? val : false;
336b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
337319afc59a539d6261307aadbdab4d4ee93eaf1ffJakub Pawlowski  category_filter_.InitializeFromConfigDict(dict);
3380d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko
33936040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe  const base::ListValue* category_event_filters = nullptr;
34036040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe  if (dict.GetList(kEventFiltersParam, &category_event_filters))
34136040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe    SetEventFiltersFromConfigList(*category_event_filters);
34236040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe
343319afc59a539d6261307aadbdab4d4ee93eaf1ffJakub Pawlowski  if (category_filter_.IsCategoryEnabled(MemoryDumpManager::kTraceCategory)) {
3440d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko    // If dump triggers not set, the client is using the legacy with just
3450d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko    // category enabled. So, use the default periodic dump config.
3460c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    const DictionaryValue* memory_dump_config = nullptr;
34794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez    if (dict.GetDictionary(kMemoryDumpConfigParam, &memory_dump_config))
3480c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez      SetMemoryDumpConfigFromConfigDict(*memory_dump_config);
3490d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko    else
3500d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko      SetDefaultMemoryDumpConfig();
3510d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko  }
352b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat}
353b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
3540c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavezvoid TraceConfig::InitializeFromConfigString(StringPiece config_string) {
3550c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  auto dict = DictionaryValue::From(JSONReader::Read(config_string));
3560c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  if (dict)
3570c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    InitializeFromConfigDict(*dict);
3580c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  else
3590c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    InitializeDefault();
36094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez}
36194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
3620c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavezvoid TraceConfig::InitializeFromStrings(StringPiece category_filter_string,
3630c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez                                        StringPiece trace_options_string) {
364319afc59a539d6261307aadbdab4d4ee93eaf1ffJakub Pawlowski  if (!category_filter_string.empty())
365319afc59a539d6261307aadbdab4d4ee93eaf1ffJakub Pawlowski    category_filter_.InitializeFromString(category_filter_string);
366b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
367b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  record_mode_ = RECORD_UNTIL_FULL;
368b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  enable_systrace_ = false;
369b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  enable_argument_filter_ = false;
3700c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  if (!trace_options_string.empty()) {
3710c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    std::vector<std::string> split =
3720c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez        SplitString(trace_options_string, ",", TRIM_WHITESPACE, SPLIT_WANT_ALL);
3730c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    for (const std::string& token : split) {
3740c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez      if (token == kRecordUntilFull) {
375b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat        record_mode_ = RECORD_UNTIL_FULL;
3760c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez      } else if (token == kRecordContinuously) {
377b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat        record_mode_ = RECORD_CONTINUOUSLY;
3780c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez      } else if (token == kTraceToConsole) {
379b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat        record_mode_ = ECHO_TO_CONSOLE;
3800c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez      } else if (token == kRecordAsMuchAsPossible) {
381b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat        record_mode_ = RECORD_AS_MUCH_AS_POSSIBLE;
3820c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez      } else if (token == kEnableSystrace) {
383b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat        enable_systrace_ = true;
3840c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez      } else if (token == kEnableArgumentFilter) {
385b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat        enable_argument_filter_ = true;
386b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat      }
387b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    }
388b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  }
3890d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko
390319afc59a539d6261307aadbdab4d4ee93eaf1ffJakub Pawlowski  if (category_filter_.IsCategoryEnabled(MemoryDumpManager::kTraceCategory)) {
3910d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko    SetDefaultMemoryDumpConfig();
3920d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko  }
393b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat}
394b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
3950c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavezvoid TraceConfig::SetMemoryDumpConfigFromConfigDict(
3960c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    const DictionaryValue& memory_dump_config) {
3970c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  // Set allowed dump modes.
3980c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  memory_dump_config_.allowed_dump_modes.clear();
3990c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  const ListValue* allowed_modes_list;
4000c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  if (memory_dump_config.GetList(kAllowedDumpModesParam, &allowed_modes_list)) {
4010c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    for (size_t i = 0; i < allowed_modes_list->GetSize(); ++i) {
4020c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez      std::string level_of_detail_str;
4030c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez      allowed_modes_list->GetString(i, &level_of_detail_str);
4040c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez      memory_dump_config_.allowed_dump_modes.insert(
4050c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez          StringToMemoryDumpLevelOfDetail(level_of_detail_str));
4060c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    }
4070c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  } else {
4080c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    // If allowed modes param is not given then allow all modes by default.
4090c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    memory_dump_config_.allowed_dump_modes = GetDefaultAllowedMemoryDumpModes();
4100c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  }
4110c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez
41294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez  // Set triggers
41394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez  memory_dump_config_.triggers.clear();
4140c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  const ListValue* trigger_list = nullptr;
41594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez  if (memory_dump_config.GetList(kTriggersParam, &trigger_list) &&
41694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      trigger_list->GetSize() > 0) {
41794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez    for (size_t i = 0; i < trigger_list->GetSize(); ++i) {
4180c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez      const DictionaryValue* trigger = nullptr;
41994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      if (!trigger_list->GetDictionary(i, &trigger))
42094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez        continue;
4210d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko
42236040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe      MemoryDumpConfig::Trigger dump_config;
42394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      int interval = 0;
42436040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe      if (!trigger->GetInteger(kMinTimeBetweenDumps, &interval)) {
42536040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe        // If "min_time_between_dumps_ms" param was not given, then the trace
42636040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe        // config uses old format where only periodic dumps are supported.
42736040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe        trigger->GetInteger(kPeriodicIntervalLegacyParam, &interval);
42836040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe        dump_config.trigger_type = MemoryDumpType::PERIODIC_INTERVAL;
42936040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe      } else {
43036040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe        std::string trigger_type_str;
43136040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe        trigger->GetString(kTriggerTypeParam, &trigger_type_str);
43236040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe        dump_config.trigger_type = StringToMemoryDumpType(trigger_type_str);
43336040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe      }
434e5b2c6fa6f923f3a2f66346c2f169d9f0fceb3dcLuis Hector Chavez      DCHECK_GT(interval, 0);
43536040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe      dump_config.min_time_between_dumps_ms = static_cast<uint32_t>(interval);
43636040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe
43794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      std::string level_of_detail_str;
43836040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe      trigger->GetString(kTriggerModeParam, &level_of_detail_str);
43994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      dump_config.level_of_detail =
44094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez          StringToMemoryDumpLevelOfDetail(level_of_detail_str);
44136040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe
44294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      memory_dump_config_.triggers.push_back(dump_config);
44394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez    }
44494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez  }
4450d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko
44694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez  // Set heap profiler options
4470c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  const DictionaryValue* heap_profiler_options = nullptr;
44894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez  if (memory_dump_config.GetDictionary(kHeapProfilerOptions,
44994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                                       &heap_profiler_options)) {
45094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez    int min_size_bytes = 0;
45194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez    if (heap_profiler_options->GetInteger(kBreakdownThresholdBytes,
45294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                                         &min_size_bytes)
45394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez        && min_size_bytes >= 0) {
45494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      memory_dump_config_.heap_profiler_options.breakdown_threshold_bytes =
45594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez          static_cast<size_t>(min_size_bytes);
45694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez    } else {
45794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      memory_dump_config_.heap_profiler_options.breakdown_threshold_bytes =
45894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez          MemoryDumpConfig::HeapProfiler::kDefaultBreakdownThresholdBytes;
4590d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko    }
4600d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko  }
4610d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko}
4620d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko
4630d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenkovoid TraceConfig::SetDefaultMemoryDumpConfig() {
46494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez  memory_dump_config_.Clear();
46594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez  memory_dump_config_.triggers.push_back(kDefaultHeavyMemoryDumpTrigger);
46694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez  memory_dump_config_.triggers.push_back(kDefaultLightMemoryDumpTrigger);
4670c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  memory_dump_config_.allowed_dump_modes = GetDefaultAllowedMemoryDumpModes();
468b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat}
469b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
47036040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abevoid TraceConfig::SetEventFiltersFromConfigList(
47136040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe    const base::ListValue& category_event_filters) {
47236040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe  event_filters_.clear();
47336040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe
47436040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe  for (size_t event_filter_index = 0;
47536040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe       event_filter_index < category_event_filters.GetSize();
47636040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe       ++event_filter_index) {
47736040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe    const base::DictionaryValue* event_filter = nullptr;
47836040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe    if (!category_event_filters.GetDictionary(event_filter_index,
47936040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe                                              &event_filter))
48036040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe      continue;
48136040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe
48236040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe    std::string predicate_name;
48336040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe    CHECK(event_filter->GetString(kFilterPredicateParam, &predicate_name))
48436040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe        << "Invalid predicate name in category event filter.";
48536040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe
48636040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe    EventFilterConfig new_config(predicate_name);
487319afc59a539d6261307aadbdab4d4ee93eaf1ffJakub Pawlowski    new_config.InitializeFromConfigDict(event_filter);
48836040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe    event_filters_.push_back(new_config);
48936040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe  }
49036040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe}
49136040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe
4920c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavezstd::unique_ptr<DictionaryValue> TraceConfig::ToDict() const {
4930c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  auto dict = MakeUnique<DictionaryValue>();
494b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  switch (record_mode_) {
495b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    case RECORD_UNTIL_FULL:
4960c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez      dict->SetString(kRecordModeParam, kRecordUntilFull);
497b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat      break;
498b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    case RECORD_CONTINUOUSLY:
4990c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez      dict->SetString(kRecordModeParam, kRecordContinuously);
500b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat      break;
501b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    case RECORD_AS_MUCH_AS_POSSIBLE:
5020c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez      dict->SetString(kRecordModeParam, kRecordAsMuchAsPossible);
503b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat      break;
504b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    case ECHO_TO_CONSOLE:
5050c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez      dict->SetString(kRecordModeParam, kTraceToConsole);
506b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat      break;
507b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    default:
508b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat      NOTREACHED();
509b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  }
510b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
5110c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  dict->SetBoolean(kEnableSystraceParam, enable_systrace_);
5120c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  dict->SetBoolean(kEnableArgumentFilterParam, enable_argument_filter_);
513b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
514319afc59a539d6261307aadbdab4d4ee93eaf1ffJakub Pawlowski  category_filter_.ToDict(dict.get());
5150d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko
51636040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe  if (!event_filters_.empty()) {
51736040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe    std::unique_ptr<base::ListValue> filter_list(new base::ListValue());
51836040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe    for (const EventFilterConfig& filter : event_filters_) {
51936040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe      std::unique_ptr<base::DictionaryValue> filter_dict(
52036040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe          new base::DictionaryValue());
521319afc59a539d6261307aadbdab4d4ee93eaf1ffJakub Pawlowski      filter.ToDict(filter_dict.get());
52236040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe      filter_list->Append(std::move(filter_dict));
52336040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe    }
52436040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe    dict->Set(kEventFiltersParam, std::move(filter_list));
52536040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe  }
52636040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe
527319afc59a539d6261307aadbdab4d4ee93eaf1ffJakub Pawlowski  if (category_filter_.IsCategoryEnabled(MemoryDumpManager::kTraceCategory)) {
5280c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    auto allowed_modes = MakeUnique<ListValue>();
5290c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    for (auto dump_mode : memory_dump_config_.allowed_dump_modes)
5300c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez      allowed_modes->AppendString(MemoryDumpLevelOfDetailToString(dump_mode));
5310c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez
5320c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    auto memory_dump_config = MakeUnique<DictionaryValue>();
5330c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    memory_dump_config->Set(kAllowedDumpModesParam, std::move(allowed_modes));
5340c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez
5350c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    auto triggers_list = MakeUnique<ListValue>();
5360c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    for (const auto& config : memory_dump_config_.triggers) {
5370c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez      auto trigger_dict = MakeUnique<DictionaryValue>();
53836040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe      trigger_dict->SetString(kTriggerTypeParam,
53936040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe                              MemoryDumpTypeToString(config.trigger_type));
54036040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe      trigger_dict->SetInteger(
54136040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe          kMinTimeBetweenDumps,
54236040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe          static_cast<int>(config.min_time_between_dumps_ms));
5430d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko      trigger_dict->SetString(
54436040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe          kTriggerModeParam,
54536040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe          MemoryDumpLevelOfDetailToString(config.level_of_detail));
5460d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko      triggers_list->Append(std::move(trigger_dict));
5470d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko    }
5480d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko
5490d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko    // Empty triggers will still be specified explicitly since it means that
5500d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko    // the periodic dumps are not enabled.
5510d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko    memory_dump_config->Set(kTriggersParam, std::move(triggers_list));
55294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
55394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez    if (memory_dump_config_.heap_profiler_options.breakdown_threshold_bytes !=
55494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez        MemoryDumpConfig::HeapProfiler::kDefaultBreakdownThresholdBytes) {
5550c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez      auto options = MakeUnique<DictionaryValue>();
5560c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez      options->SetInteger(
55794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez          kBreakdownThresholdBytes,
55894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez          memory_dump_config_.heap_profiler_options.breakdown_threshold_bytes);
5590c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez      memory_dump_config->Set(kHeapProfilerOptions, std::move(options));
56094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez    }
5610c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    dict->Set(kMemoryDumpConfigParam, std::move(memory_dump_config));
5620d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko  }
5630c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  return dict;
564b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat}
565b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
566b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratstd::string TraceConfig::ToTraceOptionsString() const {
567b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  std::string ret;
568b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  switch (record_mode_) {
569b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    case RECORD_UNTIL_FULL:
570b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat      ret = kRecordUntilFull;
571b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat      break;
572b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    case RECORD_CONTINUOUSLY:
573b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat      ret = kRecordContinuously;
574b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat      break;
575b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    case RECORD_AS_MUCH_AS_POSSIBLE:
576b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat      ret = kRecordAsMuchAsPossible;
577b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat      break;
578b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    case ECHO_TO_CONSOLE:
579b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat      ret = kTraceToConsole;
580b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat      break;
581b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    default:
582b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat      NOTREACHED();
583b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  }
584b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  if (enable_systrace_)
585b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    ret = ret + "," + kEnableSystrace;
586b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  if (enable_argument_filter_)
587b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    ret = ret + "," + kEnableArgumentFilter;
588b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  return ret;
589b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat}
590b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
591b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat}  // namespace trace_event
592b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat}  // namespace base
593