react-native 0.85.2 → 0.85.3

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 (108) 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 -454
  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/src/main/java/com/facebook/react/devsupport/InspectorFlags.kt +4 -0
  24. package/ReactAndroid/src/main/java/com/facebook/react/devsupport/inspector/FrameTimingSequence.kt +1 -1
  25. package/ReactAndroid/src/main/java/com/facebook/react/devsupport/inspector/FrameTimingsObserver.kt +127 -26
  26. package/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlags.kt +31 -1
  27. package/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsCxxAccessor.kt +51 -1
  28. package/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsCxxInterop.kt +11 -1
  29. package/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsDefaults.kt +11 -1
  30. package/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsLocalAccessor.kt +56 -1
  31. package/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsProvider.kt +11 -1
  32. package/ReactAndroid/src/main/java/com/facebook/react/internal/tracing/PerformanceTracer.kt +39 -0
  33. package/ReactAndroid/src/main/java/com/facebook/react/modules/systeminfo/ReactNativeVersion.kt +1 -1
  34. package/ReactAndroid/src/main/java/com/facebook/react/runtime/ReactHostImpl.kt +50 -10
  35. package/ReactAndroid/src/main/jni/CMakeLists.txt +7 -0
  36. package/ReactAndroid/src/main/jni/react/devsupport/JInspectorFlags.cpp +22 -0
  37. package/ReactAndroid/src/main/jni/react/devsupport/JInspectorFlags.h +2 -0
  38. package/ReactAndroid/src/main/jni/react/featureflags/JReactNativeFeatureFlagsCxxInterop.cpp +71 -1
  39. package/ReactAndroid/src/main/jni/react/featureflags/JReactNativeFeatureFlagsCxxInterop.h +16 -1
  40. package/ReactAndroid/src/main/jni/react/runtime/jni/JReactHostInspectorTarget.cpp +14 -0
  41. package/ReactAndroid/src/main/jni/react/runtime/jni/JReactHostInspectorTarget.h +18 -4
  42. package/ReactCommon/React-Fabric.podspec +6 -0
  43. package/ReactCommon/cxxreact/ReactNativeVersion.h +2 -2
  44. package/ReactCommon/jsinspector-modern/HostAgent.cpp +36 -0
  45. package/ReactCommon/jsinspector-modern/HostTarget.cpp +7 -1
  46. package/ReactCommon/jsinspector-modern/HostTarget.h +25 -0
  47. package/ReactCommon/jsinspector-modern/HostTargetTracing.cpp +1 -1
  48. package/ReactCommon/jsinspector-modern/HostTargetTracing.h +4 -4
  49. package/ReactCommon/jsinspector-modern/InspectorFlags.cpp +12 -0
  50. package/ReactCommon/jsinspector-modern/InspectorFlags.h +12 -0
  51. package/ReactCommon/jsinspector-modern/NetworkIOAgent.cpp +1 -1
  52. package/ReactCommon/jsinspector-modern/RuntimeAgent.cpp +19 -0
  53. package/ReactCommon/jsinspector-modern/RuntimeAgent.h +7 -0
  54. package/ReactCommon/jsinspector-modern/RuntimeTarget.cpp +33 -0
  55. package/ReactCommon/jsinspector-modern/RuntimeTarget.h +6 -0
  56. package/ReactCommon/jsinspector-modern/tests/HostTargetTest.cpp +12 -0
  57. package/ReactCommon/jsinspector-modern/tests/InspectorMocks.h +3 -2
  58. package/ReactCommon/jsinspector-modern/tests/JsiIntegrationTest.cpp +1 -0
  59. package/ReactCommon/jsinspector-modern/tests/NetworkReporterTest.cpp +1 -1
  60. package/ReactCommon/jsinspector-modern/tests/TracingTest.cpp +1 -1
  61. package/ReactCommon/jsinspector-modern/tests/utils/InspectorFlagOverridesGuard.cpp +10 -0
  62. package/ReactCommon/jsinspector-modern/tests/utils/InspectorFlagOverridesGuard.h +3 -1
  63. package/ReactCommon/jsinspector-modern/tracing/CMakeLists.txt +1 -0
  64. package/ReactCommon/jsinspector-modern/tracing/FrameTimingSequence.h +7 -3
  65. package/ReactCommon/jsinspector-modern/tracing/HostTracingProfileSerializer.cpp +52 -29
  66. package/ReactCommon/jsinspector-modern/tracing/HostTracingProfileSerializer.h +6 -6
  67. package/ReactCommon/jsinspector-modern/tracing/PerformanceTracerSection.h +113 -0
  68. package/ReactCommon/jsinspector-modern/tracing/React-jsinspectortracing.podspec +1 -0
  69. package/ReactCommon/jsinspector-modern/tracing/TraceEventGenerator.cpp +12 -5
  70. package/ReactCommon/jsinspector-modern/tracing/TraceEventGenerator.h +3 -1
  71. package/ReactCommon/jsinspector-modern/tracing/TraceEventSerializer.cpp +42 -0
  72. package/ReactCommon/jsinspector-modern/tracing/TraceEventSerializer.h +7 -0
  73. package/ReactCommon/react/debug/CMakeLists.txt +2 -1
  74. package/ReactCommon/react/debug/React-debug.podspec +7 -1
  75. package/ReactCommon/react/debug/redbox/AnsiParser.cpp +139 -0
  76. package/ReactCommon/react/debug/redbox/AnsiParser.h +35 -0
  77. package/ReactCommon/react/debug/redbox/JscSafeUrl.cpp +179 -0
  78. package/ReactCommon/react/debug/redbox/JscSafeUrl.h +27 -0
  79. package/ReactCommon/react/debug/redbox/RedBoxErrorParser.cpp +171 -0
  80. package/ReactCommon/react/debug/redbox/RedBoxErrorParser.h +40 -0
  81. package/ReactCommon/react/debug/redbox/tests/AnsiParserTest.cpp +97 -0
  82. package/ReactCommon/react/debug/redbox/tests/JscSafeUrlTest.cpp +173 -0
  83. package/ReactCommon/react/debug/redbox/tests/RedBoxErrorParserTest.cpp +107 -0
  84. package/ReactCommon/react/featureflags/ReactNativeFeatureFlags.cpp +21 -1
  85. package/ReactCommon/react/featureflags/ReactNativeFeatureFlags.h +26 -1
  86. package/ReactCommon/react/featureflags/ReactNativeFeatureFlagsAccessor.cpp +135 -45
  87. package/ReactCommon/react/featureflags/ReactNativeFeatureFlagsAccessor.h +12 -2
  88. package/ReactCommon/react/featureflags/ReactNativeFeatureFlagsDefaults.h +21 -1
  89. package/ReactCommon/react/featureflags/ReactNativeFeatureFlagsDynamicProvider.h +46 -1
  90. package/ReactCommon/react/featureflags/ReactNativeFeatureFlagsProvider.h +6 -1
  91. package/ReactCommon/react/nativemodule/defaults/CMakeLists.txt +1 -0
  92. package/ReactCommon/react/nativemodule/defaults/DefaultTurboModules.cpp +7 -0
  93. package/ReactCommon/react/nativemodule/defaults/React-defaultsnativemodule.podspec +1 -0
  94. package/ReactCommon/react/nativemodule/featureflags/NativeReactNativeFeatureFlags.cpp +26 -1
  95. package/ReactCommon/react/nativemodule/featureflags/NativeReactNativeFeatureFlags.h +11 -1
  96. package/ReactCommon/react/nativemodule/mutationobserver/NativeMutationObserver.h +4 -0
  97. package/ReactCommon/react/nativemodule/mutationobserver/React-mutationobservernativemodule.podspec +66 -0
  98. package/ReactCommon/react/performance/timeline/PerformanceObserver.cpp +18 -6
  99. package/ReactCommon/react/performance/timeline/PerformanceObserver.h +2 -0
  100. package/ReactCommon/react/runtime/platform/ios/ReactCommon/RCTHost.mm +115 -0
  101. package/ReactCommon/{jsinspector-modern → react/utils}/Base64.h +2 -2
  102. package/package.json +11 -11
  103. package/scripts/cocoapods/utils.rb +1 -0
  104. package/scripts/react_native_pods.rb +1 -0
  105. package/scripts/replace-rncore-version.js +72 -15
  106. package/src/private/featureflags/ReactNativeFeatureFlags.js +26 -1
  107. package/src/private/featureflags/specs/NativeReactNativeFeatureFlags.js +6 -1
  108. package/src/private/setup/setUpDefaultReactNativeEnvironment.js +6 -0
