react-native 0.84.0-nightly-20251106-de5141a3d → 0.84.0-nightly-20251107-f8198f662

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 (129) hide show
  1. package/Libraries/Animated/createAnimatedComponent.js +1 -0
  2. package/Libraries/Blob/RCTBlobManager.mm +1 -4
  3. package/Libraries/Blob/RCTFileReaderModule.mm +1 -4
  4. package/Libraries/Components/Button.js +0 -3
  5. package/Libraries/Core/ReactNativeVersion.js +1 -1
  6. package/Libraries/Image/RCTBundleAssetImageLoader.mm +1 -4
  7. package/Libraries/Image/RCTGIFImageDecoder.mm +1 -4
  8. package/Libraries/Image/RCTImageEditingManager.mm +1 -4
  9. package/Libraries/Image/RCTImageLoader.mm +1 -4
  10. package/Libraries/Image/RCTImageStoreManager.mm +1 -4
  11. package/Libraries/Image/RCTImageViewManager.mm +1 -4
  12. package/Libraries/Image/RCTLocalAssetImageLoader.mm +1 -4
  13. package/Libraries/LinkingIOS/RCTLinkingManager.mm +1 -4
  14. package/Libraries/NativeAnimation/RCTNativeAnimatedModule.mm +1 -4
  15. package/Libraries/NativeAnimation/RCTNativeAnimatedTurboModule.mm +1 -4
  16. package/Libraries/Network/RCTDataRequestHandler.mm +1 -4
  17. package/Libraries/Network/RCTFileRequestHandler.mm +1 -4
  18. package/Libraries/Network/RCTHTTPRequestHandler.mm +1 -4
  19. package/Libraries/Network/RCTNetworking.mm +1 -4
  20. package/Libraries/PushNotificationIOS/RCTPushNotificationManager.mm +1 -4
  21. package/Libraries/Settings/RCTSettingsManager.mm +1 -4
  22. package/Libraries/StyleSheet/PlatformColorValueTypes.android.js +2 -2
  23. package/Libraries/StyleSheet/PlatformColorValueTypes.ios.js +1 -1
  24. package/Libraries/StyleSheet/PlatformColorValueTypes.js.flow +4 -2
  25. package/Libraries/Text/BaseText/RCTBaseTextViewManager.mm +1 -4
  26. package/Libraries/Text/RawText/RCTRawTextViewManager.mm +1 -4
  27. package/Libraries/Text/Text/RCTTextViewManager.mm +1 -4
  28. package/Libraries/Text/TextInput/Multiline/RCTMultilineTextInputViewManager.mm +1 -4
  29. package/Libraries/Text/TextInput/RCTBaseTextInputViewManager.mm +1 -4
  30. package/Libraries/Text/TextInput/RCTInputAccessoryViewManager.mm +1 -4
  31. package/Libraries/Text/TextInput/Singleline/RCTSinglelineTextInputViewManager.mm +1 -4
  32. package/Libraries/Text/VirtualText/RCTVirtualTextViewManager.mm +1 -4
  33. package/Libraries/Vibration/RCTVibration.mm +1 -4
  34. package/React/Base/RCTVersion.m +1 -1
  35. package/React/CoreModules/RCTAccessibilityManager.mm +1 -4
  36. package/React/CoreModules/RCTActionSheetManager.mm +1 -4
  37. package/React/CoreModules/RCTAlertManager.mm +1 -4
  38. package/React/CoreModules/RCTAppState.mm +1 -4
  39. package/React/CoreModules/RCTAppearance.mm +1 -4
  40. package/React/CoreModules/RCTClipboard.mm +1 -4
  41. package/React/CoreModules/RCTDevLoadingView.mm +1 -4
  42. package/React/CoreModules/RCTDevMenu.mm +1 -4
  43. package/React/CoreModules/RCTDevSettings.mm +1 -4
  44. package/React/CoreModules/RCTDevToolsRuntimeSettingsModule.mm +1 -5
  45. package/React/CoreModules/RCTDeviceInfo.mm +1 -4
  46. package/React/CoreModules/RCTEventDispatcher.mm +1 -4
  47. package/React/CoreModules/RCTExceptionsManager.mm +1 -4
  48. package/React/CoreModules/RCTI18nManager.mm +1 -4
  49. package/React/CoreModules/RCTKeyboardObserver.mm +1 -4
  50. package/React/CoreModules/RCTLogBox.mm +1 -4
  51. package/React/CoreModules/RCTPerfMonitor.mm +1 -4
  52. package/React/CoreModules/RCTPlatform.mm +1 -4
  53. package/React/CoreModules/RCTRedBox.mm +1 -4
  54. package/React/CoreModules/RCTSourceCode.mm +1 -4
  55. package/React/CoreModules/RCTStatusBarManager.mm +1 -4
  56. package/React/CoreModules/RCTTiming.mm +1 -4
  57. package/React/CoreModules/RCTWebSocketModule.mm +1 -4
  58. package/React/Modules/RCTUIManager.mm +1 -4
  59. package/React/Views/RCTActivityIndicatorViewManager.m +1 -4
  60. package/React/Views/RCTDebuggingOverlayManager.m +1 -4
  61. package/React/Views/RCTModalHostViewManager.m +1 -4
  62. package/React/Views/RCTModalManager.m +1 -4
  63. package/React/Views/RCTSwitchManager.m +1 -4
  64. package/React/Views/RCTViewManager.m +1 -4
  65. package/React/Views/RefreshControl/RCTRefreshControlManager.m +1 -4
  66. package/React/Views/SafeAreaView/RCTSafeAreaViewManager.m +1 -4
  67. package/React/Views/ScrollView/RCTScrollContentViewManager.m +1 -4
  68. package/React/Views/ScrollView/RCTScrollViewManager.m +1 -4
  69. package/ReactAndroid/api/ReactAndroid.api +0 -13
  70. package/ReactAndroid/gradle.properties +1 -1
  71. package/ReactAndroid/src/main/java/com/facebook/react/ReactPackageTurboModuleManagerDelegate.kt +2 -3
  72. package/ReactAndroid/src/main/java/com/facebook/react/bridge/CatalystInstanceImpl.java +2 -6
  73. package/ReactAndroid/src/main/java/com/facebook/react/bridge/ModuleHolder.kt +2 -2
  74. package/ReactAndroid/src/main/java/com/facebook/react/bridge/NativeModuleRegistry.kt +1 -16
  75. package/ReactAndroid/src/main/java/com/facebook/react/internal/turbomodule/core/TurboModuleManager.kt +2 -35
  76. package/ReactAndroid/src/main/java/com/facebook/react/modules/systeminfo/ReactNativeVersion.kt +1 -1
  77. package/ReactAndroid/src/main/java/com/facebook/react/views/scroll/VirtualViewContainerStateExperimental.kt +7 -0
  78. package/ReactAndroid/src/main/jni/react/jni/CatalystInstanceImpl.cpp +3 -13
  79. package/ReactAndroid/src/main/jni/react/jni/CatalystInstanceImpl.h +1 -4
  80. package/ReactAndroid/src/main/jni/react/jni/CxxModuleWrapperBase.h +0 -24
  81. package/ReactAndroid/src/main/jni/react/jni/JavaModuleWrapper.cpp +0 -1
  82. package/ReactAndroid/src/main/jni/react/jni/ModuleRegistryBuilder.cpp +1 -29
  83. package/ReactAndroid/src/main/jni/react/jni/ModuleRegistryBuilder.h +1 -2
  84. package/ReactAndroid/src/main/jni/react/jni/OnLoad.cpp +0 -2
  85. package/ReactAndroid/src/main/jni/react/runtime/jni/JReactInstance.cpp +2 -1
  86. package/ReactAndroid/src/main/jni/react/turbomodule/ReactCommon/TurboModuleManager.cpp +1 -35
  87. package/ReactCommon/cxxreact/ReactMarker.cpp +0 -1
  88. package/ReactCommon/cxxreact/ReactNativeVersion.h +1 -1
  89. package/ReactCommon/jsiexecutor/CMakeLists.txt +3 -1
  90. package/ReactCommon/jsiexecutor/React-jsiexecutor.podspec +2 -0
  91. package/ReactCommon/jsiexecutor/jsireact/JSIExecutor.cpp +0 -40
  92. package/ReactCommon/jsiexecutor/jsireact/JSIExecutor.h +1 -6
  93. package/ReactCommon/jsinspector-modern/ConsoleTask.cpp +27 -0
  94. package/ReactCommon/jsinspector-modern/ConsoleTask.h +38 -0
  95. package/ReactCommon/jsinspector-modern/ConsoleTaskContext.cpp +46 -0
  96. package/ReactCommon/jsinspector-modern/ConsoleTaskContext.h +102 -0
  97. package/ReactCommon/jsinspector-modern/ConsoleTaskOrchestrator.cpp +55 -0
  98. package/ReactCommon/jsinspector-modern/ConsoleTaskOrchestrator.h +48 -0
  99. package/ReactCommon/jsinspector-modern/RuntimeAgent.h +1 -1
  100. package/ReactCommon/jsinspector-modern/RuntimeTarget.cpp +12 -0
  101. package/ReactCommon/jsinspector-modern/RuntimeTarget.h +16 -13
  102. package/ReactCommon/jsinspector-modern/RuntimeTargetConsole.cpp +106 -1
  103. package/ReactCommon/jsinspector-modern/tests/ConsoleCreateTaskTest.cpp +131 -0
  104. package/ReactCommon/jsinspector-modern/tests/ReactInstanceIntegrationTest.cpp +1 -0
  105. package/ReactCommon/jsinspector-modern/tracing/PerformanceTracer.cpp +13 -2
  106. package/ReactCommon/jsinspector-modern/tracing/PerformanceTracer.h +6 -2
  107. package/ReactCommon/jsinspector-modern/tracing/TargetTracingAgent.h +5 -0
  108. package/ReactCommon/jsitooling/react/runtime/JSRuntimeBindings.cpp +54 -0
  109. package/ReactCommon/jsitooling/react/runtime/JSRuntimeBindings.h +20 -0
  110. package/ReactCommon/react/nativemodule/samples/platform/ios/ReactCommon/RCTSampleTurboModule.mm +1 -4
  111. package/ReactCommon/react/performance/timeline/CMakeLists.txt +1 -0
  112. package/ReactCommon/react/performance/timeline/PerformanceEntryReporter.cpp +9 -1
  113. package/ReactCommon/react/performance/timeline/React-performancetimeline.podspec +1 -0
  114. package/ReactCommon/react/renderer/animated/NativeAnimatedNodesManager.cpp +21 -16
  115. package/ReactCommon/react/renderer/animated/NativeAnimatedNodesManagerProvider.cpp +9 -5
  116. package/ReactCommon/react/renderer/animationbackend/AnimationBackend.cpp +67 -32
  117. package/ReactCommon/react/renderer/animationbackend/AnimationBackend.h +14 -2
  118. package/ReactCommon/react/renderer/core/EventDispatcher.cpp +1 -1
  119. package/ReactCommon/react/renderer/core/EventQueueProcessor.cpp +3 -3
  120. package/ReactCommon/react/runtime/ReactInstance.cpp +8 -6
  121. package/ReactCommon/react/runtime/ReactInstance.h +0 -1
  122. package/flow/bom.js.flow +7 -0
  123. package/package.json +8 -8
  124. package/scripts/ios-configure-glog.sh +6 -1
  125. package/types_generated/Libraries/Components/Button.d.ts +1 -4
  126. package/types_generated/Libraries/StyleSheet/PlatformColorValueTypes.d.ts +3 -3
  127. package/ReactAndroid/src/main/java/com/facebook/react/bridge/CxxModuleWrapper.kt +0 -25
  128. package/ReactAndroid/src/main/java/com/facebook/react/bridge/CxxModuleWrapperBase.kt +0 -61
  129. package/ReactAndroid/src/main/jni/react/jni/CxxModuleWrapper.h +0 -37
