1 // Copyright 2018 The Chromium Authors
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #ifndef BASE_TRACE_EVENT_BUILTIN_CATEGORIES_H_
6 #define BASE_TRACE_EVENT_BUILTIN_CATEGORIES_H_
7
8 #include <cstddef>
9 #include <iterator>
10
11 #include "base/base_export.h"
12 #include "base/trace_event/common/trace_event_common.h"
13 #include "base/tracing_buildflags.h"
14 #include "build/build_config.h"
15
16 // List of builtin category names. If you want to use a new category name in
17 // your code and you get a static assert, this is the right place to register
18 // the name. If the name is going to be used only for testing, please add it to
19 // |kCategoriesForTesting| instead.
20 //
21 // Since spaces aren't allowed, use '_' to separate words in category names
22 // (e.g., "content_capture").
23 //
24 // Parameter |X| must be a *macro* that takes a single |name| string argument,
25 // denoting a category name.
26 #define INTERNAL_TRACE_LIST_BUILTIN_CATEGORIES(X) \
27 /* These entries must go first to be consistent with the \
28 * CategoryRegistry::kCategory* consts.*/ \
29 X("tracing_categories_exhausted._must_increase_kMaxCategories") \
30 X("tracing_already_shutdown") \
31 X("__metadata") \
32 /* The rest of the list is in alphabetical order */ \
33 X("accessibility") \
34 X("AccountFetcherService") \
35 X("android.ui.jank") \
36 X("android_webview") \
37 X("android_webview.timeline") \
38 /* Actions on Google Hardware, used in Google-internal code. */ \
39 X("aogh") \
40 X("audio") \
41 X("base") \
42 X("benchmark") \
43 X("blink") \
44 X("blink.animations") \
45 X("blink.bindings") \
46 X("blink.console") \
47 X("blink.net") \
48 X("blink.resource") \
49 X("blink.user_timing") \
50 X("blink.worker") \
51 X("blink_style") \
52 X("Blob") \
53 X("browser") \
54 X("browsing_data") \
55 X("CacheStorage") \
56 X("Calculators") \
57 X("CameraStream") \
58 X("cppgc") \
59 X("camera") \
60 X("cast_app") \
61 X("cast_perf_test") \
62 X("cast.mdns") \
63 X("cast.mdns.socket") \
64 X("cast.stream") \
65 X("cc") \
66 X("cc.debug") \
67 X("cdp.perf") \
68 X("chromeos") \
69 X("cma") \
70 X("compositor") \
71 X("content") \
72 X("content_capture") \
73 X("interactions") \
74 X("delegated_ink_trails") \
75 X("device") \
76 X("devtools") \
77 X("devtools.contrast") \
78 X("devtools.timeline") \
79 X("disk_cache") \
80 X("download") \
81 X("download_service") \
82 X("drm") \
83 X("drmcursor") \
84 X("dwrite") \
85 X("evdev") \
86 X("event") \
87 X("exo") \
88 X("extensions") \
89 X("explore_sites") \
90 X("FileSystem") \
91 X("file_system_provider") \
92 X("fledge") \
93 X("fonts") \
94 X("GAMEPAD") \
95 X("gpu") \
96 X("gpu.angle") \
97 X("gpu.angle.texture_metrics") \
98 X("gpu.capture") \
99 X("graphics.pipeline") \
100 X("headless") \
101 /* Traces for //components/history. */ \
102 X("history") \
103 X("hwoverlays") \
104 X("identity") \
105 X("ime") \
106 X("IndexedDB") \
107 X("input") \
108 X("input.scrolling") \
109 X("io") \
110 X("ipc") \
111 X("Java") \
112 X("jni") \
113 X("jpeg") \
114 X("latency") \
115 X("latencyInfo") \
116 X("leveldb") \
117 X("loading") \
118 X("log") \
119 X("login") \
120 X("media") \
121 X("media_router") \
122 X("memory") \
123 X("midi") \
124 X("mojom") \
125 X("mus") \
126 X("native") \
127 X("navigation") \
128 X("navigation.debug") \
129 X("net") \
130 X("network.scheduler") \
131 X("netlog") \
132 X("offline_pages") \
133 X("omnibox") \
134 X("oobe") \
135 X("openscreen") \
136 X("ozone") \
137 X("partition_alloc") \
138 X("passwords") \
139 X("p2p") \
140 X("page-serialization") \
141 X("paint_preview") \
142 X("pepper") \
143 X("PlatformMalloc") \
144 X("power") \
145 X("ppapi") \
146 X("ppapi_proxy") \
147 X("print") \
148 X("raf_investigation") \
149 X("rail") \
150 X("renderer") \
151 X("renderer_host") \
152 X("renderer.scheduler") \
153 X("resources") \
154 X("RLZ") \
155 X("ServiceWorker") \
156 X("SiteEngagement") \
157 X("safe_browsing") \
158 X("scheduler") \
159 X("scheduler.long_tasks") \
160 X("screenlock_monitor") \
161 X("segmentation_platform") \
162 X("sequence_manager") \
163 X("service_manager") \
164 X("sharing") \
165 X("shell") \
166 X("shortcut_viewer") \
167 X("shutdown") \
168 X("skia") \
169 X("sql") \
170 X("stadia_media") \
171 X("stadia_rtc") \
172 X("startup") \
173 X("sync") \
174 X("system_apps") \
175 X("test_gpu") \
176 X("toplevel") \
177 X("toplevel.flow") \
178 X("ui") \
179 X("v8") \
180 X("v8.execute") \
181 X("v8.wasm") \
182 X("ValueStoreFrontend::Backend") \
183 X("views") \
184 X("views.frame") \
185 X("viz") \
186 X("vk") \
187 X("wakeup.flow") \
188 X("wayland") \
189 X("webaudio") \
190 X("webengine.fidl") \
191 X("weblayer") \
192 X("WebCore") \
193 X("webnn") \
194 X("webrtc") \
195 X("webrtc_stats") \
196 X("xr") \
197 X(TRACE_DISABLED_BY_DEFAULT("android_view_hierarchy")) \
198 X(TRACE_DISABLED_BY_DEFAULT("animation-worklet")) \
199 X(TRACE_DISABLED_BY_DEFAULT("audio")) \
200 X(TRACE_DISABLED_BY_DEFAULT("audio.latency")) \
201 X(TRACE_DISABLED_BY_DEFAULT("audio-worklet")) \
202 X(TRACE_DISABLED_BY_DEFAULT("base")) \
203 X(TRACE_DISABLED_BY_DEFAULT("blink.debug")) \
204 X(TRACE_DISABLED_BY_DEFAULT("blink.debug.display_lock")) \
205 X(TRACE_DISABLED_BY_DEFAULT("blink.debug.layout")) \
206 X(TRACE_DISABLED_BY_DEFAULT("blink.debug.layout.trees")) \
207 X(TRACE_DISABLED_BY_DEFAULT("blink.feature_usage")) \
208 X(TRACE_DISABLED_BY_DEFAULT("blink.image_decoding")) \
209 X(TRACE_DISABLED_BY_DEFAULT("blink.invalidation")) \
210 X(TRACE_DISABLED_BY_DEFAULT("identifiability")) \
211 X(TRACE_DISABLED_BY_DEFAULT("identifiability.high_entropy_api")) \
212 X(TRACE_DISABLED_BY_DEFAULT("cc")) \
213 X(TRACE_DISABLED_BY_DEFAULT("cc.debug")) \
214 X(TRACE_DISABLED_BY_DEFAULT("cc.debug.cdp-perf")) \
215 X(TRACE_DISABLED_BY_DEFAULT("cc.debug.display_items")) \
216 X(TRACE_DISABLED_BY_DEFAULT("cc.debug.lcd_text")) \
217 X(TRACE_DISABLED_BY_DEFAULT("cc.debug.picture")) \
218 X(TRACE_DISABLED_BY_DEFAULT("cc.debug.scheduler")) \
219 X(TRACE_DISABLED_BY_DEFAULT("cc.debug.scheduler.frames")) \
220 X(TRACE_DISABLED_BY_DEFAULT("cc.debug.scheduler.now")) \
221 X(TRACE_DISABLED_BY_DEFAULT("content.verbose")) \
222 X(TRACE_DISABLED_BY_DEFAULT("cpu_profiler")) \
223 X(TRACE_DISABLED_BY_DEFAULT("cppgc")) \
224 X(TRACE_DISABLED_BY_DEFAULT("cpu_profiler.debug")) \
225 X(TRACE_DISABLED_BY_DEFAULT("devtools.screenshot")) \
226 X(TRACE_DISABLED_BY_DEFAULT("devtools.timeline")) \
227 X(TRACE_DISABLED_BY_DEFAULT("devtools.timeline.frame")) \
228 X(TRACE_DISABLED_BY_DEFAULT("devtools.timeline.inputs")) \
229 X(TRACE_DISABLED_BY_DEFAULT("devtools.timeline.invalidationTracking")) \
230 X(TRACE_DISABLED_BY_DEFAULT("devtools.timeline.layers")) \
231 X(TRACE_DISABLED_BY_DEFAULT("devtools.timeline.picture")) \
232 X(TRACE_DISABLED_BY_DEFAULT("devtools.timeline.stack")) \
233 X(TRACE_DISABLED_BY_DEFAULT("file")) \
234 X(TRACE_DISABLED_BY_DEFAULT("fonts")) \
235 X(TRACE_DISABLED_BY_DEFAULT("gpu_cmd_queue")) \
236 X(TRACE_DISABLED_BY_DEFAULT("gpu.dawn")) \
237 X(TRACE_DISABLED_BY_DEFAULT("gpu.debug")) \
238 X(TRACE_DISABLED_BY_DEFAULT("gpu.decoder")) \
239 X(TRACE_DISABLED_BY_DEFAULT("gpu.device")) \
240 X(TRACE_DISABLED_BY_DEFAULT("gpu.graphite.dawn")) \
241 X(TRACE_DISABLED_BY_DEFAULT("gpu.service")) \
242 X(TRACE_DISABLED_BY_DEFAULT("gpu.vulkan.vma")) \
243 X(TRACE_DISABLED_BY_DEFAULT("histogram_samples")) \
244 X(TRACE_DISABLED_BY_DEFAULT("java-heap-profiler")) \
245 X(TRACE_DISABLED_BY_DEFAULT("layer-element")) \
246 X(TRACE_DISABLED_BY_DEFAULT("layout_shift.debug")) \
247 X(TRACE_DISABLED_BY_DEFAULT("lifecycles")) \
248 X(TRACE_DISABLED_BY_DEFAULT("loading")) \
249 X(TRACE_DISABLED_BY_DEFAULT("mediastream")) \
250 X(TRACE_DISABLED_BY_DEFAULT("memory-infra")) \
251 X(TRACE_DISABLED_BY_DEFAULT("memory-infra.v8.code_stats")) \
252 X(TRACE_DISABLED_BY_DEFAULT("mojom")) \
253 X(TRACE_DISABLED_BY_DEFAULT("net")) \
254 X(TRACE_DISABLED_BY_DEFAULT("network")) \
255 X(TRACE_DISABLED_BY_DEFAULT("paint-worklet")) \
256 X(TRACE_DISABLED_BY_DEFAULT("power")) \
257 X(TRACE_DISABLED_BY_DEFAULT("renderer.scheduler")) \
258 X(TRACE_DISABLED_BY_DEFAULT("renderer.scheduler.debug")) \
259 X(TRACE_DISABLED_BY_DEFAULT("sequence_manager")) \
260 X(TRACE_DISABLED_BY_DEFAULT("sequence_manager.debug")) \
261 X(TRACE_DISABLED_BY_DEFAULT("sequence_manager.verbose_snapshots")) \
262 X(TRACE_DISABLED_BY_DEFAULT("skia")) \
263 X(TRACE_DISABLED_BY_DEFAULT("skia.gpu")) \
264 X(TRACE_DISABLED_BY_DEFAULT("skia.gpu.cache")) \
265 X(TRACE_DISABLED_BY_DEFAULT("skia.shaders")) \
266 X(TRACE_DISABLED_BY_DEFAULT("skottie")) \
267 X(TRACE_DISABLED_BY_DEFAULT("SyncFileSystem")) \
268 X(TRACE_DISABLED_BY_DEFAULT("system_power")) \
269 X(TRACE_DISABLED_BY_DEFAULT("system_stats")) \
270 X(TRACE_DISABLED_BY_DEFAULT("thread_pool_diagnostics")) \
271 X(TRACE_DISABLED_BY_DEFAULT("toplevel.ipc")) \
272 X(TRACE_DISABLED_BY_DEFAULT("user_action_samples")) \
273 X(TRACE_DISABLED_BY_DEFAULT("v8.compile")) \
274 X(TRACE_DISABLED_BY_DEFAULT("v8.cpu_profiler")) \
275 X(TRACE_DISABLED_BY_DEFAULT("v8.gc")) \
276 X(TRACE_DISABLED_BY_DEFAULT("v8.gc_stats")) \
277 X(TRACE_DISABLED_BY_DEFAULT("v8.ic_stats")) \
278 X(TRACE_DISABLED_BY_DEFAULT("v8.inspector")) \
279 X(TRACE_DISABLED_BY_DEFAULT("v8.runtime")) \
280 X(TRACE_DISABLED_BY_DEFAULT("v8.runtime_stats")) \
281 X(TRACE_DISABLED_BY_DEFAULT("v8.runtime_stats_sampling")) \
282 X(TRACE_DISABLED_BY_DEFAULT("v8.stack_trace")) \
283 X(TRACE_DISABLED_BY_DEFAULT("v8.turbofan")) \
284 X(TRACE_DISABLED_BY_DEFAULT("v8.wasm.detailed")) \
285 X(TRACE_DISABLED_BY_DEFAULT("v8.wasm.turbofan")) \
286 X(TRACE_DISABLED_BY_DEFAULT("video_and_image_capture")) \
287 X(TRACE_DISABLED_BY_DEFAULT("display.framedisplayed")) \
288 X(TRACE_DISABLED_BY_DEFAULT("viz.gpu_composite_time")) \
289 X(TRACE_DISABLED_BY_DEFAULT("viz.debug.overlay_planes")) \
290 X(TRACE_DISABLED_BY_DEFAULT("viz.hit_testing_flow")) \
291 X(TRACE_DISABLED_BY_DEFAULT("viz.overdraw")) \
292 X(TRACE_DISABLED_BY_DEFAULT("viz.quads")) \
293 X(TRACE_DISABLED_BY_DEFAULT("viz.surface_id_flow")) \
294 X(TRACE_DISABLED_BY_DEFAULT("viz.surface_lifetime")) \
295 X(TRACE_DISABLED_BY_DEFAULT("viz.triangles")) \
296 X(TRACE_DISABLED_BY_DEFAULT("viz.visual_debugger")) \
297 X(TRACE_DISABLED_BY_DEFAULT("webaudio.audionode")) \
298 X(TRACE_DISABLED_BY_DEFAULT("webgpu")) \
299 X(TRACE_DISABLED_BY_DEFAULT("webnn")) \
300 X(TRACE_DISABLED_BY_DEFAULT("webrtc")) \
301 X(TRACE_DISABLED_BY_DEFAULT("worker.scheduler")) \
302 X(TRACE_DISABLED_BY_DEFAULT("xr.debug"))
303
304 #define INTERNAL_TRACE_LIST_BUILTIN_CATEGORY_GROUPS(X) \
305 X("android_webview,toplevel") \
306 X("android_webview.timeline,android.ui.jank") \
307 X("base,toplevel") \
308 X("benchmark,drm") \
309 X("benchmark,latencyInfo,rail") \
310 X("benchmark,latencyInfo,rail,input.scrolling") \
311 X("benchmark,loading") \
312 X("benchmark,rail") \
313 X("benchmark,uma") \
314 X("benchmark,ui") \
315 X("benchmark,viz") \
316 X("benchmark,viz," TRACE_DISABLED_BY_DEFAULT("display.framedisplayed")) \
317 X("blink,benchmark") \
318 X("blink,benchmark,rail," TRACE_DISABLED_BY_DEFAULT("blink.debug.layout")) \
319 X("blink,blink.resource") \
320 X("blink,blink_style") \
321 X("blink,devtools.timeline") \
322 X("blink,loading") \
323 X("blink,rail") \
324 X("blink.animations,devtools.timeline,benchmark,rail") \
325 X("blink.user_timing,rail") \
326 X("browser,content,navigation") \
327 X("browser,navigation") \
328 X("browser,navigation,benchmark") \
329 X("browser,startup") \
330 X("category1,category2") \
331 X("cc,benchmark") \
332 X("cc,benchmark,input,input.scrolling") \
333 X("cc,benchmark," TRACE_DISABLED_BY_DEFAULT("devtools.timeline.frame")) \
334 X("cc,input") \
335 X("cc,raf_investigation") \
336 X("cc," TRACE_DISABLED_BY_DEFAULT("devtools.timeline")) \
337 X("cc,benchmark," TRACE_DISABLED_BY_DEFAULT("devtools.timeline.frame")) \
338 X("content,navigation") \
339 X("devtools.timeline,rail") \
340 X("drm,hwoverlays") \
341 X("dwrite,fonts") \
342 X("fonts,ui") \
343 X("gpu,benchmark") \
344 X("gpu,benchmark,android_webview") \
345 X("gpu,benchmark,webview") \
346 X("gpu,login") \
347 X("gpu,startup") \
348 X("gpu,toplevel.flow") \
349 X("gpu.angle,startup") \
350 X("inc2,inc") \
351 X("inc,inc2") \
352 X("input,benchmark") \
353 X("input,benchmark,devtools.timeline") \
354 X("input,benchmark,devtools.timeline,latencyInfo") \
355 X("input,benchmark,latencyInfo") \
356 X("input,latency") \
357 X("input,rail") \
358 X("input,input.scrolling") \
359 X("input,views") \
360 X("interactions,startup") \
361 X("ipc,security") \
362 X("ipc,toplevel") \
363 X("Java,devtools," TRACE_DISABLED_BY_DEFAULT("devtools.timeline")) \
364 X("loading,interactions") \
365 X("loading,rail") \
366 X("loading,rail,devtools.timeline") \
367 X("login,screenlock_monitor") \
368 X("media,gpu") \
369 X("media,rail") \
370 X("navigation,benchmark,rail") \
371 X("navigation,rail") \
372 X("renderer,benchmark,rail") \
373 X("renderer,webkit") \
374 X("renderer_host,navigation") \
375 X("renderer_host," TRACE_DISABLED_BY_DEFAULT("viz.surface_id_flow")) \
376 X("scheduler,devtools.timeline,loading") \
377 X("shutdown,viz") \
378 X("startup,benchmark,rail") \
379 X("startup,rail") \
380 X("toplevel,Java") \
381 X("toplevel,viz") \
382 X("ui,input") \
383 X("ui,latency") \
384 X("ui,toplevel") \
385 X("v8," TRACE_DISABLED_BY_DEFAULT("v8.compile")) \
386 X("v8,devtools.timeline") \
387 X("v8,devtools.timeline," TRACE_DISABLED_BY_DEFAULT("v8.compile")) \
388 X("viz,benchmark") \
389 X("viz,benchmark,graphics.pipeline") \
390 X("wakeup.flow,toplevel.flow") \
391 X("WebCore,benchmark,rail") \
392 X(TRACE_DISABLED_BY_DEFAULT("cc.debug") "," TRACE_DISABLED_BY_DEFAULT( \
393 "viz.quads") "," TRACE_DISABLED_BY_DEFAULT("devtools.timeline.layers")) \
394 X(TRACE_DISABLED_BY_DEFAULT("cc.debug.display_items") "," \
395 TRACE_DISABLED_BY_DEFAULT("cc.debug.picture") "," \
396 TRACE_DISABLED_BY_DEFAULT("devtools.timeline.picture")) \
397 X(TRACE_DISABLED_BY_DEFAULT("v8.inspector") "," TRACE_DISABLED_BY_DEFAULT( \
398 "v8.stack_trace"))
399
400 #define INTERNAL_TRACE_INIT_CATEGORY_NAME(name) name,
401
402 #define INTERNAL_TRACE_INIT_CATEGORY(name) {0, 0, name},
403
404 #if BUILDFLAG(USE_PERFETTO_CLIENT_LIBRARY)
405 PERFETTO_DEFINE_TEST_CATEGORY_PREFIXES("cat",
406 "foo",
407 "test",
408 "kTest",
409 "noise",
410 "Testing",
411 "NotTesting",
412 TRACE_DISABLED_BY_DEFAULT("test"),
413 TRACE_DISABLED_BY_DEFAULT("Testing"),
414 TRACE_DISABLED_BY_DEFAULT("NotTesting"));
415
416 #define INTERNAL_CATEGORY(X) perfetto::Category(X),
417 #define INTERNAL_CATEGORY_GROUP(X) perfetto::Category::Group(X),
418
419 // Define a Perfetto TrackEvent data source using the list of categories defined
420 // above. See https://perfetto.dev/docs/instrumentation/track-events.
421 PERFETTO_DEFINE_CATEGORIES_IN_NAMESPACE_WITH_ATTRS(
422 base,
423 BASE_EXPORT,
424 INTERNAL_TRACE_LIST_BUILTIN_CATEGORIES(INTERNAL_CATEGORY)
425 INTERNAL_TRACE_LIST_BUILTIN_CATEGORY_GROUPS(INTERNAL_CATEGORY_GROUP));
426 PERFETTO_USE_CATEGORIES_FROM_NAMESPACE(base);
427
428 #undef INTERNAL_CATEGORY
429 #undef INTERNAL_CATEGORY_GROUP
430 #endif // BUILDFLAG(USE_PERFETTO_CLIENT_LIBRARY)
431
432 namespace base {
433 namespace trace_event {
434
435 // Constexpr version of string comparison operator. |a| and |b| must be valid
436 // C-style strings known at compile-time.
StrEqConstexpr(const char * a,const char * b)437 constexpr bool StrEqConstexpr(const char* a, const char* b) {
438 for (; *a != '\0' && *b != '\0'; ++a, ++b) {
439 if (*a != *b)
440 return false;
441 }
442 return *a == *b;
443 }
444
445 // Tests for |StrEqConstexpr()|.
446 static_assert(StrEqConstexpr("foo", "foo"), "strings should be equal");
447 static_assert(!StrEqConstexpr("foo", "Foo"), "strings should not be equal");
448 static_assert(!StrEqConstexpr("foo", "foo1"), "strings should not be equal");
449 static_assert(!StrEqConstexpr("foo2", "foo"), "strings should not be equal");
450 static_assert(StrEqConstexpr("", ""), "strings should be equal");
451 static_assert(!StrEqConstexpr("foo", ""), "strings should not be equal");
452 static_assert(!StrEqConstexpr("", "foo"), "strings should not be equal");
453 static_assert(!StrEqConstexpr("ab", "abc"), "strings should not be equal");
454 static_assert(!StrEqConstexpr("abc", "ab"), "strings should not be equal");
455
456 // Static-only class providing access to the compile-time registry of trace
457 // categories.
458 // TODO(skyostil): Remove after migrating to the Perfetto client API.
459 class BASE_EXPORT BuiltinCategories {
460 public:
461 BuiltinCategories() = delete;
462 BuiltinCategories(const BuiltinCategories&) = delete;
463 BuiltinCategories& operator=(const BuiltinCategories&) = delete;
464
465 // Returns a built-in category name at |index| in the registry.
At(size_t index)466 static constexpr const char* At(size_t index) {
467 return kBuiltinCategories[index];
468 }
469
470 // Returns the amount of built-in categories in the registry.
Size()471 static constexpr size_t Size() { return std::size(kBuiltinCategories); }
472
473 // Where in the builtin category list to start when populating the
474 // about://tracing UI.
475 static constexpr size_t kVisibleCategoryStart = 3;
476
477 // Returns whether the category is either:
478 // - Properly registered in the builtin list.
479 // - Constists of several categories separated by commas.
480 // - Used only in tests.
481 // All trace categories are checked against this. A static_assert is triggered
482 // if at least one category fails this check.
IsAllowedCategory(const char * category)483 static constexpr bool IsAllowedCategory(const char* category) {
484 #if BUILDFLAG(IS_WIN) && defined(COMPONENT_BUILD)
485 return true;
486 #else
487 return IsBuiltinCategory(category) ||
488 IsCommaSeparatedCategoryGroup(category) ||
489 IsCategoryForTesting(category);
490 #endif
491 }
492
493 private:
494 // The array of built-in category names used for compile-time lookup.
495 static constexpr const char* kBuiltinCategories[] = {
496 INTERNAL_TRACE_LIST_BUILTIN_CATEGORIES(
497 INTERNAL_TRACE_INIT_CATEGORY_NAME)};
498
499 // The array of category names used only for testing. It's kept separately
500 // from the main list to avoid allocating the space for them in the binary.
501 static constexpr const char* kCategoriesForTesting[] = {
502 "test_\001\002\003\n\r",
503 "test_a",
504 "test_all",
505 "test_b",
506 "test_b1",
507 "test_c",
508 "test_c0",
509 "test_c1",
510 "test_c2",
511 "test_c3",
512 "test_c4",
513 "test_tracing",
514 "cat",
515 "cat1",
516 "cat2",
517 "cat3",
518 "cat4",
519 "cat5",
520 "cat6",
521 "category",
522 "test_drink",
523 "test_excluded_cat",
524 "test_filtered_cat",
525 "foo",
526 "test_inc",
527 "test_inc2",
528 "test_included",
529 "test_inc_wildcard_",
530 "test_inc_wildcard_abc",
531 "test_inc_wildchar_bla_end",
532 "test_inc_wildchar_x_end",
533 "kTestCategory",
534 "noise",
535 "test_other_included",
536 "test",
537 "test_category",
538 "Testing",
539 "TraceEventAgentTestCategory",
540 "test_unfiltered_cat",
541 "test_x",
542 TRACE_DISABLED_BY_DEFAULT("test_c9"),
543 TRACE_DISABLED_BY_DEFAULT("test_cat"),
544 TRACE_DISABLED_BY_DEFAULT("test_filtered_cat"),
545 TRACE_DISABLED_BY_DEFAULT("NotTesting"),
546 TRACE_DISABLED_BY_DEFAULT("Testing"),
547 TRACE_DISABLED_BY_DEFAULT("test_unfiltered_cat")};
548
549 // Returns whether |str| is in |array| of |array_len|.
IsStringInArray(const char * str,const char * const array[],size_t array_len)550 static constexpr bool IsStringInArray(const char* str,
551 const char* const array[],
552 size_t array_len) {
553 for (size_t i = 0; i < array_len; ++i) {
554 if (StrEqConstexpr(str, array[i]))
555 return true;
556 }
557 return false;
558 }
559
560 // Returns whether |category_group| contains a ',' symbol, denoting that an
561 // event belongs to several categories. We don't add such strings in the
562 // builtin list but allow them to pass the static assert.
IsCommaSeparatedCategoryGroup(const char * category_group)563 static constexpr bool IsCommaSeparatedCategoryGroup(
564 const char* category_group) {
565 for (; *category_group != '\0'; ++category_group) {
566 if (*category_group == ',')
567 return true;
568 }
569 return false;
570 }
571
572 // Returns whether |category| is used only for testing.
IsCategoryForTesting(const char * category)573 static constexpr bool IsCategoryForTesting(const char* category) {
574 return IsStringInArray(category, kCategoriesForTesting,
575 std::size(kCategoriesForTesting));
576 }
577
578 // Returns whether |category| is registered in the builtin list.
IsBuiltinCategory(const char * category)579 static constexpr bool IsBuiltinCategory(const char* category) {
580 return IsStringInArray(category, kBuiltinCategories,
581 std::size(kBuiltinCategories));
582 }
583 };
584
585 } // namespace trace_event
586 } // namespace base
587
588 #endif // BASE_TRACE_EVENT_BUILTIN_CATEGORIES_H_
589