react-native 0.84.0-nightly-20251106-de5141a3d → 0.84.0-nightly-20251108-7486a2bc5

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 (181) hide show
  1. package/Libraries/Animated/createAnimatedComponent.js +1 -0
  2. package/Libraries/Blob/RCTBlobManager.mm +1 -4
  3. package/Libraries/Blob/RCTBlobPlugins.mm +14 -14
  4. package/Libraries/Blob/RCTFileReaderModule.mm +1 -4
  5. package/Libraries/Components/Button.js +0 -3
  6. package/Libraries/Core/ReactNativeVersion.js +1 -1
  7. package/Libraries/Image/RCTBundleAssetImageLoader.mm +1 -4
  8. package/Libraries/Image/RCTGIFImageDecoder.mm +1 -4
  9. package/Libraries/Image/RCTImageEditingManager.mm +1 -4
  10. package/Libraries/Image/RCTImageLoader.mm +1 -4
  11. package/Libraries/Image/RCTImagePlugins.h +1 -0
  12. package/Libraries/Image/RCTImagePlugins.mm +30 -17
  13. package/Libraries/Image/RCTImageStoreManager.mm +1 -4
  14. package/Libraries/Image/RCTImageViewManager.mm +1 -4
  15. package/Libraries/Image/RCTLocalAssetImageLoader.mm +1 -4
  16. package/Libraries/LinkingIOS/RCTLinkingManager.mm +1 -4
  17. package/Libraries/LinkingIOS/RCTLinkingPlugins.mm +10 -13
  18. package/Libraries/LogBox/Data/LogBoxData.js +31 -4
  19. package/Libraries/NativeAnimation/RCTAnimationPlugins.mm +14 -14
  20. package/Libraries/NativeAnimation/RCTNativeAnimatedModule.mm +1 -4
  21. package/Libraries/NativeAnimation/RCTNativeAnimatedTurboModule.mm +1 -4
  22. package/Libraries/Network/RCTDataRequestHandler.mm +1 -4
  23. package/Libraries/Network/RCTFileRequestHandler.mm +1 -4
  24. package/Libraries/Network/RCTHTTPRequestHandler.mm +1 -4
  25. package/Libraries/Network/RCTNetworkPlugins.mm +22 -16
  26. package/Libraries/Network/RCTNetworking.mm +1 -4
  27. package/Libraries/PushNotificationIOS/RCTPushNotificationManager.mm +1 -4
  28. package/Libraries/PushNotificationIOS/RCTPushNotificationPlugins.mm +10 -13
  29. package/Libraries/Settings/RCTSettingsManager.mm +1 -4
  30. package/Libraries/Settings/RCTSettingsPlugins.mm +10 -13
  31. package/Libraries/StyleSheet/PlatformColorValueTypes.android.js +2 -2
  32. package/Libraries/StyleSheet/PlatformColorValueTypes.ios.js +1 -1
  33. package/Libraries/StyleSheet/PlatformColorValueTypes.js.flow +4 -2
  34. package/Libraries/Text/BaseText/RCTBaseTextViewManager.mm +1 -4
  35. package/Libraries/Text/RawText/RCTRawTextViewManager.mm +1 -4
  36. package/Libraries/Text/Text/RCTTextViewManager.mm +1 -4
  37. package/Libraries/Text/TextInput/Multiline/RCTMultilineTextInputViewManager.mm +1 -4
  38. package/Libraries/Text/TextInput/RCTBaseTextInputViewManager.mm +1 -4
  39. package/Libraries/Text/TextInput/RCTInputAccessoryViewManager.mm +1 -4
  40. package/Libraries/Text/TextInput/Singleline/RCTSinglelineTextInputViewManager.mm +1 -4
  41. package/Libraries/Text/VirtualText/RCTVirtualTextViewManager.mm +1 -4
  42. package/Libraries/Vibration/RCTVibration.mm +1 -4
  43. package/Libraries/Vibration/RCTVibrationPlugins.mm +10 -13
  44. package/React/Base/RCTVersion.m +1 -1
  45. package/React/CoreModules/CoreModulesPlugins.mm +98 -35
  46. package/React/CoreModules/RCTAccessibilityManager.mm +1 -4
  47. package/React/CoreModules/RCTActionSheetManager.mm +1 -4
  48. package/React/CoreModules/RCTAlertManager.mm +1 -4
  49. package/React/CoreModules/RCTAppState.mm +1 -4
  50. package/React/CoreModules/RCTAppearance.mm +1 -4
  51. package/React/CoreModules/RCTClipboard.mm +1 -4
  52. package/React/CoreModules/RCTDevLoadingView.mm +1 -4
  53. package/React/CoreModules/RCTDevMenu.mm +1 -4
  54. package/React/CoreModules/RCTDevSettings.mm +1 -4
  55. package/React/CoreModules/RCTDevToolsRuntimeSettingsModule.mm +1 -5
  56. package/React/CoreModules/RCTDeviceInfo.mm +1 -4
  57. package/React/CoreModules/RCTEventDispatcher.mm +1 -4
  58. package/React/CoreModules/RCTExceptionsManager.mm +1 -4
  59. package/React/CoreModules/RCTI18nManager.mm +1 -4
  60. package/React/CoreModules/RCTKeyboardObserver.mm +1 -4
  61. package/React/CoreModules/RCTLogBox.mm +1 -4
  62. package/React/CoreModules/RCTPerfMonitor.mm +1 -4
  63. package/React/CoreModules/RCTPlatform.mm +1 -4
  64. package/React/CoreModules/RCTRedBox.mm +1 -4
  65. package/React/CoreModules/RCTSourceCode.mm +1 -4
  66. package/React/CoreModules/RCTStatusBarManager.mm +1 -4
  67. package/React/CoreModules/RCTTiming.mm +1 -4
  68. package/React/CoreModules/RCTWebSocketModule.mm +1 -4
  69. package/React/FBReactNativeSpec/FBReactNativeSpecJSI.h +16 -0
  70. package/React/Modules/RCTUIManager.mm +1 -4
  71. package/React/Views/RCTActivityIndicatorViewManager.m +1 -4
  72. package/React/Views/RCTDebuggingOverlayManager.m +1 -4
  73. package/React/Views/RCTModalHostViewManager.m +1 -4
  74. package/React/Views/RCTModalManager.m +1 -4
  75. package/React/Views/RCTSwitchManager.m +1 -4
  76. package/React/Views/RCTViewManager.m +1 -4
  77. package/React/Views/RefreshControl/RCTRefreshControlManager.m +1 -4
  78. package/React/Views/SafeAreaView/RCTSafeAreaViewManager.m +1 -4
  79. package/React/Views/ScrollView/RCTScrollContentViewManager.m +1 -4
  80. package/React/Views/ScrollView/RCTScrollViewManager.m +1 -4
  81. package/ReactAndroid/api/ReactAndroid.api +0 -13
  82. package/ReactAndroid/gradle.properties +1 -1
  83. package/ReactAndroid/src/main/java/com/facebook/react/ReactPackageTurboModuleManagerDelegate.kt +2 -3
  84. package/ReactAndroid/src/main/java/com/facebook/react/bridge/CatalystInstanceImpl.java +2 -6
  85. package/ReactAndroid/src/main/java/com/facebook/react/bridge/ModuleHolder.kt +2 -2
  86. package/ReactAndroid/src/main/java/com/facebook/react/bridge/NativeModuleRegistry.kt +1 -16
  87. package/ReactAndroid/src/main/java/com/facebook/react/fabric/FabricUIManager.java +1 -1
  88. package/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlags.kt +13 -1
  89. package/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsCxxAccessor.kt +21 -1
  90. package/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsCxxInterop.kt +5 -1
  91. package/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsDefaults.kt +5 -1
  92. package/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsLocalAccessor.kt +23 -1
  93. package/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsProvider.kt +5 -1
  94. package/ReactAndroid/src/main/java/com/facebook/react/internal/turbomodule/core/TurboModuleManager.kt +2 -35
  95. package/ReactAndroid/src/main/java/com/facebook/react/modules/systeminfo/ReactNativeVersion.kt +1 -1
  96. package/ReactAndroid/src/main/java/com/facebook/react/uimanager/BaseViewManager.java +4 -5
  97. package/ReactAndroid/src/main/java/com/facebook/react/views/scroll/VirtualViewContainerStateExperimental.kt +7 -0
  98. package/ReactAndroid/src/main/jni/react/fabric/FabricUIManagerBinding.cpp +12 -0
  99. package/ReactAndroid/src/main/jni/react/featureflags/JReactNativeFeatureFlagsCxxInterop.cpp +29 -1
  100. package/ReactAndroid/src/main/jni/react/featureflags/JReactNativeFeatureFlagsCxxInterop.h +7 -1
  101. package/ReactAndroid/src/main/jni/react/jni/CatalystInstanceImpl.cpp +3 -13
  102. package/ReactAndroid/src/main/jni/react/jni/CatalystInstanceImpl.h +1 -4
  103. package/ReactAndroid/src/main/jni/react/jni/CxxModuleWrapperBase.h +0 -24
  104. package/ReactAndroid/src/main/jni/react/jni/JavaModuleWrapper.cpp +0 -1
  105. package/ReactAndroid/src/main/jni/react/jni/ModuleRegistryBuilder.cpp +1 -29
  106. package/ReactAndroid/src/main/jni/react/jni/ModuleRegistryBuilder.h +1 -2
  107. package/ReactAndroid/src/main/jni/react/jni/OnLoad.cpp +0 -2
  108. package/ReactAndroid/src/main/jni/react/runtime/jni/JReactHostInspectorTarget.cpp +8 -1
  109. package/ReactAndroid/src/main/jni/react/runtime/jni/JReactInstance.cpp +2 -1
  110. package/ReactAndroid/src/main/jni/react/turbomodule/ReactCommon/TurboModuleManager.cpp +1 -35
  111. package/ReactAndroid/src/main/jni/third-party/folly/CMakeLists.txt +1 -0
  112. package/ReactApple/RCTAnimatedModuleProvider/RCTAnimatedModuleProvider.mm +29 -4
  113. package/ReactCommon/cxxreact/ReactMarker.cpp +0 -1
  114. package/ReactCommon/cxxreact/ReactNativeVersion.h +1 -1
  115. package/ReactCommon/jsiexecutor/CMakeLists.txt +3 -1
  116. package/ReactCommon/jsiexecutor/React-jsiexecutor.podspec +2 -0
  117. package/ReactCommon/jsiexecutor/jsireact/JSIExecutor.cpp +0 -40
  118. package/ReactCommon/jsiexecutor/jsireact/JSIExecutor.h +1 -6
  119. package/ReactCommon/jsinspector-modern/ConsoleTask.cpp +27 -0
  120. package/ReactCommon/jsinspector-modern/ConsoleTask.h +38 -0
  121. package/ReactCommon/jsinspector-modern/ConsoleTaskContext.cpp +46 -0
  122. package/ReactCommon/jsinspector-modern/ConsoleTaskContext.h +102 -0
  123. package/ReactCommon/jsinspector-modern/ConsoleTaskOrchestrator.cpp +55 -0
  124. package/ReactCommon/jsinspector-modern/ConsoleTaskOrchestrator.h +48 -0
  125. package/ReactCommon/jsinspector-modern/HostTarget.h +8 -2
  126. package/ReactCommon/jsinspector-modern/HostTargetTraceRecording.cpp +6 -2
  127. package/ReactCommon/jsinspector-modern/HostTargetTraceRecording.h +15 -5
  128. package/ReactCommon/jsinspector-modern/HostTargetTracing.cpp +9 -5
  129. package/ReactCommon/jsinspector-modern/RuntimeAgent.cpp +3 -2
  130. package/ReactCommon/jsinspector-modern/RuntimeAgent.h +1 -1
  131. package/ReactCommon/jsinspector-modern/RuntimeTarget.cpp +12 -0
  132. package/ReactCommon/jsinspector-modern/RuntimeTarget.h +16 -13
  133. package/ReactCommon/jsinspector-modern/RuntimeTargetConsole.cpp +106 -1
  134. package/ReactCommon/jsinspector-modern/TracingAgent.cpp +19 -2
  135. package/ReactCommon/jsinspector-modern/tests/ConsoleCreateTaskTest.cpp +131 -0
  136. package/ReactCommon/jsinspector-modern/tests/ReactInstanceIntegrationTest.cpp +1 -0
  137. package/ReactCommon/jsinspector-modern/tests/TracingTest.cpp +59 -0
  138. package/ReactCommon/jsinspector-modern/tests/TracingTest.h +20 -7
  139. package/ReactCommon/jsinspector-modern/tracing/PerformanceTracer.cpp +32 -20
  140. package/ReactCommon/jsinspector-modern/tracing/PerformanceTracer.h +6 -2
  141. package/ReactCommon/jsinspector-modern/tracing/TargetTracingAgent.h +5 -0
  142. package/ReactCommon/jsinspector-modern/tracing/TraceEvent.h +2 -1
  143. package/ReactCommon/jsinspector-modern/tracing/TraceEventSerializer.cpp +2 -1
  144. package/ReactCommon/jsinspector-modern/tracing/TraceRecordingState.h +3 -0
  145. package/ReactCommon/jsinspector-modern/tracing/TracingCategory.h +126 -0
  146. package/ReactCommon/jsitooling/react/runtime/JSRuntimeBindings.cpp +54 -0
  147. package/ReactCommon/jsitooling/react/runtime/JSRuntimeBindings.h +20 -0
  148. package/ReactCommon/react/featureflags/ReactNativeFeatureFlags.cpp +9 -1
  149. package/ReactCommon/react/featureflags/ReactNativeFeatureFlags.h +11 -1
  150. package/ReactCommon/react/featureflags/ReactNativeFeatureFlagsAccessor.cpp +113 -77
  151. package/ReactCommon/react/featureflags/ReactNativeFeatureFlagsAccessor.h +6 -2
  152. package/ReactCommon/react/featureflags/ReactNativeFeatureFlagsDefaults.h +9 -1
  153. package/ReactCommon/react/featureflags/ReactNativeFeatureFlagsDynamicProvider.h +19 -1
  154. package/ReactCommon/react/featureflags/ReactNativeFeatureFlagsProvider.h +3 -1
  155. package/ReactCommon/react/nativemodule/core/platform/ios/ReactCommon/RCTTurboModuleManager.mm +0 -1
  156. package/ReactCommon/react/nativemodule/featureflags/NativeReactNativeFeatureFlags.cpp +11 -1
  157. package/ReactCommon/react/nativemodule/featureflags/NativeReactNativeFeatureFlags.h +5 -1
  158. package/ReactCommon/react/nativemodule/samples/platform/ios/ReactCommon/RCTSampleTurboModule.mm +1 -4
  159. package/ReactCommon/react/performance/timeline/CMakeLists.txt +1 -0
  160. package/ReactCommon/react/performance/timeline/PerformanceEntryReporter.cpp +9 -1
  161. package/ReactCommon/react/performance/timeline/React-performancetimeline.podspec +1 -0
  162. package/ReactCommon/react/renderer/animated/NativeAnimatedNodesManager.cpp +24 -19
  163. package/ReactCommon/react/renderer/animated/NativeAnimatedNodesManagerProvider.cpp +11 -6
  164. package/ReactCommon/react/renderer/animationbackend/AnimationBackend.cpp +67 -32
  165. package/ReactCommon/react/renderer/animationbackend/AnimationBackend.h +14 -2
  166. package/ReactCommon/react/renderer/core/EventDispatcher.cpp +1 -1
  167. package/ReactCommon/react/renderer/core/EventQueueProcessor.cpp +3 -3
  168. package/ReactCommon/react/runtime/ReactInstance.cpp +8 -6
  169. package/ReactCommon/react/runtime/ReactInstance.h +0 -1
  170. package/ReactCommon/react/runtime/TimerManager.cpp +0 -54
  171. package/ReactCommon/react/runtime/TimerManager.h +0 -12
  172. package/flow/bom.js.flow +7 -0
  173. package/package.json +8 -8
  174. package/scripts/ios-configure-glog.sh +6 -1
  175. package/src/private/featureflags/ReactNativeFeatureFlags.js +11 -1
  176. package/src/private/featureflags/specs/NativeReactNativeFeatureFlags.js +3 -1
  177. package/types_generated/Libraries/Components/Button.d.ts +1 -4
  178. package/types_generated/Libraries/StyleSheet/PlatformColorValueTypes.d.ts +3 -3
  179. package/ReactAndroid/src/main/java/com/facebook/react/bridge/CxxModuleWrapper.kt +0 -25
  180. package/ReactAndroid/src/main/java/com/facebook/react/bridge/CxxModuleWrapperBase.kt +0 -61
  181. package/ReactAndroid/src/main/jni/react/jni/CxxModuleWrapper.h +0 -37
