react-native-tvos 0.85.2-0 → 0.85.3-0

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 (110) hide show
  1. package/Libraries/Core/ReactNativeVersion.js +1 -1
  2. package/Libraries/Utilities/HMRClient.js +28 -1
  3. package/React/Base/RCTVersion.m +1 -1
  4. package/React/CoreModules/RCTJscSafeUrl+Internal.h +23 -0
  5. package/React/CoreModules/RCTJscSafeUrl.mm +38 -0
  6. package/React/CoreModules/RCTRedBox+Internal.h +42 -0
  7. package/React/CoreModules/RCTRedBox.mm +30 -471
  8. package/React/CoreModules/RCTRedBox2AnsiParser+Internal.h +22 -0
  9. package/React/CoreModules/RCTRedBox2AnsiParser.mm +55 -0
  10. package/React/CoreModules/RCTRedBox2Controller+Internal.h +34 -0
  11. package/React/CoreModules/RCTRedBox2Controller.mm +764 -0
  12. package/React/CoreModules/RCTRedBox2ErrorParser+Internal.h +46 -0
  13. package/React/CoreModules/RCTRedBox2ErrorParser.mm +57 -0
  14. package/React/CoreModules/RCTRedBoxController+Internal.h +31 -0
  15. package/React/CoreModules/RCTRedBoxController.mm +447 -0
  16. package/React/CoreModules/RCTRedBoxHMRClient+Internal.h +26 -0
  17. package/React/CoreModules/RCTRedBoxHMRClient.mm +125 -0
  18. package/React/CoreModules/React-CoreModules.podspec +1 -0
  19. package/React/DevSupport/RCTFrameTimingsObserver.h +24 -0
  20. package/React/DevSupport/RCTFrameTimingsObserver.mm +298 -0
  21. package/React/FBReactNativeSpec/FBReactNativeSpecJSI.h +40 -0
  22. package/ReactAndroid/gradle.properties +1 -1
  23. package/ReactAndroid/hermes-engine/build.gradle.kts +17 -0
  24. package/ReactAndroid/publish.gradle +20 -46
  25. package/ReactAndroid/src/main/java/com/facebook/react/devsupport/InspectorFlags.kt +4 -0
  26. package/ReactAndroid/src/main/java/com/facebook/react/devsupport/inspector/FrameTimingSequence.kt +1 -1
  27. package/ReactAndroid/src/main/java/com/facebook/react/devsupport/inspector/FrameTimingsObserver.kt +127 -26
  28. package/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlags.kt +31 -1
  29. package/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsCxxAccessor.kt +51 -1
  30. package/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsCxxInterop.kt +11 -1
  31. package/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsDefaults.kt +11 -1
  32. package/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsLocalAccessor.kt +56 -1
  33. package/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsProvider.kt +11 -1
  34. package/ReactAndroid/src/main/java/com/facebook/react/internal/tracing/PerformanceTracer.kt +39 -0
  35. package/ReactAndroid/src/main/java/com/facebook/react/modules/systeminfo/ReactNativeVersion.kt +1 -1
  36. package/ReactAndroid/src/main/java/com/facebook/react/runtime/ReactHostImpl.kt +50 -10
  37. package/ReactAndroid/src/main/jni/CMakeLists.txt +7 -0
  38. package/ReactAndroid/src/main/jni/react/devsupport/JInspectorFlags.cpp +22 -0
  39. package/ReactAndroid/src/main/jni/react/devsupport/JInspectorFlags.h +2 -0
  40. package/ReactAndroid/src/main/jni/react/featureflags/JReactNativeFeatureFlagsCxxInterop.cpp +71 -1
  41. package/ReactAndroid/src/main/jni/react/featureflags/JReactNativeFeatureFlagsCxxInterop.h +16 -1
  42. package/ReactAndroid/src/main/jni/react/runtime/jni/JReactHostInspectorTarget.cpp +14 -0
  43. package/ReactAndroid/src/main/jni/react/runtime/jni/JReactHostInspectorTarget.h +18 -4
  44. package/ReactCommon/React-Fabric.podspec +6 -0
  45. package/ReactCommon/cxxreact/ReactNativeVersion.h +2 -2
  46. package/ReactCommon/jsinspector-modern/HostAgent.cpp +36 -0
  47. package/ReactCommon/jsinspector-modern/HostTarget.cpp +7 -1
  48. package/ReactCommon/jsinspector-modern/HostTarget.h +25 -0
  49. package/ReactCommon/jsinspector-modern/HostTargetTracing.cpp +1 -1
  50. package/ReactCommon/jsinspector-modern/HostTargetTracing.h +4 -4
  51. package/ReactCommon/jsinspector-modern/InspectorFlags.cpp +12 -0
  52. package/ReactCommon/jsinspector-modern/InspectorFlags.h +12 -0
  53. package/ReactCommon/jsinspector-modern/NetworkIOAgent.cpp +1 -1
  54. package/ReactCommon/jsinspector-modern/RuntimeAgent.cpp +19 -0
  55. package/ReactCommon/jsinspector-modern/RuntimeAgent.h +7 -0
  56. package/ReactCommon/jsinspector-modern/RuntimeTarget.cpp +33 -0
  57. package/ReactCommon/jsinspector-modern/RuntimeTarget.h +6 -0
  58. package/ReactCommon/jsinspector-modern/tests/HostTargetTest.cpp +12 -0
  59. package/ReactCommon/jsinspector-modern/tests/InspectorMocks.h +3 -2
  60. package/ReactCommon/jsinspector-modern/tests/JsiIntegrationTest.cpp +1 -0
  61. package/ReactCommon/jsinspector-modern/tests/NetworkReporterTest.cpp +1 -1
  62. package/ReactCommon/jsinspector-modern/tests/TracingTest.cpp +1 -1
  63. package/ReactCommon/jsinspector-modern/tests/utils/InspectorFlagOverridesGuard.cpp +10 -0
  64. package/ReactCommon/jsinspector-modern/tests/utils/InspectorFlagOverridesGuard.h +3 -1
  65. package/ReactCommon/jsinspector-modern/tracing/CMakeLists.txt +1 -0
  66. package/ReactCommon/jsinspector-modern/tracing/FrameTimingSequence.h +7 -3
  67. package/ReactCommon/jsinspector-modern/tracing/HostTracingProfileSerializer.cpp +52 -29
  68. package/ReactCommon/jsinspector-modern/tracing/HostTracingProfileSerializer.h +6 -6
  69. package/ReactCommon/jsinspector-modern/tracing/PerformanceTracerSection.h +113 -0
  70. package/ReactCommon/jsinspector-modern/tracing/React-jsinspectortracing.podspec +1 -0
  71. package/ReactCommon/jsinspector-modern/tracing/TraceEventGenerator.cpp +12 -5
  72. package/ReactCommon/jsinspector-modern/tracing/TraceEventGenerator.h +3 -1
  73. package/ReactCommon/jsinspector-modern/tracing/TraceEventSerializer.cpp +42 -0
  74. package/ReactCommon/jsinspector-modern/tracing/TraceEventSerializer.h +7 -0
  75. package/ReactCommon/react/debug/CMakeLists.txt +2 -1
  76. package/ReactCommon/react/debug/React-debug.podspec +7 -1
  77. package/ReactCommon/react/debug/redbox/AnsiParser.cpp +139 -0
  78. package/ReactCommon/react/debug/redbox/AnsiParser.h +35 -0
  79. package/ReactCommon/react/debug/redbox/JscSafeUrl.cpp +179 -0
  80. package/ReactCommon/react/debug/redbox/JscSafeUrl.h +27 -0
  81. package/ReactCommon/react/debug/redbox/RedBoxErrorParser.cpp +171 -0
  82. package/ReactCommon/react/debug/redbox/RedBoxErrorParser.h +40 -0
  83. package/ReactCommon/react/debug/redbox/tests/AnsiParserTest.cpp +97 -0
  84. package/ReactCommon/react/debug/redbox/tests/JscSafeUrlTest.cpp +173 -0
  85. package/ReactCommon/react/debug/redbox/tests/RedBoxErrorParserTest.cpp +107 -0
  86. package/ReactCommon/react/featureflags/ReactNativeFeatureFlags.cpp +21 -1
  87. package/ReactCommon/react/featureflags/ReactNativeFeatureFlags.h +26 -1
  88. package/ReactCommon/react/featureflags/ReactNativeFeatureFlagsAccessor.cpp +135 -45
  89. package/ReactCommon/react/featureflags/ReactNativeFeatureFlagsAccessor.h +12 -2
  90. package/ReactCommon/react/featureflags/ReactNativeFeatureFlagsDefaults.h +21 -1
  91. package/ReactCommon/react/featureflags/ReactNativeFeatureFlagsDynamicProvider.h +46 -1
  92. package/ReactCommon/react/featureflags/ReactNativeFeatureFlagsProvider.h +6 -1
  93. package/ReactCommon/react/nativemodule/defaults/CMakeLists.txt +1 -0
  94. package/ReactCommon/react/nativemodule/defaults/DefaultTurboModules.cpp +7 -0
  95. package/ReactCommon/react/nativemodule/defaults/React-defaultsnativemodule.podspec +1 -0
  96. package/ReactCommon/react/nativemodule/featureflags/NativeReactNativeFeatureFlags.cpp +26 -1
  97. package/ReactCommon/react/nativemodule/featureflags/NativeReactNativeFeatureFlags.h +11 -1
  98. package/ReactCommon/react/nativemodule/mutationobserver/NativeMutationObserver.h +4 -0
  99. package/ReactCommon/react/nativemodule/mutationobserver/React-mutationobservernativemodule.podspec +66 -0
  100. package/ReactCommon/react/performance/timeline/PerformanceObserver.cpp +18 -6
  101. package/ReactCommon/react/performance/timeline/PerformanceObserver.h +2 -0
  102. package/ReactCommon/react/runtime/platform/ios/ReactCommon/RCTHost.mm +115 -0
  103. package/ReactCommon/{jsinspector-modern → react/utils}/Base64.h +2 -2
  104. package/package.json +11 -11
  105. package/scripts/cocoapods/utils.rb +1 -0
  106. package/scripts/react_native_pods.rb +1 -0
  107. package/scripts/replace-rncore-version.js +72 -15
  108. package/src/private/featureflags/ReactNativeFeatureFlags.js +26 -1
  109. package/src/private/featureflags/specs/NativeReactNativeFeatureFlags.js +6 -1
  110. package/src/private/setup/setUpDefaultReactNativeEnvironment.js +6 -0
