react-native 0.84.0-nightly-20251107-f8198f662 → 0.84.0-nightly-20251109-b7012ba92

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 (63) hide show
  1. package/Libraries/Blob/RCTBlobPlugins.mm +14 -14
  2. package/Libraries/Core/ReactNativeVersion.js +1 -1
  3. package/Libraries/Image/RCTImagePlugins.h +1 -0
  4. package/Libraries/Image/RCTImagePlugins.mm +30 -17
  5. package/Libraries/LinkingIOS/RCTLinkingPlugins.mm +10 -13
  6. package/Libraries/LogBox/Data/LogBoxData.js +31 -4
  7. package/Libraries/NativeAnimation/RCTAnimationPlugins.mm +14 -14
  8. package/Libraries/Network/RCTNetworkPlugins.mm +22 -16
  9. package/Libraries/PushNotificationIOS/RCTPushNotificationPlugins.mm +10 -13
  10. package/Libraries/Settings/RCTSettingsPlugins.mm +10 -13
  11. package/Libraries/Vibration/RCTVibrationPlugins.mm +10 -13
  12. package/React/Base/RCTVersion.m +1 -1
  13. package/React/CoreModules/CoreModulesPlugins.mm +98 -35
  14. package/React/FBReactNativeSpec/FBReactNativeSpecJSI.h +16 -0
  15. package/ReactAndroid/gradle.properties +1 -1
  16. package/ReactAndroid/src/main/java/com/facebook/react/fabric/FabricUIManager.java +1 -1
  17. package/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlags.kt +13 -1
  18. package/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsCxxAccessor.kt +21 -1
  19. package/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsCxxInterop.kt +5 -1
  20. package/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsDefaults.kt +5 -1
  21. package/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsLocalAccessor.kt +23 -1
  22. package/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsProvider.kt +5 -1
  23. package/ReactAndroid/src/main/java/com/facebook/react/modules/systeminfo/ReactNativeVersion.kt +1 -1
  24. package/ReactAndroid/src/main/java/com/facebook/react/uimanager/BaseViewManager.java +4 -5
  25. package/ReactAndroid/src/main/java/com/facebook/react/uimanager/drawable/OutlineDrawable.kt +1 -1
  26. package/ReactAndroid/src/main/jni/react/fabric/FabricUIManagerBinding.cpp +12 -0
  27. package/ReactAndroid/src/main/jni/react/featureflags/JReactNativeFeatureFlagsCxxInterop.cpp +29 -1
  28. package/ReactAndroid/src/main/jni/react/featureflags/JReactNativeFeatureFlagsCxxInterop.h +7 -1
  29. package/ReactAndroid/src/main/jni/react/runtime/jni/JReactHostInspectorTarget.cpp +8 -1
  30. package/ReactAndroid/src/main/jni/third-party/folly/CMakeLists.txt +1 -0
  31. package/ReactApple/RCTAnimatedModuleProvider/RCTAnimatedModuleProvider.mm +29 -4
  32. package/ReactCommon/cxxreact/ReactNativeVersion.h +1 -1
  33. package/ReactCommon/jsinspector-modern/HostTarget.h +8 -2
  34. package/ReactCommon/jsinspector-modern/HostTargetTraceRecording.cpp +6 -2
  35. package/ReactCommon/jsinspector-modern/HostTargetTraceRecording.h +15 -5
  36. package/ReactCommon/jsinspector-modern/HostTargetTracing.cpp +9 -5
  37. package/ReactCommon/jsinspector-modern/RuntimeAgent.cpp +3 -2
  38. package/ReactCommon/jsinspector-modern/TracingAgent.cpp +19 -2
  39. package/ReactCommon/jsinspector-modern/tests/TracingTest.cpp +59 -0
  40. package/ReactCommon/jsinspector-modern/tests/TracingTest.h +20 -7
  41. package/ReactCommon/jsinspector-modern/tracing/PerformanceTracer.cpp +19 -18
  42. package/ReactCommon/jsinspector-modern/tracing/TraceEvent.h +2 -1
  43. package/ReactCommon/jsinspector-modern/tracing/TraceEventSerializer.cpp +2 -1
  44. package/ReactCommon/jsinspector-modern/tracing/TraceRecordingState.h +3 -0
  45. package/ReactCommon/jsinspector-modern/tracing/TracingCategory.h +126 -0
  46. package/ReactCommon/react/featureflags/ReactNativeFeatureFlags.cpp +9 -1
  47. package/ReactCommon/react/featureflags/ReactNativeFeatureFlags.h +11 -1
  48. package/ReactCommon/react/featureflags/ReactNativeFeatureFlagsAccessor.cpp +113 -77
  49. package/ReactCommon/react/featureflags/ReactNativeFeatureFlagsAccessor.h +6 -2
  50. package/ReactCommon/react/featureflags/ReactNativeFeatureFlagsDefaults.h +9 -1
  51. package/ReactCommon/react/featureflags/ReactNativeFeatureFlagsDynamicProvider.h +19 -1
  52. package/ReactCommon/react/featureflags/ReactNativeFeatureFlagsProvider.h +3 -1
  53. package/ReactCommon/react/nativemodule/core/platform/ios/ReactCommon/RCTTurboModuleManager.mm +0 -1
  54. package/ReactCommon/react/nativemodule/featureflags/NativeReactNativeFeatureFlags.cpp +11 -1
  55. package/ReactCommon/react/nativemodule/featureflags/NativeReactNativeFeatureFlags.h +5 -1
  56. package/ReactCommon/react/renderer/animated/NativeAnimatedNodesManager.cpp +3 -3
  57. package/ReactCommon/react/renderer/animated/NativeAnimatedNodesManagerProvider.cpp +2 -1
  58. package/ReactCommon/react/runtime/TimerManager.cpp +0 -54
  59. package/ReactCommon/react/runtime/TimerManager.h +0 -12
  60. package/package.json +9 -9
  61. package/sdks/hermes-engine/version.properties +1 -1
  62. package/src/private/featureflags/ReactNativeFeatureFlags.js +11 -1
  63. package/src/private/featureflags/specs/NativeReactNativeFeatureFlags.js +3 -1