@@ -5,6 +5,10 @@
5
5
  * LICENSE file in the root directory of this source tree.
6
6
  */
7
7
 
8
+ #include "ConsoleTask.h"
9
+ #include "ConsoleTaskContext.h"
10
+ #include "ConsoleTaskOrchestrator.h"
11
+
8
12
  #include <jsinspector-modern/RuntimeTarget.h>
9
13
  #include <jsinspector-modern/tracing/PerformanceTracer.h>
10
14
 
@@ -477,8 +481,17 @@ void consoleTimeStamp(
477
481
  }
478
482
 
479
483
  if (performanceTracer.isTracing()) {
484
+ auto taskContext = ConsoleTaskOrchestrator::getInstance().top();
485
+
480
486
  performanceTracer.reportTimeStamp(
481
- label, start, end, trackName, trackGroup, color, std::move(detail));
487
+ label,
488
+ start,
489
+ end,
490
+ trackName,
491
+ trackGroup,
492
+ color,
493
+ std::move(detail),
494
+ taskContext ? taskContext->getSerializedStackTrace() : nullptr);
482
495
  }
483
496
 
484
497
  if (ReactPerfettoLogger::isTracing()) {
@@ -521,6 +534,71 @@ void installConsoleTimeStamp(
521
534
  })));