@@ -4,7 +4,7 @@
4
4
  * This source code is licensed under the MIT license found in the
5
5
  * LICENSE file in the root directory of this source tree.
6
6
  *
7
- * @generated SignedSource<<669708c311abe9ffc8f7783219e2baad>>
7
+ * @generated SignedSource<<499aedb10bae64c096e7ad2e096bdd1f>>
8
8
  */
9
9
 
10
10
  /**
@@ -65,6 +65,7 @@ internal class ReactNativeFeatureFlagsLocalAccessor : ReactNativeFeatureFlagsAcc
65
65
  private var enableLayoutAnimationsOnIOSCache: Boolean? = null
66
66
  private var enableMainQueueCoordinatorOnIOSCache: Boolean? = null
67
67
  private var enableModuleArgumentNSNullConversionIOSCache: Boolean? = null
68
+ private var enableMutationObserverByDefaultCache: Boolean? = null
68
69
  private var enableNativeCSSParsingCache: Boolean? = null
69
70
  private var enableNetworkEventReportingCache: Boolean? = null
70
71
  private var enablePreparedTextLayoutCache: Boolean? = null
@@ -83,13 +84,17 @@ internal class ReactNativeFeatureFlagsLocalAccessor : ReactNativeFeatureFlagsAcc
83
84
  private var fixTextClippingAndroid15useBoundsForWidthCache: Boolean? = null
84
85
  private var fuseboxAssertSingleHostStateCache: Boolean? = null
85
86
  private var fuseboxEnabledReleaseCache: Boolean? = null
87
+ private var fuseboxFrameRecordingEnabledCache: Boolean? = null
86
88
  private var fuseboxNetworkInspectionEnabledCache: Boolean? = null
89
+ private var fuseboxScreenshotCaptureEnabledCache: Boolean? = null
87
90
  private var hideOffscreenVirtualViewsOnIOSCache: Boolean? = null
88
91
  private var overrideBySynchronousMountPropsAtMountingAndroidCache: Boolean? = null
89
92
  private var perfIssuesEnabledCache: Boolean? = null
90
93
  private var perfMonitorV2EnabledCache: Boolean? = null
91
94
  private var preparedTextCacheSizeCache: Double? = null
92
95
  private var preventShadowTreeCommitExhaustionCache: Boolean? = null
96
+ private var redBoxV2AndroidCache: Boolean? = null
97
+ private var redBoxV2IOSCache: Boolean? = null
93
98
  private var shouldPressibilityUseW3CPointerEventsForHoverCache: Boolean? = null
94
99
  private var shouldTriggerResponderTransferOnScrollAndroidCache: Boolean? = null
95
100
  private var skipActivityIdentityAssertionOnHostPauseCache: Boolean? = null
@@ -520,6 +525,16 @@ internal class ReactNativeFeatureFlagsLocalAccessor : ReactNativeFeatureFlagsAcc
520
525
  return cached
521
526
  }
522
527
 
528
+ override fun enableMutationObserverByDefault(): Boolean {
529
+ var cached = enableMutationObserverByDefaultCache
530
+ if (cached == null) {
531
+ cached = currentProvider.enableMutationObserverByDefault()
532
+ accessedFeatureFlags.add("enableMutationObserverByDefault")
533
+ enableMutationObserverByDefaultCache = cached
534
+ }
535
+ return cached
536
+ }
537
+
523
538
  override fun enableNativeCSSParsing(): Boolean {
524
539
  var cached = enableNativeCSSParsingCache
525
540
  if (cached == null) {
@@ -700,6 +715,16 @@ internal class ReactNativeFeatureFlagsLocalAccessor : ReactNativeFeatureFlagsAcc
700
715
  return cached
701
716
  }
702
717
 
718
+ override fun fuseboxFrameRecordingEnabled(): Boolean {
719
+ var cached = fuseboxFrameRecordingEnabledCache
720
+ if (cached == null) {
721
+ cached = currentProvider.fuseboxFrameRecordingEnabled()
722
+ accessedFeatureFlags.add("fuseboxFrameRecordingEnabled")
723
+ fuseboxFrameRecordingEnabledCache = cached
724
+ }
725
+ return cached
726
+ }
727
+
703
728
  override fun fuseboxNetworkInspectionEnabled(): Boolean {
704
729
  var cached = fuseboxNetworkInspectionEnabledCache
705
730
  if (cached == null) {
@@ -710,6 +735,16 @@ internal class ReactNativeFeatureFlagsLocalAccessor : ReactNativeFeatureFlagsAcc
710
735
  return cached
711
736
  }
712
737
 
738
+ override fun fuseboxScreenshotCaptureEnabled(): Boolean {
739
+ var cached = fuseboxScreenshotCaptureEnabledCache
740
+ if (cached == null) {
741
+ cached = currentProvider.fuseboxScreenshotCaptureEnabled()
742
+ accessedFeatureFlags.add("fuseboxScreenshotCaptureEnabled")
743
+ fuseboxScreenshotCaptureEnabledCache = cached
744
+ }
745
+ return cached
746
+ }
747
+
713
748
  override fun hideOffscreenVirtualViewsOnIOS(): Boolean {
714
749
  var cached = hideOffscreenVirtualViewsOnIOSCache
715
750
  if (cached == null) {
@@ -770,6 +805,26 @@ internal class ReactNativeFeatureFlagsLocalAccessor : ReactNativeFeatureFlagsAcc
770
805
  return cached
771
806
  }
772
807
 
808
+ override fun redBoxV2Android(): Boolean {
809
+ var cached = redBoxV2AndroidCache
810
+ if (cached == null) {
811
+ cached = currentProvider.redBoxV2Android()
812
+ accessedFeatureFlags.add("redBoxV2Android")
813
+ redBoxV2AndroidCache = cached
814
+ }
815
+ return cached
816
+ }
817
+
818
+ override fun redBoxV2IOS(): Boolean {
819
+ var cached = redBoxV2IOSCache
820
+ if (cached == null) {
821
+ cached = currentProvider.redBoxV2IOS()
822
+ accessedFeatureFlags.add("redBoxV2IOS")
823
+ redBoxV2IOSCache = cached
824
+ }
825
+ return cached
826
+ }
827
+
773
828
  override fun shouldPressibilityUseW3CPointerEventsForHover(): Boolean {
774
829
  var cached = shouldPressibilityUseW3CPointerEventsForHoverCache
775
830
  if (cached == null) {
@@ -4,7 +4,7 @@
4
4
  * This source code is licensed under the MIT license found in the
5
5
  * LICENSE file in the root directory of this source tree.
6
6
  *
7
- * @generated SignedSource<<db06b64a8d1b9ab99b368fea41185d62>>
7
+ * @generated SignedSource<<4ed94743d9eafd0be32bb04471a18fc6>>
8
8
  */
