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.
- package/Libraries/Animated/createAnimatedComponent.js +1 -0
- package/Libraries/Blob/RCTBlobManager.mm +1 -4
- package/Libraries/Blob/RCTBlobPlugins.mm +14 -14
- package/Libraries/Blob/RCTFileReaderModule.mm +1 -4
- package/Libraries/Components/Button.js +0 -3
- package/Libraries/Core/ReactNativeVersion.js +1 -1
- package/Libraries/Image/RCTBundleAssetImageLoader.mm +1 -4
- package/Libraries/Image/RCTGIFImageDecoder.mm +1 -4
- package/Libraries/Image/RCTImageEditingManager.mm +1 -4
- package/Libraries/Image/RCTImageLoader.mm +1 -4
- package/Libraries/Image/RCTImagePlugins.h +1 -0
- package/Libraries/Image/RCTImagePlugins.mm +30 -17
- package/Libraries/Image/RCTImageStoreManager.mm +1 -4
- package/Libraries/Image/RCTImageViewManager.mm +1 -4
- package/Libraries/Image/RCTLocalAssetImageLoader.mm +1 -4
- package/Libraries/LinkingIOS/RCTLinkingManager.mm +1 -4
- package/Libraries/LinkingIOS/RCTLinkingPlugins.mm +10 -13
- package/Libraries/LogBox/Data/LogBoxData.js +31 -4
- package/Libraries/NativeAnimation/RCTAnimationPlugins.mm +14 -14
- package/Libraries/NativeAnimation/RCTNativeAnimatedModule.mm +1 -4
- package/Libraries/NativeAnimation/RCTNativeAnimatedTurboModule.mm +1 -4
- package/Libraries/Network/RCTDataRequestHandler.mm +1 -4
- package/Libraries/Network/RCTFileRequestHandler.mm +1 -4
- package/Libraries/Network/RCTHTTPRequestHandler.mm +1 -4
- package/Libraries/Network/RCTNetworkPlugins.mm +22 -16
- package/Libraries/Network/RCTNetworking.mm +1 -4
- package/Libraries/PushNotificationIOS/RCTPushNotificationManager.mm +1 -4
- package/Libraries/PushNotificationIOS/RCTPushNotificationPlugins.mm +10 -13
- package/Libraries/Settings/RCTSettingsManager.mm +1 -4
- package/Libraries/Settings/RCTSettingsPlugins.mm +10 -13
- package/Libraries/StyleSheet/PlatformColorValueTypes.android.js +2 -2
- package/Libraries/StyleSheet/PlatformColorValueTypes.ios.js +1 -1
- package/Libraries/StyleSheet/PlatformColorValueTypes.js.flow +4 -2
- package/Libraries/Text/BaseText/RCTBaseTextViewManager.mm +1 -4
- package/Libraries/Text/RawText/RCTRawTextViewManager.mm +1 -4
- package/Libraries/Text/Text/RCTTextViewManager.mm +1 -4
- package/Libraries/Text/TextInput/Multiline/RCTMultilineTextInputViewManager.mm +1 -4
- package/Libraries/Text/TextInput/RCTBaseTextInputViewManager.mm +1 -4
- package/Libraries/Text/TextInput/RCTInputAccessoryViewManager.mm +1 -4
- package/Libraries/Text/TextInput/Singleline/RCTSinglelineTextInputViewManager.mm +1 -4
- package/Libraries/Text/VirtualText/RCTVirtualTextViewManager.mm +1 -4
- package/Libraries/Vibration/RCTVibration.mm +1 -4
- package/Libraries/Vibration/RCTVibrationPlugins.mm +10 -13
- package/React/Base/RCTVersion.m +1 -1
- package/React/CoreModules/CoreModulesPlugins.mm +98 -35
- package/React/CoreModules/RCTAccessibilityManager.mm +1 -4
- package/React/CoreModules/RCTActionSheetManager.mm +1 -4
- package/React/CoreModules/RCTAlertManager.mm +1 -4
- package/React/CoreModules/RCTAppState.mm +1 -4
- package/React/CoreModules/RCTAppearance.mm +1 -4
- package/React/CoreModules/RCTClipboard.mm +1 -4
- package/React/CoreModules/RCTDevLoadingView.mm +1 -4
- package/React/CoreModules/RCTDevMenu.mm +1 -4
- package/React/CoreModules/RCTDevSettings.mm +1 -4
- package/React/CoreModules/RCTDevToolsRuntimeSettingsModule.mm +1 -5
- package/React/CoreModules/RCTDeviceInfo.mm +1 -4
- package/React/CoreModules/RCTEventDispatcher.mm +1 -4
- package/React/CoreModules/RCTExceptionsManager.mm +1 -4
- package/React/CoreModules/RCTI18nManager.mm +1 -4
- package/React/CoreModules/RCTKeyboardObserver.mm +1 -4
- package/React/CoreModules/RCTLogBox.mm +1 -4
- package/React/CoreModules/RCTPerfMonitor.mm +1 -4
- package/React/CoreModules/RCTPlatform.mm +1 -4
- package/React/CoreModules/RCTRedBox.mm +1 -4
- package/React/CoreModules/RCTSourceCode.mm +1 -4
- package/React/CoreModules/RCTStatusBarManager.mm +1 -4
- package/React/CoreModules/RCTTiming.mm +1 -4
- package/React/CoreModules/RCTWebSocketModule.mm +1 -4
- package/React/FBReactNativeSpec/FBReactNativeSpecJSI.h +16 -0
- package/React/Modules/RCTUIManager.mm +1 -4
- package/React/Views/RCTActivityIndicatorViewManager.m +1 -4
- package/React/Views/RCTDebuggingOverlayManager.m +1 -4
- package/React/Views/RCTModalHostViewManager.m +1 -4
- package/React/Views/RCTModalManager.m +1 -4
- package/React/Views/RCTSwitchManager.m +1 -4
- package/React/Views/RCTViewManager.m +1 -4
- package/React/Views/RefreshControl/RCTRefreshControlManager.m +1 -4
- package/React/Views/SafeAreaView/RCTSafeAreaViewManager.m +1 -4
- package/React/Views/ScrollView/RCTScrollContentViewManager.m +1 -4
- package/React/Views/ScrollView/RCTScrollViewManager.m +1 -4
- package/ReactAndroid/api/ReactAndroid.api +0 -13
- package/ReactAndroid/gradle.properties +1 -1
- package/ReactAndroid/src/main/java/com/facebook/react/ReactPackageTurboModuleManagerDelegate.kt +2 -3
- package/ReactAndroid/src/main/java/com/facebook/react/bridge/CatalystInstanceImpl.java +2 -6
- package/ReactAndroid/src/main/java/com/facebook/react/bridge/ModuleHolder.kt +2 -2
- package/ReactAndroid/src/main/java/com/facebook/react/bridge/NativeModuleRegistry.kt +1 -16
- package/ReactAndroid/src/main/java/com/facebook/react/fabric/FabricUIManager.java +1 -1
- package/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlags.kt +13 -1
- package/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsCxxAccessor.kt +21 -1
- package/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsCxxInterop.kt +5 -1
- package/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsDefaults.kt +5 -1
- package/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsLocalAccessor.kt +23 -1
- package/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsProvider.kt +5 -1
- package/ReactAndroid/src/main/java/com/facebook/react/internal/turbomodule/core/TurboModuleManager.kt +2 -35
- package/ReactAndroid/src/main/java/com/facebook/react/modules/systeminfo/ReactNativeVersion.kt +1 -1
- package/ReactAndroid/src/main/java/com/facebook/react/uimanager/BaseViewManager.java +4 -5
- package/ReactAndroid/src/main/java/com/facebook/react/views/scroll/VirtualViewContainerStateExperimental.kt +7 -0
- package/ReactAndroid/src/main/jni/react/fabric/FabricUIManagerBinding.cpp +12 -0
- package/ReactAndroid/src/main/jni/react/featureflags/JReactNativeFeatureFlagsCxxInterop.cpp +29 -1
- package/ReactAndroid/src/main/jni/react/featureflags/JReactNativeFeatureFlagsCxxInterop.h +7 -1
- package/ReactAndroid/src/main/jni/react/jni/CatalystInstanceImpl.cpp +3 -13
- package/ReactAndroid/src/main/jni/react/jni/CatalystInstanceImpl.h +1 -4
- package/ReactAndroid/src/main/jni/react/jni/CxxModuleWrapperBase.h +0 -24
- package/ReactAndroid/src/main/jni/react/jni/JavaModuleWrapper.cpp +0 -1
- package/ReactAndroid/src/main/jni/react/jni/ModuleRegistryBuilder.cpp +1 -29
- package/ReactAndroid/src/main/jni/react/jni/ModuleRegistryBuilder.h +1 -2
- package/ReactAndroid/src/main/jni/react/jni/OnLoad.cpp +0 -2
- package/ReactAndroid/src/main/jni/react/runtime/jni/JReactHostInspectorTarget.cpp +8 -1
- package/ReactAndroid/src/main/jni/react/runtime/jni/JReactInstance.cpp +2 -1
- package/ReactAndroid/src/main/jni/react/turbomodule/ReactCommon/TurboModuleManager.cpp +1 -35
- package/ReactAndroid/src/main/jni/third-party/folly/CMakeLists.txt +1 -0
- package/ReactApple/RCTAnimatedModuleProvider/RCTAnimatedModuleProvider.mm +29 -4
- package/ReactCommon/cxxreact/ReactMarker.cpp +0 -1
- package/ReactCommon/cxxreact/ReactNativeVersion.h +1 -1
- package/ReactCommon/jsiexecutor/CMakeLists.txt +3 -1
- package/ReactCommon/jsiexecutor/React-jsiexecutor.podspec +2 -0
- package/ReactCommon/jsiexecutor/jsireact/JSIExecutor.cpp +0 -40
- package/ReactCommon/jsiexecutor/jsireact/JSIExecutor.h +1 -6
- package/ReactCommon/jsinspector-modern/ConsoleTask.cpp +27 -0
- package/ReactCommon/jsinspector-modern/ConsoleTask.h +38 -0
- package/ReactCommon/jsinspector-modern/ConsoleTaskContext.cpp +46 -0
- package/ReactCommon/jsinspector-modern/ConsoleTaskContext.h +102 -0
- package/ReactCommon/jsinspector-modern/ConsoleTaskOrchestrator.cpp +55 -0
- package/ReactCommon/jsinspector-modern/ConsoleTaskOrchestrator.h +48 -0
- package/ReactCommon/jsinspector-modern/HostTarget.h +8 -2
- package/ReactCommon/jsinspector-modern/HostTargetTraceRecording.cpp +6 -2
- package/ReactCommon/jsinspector-modern/HostTargetTraceRecording.h +15 -5
- package/ReactCommon/jsinspector-modern/HostTargetTracing.cpp +9 -5
- package/ReactCommon/jsinspector-modern/RuntimeAgent.cpp +3 -2
- package/ReactCommon/jsinspector-modern/RuntimeAgent.h +1 -1
- package/ReactCommon/jsinspector-modern/RuntimeTarget.cpp +12 -0
- package/ReactCommon/jsinspector-modern/RuntimeTarget.h +16 -13
- package/ReactCommon/jsinspector-modern/RuntimeTargetConsole.cpp +106 -1
- package/ReactCommon/jsinspector-modern/TracingAgent.cpp +19 -2
- package/ReactCommon/jsinspector-modern/tests/ConsoleCreateTaskTest.cpp +131 -0
- package/ReactCommon/jsinspector-modern/tests/ReactInstanceIntegrationTest.cpp +1 -0
- package/ReactCommon/jsinspector-modern/tests/TracingTest.cpp +59 -0
- package/ReactCommon/jsinspector-modern/tests/TracingTest.h +20 -7
- package/ReactCommon/jsinspector-modern/tracing/PerformanceTracer.cpp +32 -20
- package/ReactCommon/jsinspector-modern/tracing/PerformanceTracer.h +6 -2
- package/ReactCommon/jsinspector-modern/tracing/TargetTracingAgent.h +5 -0
- package/ReactCommon/jsinspector-modern/tracing/TraceEvent.h +2 -1
- package/ReactCommon/jsinspector-modern/tracing/TraceEventSerializer.cpp +2 -1
- package/ReactCommon/jsinspector-modern/tracing/TraceRecordingState.h +3 -0
- package/ReactCommon/jsinspector-modern/tracing/TracingCategory.h +126 -0
- package/ReactCommon/jsitooling/react/runtime/JSRuntimeBindings.cpp +54 -0
- package/ReactCommon/jsitooling/react/runtime/JSRuntimeBindings.h +20 -0
- package/ReactCommon/react/featureflags/ReactNativeFeatureFlags.cpp +9 -1
- package/ReactCommon/react/featureflags/ReactNativeFeatureFlags.h +11 -1
- package/ReactCommon/react/featureflags/ReactNativeFeatureFlagsAccessor.cpp +113 -77
- package/ReactCommon/react/featureflags/ReactNativeFeatureFlagsAccessor.h +6 -2
- package/ReactCommon/react/featureflags/ReactNativeFeatureFlagsDefaults.h +9 -1
- package/ReactCommon/react/featureflags/ReactNativeFeatureFlagsDynamicProvider.h +19 -1
- package/ReactCommon/react/featureflags/ReactNativeFeatureFlagsProvider.h +3 -1
- package/ReactCommon/react/nativemodule/core/platform/ios/ReactCommon/RCTTurboModuleManager.mm +0 -1
- package/ReactCommon/react/nativemodule/featureflags/NativeReactNativeFeatureFlags.cpp +11 -1
- package/ReactCommon/react/nativemodule/featureflags/NativeReactNativeFeatureFlags.h +5 -1
- package/ReactCommon/react/nativemodule/samples/platform/ios/ReactCommon/RCTSampleTurboModule.mm +1 -4
- package/ReactCommon/react/performance/timeline/CMakeLists.txt +1 -0
- package/ReactCommon/react/performance/timeline/PerformanceEntryReporter.cpp +9 -1
- package/ReactCommon/react/performance/timeline/React-performancetimeline.podspec +1 -0
- package/ReactCommon/react/renderer/animated/NativeAnimatedNodesManager.cpp +24 -19
- package/ReactCommon/react/renderer/animated/NativeAnimatedNodesManagerProvider.cpp +11 -6
- package/ReactCommon/react/renderer/animationbackend/AnimationBackend.cpp +67 -32
- package/ReactCommon/react/renderer/animationbackend/AnimationBackend.h +14 -2
- package/ReactCommon/react/renderer/core/EventDispatcher.cpp +1 -1
- package/ReactCommon/react/renderer/core/EventQueueProcessor.cpp +3 -3
- package/ReactCommon/react/runtime/ReactInstance.cpp +8 -6
- package/ReactCommon/react/runtime/ReactInstance.h +0 -1
- package/ReactCommon/react/runtime/TimerManager.cpp +0 -54
- package/ReactCommon/react/runtime/TimerManager.h +0 -12
- package/flow/bom.js.flow +7 -0
- package/package.json +8 -8
- package/scripts/ios-configure-glog.sh +6 -1
- package/src/private/featureflags/ReactNativeFeatureFlags.js +11 -1
- package/src/private/featureflags/specs/NativeReactNativeFeatureFlags.js +3 -1
- package/types_generated/Libraries/Components/Button.d.ts +1 -4
- package/types_generated/Libraries/StyleSheet/PlatformColorValueTypes.d.ts +3 -3
- package/ReactAndroid/src/main/java/com/facebook/react/bridge/CxxModuleWrapper.kt +0 -25
- package/ReactAndroid/src/main/java/com/facebook/react/bridge/CxxModuleWrapperBase.kt +0 -61
- 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
|
|
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(
|
|
40
|
-
|
|
41
|
-
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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
|
};
|
|
@@ -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
|
-
|
|
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"] =
|
|
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
|