522
535
  }
523
536
 
537
+ /**
538
+ * run method of the task object returned from console.createTask().
539
+ */
540
+ jsi::Value consoleTaskRun(
541
+ jsi::Runtime& runtime,
542
+ const jsi::Value* args,
543
+ size_t count,
544
+ std::shared_ptr<ConsoleTaskContext> taskContext) {
545
+ if (count < 1 || !args[0].isObject()) {
546
+ throw JSError(runtime, "First argument must be a function");
547
+ }
548
+ auto fnObj = args[0].getObject(runtime);
549
+ if (!fnObj.isFunction(runtime)) {
550
+ throw JSError(runtime, "First argument must be a function");
551
+ }
552
+
553
+ ConsoleTask consoleTask{taskContext};
554
+
555
+ auto fn = fnObj.getFunction(runtime);
556
+ return fn.call(runtime);
557
+ }
558
+
559
+ /**
560
+ * console.createTask. Non-standardized.
561
+ * https://developer.chrome.com/docs/devtools/console/api#createtask
562
+ */
563
+ jsi::Value consoleCreateTask(
564
+ jsi::Runtime& runtime,
565
+ const jsi::Value* args,
566
+ size_t count,
567
+ RuntimeTargetDelegate& runtimeTargetDelegate,
568
+ bool enabled) {
569
+ if (count < 1 || !args[0].isString()) {
570
+ throw JSError(runtime, "First argument must be a non-empty string");
571
+ }
572
+ auto name = args[0].asString(runtime).utf8(runtime);
573
+ if (name.empty()) {
574
+ throw JSError(runtime, "First argument must be a non-empty string");
575
+ }
576
+
577
+ jsi::Object task{runtime};
578
+ std::shared_ptr<ConsoleTaskContext> taskContext = nullptr;
579
+ if (enabled) {
580
+ taskContext = std::make_shared<ConsoleTaskContext>(
581
+ runtime, runtimeTargetDelegate, name);
582
+ taskContext->schedule();
583
+ }
584
+
585
+ task.setProperty(
586
+ runtime,
587
+ "run",
588
+ jsi::Function::createFromHostFunction(
589
+ runtime,
590
+ jsi::PropNameID::forAscii(runtime, "run"),
591
+ 0,
592
+ [taskContext](
593
+ jsi::Runtime& runtime,
594
+ const jsi::Value& /*thisVal*/,
595
+ const jsi::Value* args,
596
+ size_t count) {
597
+ return consoleTaskRun(runtime, args, count, taskContext);
598
+ }));
599
+ return task;
600
+ }
601
+
524
602
  } // namespace