@@ -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;
@@ -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_,
@@ -187,7 +188,8 @@ void PerformanceTracer::reportMeasure(
187
188
  const std::string& name,
188
189
  HighResTimeStamp start,
189
190
  HighResDuration duration,
190
- folly::dynamic&& detail) {
191
+ folly::dynamic&& detail,
192
+ std::optional<folly::dynamic> stackTrace) {
191
193
  if (!tracingAtomic_) {
192
194
  return;
193
195
  }
@@ -204,6 +206,7 @@ void PerformanceTracer::reportMeasure(
204
206
  .duration = duration,
205
207
  .detail = std::move(detail),
206
208
  .threadId = getCurrentThreadId(),
209
+ .stackTrace = std::move(stackTrace),
207
210
  });
208
211
  }
209
212
 
@@ -214,7 +217,8 @@ void PerformanceTracer::reportTimeStamp(
214
217
  std::optional<std::string> trackName,
215
218
  std::optional<std::string> trackGroup,
216
219
  std::optional<ConsoleTimeStampColor> color,
217
- std::optional<folly::dynamic> detail) {
220
+ std::optional<folly::dynamic> detail,
221
+ std::optional<folly::dynamic> stackTrace) {
218
222
  if (!tracingAtomic_) {
219
223
  return;
220
224
  }
@@ -233,6 +237,7 @@ void PerformanceTracer::reportTimeStamp(
233
237
  .trackGroup = std::move(trackGroup),
234
238
  .color = std::move(color),
235
239
  .detail = std::move(detail),
240
+ .stackTrace = std::move(stackTrace),
236
241
  .threadId = getCurrentThreadId(),
237
242
  });
