Skip to content

Commit b447d26

Browse files
sbuggaymeta-codesync[bot]
authored andcommitted
Frame screenshot event generation (#54744)
Summary: Pull Request resolved: #54744 Adds CDP event generation for screenshots. Changelog: [Internal] Reviewed By: hoxyq Differential Revision: D87936872 fbshipit-source-id: 91fee068e3a55c212e7df83990d7836b04efa01b
1 parent 4bb24e2 commit b447d26

File tree

5 files changed

+73
-4
lines changed

5 files changed

+73
-4
lines changed

packages/react-native/ReactCommon/jsinspector-modern/tests/TracingTest.cpp

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,4 +95,22 @@ TEST_F(TracingTest, EmitsRecordedFrameTimingSequences) {
9595
EXPECT_THAT(allTraceEvents, Contains(AtJsonPtr("/name", "DrawFrame")));
9696
}
9797

98+
TEST_F(TracingTest, EmitsScreenshotEventWhenScreenshotValuePassed) {
99+
InSequence s;
100+
101+
startTracing({tracing::Category::Screenshot});
102+
auto now = HighResTimeStamp::now();
103+
page_->recordFrameTimings(
104+
tracing::FrameTimingSequence(
105+
1, // id
106+
11, // threadId
107+
now,
108+
now + HighResDuration::fromNanoseconds(10),
109+
now + HighResDuration::fromNanoseconds(50),
110+
"base64EncodedScreenshotData"));
111+
112+
auto allTraceEvents = endTracingAndCollectEvents();
113+
EXPECT_THAT(allTraceEvents, Contains(AtJsonPtr("/name", "Screenshot")));
114+
}
115+
98116
} // namespace facebook::react::jsinspector_modern

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

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,14 +13,16 @@
1313

1414
namespace facebook::react::jsinspector_modern::tracing {
1515

16+
using FrameSequenceId = uint64_t;
17+
1618
/**
1719
* A struct representing a sequence of frame timings that happened on the Host side.
1820
*/
1921
struct FrameTimingSequence {
2022
FrameTimingSequence() = delete;
2123

2224
FrameTimingSequence(
23-
uint64_t id,
25+
FrameSequenceId id,
2426
ThreadId threadId,
2527
HighResTimeStamp beginDrawingTimestamp,
2628
HighResTimeStamp commitTimestamp,
@@ -38,7 +40,7 @@ struct FrameTimingSequence {
3840
/**
3941
* Unique ID of the sequence, used by Chrome DevTools Frontend to identify the events that form one sequence.
4042
*/
41-
uint64_t id;
43+
FrameSequenceId id;
4244

4345
/**
4446
* The ID of the native thread that is associated with the frame.

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

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,7 @@ constexpr int FALLBACK_LAYER_TREE_ID = 1;
100100
chunk.push_back(
101101
TraceEventSerializer::serialize(std::move(setLayerTreeIdEvent)));
102102

103-
for (const auto& frameTimingSequence : frameTimings) {
103+
for (auto&& frameTimingSequence : frameTimings) {
104104
if (chunk.size() >= chunkSize) {
105105
chunkCallback(std::move(chunk));
106106
chunk = generateNewChunk(chunkSize);
@@ -121,6 +121,19 @@ constexpr int FALLBACK_LAYER_TREE_ID = 1;
121121
chunk.push_back(TraceEventSerializer::serialize(std::move(commitEvent)));
122122
chunk.push_back(
123123
TraceEventSerializer::serialize(std::move(endDrawingEvent)));
124+
125+
if (frameTimingSequence.screenshot.has_value()) {
126+
auto screenshotEvent = TraceEventGenerator::createScreenshotEvent(
127+
frameTimingSequence.id,
128+
FALLBACK_LAYER_TREE_ID,
129+
std::move(frameTimingSequence.screenshot.value()),
130+
frameTimingSequence.endDrawingTimestamp,
131+
processId,
132+
frameTimingSequence.threadId);
133+
134+
chunk.push_back(
135+
TraceEventSerializer::serialize(std::move(screenshotEvent)));
136+
}
124137
}
125138

126139
if (!chunk.empty()) {

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

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
*/
77

88
#include "TraceEventGenerator.h"
9+
#include "Timing.h"
910
#include "TracingCategory.h"
1011

1112
namespace facebook::react::jsinspector_modern::tracing {
@@ -77,4 +78,27 @@ TraceEventGenerator::createFrameTimingsEvents(
7778
return {std::move(beginEvent), std::move(commitEvent), std::move(drawEvent)};
7879
}
7980

81+
/* static */ TraceEvent TraceEventGenerator::createScreenshotEvent(
82+
FrameSequenceId frameSequenceId,
83+
int sourceId,
84+
std::string&& snapshot,
85+
HighResTimeStamp expectedDisplayTime,
86+
ProcessId processId,
87+
ThreadId threadId) {
88+
folly::dynamic args = folly::dynamic::object("snapshot", std::move(snapshot))(
89+
"source_id", sourceId)("frame_sequence", frameSequenceId)(
90+
"expected_display_time",
91+
highResTimeStampToTracingClockTimeStamp(expectedDisplayTime));
92+
93+
return TraceEvent{
94+
.name = "Screenshot",
95+
.cat = {Category::Screenshot},
96+
.ph = 'O',
97+
.ts = expectedDisplayTime,
98+
.pid = processId,
99+
.tid = threadId,
100+
.args = std::move(args),
101+
};
102+
}
103+
80104
}; // namespace facebook::react::jsinspector_modern::tracing

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

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99

1010
#include "TraceEvent.h"
1111

12+
#include <jsinspector-modern/tracing/FrameTimingSequence.h>
1213
#include <react/timing/primitives.h>
1314

1415
#include <tuple>
@@ -35,13 +36,24 @@ class TraceEventGenerator {
3536
* Creates canonical "BeginFrame", "Commit", "DrawFrame" trace events.
3637
*/
3738
static std::tuple<TraceEvent, TraceEvent, TraceEvent> createFrameTimingsEvents(
38-
uint64_t sequenceId,
39+
FrameSequenceId sequenceId,
3940
int layerTreeId,
4041
HighResTimeStamp beginDrawingTimestamp,
4142
HighResTimeStamp commitTimestamp,
4243
HighResTimeStamp endDrawingTimestamp,
4344
ProcessId processId,
4445
ThreadId threadId);
46+
47+
/**
48+
* Creates canonical "Screenshot" trace event.
49+
*/
50+
static TraceEvent createScreenshotEvent(
51+
FrameSequenceId frameSequenceId,
52+
int sourceId,
53+
std::string &&snapshot,
54+
HighResTimeStamp expectedDisplayTime,
55+
ProcessId processId,
56+
ThreadId threadId);
4557
};
4658

4759
}; // namespace facebook::react::jsinspector_modern::tracing

0 commit comments

Comments
 (0)