525
603
 
526
604
  void RuntimeTarget::installConsoleHandler() {
@@ -624,6 +702,33 @@ void RuntimeTarget::installConsoleHandler() {
624
702
  */
625
703
  installConsoleTimeStamp(runtime, originalConsole, console);
626
704
 
705
+ /**
706
+ * console.createTask
707
+ */
708
+ console.setProperty(
709
+ runtime,
710
+ "createTask",
711
+ jsi::Function::createFromHostFunction(
712
+ runtime,
713
+ jsi::PropNameID::forAscii(runtime, "createTask"),
714
+ 0,
715
+ [state, selfWeak](
716
+ jsi::Runtime& runtime,
717
+ const jsi::Value& /*thisVal*/,
718
+ const jsi::Value* args,
719
+ size_t count) {
720
+ jsi::Value task;
721
+ tryExecuteSync(selfWeak, [&](auto& self) {
722
+ task = consoleCreateTask(
723
+ runtime,
724
+ args,
725
+ count,
726
+ self.delegate_,
727
+ self.isConsoleCreateTaskEnabled());
728
+ });
729
+ return task;
730
+ }));
731
+
627
732
  // Install forwarding console methods.
628
733
  #define FORWARDING_CONSOLE_METHOD(name, type) \
629
734
  installConsoleMethod(#name, console_##name);
@@ -0,0 +1,131 @@
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 <folly/executors/QueuedImmediateExecutor.h>
9
+
10
+ #include "JsiIntegrationTest.h"
11
+ #include "engines/JsiIntegrationTestHermesEngineAdapter.h"
12
+
13
+ #include <jsinspector-modern/ConsoleTaskOrchestrator.h>
14
+
15
+ using namespace ::testing;
16
+
17
+ namespace facebook::react::jsinspector_modern {
18
+
19
+ /**
20
+ * A test fixture for the console.createTask API.
21
+ */
22
+ class ConsoleCreateTaskTest : public JsiIntegrationPortableTestBase<
23
+ JsiIntegrationTestHermesEngineAdapter,
24
+ folly::QueuedImmediateExecutor> {};
25
+
26
+ TEST_F(ConsoleCreateTaskTest, Installed) {
27
+ auto result = eval("typeof console.createTask");
28
+ auto& runtime = engineAdapter_->getRuntime();
29
+ EXPECT_EQ(result.asString(runtime).utf8(runtime), "function");
30
+ }
31
+
32
+ TEST_F(ConsoleCreateTaskTest, ReturnsTaskObject) {
33
+ auto result = eval("typeof console.createTask('test-task')");
34
+ auto& runtime = engineAdapter_->getRuntime();
35
+ EXPECT_EQ(result.asString(runtime).utf8(runtime), "object");
36
+ }
37
+
38
+ TEST_F(ConsoleCreateTaskTest, TaskObjectHasRunMethod) {
39
+ auto result = eval("typeof console.createTask('test-task').run");
40
+ auto& runtime = engineAdapter_->getRuntime();
41
+ EXPECT_EQ(result.asString(runtime).utf8(runtime), "function");
42
+ }
43
+
44
+ TEST_F(ConsoleCreateTaskTest, RunMethodExecutesFunction) {
45
+ auto result = eval(R"(
46
+ let executed = false;
47
+ const task = console.createTask('test-task');
48
+ task.run(() => { executed = true; });
49
+ executed;
50
+ )");
51
+ EXPECT_TRUE(result.getBool());
52
+ }
53
+
54
+ TEST_F(ConsoleCreateTaskTest, RunMethodReturnsValue) {
55
+ auto result = eval(R"(
56
+ const task = console.createTask('test-task');
57
+ task.run(() => 42);
58
+ )");
59
+ EXPECT_EQ(result.getNumber(), 42);
60
+ }
61
+
62
+ TEST_F(ConsoleCreateTaskTest, ThrowsOnNoArguments) {
63
+ EXPECT_THROW(eval("console.createTask()"), facebook::jsi::JSError);
64
+ }
65
+
66
+ TEST_F(ConsoleCreateTaskTest, ThrowsOnEmptyString) {
67
+ EXPECT_THROW(eval("console.createTask('')"), facebook::jsi::JSError);
68
+ }
69
+
70
+ TEST_F(ConsoleCreateTaskTest, ThrowsOnNonStringArgument) {
71
+ EXPECT_THROW(eval("console.createTask(123)"), facebook::jsi::JSError);
72
+ EXPECT_THROW(eval("console.createTask(null)"), facebook::jsi::JSError);
73
+ EXPECT_THROW(eval("console.createTask(undefined)"), facebook::jsi::JSError);
74
+ EXPECT_THROW(eval("console.createTask({})"), facebook::jsi::JSError);
75
+ }
76
+
77
+ TEST_F(ConsoleCreateTaskTest, RunMethodThrowsOnNoArguments) {
78
+ EXPECT_THROW(
79
+ eval(R"(
80
+ const task = console.createTask('test-task');
81
+ task.run();
82
+ )"),
83
+ facebook::jsi::JSError);
84
+ }
85
+
86
+ TEST_F(ConsoleCreateTaskTest, RunMethodThrowsOnNonFunction) {
87
+ EXPECT_THROW(
88
+ eval(R"(
89
+ const task = console.createTask('test-task');
90
+ task.run(123);
91
+ )"),
92
+ facebook::jsi::JSError);
93
+ EXPECT_THROW(
94
+ eval(R"(
95
+ const task = console.createTask('test-task');
96
+ task.run('not a function');
97
+ )"),
98
+ facebook::jsi::JSError);
99
+ EXPECT_THROW(
100
+ eval(R"(
101
+ const task = console.createTask('test-task');
102
+ task.run({});
103
+ )"),
104
+ facebook::jsi::JSError);
105
+ }
106
+
107
+ TEST_F(ConsoleCreateTaskTest, MultipleTasksCanBeCreated) {
108
+ auto result = eval(R"(
109
+ const task1 = console.createTask('task-1');
110
+ const task2 = console.createTask('task-2');
111
+ let count = 0;
112
+ task1.run(() => { count++; });
113
+ task2.run(() => { count++; });
114
+ count;
115
+ )");
116
+ EXPECT_EQ(result.getNumber(), 2);
117
+ }
118
+
119
+ TEST_F(ConsoleCreateTaskTest, TaskCanBeRunMultipleTimes) {
120
+ auto result = eval(R"(
121
+ const task = console.createTask('test-task');
122
+ let count = 0;
123
+ task.run(() => { count++; });
124
+ task.run(() => { count++; });
125
+ task.run(() => { count++; });
126
+ count;
127
+ )");
128
+ EXPECT_EQ(result.getNumber(), 3);
129
+ }
130
+
131
+ } // namespace facebook::react::jsinspector_modern
@@ -14,6 +14,7 @@
14
14
  #include <glog/logging.h>
15
15
  #include <jsinspector-modern/InspectorFlags.h>
16
16
  #include <react/featureflags/ReactNativeFeatureFlags.h>
17
+ #include <react/runtime/JSRuntimeBindings.h>
17
18
  #include <react/runtime/hermes/HermesInstance.h>
18
19
 
19
20
  using namespace ::testing;
@@ -187,7 +187,8 @@ void PerformanceTracer::reportMeasure(
187
187
  const std::string& name,
188
188
  HighResTimeStamp start,
189
189
  HighResDuration duration,
190
- folly::dynamic&& detail) {
190
+ folly::dynamic&& detail,
191
+ std::optional<folly::dynamic> stackTrace) {
191
192
  if (!tracingAtomic_) {
192
193
  return;
193
194
  }
@@ -204,6 +205,7 @@ void PerformanceTracer::reportMeasure(
204
205
  .duration = duration,
205
206
  .detail = std::move(detail),
206
207
  .threadId = getCurrentThreadId(),
208
+ .stackTrace = std::move(stackTrace),
207
209
  });
208
210
  }
209
211
 
@@ -214,7 +216,8 @@ void PerformanceTracer::reportTimeStamp(
214
216
  std::optional<std::string> trackName,
215
217
  std::optional<std::string> trackGroup,
216
218
  std::optional<ConsoleTimeStampColor> color,
217
- std::optional<folly::dynamic> detail) {
219
+ std::optional<folly::dynamic> detail,
220
+ std::optional<folly::dynamic> stackTrace) {
218
221
  if (!tracingAtomic_) {
219
222
  return;
220
223
  }
@@ -233,6 +236,7 @@ void PerformanceTracer::reportTimeStamp(
233
236
  .trackGroup = std::move(trackGroup),
234
237
  .color = std::move(color),
235
238
  .detail = std::move(detail),
239
+ .stackTrace = std::move(stackTrace),
236
240
  .threadId = getCurrentThreadId(),
237
241
  });
238
242
  }
@@ -606,6 +610,10 @@ void PerformanceTracer::enqueueTraceEventsFromPerformanceTracerEvent(
606
610
  beginEventArgs =
607
611
  folly::dynamic::object("detail", folly::toJson(event.detail));
608
612
  }
613
+ if (event.stackTrace) {
614
+ beginEventArgs["data"] = folly::dynamic::object(
615
+ "rnStackTrace", std::move(*event.stackTrace));
616
+ }
609
617
 
610
618
  auto eventId = ++performanceMeasureCount_;
611
619
 
@@ -695,6 +703,9 @@ void PerformanceTracer::enqueueTraceEventsFromPerformanceTracerEvent(
695
703
  }
696
704
  data["devtools"] = folly::toJson(devtoolsDetail);
697
705
  }
