• 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 #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