react-native 0.84.0-nightly-20251105-5ec5cc3a3 → 0.84.0-nightly-20251107-f8198f662

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (102) hide show
  1. package/Libraries/Animated/createAnimatedComponent.js +1 -0
  2. package/Libraries/Components/Button.js +0 -3
  3. package/Libraries/Core/ReactNativeVersion.js +1 -1
  4. package/Libraries/StyleSheet/PlatformColorValueTypes.android.js +2 -2
  5. package/Libraries/StyleSheet/PlatformColorValueTypes.ios.js +1 -1
  6. package/Libraries/StyleSheet/PlatformColorValueTypes.js.flow +4 -2
  7. package/React/Base/RCTVersion.m +1 -1
  8. package/React/CoreModules/React-CoreModules.podspec +1 -0
  9. package/React/FBReactNativeSpec/FBReactNativeSpecJSI.h +8 -8
  10. package/React/Fabric/Surface/RCTFabricSurface.mm +1 -1
  11. package/React/Runtime/React-RCTRuntime.podspec +1 -0
  12. package/ReactAndroid/api/ReactAndroid.api +0 -13
  13. package/ReactAndroid/gradle.properties +1 -1
  14. package/ReactAndroid/src/main/java/com/facebook/react/ReactPackageTurboModuleManagerDelegate.kt +2 -3
  15. package/ReactAndroid/src/main/java/com/facebook/react/bridge/CatalystInstanceImpl.java +2 -6
  16. package/ReactAndroid/src/main/java/com/facebook/react/bridge/ModuleHolder.kt +2 -2
  17. package/ReactAndroid/src/main/java/com/facebook/react/bridge/NativeModuleRegistry.kt +1 -16
  18. package/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlags.kt +7 -7
  19. package/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsCxxAccessor.kt +11 -11
  20. package/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsCxxInterop.kt +3 -3
  21. package/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsDefaults.kt +3 -3
  22. package/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsLocalAccessor.kt +12 -12
  23. package/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsProvider.kt +3 -3
  24. package/ReactAndroid/src/main/java/com/facebook/react/internal/turbomodule/core/TurboModuleManager.kt +2 -35
  25. package/ReactAndroid/src/main/java/com/facebook/react/modules/systeminfo/ReactNativeVersion.kt +1 -1
  26. package/ReactAndroid/src/main/java/com/facebook/react/uimanager/events/FabricEventDispatcher.kt +3 -36
  27. package/ReactAndroid/src/main/java/com/facebook/react/views/scroll/ReactHorizontalScrollView.java +4 -0
  28. package/ReactAndroid/src/main/java/com/facebook/react/views/scroll/ReactScrollView.java +4 -0
  29. package/ReactAndroid/src/main/java/com/facebook/react/views/scroll/VirtualViewContainerStateExperimental.kt +7 -0
  30. package/ReactAndroid/src/main/java/com/facebook/react/views/view/ReactViewGroup.kt +11 -1
  31. package/ReactAndroid/src/main/jni/react/fabric/FabricUIManagerBinding.cpp +36 -26
  32. package/ReactAndroid/src/main/jni/react/featureflags/JReactNativeFeatureFlagsCxxInterop.cpp +15 -15
  33. package/ReactAndroid/src/main/jni/react/featureflags/JReactNativeFeatureFlagsCxxInterop.h +4 -4
  34. package/ReactAndroid/src/main/jni/react/jni/CatalystInstanceImpl.cpp +3 -13
  35. package/ReactAndroid/src/main/jni/react/jni/CatalystInstanceImpl.h +1 -4
  36. package/ReactAndroid/src/main/jni/react/jni/CxxModuleWrapperBase.h +0 -24
  37. package/ReactAndroid/src/main/jni/react/jni/JavaModuleWrapper.cpp +0 -1
  38. package/ReactAndroid/src/main/jni/react/jni/ModuleRegistryBuilder.cpp +1 -29
  39. package/ReactAndroid/src/main/jni/react/jni/ModuleRegistryBuilder.h +1 -2
  40. package/ReactAndroid/src/main/jni/react/jni/OnLoad.cpp +0 -2
  41. package/ReactAndroid/src/main/jni/react/runtime/jni/JReactInstance.cpp +2 -1
  42. package/ReactAndroid/src/main/jni/react/turbomodule/ReactCommon/TurboModuleManager.cpp +1 -35
  43. package/ReactCommon/cxxreact/React-cxxreact.podspec +1 -0
  44. package/ReactCommon/cxxreact/ReactMarker.cpp +0 -1
  45. package/ReactCommon/cxxreact/ReactNativeVersion.h +1 -1
  46. package/ReactCommon/jsiexecutor/CMakeLists.txt +3 -1
  47. package/ReactCommon/jsiexecutor/React-jsiexecutor.podspec +3 -0
  48. package/ReactCommon/jsiexecutor/jsireact/JSIExecutor.cpp +0 -40
  49. package/ReactCommon/jsiexecutor/jsireact/JSIExecutor.h +1 -6
  50. package/ReactCommon/jsinspector-modern/ConsoleTask.cpp +27 -0
  51. package/ReactCommon/jsinspector-modern/ConsoleTask.h +38 -0
  52. package/ReactCommon/jsinspector-modern/ConsoleTaskContext.cpp +46 -0
  53. package/ReactCommon/jsinspector-modern/ConsoleTaskContext.h +102 -0
  54. package/ReactCommon/jsinspector-modern/ConsoleTaskOrchestrator.cpp +55 -0
  55. package/ReactCommon/jsinspector-modern/ConsoleTaskOrchestrator.h +48 -0
  56. package/ReactCommon/jsinspector-modern/RuntimeAgent.h +1 -1
  57. package/ReactCommon/jsinspector-modern/RuntimeTarget.cpp +12 -0
  58. package/ReactCommon/jsinspector-modern/RuntimeTarget.h +16 -13
  59. package/ReactCommon/jsinspector-modern/RuntimeTargetConsole.cpp +106 -1
  60. package/ReactCommon/jsinspector-modern/tests/ConsoleCreateTaskTest.cpp +131 -0
  61. package/ReactCommon/jsinspector-modern/tests/ReactInstanceIntegrationTest.cpp +1 -0
  62. package/ReactCommon/jsinspector-modern/tracing/PerformanceTracer.cpp +13 -2
  63. package/ReactCommon/jsinspector-modern/tracing/PerformanceTracer.h +6 -2
  64. package/ReactCommon/jsinspector-modern/tracing/React-jsinspectortracing.podspec +4 -0
  65. package/ReactCommon/jsinspector-modern/tracing/TargetTracingAgent.h +5 -0
  66. package/ReactCommon/jsitooling/React-jsitooling.podspec +1 -0
  67. package/ReactCommon/jsitooling/react/runtime/JSRuntimeBindings.cpp +54 -0
  68. package/ReactCommon/jsitooling/react/runtime/JSRuntimeBindings.h +20 -0
  69. package/ReactCommon/react/featureflags/ReactNativeFeatureFlags.cpp +5 -5
  70. package/ReactCommon/react/featureflags/ReactNativeFeatureFlags.h +6 -6
  71. package/ReactCommon/react/featureflags/ReactNativeFeatureFlagsAccessor.cpp +83 -83
  72. package/ReactCommon/react/featureflags/ReactNativeFeatureFlagsAccessor.h +3 -3
  73. package/ReactCommon/react/featureflags/ReactNativeFeatureFlagsDefaults.h +5 -5
  74. package/ReactCommon/react/featureflags/ReactNativeFeatureFlagsDynamicProvider.h +10 -10
  75. package/ReactCommon/react/featureflags/ReactNativeFeatureFlagsProvider.h +2 -2
  76. package/ReactCommon/react/nativemodule/featureflags/NativeReactNativeFeatureFlags.cpp +6 -6
  77. package/ReactCommon/react/nativemodule/featureflags/NativeReactNativeFeatureFlags.h +3 -3
  78. package/ReactCommon/react/performance/timeline/CMakeLists.txt +1 -0
  79. package/ReactCommon/react/performance/timeline/PerformanceEntryReporter.cpp +9 -1
  80. package/ReactCommon/react/performance/timeline/React-performancetimeline.podspec +1 -0
  81. package/ReactCommon/react/renderer/animated/NativeAnimatedNodesManager.cpp +21 -16
  82. package/ReactCommon/react/renderer/animated/NativeAnimatedNodesManagerProvider.cpp +9 -5
  83. package/ReactCommon/react/renderer/animationbackend/AnimationBackend.cpp +67 -32
  84. package/ReactCommon/react/renderer/animationbackend/AnimationBackend.h +14 -2
  85. package/ReactCommon/react/renderer/core/EventDispatcher.cpp +1 -1
  86. package/ReactCommon/react/renderer/core/EventQueueProcessor.cpp +3 -3
  87. package/ReactCommon/react/renderer/scheduler/SurfaceHandler.cpp +0 -20
  88. package/ReactCommon/react/renderer/scheduler/SurfaceHandler.h +3 -3
  89. package/ReactCommon/react/renderer/scheduler/SurfaceManager.cpp +2 -3
  90. package/ReactCommon/react/runtime/ReactInstance.cpp +8 -6
  91. package/ReactCommon/react/runtime/ReactInstance.h +0 -1
  92. package/ReactCommon/react/utils/React-utils.podspec +3 -1
  93. package/flow/bom.js.flow +7 -0
  94. package/package.json +9 -8
  95. package/scripts/ios-configure-glog.sh +6 -1
  96. package/src/private/featureflags/ReactNativeFeatureFlags.js +6 -6
  97. package/src/private/featureflags/specs/NativeReactNativeFeatureFlags.js +2 -2
  98. package/types_generated/Libraries/Components/Button.d.ts +1 -4
  99. package/types_generated/Libraries/StyleSheet/PlatformColorValueTypes.d.ts +3 -3
  100. package/ReactAndroid/src/main/java/com/facebook/react/bridge/CxxModuleWrapper.kt +0 -25
  101. package/ReactAndroid/src/main/java/com/facebook/react/bridge/CxxModuleWrapperBase.kt +0 -61
  102. package/ReactAndroid/src/main/jni/react/jni/CxxModuleWrapper.h +0 -37