706
+ if (event.stackTrace) {
707
+ data["rnStackTrace"] = std::move(*event.stackTrace);
708
+ }
698
709
 
699
710
  events.emplace_back(
700
711
  TraceEvent{
@@ -81,7 +81,8 @@ class PerformanceTracer {
81
81
  const std::string &name,
82
82
  HighResTimeStamp start,
83
83
  HighResDuration duration,
84
- folly::dynamic &&detail = nullptr);
84
+ folly::dynamic &&detail = nullptr,
85
+ std::optional<folly::dynamic> stackTrace = nullptr);
85
86
 
86
87
  /**
87
88
  * Record a "TimeStamp" Trace Event - a labelled entry on Performance
@@ -97,7 +98,8 @@ class PerformanceTracer {
97
98
  std::optional<std::string> trackName = std::nullopt,
98
99
  std::optional<std::string> trackGroup = std::nullopt,
99
100
  std::optional<ConsoleTimeStampColor> color = std::nullopt,
100
- std::optional<folly::dynamic> detail = std::nullopt);
101
+ std::optional<folly::dynamic> detail = std::nullopt,
102
+ std::optional<folly::dynamic> stackTrace = std::nullopt);
101
103
 
102
104
  /**
103
105
  * Record an Event Loop tick, which will be represented as an Event Loop task
@@ -256,6 +258,7 @@ class PerformanceTracer {
256
258
  HighResDuration duration;
257
259
  folly::dynamic detail;
258
260
  ThreadId threadId;
261
+ std::optional<folly::dynamic> stackTrace;
259
262
  HighResTimeStamp createdAt = HighResTimeStamp::now();
260
263
  };
261
264
 
@@ -267,6 +270,7 @@ class PerformanceTracer {
267
270
  std::optional<std::string> trackGroup;
268
271
  std::optional<ConsoleTimeStampColor> color;
269
272
  std::optional<folly::dynamic> detail;
273
+ std::optional<folly::dynamic> stackTrace;
270
274
  ThreadId threadId;
271
275
  HighResTimeStamp createdAt = HighResTimeStamp::now();
272
276
  };
@@ -27,6 +27,11 @@ class TargetTracingAgent {
27
27
  (void)state_;
28
28
  }
29
29
 
30
+ bool isRunningInBackgroundMode()
31
+ {
32
+ return state_.mode == tracing::Mode::Background;
33
+ }
34
+
30
35
  protected:
31
36
  TraceRecordingState &state_;
32
37
  };
@@ -0,0 +1,54 @@
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 "JSRuntimeBindings.h"
9
+
10
+ #include <react/timing/primitives.h>
11
+
12
+ namespace facebook::react {
13
+
14
+ void bindNativeLogger(jsi::Runtime& runtime, Logger logger) {
15
+ runtime.global().setProperty(
16
+ runtime,
17
+ "nativeLoggingHook",
18
+ jsi::Function::createFromHostFunction(
19
+ runtime,
20
+ jsi::PropNameID::forAscii(runtime, "nativeLoggingHook"),
21
+ 2,
22
+ [logger = std::move(logger)](
23
+ jsi::Runtime& runtime,
24
+ const jsi::Value& /* this */,
25
+ const jsi::Value* args,
26
+ size_t count) {
27
+ if (count != 2) {
28
+ throw std::invalid_argument(
29
+ "nativeLoggingHook takes 2 arguments");
30
+ }
31
+ logger(
32
+ args[0].asString(runtime).utf8(runtime),
33
+ static_cast<unsigned int>(args[1].asNumber()));
34
+ return jsi::Value::undefined();
35
+ }));
36
+ }
37
+
38
+ void bindNativePerformanceNow(jsi::Runtime& runtime) {
39
+ runtime.global().setProperty(
40
+ runtime,
41
+ "nativePerformanceNow",
42
+ jsi::Function::createFromHostFunction(
43
+ runtime,
44
+ jsi::PropNameID::forAscii(runtime, "nativePerformanceNow"),
45
+ 0,
46
+ [](jsi::Runtime& /* runtime */,
47
+ const jsi::Value& /* this */,
48
+ const jsi::Value* /* args */,
49
+ size_t /*count*/) {
50
+ return HighResTimeStamp::now().toDOMHighResTimeStamp();
51
+ }));
52
+ }
53
+
54
+ } // namespace facebook::react
@@ -0,0 +1,20 @@
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 <jsi/jsi.h>
11
+ #include <string>
12
+
13
+ namespace facebook::react {
14
+
15
+ using Logger = std::function<void(const std::string &message, unsigned int logLevel)>;
16
+ void bindNativeLogger(jsi::Runtime &runtime, Logger logger);
17
+
18
+ void bindNativePerformanceNow(jsi::Runtime &runtime);
19
+
20
+ } // namespace facebook::react
@@ -24,10 +24,7 @@ using namespace facebook::react;
24
24
  }