9
9
 
10
10
  /**
@@ -105,6 +105,8 @@ public interface ReactNativeFeatureFlagsProvider {
105
105
 
106
106
  @DoNotStrip public fun enableModuleArgumentNSNullConversionIOS(): Boolean
107
107
 
108
+ @DoNotStrip public fun enableMutationObserverByDefault(): Boolean
109
+
108
110
  @DoNotStrip public fun enableNativeCSSParsing(): Boolean
109
111
 
110
112
  @DoNotStrip public fun enableNetworkEventReporting(): Boolean
@@ -141,8 +143,12 @@ public interface ReactNativeFeatureFlagsProvider {
141
143
 
142
144
  @DoNotStrip public fun fuseboxEnabledRelease(): Boolean
143
145
 
146
+ @DoNotStrip public fun fuseboxFrameRecordingEnabled(): Boolean
147
+
144
148
  @DoNotStrip public fun fuseboxNetworkInspectionEnabled(): Boolean
145
149
 
150
+ @DoNotStrip public fun fuseboxScreenshotCaptureEnabled(): Boolean
151
+
146
152
  @DoNotStrip public fun hideOffscreenVirtualViewsOnIOS(): Boolean
147
153
 
148
154
  @DoNotStrip public fun overrideBySynchronousMountPropsAtMountingAndroid(): Boolean
@@ -155,6 +161,10 @@ public interface ReactNativeFeatureFlagsProvider {
155
161
 
156
162
  @DoNotStrip public fun preventShadowTreeCommitExhaustion(): Boolean
157
163
 
164
+ @DoNotStrip public fun redBoxV2Android(): Boolean
165
+
166
+ @DoNotStrip public fun redBoxV2IOS(): Boolean
167
+
158
168
  @DoNotStrip public fun shouldPressibilityUseW3CPointerEventsForHover(): Boolean
159
169
 
160
170
  @DoNotStrip public fun shouldTriggerResponderTransferOnScrollAndroid(): Boolean
@@ -23,6 +23,45 @@ public object PerformanceTracer {
23
23
  SoLoader.loadLibrary("react_performancetracerjni")
24
24
  }
25
25
 
26
+ public fun <T> trace(name: String, block: () -> T): T {
27
+ return trace(name, null /* track */, null /* trackGroup */, null /* color */, block)
28
+ }
29
+
30
+ public fun <T> trace(name: String, track: String, block: () -> T): T {
31
+ return trace(name, track, null /* trackGroup */, null /* color */, block)
32
+ }
33
+
34
+ public fun <T> trace(name: String, track: String, trackGroup: String, block: () -> T): T {
35
+ return trace(name, track, trackGroup, null /* color */, block)
36
+ }
37
+
38
+ public fun <T> trace(
39
+ name: String,
40
+ track: String?,
41
+ trackGroup: String?,
42
+ color: String?,
43
+ block: () -> T,
44
+ ): T {
45
+ if (!isTracing()) {
46
+ return block()
47
+ }
48
+
49
+ val startTimeNanos = java.lang.System.nanoTime()
50
+ try {
51
+ return block()
52
+ } finally {
53
+ val endTimeNanos = java.lang.System.nanoTime()
54
+ reportTimeStamp(
55
+ name,
56
+ startTimeNanos,
57
+ endTimeNanos,
58
+ track,
59
+ trackGroup,
60
+ color,
61
+ )
62
+ }
63
+ }
64
+
26
65
  /** Callback interface for tracing state changes. */