@@ -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 null
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:
@@ -190,6 +190,12 @@ Pod::Spec.new do |s|
190
190
  sss.exclude_files = "react/renderer/observers/intersection/tests"
191
191
  sss.header_dir = "react/renderer/observers/intersection"
192
192
  end
193
+
194
+ ss.subspec "mutation" do |sss|
195
+ sss.source_files = podspec_sources("react/renderer/observers/mutation/**/*.{m,mm,cpp,h}", "react/renderer/observers/mutation/**/*.h")
196
+ sss.exclude_files = "react/renderer/observers/mutation/tests"
197
+ sss.header_dir = "react/renderer/observers/mutation"
198
+ end
193
199
  end
194
200
 
195
201
  s.subspec "telemetry" do |ss|
@@ -14,14 +14,14 @@
14
14
 
15
15
  #define REACT_NATIVE_VERSION_MAJOR 0
16
16
  #define REACT_NATIVE_VERSION_MINOR 85
17
- #define REACT_NATIVE_VERSION_PATCH 2
17
+ #define REACT_NATIVE_VERSION_PATCH 3
18
18
 
19
19
  namespace facebook::react {
20
20
 
21
21
  struct ReactNativeVersionType {
22
22
  int32_t Major = 0;
23
23
  int32_t Minor = 85;
24
- int32_t Patch = 2;
24
+ int32_t Patch = 3;
25
25
  std::string_view Prerelease = "";
26
26
  };
27
27
 
@@ -198,6 +198,42 @@ class HostAgent::Impl final {
198
198
  .shouldSendOKResponse = true,
199
199
  };
200
200
  }