25
25
 
26
26
  // Backward-compatible export
27
- + (NSString *)moduleName
28
- {
29
- return @"SampleTurboModule";
30
- }
27
+ RCT_EXPORT_MODULE()
31
28
 
32
29
  // Backward-compatible queue configuration
33
30
  + (BOOL)requiresMainQueueSetup
@@ -16,6 +16,7 @@ target_compile_options(react_performance_timeline PRIVATE -Wpedantic)
16
16
 
17
17
  target_include_directories(react_performance_timeline PUBLIC ${REACT_COMMON_DIR})
18
18
  target_link_libraries(react_performance_timeline
19
+ jsinspector
19
20
  jsinspector_tracing
20
21
  reactperflogger
21
22
  react_featureflags
@@ -7,6 +7,7 @@
7
7
 
8
8
  #include "PerformanceEntryReporter.h"
9
9
 
10
+ #include <jsinspector-modern/ConsoleTaskOrchestrator.h>
10
11
  #include <jsinspector-modern/tracing/PerformanceTracer.h>
11
12
  #include <react/featureflags/ReactNativeFeatureFlags.h>
12
13
  #include <react/timing/primitives.h>
@@ -381,8 +382,15 @@ void PerformanceEntryReporter::traceMeasure(
381
382
  }
382
383
 
383
384
  if (performanceTracer.isTracing()) {
385
+ auto taskContext =
386
+ jsinspector_modern::ConsoleTaskOrchestrator::getInstance().top();
387
+
384
388
  performanceTracer.reportMeasure(
385
- entry.name, entry.startTime, entry.duration, std::move(detail));
389
+ entry.name,
390
+ entry.startTime,
391
+ entry.duration,
392
+ std::move(detail),
393
+ taskContext ? taskContext->getSerializedStackTrace() : nullptr);
386
394
  }
