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