@@ -30,13 +30,16 @@ Pod::Spec.new do |s|
30
30
  s.header_dir = "jsireact"
31
31
 
32
32
  s.dependency "React-cxxreact"
33
+ s.dependency "React-jserrorhandler"
33
34
  s.dependency "React-jsi"
35
+ s.dependency "React-jsitooling"
34
36
  s.dependency "React-perflogger"
35
37
  add_dependency(s, "React-debug")
36
38
  add_dependency(s, "React-runtimeexecutor", :additional_framework_paths => ["platform/ios"])
37
39
  add_dependency(s, "React-jsinspector", :framework_name => 'jsinspector_modern')
38
40
  add_dependency(s, "React-jsinspectorcdp", :framework_name => 'jsinspector_moderncdp')
39
41
  add_dependency(s, "React-jsinspectortracing", :framework_name => 'jsinspector_moderntracing')
42
+ add_dependency(s, "React-utils", :additional_framework_paths => ["react/utils/platform/ios"])
40
43
  if use_hermes()
41
44
  s.dependency 'hermes-engine'
42
45
  end
@@ -576,44 +576,4 @@ void JSIExecutor::flush() {}
576
576
 
577
577
  #endif // RCT_REMOVE_LEGACY_ARCH
578
578
 
579
- void bindNativeLogger(Runtime& runtime, Logger logger) {
580
- runtime.global().setProperty(
581
- runtime,
582
- "nativeLoggingHook",
583
- Function::createFromHostFunction(
584
- runtime,
585
- PropNameID::forAscii(runtime, "nativeLoggingHook"),
586
- 2,
587
- [logger = std::move(logger)](
588
- jsi::Runtime& runtime,
589
- const jsi::Value&,
590
- const jsi::Value* args,
591
- size_t count) {
592
- if (count != 2) {
593
- throw std::invalid_argument(
594
- "nativeLoggingHook takes 2 arguments");
595
- }
596
- logger(
597
- args[0].asString(runtime).utf8(runtime),
598
- static_cast<unsigned int>(args[1].asNumber()));
599
- return Value::undefined();
600
- }));
601
- }
602
-
603
- void bindNativePerformanceNow(Runtime& runtime) {
604
- runtime.global().setProperty(
605
- runtime,
606
- "nativePerformanceNow",
607
- Function::createFromHostFunction(
608
- runtime,
609
- PropNameID::forAscii(runtime, "nativePerformanceNow"),
610
- 0,
611
- [](jsi::Runtime& runtime,
612
- const jsi::Value&,
613
- const jsi::Value* args,
614
- size_t /*count*/) {
615
- return HighResTimeStamp::now().toDOMHighResTimeStamp();
616
- }));
617
- }
618
-
619
579
  } // namespace facebook::react
