react-native 0.83.4 → 0.83.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (114) hide show
  1. package/Libraries/Core/ReactNativeVersion.js +1 -1
  2. package/Libraries/Utilities/Appearance.js +6 -1
  3. package/Libraries/Utilities/HMRClient.js +28 -1
  4. package/React/Base/RCTVersion.m +1 -1
  5. package/React/CoreModules/RCTDevLoadingView.mm +17 -0
  6. package/React/DevSupport/RCTFrameTimingsObserver.h +24 -0
  7. package/React/DevSupport/RCTFrameTimingsObserver.mm +298 -0
  8. package/React/FBReactNativeSpec/FBReactNativeSpecJSI.h +16 -0
  9. package/ReactAndroid/api/ReactAndroid.api +0 -9
  10. package/ReactAndroid/gradle.properties +1 -1
  11. package/ReactAndroid/src/main/java/com/facebook/react/devsupport/BridgelessDevSupportManager.kt +2 -2
  12. package/ReactAndroid/src/main/java/com/facebook/react/devsupport/DevSupportManagerBase.kt +7 -7
  13. package/ReactAndroid/src/main/java/com/facebook/react/devsupport/InspectorFlags.kt +4 -0
  14. package/ReactAndroid/src/main/java/com/facebook/react/devsupport/inspector/FrameTimingSequence.kt +16 -0
  15. package/ReactAndroid/src/main/java/com/facebook/react/devsupport/inspector/FrameTimingsObserver.kt +275 -0
  16. package/ReactAndroid/src/main/java/com/facebook/react/devsupport/inspector/TracingState.kt +17 -0
  17. package/ReactAndroid/src/main/java/com/facebook/react/devsupport/inspector/TracingStateListener.kt +15 -0
  18. package/ReactAndroid/src/main/java/com/facebook/react/devsupport/{interfaces → inspector}/TracingStateProvider.kt +1 -1
  19. package/ReactAndroid/src/main/java/com/facebook/react/devsupport/perfmonitor/PerfMonitorInspectorTargetBinding.kt +1 -1
  20. package/ReactAndroid/src/main/java/com/facebook/react/devsupport/perfmonitor/PerfMonitorOverlayManager.kt +4 -4
  21. package/ReactAndroid/src/main/java/com/facebook/react/devsupport/perfmonitor/PerfMonitorOverlayView.kt +3 -3
  22. package/ReactAndroid/src/main/java/com/facebook/react/devsupport/perfmonitor/PerfMonitorUpdateListener.kt +1 -1
  23. package/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlags.kt +13 -1
  24. package/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsCxxAccessor.kt +21 -1
  25. package/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsCxxInterop.kt +5 -1
  26. package/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsDefaults.kt +5 -1
  27. package/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsLocalAccessor.kt +23 -1
  28. package/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsProvider.kt +5 -1
  29. package/ReactAndroid/src/main/java/com/facebook/react/internal/tracing/PerformanceTracer.kt +39 -0
  30. package/ReactAndroid/src/main/java/com/facebook/react/modules/blob/BlobModule.kt +1 -1
  31. package/ReactAndroid/src/main/java/com/facebook/react/modules/network/NetworkEventUtil.kt +20 -19
  32. package/ReactAndroid/src/main/java/com/facebook/react/modules/network/NetworkingModule.kt +6 -12
  33. package/ReactAndroid/src/main/java/com/facebook/react/modules/systeminfo/ReactNativeVersion.kt +1 -1
  34. package/ReactAndroid/src/main/java/com/facebook/react/runtime/ReactHostImpl.kt +86 -4
  35. package/ReactAndroid/src/main/java/com/facebook/react/runtime/ReactHostImplDevHelper.kt +3 -3
  36. package/ReactAndroid/src/main/java/com/facebook/react/runtime/ReactHostInspectorTarget.kt +10 -6
  37. package/ReactAndroid/src/main/jni/react/devsupport/JInspectorFlags.cpp +22 -0
  38. package/ReactAndroid/src/main/jni/react/devsupport/JInspectorFlags.h +2 -0
  39. package/ReactAndroid/src/main/jni/react/featureflags/JReactNativeFeatureFlagsCxxInterop.cpp +29 -1
  40. package/ReactAndroid/src/main/jni/react/featureflags/JReactNativeFeatureFlagsCxxInterop.h +7 -1
  41. package/ReactAndroid/src/main/jni/react/runtime/jni/JReactHostInspectorTarget.cpp +196 -17
  42. package/ReactAndroid/src/main/jni/react/runtime/jni/JReactHostInspectorTarget.h +168 -18
  43. package/ReactAndroid/src/main/jni/third-party/folly/CMakeLists.txt +1 -0
  44. package/ReactCommon/cxxreact/ReactNativeVersion.h +2 -2
  45. package/ReactCommon/hermes/inspector-modern/chrome/Registration.cpp +44 -2
  46. package/ReactCommon/jsinspector-modern/HostAgent.cpp +45 -10
  47. package/ReactCommon/jsinspector-modern/HostAgent.h +2 -2
  48. package/ReactCommon/jsinspector-modern/HostTarget.cpp +14 -7
  49. package/ReactCommon/jsinspector-modern/HostTarget.h +101 -14
  50. package/ReactCommon/jsinspector-modern/HostTargetTraceRecording.cpp +39 -8
  51. package/ReactCommon/jsinspector-modern/HostTargetTraceRecording.h +42 -5
  52. package/ReactCommon/jsinspector-modern/HostTargetTracing.cpp +54 -21
  53. package/ReactCommon/jsinspector-modern/HostTargetTracing.h +89 -0
  54. package/ReactCommon/jsinspector-modern/InspectorFlags.cpp +12 -0
  55. package/ReactCommon/jsinspector-modern/InspectorFlags.h +12 -0
  56. package/ReactCommon/jsinspector-modern/InspectorInterfaces.cpp +3 -7
  57. package/ReactCommon/jsinspector-modern/InstanceAgent.cpp +2 -11
  58. package/ReactCommon/jsinspector-modern/NetworkIOAgent.cpp +1 -1
  59. package/ReactCommon/jsinspector-modern/RuntimeAgent.cpp +19 -0
  60. package/ReactCommon/jsinspector-modern/RuntimeAgent.h +7 -0
  61. package/ReactCommon/jsinspector-modern/RuntimeTarget.cpp +33 -0
  62. package/ReactCommon/jsinspector-modern/RuntimeTarget.h +6 -0
  63. package/ReactCommon/jsinspector-modern/TracingAgent.cpp +29 -13
  64. package/ReactCommon/jsinspector-modern/TracingAgent.h +5 -4
  65. package/ReactCommon/jsinspector-modern/tests/HostTargetTest.cpp +65 -0
  66. package/ReactCommon/jsinspector-modern/tests/InspectorMocks.h +23 -2
  67. package/ReactCommon/jsinspector-modern/tests/JsiIntegrationTest.cpp +1 -0
  68. package/ReactCommon/jsinspector-modern/tests/NetworkReporterTest.cpp +1 -0
  69. package/ReactCommon/jsinspector-modern/tests/TracingTest.cpp +335 -0
  70. package/ReactCommon/jsinspector-modern/tests/TracingTest.h +95 -0
  71. package/ReactCommon/jsinspector-modern/tests/utils/InspectorFlagOverridesGuard.cpp +10 -0
  72. package/ReactCommon/jsinspector-modern/tests/utils/InspectorFlagOverridesGuard.h +3 -1
  73. package/ReactCommon/jsinspector-modern/tracing/CMakeLists.txt +1 -0
  74. package/ReactCommon/jsinspector-modern/tracing/FrameTimingSequence.h +61 -0
  75. package/ReactCommon/jsinspector-modern/tracing/HostTracingProfile.h +43 -0
  76. package/ReactCommon/jsinspector-modern/tracing/HostTracingProfileSerializer.cpp +165 -0
  77. package/ReactCommon/jsinspector-modern/tracing/HostTracingProfileSerializer.h +50 -0
  78. package/ReactCommon/jsinspector-modern/tracing/PerformanceTracer.cpp +16 -14
  79. package/ReactCommon/jsinspector-modern/tracing/PerformanceTracerSection.h +113 -0
  80. package/ReactCommon/jsinspector-modern/tracing/React-jsinspectortracing.podspec +1 -0
  81. package/ReactCommon/jsinspector-modern/tracing/TimeWindowedBuffer.h +158 -0
  82. package/ReactCommon/jsinspector-modern/tracing/TraceEvent.h +2 -1
  83. package/ReactCommon/jsinspector-modern/tracing/TraceEventGenerator.cpp +100 -0
  84. package/ReactCommon/jsinspector-modern/tracing/TraceEventGenerator.h +60 -0
  85. package/ReactCommon/jsinspector-modern/tracing/TraceEventSerializer.cpp +44 -1
  86. package/ReactCommon/jsinspector-modern/tracing/TraceEventSerializer.h +7 -0
  87. package/ReactCommon/jsinspector-modern/tracing/TraceRecordingState.h +18 -7
  88. package/ReactCommon/jsinspector-modern/tracing/TracingCategory.h +136 -0
  89. package/ReactCommon/jsinspector-modern/tracing/tests/TimeWindowedBufferTest.cpp +352 -0
  90. package/ReactCommon/react/featureflags/ReactNativeFeatureFlags.cpp +9 -1
  91. package/ReactCommon/react/featureflags/ReactNativeFeatureFlags.h +11 -1
  92. package/ReactCommon/react/featureflags/ReactNativeFeatureFlagsAccessor.cpp +65 -29
  93. package/ReactCommon/react/featureflags/ReactNativeFeatureFlagsAccessor.h +6 -2
  94. package/ReactCommon/react/featureflags/ReactNativeFeatureFlagsDefaults.h +9 -1
  95. package/ReactCommon/react/featureflags/ReactNativeFeatureFlagsDynamicProvider.h +19 -1
  96. package/ReactCommon/react/featureflags/ReactNativeFeatureFlagsProvider.h +3 -1
  97. package/ReactCommon/react/nativemodule/core/platform/ios/ReactCommon/RCTTurboModule.mm +3 -1
  98. package/ReactCommon/react/nativemodule/featureflags/NativeReactNativeFeatureFlags.cpp +11 -1
  99. package/ReactCommon/react/nativemodule/featureflags/NativeReactNativeFeatureFlags.h +5 -1
  100. package/ReactCommon/react/performance/timeline/PerformanceObserver.cpp +18 -6
  101. package/ReactCommon/react/performance/timeline/PerformanceObserver.h +2 -0
  102. package/ReactCommon/react/runtime/platform/ios/ReactCommon/RCTHost.mm +115 -0
  103. package/ReactCommon/{jsinspector-modern → react/utils}/Base64.h +2 -2
  104. package/gradle/libs.versions.toml +1 -1
  105. package/package.json +10 -10
  106. package/scripts/cocoapods/utils.rb +1 -0
  107. package/src/private/featureflags/ReactNativeFeatureFlags.js +11 -1
  108. package/src/private/featureflags/specs/NativeReactNativeFeatureFlags.js +3 -1
  109. package/third-party-podspecs/RCT-Folly.podspec +1 -1
  110. package/third-party-podspecs/fmt.podspec +2 -2
  111. package/ReactAndroid/src/main/java/com/facebook/react/devsupport/interfaces/TracingState.kt +0 -19
  112. package/ReactCommon/jsinspector-modern/tracing/TraceRecordingStateSerializer.cpp +0 -68
  113. package/ReactCommon/jsinspector-modern/tracing/TraceRecordingStateSerializer.h +0 -42
  114. package/ReactCommon/jsinspector-modern/tracing/TracingState.h +0 -24
