Skip to content

Commit fda72f7

Browse files
huntiefacebook-github-bot
authored andcommitted
Support parsing of detail arg from console.timeStamp (facebook#54262)
Summary: Similar to `performance.measure()`, Chrome is adding an optional `detail` arg to `console.timeStamp`. Here we implement this for React Native, by direct passing to the `"TimeStamp"` trace event args. [`console.timeStamp()`](https://developer.mozilla.org/en-US/docs/Web/API/console/timeStamp_static) remains an experimental, non-standard API. Changelog: [Internal] Differential Revision: D85437162
1 parent e81626e commit fda72f7

File tree

5 files changed

+51
-3
lines changed

5 files changed

+51
-3
lines changed

packages/react-native/ReactCommon/jsinspector-modern/RuntimeTargetConsole.cpp

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -467,9 +467,18 @@ void consoleTimeStamp(
467467
}
468468
}
469469

470+
std::optional<folly::dynamic> detail;
471+
if (argumentsCount >= 7) {
472+
const jsi::Value& detailArgument = arguments[6];
473+
if (detailArgument.isObject()) {
474+
detail =
475+
tracing::getConsoleTimeStampDetailFromObject(runtime, detailArgument);
476+
}
477+
}
478+
470479
if (performanceTracer.isTracing()) {
471480
performanceTracer.reportTimeStamp(
472-
label, start, end, trackName, trackGroup, color);
481+
label, start, end, trackName, trackGroup, color, std::move(detail));
473482
}
474483

475484
if (ReactPerfettoLogger::isTracing()) {
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
/*
2+
* Copyright (c) Meta Platforms, Inc. and affiliates.
3+
*
4+
* This source code is licensed under the MIT license found in the
5+
* LICENSE file in the root directory of this source tree.
6+
*/
7+
8+
#include "ConsoleTimeStamp.h"
9+
10+
namespace facebook::react::jsinspector_modern::tracing {
11+
12+
std::optional<folly::dynamic> getConsoleTimeStampDetailFromObject(
13+
jsi::Runtime& runtime,
14+
const jsi::Value& detailValue) {
15+
try {
16+
return jsi::dynamicFromValue(runtime, detailValue);
17+
} catch (jsi::JSIException&) {
18+
return std::nullopt;
19+
}
20+
}
21+
22+
} // namespace facebook::react::jsinspector_modern::tracing

packages/react-native/ReactCommon/jsinspector-modern/tracing/ConsoleTimeStamp.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@
77

88
#pragma once
99

10+
#include <jsi/JSIDynamic.h>
11+
#include <jsi/jsi.h>
1012
#include <react/timing/primitives.h>
1113

1214
#include <cassert>
@@ -96,4 +98,8 @@ inline std::optional<ConsoleTimeStampColor> getConsoleTimeStampColorFromString(c
9698
}
9799
};
98100

101+
std::optional<folly::dynamic> getConsoleTimeStampDetailFromObject(
102+
jsi::Runtime& runtime,
103+
const jsi::Value& detailValue);
104+
99105
}; // namespace facebook::react::jsinspector_modern::tracing

packages/react-native/ReactCommon/jsinspector-modern/tracing/PerformanceTracer.cpp

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -184,7 +184,8 @@ void PerformanceTracer::reportTimeStamp(
184184
std::optional<ConsoleTimeStampEntry> end,
185185
std::optional<std::string> trackName,
186186
std::optional<std::string> trackGroup,
187-
std::optional<ConsoleTimeStampColor> color) {
187+
std::optional<ConsoleTimeStampColor> color,
188+
std::optional<folly::dynamic> detail) {
188189
if (!tracingAtomic_) {
189190
return;
190191
}
@@ -202,6 +203,7 @@ void PerformanceTracer::reportTimeStamp(
202203
.trackName = std::move(trackName),
203204
.trackGroup = std::move(trackGroup),
204205
.color = std::move(color),
206+
.detail = std::move(detail),
205207
.threadId = getCurrentThreadId(),
206208
});
207209
}
@@ -622,6 +624,13 @@ void PerformanceTracer::enqueueTraceEventsFromPerformanceTracerEvent(
622624
if (event.color) {
623625
data["color"] = consoleTimeStampColorToString(*event.color);
624626
}
627+
if (event.detail) {
628+
folly::dynamic devtoolsDetail = folly::dynamic::object();
629+
for (const auto& [key, value] : event.detail->items()) {
630+
devtoolsDetail[key] = value;
631+
}
632+
data["devtools"] = folly::toJson(devtoolsDetail);
633+
}
625634

626635
events.emplace_back(
627636
TraceEvent{

packages/react-native/ReactCommon/jsinspector-modern/tracing/PerformanceTracer.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,8 @@ class PerformanceTracer {
9595
std::optional<ConsoleTimeStampEntry> end = std::nullopt,
9696
std::optional<std::string> trackName = std::nullopt,
9797
std::optional<std::string> trackGroup = std::nullopt,
98-
std::optional<ConsoleTimeStampColor> color = std::nullopt);
98+
std::optional<ConsoleTimeStampColor> color = std::nullopt,
99+
std::optional<folly::dynamic> detail = std::nullopt);
99100

100101
/**
101102
* Record an Event Loop tick, which will be represented as an Event Loop task
@@ -228,6 +229,7 @@ class PerformanceTracer {
228229
std::optional<std::string> trackName;
229230
std::optional<std::string> trackGroup;
230231
std::optional<ConsoleTimeStampColor> color;
232+
std::optional<folly::dynamic> detail;
231233
ThreadId threadId;
232234
HighResTimeStamp createdAt = HighResTimeStamp::now();
233235
};

0 commit comments

Comments
 (0)