238
243
  }
@@ -405,7 +410,7 @@ void PerformanceTracer::reportFrameTiming(
405
410
  return TraceEvent{
406
411
  .id = profileId,
407
412
  .name = "Profile",
408
- .cat = "disabled-by-default-v8.cpu_profiler",
413
+ .cat = {Category::JavaScriptSampling},
409
414
  .ph = 'P',
410
415
  .ts = profileTimestamp,
411
416
  .pid = processId,
@@ -428,7 +433,7 @@ PerformanceTracer::constructRuntimeProfileChunkTraceEvent(
428
433
  return TraceEvent{
429
434
  .id = profileId,
430
435
  .name = "ProfileChunk",
431
- .cat = "disabled-by-default-v8.cpu_profiler",
436
+ .cat = {Category::JavaScriptSampling},
432
437
  .ph = 'P',
433
438
  .ts = chunkTimestamp,
434
439
  .pid = processId,
@@ -560,7 +565,7 @@ void PerformanceTracer::enqueueTraceEventsFromPerformanceTracerEvent(
560
565
  events.emplace_back(
561
566
  TraceEvent{
562
567
  .name = "RunTask",
563
- .cat = "disabled-by-default-devtools.timeline",
568
+ .cat = {Category::HiddenTimeline},
564
569
  .ph = 'X',
565
570
  .ts = event.start,
566
571
  .pid = processId_,
@@ -572,7 +577,7 @@ void PerformanceTracer::enqueueTraceEventsFromPerformanceTracerEvent(
572
577
  events.emplace_back(
573
578
  TraceEvent{
574
579
  .name = "RunMicrotasks",
575
- .cat = "v8.execute",
580
+ .cat = {Category::RuntimeExecution},
576
581
  .ph = 'X',
577
582
  .ts = event.start,
578
583
  .pid = processId_,
@@ -592,7 +597,7 @@ void PerformanceTracer::enqueueTraceEventsFromPerformanceTracerEvent(
592
597
  events.emplace_back(
593
598
  TraceEvent{
594
599
  .name = std::move(event.name),
595
- .cat = "blink.user_timing",
600
+ .cat = {Category::UserTiming},
596
601
  .ph = 'I',
597
602
  .ts = event.start,
598
603
  .pid = processId_,
@@ -606,6 +611,10 @@ void PerformanceTracer::enqueueTraceEventsFromPerformanceTracerEvent(
606
611
  beginEventArgs =
607
612
  folly::dynamic::object("detail", folly::toJson(event.detail));
608
613
  }
614
+ if (event.stackTrace) {
615
+ beginEventArgs["data"] = folly::dynamic::object(
616
+ "rnStackTrace", std::move(*event.stackTrace));
617
+ }
609
618
 
610
619
  auto eventId = ++performanceMeasureCount_;
611
620
 
@@ -613,7 +622,7 @@ void PerformanceTracer::enqueueTraceEventsFromPerformanceTracerEvent(
613
622
  TraceEvent{
614
623
  .id = eventId,
615
624
  .name = event.name,
616
- .cat = "blink.user_timing",
625
+ .cat = {Category::UserTiming},
617
626
  .ph = 'b',
618
627
  .ts = event.start,
619
628
  .pid = processId_,
@@ -624,7 +633,7 @@ void PerformanceTracer::enqueueTraceEventsFromPerformanceTracerEvent(
624
633
  TraceEvent{
625
634
  .id = eventId,
626
635
  .name = std::move(event.name),
627
- .cat = "blink.user_timing",
636
+ .cat = {Category::UserTiming},
628
637
  .ph = 'e',
629
638
  .ts = event.start + event.duration,
630
639
  .pid = processId_,
@@ -664,7 +673,7 @@ void PerformanceTracer::enqueueTraceEventsFromPerformanceTracerEvent(
664
673
  events.emplace_back(
665
674
  TraceEvent{
666
675
  .name = "TimeStamp",
667
- .cat = "devtools.timeline",
676
+ .cat = {Category::Timeline},
668
677
  .ph = 'I',
669
678
  .ts = event.createdAt,
670
679
  .pid = processId_,
@@ -695,11 +704,14 @@ void PerformanceTracer::enqueueTraceEventsFromPerformanceTracerEvent(
695
704
  }
696
705
  data["devtools"] = folly::toJson(devtoolsDetail);
697
706
  }
707
+ if (event.stackTrace) {
708
+ data["rnStackTrace"] = std::move(*event.stackTrace);
709
+ }
698
710
 
699
711
  events.emplace_back(
700
712
  TraceEvent{
701
713
  .name = "TimeStamp",
702
- .cat = "devtools.timeline",
714
+ .cat = {Category::Timeline},
703
715
  .ph = 'I',
704
716
  .ts = event.createdAt,
705
717
  .pid = processId_,
@@ -719,7 +731,7 @@ void PerformanceTracer::enqueueTraceEventsFromPerformanceTracerEvent(
719
731
  events.emplace_back(
720
732
  TraceEvent{
721
733
  .name = "ResourceSendRequest",
722
- .cat = "devtools.timeline",
734
+ .cat = {Category::Timeline},
723
735
  .ph = 'I',
724
736
  .ts = event.start,
725
737
  .pid = processId_,
@@ -745,7 +757,7 @@ void PerformanceTracer::enqueueTraceEventsFromPerformanceTracerEvent(
745
757
  events.emplace_back(
746
758
  TraceEvent{
747
759
  .name = "ResourceReceiveResponse",
748
- .cat = "devtools.timeline",
760
+ .cat = {Category::Timeline},
749
761
  .ph = 'I',
750
762
  .ts = event.start,
751
763
  .pid = processId_,
@@ -763,7 +775,7 @@ void PerformanceTracer::enqueueTraceEventsFromPerformanceTracerEvent(
763
775
  events.emplace_back(
764
776
  TraceEvent{
765
777
  .name = "ResourceFinish",
766
- .cat = "devtools.timeline",
778
+ .cat = {Category::Timeline},
767
779
  .ph = 'I',
768
780
  .ts = event.start,
769
781
  .pid = processId_,
@@ -779,7 +791,7 @@ void PerformanceTracer::enqueueTraceEventsFromPerformanceTracerEvent(
779
791
  events.emplace_back(
780
792
  TraceEvent{
781
793
  .name = "SetLayerTreeId",
782
- .cat = "devtools.timeline",
794
+ .cat = {Category::Timeline},
783
795
  .ph = 'I',
784
796
  .ts = event.start,
785
797
  .pid = processId_,
@@ -795,7 +807,7 @@ void PerformanceTracer::enqueueTraceEventsFromPerformanceTracerEvent(
795
807
  events.emplace_back(
796
808
  TraceEvent{
797
809
  .name = "BeginFrame",
798
- .cat = "devtools.timeline",
810
+ .cat = {Category::Timeline},
799
811
  .ph = 'I',
800
812
  .ts = event.start,
801
813
  .pid = processId_,
@@ -811,7 +823,7 @@ void PerformanceTracer::enqueueTraceEventsFromPerformanceTracerEvent(
811
823
  events.emplace_back(
812
824
  TraceEvent{
813
825
  .name = "Commit",
814
- .cat = "devtools.timeline",
826
+ .cat = {Category::Timeline},
815
827
  .ph = 'I',
816
828
  .ts = event.start,
817
829
  .pid = processId_,
@@ -827,7 +839,7 @@ void PerformanceTracer::enqueueTraceEventsFromPerformanceTracerEvent(
827
839
  events.emplace_back(
828
840
  TraceEvent{
829
841
  .name = "DrawFrame",
830
- .cat = "devtools.timeline",
842
+ .cat = {Category::Timeline},
831
843
  .ph = 'I',
832
844
  .ts = event.start,
833
845
  .pid = processId_,
@@ -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
  };
@@ -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