@@ -12,6 +12,7 @@
12
12
  #include <cxxreact/RAMBundleRegistry.h>
13
13
  #include <jsi/jsi.h>
14
14
  #include <jsireact/JSINativeModules.h>
15
+ #include <react/runtime/JSRuntimeBindings.h>
15
16
  #include <functional>
16
17
  #include <mutex>
17
18
  #include <optional>
@@ -127,10 +128,4 @@ class [[deprecated("This API will be removed along with the legacy architecture.
127
128
  #endif // RCT_REMOVE_LEGACY_ARCH
128
129
  };
129
130
 
130
- using Logger = std::function<void(const std::string &message, unsigned int logLevel)>;
131
- void bindNativeLogger(jsi::Runtime &runtime, Logger logger);
132
-
133
- void bindNativePerformanceNow(jsi::Runtime &runtime);
134
-
135
- double performanceNow();
136
131
  } // namespace facebook::react
@@ -0,0 +1,27 @@
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 "ConsoleTask.h"
9
+ #include "ConsoleTaskOrchestrator.h"
10
+
11
+ namespace facebook::react::jsinspector_modern {
12
+
13
+ ConsoleTask::ConsoleTask(std::shared_ptr<ConsoleTaskContext> taskContext)
14
+ : taskContext_(std::move(taskContext)),
15
+ orchestrator_(ConsoleTaskOrchestrator::getInstance()) {
16
+ if (taskContext_) {
17
+ orchestrator_.startTask(taskContext_->id());
18
+ }
19
+ }
20
+
21
+ ConsoleTask::~ConsoleTask() {
22
+ if (taskContext_) {
23
+ orchestrator_.finishTask(taskContext_->id());
24
+ }
25
+ }
26
+
27
+ } // namespace facebook::react::jsinspector_modern
@@ -0,0 +1,38 @@
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 <memory>
11
+
12
+ namespace facebook::react::jsinspector_modern {
13
+
14
+ class ConsoleTaskContext;
15
+ class RuntimeTargetDelegate;
16
+ class ConsoleTaskOrchestrator;
17
+
18
+ class ConsoleTask {
19
+ public:
20
+ /**
21
+ * \param runtimeTargetDelegate The delegate to the corresponding runtime.
22
+ * \param taskContext The context that tracks the task.
23
+ */
24
+ explicit ConsoleTask(std::shared_ptr<ConsoleTaskContext> taskContext);
25
+ ~ConsoleTask();
26
+
27
+ ConsoleTask(const ConsoleTask &) = default;
28
+ ConsoleTask &operator=(const ConsoleTask &) = delete;
29
+
30
+ ConsoleTask(ConsoleTask &&) = default;
31
+ ConsoleTask &operator=(ConsoleTask &&) = delete;
32
+
33
+ private:
34
+ std::shared_ptr<ConsoleTaskContext> taskContext_;
35
+ ConsoleTaskOrchestrator &orchestrator_;
36
+ };
37
+
38
+ } // namespace facebook::react::jsinspector_modern
@@ -0,0 +1,46 @@
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 "ConsoleTaskContext.h"
9
+ #include "ConsoleTaskOrchestrator.h"
10
+ #include "RuntimeTarget.h"
11
+
12
+ namespace facebook::react::jsinspector_modern {
13
+
14
+ ConsoleTaskContext::ConsoleTaskContext(
15
+ jsi::Runtime& runtime,
16
+ RuntimeTargetDelegate& runtimeTargetDelegate,
17
+ std::string name)
18
+ : runtimeTargetDelegate_(runtimeTargetDelegate),
19
+ name_(std::move(name)),
20
+ orchestrator_(ConsoleTaskOrchestrator::getInstance()) {
21
+ stackTrace_ = runtimeTargetDelegate_.captureStackTrace(runtime);
22
+ }
23
+
24
+ ConsoleTaskContext::~ConsoleTaskContext() {
25
+ orchestrator_.cancelTask(id());
26
+ }
27
+
28
+ ConsoleTaskId ConsoleTaskContext::id() const {
29
+ return ConsoleTaskId{(void*)this};
30
+ }
31
+
32
+ std::optional<folly::dynamic> ConsoleTaskContext::getSerializedStackTrace()
33
+ const {
34
+ auto maybeValue = runtimeTargetDelegate_.serializeStackTrace(*stackTrace_);
35
+ if (maybeValue) {
36
+ maybeValue.value()["description"] = name_;
37
+ }
38
+
39
+ return maybeValue;
40
+ }
41
+
42
+ void ConsoleTaskContext::schedule() {
43
+ orchestrator_.scheduleTask(id(), weak_from_this());
44
+ }
45
+
46
+ } // namespace facebook::react::jsinspector_modern
@@ -0,0 +1,102 @@
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 "StackTrace.h"
11
+
12
+ #include <folly/dynamic.h>
13
+ #include <jsi/jsi.h>
14
+
15
+ #include <cassert>
16
+ #include <functional>
17
+ #include <memory>
18
+ #include <string>
19
+
20
+ namespace facebook::react::jsinspector_modern {
21
+
22
+ class ConsoleTaskOrchestrator;
23
+ class RuntimeTargetDelegate;
24
+
25
+ class ConsoleTaskId {
26
+ public:
27
+ ConsoleTaskId() = default;
28
+ ~ConsoleTaskId() = default;
29
+
30
+ ConsoleTaskId(const ConsoleTaskId &) = default;
31
+ ConsoleTaskId &operator=(const ConsoleTaskId &) = default;
32
+
33
+ ConsoleTaskId(ConsoleTaskId &&) = default;
34
+ ConsoleTaskId &operator=(ConsoleTaskId &&) = default;
35
+
36
+ bool operator==(const ConsoleTaskId &) const = default;
37
+ inline operator bool() const
38
+ {
39
+ return (bool)id_;
40
+ }
41
+
42
+ explicit inline operator void *() const
43
+ {
44
+ return id_;
45
+ }
46
+
47
+ private:
48
+ explicit inline ConsoleTaskId(void *id) : id_(id)
49
+ {
50
+ assert(id_ != nullptr);
51
+ }
52
+
53
+ void *id_{nullptr};
54
+
55
+ friend class ConsoleTaskContext;
56
+ };
57
+
58
+ class ConsoleTaskContext : public std::enable_shared_from_this<ConsoleTaskContext> {
59
+ public:
60
+ ConsoleTaskContext(jsi::Runtime &runtime, RuntimeTargetDelegate &runtimeTargetDelegate, std::string name);
61
+ ~ConsoleTaskContext();
62
+
63
+ // Can't be moved or copied: the address of `ConsoleTaskContext` is used to
64
+ // identify this task and all corresponding invocations.
65
+ ConsoleTaskContext(const ConsoleTaskContext &) = delete;
66
+ ConsoleTaskContext &operator=(const ConsoleTaskContext &) = delete;
67
+
68
+ ConsoleTaskContext(ConsoleTaskContext &&) = delete;
69
+ ConsoleTaskContext &operator=(ConsoleTaskContext &&) = delete;
70
+
71
+ /**
72
+ * Unique identifier that is calculated based on the address of
73
+ * ConsoleTaskContext.
74
+ */
75
+ ConsoleTaskId id() const;
76
+
77
+ /**
78
+ * Returns the serialized stack trace that was captured during the allocation
79
+ * of ConsoleTaskContext.
80
+ */
81
+ std::optional<folly::dynamic> getSerializedStackTrace() const;
82
+
83
+ void schedule();
84
+
85
+ private:
86
+ RuntimeTargetDelegate &runtimeTargetDelegate_;
87
+ std::string name_;
88
+ ConsoleTaskOrchestrator &orchestrator_;
89
+ std::unique_ptr<StackTrace> stackTrace_;
90
+ };
91
+
92
+ } // namespace facebook::react::jsinspector_modern
93
+
94
+ namespace std {
95
+ template <>
96
+ struct hash<facebook::react::jsinspector_modern::ConsoleTaskId> {
97
+ size_t operator()(const facebook::react::jsinspector_modern::ConsoleTaskId &id) const
98
+ {
99
+ return std::hash<void *>{}(static_cast<void *>(id));
100
+ }
101
+ };
102
+ } // namespace std
@@ -0,0 +1,55 @@
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 "ConsoleTaskOrchestrator.h"
9
+
10
+ namespace facebook::react::jsinspector_modern {
11
+
12
+ /* static */ ConsoleTaskOrchestrator& ConsoleTaskOrchestrator::getInstance() {
13
+ static ConsoleTaskOrchestrator instance;
14
+ return instance;
15
+ }
16
+
17
+ void ConsoleTaskOrchestrator::scheduleTask(
18
+ ConsoleTaskId taskId,
19
+ std::weak_ptr<ConsoleTaskContext> taskContext) {
20
+ std::lock_guard<std::mutex> lock(mutex_);
21
+ tasks_.emplace(taskId, taskContext);
22
+ }
23
+
24
+ void ConsoleTaskOrchestrator::cancelTask(ConsoleTaskId id) {
25
+ std::lock_guard<std::mutex> lock(mutex_);
26
+ tasks_.erase(id);
27
+ }
28
+
29
+ void ConsoleTaskOrchestrator::startTask(ConsoleTaskId id) {
30
+ std::lock_guard<std::mutex> lock(mutex_);
31
+ stack_.push(id);
32
+ }
33
+
34
+ void ConsoleTaskOrchestrator::finishTask(ConsoleTaskId id) {
35
+ std::lock_guard<std::mutex> lock(mutex_);
36
+ assert(stack_.top() == id);
37
+
38
+ stack_.pop();
39
+ }
40
+
41
+ std::shared_ptr<ConsoleTaskContext> ConsoleTaskOrchestrator::top() const {
42
+ std::lock_guard<std::mutex> lock(mutex_);
43
+ if (stack_.empty()) {
44
+ return nullptr;
45
+ }
46
+
47
+ auto it = tasks_.find(stack_.top());
48
+ if (it == tasks_.end()) {
49
+ return nullptr;
50
+ }
51
+
52
+ return it->second.lock();
53
+ }
54
+
55
+ } // namespace facebook::react::jsinspector_modern
@@ -0,0 +1,48 @@
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 <memory>
11
+ #include <mutex>
12
+ #include <stack>
13
+
14
+ #include "ConsoleTaskContext.h"
15
+
16
+ namespace facebook::react::jsinspector_modern {
17
+
18
+ class ConsoleTaskOrchestrator {
19
+ public:
20
+ static ConsoleTaskOrchestrator &getInstance();
21
+
22
+ ~ConsoleTaskOrchestrator() = default;
23
+
24
+ ConsoleTaskOrchestrator(const ConsoleTaskOrchestrator &) = delete;
25
+ ConsoleTaskOrchestrator &operator=(const ConsoleTaskOrchestrator &) = delete;
26
+
27
+ ConsoleTaskOrchestrator(ConsoleTaskOrchestrator &&) = delete;
28
+ ConsoleTaskOrchestrator &operator=(ConsoleTaskOrchestrator &&) = delete;
29
+
30
+ void scheduleTask(ConsoleTaskId taskId, std::weak_ptr<ConsoleTaskContext> taskContext);
31
+ void cancelTask(ConsoleTaskId taskId);
32
+
33
+ void startTask(ConsoleTaskId taskId);
34
+ void finishTask(ConsoleTaskId taskId);
35
+ std::shared_ptr<ConsoleTaskContext> top() const;
36
+
37
+ private:
38
+ ConsoleTaskOrchestrator() = default;
39
+
40
+ std::stack<ConsoleTaskId> stack_;
41
+ std::unordered_map<ConsoleTaskId, std::weak_ptr<ConsoleTaskContext>> tasks_;
42
+ /**
43
+ * Protects the stack_ and tasks_ members.
44
+ */
45
+ mutable std::mutex mutex_;
46
+ };
47
+
48
+ } // namespace facebook::react::jsinspector_modern
@@ -99,7 +99,7 @@ class RuntimeAgent final {
99
99
  * Lifetime of this agent is bound to the lifetime of the Tracing session -
100
100
  * HostTargetTraceRecording and to the lifetime of the RuntimeTarget.
101
101
  */
102
- class RuntimeTracingAgent : tracing::TargetTracingAgent {
102
+ class RuntimeTracingAgent : public tracing::TargetTracingAgent {
103
103
  public:
104
104
  explicit RuntimeTracingAgent(tracing::TraceRecordingState &state, RuntimeTargetController &targetController);
105
105
 
@@ -248,6 +248,18 @@ bool RuntimeTarget::isDomainEnabled(Domain domain) const {
248
248
  return threadSafeDomainStatus_[domain];
249
249
  }
250
250
 
251
+ bool RuntimeTarget::isConsoleCreateTaskEnabled() const {
252
+ if (isDomainEnabled(Domain::Runtime)) {
253
+ return true;
254
+ }
255
+
256
+ if (auto tracingAgent = tracingAgent_.lock()) {
257
+ return tracingAgent->isRunningInBackgroundMode();
258
+ }
259
+
260
+ return false;
261
+ }
262
+
251
263
  RuntimeTargetController::RuntimeTargetController(RuntimeTarget& target)
252
264
  : target_(target) {}
253
265
 
@@ -207,19 +207,6 @@ class JSINSPECTOR_EXPORT RuntimeTarget : public EnableExecutorFromThis<RuntimeTa
207
207
  */
208
208
  std::shared_ptr<RuntimeTracingAgent> createTracingAgent(tracing::TraceRecordingState &state);
209
209
 
210
- /**
211
- * Start sampling profiler for a particular JavaScript runtime.
212
- */
213
- void enableSamplingProfiler();
214
- /**
215
- * Stop sampling profiler for a particular JavaScript runtime.
216
- */
217
- void disableSamplingProfiler();
218
- /**
219
- * Return recorded sampling profile for the previous sampling session.
220
- */
221
- tracing::RuntimeSamplingProfile collectSamplingProfile();
222
-
223
210
  private:
224
211
  using Domain = RuntimeTargetController::Domain;
225
212
 
@@ -275,6 +262,18 @@ class JSINSPECTOR_EXPORT RuntimeTarget : public EnableExecutorFromThis<RuntimeTa
275
262
  * session - HostTargetTraceRecording.
276
263
  */
277
264
  std::weak_ptr<RuntimeTracingAgent> tracingAgent_;
265
+ /**
266
+ * Start sampling profiler for a particular JavaScript runtime.
267
+ */
268
+ void enableSamplingProfiler();
269
+ /**
270
+ * Stop sampling profiler for a particular JavaScript runtime.
271
+ */
272
+ void disableSamplingProfiler();
273
+ /**
274
+ * Return recorded sampling profile for the previous sampling session.
275
+ */
276
+ tracing::RuntimeSamplingProfile collectSamplingProfile();
278
277
 
279
278
  /**
280
279
  * Adds a function with the given name on the runtime's global object, that
@@ -293,6 +292,10 @@ class JSINSPECTOR_EXPORT RuntimeTarget : public EnableExecutorFromThis<RuntimeTa
293
292
  * Install the console API handler.
294
293
  */
295
294
  void installConsoleHandler();
295
+ /**
296
+ * Returns whether console.createTask should actually capture stack traces.
297
+ */
298
+ bool isConsoleCreateTaskEnabled() const;
296
299
 
297
300
  /**
298
301
  * Installs __DEBUGGER_SESSION_OBSERVER__ object on the JavaScript's global
@@ -5,6 +5,10 @@
5
5
  * LICENSE file in the root directory of this source tree.
6
6
  */
7
7
 
8
+ #include "ConsoleTask.h"
9
+ #include "ConsoleTaskContext.h"
10
+ #include "ConsoleTaskOrchestrator.h"
11
+
8
12
  #include <jsinspector-modern/RuntimeTarget.h>
9
13
  #include <jsinspector-modern/tracing/PerformanceTracer.h>
10
14
 
@@ -477,8 +481,17 @@ void consoleTimeStamp(
477
481
  }
478
482
 
479
483
  if (performanceTracer.isTracing()) {
484
+ auto taskContext = ConsoleTaskOrchestrator::getInstance().top();
485
+
480
486
  performanceTracer.reportTimeStamp(
481
- label, start, end, trackName, trackGroup, color, std::move(detail));
487
+ label,
488
+ start,
489
+ end,
490
+ trackName,
491
+ trackGroup,
492
+ color,
493
+ std::move(detail),
494
+ taskContext ? taskContext->getSerializedStackTrace() : nullptr);
482
495
  }
483
496
 
484
497
  if (ReactPerfettoLogger::isTracing()) {
@@ -521,6 +534,71 @@ void installConsoleTimeStamp(
521
534
  })));
522
535
  }
