react-native 0.83.0-rc.0 → 0.84.0-nightly-20251105-5ec5cc3a3

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 (82) hide show
  1. package/Libraries/AppDelegate/RCTReactNativeFactory.h +3 -0
  2. package/Libraries/AppDelegate/RCTReactNativeFactory.mm +12 -0
  3. package/Libraries/AppDelegate/RCTRootViewFactory.h +10 -4
  4. package/Libraries/AppDelegate/RCTRootViewFactory.mm +21 -5
  5. package/Libraries/Core/ReactNativeVersion.js +2 -2
  6. package/Libraries/StyleSheet/StyleSheetTypes.d.ts +2 -2
  7. package/Libraries/Text/TextInput/RCTBaseTextInputView.mm +3 -0
  8. package/React/Base/RCTBundleManager.h +59 -7
  9. package/React/Base/RCTBundleManager.m +98 -0
  10. package/React/Base/RCTBundleURLProvider.h +24 -0
  11. package/React/Base/RCTBundleURLProvider.mm +49 -4
  12. package/React/Base/RCTVersion.m +2 -2
  13. package/React/CoreModules/RCTPlatform.mm +3 -2
  14. package/React/CxxBridge/RCTCxxBridge.mm +1 -2
  15. package/React/CxxModule/RCTCxxUtils.mm +1 -11
  16. package/React/FBReactNativeSpec/FBReactNativeSpecJSI.h +127 -135
  17. package/ReactAndroid/gradle.properties +1 -1
  18. package/ReactAndroid/src/main/java/com/facebook/react/ReactDelegate.kt +7 -7
  19. package/ReactAndroid/src/main/java/com/facebook/react/ViewManagerOnDemandReactPackage.kt +53 -4
  20. package/ReactAndroid/src/main/java/com/facebook/react/devsupport/CxxInspectorPackagerConnection.kt +99 -9
  21. package/ReactAndroid/src/main/java/com/facebook/react/devsupport/inspector/InspectorNetworkHelper.kt +1 -1
  22. package/ReactAndroid/src/main/java/com/facebook/react/devsupport/perfmonitor/PerfMonitorOverlayManager.kt +22 -1
  23. package/ReactAndroid/src/main/java/com/facebook/react/devsupport/perfmonitor/PerfMonitorOverlayView.kt +4 -3
  24. package/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlags.kt +2 -8
  25. package/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsCxxAccessor.kt +1 -11
  26. package/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsCxxInterop.kt +1 -3
  27. package/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsDefaults.kt +1 -3
  28. package/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsLocalAccessor.kt +1 -12
  29. package/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsProvider.kt +1 -3
  30. package/ReactAndroid/src/main/java/com/facebook/react/modules/systeminfo/ReactNativeVersion.kt +2 -2
  31. package/ReactAndroid/src/main/java/com/facebook/react/uimanager/JSTouchDispatcher.kt +1 -2
  32. package/ReactAndroid/src/main/java/com/facebook/react/uimanager/ReactAxOrderHelper.kt +47 -0
  33. package/ReactAndroid/src/main/java/com/facebook/react/uimanager/events/PointerEvent.kt +5 -4
  34. package/ReactAndroid/src/main/java/com/facebook/react/views/scroll/ReactHorizontalScrollView.java +23 -3
  35. package/ReactAndroid/src/main/java/com/facebook/react/views/scroll/ReactScrollView.java +7 -2
  36. package/ReactAndroid/src/main/jni/react/devsupport/JCxxInspectorPackagerConnectionWebSocket.cpp +29 -2
  37. package/ReactAndroid/src/main/jni/react/featureflags/JReactNativeFeatureFlagsCxxInterop.cpp +1 -15
  38. package/ReactAndroid/src/main/jni/react/featureflags/JReactNativeFeatureFlagsCxxInterop.h +1 -4
  39. package/ReactAndroid/src/main/jni/react/jni/JSLoader.cpp +1 -1
  40. package/ReactAndroid/src/main/jni/react/jni/JSLoader.h +2 -1
  41. package/ReactAndroid/src/main/res/devsupport/drawable/ic_perf_issue.xml +10 -0
  42. package/ReactCommon/cxxreact/JSBigString.h +14 -5
  43. package/ReactCommon/cxxreact/JSIndexedRAMBundle.cpp +4 -5
  44. package/ReactCommon/cxxreact/ReactNativeVersion.h +3 -3
  45. package/ReactCommon/jsiexecutor/jsireact/JSIExecutor.cpp +2 -3
  46. package/ReactCommon/jsiexecutor/jsireact/JSIExecutor.h +2 -2
  47. package/ReactCommon/jsinspector-modern/PerfMonitorV2.cpp +9 -1
  48. package/ReactCommon/jsinspector-modern/PerfMonitorV2.h +4 -1
  49. package/ReactCommon/jsinspector-modern/TracingAgent.cpp +1 -7
  50. package/ReactCommon/jsinspector-modern/tests/NetworkReporterTest.cpp +3 -55
  51. package/ReactCommon/jsinspector-modern/tests/TracingTest.h +82 -0
  52. package/ReactCommon/jsinspector-modern/tracing/PerformanceTracer.cpp +99 -0
  53. package/ReactCommon/jsinspector-modern/tracing/PerformanceTracer.h +47 -1
  54. package/ReactCommon/react/featureflags/ReactNativeFeatureFlags.cpp +1 -5
  55. package/ReactCommon/react/featureflags/ReactNativeFeatureFlags.h +2 -7
  56. package/ReactCommon/react/featureflags/ReactNativeFeatureFlagsAccessor.cpp +18 -36
  57. package/ReactCommon/react/featureflags/ReactNativeFeatureFlagsAccessor.h +2 -4
  58. package/ReactCommon/react/featureflags/ReactNativeFeatureFlagsDefaults.h +1 -5
  59. package/ReactCommon/react/featureflags/ReactNativeFeatureFlagsDynamicProvider.h +1 -10
  60. package/ReactCommon/react/featureflags/ReactNativeFeatureFlagsProvider.h +1 -2
  61. package/ReactCommon/react/nativemodule/core/platform/ios/ReactCommon/RCTTurboModuleManager.mm +4 -27
  62. package/ReactCommon/react/nativemodule/featureflags/NativeReactNativeFeatureFlags.cpp +1 -6
  63. package/ReactCommon/react/nativemodule/featureflags/NativeReactNativeFeatureFlags.h +1 -3
  64. package/ReactCommon/react/performance/cdpmetrics/CdpPerfIssuesReporter.cpp +4 -2
  65. package/ReactCommon/react/renderer/css/CSSSyntaxParser.h +7 -0
  66. package/ReactCommon/react/runtime/ReactInstance.cpp +4 -4
  67. package/ReactCommon/react/runtime/platform/ios/ReactCommon/RCTHost.h +3 -2
  68. package/ReactCommon/react/runtime/platform/ios/ReactCommon/RCTHost.mm +10 -6
  69. package/ReactCommon/yoga/yoga/style/StyleLength.h +7 -0
  70. package/ReactCommon/yoga/yoga/style/StyleSizeLength.h +7 -0
  71. package/package.json +9 -9
  72. package/sdks/hermes-engine/version.properties +1 -1
  73. package/src/private/components/virtualview/VirtualView.js +16 -9
  74. package/src/private/components/virtualview/logger/VirtualViewLogger.js +21 -0
  75. package/src/private/components/virtualview/logger/VirtualViewLoggerTypes.js +24 -0
  76. package/src/private/featureflags/ReactNativeFeatureFlags.js +2 -7
  77. package/src/private/featureflags/specs/NativeReactNativeFeatureFlags.js +1 -2
  78. package/src/private/webapis/intersectionobserver/IntersectionObserver.js +48 -0
  79. package/types_generated/src/private/components/virtualview/VirtualView.d.ts +3 -1
  80. package/React/CxxModule/RCTCxxModule.h +0 -29
  81. package/React/CxxModule/RCTCxxModule.mm +0 -87
  82. package/sdks/.hermesversion +0 -1
