Skip to content

Commit cfef395

Browse files
huntiefacebook-github-bot
authored andcommitted
Support parsing of detail arg from console.timeStamp
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 d9262c6 commit cfef395

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
@@ -460,9 +460,18 @@ void consoleTimeStamp(
460460
}
461461
}
462462

463+
std::optional<folly::dynamic> detail;
464+
if (argumentsCount >= 7) {
465+
const jsi::Value& detailArgument = arguments[6];
466+
if (detailArgument.isObject()) {
467+
detail =
468+
tracing::getConsoleTimeStampDetailFromObject(runtime, detailArgument);
469+
}
470+
}
471+
463472
if (performanceTracer.isTracing()) {
464473
performanceTracer.reportTimeStamp(
465-
label, start, end, trackName, trackGroup, color);
474+
label, start, end, trackName, trackGroup, color, detail);
466475
}
467476

468477
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>
@@ -95,4 +97,8 @@ inline std::optional<ConsoleTimeStampColor> getConsoleTimeStampColorFromString(
9597
}
9698
};
9799

100+
std::optional<folly::dynamic> getConsoleTimeStampDetailFromObject(
101+
jsi::Runtime& runtime,
102+
const jsi::Value& detailValue);
103+
98104
}; // 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
@@ -180,7 +180,8 @@ void PerformanceTracer::reportTimeStamp(
180180
std::optional<ConsoleTimeStampEntry> end,
181181
std::optional<std::string> trackName,
182182
std::optional<std::string> trackGroup,
183-
std::optional<ConsoleTimeStampColor> color) {
183+
std::optional<ConsoleTimeStampColor> color,
184+
std::optional<folly::dynamic> detail) {
184185
if (!tracingAtomic_) {
185186
return;
186187
}
@@ -197,6 +198,7 @@ void PerformanceTracer::reportTimeStamp(
197198
.trackName = std::move(trackName),
198199
.trackGroup = std::move(trackGroup),
199200
.color = std::move(color),
201+
.detail = std::move(detail),
200202
.threadId = getCurrentThreadId(),
201203
});
202204
}
@@ -606,6 +608,13 @@ void PerformanceTracer::enqueueTraceEventsFromPerformanceTracerEvent(
606608
if (event.color) {
607609
data["color"] = consoleTimeStampColorToString(*event.color);
608610
}
611+
if (event.detail) {
612+
folly::dynamic devtoolsDetail = folly::dynamic::object();
613+
for (const auto& [key, value] : event.detail->items()) {
614+
devtoolsDetail[key] = value;
615+
}
616+
data["devtools"] = folly::toJson(devtoolsDetail);
617+
}
609618

610619
events.emplace_back(TraceEvent{
611620
.name = "TimeStamp",

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,8 @@ class PerformanceTracer {
9797
std::optional<ConsoleTimeStampEntry> end = std::nullopt,
9898
std::optional<std::string> trackName = std::nullopt,
9999
std::optional<std::string> trackGroup = std::nullopt,
100-
std::optional<ConsoleTimeStampColor> color = std::nullopt);
100+
std::optional<ConsoleTimeStampColor> color = std::nullopt,
101+
std::optional<folly::dynamic> detail = std::nullopt);
101102

102103
/**
103104
* Record an Event Loop tick, which will be represented as an Event Loop task
@@ -232,6 +233,7 @@ class PerformanceTracer {
232233
std::optional<std::string> trackName;
233234
std::optional<std::string> trackGroup;
234235
std::optional<ConsoleTimeStampColor> color;
236+
std::optional<folly::dynamic> detail;
235237
ThreadId threadId;
236238
HighResTimeStamp createdAt = HighResTimeStamp::now();
237239
};

0 commit comments

Comments
 (0)