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