@@ -0,0 +1,59 @@
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 "TracingTest.h"
9
+ #include "engines/JsiIntegrationTestHermesEngineAdapter.h"
10
+
11
+ #include <folly/executors/QueuedImmediateExecutor.h>
12
+ #include <jsinspector-modern/InspectorFlags.h>
13
+ #include <react/featureflags/ReactNativeFeatureFlags.h>
14
+ #include <react/networking/NetworkReporter.h>
15
+
16
+ using namespace ::testing;
17
+
18
+ namespace facebook::react::jsinspector_modern {
19
+
20
+ class TracingTest : public TracingTestBase<
21
+ JsiIntegrationTestHermesEngineAdapter,
22
+ folly::QueuedImmediateExecutor> {
23
+ protected:
24
+ TracingTest() : TracingTestBase() {}
25
+
26
+ void SetUp() override {
27
+ JsiIntegrationPortableTestBase::SetUp();
28
+ connect();
29
+ EXPECT_CALL(
30
+ fromPage(),
31
+ onMessage(
32
+ JsonParsed(AllOf(AtJsonPtr("/method", "Debugger.scriptParsed")))))
33
+ .Times(AnyNumber());
34
+ }
35
+ };
36
+
37
+ TEST_F(TracingTest, EnablesSamplingProfilerOnlyCategoryIsSpecified) {
38
+ InSequence s;
39
+
40
+ startTracing({});
41
+ auto allTraceEvents = endTracingAndCollectEvents();
42
+
43
+ EXPECT_THAT(
44
+ allTraceEvents,
45
+ Not(Contains(AllOf(
46
+ AtJsonPtr("/name", "Profile"),
47
+ AtJsonPtr("/cat", "disabled-by-default-v8.cpu_profiler")))));
48
+
49
+ startTracing({tracing::Category::JavaScriptSampling});
50
+ allTraceEvents = endTracingAndCollectEvents();
51
+
52
+ EXPECT_THAT(
53
+ allTraceEvents,
54
+ Contains(AllOf(
55
+ AtJsonPtr("/name", "Profile"),
56
+ AtJsonPtr("/cat", "disabled-by-default-v8.cpu_profiler"))));
57
+ }
58
+
59
+ } // namespace facebook::react::jsinspector_modern
@@ -7,14 +7,16 @@
7
7
 