387
395
  }
388
396
  }
@@ -41,6 +41,7 @@ Pod::Spec.new do |s|
41
41
  resolve_use_frameworks(s, header_mappings_dir: "../../..", module_name: "React_performancetimeline")
42
42
 
43
43
  s.dependency "React-featureflags"
44
+ add_dependency(s, "React-jsinspector", :framework_name => 'jsinspector_modern')
44
45
  add_dependency(s, "React-jsinspectortracing", :framework_name => 'jsinspector_moderntracing')
45
46
  s.dependency "React-timing"
46
47
  s.dependency "React-perflogger"
@@ -519,6 +519,17 @@ NativeAnimatedNodesManager::ensureEventEmitterListener() noexcept {
519
519
  }
520
520
 
521
521
  void NativeAnimatedNodesManager::startRenderCallbackIfNeeded(bool isAsync) {
522
+ // This method can be called from either the UI thread or JavaScript thread.
523
+ // It ensures `startOnRenderCallback_` is called exactly once using atomic
524
+ // operations. We use std::atomic_bool rather than std::mutex to avoid
525
+ // potential deadlocks that could occur if we called external code while
526
+ // holding a mutex.
527
+ auto isRenderCallbackStarted = isRenderCallbackStarted_.exchange(true);
528
+ if (isRenderCallbackStarted) {
529
+ // onRender callback is already started.
530
+ return;
531
+ }
532
+
522
533
  if (ReactNativeFeatureFlags::useSharedAnimatedBackend()) {
523
534
  #ifdef RN_USE_ANIMATION_BACKEND
524
535
  if (auto animationBackend = animationBackend_.lock()) {
@@ -531,16 +542,6 @@ void NativeAnimatedNodesManager::startRenderCallbackIfNeeded(bool isAsync) {
531
542
 
532
543
  return;
533
544
  }
534
- // This method can be called from either the UI thread or JavaScript thread.
535
- // It ensures `startOnRenderCallback_` is called exactly once using atomic
536
- // operations. We use std::atomic_bool rather than std::mutex to avoid
537
- // potential deadlocks that could occur if we called external code while
538
- // holding a mutex.
539
- auto isRenderCallbackStarted = isRenderCallbackStarted_.exchange(true);
540
- if (isRenderCallbackStarted) {
541
- // onRender callback is already started.
542
- return;
543
- }
544
545
 
545
546
  if (startOnRenderCallback_) {
546
547
  startOnRenderCallback_([this]() { onRender(); }, isAsync);
@@ -549,18 +550,21 @@ void NativeAnimatedNodesManager::startRenderCallbackIfNeeded(bool isAsync) {
549
550
 
550
551
  void NativeAnimatedNodesManager::stopRenderCallbackIfNeeded(
551
552
  bool isAsync) noexcept {
552
- if (ReactNativeFeatureFlags::useSharedAnimatedBackend()) {
553
- if (auto animationBackend = animationBackend_.lock()) {
554
- animationBackend->stop(isAsync);
555
- }
556
- return;
557
- }
558
553
  // When multiple threads reach this point, only one thread should call
559
554
  // stopOnRenderCallback_. This synchronization is primarily needed during
560
555
  // destruction of NativeAnimatedNodesManager. In normal operation,
561
556
  // stopRenderCallbackIfNeeded is always called from the UI thread.
562
557
  auto isRenderCallbackStarted = isRenderCallbackStarted_.exchange(false);
563
558
 
559
+ if (ReactNativeFeatureFlags::useSharedAnimatedBackend()) {
560
+ if (isRenderCallbackStarted) {
561
+ if (auto animationBackend = animationBackend_.lock()) {
562
+ animationBackend->stop(isAsync);
563
+ }
564
+ }
565
+ return;
566
+ }
567
+
564
568
  if (isRenderCallbackStarted) {
565
569
  if (stopOnRenderCallback_) {
566
570
  stopOnRenderCallback_(isAsync);
@@ -988,6 +992,7 @@ AnimationMutations NativeAnimatedNodesManager::pullAnimationMutations() {
988
992
  AnimationMutation{tag, nullptr, propsBuilder.get()});
989
993
  containsChange = true;
990
994
  }
995
+ updateViewPropsDirect_.clear();
991
996
  }
992
997
 
993
998
  if (!containsChange) {
@@ -80,12 +80,16 @@ NativeAnimatedNodesManagerProvider::getOrCreate(
80
80
  std::move(directManipulationCallback),
81
81
  std::move(fabricCommitCallback),
82
82
  uiManager);
83
- #endif
84
83
 
85
84
  nativeAnimatedNodesManager_ =
86
85
  std::make_shared<NativeAnimatedNodesManager>(animationBackend_);
87
86
 
87
+ nativeAnimatedDelegate_ =
88
+ std::make_shared<UIManagerNativeAnimatedDelegateBackendImpl>(
89
+ animationBackend_);
90
+
88
91
  uiManager->unstable_setAnimationBackend(animationBackend_);
92
+ #endif
89
93
  } else {
90
94
  nativeAnimatedNodesManager_ =
91
95
  std::make_shared<NativeAnimatedNodesManager>(
@@ -93,6 +97,10 @@ NativeAnimatedNodesManagerProvider::getOrCreate(
93
97
  std::move(fabricCommitCallback),
94
98
  std::move(startOnRenderCallback_),
95
99
  std::move(stopOnRenderCallback_));
100
+
101
+ nativeAnimatedDelegate_ =
102
+ std::make_shared<UIManagerNativeAnimatedDelegateImpl>(
103
+ nativeAnimatedNodesManager_);
96
104
  }
97
105
 
98
106
  addEventEmitterListener(
@@ -117,10 +125,6 @@ NativeAnimatedNodesManagerProvider::getOrCreate(
117
125
  return false;
118
126
  }));
119
127
 
120
- nativeAnimatedDelegate_ =
121
- std::make_shared<UIManagerNativeAnimatedDelegateImpl>(
122
- nativeAnimatedNodesManager_);
123
-
124
128
  uiManager->setNativeAnimatedDelegate(nativeAnimatedDelegate_);
125
129
 
126
130
  // TODO: remove force casting.