trace_config.cc revision 36040ed30c39d2106a2cd5ec033e98b71302a744
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"
140d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko#include "base/strings/pattern.h"
15b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#include "base/strings/string_split.h"
16b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#include "base/strings/string_tokenizer.h"
170c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez#include "base/strings/string_util.h"
18b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#include "base/strings/stringprintf.h"
190d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko#include "base/trace_event/memory_dump_manager.h"
200d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko#include "base/trace_event/memory_dump_request_args.h"
21b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#include "base/trace_event/trace_event.h"
22b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
23b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratnamespace base {
24b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratnamespace trace_event {
25b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
26b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratnamespace {
27b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
28b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// String options that can be used to initialize TraceOptions.
29b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratconst char kRecordUntilFull[] = "record-until-full";
30b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratconst char kRecordContinuously[] = "record-continuously";
31b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratconst char kRecordAsMuchAsPossible[] = "record-as-much-as-possible";
32b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratconst char kTraceToConsole[] = "trace-to-console";
33b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratconst char kEnableSystrace[] = "enable-systrace";
34b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratconst char kEnableArgumentFilter[] = "enable-argument-filter";
35b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
36b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// String parameters that can be used to parse the trace config string.
37b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratconst char kRecordModeParam[] = "record_mode";
38b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratconst char kEnableSystraceParam[] = "enable_systrace";
39b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratconst char kEnableArgumentFilterParam[] = "enable_argument_filter";
40b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratconst char kIncludedCategoriesParam[] = "included_categories";
41b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratconst char kExcludedCategoriesParam[] = "excluded_categories";
42b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratconst char kSyntheticDelaysParam[] = "synthetic_delays";
43b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
44b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratconst char kSyntheticDelayCategoryFilterPrefix[] = "DELAY(";
45b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
460d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko// String parameters that is used to parse memory dump config in trace config
470d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko// string.
480d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenkoconst char kMemoryDumpConfigParam[] = "memory_dump_config";
490c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavezconst char kAllowedDumpModesParam[] = "allowed_dump_modes";
500d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenkoconst char kTriggersParam[] = "triggers";
5136040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abeconst char kTriggerModeParam[] = "mode";
5236040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abeconst char kMinTimeBetweenDumps[] = "min_time_between_dumps_ms";
5336040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abeconst char kTriggerTypeParam[] = "type";
5436040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abeconst char kPeriodicIntervalLegacyParam[] = "periodic_interval_ms";
5594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavezconst char kHeapProfilerOptions[] = "heap_profiler_options";
5694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavezconst char kBreakdownThresholdBytes[] = "breakdown_threshold_bytes";
570d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko
5836040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe// String parameters used to parse category event filters.
5936040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abeconst char kEventFiltersParam[] = "event_filters";
6036040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abeconst char kFilterPredicateParam[] = "filter_predicate";
6136040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abeconst char kFilterArgsParam[] = "filter_args";
6236040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe
630d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko// Default configuration of memory dumps.
6494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavezconst TraceConfig::MemoryDumpConfig::Trigger kDefaultHeavyMemoryDumpTrigger = {
6536040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe    2000,  // min_time_between_dumps_ms
6636040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe    MemoryDumpLevelOfDetail::DETAILED, MemoryDumpType::PERIODIC_INTERVAL};
6794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavezconst TraceConfig::MemoryDumpConfig::Trigger kDefaultLightMemoryDumpTrigger = {
6836040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe    250,  // min_time_between_dumps_ms
6936040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe    MemoryDumpLevelOfDetail::LIGHT, MemoryDumpType::PERIODIC_INTERVAL};
700d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko
710d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenkoclass ConvertableTraceConfigToTraceFormat
720d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko    : public base::trace_event::ConvertableToTraceFormat {
730d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko public:
740d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko  explicit ConvertableTraceConfigToTraceFormat(const TraceConfig& trace_config)
750d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko      : trace_config_(trace_config) {}
7636040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe
7745779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko  ~ConvertableTraceConfigToTraceFormat() override {}
780c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez
790d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko  void AppendAsTraceFormat(std::string* out) const override {
800d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko    out->append(trace_config_.ToString());
810d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko  }
820d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko
830d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko private:
840d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko  const TraceConfig trace_config_;
850d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko};
860d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko
870c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavezstd::set<MemoryDumpLevelOfDetail> GetDefaultAllowedMemoryDumpModes() {
880c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  std::set<MemoryDumpLevelOfDetail> all_modes;
890c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  for (uint32_t mode = static_cast<uint32_t>(MemoryDumpLevelOfDetail::FIRST);
900c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez       mode <= static_cast<uint32_t>(MemoryDumpLevelOfDetail::LAST); mode++) {
910c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    all_modes.insert(static_cast<MemoryDumpLevelOfDetail>(mode));
920c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  }
930c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  return all_modes;
940c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez}
95b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
960c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez}  // namespace
9794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
980c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector ChavezTraceConfig::MemoryDumpConfig::HeapProfiler::HeapProfiler()
990c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    : breakdown_threshold_bytes(kDefaultBreakdownThresholdBytes) {}
10094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
10194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavezvoid TraceConfig::MemoryDumpConfig::HeapProfiler::Clear() {
10294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez  breakdown_threshold_bytes = kDefaultBreakdownThresholdBytes;
10394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez}
10494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
1050c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavezvoid TraceConfig::ResetMemoryDumpConfig(
1060c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    const TraceConfig::MemoryDumpConfig& memory_dump_config) {
1070c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  memory_dump_config_.Clear();
1080c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  memory_dump_config_ = memory_dump_config;
1090c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez}
1100c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez
1110c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector ChavezTraceConfig::MemoryDumpConfig::MemoryDumpConfig() {}
11294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
11394ffa55491333f3dcc701befd0d2652922916d99Luis Hector ChavezTraceConfig::MemoryDumpConfig::MemoryDumpConfig(
11494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez    const MemoryDumpConfig& other) = default;
11594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
1160c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector ChavezTraceConfig::MemoryDumpConfig::~MemoryDumpConfig() {}
11794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
11894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavezvoid TraceConfig::MemoryDumpConfig::Clear() {
1190c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  allowed_dump_modes.clear();
12094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez  triggers.clear();
12194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez  heap_profiler_options.Clear();
12294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez}
12394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
12436040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abevoid TraceConfig::MemoryDumpConfig::Merge(
12536040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe    const TraceConfig::MemoryDumpConfig& config) {
12636040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe  triggers.insert(triggers.end(), config.triggers.begin(),
12736040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe                  config.triggers.end());
12836040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe  allowed_dump_modes.insert(config.allowed_dump_modes.begin(),
12936040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe                            config.allowed_dump_modes.end());
13036040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe  heap_profiler_options.breakdown_threshold_bytes =
13136040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe      std::min(heap_profiler_options.breakdown_threshold_bytes,
13236040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe               config.heap_profiler_options.breakdown_threshold_bytes);
13336040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe}
13436040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe
13536040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko AbeTraceConfig::EventFilterConfig::EventFilterConfig(
13636040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe    const std::string& predicate_name)
13736040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe    : predicate_name_(predicate_name) {}
13836040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe
13936040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko AbeTraceConfig::EventFilterConfig::~EventFilterConfig() {}
14036040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe
14136040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko AbeTraceConfig::EventFilterConfig::EventFilterConfig(const EventFilterConfig& tc) {
14236040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe  *this = tc;
14336040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe}
14436040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe
14536040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko AbeTraceConfig::EventFilterConfig& TraceConfig::EventFilterConfig::operator=(
14636040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe    const TraceConfig::EventFilterConfig& rhs) {
14736040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe  if (this == &rhs)
14836040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe    return *this;
14936040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe
15036040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe  predicate_name_ = rhs.predicate_name_;
15136040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe  included_categories_ = rhs.included_categories_;
15236040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe  excluded_categories_ = rhs.excluded_categories_;
15336040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe  if (rhs.args_)
15436040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe    args_ = rhs.args_->CreateDeepCopy();
15536040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe
15636040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe  return *this;
15736040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe}
15836040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe
15936040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abevoid TraceConfig::EventFilterConfig::AddIncludedCategory(
16036040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe    const std::string& category) {
16136040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe  included_categories_.push_back(category);
16236040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe}
16336040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe
16436040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abevoid TraceConfig::EventFilterConfig::AddExcludedCategory(
16536040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe    const std::string& category) {
16636040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe  excluded_categories_.push_back(category);
16736040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe}
16836040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe
16936040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abevoid TraceConfig::EventFilterConfig::SetArgs(
17036040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe    std::unique_ptr<base::DictionaryValue> args) {
17136040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe  args_ = std::move(args);
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(
18936040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe    const char* category_group_name) const {
19036040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe  CStringTokenizer category_group_tokens(
19136040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe      category_group_name, category_group_name + strlen(category_group_name),
19236040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe      ",");
19336040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe  while (category_group_tokens.GetNext()) {
19436040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe    std::string category_group_token = category_group_tokens.token();
19536040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe
19636040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe    for (const auto& excluded_category : excluded_categories_) {
19736040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe      if (base::MatchPattern(category_group_token, excluded_category)) {
19836040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe        return false;
19936040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe      }
20036040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe    }
20136040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe
20236040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe    for (const auto& included_category : included_categories_) {
20336040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe      if (base::MatchPattern(category_group_token, included_category)) {
20436040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe        return true;
20536040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe      }
20636040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe    }
20736040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe  }
20836040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe
20936040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe  return false;
21036040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe}
21136040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe
212b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratTraceConfig::TraceConfig() {
213b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  InitializeDefault();
214b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat}
215b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
2160c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector ChavezTraceConfig::TraceConfig(StringPiece category_filter_string,
2170c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez                         StringPiece trace_options_string) {
218b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  InitializeFromStrings(category_filter_string, trace_options_string);
219b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat}
220b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
2210c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector ChavezTraceConfig::TraceConfig(StringPiece category_filter_string,
222b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat                         TraceRecordMode record_mode) {
223b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  std::string trace_options_string;
224b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  switch (record_mode) {
225b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    case RECORD_UNTIL_FULL:
226b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat      trace_options_string = kRecordUntilFull;
227b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat      break;
228b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    case RECORD_CONTINUOUSLY:
229b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat      trace_options_string = kRecordContinuously;
230b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat      break;
231b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    case RECORD_AS_MUCH_AS_POSSIBLE:
232b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat      trace_options_string = kRecordAsMuchAsPossible;
233b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat      break;
234b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    case ECHO_TO_CONSOLE:
235b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat      trace_options_string = kTraceToConsole;
236b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat      break;
237b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    default:
238b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat      NOTREACHED();
239b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  }
240b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  InitializeFromStrings(category_filter_string, trace_options_string);
241b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat}
242b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
24394ffa55491333f3dcc701befd0d2652922916d99Luis Hector ChavezTraceConfig::TraceConfig(const DictionaryValue& config) {
24494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez  InitializeFromConfigDict(config);
24594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez}
24694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
2470c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector ChavezTraceConfig::TraceConfig(StringPiece config_string) {
248b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  if (!config_string.empty())
249b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    InitializeFromConfigString(config_string);
250b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  else
251b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    InitializeDefault();
252b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat}
253b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
254b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratTraceConfig::TraceConfig(const TraceConfig& tc)
255b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    : record_mode_(tc.record_mode_),
256b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat      enable_systrace_(tc.enable_systrace_),
257b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat      enable_argument_filter_(tc.enable_argument_filter_),
2580d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko      memory_dump_config_(tc.memory_dump_config_),
259b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat      included_categories_(tc.included_categories_),
260b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat      disabled_categories_(tc.disabled_categories_),
261b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat      excluded_categories_(tc.excluded_categories_),
26236040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe      synthetic_delays_(tc.synthetic_delays_),
26336040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe      event_filters_(tc.event_filters_) {}
264b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
265b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratTraceConfig::~TraceConfig() {
266b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat}
267b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
268b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratTraceConfig& TraceConfig::operator=(const TraceConfig& rhs) {
269b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  if (this == &rhs)
270b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    return *this;
271b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
272b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  record_mode_ = rhs.record_mode_;
273b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  enable_systrace_ = rhs.enable_systrace_;
274b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  enable_argument_filter_ = rhs.enable_argument_filter_;
2750d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko  memory_dump_config_ = rhs.memory_dump_config_;
276b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  included_categories_ = rhs.included_categories_;
277b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  disabled_categories_ = rhs.disabled_categories_;
278b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  excluded_categories_ = rhs.excluded_categories_;
279b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  synthetic_delays_ = rhs.synthetic_delays_;
28036040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe  event_filters_ = rhs.event_filters_;
281b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  return *this;
282b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat}
283b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
284b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratconst TraceConfig::StringList& TraceConfig::GetSyntheticDelayValues() const {
285b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  return synthetic_delays_;
286b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat}
287b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
288b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratstd::string TraceConfig::ToString() const {
2890c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  std::unique_ptr<DictionaryValue> dict = ToDict();
290b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  std::string json;
2910c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  JSONWriter::Write(*dict, &json);
292b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  return json;
293b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat}
294b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
29594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavezstd::unique_ptr<ConvertableToTraceFormat>
29694ffa55491333f3dcc701befd0d2652922916d99Luis Hector ChavezTraceConfig::AsConvertableToTraceFormat() const {
29736040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe  return MakeUnique<ConvertableTraceConfigToTraceFormat>(*this);
2980d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko}
2990d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko
300b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratstd::string TraceConfig::ToCategoryFilterString() const {
301b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  std::string filter_string;
302b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  WriteCategoryFilterString(included_categories_, &filter_string, true);
303b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  WriteCategoryFilterString(disabled_categories_, &filter_string, true);
304b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  WriteCategoryFilterString(excluded_categories_, &filter_string, false);
305b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  WriteCategoryFilterString(synthetic_delays_, &filter_string);
306b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  return filter_string;
307b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat}
308b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
309b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratbool TraceConfig::IsCategoryGroupEnabled(
310b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    const char* category_group_name) const {
311b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  // TraceLog should call this method only as part of enabling/disabling
312b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  // categories.
313b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
314b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  bool had_enabled_by_default = false;
315b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  DCHECK(category_group_name);
3160c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  std::string category_group_name_str = category_group_name;
3170c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  StringTokenizer category_group_tokens(category_group_name_str, ",");
318b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  while (category_group_tokens.GetNext()) {
319b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    std::string category_group_token = category_group_tokens.token();
320b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    // Don't allow empty tokens, nor tokens with leading or trailing space.
321b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    DCHECK(!TraceConfig::IsEmptyOrContainsLeadingOrTrailingWhitespace(
322b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat               category_group_token))
323b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat        << "Disallowed category string";
3240c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    if (IsCategoryEnabled(category_group_token.c_str()))
325b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat      return true;
3260c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez
3270c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    if (!MatchPattern(category_group_token, TRACE_DISABLED_BY_DEFAULT("*")))
328b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat      had_enabled_by_default = true;
329b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  }
330b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  // Do a second pass to check for explicitly disabled categories
331b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  // (those explicitly enabled have priority due to first pass).
332b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  category_group_tokens.Reset();
333b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  bool category_group_disabled = false;
334b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  while (category_group_tokens.GetNext()) {
335b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    std::string category_group_token = category_group_tokens.token();
3360c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    for (const std::string& category : excluded_categories_) {
3370c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez      if (MatchPattern(category_group_token, category)) {
338b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat        // Current token of category_group_name is present in excluded_list.
339b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat        // Flag the exclusion and proceed further to check if any of the
340b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat        // remaining categories of category_group_name is not present in the
341b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat        // excluded_ list.
342b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat        category_group_disabled = true;
343b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat        break;
344b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat      }
345b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat      // One of the category of category_group_name is not present in
3460d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko      // excluded_ list. So, if it's not a disabled-by-default category,
3470d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko      // it has to be included_ list. Enable the category_group_name
3480d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko      // for recording.
3490c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez      if (!MatchPattern(category_group_token, TRACE_DISABLED_BY_DEFAULT("*"))) {
3500d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko        category_group_disabled = false;
3510d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko      }
352b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    }
353b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    // One of the categories present in category_group_name is not present in
354b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    // excluded_ list. Implies this category_group_name group can be enabled
355b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    // for recording, since one of its groups is enabled for recording.
356b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    if (!category_group_disabled)
357b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat      break;
358b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  }
359b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  // If the category group is not excluded, and there are no included patterns
360b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  // we consider this category group enabled, as long as it had categories
361b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  // other than disabled-by-default.
3620c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  return !category_group_disabled && had_enabled_by_default &&
3630c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez         included_categories_.empty();
364b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat}
365b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
366b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratvoid TraceConfig::Merge(const TraceConfig& config) {
367b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  if (record_mode_ != config.record_mode_
368b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat      || enable_systrace_ != config.enable_systrace_
369b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat      || enable_argument_filter_ != config.enable_argument_filter_) {
370b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    DLOG(ERROR) << "Attempting to merge trace config with a different "
371b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat                << "set of options.";
372b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  }
373b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
374b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  // Keep included patterns only if both filters have an included entry.
375b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  // Otherwise, one of the filter was specifying "*" and we want to honor the
376b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  // broadest filter.
377b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  if (HasIncludedPatterns() && config.HasIncludedPatterns()) {
378b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    included_categories_.insert(included_categories_.end(),
379b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat                                config.included_categories_.begin(),
380b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat                                config.included_categories_.end());
381b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  } else {
382b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    included_categories_.clear();
383b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  }
384b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
38536040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe  memory_dump_config_.Merge(config.memory_dump_config_);
3860d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko
387b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  disabled_categories_.insert(disabled_categories_.end(),
388b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat                              config.disabled_categories_.begin(),
389b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat                              config.disabled_categories_.end());
390b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  excluded_categories_.insert(excluded_categories_.end(),
391b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat                              config.excluded_categories_.begin(),
392b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat                              config.excluded_categories_.end());
393b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  synthetic_delays_.insert(synthetic_delays_.end(),
394b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat                           config.synthetic_delays_.begin(),
395b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat                           config.synthetic_delays_.end());
39636040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe  event_filters_.insert(event_filters_.end(), config.event_filters().begin(),
39736040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe                        config.event_filters().end());
398b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat}
399b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
400b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratvoid TraceConfig::Clear() {
401b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  record_mode_ = RECORD_UNTIL_FULL;
402b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  enable_systrace_ = false;
403b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  enable_argument_filter_ = false;
404b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  included_categories_.clear();
405b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  disabled_categories_.clear();
406b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  excluded_categories_.clear();
407b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  synthetic_delays_.clear();
40894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez  memory_dump_config_.Clear();
40936040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe  event_filters_.clear();
410b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat}
411b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
412b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratvoid TraceConfig::InitializeDefault() {
413b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  record_mode_ = RECORD_UNTIL_FULL;
414b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  enable_systrace_ = false;
415b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  enable_argument_filter_ = false;
416b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat}
417b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
41894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavezvoid TraceConfig::InitializeFromConfigDict(const DictionaryValue& dict) {
419b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  record_mode_ = RECORD_UNTIL_FULL;
420b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  std::string record_mode;
42194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez  if (dict.GetString(kRecordModeParam, &record_mode)) {
422b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    if (record_mode == kRecordUntilFull) {
423b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat      record_mode_ = RECORD_UNTIL_FULL;
424b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    } else if (record_mode == kRecordContinuously) {
425b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat      record_mode_ = RECORD_CONTINUOUSLY;
426b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    } else if (record_mode == kTraceToConsole) {
427b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat      record_mode_ = ECHO_TO_CONSOLE;
428b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    } else if (record_mode == kRecordAsMuchAsPossible) {
429b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat      record_mode_ = RECORD_AS_MUCH_AS_POSSIBLE;
430b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    }
431b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  }
432b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
4330c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  bool val;
4340c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  enable_systrace_ = dict.GetBoolean(kEnableSystraceParam, &val) ? val : false;
4350c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  enable_argument_filter_ =
4360c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez      dict.GetBoolean(kEnableArgumentFilterParam, &val) ? val : false;
437b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
4380c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  const ListValue* category_list = nullptr;
43994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez  if (dict.GetList(kIncludedCategoriesParam, &category_list))
440b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    SetCategoriesFromIncludedList(*category_list);
44194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez  if (dict.GetList(kExcludedCategoriesParam, &category_list))
442b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    SetCategoriesFromExcludedList(*category_list);
44394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez  if (dict.GetList(kSyntheticDelaysParam, &category_list))
444b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    SetSyntheticDelaysFromList(*category_list);
4450d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko
44636040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe  const base::ListValue* category_event_filters = nullptr;
44736040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe  if (dict.GetList(kEventFiltersParam, &category_event_filters))
44836040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe    SetEventFiltersFromConfigList(*category_event_filters);
44936040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe
4500d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko  if (IsCategoryEnabled(MemoryDumpManager::kTraceCategory)) {
4510d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko    // If dump triggers not set, the client is using the legacy with just
4520d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko    // category enabled. So, use the default periodic dump config.
4530c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    const DictionaryValue* memory_dump_config = nullptr;
45494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez    if (dict.GetDictionary(kMemoryDumpConfigParam, &memory_dump_config))
4550c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez      SetMemoryDumpConfigFromConfigDict(*memory_dump_config);
4560d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko    else
4570d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko      SetDefaultMemoryDumpConfig();
4580d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko  }
459b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat}
460b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
4610c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavezvoid TraceConfig::InitializeFromConfigString(StringPiece config_string) {
4620c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  auto dict = DictionaryValue::From(JSONReader::Read(config_string));
4630c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  if (dict)
4640c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    InitializeFromConfigDict(*dict);
4650c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  else
4660c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    InitializeDefault();
46794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez}
46894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
4690c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavezvoid TraceConfig::InitializeFromStrings(StringPiece category_filter_string,
4700c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez                                        StringPiece trace_options_string) {
471b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  if (!category_filter_string.empty()) {
4720c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    std::vector<std::string> split = SplitString(
4730c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez        category_filter_string, ",", TRIM_WHITESPACE, SPLIT_WANT_ALL);
4740c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    for (const std::string& category : split) {
475b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat      // Ignore empty categories.
476b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat      if (category.empty())
477b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat        continue;
478b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat      // Synthetic delays are of the form 'DELAY(delay;option;option;...)'.
4790c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez      if (StartsWith(category, kSyntheticDelayCategoryFilterPrefix,
4800c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez                     CompareCase::SENSITIVE) &&
4810c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez          category.back() == ')') {
4820c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez        std::string synthetic_category = category.substr(
483b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat            strlen(kSyntheticDelayCategoryFilterPrefix),
484b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat            category.size() - strlen(kSyntheticDelayCategoryFilterPrefix) - 1);
4850c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez        size_t name_length = synthetic_category.find(';');
486b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat        if (name_length != std::string::npos && name_length > 0 &&
4870c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez            name_length != synthetic_category.size() - 1) {
4880c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez          synthetic_delays_.push_back(synthetic_category);
489b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat        }
4900c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez      } else if (category.front() == '-') {
491b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat        // Excluded categories start with '-'.
492b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat        // Remove '-' from category string.
4930c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez        excluded_categories_.push_back(category.substr(1));
494b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat      } else if (category.compare(0, strlen(TRACE_DISABLED_BY_DEFAULT("")),
495b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat                                  TRACE_DISABLED_BY_DEFAULT("")) == 0) {
496b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat        disabled_categories_.push_back(category);
497b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat      } else {
498b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat        included_categories_.push_back(category);
499b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat      }
500b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    }
501b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  }
502b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
503b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  record_mode_ = RECORD_UNTIL_FULL;
504b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  enable_systrace_ = false;
505b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  enable_argument_filter_ = false;
5060c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  if (!trace_options_string.empty()) {
5070c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    std::vector<std::string> split =
5080c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez        SplitString(trace_options_string, ",", TRIM_WHITESPACE, SPLIT_WANT_ALL);
5090c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    for (const std::string& token : split) {
5100c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez      if (token == kRecordUntilFull) {
511b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat        record_mode_ = RECORD_UNTIL_FULL;
5120c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez      } else if (token == kRecordContinuously) {
513b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat        record_mode_ = RECORD_CONTINUOUSLY;
5140c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez      } else if (token == kTraceToConsole) {
515b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat        record_mode_ = ECHO_TO_CONSOLE;
5160c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez      } else if (token == kRecordAsMuchAsPossible) {
517b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat        record_mode_ = RECORD_AS_MUCH_AS_POSSIBLE;
5180c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez      } else if (token == kEnableSystrace) {
519b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat        enable_systrace_ = true;
5200c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez      } else if (token == kEnableArgumentFilter) {
521b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat        enable_argument_filter_ = true;
522b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat      }
523b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    }
524b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  }
5250d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko
5260d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko  if (IsCategoryEnabled(MemoryDumpManager::kTraceCategory)) {
5270d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko    SetDefaultMemoryDumpConfig();
5280d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko  }
529b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat}
530b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
531b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratvoid TraceConfig::SetCategoriesFromIncludedList(
5320c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    const ListValue& included_list) {
533b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  included_categories_.clear();
534b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  for (size_t i = 0; i < included_list.GetSize(); ++i) {
535b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    std::string category;
536b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    if (!included_list.GetString(i, &category))
537b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat      continue;
538b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    if (category.compare(0, strlen(TRACE_DISABLED_BY_DEFAULT("")),
539b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat                         TRACE_DISABLED_BY_DEFAULT("")) == 0) {
540b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat      disabled_categories_.push_back(category);
541b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    } else {
542b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat      included_categories_.push_back(category);
543b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    }
544b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  }
545b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat}
546b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
547b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratvoid TraceConfig::SetCategoriesFromExcludedList(
5480c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    const ListValue& excluded_list) {
549b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  excluded_categories_.clear();
550b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  for (size_t i = 0; i < excluded_list.GetSize(); ++i) {
551b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    std::string category;
552b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    if (excluded_list.GetString(i, &category))
553b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat      excluded_categories_.push_back(category);
554b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  }
555b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat}
556b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
5570c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavezvoid TraceConfig::SetSyntheticDelaysFromList(const ListValue& list) {
558b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  synthetic_delays_.clear();
559b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  for (size_t i = 0; i < list.GetSize(); ++i) {
560b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    std::string delay;
561b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    if (!list.GetString(i, &delay))
562b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat      continue;
563b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    // Synthetic delays are of the form "delay;option;option;...".
564b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    size_t name_length = delay.find(';');
565b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    if (name_length != std::string::npos && name_length > 0 &&
566b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat        name_length != delay.size() - 1) {
567b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat      synthetic_delays_.push_back(delay);
568b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    }
569b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  }
570b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat}
571b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
5720c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavezvoid TraceConfig::AddCategoryToDict(DictionaryValue* dict,
573b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat                                    const char* param,
574b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat                                    const StringList& categories) const {
575b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  if (categories.empty())
576b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    return;
577b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
5780c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  auto list = MakeUnique<ListValue>();
5790c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  for (const std::string& category : categories)
5800c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    list->AppendString(category);
5810c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  dict->Set(param, std::move(list));
5820d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko}
5830d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko
5840c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavezvoid TraceConfig::SetMemoryDumpConfigFromConfigDict(
5850c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    const DictionaryValue& memory_dump_config) {
5860c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  // Set allowed dump modes.
5870c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  memory_dump_config_.allowed_dump_modes.clear();
5880c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  const ListValue* allowed_modes_list;
5890c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  if (memory_dump_config.GetList(kAllowedDumpModesParam, &allowed_modes_list)) {
5900c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    for (size_t i = 0; i < allowed_modes_list->GetSize(); ++i) {
5910c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez      std::string level_of_detail_str;
5920c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez      allowed_modes_list->GetString(i, &level_of_detail_str);
5930c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez      memory_dump_config_.allowed_dump_modes.insert(
5940c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez          StringToMemoryDumpLevelOfDetail(level_of_detail_str));
5950c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    }
5960c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  } else {
5970c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    // If allowed modes param is not given then allow all modes by default.
5980c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    memory_dump_config_.allowed_dump_modes = GetDefaultAllowedMemoryDumpModes();
5990c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  }
6000c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez
60194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez  // Set triggers
60294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez  memory_dump_config_.triggers.clear();
6030c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  const ListValue* trigger_list = nullptr;
60494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez  if (memory_dump_config.GetList(kTriggersParam, &trigger_list) &&
60594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      trigger_list->GetSize() > 0) {
60694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez    for (size_t i = 0; i < trigger_list->GetSize(); ++i) {
6070c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez      const DictionaryValue* trigger = nullptr;
60894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      if (!trigger_list->GetDictionary(i, &trigger))
60994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez        continue;
6100d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko
61136040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe      MemoryDumpConfig::Trigger dump_config;
61294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      int interval = 0;
61336040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe      if (!trigger->GetInteger(kMinTimeBetweenDumps, &interval)) {
61436040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe        // If "min_time_between_dumps_ms" param was not given, then the trace
61536040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe        // config uses old format where only periodic dumps are supported.
61636040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe        trigger->GetInteger(kPeriodicIntervalLegacyParam, &interval);
61736040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe        dump_config.trigger_type = MemoryDumpType::PERIODIC_INTERVAL;
61836040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe      } else {
61936040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe        std::string trigger_type_str;
62036040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe        trigger->GetString(kTriggerTypeParam, &trigger_type_str);
62136040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe        dump_config.trigger_type = StringToMemoryDumpType(trigger_type_str);
62236040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe      }
623e5b2c6fa6f923f3a2f66346c2f169d9f0fceb3dcLuis Hector Chavez      DCHECK_GT(interval, 0);
62436040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe      dump_config.min_time_between_dumps_ms = static_cast<uint32_t>(interval);
62536040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe
62694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      std::string level_of_detail_str;
62736040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe      trigger->GetString(kTriggerModeParam, &level_of_detail_str);
62894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      dump_config.level_of_detail =
62994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez          StringToMemoryDumpLevelOfDetail(level_of_detail_str);
63036040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe
63194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      memory_dump_config_.triggers.push_back(dump_config);
63294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez    }
63394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez  }
6340d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko
63594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez  // Set heap profiler options
6360c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  const DictionaryValue* heap_profiler_options = nullptr;
63794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez  if (memory_dump_config.GetDictionary(kHeapProfilerOptions,
63894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                                       &heap_profiler_options)) {
63994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez    int min_size_bytes = 0;
64094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez    if (heap_profiler_options->GetInteger(kBreakdownThresholdBytes,
64194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                                         &min_size_bytes)
64294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez        && min_size_bytes >= 0) {
64394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      memory_dump_config_.heap_profiler_options.breakdown_threshold_bytes =
64494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez          static_cast<size_t>(min_size_bytes);
64594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez    } else {
64694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      memory_dump_config_.heap_profiler_options.breakdown_threshold_bytes =
64794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez          MemoryDumpConfig::HeapProfiler::kDefaultBreakdownThresholdBytes;
6480d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko    }
6490d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko  }
6500d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko}
6510d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko
6520d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenkovoid TraceConfig::SetDefaultMemoryDumpConfig() {
65394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez  memory_dump_config_.Clear();
65494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez  memory_dump_config_.triggers.push_back(kDefaultHeavyMemoryDumpTrigger);
65594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez  memory_dump_config_.triggers.push_back(kDefaultLightMemoryDumpTrigger);
6560c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  memory_dump_config_.allowed_dump_modes = GetDefaultAllowedMemoryDumpModes();
657b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat}
658b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
65936040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abevoid TraceConfig::SetEventFiltersFromConfigList(
66036040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe    const base::ListValue& category_event_filters) {
66136040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe  event_filters_.clear();
66236040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe
66336040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe  for (size_t event_filter_index = 0;
66436040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe       event_filter_index < category_event_filters.GetSize();
66536040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe       ++event_filter_index) {
66636040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe    const base::DictionaryValue* event_filter = nullptr;
66736040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe    if (!category_event_filters.GetDictionary(event_filter_index,
66836040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe                                              &event_filter))
66936040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe      continue;
67036040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe
67136040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe    std::string predicate_name;
67236040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe    CHECK(event_filter->GetString(kFilterPredicateParam, &predicate_name))
67336040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe        << "Invalid predicate name in category event filter.";
67436040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe
67536040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe    EventFilterConfig new_config(predicate_name);
67636040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe    const base::ListValue* included_list = nullptr;
67736040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe    CHECK(event_filter->GetList(kIncludedCategoriesParam, &included_list))
67836040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe        << "Missing included_categories in category event filter.";
67936040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe
68036040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe    for (size_t i = 0; i < included_list->GetSize(); ++i) {
68136040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe      std::string category;
68236040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe      if (included_list->GetString(i, &category))
68336040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe        new_config.AddIncludedCategory(category);
68436040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe    }
68536040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe
68636040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe    const base::ListValue* excluded_list = nullptr;
68736040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe    if (event_filter->GetList(kExcludedCategoriesParam, &excluded_list)) {
68836040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe      for (size_t i = 0; i < excluded_list->GetSize(); ++i) {
68936040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe        std::string category;
69036040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe        if (excluded_list->GetString(i, &category))
69136040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe          new_config.AddExcludedCategory(category);
69236040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe      }
69336040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe    }
69436040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe
69536040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe    const base::DictionaryValue* args_dict = nullptr;
69636040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe    if (event_filter->GetDictionary(kFilterArgsParam, &args_dict))
69736040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe      new_config.SetArgs(args_dict->CreateDeepCopy());
69836040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe
69936040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe    event_filters_.push_back(new_config);
70036040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe  }
70136040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe}
70236040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe
7030c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavezstd::unique_ptr<DictionaryValue> TraceConfig::ToDict() const {
7040c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  auto dict = MakeUnique<DictionaryValue>();
705b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  switch (record_mode_) {
706b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    case RECORD_UNTIL_FULL:
7070c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez      dict->SetString(kRecordModeParam, kRecordUntilFull);
708b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat      break;
709b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    case RECORD_CONTINUOUSLY:
7100c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez      dict->SetString(kRecordModeParam, kRecordContinuously);
711b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat      break;
712b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    case RECORD_AS_MUCH_AS_POSSIBLE:
7130c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez      dict->SetString(kRecordModeParam, kRecordAsMuchAsPossible);
714b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat      break;
715b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    case ECHO_TO_CONSOLE:
7160c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez      dict->SetString(kRecordModeParam, kTraceToConsole);
717b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat      break;
718b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    default:
719b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat      NOTREACHED();
720b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  }
721b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
7220c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  dict->SetBoolean(kEnableSystraceParam, enable_systrace_);
7230c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  dict->SetBoolean(kEnableArgumentFilterParam, enable_argument_filter_);
724b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
725b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  StringList categories(included_categories_);
726b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  categories.insert(categories.end(),
727b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat                    disabled_categories_.begin(),
728b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat                    disabled_categories_.end());
7290c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  AddCategoryToDict(dict.get(), kIncludedCategoriesParam, categories);
7300c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  AddCategoryToDict(dict.get(), kExcludedCategoriesParam, excluded_categories_);
7310c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  AddCategoryToDict(dict.get(), kSyntheticDelaysParam, synthetic_delays_);
7320d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko
73336040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe  if (!event_filters_.empty()) {
73436040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe    std::unique_ptr<base::ListValue> filter_list(new base::ListValue());
73536040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe    for (const EventFilterConfig& filter : event_filters_) {
73636040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe      std::unique_ptr<base::DictionaryValue> filter_dict(
73736040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe          new base::DictionaryValue());
73836040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe      filter_dict->SetString(kFilterPredicateParam, filter.predicate_name());
73936040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe
74036040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe      std::unique_ptr<base::ListValue> included_categories_list(
74136040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe          new base::ListValue());
74236040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe      for (const std::string& included_category : filter.included_categories())
74336040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe        included_categories_list->AppendString(included_category);
74436040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe
74536040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe      filter_dict->Set(kIncludedCategoriesParam,
74636040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe                       std::move(included_categories_list));
74736040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe
74836040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe      if (!filter.excluded_categories().empty()) {
74936040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe        std::unique_ptr<base::ListValue> excluded_categories_list(
75036040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe            new base::ListValue());
75136040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe        for (const std::string& excluded_category :
75236040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe             filter.excluded_categories())
75336040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe          excluded_categories_list->AppendString(excluded_category);
75436040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe
75536040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe        filter_dict->Set(kExcludedCategoriesParam,
75636040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe                         std::move(excluded_categories_list));
75736040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe      }
75836040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe
75936040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe      if (filter.filter_args())
76036040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe        filter_dict->Set(kFilterArgsParam,
76136040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe                         filter.filter_args()->CreateDeepCopy());
76236040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe
76336040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe      filter_list->Append(std::move(filter_dict));
76436040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe    }
76536040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe    dict->Set(kEventFiltersParam, std::move(filter_list));
76636040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe  }
76736040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe
7680d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko  if (IsCategoryEnabled(MemoryDumpManager::kTraceCategory)) {
7690c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    auto allowed_modes = MakeUnique<ListValue>();
7700c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    for (auto dump_mode : memory_dump_config_.allowed_dump_modes)
7710c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez      allowed_modes->AppendString(MemoryDumpLevelOfDetailToString(dump_mode));
7720c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez
7730c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    auto memory_dump_config = MakeUnique<DictionaryValue>();
7740c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    memory_dump_config->Set(kAllowedDumpModesParam, std::move(allowed_modes));
7750c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez
7760c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    auto triggers_list = MakeUnique<ListValue>();
7770c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    for (const auto& config : memory_dump_config_.triggers) {
7780c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez      auto trigger_dict = MakeUnique<DictionaryValue>();
77936040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe      trigger_dict->SetString(kTriggerTypeParam,
78036040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe                              MemoryDumpTypeToString(config.trigger_type));
78136040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe      trigger_dict->SetInteger(
78236040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe          kMinTimeBetweenDumps,
78336040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe          static_cast<int>(config.min_time_between_dumps_ms));
7840d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko      trigger_dict->SetString(
78536040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe          kTriggerModeParam,
78636040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe          MemoryDumpLevelOfDetailToString(config.level_of_detail));
7870d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko      triggers_list->Append(std::move(trigger_dict));
7880d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko    }
7890d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko
7900d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko    // Empty triggers will still be specified explicitly since it means that
7910d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko    // the periodic dumps are not enabled.
7920d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko    memory_dump_config->Set(kTriggersParam, std::move(triggers_list));
79394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
79494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez    if (memory_dump_config_.heap_profiler_options.breakdown_threshold_bytes !=
79594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez        MemoryDumpConfig::HeapProfiler::kDefaultBreakdownThresholdBytes) {
7960c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez      auto options = MakeUnique<DictionaryValue>();
7970c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez      options->SetInteger(
79894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez          kBreakdownThresholdBytes,
79994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez          memory_dump_config_.heap_profiler_options.breakdown_threshold_bytes);
8000c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez      memory_dump_config->Set(kHeapProfilerOptions, std::move(options));
80194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez    }
8020c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    dict->Set(kMemoryDumpConfigParam, std::move(memory_dump_config));
8030d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko  }
8040c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  return dict;
805b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat}
806b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
807b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratstd::string TraceConfig::ToTraceOptionsString() const {
808b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  std::string ret;
809b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  switch (record_mode_) {
810b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    case RECORD_UNTIL_FULL:
811b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat      ret = kRecordUntilFull;
812b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat      break;
813b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    case RECORD_CONTINUOUSLY:
814b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat      ret = kRecordContinuously;
815b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat      break;
816b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    case RECORD_AS_MUCH_AS_POSSIBLE:
817b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat      ret = kRecordAsMuchAsPossible;
818b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat      break;
819b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    case ECHO_TO_CONSOLE:
820b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat      ret = kTraceToConsole;
821b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat      break;
822b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    default:
823b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat      NOTREACHED();
824b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  }
825b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  if (enable_systrace_)
826b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    ret = ret + "," + kEnableSystrace;
827b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  if (enable_argument_filter_)
828b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    ret = ret + "," + kEnableArgumentFilter;
829b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  return ret;
830b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat}
831b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
832b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratvoid TraceConfig::WriteCategoryFilterString(const StringList& values,
833b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat                                            std::string* out,
834b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat                                            bool included) const {
835b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  bool prepend_comma = !out->empty();
836b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  int token_cnt = 0;
8370c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  for (const std::string& category : values) {
838b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    if (token_cnt > 0 || prepend_comma)
839b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat      StringAppendF(out, ",");
8400c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    StringAppendF(out, "%s%s", (included ? "" : "-"), category.c_str());
841b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    ++token_cnt;
842b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  }
843b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat}
844b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
845b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratvoid TraceConfig::WriteCategoryFilterString(const StringList& delays,
846b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat                                            std::string* out) const {
847b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  bool prepend_comma = !out->empty();
848b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  int token_cnt = 0;
8490c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  for (const std::string& category : delays) {
850b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    if (token_cnt > 0 || prepend_comma)
851b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat      StringAppendF(out, ",");
852b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    StringAppendF(out, "%s%s)", kSyntheticDelayCategoryFilterPrefix,
8530c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez                  category.c_str());
854b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    ++token_cnt;
855b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  }
856b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat}
857b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
858b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratbool TraceConfig::IsCategoryEnabled(const char* category_name) const {
859b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  // Check the disabled- filters and the disabled-* wildcard first so that a
860b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  // "*" filter does not include the disabled.
8610c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  for (const std::string& category : disabled_categories_) {
8620c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    if (MatchPattern(category_name, category))
863b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat      return true;
864b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  }
865b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
8660c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  if (MatchPattern(category_name, TRACE_DISABLED_BY_DEFAULT("*")))
867b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    return false;
868b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
8690c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  for (const std::string& category : included_categories_) {
8700c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    if (MatchPattern(category_name, category))
871b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat      return true;
872b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  }
873b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
874b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  return false;
875b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat}
876b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
877b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratbool TraceConfig::IsEmptyOrContainsLeadingOrTrailingWhitespace(
8780c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    StringPiece str) {
8790c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  return str.empty() || str.front() == ' ' || str.back() == ' ';
880b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat}
881b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
882b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratbool TraceConfig::HasIncludedPatterns() const {
883b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  return !included_categories_.empty();
884b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat}
885b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
886b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat}  // namespace trace_event
887b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat}  // namespace base
888