8
8
  #pragma once
9
9
 
10
+ #include "FollyDynamicMatchers.h"
10
11
  #include "JsiIntegrationTest.h"
11
12
 
13
+ #include <fmt/format.h>
12
14
  #include <folly/dynamic.h>
13
15
  #include <folly/json.h>
14
16
  #include <gmock/gmock.h>
15
- #include <vector>
16
17
 
17
- #include "FollyDynamicMatchers.h"
18
+ #include <set>
19
+ #include <vector>
18
20
 
19
21
  namespace facebook::react::jsinspector_modern {
20
22
 
@@ -29,17 +31,28 @@ class TracingTestBase : public JsiIntegrationPortableTestBase<EngineAdapter, Exe
29
31
  /**
30
32
  * Helper method to start tracing via Tracing.start CDP command.
31
33
  */
32
- void startTracing()
34
+ void startTracing(
35
+ const std::set<tracing::Category> &enabledCategories = {
36
+ tracing::Category::HiddenTimeline,
37
+ tracing::Category::JavaScriptSampling,
38
+ tracing::Category::RuntimeExecution,
39
+ tracing::Category::Timeline,
40
+ tracing::Category::UserTiming,
41
+ })
33
42
  {
34
43
  this->expectMessageFromPage(JsonEq(R"({
35
44
  "id": 1,
36
45
  "result": {}
37
46
  })"));
38
47
 
39
- this->toPage_->sendMessage(R"({
40
- "id": 1,
41
- "method": "Tracing.start"
42
- })");
48
+ this->toPage_->sendMessage(
49
+ fmt::format(
50
+ R"({{
51
+ "id": 1,
52
+ "method": "Tracing.start",
53
+ "params": {{ "categories": "{0}" }}
54
+ }})",
55
+ tracing::serializeTracingCategories(enabledCategories)));
43
56
  }
44
57
 