27
66
  @DoNotStrip
28
67
  public interface TracingStateCallback {
@@ -14,7 +14,7 @@ public object ReactNativeVersion {
14
14
  public val VERSION: Map<String, Any?> = mapOf(
15
15
  "major" to 0,
16
16
  "minor" to 85,
17
- "patch" to 2,
17
+ "patch" to 3,
18
18
  "prerelease" to "0"
19
19
  )
20
20
  }
@@ -12,6 +12,7 @@ import android.content.Context
12
12
  import android.content.Intent
13
13
  import android.nfc.NfcAdapter
14
14
  import android.os.Bundle
15
+ import androidx.core.graphics.createBitmap
15
16
  import com.facebook.common.logging.FLog
16
17
  import com.facebook.infer.annotation.Assertions
17
18
  import com.facebook.infer.annotation.ThreadConfined
@@ -447,6 +448,43 @@ public class ReactHostImpl(
447
448
  InspectorNetworkHelper.loadNetworkResource(url, listener)
448
449
  }
449
450
 
451
+ @DoNotStrip
452
+ private fun captureScreenshot(format: String, quality: Int): String? {
453
+ val activity = currentActivity ?: return null
454
+ val window = activity.window ?: return null
455
+ val decorView = window.decorView.rootView
456
+
457
+ val width = decorView.width
458
+ val height = decorView.height
459
+ if (width <= 0 || height <= 0) {
460
+ return null
461
+ }
462
+
463
+ val bitmap = createBitmap(width, height)
464
+ val canvas = android.graphics.Canvas(bitmap)
465
+ decorView.draw(canvas)
466
+
467
+ val outputStream = java.io.ByteArrayOutputStream()
468
+ val compressFormat =
469
+ when (format) {
470
+ "jpeg" -> android.graphics.Bitmap.CompressFormat.JPEG
471
+ "webp" ->
472
+ if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.R) {
473
+ android.graphics.Bitmap.CompressFormat.WEBP_LOSSY
474
+ } else {
475
+ @Suppress("DEPRECATION") android.graphics.Bitmap.CompressFormat.WEBP
476
+ }
477
+ else -> android.graphics.Bitmap.CompressFormat.PNG
478
+ }
479
+ val compressQuality = if (quality in 0..100) quality else 80
480
+
481
+ bitmap.compress(compressFormat, compressQuality, outputStream)
482
+ bitmap.recycle()
483
+
484
+ val bytes = outputStream.toByteArray()
485
+ return android.util.Base64.encodeToString(bytes, android.util.Base64.NO_WRAP)
486
+ }
487
+
450
488
  /**
451
489
  * Entrypoint to destroy the ReactInstance. If the ReactInstance is reloading, will wait until
452
490
  * reload is finished, before destroying.
@@ -1565,16 +1603,18 @@ public class ReactHostImpl(
1565
1603
  when (state) {
1566
1604
  TracingState.ENABLED_IN_BACKGROUND_MODE,
1567
1605
  TracingState.ENABLED_IN_CDP_MODE -> {
1568
- val observer =
1569
- FrameTimingsObserver(
1570
- _screenshotsEnabled,
1571
- { frameTimingsSequence ->
1572
- inspectorTarget.recordFrameTimings(frameTimingsSequence)
1573
- },
1574
- )
1575
- observer.setCurrentWindow(currentActivity?.window)
1576
- observer.start()
1577
- frameTimingsObserver = observer
1606
+ if (InspectorFlags.getFrameRecordingEnabled()) {
1607
+ val observer =
1608
+ FrameTimingsObserver(
1609
+ _screenshotsEnabled,
1610
+ { frameTimingsSequence ->
1611
+ inspectorTarget.recordFrameTimings(frameTimingsSequence)
1612
+ },
1613
+ )
1614
+ observer.setCurrentWindow(currentActivity?.window)
1615
+ observer.start()
1616
+ frameTimingsObserver = observer
1617
+ }
1578
1618
  }
1579
1619
  TracingState.DISABLED -> {
1580
1620
  frameTimingsObserver?.stop()
@@ -117,6 +117,7 @@ add_react_common_subdir(react/renderer/components/safeareaview)
117
117
  add_react_common_subdir(react/renderer/leakchecker)
118
118
  add_react_common_subdir(react/renderer/observers/events)
119
119
  add_react_common_subdir(react/renderer/observers/intersection)
120
+ add_react_common_subdir(react/renderer/observers/mutation)
120
121
  add_react_common_subdir(react/renderer/textlayoutmanager)
121
122
  add_react_common_subdir(react/utils)
122
123
  add_react_common_subdir(react/bridging)
@@ -128,6 +129,7 @@ add_react_common_subdir(react/nativemodule/featureflags)
128
129
  add_react_common_subdir(react/nativemodule/microtasks)
129
130
  add_react_common_subdir(react/nativemodule/idlecallbacks)
130
131
  add_react_common_subdir(react/nativemodule/intersectionobserver)
132
+ add_react_common_subdir(react/nativemodule/mutationobserver)
131
133
  add_react_common_subdir(react/nativemodule/webperformance)
132
134
  add_react_common_subdir(react/networking)
133
135
  add_react_common_subdir(jserrorhandler)
@@ -197,6 +199,7 @@ add_library(reactnative
197
199
  $<TARGET_OBJECTS:react_nativemodule_idlecallbacks>
198
200
  $<TARGET_OBJECTS:react_nativemodule_intersectionobserver>
199
201
  $<TARGET_OBJECTS:react_nativemodule_microtasks>
202
+ $<TARGET_OBJECTS:react_nativemodule_mutationobserver>
200
203
  $<TARGET_OBJECTS:react_nativemodule_webperformance>
201
204
  $<TARGET_OBJECTS:react_networking>
202
205
  $<TARGET_OBJECTS:react_newarchdefaults>
@@ -219,6 +222,7 @@ add_library(reactnative
219
222
  $<TARGET_OBJECTS:react_renderer_mounting>
220
223
  $<TARGET_OBJECTS:react_renderer_observers_events>
221
224
  $<TARGET_OBJECTS:react_renderer_observers_intersection>
225
+ $<TARGET_OBJECTS:react_renderer_observers_mutation>
222
226
  $<TARGET_OBJECTS:react_renderer_runtimescheduler>
223
227
  $<TARGET_OBJECTS:react_renderer_scheduler>
224
228
  $<TARGET_OBJECTS:react_renderer_telemetry>
@@ -292,6 +296,7 @@ target_include_directories(reactnative
292
296
  $<TARGET_PROPERTY:react_nativemodule_idlecallbacks,INTERFACE_INCLUDE_DIRECTORIES>
293
297
  $<TARGET_PROPERTY:react_nativemodule_intersectionobserver,INTERFACE_INCLUDE_DIRECTORIES>
294
298
  $<TARGET_PROPERTY:react_nativemodule_microtasks,INTERFACE_INCLUDE_DIRECTORIES>
299
+ $<TARGET_PROPERTY:react_nativemodule_mutationobserver,INTERFACE_INCLUDE_DIRECTORIES>
295
300
  $<TARGET_PROPERTY:react_nativemodule_webperformance,INTERFACE_INCLUDE_DIRECTORIES>
296
301
  $<TARGET_PROPERTY:react_networking,INTERFACE_INCLUDE_DIRECTORIES>
297
302
  $<TARGET_PROPERTY:react_newarchdefaults,INTERFACE_INCLUDE_DIRECTORIES>
@@ -315,6 +320,8 @@ target_include_directories(reactnative
315
320
  $<TARGET_PROPERTY:react_renderer_mapbuffer,INTERFACE_INCLUDE_DIRECTORIES>
316
321
  $<TARGET_PROPERTY:react_renderer_mounting,INTERFACE_INCLUDE_DIRECTORIES>
317
322
  $<TARGET_PROPERTY:react_renderer_observers_events,INTERFACE_INCLUDE_DIRECTORIES>
323
+ $<TARGET_PROPERTY:react_renderer_observers_intersection,INTERFACE_INCLUDE_DIRECTORIES>
324
+ $<TARGET_PROPERTY:react_renderer_observers_mutation,INTERFACE_INCLUDE_DIRECTORIES>
318
325
  $<TARGET_PROPERTY:react_renderer_runtimescheduler,INTERFACE_INCLUDE_DIRECTORIES>
319
326
  $<TARGET_PROPERTY:react_renderer_scheduler,INTERFACE_INCLUDE_DIRECTORIES>
320
327
  $<TARGET_PROPERTY:react_renderer_telemetry,INTERFACE_INCLUDE_DIRECTORIES>
@@ -11,6 +11,12 @@
11
11
 
12
12
  namespace facebook::react::jsinspector_modern {
13
13
 
14
+ bool JInspectorFlags::getScreenshotCaptureEnabled(
15
+ jni::alias_ref<jclass> /*unused*/) {
16
+ auto& inspectorFlags = InspectorFlags::getInstance();
17
+ return inspectorFlags.getScreenshotCaptureEnabled();
18
+ }
19
+
14
20
  bool JInspectorFlags::getFuseboxEnabled(jni::alias_ref<jclass> /*unused*/) {
15
21
  auto& inspectorFlags = InspectorFlags::getInstance();
16
22
  return inspectorFlags.getFuseboxEnabled();
@@ -21,7 +27,18 @@ bool JInspectorFlags::getIsProfilingBuild(jni::alias_ref<jclass> /*unused*/) {
21
27
  return inspectorFlags.getIsProfilingBuild();
22
28
  }
23
29
 
30
+ bool JInspectorFlags::getFrameRecordingEnabled(
31
+ jni::alias_ref<jclass> /*unused*/) {
32
+ auto& inspectorFlags = InspectorFlags::getInstance();
33
+ return inspectorFlags.getFrameRecordingEnabled();
34
+ }
35
+
24
36
  void JInspectorFlags::registerNatives() {
37
+ javaClassLocal()->registerNatives({
38
+ makeNativeMethod(
39
+ "getScreenshotCaptureEnabled",
40
+ JInspectorFlags::getScreenshotCaptureEnabled),
41
+ });
25
42
  javaClassLocal()->registerNatives({
26
43
  makeNativeMethod("getFuseboxEnabled", JInspectorFlags::getFuseboxEnabled),
27
44
  });
@@ -29,6 +46,11 @@ void JInspectorFlags::registerNatives() {
29
46
  makeNativeMethod(
30
47
  "getIsProfilingBuild", JInspectorFlags::getIsProfilingBuild),
31
48
  });
49
+ javaClassLocal()->registerNatives({
50
+ makeNativeMethod(
51
+ "getFrameRecordingEnabled",
52
+ JInspectorFlags::getFrameRecordingEnabled),
53
+ });
32
54
  }