201
+ if (InspectorFlags::getInstance().getScreenshotCaptureEnabled()) {
202
+ if (req.method == "Page.captureScreenshot") {
203
+ std::optional<std::string> format;
204
+ std::optional<int> quality;
205
+
206
+ if (req.params.isObject()) {
207
+ if (req.params.count("format") != 0u) {
208
+ format = req.params.at("format").asString();
209
+ }
210
+ if (req.params.count("quality") != 0u) {
211
+ quality = static_cast<int>(req.params.at("quality").asInt());
212
+ }
213
+ }
214
+
215
+ auto base64Data = targetController_.getDelegate().captureScreenshot(
216
+ {.format = format, .quality = quality});
217
+
218
+ if (base64Data.has_value()) {
219
+ frontendChannel_(
220
+ cdp::jsonResult(
221
+ req.id,
222
+ folly::dynamic::object("data", std::move(*base64Data))));
223
+ } else {
224
+ frontendChannel_(
225
+ cdp::jsonError(
226
+ req.id,
227
+ cdp::ErrorCode::InternalError,
228
+ "Failed to capture screenshot"));
229
+ }
230
+
231
+ return {
232
+ .isFinishedHandlingRequest = true,
233
+ .shouldSendOKResponse = false,
234
+ };
235
+ }
236
+ }
201
237
  if (req.method == "Overlay.setPausedInDebuggerMessage") {
202
238
  auto message =
203
239
  req.params.isObject() && (req.params.count("message") != 0u)
@@ -328,6 +328,7 @@ namespace {
328
328
  struct StaticHostTargetMetadata {
329
329
  std::optional<bool> isProfilingBuild;
330
330
  std::optional<bool> networkInspectionEnabled;
331
+ std::optional<bool> frameRecordingEnabled;
331
332
  };
332
333
 
333
334
  StaticHostTargetMetadata getStaticHostMetadata() {
@@ -335,7 +336,8 @@ StaticHostTargetMetadata getStaticHostMetadata() {
335
336
 
336
337
  return {
337
338
  .isProfilingBuild = inspectorFlags.getIsProfilingBuild(),
338
- .networkInspectionEnabled = inspectorFlags.getNetworkInspectionEnabled()};
339
+ .networkInspectionEnabled = inspectorFlags.getNetworkInspectionEnabled(),
340
+ .frameRecordingEnabled = inspectorFlags.getFrameRecordingEnabled()};
339
341
  }
340
342
 
341
343
  } // namespace
@@ -370,6 +372,10 @@ folly::dynamic createHostMetadataPayload(const HostTargetMetadata& metadata) {
370
372
  result["unstable_networkInspectionEnabled"] =
371
373
  staticMetadata.networkInspectionEnabled.value();
372
374
  }
375
+ if (staticMetadata.frameRecordingEnabled) {
376
+ result["unstable_frameRecordingEnabled"] =
377
+ staticMetadata.frameRecordingEnabled.value();
378
+ }
373
379
 
374
380
  return result;
375
381
  }
@@ -16,6 +16,7 @@
16
16
  #include "ScopedExecutor.h"
17
17
  #include "WeakList.h"
18
18
 
19
+ #include <functional>
19
20
  #include <optional>
20
21
  #include <set>
21
22
  #include <string>
@@ -134,6 +135,19 @@ class HostTargetDelegate : public LoadNetworkResourceDelegate {
134
135
  }
135
136
  };
136
137
 
138
+ struct PageCaptureScreenshotRequest {
139
+ /**
140
+ * Image compression format. Defaults to "png".
141
+ * Allowed values: "jpeg", "png", "webp".
142
+ */
143
+ std::optional<std::string> format;
144
+
145
+ /**
146
+ * Compression quality from range [0..100] (jpeg only).
147
+ */
148
+ std::optional<int> quality;
149
+ };
150
+
137
151
  virtual ~HostTargetDelegate() override;
138
152
 
139
153
  /**
@@ -181,6 +195,17 @@ class HostTargetDelegate : public LoadNetworkResourceDelegate {
181
195
  "LoadNetworkResourceDelegate.loadNetworkResource is not implemented by this host target delegate.");
182
196
  }
183
197
 
198
+ /**
199
+ * Called when the debugger requests a screenshot of the current page via
200
+ * @cdp Page.captureScreenshot. The delegate should capture the current
201
+ * view, encode it to the requested format, and return base64-encoded
202
+ * image data. Return std::nullopt on failure.
203
+ */
204
+ virtual std::optional<std::string> captureScreenshot(const PageCaptureScreenshotRequest & /*request*/)
205
+ {
206
+ return std::nullopt;
207
+ }
208
+
184
209
  /**
185
210
  * An optional delegate that will be used by HostTarget to notify about tracing-related events.
186
211
  */