45
58
  /**
@@ -8,6 +8,7 @@
8
8
  #include "PerformanceTracer.h"
9
9
  #include "Timing.h"
10
10
  #include "TraceEventSerializer.h"
11
+ #include "TracingCategory.h"
11
12
 
12
13
  #include <jsinspector-modern/network/CdpNetwork.h>
13
14
  #include <jsinspector-modern/network/HttpUtils.h>
@@ -138,7 +139,7 @@ std::optional<std::vector<TraceEvent>> PerformanceTracer::stopTracing() {
138
139
  events.emplace_back(
139
140
  TraceEvent{
140
141
  .name = "TracingStartedInPage",
141
- .cat = "disabled-by-default-devtools.timeline",
142
+ .cat = {Category::HiddenTimeline},
142
143
  .ph = 'I',
143
144
  .ts = currentTraceStartTime,
144
145
  .pid = processId_,
@@ -149,7 +150,7 @@ std::optional<std::vector<TraceEvent>> PerformanceTracer::stopTracing() {
149
150
  events.emplace_back(
150
151
  TraceEvent{
151
152
  .name = "ReactNative-TracingStopped",
152
- .cat = "disabled-by-default-devtools.timeline",
153
+ .cat = {Category::HiddenTimeline},
153
154
  .ph = 'I',
154
155
  .ts = currentTraceEndTime,
155
156
  .pid = processId_,
@@ -409,7 +410,7 @@ void PerformanceTracer::reportFrameTiming(
409
410
  return TraceEvent{
410
411
  .id = profileId,
411
412
  .name = "Profile",
412
- .cat = "disabled-by-default-v8.cpu_profiler",
413
+ .cat = {Category::JavaScriptSampling},
413
414
  .ph = 'P',
414
415
  .ts = profileTimestamp,
415
416
  .pid = processId,
@@ -432,7 +433,7 @@ PerformanceTracer::constructRuntimeProfileChunkTraceEvent(
432
433
  return TraceEvent{
433
434
  .id = profileId,
434
435
  .name = "ProfileChunk",
435
- .cat = "disabled-by-default-v8.cpu_profiler",
436
+ .cat = {Category::JavaScriptSampling},
436
437
  .ph = 'P',
437
438
  .ts = chunkTimestamp,
438
439
  .pid = processId,
@@ -564,7 +565,7 @@ void PerformanceTracer::enqueueTraceEventsFromPerformanceTracerEvent(
564
565
  events.emplace_back(
565
566
  TraceEvent{
566
567
  .name = "RunTask",
567
- .cat = "disabled-by-default-devtools.timeline",
568
+ .cat = {Category::HiddenTimeline},
568
569
  .ph = 'X',
569
570
  .ts = event.start,
570
571
  .pid = processId_,
@@ -576,7 +577,7 @@ void PerformanceTracer::enqueueTraceEventsFromPerformanceTracerEvent(
576
577
  events.emplace_back(
577
578
  TraceEvent{
578
579
  .name = "RunMicrotasks",
579
- .cat = "v8.execute",
580
+ .cat = {Category::RuntimeExecution},
580
581
  .ph = 'X',
581
582
  .ts = event.start,
582
583
  .pid = processId_,
@@ -596,7 +597,7 @@ void PerformanceTracer::enqueueTraceEventsFromPerformanceTracerEvent(
596
597
  events.emplace_back(
597
598
  TraceEvent{
598
599
  .name = std::move(event.name),
599
- .cat = "blink.user_timing",
600
+ .cat = {Category::UserTiming},
600
601
  .ph = 'I',
601
602
  .ts = event.start,
602
603
  .pid = processId_,
@@ -621,7 +622,7 @@ void PerformanceTracer::enqueueTraceEventsFromPerformanceTracerEvent(
621
622
  TraceEvent{
622
623
  .id = eventId,
623
624
  .name = event.name,
624
- .cat = "blink.user_timing",
625
+ .cat = {Category::UserTiming},
625
626
  .ph = 'b',
626
627
  .ts = event.start,
627
628
  .pid = processId_,
@@ -632,7 +633,7 @@ void PerformanceTracer::enqueueTraceEventsFromPerformanceTracerEvent(
632
633
  TraceEvent{
633
634
  .id = eventId,
634
635
  .name = std::move(event.name),
635
- .cat = "blink.user_timing",
636
+ .cat = {Category::UserTiming},
636
637
  .ph = 'e',
637
638
  .ts = event.start + event.duration,
638
639
  .pid = processId_,
@@ -672,7 +673,7 @@ void PerformanceTracer::enqueueTraceEventsFromPerformanceTracerEvent(
672
673
  events.emplace_back(
673
674
  TraceEvent{
674
675
  .name = "TimeStamp",
675
- .cat = "devtools.timeline",
676
+ .cat = {Category::Timeline},
676
677
  .ph = 'I',
677
678
  .ts = event.createdAt,
678
679
  .pid = processId_,
@@ -710,7 +711,7 @@ void PerformanceTracer::enqueueTraceEventsFromPerformanceTracerEvent(
710
711
  events.emplace_back(
711
712
  TraceEvent{
712
713
  .name = "TimeStamp",
713
- .cat = "devtools.timeline",
714
+ .cat = {Category::Timeline},
714
715
  .ph = 'I',
715
716
  .ts = event.createdAt,
716
717
  .pid = processId_,
@@ -730,7 +731,7 @@ void PerformanceTracer::enqueueTraceEventsFromPerformanceTracerEvent(
730
731
  events.emplace_back(
731
732
  TraceEvent{
732
733
  .name = "ResourceSendRequest",
733
- .cat = "devtools.timeline",
734
+ .cat = {Category::Timeline},
734
735
  .ph = 'I',
735
736
  .ts = event.start,
736
737
  .pid = processId_,
@@ -756,7 +757,7 @@ void PerformanceTracer::enqueueTraceEventsFromPerformanceTracerEvent(
756
757
  events.emplace_back(
757
758
  TraceEvent{
758
759
  .name = "ResourceReceiveResponse",
759
- .cat = "devtools.timeline",
760
+ .cat = {Category::Timeline},
760
761
  .ph = 'I',
761
762
  .ts = event.start,
762
763
  .pid = processId_,
@@ -774,7 +775,7 @@ void PerformanceTracer::enqueueTraceEventsFromPerformanceTracerEvent(
774
775
  events.emplace_back(
775
776
  TraceEvent{
776
777
  .name = "ResourceFinish",
777
- .cat = "devtools.timeline",
778
+ .cat = {Category::Timeline},
778
779
  .ph = 'I',
779
780
  .ts = event.start,
780
781
  .pid = processId_,
@@ -790,7 +791,7 @@ void PerformanceTracer::enqueueTraceEventsFromPerformanceTracerEvent(
790
791
  events.emplace_back(
791
792
  TraceEvent{
792
793
  .name = "SetLayerTreeId",
793
- .cat = "devtools.timeline",
794
+ .cat = {Category::Timeline},
794
795
  .ph = 'I',
795
796
  .ts = event.start,
796
797
  .pid = processId_,
@@ -806,7 +807,7 @@ void PerformanceTracer::enqueueTraceEventsFromPerformanceTracerEvent(
806
807
  events.emplace_back(
807
808
  TraceEvent{
808
809
  .name = "BeginFrame",
809
- .cat = "devtools.timeline",
810
+ .cat = {Category::Timeline},
810
811
  .ph = 'I',
811
812
  .ts = event.start,
812
813
  .pid = processId_,
@@ -822,7 +823,7 @@ void PerformanceTracer::enqueueTraceEventsFromPerformanceTracerEvent(
822
823
  events.emplace_back(
823
824
  TraceEvent{
824
825
  .name = "Commit",
825
- .cat = "devtools.timeline",
826
+ .cat = {Category::Timeline},
826
827
  .ph = 'I',
827
828
  .ts = event.start,
828
829
  .pid = processId_,
@@ -838,7 +839,7 @@ void PerformanceTracer::enqueueTraceEventsFromPerformanceTracerEvent(
838
839
  events.emplace_back(
839
840
  TraceEvent{
840
841
  .name = "DrawFrame",
841
- .cat = "devtools.timeline",
842
+ .cat = {Category::Timeline},
842
843
  .ph = 'I',
843
844
  .ts = event.start,
844
845
  .pid = processId_,
@@ -7,6 +7,7 @@
7
7
 
8
8
  #pragma once
9
9
 
10
+ #include <jsinspector-modern/tracing/TracingCategory.h>
10
11
  #include <react/timing/primitives.h>
11
12
 
12
13
  #include <folly/dynamic.h>
@@ -40,7 +41,7 @@ struct TraceEvent {
40
41
  * A comma separated list of categories for the event, configuring how
41
42
  * events are shown in the Trace Viewer UI.
42
43
  */