523
536
 
537
+ /**
538
+ * run method of the task object returned from console.createTask().
539
+ */
540
+ jsi::Value consoleTaskRun(
541
+ jsi::Runtime& runtime,
542
+ const jsi::Value* args,
543
+ size_t count,
544
+ std::shared_ptr<ConsoleTaskContext> taskContext) {
545
+ if (count < 1 || !args[0].isObject()) {
546
+ throw JSError(runtime, "First argument must be a function");
547
+ }
548
+ auto fnObj = args[0].getObject(runtime);
549
+ if (!fnObj.isFunction(runtime)) {
550
+ throw JSError(runtime, "First argument must be a function");
551
+ }
552
+
553
+ ConsoleTask consoleTask{taskContext};
554
+
555
+ auto fn = fnObj.getFunction(runtime);
556
+ return fn.call(runtime);
557
+ }
558
+
559
+ /**
560
+ * console.createTask. Non-standardized.
561
+ * https://developer.chrome.com/docs/devtools/console/api#createtask
562
+ */
563
+ jsi::Value consoleCreateTask(
564
+ jsi::Runtime& runtime,
565
+ const jsi::Value* args,
566
+ size_t count,
567
+ RuntimeTargetDelegate& runtimeTargetDelegate,
568
+ bool enabled) {
569
+ if (count < 1 || !args[0].isString()) {
570
+ throw JSError(runtime, "First argument must be a non-empty string");
571
+ }
572
+ auto name = args[0].asString(runtime).utf8(runtime);
573
+ if (name.empty()) {
574
+ throw JSError(runtime, "First argument must be a non-empty string");
575
+ }
576
+
577
+ jsi::Object task{runtime};
578
+ std::shared_ptr<ConsoleTaskContext> taskContext = nullptr;
579
+ if (enabled) {
580
+ taskContext = std::make_shared<ConsoleTaskContext>(
581
+ runtime, runtimeTargetDelegate, name);
582
+ taskContext->schedule();
583
+ }
584
+
585
+ task.setProperty(
586
+ runtime,
587
+ "run",
588
+ jsi::Function::createFromHostFunction(
589
+ runtime,
590
+ jsi::PropNameID::forAscii(runtime, "run"),
591
+ 0,
592
+ [taskContext](
593
+ jsi::Runtime& runtime,
594
+ const jsi::Value& /*thisVal*/,
595
+ const jsi::Value* args,
596
+ size_t count) {
597
+ return consoleTaskRun(runtime, args, count, taskContext);
598
+ }));
599
+ return task;
600
+ }
601
+
524
602
  } // namespace