@@ -21,6 +21,14 @@ bool InspectorFlags::getAssertSingleHostState() const {
21
21
  return loadFlagsAndAssertUnchanged().assertSingleHostState;
22
22
  }
23
23
 
24
+ bool InspectorFlags::getScreenshotCaptureEnabled() const {
25
+ return loadFlagsAndAssertUnchanged().screenshotCaptureEnabled;
26
+ }
27
+
28
+ bool InspectorFlags::getFrameRecordingEnabled() const {
29
+ return loadFlagsAndAssertUnchanged().frameRecordingEnabled;
30
+ }
31
+
24
32
  bool InspectorFlags::getFuseboxEnabled() const {
25
33
  if (fuseboxDisabledForTest_) {
26
34
  return false;
@@ -54,6 +62,10 @@ const InspectorFlags::Values& InspectorFlags::loadFlagsAndAssertUnchanged()
54
62
  InspectorFlags::Values newValues = {
55
63
  .assertSingleHostState =
56
64
  ReactNativeFeatureFlags::fuseboxAssertSingleHostState(),
65
+ .screenshotCaptureEnabled =
66
+ ReactNativeFeatureFlags::fuseboxScreenshotCaptureEnabled(),
67
+ .frameRecordingEnabled =
68
+ ReactNativeFeatureFlags::fuseboxFrameRecordingEnabled(),
57
69
  .fuseboxEnabled =
58
70
  #if defined(REACT_NATIVE_DEBUGGER_ENABLED)
59
71
  true,
@@ -36,6 +36,16 @@ class InspectorFlags {
36
36
  */
37
37
  bool getIsProfilingBuild() const;
38
38
 
39
+ /**
40
+ * Flag determining if Page.captureScreenshot CDP method is enabled.
41
+ */
42
+ bool getScreenshotCaptureEnabled() const;
43
+
44
+ /**
45
+ * Flag determining if frame recording (timings + screenshots) is enabled.
46
+ */
47
+ bool getFrameRecordingEnabled() const;
48
+
39
49
  /**
40
50
  * Flag determining if network inspection is enabled.
41
51
  */
@@ -61,6 +71,8 @@ class InspectorFlags {
61
71
  private:
62
72
  struct Values {
63
73
  bool assertSingleHostState;
74
+ bool screenshotCaptureEnabled;
75
+ bool frameRecordingEnabled;
64
76
  bool fuseboxEnabled;
65
77
  bool isProfilingBuild;
66
78
  bool networkInspectionEnabled;
@@ -143,13 +143,9 @@ int InspectorImpl::addPage(
143
143
  pageId,
144
144
  Page{pageId, description, vm, std::move(connectFunc), capabilities});
145
145
 
146
- // Strong assumption: If prefersFuseboxFrontend is set, the page added is a
147
- // HostTarget and not a legacy Hermes runtime target.
148
- if (capabilities.prefersFuseboxFrontend) {
149
- for (const auto& listenerWeak : listeners_) {
150
- if (auto listener = listenerWeak.lock()) {
151
- listener->unstable_onHostTargetAdded();
152
- }
146
+ for (const auto& listenerWeak : listeners_) {
147
+ if (auto listener = listenerWeak.lock()) {
148
+ listener->unstable_onHostTargetAdded();
153
149
  }
154
150
  }
155
151
 
@@ -15,15 +15,6 @@
15
15
 
16
16
  namespace facebook::react::jsinspector_modern {
17
17
 
18
- namespace {
19
-
20
- // The size of the timeline for the trace recording that happened in the
21
- // background.
22
- constexpr HighResDuration kBackgroundTracePerformanceTracerWindowSize =
23
- HighResDuration::fromMilliseconds(20000);
24
-
25
- } // namespace
26
-
27
18
  InstanceAgent::InstanceAgent(
28
19
  FrontendChannel frontendChannel,
29
20
  InstanceTarget& target,
@@ -171,8 +162,8 @@ void InstanceAgent::maybeSendPendingConsoleMessages() {
171
162
  InstanceTracingAgent::InstanceTracingAgent(tracing::TraceRecordingState& state)
172
163
  : tracing::TargetTracingAgent(state) {
173
164
  auto& performanceTracer = tracing::PerformanceTracer::getInstance();
174
- if (state.mode == tracing::Mode::Background) {
175
- performanceTracer.startTracing(kBackgroundTracePerformanceTracerWindowSize);
165
+ if (state.windowSize) {
166
+ performanceTracer.startTracing(*state.windowSize);
176
167
  } else {
177
168
  performanceTracer.startTracing();
178
169
  }
@@ -8,10 +8,10 @@
8
8
  #include "NetworkIOAgent.h"
9
9
  #include "InspectorFlags.h"
10
10
 
11
- #include "Base64.h"
12
11
  #include "Utf8.h"
13
12
 
14
13
  #include <jsinspector-modern/network/NetworkHandler.h>
14
+ #include <react/utils/Base64.h>
15
15
 
16
16
  #include <sstream>
17
17
  #include <tuple>
@@ -8,6 +8,10 @@
8
8
  #include "RuntimeAgent.h"
9
9
  #include "SessionState.h"
10
10
 
11
+ #include <folly/dynamic.h>
12
+ #include <jsinspector-modern/cdp/CdpJson.h>
13
+
14
+ #include <chrono>
11
15
  #include <utility>
12
16
 
13
17
  namespace facebook::react::jsinspector_modern {
@@ -119,6 +123,21 @@ void RuntimeAgent::notifyBindingCalled(
119
123
  "name", bindingName)("payload", payload)));
120
124
  }
121
125
 
126
+ void RuntimeAgent::notifyFastRefreshComplete() {
127
+ if (!sessionState_.isReactNativeApplicationDomainEnabled) {
128
+ return;
129
+ }
130
+ folly::dynamic params = folly::dynamic::object(
131
+ "timestamp",
132
+ std::chrono::duration_cast<std::chrono::milliseconds>(
133
+ std::chrono::system_clock::now().time_since_epoch())
134
+ .count());
135
+ frontendChannel_(
136
+ cdp::jsonNotification(
137
+ "ReactNativeApplication.unstable_fastRefreshComplete",
138
+ std::move(params)));
139
+ }
140
+
122
141
  RuntimeAgent::ExportedState RuntimeAgent::getExportedState() {
123
142
  return {
124
143
  .delegateState = delegate_ ? delegate_->getExportedState() : nullptr,
@@ -72,6 +72,13 @@ class RuntimeAgent final {
72
72
 
73
73
  void notifyBindingCalled(const std::string &bindingName, const std::string &payload);
74
74
 
75
+ /**
76
+ * Called by RuntimeTarget when JS calls __notifyFastRefreshComplete().
77
+ * Emits a ReactNativeApplication.unstable_fastRefreshComplete CDP
78
+ * notification if the ReactNativeApplication domain is enabled.
79
+ */
80
+ void notifyFastRefreshComplete();
81
+
75
82
  struct ExportedState {
76
83
  std::unique_ptr<RuntimeAgentDelegate::ExportedState> delegateState;
77
84
  };
@@ -60,6 +60,8 @@ void RuntimeTarget::installGlobals() {
60
60
  // NOTE: RuntimeTarget::installNetworkReporterAPI is in
61
61
  // RuntimeTargetNetwork.cpp
62
62
  installNetworkReporterAPI();
63
+
64
+ installFastRefreshHandler();
63
65
  }
64
66
 
65
67
  std::shared_ptr<RuntimeAgent> RuntimeTarget::createAgent(
@@ -141,6 +143,37 @@ void RuntimeTarget::installBindingHandler(const std::string& bindingName) {
141
143
  });
142
144
  }
143
145
 
146
+ void RuntimeTarget::installFastRefreshHandler() {
147
+ jsExecutor_([selfExecutor = executorFromThis()](jsi::Runtime& runtime) {
148
+ auto globalObj = runtime.global();
149
+ try {
150
+ auto name =
151
+ jsi::PropNameID::forUtf8(runtime, "__notifyFastRefreshComplete");
152
+ globalObj.setProperty(
153
+ runtime,
154
+ name,
155
+ jsi::Function::createFromHostFunction(
156
+ runtime,
157
+ name,
158
+ 0,
159
+ [selfExecutor](
160
+ jsi::Runtime& /*rt*/,
161
+ const jsi::Value&,
162
+ const jsi::Value*,
163
+ size_t) -> jsi::Value {
164
+ selfExecutor([](auto& self) {
165
+ self.agents_.forEach(
166
+ [](auto& agent) { agent.notifyFastRefreshComplete(); });
167
+ });
168
+
169
+ return jsi::Value::undefined();
170
+ }));
171
+ } catch (jsi::JSError&) {
172
+ // Swallow JavaScript exceptions that occur while setting up the global.
173
+ }
174
+ });
175
+ }
176
+
144
177
  void RuntimeTarget::emitDebuggerSessionCreated() {
145
178
  jsExecutor_([selfExecutor = executorFromThis()](jsi::Runtime& runtime) {
146
179
  try {
@@ -289,6 +289,12 @@ class JSINSPECTOR_EXPORT RuntimeTarget : public EnableExecutorFromThis<RuntimeTa
289
289
  */
290
290
  void installGlobals();
291
291
 
292
+ /**
293
+ * Installs __notifyFastRefreshComplete on the runtime's global object.
294
+ * When called from JS, dispatches to all connected RuntimeAgents.
295
+ */
296
+ void installFastRefreshHandler();
297
+
292
298
  /**
293
299
  * Install the console API handler.
294
300
  */
@@ -7,10 +7,10 @@
7
7
 
8
8
  #include "TracingAgent.h"
9
9
 
10
+ #include <jsinspector-modern/tracing/HostTracingProfileSerializer.h>
10
11
  #include <jsinspector-modern/tracing/PerformanceTracer.h>
11
12
  #include <jsinspector-modern/tracing/RuntimeSamplingProfileTraceEventSerializer.h>
12
13
  #include <jsinspector-modern/tracing/TraceEventSerializer.h>
13
- #include <jsinspector-modern/tracing/TraceRecordingStateSerializer.h>
14
14
  #include <jsinspector-modern/tracing/TracingMode.h>
15
15
 
16
16
  namespace facebook::react::jsinspector_modern {
@@ -74,8 +74,25 @@ bool TracingAgent::handleRequest(const cdp::PreparsedRequest& req) {
74
74
  return true;
75
75
  }
76
76
 
77
- bool didNotHaveAlreadyRunningRecording =
78
- hostTargetController_.startTracing(tracing::Mode::CDP);
77
+ /**
78
+ * This logic has to be updated with the next upgrade of Chrome
79
+ * DevTools Frotnend fork.
80
+ *
81
+ * At the moment of writing this, our fork uses categories field, which is
82
+ * marked as depreacted in CDP spec.
83
+ *
84
+ * Latest versions of Chrome DevTools in stable channel of Chromium are
85
+ * already using traceConfig field.
86
+ */
87
+ std::set<tracing::Category> enabledCategories;
88
+ if (req.params.isObject() && req.params.count("categories") != 0 &&
89
+ req.params["categories"].isString()) {
90
+ enabledCategories = tracing::parseSerializedTracingCategories(
91
+ req.params["categories"].getString());
92
+ }
93
+
94
+ bool didNotHaveAlreadyRunningRecording = hostTargetController_.startTracing(
95
+ tracing::Mode::CDP, std::move(enabledCategories));
79
96
  if (!didNotHaveAlreadyRunningRecording) {
80
97
  frontendChannel_(
81
98
  cdp::jsonError(
@@ -91,37 +108,36 @@ bool TracingAgent::handleRequest(const cdp::PreparsedRequest& req) {
91
108
 
92
109
  return true;
93
110
  } else if (req.method == "Tracing.end") {
94
- // @cdp Tracing.end support is experimental.
95
- auto state = hostTargetController_.stopTracing();
111
+ auto tracingProfile = hostTargetController_.stopTracing();
96
112
 
97
113
  sessionState_.hasPendingTraceRecording = false;
98
114
  // Send response to Tracing.end request.
99
115
  frontendChannel_(cdp::jsonResult(req.id));
100
116
 
101
- emitTraceRecording(std::move(state));
117
+ emitHostTracingProfile(std::move(tracingProfile));
102
118
  return true;
103
119
  }
104
120
 
105
121
  return false;
106
122
  }
107
123
 
108
- void TracingAgent::emitExternalTraceRecording(
109
- tracing::TraceRecordingState traceRecording) const {
124
+ void TracingAgent::emitExternalHostTracingProfile(
125
+ tracing::HostTracingProfile tracingProfile) const {
110
126
  frontendChannel_(
111
127
  cdp::jsonNotification("ReactNativeApplication.traceRequested"));
112
- emitTraceRecording(std::move(traceRecording));
128
+ emitHostTracingProfile(std::move(tracingProfile));
113
129
  }
114
130
 
115
- void TracingAgent::emitTraceRecording(
116
- tracing::TraceRecordingState traceRecording) const {
131
+ void TracingAgent::emitHostTracingProfile(
132
+ tracing::HostTracingProfile tracingProfile) const {
117
133
  auto dataCollectedCallback = [this](folly::dynamic&& eventsChunk) {
118
134
  frontendChannel_(
119
135
  cdp::jsonNotification(
120
136
  "Tracing.dataCollected",
121
137
  folly::dynamic::object("value", std::move(eventsChunk))));
122
138
  };
123
- tracing::TraceRecordingStateSerializer::emitAsDataCollectedChunks(
124
- std::move(traceRecording),
139
+ tracing::HostTracingProfileSerializer::emitAsDataCollectedChunks(
140
+ std::move(tracingProfile),
125
141
  dataCollectedCallback,
126
142
  TRACE_EVENT_CHUNK_SIZE,
127
143
  PROFILE_TRACE_EVENT_CHUNK_SIZE);
@@ -11,6 +11,7 @@
11
11
  #include "InspectorInterfaces.h"
12
12
 
13
13
  #include <jsinspector-modern/cdp/CdpJson.h>
14
+ #include <jsinspector-modern/tracing/HostTracingProfile.h>
14
15
  #include <jsinspector-modern/tracing/Timing.h>
15
16
  #include <react/timing/primitives.h>
16
17
 
@@ -41,9 +42,9 @@ class TracingAgent {
41
42
  bool handleRequest(const cdp::PreparsedRequest &req);
42
43
 
43
44
  /**
44
- * Emits the Trace Recording that was stashed externally by the HostTarget.
45
+ * Emits the HostTracingProfile that was stashed externally by the HostTarget.
45
46
  */
46
- void emitExternalTraceRecording(tracing::TraceRecordingState traceRecording) const;
47
+ void emitExternalHostTracingProfile(tracing::HostTracingProfile tracingProfile) const;
47
48
 
48
49
  private:
49
50
  /**
@@ -56,10 +57,10 @@ class TracingAgent {
56
57
  HostTargetController &hostTargetController_;
57
58
 
58
59
  /**
59
- * Emits the captured Trace Recording state in a series of
60
+ * Emits captured HostTracingProfile in a series of
60
61
  * Tracing.dataCollected events, followed by a Tracing.tracingComplete event.
61
62
  */
62
- void emitTraceRecording(tracing::TraceRecordingState traceRecording) const;
63
+ void emitHostTracingProfile(tracing::HostTracingProfile tracingProfile) const;
63
64
  };
64
65
 
65
66
  } // namespace facebook::react::jsinspector_modern
@@ -1526,4 +1526,69 @@ TEST_F(HostTargetTest, IOReadSizeValidation) {
1526
1526
  })");
1527
1527
  }
1528
1528
 
1529
+ TEST_F(HostTargetTest, TracingDelegateIsNotifiedOnCDPRequest) {
1530
+ connect();
1531
+ InSequence s;
1532
+
1533
+ EXPECT_CALL(
1534
+ hostTargetDelegate_.getTracingDelegateMock(),
1535
+ onTracingStarted(Eq(tracing::Mode::CDP), Eq(false)))
1536
+ .Times(1)
1537
+ .RetiresOnSaturation();
1538
+ EXPECT_CALL(fromPage(), onMessage(JsonEq(R"({
1539
+ "id": 1,
1540
+ "result": {}
1541
+ })")));
1542
+ toPage_->sendMessage(R"({
1543
+ "id": 1,
1544
+ "method": "Tracing.start"
1545
+ })");
1546
+
1547
+ EXPECT_CALL(hostTargetDelegate_.getTracingDelegateMock(), onTracingStopped())
1548
+ .Times(1)
1549
+ .RetiresOnSaturation();
1550
+ EXPECT_CALL(fromPage(), onMessage(JsonEq(R"({
1551
+ "id": 1,
1552
+ "result": {}
1553
+ })")));
1554
+ EXPECT_CALL(
1555
+ fromPage(),
1556
+ onMessage(JsonParsed(
1557
+ testing::AllOf(
1558
+ AtJsonPtr("/method", "Tracing.tracingComplete"),
1559
+ AtJsonPtr("/params/dataLossOccurred", false)))));
1560
+ toPage_->sendMessage(R"({
1561
+ "id": 1,
1562
+ "method": "Tracing.end"
1563
+ })");
1564
+ }
1565
+
1566
+ TEST_F(HostTargetTest, TracingDelegateIsNotifiedOnDirectTracingCall) {
1567
+ connect();
1568
+
1569
+ EXPECT_CALL(
1570
+ hostTargetDelegate_.getTracingDelegateMock(),
1571
+ onTracingStarted(Eq(tracing::Mode::Background), Eq(false)))
1572
+ .Times(1)
1573
+ .RetiresOnSaturation();
1574
+ page_->startTracing(tracing::Mode::Background, {});
1575
+
1576
+ EXPECT_CALL(hostTargetDelegate_.getTracingDelegateMock(), onTracingStopped())
1577
+ .Times(1)
1578
+ .RetiresOnSaturation();
1579
+ page_->stopTracing();
1580
+ }
1581
+
1582
+ TEST_F(HostTargetProtocolTest, CaptureScreenshotNotSupportedWhenFlagDisabled) {
1583
+ EXPECT_CALL(
1584
+ fromPage(),
1585
+ onMessage(JsonParsed(AllOf(
1586
+ AtJsonPtr("/error/code", Eq(-32601)), AtJsonPtr("/id", Eq(1))))))
1587
+ .RetiresOnSaturation();
1588
+ toPage_->sendMessage(R"({
1589
+ "id": 1,
1590
+ "method": "Page.captureScreenshot"
1591
+ })");
1592
+ }
1593
+
1529
1594
  } // namespace facebook::react::jsinspector_modern
@@ -87,13 +87,13 @@ class MockInspectorPackagerConnectionDelegate : public InspectorPackagerConnecti
87
87
  explicit MockInspectorPackagerConnectionDelegate(folly::Executor &executor) : executor_(executor)
88
88
  {
89
89
  using namespace testing;
90
- ON_CALL(*this, scheduleCallback(_, _)).WillByDefault(Invoke<>([this](auto callback, auto delay) {
90
+ ON_CALL(*this, scheduleCallback(_, _)).WillByDefault([this](auto callback, auto delay) {
91
91
  if (auto scheduledExecutor = dynamic_cast<folly::ScheduledExecutor *>(&executor_)) {
92
92
  scheduledExecutor->scheduleAt(callback, scheduledExecutor->now() + delay);
93
93
  } else {
94
94
  executor_.add(callback);
95
95
  }
96
- }));
96
+ });
97
97
  EXPECT_CALL(*this, scheduleCallback(_, _)).Times(AnyNumber());
98
98
  }
99
99
 
@@ -113,6 +113,12 @@ class MockInspectorPackagerConnectionDelegate : public InspectorPackagerConnecti
113
113
  folly::Executor &executor_;
114
114
  };
115
115
 
116
+ class MockHostTargetTracingDelegate : public HostTargetTracingDelegate {
117
+ public:
118
+ MOCK_METHOD(void, onTracingStarted, (tracing::Mode tracingMode, bool screenshotsCategoryEnabled), (override));
119
+ MOCK_METHOD(void, onTracingStopped, (), (override));
120
+ };
121
+
116
122
  class MockHostTargetDelegate : public HostTargetDelegate {
117
123
  public:
118
124
  // HostTargetDelegate methods
@@ -131,6 +137,21 @@ class MockHostTargetDelegate : public HostTargetDelegate {
131
137
  loadNetworkResource,
132
138
  (const LoadNetworkResourceRequest &params, ScopedExecutor<NetworkRequestListener> executor),
133
139
  (override));
140
+ MOCK_METHOD(std::optional<std::string>, captureScreenshot, (const PageCaptureScreenshotRequest &request), (override));
141
+
142
+ HostTargetTracingDelegate *getTracingDelegate() override
143
+ {
144
+ return mockTracingDelegate_.get();
145
+ }
146
+
147
+ MockHostTargetTracingDelegate &getTracingDelegateMock()
148
+ {
149
+ return *mockTracingDelegate_;
150
+ }
151
+
152
+ private:
153
+ std::unique_ptr<MockHostTargetTracingDelegate> mockTracingDelegate_ =
154
+ std::make_unique<MockHostTargetTracingDelegate>();
134
155
  };
135
156
 
136
157
  class MockInstanceTargetDelegate : public InstanceTargetDelegate {};
@@ -358,6 +358,7 @@ TYPED_TEST(JsiIntegrationPortableTest, ReactNativeApplicationEnable) {
358
358
  "method": "ReactNativeApplication.metadataUpdated",
359
359
  "params": {
360
360
  "integrationName": "JsiIntegrationTest",
361
+ "unstable_frameRecordingEnabled": false,
361
362
  "unstable_isProfilingBuild": false,
362
363
  "unstable_networkInspectionEnabled": false
363
364
  }
@@ -42,6 +42,7 @@ class NetworkReporterTestBase : public JsiIntegrationPortableTestBase<
42
42
  .enableNetworkEventReporting =
43
43
  WithParamInterface<Params>::GetParam()
44
44
  .enableNetworkEventReporting,
45
+ .networkInspectionEnabled = true,
45
46
  }) {}
46
47
 
47
48
  void SetUp() override {