43
- std::string cat;
44
+ Categories cat;
44
45
 
45
46
  /**
46
47
  * The event type. This is a single character which changes depending on the
@@ -7,6 +7,7 @@
7
7
 
8
8
  #include "TraceEventSerializer.h"
9
9
  #include "Timing.h"
10
+ #include "TracingCategory.h"
10
11
 
11
12
  #include <react/timing/primitives.h>
12
13
 
@@ -22,7 +23,7 @@ namespace facebook::react::jsinspector_modern::tracing {
22
23
  result["id"] = buffer.data();
23
24
  }
24
25
  result["name"] = std::move(event.name);
25
- result["cat"] = std::move(event.cat);
26
+ result["cat"] = serializeTracingCategories(event.cat);
26
27
  result["ph"] = std::string(1, event.ph);
27
28
  result["ts"] = highResTimeStampToTracingClockTimeStamp(event.ts);
28
29
  result["pid"] = event.pid;
@@ -34,6 +34,9 @@ struct TraceRecordingState {
34
34
 
35
35
  // All captures Instance Tracing Profiles during this Trace Recording.
36
36
  std::vector<InstanceTracingProfile> instanceTracingProfiles{};
37
+
38
+ // The list of categories that are enabled for this recording.
39
+ std::set<tracing::Category> enabledCategories;
37
40
  };
38
41
 
39
42
  } // namespace facebook::react::jsinspector_modern::tracing
@@ -0,0 +1,126 @@
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 <folly/container/small_vector.h>
11
+
12
+ #include <optional>
13
+ #include <set>
14
+ #include <string>
15
+
16
+ namespace facebook::react::jsinspector_modern::tracing {
17
+
18
+ enum class Category {
19
+ HiddenTimeline, /* disabled-by-default-devtools.timeline */
20
+ JavaScriptSampling, /* disabled-by-default-v8.cpu_profiler */
21
+ RuntimeExecution, /* v8.execute */
22
+ Timeline, /* devtools.timeline */
23
+ UserTiming, /* blink.user_timing */
24
+ };
25
+
26
+ inline std::string tracingCategoryToString(const Category &category)
27
+ {
28
+ switch (category) {
29
+ case Category::Timeline:
30
+ return "devtools.timeline";
31
+ case Category::HiddenTimeline:
32
+ return "disabled-by-default-devtools.timeline";
33
+ case Category::UserTiming:
34
+ return "blink.user_timing";
35
+ case Category::JavaScriptSampling:
36
+ return "disabled-by-default-v8.cpu_profiler";
37
+ case Category::RuntimeExecution:
38
+ return "v8.execute";
39
+ }
40
+ }
41
+
42
+ inline std::optional<Category> getTracingCategoryFromString(const std::string &str)
43
+ {
44
+ if (str == "blink.user_timing") {
45
+ return Category::UserTiming;
46
+ } else if (str == "devtools.timeline") {
47
+ return Category::Timeline;
48
+ } else if (str == "disabled-by-default-devtools.timeline") {
49
+ return Category::HiddenTimeline;
50
+ } else if (str == "disabled-by-default-v8.cpu_profiler") {
51
+ return Category::JavaScriptSampling;
52
+ } else if (str == "v8.execute") {
53
+ return Category::RuntimeExecution;
54
+ } else {
55
+ return std::nullopt;
56
+ }
57
+ }
58
+
59
+ /**
60
+ * The Trace Event could have multiple categories, but this is extremely rare case.
61
+ */
62
+ using Categories = folly::small_vector<Category, 1>;
63
+
64
+ // { Timeline, UserTiming } => "devtools.timeline,blink.user_timing"
65
+ inline std::string serializeTracingCategories(const Categories &categories)
66
+ {
67
+ if (categories.size() == 1) {
68
+ return tracingCategoryToString(categories.front());
69
+ }
70
+
71
+ std::string serializedValue;
72
+ for (size_t i = 0; i < categories.size(); ++i) {
73
+ serializedValue += tracingCategoryToString(categories[i]);
74
+ if (i < categories.size() - 1) {
75
+ serializedValue += ",";
76
+ }
77
+ }
78
+ return serializedValue;
79
+ }
80
+
81
+ // { Timeline, UserTiming } => "devtools.timeline,blink.user_timing"
82
+ inline std::string serializeTracingCategories(const std::set<Category> &categories)
83
+ {
84
+ std::string serializedValue;
85
+
86
+ auto current = categories.begin();
87
+ while (current != categories.end()) {
88
+ serializedValue += tracingCategoryToString(*current);
89
+
90
+ ++current;
91
+ if (current != categories.end()) {
92
+ serializedValue += ",";
93
+ }
94
+ }
95
+
96
+ return serializedValue;
97
+ }
98
+
99
+ // "devtools.timeline,blink.user_timing" => { Timeline, UserTiming }
100
+ inline std::set<Category> parseSerializedTracingCategories(const std::string &serializedCategories)
101
+ {
102
+ std::set<Category> categories;
103
+ if (serializedCategories.empty()) {
104
+ return categories;
105
+ }
106
+
107
+ size_t start = 0;
108
+ size_t end = serializedCategories.find(',');
109
+ while (end != std::string::npos) {
110
+ std::string token = serializedCategories.substr(start, end - start);
111
+ if (auto category = getTracingCategoryFromString(token)) {
112
+ categories.insert(*category);
113
+ }
114
+ start = end + 1;
115
+ end = serializedCategories.find(',', start);
116
+ }
117
+
118
+ std::string lastToken = serializedCategories.substr(start);
119
+ if (auto category = getTracingCategoryFromString(lastToken)) {
120
+ categories.insert(*category);
121
+ }
122
+
123
+ return categories;
124
+ }
125
+
126
+ } // namespace facebook::react::jsinspector_modern::tracing
@@ -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<<a2224b72c2e27abf6a158aa1b4fe9ed0>>
7
+ * @generated SignedSource<<1a4d03b0d58e389dc9e9af0adf7afa9f>>
8
8
  */
