Skip to content

Commit 6275ca0

Browse files
sbuggayfacebook-github-bot
authored andcommitted
Frame screenshot event generation (facebook#54744)
Summary: Adds CDP event generation for screenshots. Changelog: [Internal] Differential Revision: D87936872
1 parent 57c29fc commit 6275ca0

File tree

4 files changed

+69
-1
lines changed

4 files changed

+69
-1
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/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 & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@
1515

1616
namespace facebook::react::jsinspector_modern::tracing {
1717

18+
using FrameSequenceId = uint64_t;
19+
1820
/**
1921
* This class encapsulates the logic for generating canonical trace events that will be serialized and sent as part of
2022
* Tracing.dataCollected CDP message.
@@ -42,6 +44,17 @@ class TraceEventGenerator {
4244
HighResTimeStamp endDrawingTimestamp,
4345
ProcessId processId,
4446
ThreadId threadId);
47+
48+
/**
49+
* Creates canonical "Screenshot" trace event.
50+
*/
51+
static TraceEvent createScreenshotEvent(
52+
FrameSequenceId frameSequenceId,
53+
int sourceId,
54+
std::string &&snapshot,
55+
HighResTimeStamp expectedDisplayTime,
56+
ProcessId processId,
57+
ThreadId threadId);
4558
};
4659

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

0 commit comments

Comments
 (0)