@@ -4,7 +4,7 @@
4
4
  * This source code is licensed under the MIT license found in the
5
5
  * LICENSE file in the root directory of this source tree.
6
6
  *
7
- * @generated SignedSource<<13ed11b5c260fae79048ea80745d22fe>>
7
+ * @generated SignedSource<<b83a74b94f72ed85c7a5323bb56a38a0>>
8
8
  */
9
9
 
10
10
  /**
@@ -429,12 +429,6 @@ class ReactNativeFeatureFlagsJavaProvider
429
429
  return method(javaProvider_);
430
430
  }
431
431
 
432
- bool sweepActiveTouchOnChildNativeGesturesAndroid() override {
433
- static const auto method =
434
- getReactNativeFeatureFlagsProviderJavaClass()->getMethod<jboolean()>("sweepActiveTouchOnChildNativeGesturesAndroid");
435
- return method(javaProvider_);
436
- }
437
-
438
432
  bool traceTurboModulePromiseRejectionsOnAndroid() override {
439
433
  static const auto method =
440
434
  getReactNativeFeatureFlagsProviderJavaClass()->getMethod<jboolean()>("traceTurboModulePromiseRejectionsOnAndroid");
@@ -866,11 +860,6 @@ bool JReactNativeFeatureFlagsCxxInterop::skipActivityIdentityAssertionOnHostPaus
866
860
  return ReactNativeFeatureFlags::skipActivityIdentityAssertionOnHostPause();
867
861
  }
868
862
 
869
- bool JReactNativeFeatureFlagsCxxInterop::sweepActiveTouchOnChildNativeGesturesAndroid(
870
- facebook::jni::alias_ref<JReactNativeFeatureFlagsCxxInterop> /*unused*/) {
871
- return ReactNativeFeatureFlags::sweepActiveTouchOnChildNativeGesturesAndroid();
872
- }
873
-
874
863
  bool JReactNativeFeatureFlagsCxxInterop::traceTurboModulePromiseRejectionsOnAndroid(
875
864
  facebook::jni::alias_ref<JReactNativeFeatureFlagsCxxInterop> /*unused*/) {
876
865
  return ReactNativeFeatureFlags::traceTurboModulePromiseRejectionsOnAndroid();
@@ -1182,9 +1171,6 @@ void JReactNativeFeatureFlagsCxxInterop::registerNatives() {
1182
1171
  makeNativeMethod(
1183
1172
  "skipActivityIdentityAssertionOnHostPause",
1184
1173
  JReactNativeFeatureFlagsCxxInterop::skipActivityIdentityAssertionOnHostPause),
1185
- makeNativeMethod(
1186
- "sweepActiveTouchOnChildNativeGesturesAndroid",
1187
- JReactNativeFeatureFlagsCxxInterop::sweepActiveTouchOnChildNativeGesturesAndroid),
1188
1174
  makeNativeMethod(
1189
1175
  "traceTurboModulePromiseRejectionsOnAndroid",
1190
1176
  JReactNativeFeatureFlagsCxxInterop::traceTurboModulePromiseRejectionsOnAndroid),
@@ -4,7 +4,7 @@
4
4
  * This source code is licensed under the MIT license found in the
5
5
  * LICENSE file in the root directory of this source tree.
6
6
  *
7
- * @generated SignedSource<<1e57bf8252c16fc10bbfcae08710af85>>
7
+ * @generated SignedSource<<6238eb0739467af8477aa8fa79a023bf>>
8
8
  */
9
9
 
10
10
  /**
@@ -225,9 +225,6 @@ class JReactNativeFeatureFlagsCxxInterop
225
225
  static bool skipActivityIdentityAssertionOnHostPause(
226
226
  facebook::jni::alias_ref<JReactNativeFeatureFlagsCxxInterop>);
227
227
 
228
- static bool sweepActiveTouchOnChildNativeGesturesAndroid(
229
- facebook::jni::alias_ref<JReactNativeFeatureFlagsCxxInterop>);
230
-
231
228
  static bool traceTurboModulePromiseRejectionsOnAndroid(
232
229
  facebook::jni::alias_ref<JReactNativeFeatureFlagsCxxInterop>);
233
230
 
@@ -72,7 +72,7 @@ loadScriptFromAssets(AAssetManager* manager, const std::string& assetName) {
72
72
  }
73
73
 
74
74
  auto buf = std::make_unique<JSBigBufferString>(script->size());
75
- memcpy(buf->data(), script->c_str(), script->size());
75
+ memcpy(buf->mutableData(), script->c_str(), script->size());
76
76
  return buf;
77
77
  }
78
78
  }
@@ -10,11 +10,12 @@
10
10
  #include <string>
11
11
 
12
12
  #include <android/asset_manager.h>
13
- #include <cxxreact/JSExecutor.h>
14
13
  #include <fbjni/fbjni.h>
15
14
 
16
15
  namespace facebook::react {
17
16
 
17
+ class JSBigString;
18
+
18
19
  struct JAssetManager : jni::JavaClass<JAssetManager> {
19
20
  static constexpr auto kJavaDescriptor = "Landroid/content/res/AssetManager;";
20
21
  };
@@ -0,0 +1,10 @@
1
+ <?xml version="1.0" encoding="utf-8"?>
2
+ <vector xmlns:android="http://schemas.android.com/apk/res/android"
3
+ android:width="24dp"
4
+ android:height="24dp"
5
+ android:viewportWidth="960"
6
+ android:viewportHeight="960">
7
+ <path
8
+ android:fillColor="@android:color/white"
9
+ android:pathData="M80,880L80,160Q80,127 103.5,103.5Q127,80 160,80L800,80Q833,80 856.5,103.5Q880,127 880,160L880,640Q880,673 856.5,696.5Q833,720 800,720L240,720L80,880ZM480,600Q497,600 508.5,588.5Q520,577 520,560Q520,543 508.5,531.5Q497,520 480,520Q463,520 451.5,531.5Q440,543 440,560Q440,577 451.5,588.5Q463,600 480,600ZM440,440L520,440L520,200L440,200L440,440Z"/>
10
+ </vector>
@@ -10,6 +10,8 @@
10
10
  #include <memory>
11
11
  #include <string>
12
12
 
13
+ #include <jsi/jsi.h>
14
+
13
15
  #ifndef RN_EXPORT
14
16
  #ifdef _MSC_VER
15
17
  #define RN_EXPORT
@@ -27,15 +29,17 @@ namespace facebook::react {
27
29
  // large string needs to be curried into a std::function<>, which must
28
30
  // by CopyConstructible.
29
31
 
30
- class JSBigString {
32
+ class JSBigString : public facebook::jsi::Buffer {
31
33
  public:
32
34
  JSBigString() = default;
33
35
 
34
- // Not copyable
36
+ // Not copyable or movable
35
37
  JSBigString(const JSBigString &) = delete;
36
38
  JSBigString &operator=(const JSBigString &) = delete;
39
+ JSBigString(JSBigString &&) = delete;
40
+ JSBigString &operator=(JSBigString &&) = delete;
37
41
 
38
- virtual ~JSBigString() = default;
42
+ ~JSBigString() override = default;
39
43
 
40
44
  virtual bool isAscii() const = 0;
41
45
 
@@ -43,7 +47,12 @@ class JSBigString {
43
47
  virtual const char *c_str() const = 0;
44
48
 
45
49
  // Length of the c_str without the NULL byte.
46
- virtual size_t size() const = 0;
50
+ size_t size() const override = 0;
51
+
52
+ const uint8_t *data() const final
53
+ {
54
+ return reinterpret_cast<const uint8_t *>(c_str());
55
+ }
47
56
  };
48
57
 
49
58
  // Concrete JSBigString implementation which holds a std::string
@@ -105,7 +114,7 @@ class RN_EXPORT JSBigBufferString : public JSBigString {
105
114
  return m_size;
106
115
  }
107
116
 
108
- char *data()
117
+ char *mutableData()
109
118
  {
110
119
  return m_data;
111
120
  }
@@ -60,8 +60,8 @@ void JSIndexedRAMBundle::init() {
60
60
  "header size must exactly match the input file format");
61
61
 
62
62
  readBundle(reinterpret_cast<char*>(header), sizeof(header));
63
- const size_t numTableEntries = folly::Endian::little(header[1]);
64
- const size_t startupCodeSize = folly::Endian::little(header[2]);
63
+ size_t numTableEntries = folly::Endian::little(header[1]);
64
+ std::streamsize startupCodeSize = folly::Endian::little(header[2]);
65
65
 
66
66
  // allocate memory for meta data and lookup table.
67
67
  m_table = ModuleTable(numTableEntries);
@@ -73,7 +73,7 @@ void JSIndexedRAMBundle::init() {
73
73
  // read the startup code
74
74
  m_startupCode = std::make_unique<JSBigBufferString>(startupCodeSize - 1);
75
75
 
76
- readBundle(m_startupCode->data(), startupCodeSize - 1);
76
+ readBundle(m_startupCode->mutableData(), startupCodeSize - 1);
77
77
  }
78
78
 
79
79
  JSIndexedRAMBundle::Module JSIndexedRAMBundle::getModule(
@@ -109,8 +109,7 @@ std::string JSIndexedRAMBundle::getModuleCode(const uint32_t id) const {
109
109
  return ret;
110
110
  }
111
111
 
112
- void JSIndexedRAMBundle::readBundle(char* buffer, const std::streamsize bytes)
113
- const {
112
+ void JSIndexedRAMBundle::readBundle(char* buffer, std::streamsize bytes) const {
114
113
  if (!m_bundle->read(buffer, bytes)) {
115
114
  if ((m_bundle->rdstate() & std::ios::eofbit) != 0) {
116
115
  throw std::ios_base::failure("Unexpected end of RAM Bundle file");
@@ -13,16 +13,16 @@
13
13
  #include <string_view>
14
14
 
15
15
  #define REACT_NATIVE_VERSION_MAJOR 0
16
- #define REACT_NATIVE_VERSION_MINOR 83
16
+ #define REACT_NATIVE_VERSION_MINOR 84
17
17
  #define REACT_NATIVE_VERSION_PATCH 0
18
18
 
19
19
  namespace facebook::react {
20
20
 
21
21
  constexpr struct {
22
22
  int32_t Major = 0;
23
- int32_t Minor = 83;
23
+ int32_t Minor = 84;
24
24
  int32_t Patch = 0;
25
- std::string_view Prerelease = "rc.0";
25
+ std::string_view Prerelease = "nightly-20251105-5ec5cc3a3";
26
26
  } ReactNativeVersion;
27
27
 
28
28
  } // namespace facebook::react
@@ -168,8 +168,7 @@ void JSIExecutor::loadBundle(
168
168
  ReactMarker::logTaggedMarker(
169
169
  ReactMarker::RUN_JS_BUNDLE_START, scriptName.c_str());
170
170
  }
171
- runtime_->evaluateJavaScript(
172
- std::make_unique<BigStringBuffer>(std::move(script)), sourceURL);
171
+ runtime_->evaluateJavaScript(std::move(script), sourceURL);
173
172
  flush();
174
173
  if (hasLogger) {
175
174
  ReactMarker::logTaggedMarker(
@@ -212,7 +211,7 @@ void JSIExecutor::registerBundle(
212
211
  "Empty bundle registered with ID " + tag + " from " + bundlePath);
213
212
  }
214
213
  runtime_->evaluateJavaScript(
215
- std::make_unique<BigStringBuffer>(std::move(script)),
214
+ std::move(script),
216
215
  JSExecutor::getSyntheticBundlePath(bundleId, bundlePath));
217
216
  }
218
217
  ReactMarker::logTaggedMarker(
@@ -49,7 +49,7 @@ namespace facebook::react {
49
49
  using JSIScopedTimeoutInvoker =
50
50
  std::function<void(const std::function<void()> &invokee, std::function<std::string()> errorMessageProducer)>;
51
51
 
52
- class BigStringBuffer : public jsi::Buffer {
52
+ class [[deprecated("JSBigString implements jsi::Buffer directly")]] BigStringBuffer : public jsi::Buffer {
53
53
  public:
54
54
  BigStringBuffer(std::unique_ptr<const JSBigString> script) : script_(std::move(script)) {}
55
55
 
@@ -60,7 +60,7 @@ class BigStringBuffer : public jsi::Buffer {
60
60
 
61
61
  const uint8_t *data() const override
62
62
  {
63
- return reinterpret_cast<const uint8_t *>(script_->c_str());
63
+ return script_->data();
64
64
  }
65
65
 
66
66
  private:
@@ -21,7 +21,15 @@ void PerfMonitorUpdateHandler::handlePerfIssueAdded(
21
21
  delegate_.unstable_onPerfIssueAdded(
22
22
  PerfIssuePayload{
23
23
  .name = payload["name"].asString(),
24
- .severity = payload["severity"].asString(),
24
+ .severity = payload["severity"].isNull()
25
+ ? std::nullopt
26
+ : std::make_optional(payload["severity"].asString()),
27
+ .description = payload["description"].isNull()
28
+ ? std::nullopt
29
+ : std::make_optional(payload["description"].asString()),
30
+ .learnMoreUrl = payload["learnMoreUrl"].isNull()
31
+ ? std::nullopt
32
+ : std::make_optional(payload["learnMoreUrl"].asString()),
25
33
  });
26
34
  }
27
35
  }
@@ -7,6 +7,7 @@
7
7
 
8
8
  #pragma once
9
9
 
10
+ #include <optional>
10
11
  #include <string>
11
12
 
12
13
  namespace facebook::react::jsinspector_modern {
@@ -15,7 +16,9 @@ class HostTargetDelegate;
15
16
 
16
17
  struct PerfIssuePayload {
17
18
  std::string name;
18
- std::string severity;
19
+ std::optional<std::string> severity;
20
+ std::optional<std::string> description;
21
+ std::optional<std::string> learnMoreUrl;
19
22
  };
20
23
 
21
24
  /**
@@ -26,12 +26,8 @@ const uint16_t TRACE_EVENT_CHUNK_SIZE = 1000;
26
26
  /**
27
27
  * The maximum number of ProfileChunk trace events
28
28
  * that will be sent in a single CDP Tracing.dataCollected message.
29
- * TODO(T219394401): Increase the size once we manage the queue on OkHTTP
30
- side
31
- * properly and avoid WebSocket disconnections when sending a message larger
32
- * than 16MB.
33
29
  */
34
- const uint16_t PROFILE_TRACE_EVENT_CHUNK_SIZE = 1;
30
+ const uint16_t PROFILE_TRACE_EVENT_CHUNK_SIZE = 10;
35
31
 
36
32
  } // namespace
37
33
 
@@ -53,7 +49,6 @@ TracingAgent::~TracingAgent() {
53
49
 
54
50
  bool TracingAgent::handleRequest(const cdp::PreparsedRequest& req) {
55
51
  if (req.method == "Tracing.start") {
56
- // @cdp Tracing.start support is experimental.
57
52
  if (sessionState_.isDebuggerDomainEnabled) {
58
53
  frontendChannel_(
59
54
  cdp::jsonError(
@@ -81,7 +76,6 @@ bool TracingAgent::handleRequest(const cdp::PreparsedRequest& req) {
81
76
 
82
77
  return true;
83
78
  } else if (req.method == "Tracing.end") {
84
- // @cdp Tracing.end support is experimental.
85
79
  auto state = hostTargetController_.stopTracing();
86
80
 
87
81
  sessionState_.hasPendingTraceRecording = false;
@@ -5,7 +5,7 @@
5
5
  * LICENSE file in the root directory of this source tree.
6
6
  */
7
7
 
8
- #include "JsiIntegrationTest.h"
8
+ #include "TracingTest.h"
9
9
  #include "engines/JsiIntegrationTestHermesEngineAdapter.h"
10
10
 
11
11
  #include <folly/executors/QueuedImmediateExecutor.h>
@@ -31,13 +31,13 @@ struct NetworkReporterTestParams {
31
31
  */
32
32
  template <typename Params>
33
33
  requires std::convertible_to<Params, NetworkReporterTestParams>
34
- class NetworkReporterTestBase : public JsiIntegrationPortableTestBase<
34
+ class NetworkReporterTestBase : public TracingTestBase<
35
35
  JsiIntegrationTestHermesEngineAdapter,
36
36
  folly::QueuedImmediateExecutor>,
37
37
  public WithParamInterface<Params> {
38
38
  protected:
39
39
  NetworkReporterTestBase()
40
- : JsiIntegrationPortableTestBase({
40
+ : TracingTestBase({
41
41
  .networkInspectionEnabled = true,
42
42
  .enableNetworkEventReporting =
43
43
  WithParamInterface<Params>::GetParam()
@@ -68,58 +68,6 @@ class NetworkReporterTestBase : public JsiIntegrationPortableTestBase<
68
68
  urlMatcher);
69
69
  }
70
70
 
71
- void startTracing() {
72
- this->expectMessageFromPage(JsonEq(R"({
73
- "id": 1,
74
- "result": {}
75
- })"));
76
-
77
- this->toPage_->sendMessage(R"({
78
- "id": 1,
79
- "method": "Tracing.start"
80
- })");
81
- }
82
-
83
- /**
84
- * Helper method to end tracing and collect all trace events from potentially
85
- * multiple chunked Tracing.dataCollected messages.
86
- * \returns A vector containing all collected trace events
87
- */
88
- std::vector<folly::dynamic> endTracingAndCollectEvents() {
89
- InSequence s;
90
-
91
- this->expectMessageFromPage(JsonEq(R"({
92
- "id": 1,
93
- "result": {}
94
- })"));
95
-
96
- std::vector<folly::dynamic> allTraceEvents;
97
-
98
- EXPECT_CALL(
99
- fromPage(),
100
- onMessage(JsonParsed(AtJsonPtr("/method", "Tracing.dataCollected"))))
101
- .Times(AtLeast(1))
102
- .WillRepeatedly(Invoke([&allTraceEvents](const std::string& message) {
103
- auto parsedMessage = folly::parseJson(message);
104
- auto& events = parsedMessage.at("params").at("value");
105
- allTraceEvents.insert(
106
- allTraceEvents.end(),
107
- std::make_move_iterator(events.begin()),
108
- std::make_move_iterator(events.end()));
109
- }));
110
-
111
- this->expectMessageFromPage(JsonParsed(AllOf(
112
- AtJsonPtr("/method", "Tracing.tracingComplete"),
113
- AtJsonPtr("/params/dataLossOccurred", false))));
114
-
115
- this->toPage_->sendMessage(R"({
116
- "id": 1,
117
- "method": "Tracing.end"
118
- })");
119
-
120
- return allTraceEvents;
121
- }
122
-
123
71
  private:
124
72
  std::optional<std::string> getScriptUrlById(const std::string& scriptId) {
125
73
  auto it = scriptUrlsById_.find(scriptId);
@@ -0,0 +1,82 @@
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
+ #pragma once
9
+
10
+ #include "JsiIntegrationTest.h"
11
+
12
+ #include <folly/dynamic.h>
13
+ #include <folly/json.h>
14
+ #include <gmock/gmock.h>
15
+ #include <vector>
16
+
17
+ #include "FollyDynamicMatchers.h"
18
+
19
+ namespace facebook::react::jsinspector_modern {
20
+
21
+ /**
22
+ * Base test class providing tracing-related test utilities for tests.
23
+ */
24
+ template <typename EngineAdapter, typename Executor>
25
+ class TracingTestBase : public JsiIntegrationPortableTestBase<EngineAdapter, Executor> {
26
+ protected:
27
+ using JsiIntegrationPortableTestBase<EngineAdapter, Executor>::JsiIntegrationPortableTestBase;
28
+
29
+ /**
30
+ * Helper method to start tracing via Tracing.start CDP command.
31
+ */
32
+ void startTracing()
33
+ {
34
+ this->expectMessageFromPage(JsonEq(R"({
35
+ "id": 1,
36
+ "result": {}
37
+ })"));
38
+
39
+ this->toPage_->sendMessage(R"({
40
+ "id": 1,
41
+ "method": "Tracing.start"
42
+ })");
43
+ }
44
+
45
+ /**
46
+ * Helper method to end tracing and collect all trace events from potentially
47
+ * multiple chunked Tracing.dataCollected messages.
48
+ * \returns A vector containing all collected trace events
49
+ */
50
+ std::vector<folly::dynamic> endTracingAndCollectEvents()
51
+ {
52
+ testing::InSequence s;
53
+
54
+ this->expectMessageFromPage(JsonEq(R"({
55
+ "id": 1,
56
+ "result": {}
57
+ })"));
58
+
59
+ std::vector<folly::dynamic> allTraceEvents;
60
+
61
+ EXPECT_CALL(this->fromPage(), onMessage(JsonParsed(AtJsonPtr("/method", "Tracing.dataCollected"))))
62
+ .Times(testing::AtLeast(1))
63
+ .WillRepeatedly(testing::Invoke([&allTraceEvents](const std::string &message) {
64
+ auto parsedMessage = folly::parseJson(message);
65
+ auto &events = parsedMessage.at("params").at("value");
66
+ allTraceEvents.insert(
67
+ allTraceEvents.end(), std::make_move_iterator(events.begin()), std::make_move_iterator(events.end()));
68
+ }));
69
+
70
+ this->expectMessageFromPage(JsonParsed(
71
+ testing::AllOf(AtJsonPtr("/method", "Tracing.tracingComplete"), AtJsonPtr("/params/dataLossOccurred", false))));
72
+
73
+ this->toPage_->sendMessage(R"({
74
+ "id": 1,
75
+ "method": "Tracing.end"
76
+ })");
77
+
78
+ return allTraceEvents;
79
+ }
80
+ };
81
+
82
+ } // namespace facebook::react::jsinspector_modern
@@ -360,6 +360,41 @@ void PerformanceTracer::reportResourceFinish(
360
360
  });
361
361
  }
362
362
 
363
+ void PerformanceTracer::setLayerTreeId(std::string frame, int layerTreeId) {
364
+ enqueueEvent(
365
+ PerformanceTracerSetLayerTreeIdEvent{
366
+ .frame = std::move(frame),
367
+ .layerTreeId = layerTreeId,
368
+ .start = HighResTimeStamp::now(),
369
+ .threadId = getCurrentThreadId(),
370
+ });
371
+ }
372
+
373
+ void PerformanceTracer::reportFrameTiming(
374
+ int frameSeqId,
375
+ HighResTimeStamp start,
376
+ HighResTimeStamp end) {
377
+ ThreadId threadId = getCurrentThreadId();
378
+ enqueueEvent(
379
+ PerformanceTracerFrameBeginDrawEvent{
380
+ .frameSeqId = frameSeqId,
381
+ .start = start,
382
+ .threadId = threadId,
383
+ });
384
+ enqueueEvent(
385
+ PerformanceTracerFrameCommitEvent{
386
+ .frameSeqId = frameSeqId,
387
+ .start = start,
388
+ .threadId = threadId,
389
+ });
390
+ enqueueEvent(
391
+ PerformanceTracerFrameDrawEvent{
392
+ .frameSeqId = frameSeqId,
393
+ .start = end,
394
+ .threadId = threadId,
395
+ });
396
+ }
397
+
363
398
  /* static */ TraceEvent PerformanceTracer::constructRuntimeProfileTraceEvent(
364
399
  RuntimeProfileId profileId,
365
400
  ProcessId processId,
@@ -737,6 +772,70 @@ void PerformanceTracer::enqueueTraceEventsFromPerformanceTracerEvent(
737
772
  .args = folly::dynamic::object("data", std::move(data)),
738
773
  });
739
774
  },
775
+ [&](PerformanceTracerSetLayerTreeIdEvent&& event) {
776
+ folly::dynamic data = folly::dynamic::object("frame", event.frame)(
777
+ "layerTreeId", event.layerTreeId);
778
+
779
+ events.emplace_back(
780
+ TraceEvent{
781
+ .name = "SetLayerTreeId",
782
+ .cat = "devtools.timeline",
783
+ .ph = 'I',
784
+ .ts = event.start,
785
+ .pid = processId_,
786
+ .s = 't',
787
+ .tid = event.threadId,
788
+ .args = folly::dynamic::object("data", std::move(data)),
789
+ });
790
+ },
791
+ [&](PerformanceTracerFrameBeginDrawEvent&& event) {
792
+ folly::dynamic data = folly::dynamic::object(
793
+ "frameSeqId", event.frameSeqId)("layerTreeId", 1);
794
+
795
+ events.emplace_back(
796
+ TraceEvent{
797
+ .name = "BeginFrame",
798
+ .cat = "devtools.timeline",
799
+ .ph = 'I',
800
+ .ts = event.start,
801
+ .pid = processId_,
802
+ .s = 't',
803
+ .tid = event.threadId,
804
+ .args = std::move(data),
805
+ });
806
+ },
807
+ [&](PerformanceTracerFrameCommitEvent&& event) {
808
+ folly::dynamic data = folly::dynamic::object(
809
+ "frameSeqId", event.frameSeqId)("layerTreeId", 1);
810
+
811
+ events.emplace_back(
812
+ TraceEvent{
813
+ .name = "Commit",
814
+ .cat = "devtools.timeline",
815
+ .ph = 'I',
816
+ .ts = event.start,
817
+ .pid = processId_,
818
+ .s = 't',
819
+ .tid = event.threadId,
820
+ .args = std::move(data),
821
+ });
822
+ },
823
+ [&](PerformanceTracerFrameDrawEvent&& event) {
824
+ folly::dynamic data = folly::dynamic::object(
825
+ "frameSeqId", event.frameSeqId)("layerTreeId", 1);
826
+
827
+ events.emplace_back(
828
+ TraceEvent{
829
+ .name = "DrawFrame",
830
+ .cat = "devtools.timeline",
831
+ .ph = 'I',
832
+ .ts = event.start,
833
+ .pid = processId_,
834
+ .s = 't',
835
+ .tid = event.threadId,
836
+ .args = std::move(data),
837
+ });
838
+ },
740
839
  },
741
840
  std::move(event));
742
841
  }
@@ -161,6 +161,19 @@ class PerformanceTracer {
161
161
  int encodedDataLength,
162
162
  int decodedBodyLength);
163
163
 
164
+ /**
165
+ * Sets the active layer tree ID in Chrome DevTools. This is needed in
166
+ * order for frames to be parsed.
167
+ *
168
+ * https://chromedevtools.github.io/devtools-protocol/tot/LayerTree/
169
+ */
170
+ void setLayerTreeId(std::string frame, int layerTreeId);
171
+
172
+ /**
173
+ * Reports the required frame CDP events for a given native frame.
174
+ */
175
+ void reportFrameTiming(int frameSeqId, HighResTimeStamp start, HighResTimeStamp end);
176
+
164
177
  /**
165
178
  * Creates "Profile" Trace Event.
166
179
  *
@@ -290,6 +303,35 @@ class PerformanceTracer {
290
303
  HighResTimeStamp createdAt = HighResTimeStamp::now();
291
304
  };
292
305
 
306
+ struct PerformanceTracerSetLayerTreeIdEvent {
307
+ std::string frame;
308
+ int layerTreeId;
309
+ HighResTimeStamp start;
310
+ ThreadId threadId;
311
+ HighResTimeStamp createdAt = HighResTimeStamp::now();
312
+ };
313
+
314
+ struct PerformanceTracerFrameBeginDrawEvent {
315
+ int frameSeqId;
316
+ HighResTimeStamp start;
317
+ ThreadId threadId;
318
+ HighResTimeStamp createdAt = HighResTimeStamp::now();
319
+ };
320
+
321
+ struct PerformanceTracerFrameCommitEvent {
322
+ int frameSeqId;
323
+ HighResTimeStamp start;
324
+ ThreadId threadId;
325
+ HighResTimeStamp createdAt = HighResTimeStamp::now();
326
+ };
327
+
328
+ struct PerformanceTracerFrameDrawEvent {
329
+ int frameSeqId;
330
+ HighResTimeStamp start;
331
+ ThreadId threadId;
332
+ HighResTimeStamp createdAt = HighResTimeStamp::now();
333
+ };
334
+
293
335
  using PerformanceTracerEvent = std::variant<
294
336
  PerformanceTracerEventTimeStamp,
295
337
  PerformanceTracerEventEventLoopTask,
@@ -298,7 +340,11 @@ class PerformanceTracer {
298
340
  PerformanceTracerEventMeasure,
299
341
  PerformanceTracerResourceSendRequest,
300
342
  PerformanceTracerResourceReceiveResponse,
301
- PerformanceTracerResourceFinish>;
343
+ PerformanceTracerResourceFinish,
344
+ PerformanceTracerSetLayerTreeIdEvent,
345
+ PerformanceTracerFrameBeginDrawEvent,
346
+ PerformanceTracerFrameCommitEvent,
347
+ PerformanceTracerFrameDrawEvent>;
302
348
 
303
349
  #pragma mark - Private fields and methods
304
350
 
@@ -4,7 +4,7 @@
4
4
  * This source code is licensed under the MIT license found in the
5
5
  * LICENSE file in the root directory of this source tree.
6
6
  *
7
- * @generated SignedSource<<5d596cc470e66861d7c1b2ffbb15b268>>
7
+ * @generated SignedSource<<6f88454830626622f9b5720ae0395938>>
8
8
  */
9
9
 
10
10
  /**
@@ -286,10 +286,6 @@ bool ReactNativeFeatureFlags::skipActivityIdentityAssertionOnHostPause() {
286
286
  return getAccessor().skipActivityIdentityAssertionOnHostPause();
287
287
  }
288
288
 
289
- bool ReactNativeFeatureFlags::sweepActiveTouchOnChildNativeGesturesAndroid() {
290
- return getAccessor().sweepActiveTouchOnChildNativeGesturesAndroid();
291
- }
292
-
293
289
  bool ReactNativeFeatureFlags::traceTurboModulePromiseRejectionsOnAndroid() {
294
290
  return getAccessor().traceTurboModulePromiseRejectionsOnAndroid();
295
291
  }