525
603
 
526
604
  void RuntimeTarget::installConsoleHandler() {
@@ -624,6 +702,33 @@ void RuntimeTarget::installConsoleHandler() {
624
702
  */
625
703
  installConsoleTimeStamp(runtime, originalConsole, console);
626
704
 
705
+ /**
706
+ * console.createTask
707
+ */
708
+ console.setProperty(
709
+ runtime,
710
+ "createTask",
711
+ jsi::Function::createFromHostFunction(
712
+ runtime,
713
+ jsi::PropNameID::forAscii(runtime, "createTask"),
714
+ 0,
715
+ [state, selfWeak](
716
+ jsi::Runtime& runtime,
717
+ const jsi::Value& /*thisVal*/,
718
+ const jsi::Value* args,
719
+ size_t count) {
720
+ jsi::Value task;
721
+ tryExecuteSync(selfWeak, [&](auto& self) {
722
+ task = consoleCreateTask(
723
+ runtime,
724
+ args,
725
+ count,
726
+ self.delegate_,
727
+ self.isConsoleCreateTaskEnabled());
728
+ });
729
+ return task;
730
+ }));
731
+
627
732
  // Install forwarding console methods.
628
733
  #define FORWARDING_CONSOLE_METHOD(name, type) \
629
734
  installConsoleMethod(#name, console_##name);