9
9
 
10
10
  /**
@@ -50,6 +50,10 @@ bool ReactNativeFeatureFlags::disableFabricCommitInCXXAnimated() {
50
50
  return getAccessor().disableFabricCommitInCXXAnimated();
51
51
  }
52
52
 
53
+ bool ReactNativeFeatureFlags::disableImageViewPreallocationAndroid() {
54
+ return getAccessor().disableImageViewPreallocationAndroid();
55
+ }
56
+
53
57
  bool ReactNativeFeatureFlags::disableMountItemReorderingAndroid() {
54
58
  return getAccessor().disableMountItemReorderingAndroid();
55
59
  }
@@ -66,6 +70,10 @@ bool ReactNativeFeatureFlags::disableTextLayoutManagerCacheAndroid() {
66
70
  return getAccessor().disableTextLayoutManagerCacheAndroid();
67
71
  }
68
72
 
73
+ bool ReactNativeFeatureFlags::disableViewPreallocationAndroid() {
74
+ return getAccessor().disableViewPreallocationAndroid();
75
+ }
76
+
69
77
  bool ReactNativeFeatureFlags::enableAccessibilityOrder() {
70
78
  return getAccessor().enableAccessibilityOrder();
71
79
  }
@@ -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<<467f48f2231ceb6772a9a9da9e3badb9>>
7
+ * @generated SignedSource<<62480a82004544f8365f4f0957eb7319>>
8
8
  */
9
9
 
10
10
  /**
@@ -69,6 +69,11 @@ class ReactNativeFeatureFlags {
69
69
  */
70
70
  RN_EXPORT static bool disableFabricCommitInCXXAnimated();
71
71
 
72
+ /**
73
+ * Force disable view preallocation for images triggered from createNode off the main thread on Android
74
+ */
75
+ RN_EXPORT static bool disableImageViewPreallocationAndroid();
76
+
72
77
  /**
73
78
  * Prevent FabricMountingManager from reordering mountItems, which may lead to invalid state on the UI thread
74
79
  */
@@ -89,6 +94,11 @@ class ReactNativeFeatureFlags {
89
94
  */
90
95
  RN_EXPORT static bool disableTextLayoutManagerCacheAndroid();
91
96
 
97
+ /**
98
+ * Force disable view preallocation triggered from createNode off the main thread on Android
99
+ */
100
+ RN_EXPORT static bool disableViewPreallocationAndroid();
101
+
92
102
  /**
93
103
  * When enabled, the accessibilityOrder prop will propagate to native platforms and define the accessibility order.
94
104
  */