1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
android_webview / browser / tracing / aw_trace_event_args_allowlist.cc [blame]
// Copyright 2018 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "android_webview/browser/tracing/aw_trace_event_args_allowlist.h"
#include "base/functional/bind.h"
#include "base/memory/raw_ptr.h"
#include "base/strings/pattern.h"
#include "base/strings/string_tokenizer.h"
#include "base/strings/string_util.h"
#include "base/trace_event/trace_event.h"
namespace {
struct AllowlistEntry {
const char* category_name;
const char* event_name;
raw_ptr<const char* const> arg_name_filter;
};
const char* const kMemoryDumpAllowedArgs[] = {"dumps", nullptr};
const AllowlistEntry kEventArgsAllowlist[] = {
{"__metadata", "thread_name", nullptr},
{"__metadata", "process_name", nullptr},
{"__metadata", "process_uptime_seconds", nullptr},
{"__metadata", "stackFrames", nullptr},
{"__metadata", "typeNames", nullptr},
// Redefined the string since MemoryDumpManager::kTraceCategory causes
// static initialization of this struct.
{TRACE_DISABLED_BY_DEFAULT("memory-infra"), "*", kMemoryDumpAllowedArgs},
{nullptr, nullptr, nullptr}};
} // namespace
namespace android_webview {
// TODO(timvolodine): refactor this into base/ to avoid code duplication
// with chrome/common/trace_event_args_allowlist.cc, see crbug.com/805045.
bool IsTraceArgumentNameAllowlisted(const char* const* granular_filter,
const char* arg_name) {
for (int i = 0; granular_filter[i] != nullptr; ++i) {
if (base::MatchPattern(arg_name, granular_filter[i]))
return true;
}
return false;
}
bool IsTraceEventArgsAllowlisted(
const char* category_group_name,
const char* event_name,
base::trace_event::ArgumentNameFilterPredicate* arg_name_filter) {
DCHECK(arg_name_filter);
base::CStringTokenizer category_group_tokens(
category_group_name, category_group_name + strlen(category_group_name),
",");
while (category_group_tokens.GetNext()) {
const std::string& category_group_token = category_group_tokens.token();
for (int i = 0; kEventArgsAllowlist[i].category_name != nullptr; ++i) {
const AllowlistEntry& allowlist_entry = kEventArgsAllowlist[i];
DCHECK(allowlist_entry.event_name);
if (base::MatchPattern(category_group_token,
allowlist_entry.category_name) &&
base::MatchPattern(event_name, allowlist_entry.event_name)) {
if (allowlist_entry.arg_name_filter) {
*arg_name_filter = base::BindRepeating(
&IsTraceArgumentNameAllowlisted, allowlist_entry.arg_name_filter);
}
return true;
}
}
}
return false;
}
bool IsTraceMetadataAllowlisted(const std::string& name) {
return false;
}
} // namespace android_webview