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.
- package/Libraries/Animated/createAnimatedComponent.js +1 -0
- package/Libraries/Blob/RCTBlobManager.mm +1 -4
- 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/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/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/RCTNetworking.mm +1 -4
- package/Libraries/PushNotificationIOS/RCTPushNotificationManager.mm +1 -4
- package/Libraries/Settings/RCTSettingsManager.mm +1 -4
- 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/React/Base/RCTVersion.m +1 -1
- 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/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/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/views/scroll/VirtualViewContainerStateExperimental.kt +7 -0
- 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/JReactInstance.cpp +2 -1
- package/ReactAndroid/src/main/jni/react/turbomodule/ReactCommon/TurboModuleManager.cpp +1 -35
- 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/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/tests/ConsoleCreateTaskTest.cpp +131 -0
- package/ReactCommon/jsinspector-modern/tests/ReactInstanceIntegrationTest.cpp +1 -0
- package/ReactCommon/jsinspector-modern/tracing/PerformanceTracer.cpp +13 -2
- package/ReactCommon/jsinspector-modern/tracing/PerformanceTracer.h +6 -2
- package/ReactCommon/jsinspector-modern/tracing/TargetTracingAgent.h +5 -0
- package/ReactCommon/jsitooling/react/runtime/JSRuntimeBindings.cpp +54 -0
- package/ReactCommon/jsitooling/react/runtime/JSRuntimeBindings.h +20 -0
- 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 +21 -16
- package/ReactCommon/react/renderer/animated/NativeAnimatedNodesManagerProvider.cpp +9 -5
- 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/flow/bom.js.flow +7 -0
- package/package.json +8 -8
- package/scripts/ios-configure-glog.sh +6 -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
|
@@ -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,
|
|
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
|
};
|
|
@@ -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
|
|
@@ -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,
|
|
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.
|