33
55
 
34
56
  } // namespace facebook::react::jsinspector_modern
@@ -18,8 +18,10 @@ class JInspectorFlags : public jni::JavaClass<JInspectorFlags> {
18
18
  public:
19
19
  static constexpr auto kJavaDescriptor = "Lcom/facebook/react/devsupport/InspectorFlags;";
20
20
 
21
+ static bool getScreenshotCaptureEnabled(jni::alias_ref<jclass> /*unused*/);
21
22
  static bool getFuseboxEnabled(jni::alias_ref<jclass> /*unused*/);
22
23
  static bool getIsProfilingBuild(jni::alias_ref<jclass> /*unused*/);
24
+ static bool getFrameRecordingEnabled(jni::alias_ref<jclass> /*unused*/);
23
25
 
24
26
  static void registerNatives();
25
27
 
@@ -4,7 +4,7 @@
4
4
  * This source code is licensed under the MIT license found in the
5
5
  * LICENSE file in the root directory of this source tree.
6
6
  *
7
- * @generated SignedSource<<0b95d68522d63d51d3e524aeecff246a>>
7
+ * @generated SignedSource<<fbfa1db0da68d08e055002244a6847de>>
8
8
  */
9
9
 
10
10
  /**
@@ -285,6 +285,12 @@ class ReactNativeFeatureFlagsJavaProvider
285
285
  return method(javaProvider_);
286
286
  }
287
287
 
288
+ bool enableMutationObserverByDefault() override {
289
+ static const auto method =
290
+ getReactNativeFeatureFlagsProviderJavaClass()->getMethod<jboolean()>("enableMutationObserverByDefault");
291
+ return method(javaProvider_);
292
+ }
293
+
288
294
  bool enableNativeCSSParsing() override {
289
295
  static const auto method =
290
296
  getReactNativeFeatureFlagsProviderJavaClass()->getMethod<jboolean()>("enableNativeCSSParsing");
@@ -393,12 +399,24 @@ class ReactNativeFeatureFlagsJavaProvider
393
399
  return method(javaProvider_);
394
400
  }
395
401
 
402
+ bool fuseboxFrameRecordingEnabled() override {
403
+ static const auto method =
404
+ getReactNativeFeatureFlagsProviderJavaClass()->getMethod<jboolean()>("fuseboxFrameRecordingEnabled");
405
+ return method(javaProvider_);
406
+ }
407
+
396
408
  bool fuseboxNetworkInspectionEnabled() override {
397
409
  static const auto method =
398
410
  getReactNativeFeatureFlagsProviderJavaClass()->getMethod<jboolean()>("fuseboxNetworkInspectionEnabled");
399
411
  return method(javaProvider_);
400
412
  }
401
413
 
414
+ bool fuseboxScreenshotCaptureEnabled() override {
415
+ static const auto method =
416
+ getReactNativeFeatureFlagsProviderJavaClass()->getMethod<jboolean()>("fuseboxScreenshotCaptureEnabled");
417
+ return method(javaProvider_);
418
+ }
419
+
402
420
  bool hideOffscreenVirtualViewsOnIOS() override {
403
421
  static const auto method =
404
422
  getReactNativeFeatureFlagsProviderJavaClass()->getMethod<jboolean()>("hideOffscreenVirtualViewsOnIOS");
@@ -435,6 +453,18 @@ class ReactNativeFeatureFlagsJavaProvider
435
453
  return method(javaProvider_);
436
454
  }
437
455
 
456
+ bool redBoxV2Android() override {
457
+ static const auto method =
458
+ getReactNativeFeatureFlagsProviderJavaClass()->getMethod<jboolean()>("redBoxV2Android");
459
+ return method(javaProvider_);
460
+ }
461
+
462
+ bool redBoxV2IOS() override {
463
+ static const auto method =
464
+ getReactNativeFeatureFlagsProviderJavaClass()->getMethod<jboolean()>("redBoxV2IOS");
465
+ return method(javaProvider_);
466
+ }
467
+
438
468
  bool shouldPressibilityUseW3CPointerEventsForHover() override {
439
469
  static const auto method =
440
470
  getReactNativeFeatureFlagsProviderJavaClass()->getMethod<jboolean()>("shouldPressibilityUseW3CPointerEventsForHover");
@@ -758,6 +788,11 @@ bool JReactNativeFeatureFlagsCxxInterop::enableModuleArgumentNSNullConversionIOS
758
788
  return ReactNativeFeatureFlags::enableModuleArgumentNSNullConversionIOS();
759
789
  }
760
790
 
791
+ bool JReactNativeFeatureFlagsCxxInterop::enableMutationObserverByDefault(
792
+ facebook::jni::alias_ref<JReactNativeFeatureFlagsCxxInterop> /*unused*/) {
793
+ return ReactNativeFeatureFlags::enableMutationObserverByDefault();
794
+ }
795
+
761
796
  bool JReactNativeFeatureFlagsCxxInterop::enableNativeCSSParsing(
762
797
  facebook::jni::alias_ref<JReactNativeFeatureFlagsCxxInterop> /*unused*/) {
763
798
  return ReactNativeFeatureFlags::enableNativeCSSParsing();
@@ -848,11 +883,21 @@ bool JReactNativeFeatureFlagsCxxInterop::fuseboxEnabledRelease(
848
883
  return ReactNativeFeatureFlags::fuseboxEnabledRelease();
849
884
  }
850
885
 
886
+ bool JReactNativeFeatureFlagsCxxInterop::fuseboxFrameRecordingEnabled(
887
+ facebook::jni::alias_ref<JReactNativeFeatureFlagsCxxInterop> /*unused*/) {
888
+ return ReactNativeFeatureFlags::fuseboxFrameRecordingEnabled();
889
+ }
890
+
851
891
  bool JReactNativeFeatureFlagsCxxInterop::fuseboxNetworkInspectionEnabled(
852
892
  facebook::jni::alias_ref<JReactNativeFeatureFlagsCxxInterop> /*unused*/) {
853
893
  return ReactNativeFeatureFlags::fuseboxNetworkInspectionEnabled();
854
894
  }
855
895
 
896
+ bool JReactNativeFeatureFlagsCxxInterop::fuseboxScreenshotCaptureEnabled(
897
+ facebook::jni::alias_ref<JReactNativeFeatureFlagsCxxInterop> /*unused*/) {
898
+ return ReactNativeFeatureFlags::fuseboxScreenshotCaptureEnabled();
899
+ }
900
+
856
901
  bool JReactNativeFeatureFlagsCxxInterop::hideOffscreenVirtualViewsOnIOS(
857
902
  facebook::jni::alias_ref<JReactNativeFeatureFlagsCxxInterop> /*unused*/) {
858
903
  return ReactNativeFeatureFlags::hideOffscreenVirtualViewsOnIOS();
@@ -883,6 +928,16 @@ bool JReactNativeFeatureFlagsCxxInterop::preventShadowTreeCommitExhaustion(
883
928
  return ReactNativeFeatureFlags::preventShadowTreeCommitExhaustion();
884
929
  }
885
930
 
931
+ bool JReactNativeFeatureFlagsCxxInterop::redBoxV2Android(
932
+ facebook::jni::alias_ref<JReactNativeFeatureFlagsCxxInterop> /*unused*/) {
933
+ return ReactNativeFeatureFlags::redBoxV2Android();
934
+ }
935
+
936
+ bool JReactNativeFeatureFlagsCxxInterop::redBoxV2IOS(
937
+ facebook::jni::alias_ref<JReactNativeFeatureFlagsCxxInterop> /*unused*/) {
938
+ return ReactNativeFeatureFlags::redBoxV2IOS();
939
+ }
940
+
886
941
  bool JReactNativeFeatureFlagsCxxInterop::shouldPressibilityUseW3CPointerEventsForHover(
887
942
  facebook::jni::alias_ref<JReactNativeFeatureFlagsCxxInterop> /*unused*/) {
888
943
  return ReactNativeFeatureFlags::shouldPressibilityUseW3CPointerEventsForHover();
@@ -1132,6 +1187,9 @@ void JReactNativeFeatureFlagsCxxInterop::registerNatives() {
1132
1187
  makeNativeMethod(
1133
1188
  "enableModuleArgumentNSNullConversionIOS",
1134
1189
  JReactNativeFeatureFlagsCxxInterop::enableModuleArgumentNSNullConversionIOS),
1190
+ makeNativeMethod(
1191
+ "enableMutationObserverByDefault",
1192
+ JReactNativeFeatureFlagsCxxInterop::enableMutationObserverByDefault),
1135
1193
  makeNativeMethod(
1136
1194
  "enableNativeCSSParsing",
1137
1195
  JReactNativeFeatureFlagsCxxInterop::enableNativeCSSParsing),
@@ -1186,9 +1244,15 @@ void JReactNativeFeatureFlagsCxxInterop::registerNatives() {
1186
1244
  makeNativeMethod(
1187
1245
  "fuseboxEnabledRelease",
1188
1246
  JReactNativeFeatureFlagsCxxInterop::fuseboxEnabledRelease),
1247
+ makeNativeMethod(
1248
+ "fuseboxFrameRecordingEnabled",
1249
+ JReactNativeFeatureFlagsCxxInterop::fuseboxFrameRecordingEnabled),
1189
1250
  makeNativeMethod(
1190
1251
  "fuseboxNetworkInspectionEnabled",
1191
1252
  JReactNativeFeatureFlagsCxxInterop::fuseboxNetworkInspectionEnabled),
1253
+ makeNativeMethod(
1254
+ "fuseboxScreenshotCaptureEnabled",
1255
+ JReactNativeFeatureFlagsCxxInterop::fuseboxScreenshotCaptureEnabled),
1192
1256
  makeNativeMethod(
1193
1257
  "hideOffscreenVirtualViewsOnIOS",
1194
1258
  JReactNativeFeatureFlagsCxxInterop::hideOffscreenVirtualViewsOnIOS),
@@ -1207,6 +1271,12 @@ void JReactNativeFeatureFlagsCxxInterop::registerNatives() {
1207
1271
  makeNativeMethod(
1208
1272
  "preventShadowTreeCommitExhaustion",
1209
1273
  JReactNativeFeatureFlagsCxxInterop::preventShadowTreeCommitExhaustion),
1274
+ makeNativeMethod(
1275
+ "redBoxV2Android",
1276
+ JReactNativeFeatureFlagsCxxInterop::redBoxV2Android),
1277
+ makeNativeMethod(
1278
+ "redBoxV2IOS",
1279
+ JReactNativeFeatureFlagsCxxInterop::redBoxV2IOS),
1210
1280
  makeNativeMethod(
1211
1281
  "shouldPressibilityUseW3CPointerEventsForHover",
1212
1282
  JReactNativeFeatureFlagsCxxInterop::shouldPressibilityUseW3CPointerEventsForHover),
@@ -4,7 +4,7 @@
4
4
  * This source code is licensed under the MIT license found in the
5
5
  * LICENSE file in the root directory of this source tree.
6
6
  *
7
- * @generated SignedSource<<6b7e2af51ba9d64ae4e474dfa104a7c3>>
7
+ * @generated SignedSource<<707465eb2a901c79a91681f2bcec1972>>
8
8
  */
9
9
 
10
10
  /**
@@ -153,6 +153,9 @@ class JReactNativeFeatureFlagsCxxInterop
153
153
  static bool enableModuleArgumentNSNullConversionIOS(
154
154
  facebook::jni::alias_ref<JReactNativeFeatureFlagsCxxInterop>);
155
155
 
156
+ static bool enableMutationObserverByDefault(
157
+ facebook::jni::alias_ref<JReactNativeFeatureFlagsCxxInterop>);
158
+
156
159
  static bool enableNativeCSSParsing(
157
160
  facebook::jni::alias_ref<JReactNativeFeatureFlagsCxxInterop>);
158
161
 
@@ -207,9 +210,15 @@ class JReactNativeFeatureFlagsCxxInterop
207
210
  static bool fuseboxEnabledRelease(
208
211
  facebook::jni::alias_ref<JReactNativeFeatureFlagsCxxInterop>);
209
212
 
213
+ static bool fuseboxFrameRecordingEnabled(
214
+ facebook::jni::alias_ref<JReactNativeFeatureFlagsCxxInterop>);
215
+
210
216
  static bool fuseboxNetworkInspectionEnabled(
211
217
  facebook::jni::alias_ref<JReactNativeFeatureFlagsCxxInterop>);
212
218
 
219
+ static bool fuseboxScreenshotCaptureEnabled(
220
+ facebook::jni::alias_ref<JReactNativeFeatureFlagsCxxInterop>);
221
+
213
222
  static bool hideOffscreenVirtualViewsOnIOS(
214
223
  facebook::jni::alias_ref<JReactNativeFeatureFlagsCxxInterop>);
215
224
 
@@ -228,6 +237,12 @@ class JReactNativeFeatureFlagsCxxInterop
228
237
  static bool preventShadowTreeCommitExhaustion(
229
238
  facebook::jni::alias_ref<JReactNativeFeatureFlagsCxxInterop>);
230
239
 
240
+ static bool redBoxV2Android(
241
+ facebook::jni::alias_ref<JReactNativeFeatureFlagsCxxInterop>);
242
+
243
+ static bool redBoxV2IOS(
244
+ facebook::jni::alias_ref<JReactNativeFeatureFlagsCxxInterop>);
245
+
231
246
  static bool shouldPressibilityUseW3CPointerEventsForHover(
232
247
  facebook::jni::alias_ref<JReactNativeFeatureFlagsCxxInterop>);
233
248
 
@@ -145,6 +145,20 @@ void JReactHostInspectorTarget::loadNetworkResource(
145
145
  }
146
146
  }
147
147
 
148
+ std::optional<std::string> JReactHostInspectorTarget::captureScreenshot(
149
+ const jsinspector_modern::HostTargetDelegate::PageCaptureScreenshotRequest&
150
+ request) {
151
+ if (auto javaReactHostImplStrong = javaReactHostImpl_->get()) {
152
+ std::string format = request.format.value_or("png");
153
+ int quality = request.quality.value_or(-1);
154
+ auto result = javaReactHostImplStrong->captureScreenshot(format, quality);
155
+ if (result) {
156
+ return result->toStdString();
157
+ }
158
+ }
159
+ return std::nullopt;
160
+ }
161
+
148
162
  HostTarget* JReactHostInspectorTarget::getInspectorTarget() {
149
163
  return inspectorTarget_ ? inspectorTarget_.get() : nullptr;
150
164
  }
@@ -7,6 +7,7 @@
7
7
 
8
8
  #pragma once
9
9
 
10
+ #include <fbjni/ByteBuffer.h>
10
11
  #include <fbjni/fbjni.h>
11
12
 
12
13
  #include <jsinspector-modern/HostTarget.h>
@@ -98,13 +99,17 @@ struct JFrameTimingSequence : public jni::JavaClass<JFrameTimingSequence> {
98
99
  std::chrono::steady_clock::time_point(std::chrono::nanoseconds(getFieldValue(field))));
99
100
  }
100
101
 
101
- std::optional<std::string> getScreenshot() const
102
+ std::optional<std::vector<uint8_t>> getScreenshot() const
102
103
  {
103
- auto field = javaClassStatic()->getField<jstring>("screenshot");
104
+ auto field = javaClassStatic()->getField<jbyteArray>("screenshot");
104
105
  auto javaScreenshot = getFieldValue(field);
105
106
  if (javaScreenshot) {
106
- auto jstring = jni::static_ref_cast<jni::JString>(javaScreenshot);
107
- return jstring->toStdString();
107
+ auto size = static_cast<size_t>(javaScreenshot->size());
108
+ if (size > 0) {
109
+ std::vector<uint8_t> result(size);
110
+ javaScreenshot->getRegion(0, javaScreenshot->size(), reinterpret_cast<jbyte *>(result.data()));
111
+ return result;
112
+ }
108
113
  }
109
114
  return std::nullopt;
110
115
  }
@@ -140,6 +145,13 @@ struct JReactHostImpl : public jni::JavaClass<JReactHostImpl> {
140
145
  "loadNetworkResource");
141
146
  return method(self(), jni::make_jstring(url), listener);
142
147
  }
148
+
149
+ jni::local_ref<jni::JString> captureScreenshot(const std::string &format, int quality) const
150
+ {
151
+ auto method = javaClassStatic()->getMethod<jni::local_ref<jni::JString>(jni::local_ref<jni::JString>, jint)>(
152
+ "captureScreenshot");
153
+ return method(self(), jni::make_jstring(format), static_cast<jint>(quality));
154
+ }
143
155
  };
144
156
 
145
157
  /**
@@ -270,6 +282,8 @@ class JReactHostInspectorTarget : public jni::HybridClass<JReactHostInspectorTar
270
282
  void loadNetworkResource(
271
283
  const jsinspector_modern::LoadNetworkResourceRequest &params,
272
284
  jsinspector_modern::ScopedExecutor<jsinspector_modern::NetworkRequestListener> executor) override;
285
+ std::optional<std::string> captureScreenshot(
286
+ const jsinspector_modern::HostTargetDelegate::PageCaptureScreenshotRequest &request) override;
273
287
  jsinspector_modern::HostTargetTracingDelegate *getTracingDelegate() override;
274
288
 
275
289
  private: