react-native 0.83.3 → 0.83.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/Libraries/Core/ReactNativeVersion.js +1 -1
- package/Libraries/Utilities/Appearance.js +6 -1
- package/React/Base/RCTVersion.m +1 -1
- package/React/DevSupport/RCTFrameTimingsObserver.h +24 -0
- package/React/DevSupport/RCTFrameTimingsObserver.mm +298 -0
- package/React/FBReactNativeSpec/FBReactNativeSpecJSI.h +16 -0
- package/ReactAndroid/api/ReactAndroid.api +0 -9
- package/ReactAndroid/gradle.properties +1 -1
- package/ReactAndroid/src/main/java/com/facebook/react/devsupport/BridgelessDevSupportManager.kt +2 -2
- package/ReactAndroid/src/main/java/com/facebook/react/devsupport/DevSupportManagerBase.kt +7 -7
- package/ReactAndroid/src/main/java/com/facebook/react/devsupport/InspectorFlags.kt +4 -0
- package/ReactAndroid/src/main/java/com/facebook/react/devsupport/inspector/FrameTimingSequence.kt +16 -0
- package/ReactAndroid/src/main/java/com/facebook/react/devsupport/inspector/FrameTimingsObserver.kt +275 -0
- package/ReactAndroid/src/main/java/com/facebook/react/devsupport/inspector/TracingState.kt +17 -0
- package/ReactAndroid/src/main/java/com/facebook/react/devsupport/inspector/TracingStateListener.kt +15 -0
- package/ReactAndroid/src/main/java/com/facebook/react/devsupport/{interfaces → inspector}/TracingStateProvider.kt +1 -1
- package/ReactAndroid/src/main/java/com/facebook/react/devsupport/perfmonitor/PerfMonitorInspectorTargetBinding.kt +1 -1
- package/ReactAndroid/src/main/java/com/facebook/react/devsupport/perfmonitor/PerfMonitorOverlayManager.kt +4 -4
- package/ReactAndroid/src/main/java/com/facebook/react/devsupport/perfmonitor/PerfMonitorOverlayView.kt +3 -3
- package/ReactAndroid/src/main/java/com/facebook/react/devsupport/perfmonitor/PerfMonitorUpdateListener.kt +1 -1
- package/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlags.kt +13 -1
- package/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsCxxAccessor.kt +21 -1
- package/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsCxxInterop.kt +5 -1
- package/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsDefaults.kt +5 -1
- package/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsLocalAccessor.kt +23 -1
- package/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsProvider.kt +5 -1
- package/ReactAndroid/src/main/java/com/facebook/react/internal/tracing/PerformanceTracer.kt +39 -0
- package/ReactAndroid/src/main/java/com/facebook/react/modules/blob/BlobModule.kt +1 -1
- package/ReactAndroid/src/main/java/com/facebook/react/modules/network/NetworkEventUtil.kt +20 -19
- package/ReactAndroid/src/main/java/com/facebook/react/modules/network/NetworkingModule.kt +6 -12
- package/ReactAndroid/src/main/java/com/facebook/react/modules/systeminfo/ReactNativeVersion.kt +1 -1
- package/ReactAndroid/src/main/java/com/facebook/react/runtime/ReactHostImpl.kt +86 -4
- package/ReactAndroid/src/main/java/com/facebook/react/runtime/ReactHostImplDevHelper.kt +3 -3
- package/ReactAndroid/src/main/java/com/facebook/react/runtime/ReactHostInspectorTarget.kt +10 -6
- package/ReactAndroid/src/main/jni/react/devsupport/JInspectorFlags.cpp +22 -0
- package/ReactAndroid/src/main/jni/react/devsupport/JInspectorFlags.h +2 -0
- package/ReactAndroid/src/main/jni/react/featureflags/JReactNativeFeatureFlagsCxxInterop.cpp +29 -1
- package/ReactAndroid/src/main/jni/react/featureflags/JReactNativeFeatureFlagsCxxInterop.h +7 -1
- package/ReactAndroid/src/main/jni/react/runtime/jni/JReactHostInspectorTarget.cpp +196 -17
- package/ReactAndroid/src/main/jni/react/runtime/jni/JReactHostInspectorTarget.h +168 -18
- package/ReactAndroid/src/main/jni/third-party/folly/CMakeLists.txt +1 -0
- package/ReactCommon/cxxreact/ReactNativeVersion.h +2 -2
- package/ReactCommon/jsinspector-modern/HostAgent.cpp +45 -10
- package/ReactCommon/jsinspector-modern/HostAgent.h +2 -2
- package/ReactCommon/jsinspector-modern/HostTarget.cpp +14 -7
- package/ReactCommon/jsinspector-modern/HostTarget.h +101 -14
- package/ReactCommon/jsinspector-modern/HostTargetTraceRecording.cpp +39 -8
- package/ReactCommon/jsinspector-modern/HostTargetTraceRecording.h +42 -5
- package/ReactCommon/jsinspector-modern/HostTargetTracing.cpp +54 -21
- package/ReactCommon/jsinspector-modern/HostTargetTracing.h +89 -0
- package/ReactCommon/jsinspector-modern/InspectorFlags.cpp +12 -0
- package/ReactCommon/jsinspector-modern/InspectorFlags.h +12 -0
- package/ReactCommon/jsinspector-modern/InspectorInterfaces.cpp +3 -7
- package/ReactCommon/jsinspector-modern/InstanceAgent.cpp +2 -11
- package/ReactCommon/jsinspector-modern/NetworkIOAgent.cpp +1 -1
- package/ReactCommon/jsinspector-modern/TracingAgent.cpp +29 -13
- package/ReactCommon/jsinspector-modern/TracingAgent.h +5 -4
- package/ReactCommon/jsinspector-modern/tests/HostTargetTest.cpp +65 -0
- package/ReactCommon/jsinspector-modern/tests/InspectorMocks.h +23 -2
- package/ReactCommon/jsinspector-modern/tests/JsiIntegrationTest.cpp +1 -0
- package/ReactCommon/jsinspector-modern/tests/NetworkReporterTest.cpp +1 -0
- package/ReactCommon/jsinspector-modern/tests/TracingTest.cpp +335 -0
- package/ReactCommon/jsinspector-modern/tests/TracingTest.h +95 -0
- package/ReactCommon/jsinspector-modern/tests/utils/InspectorFlagOverridesGuard.cpp +10 -0
- package/ReactCommon/jsinspector-modern/tests/utils/InspectorFlagOverridesGuard.h +3 -1
- package/ReactCommon/jsinspector-modern/tracing/CMakeLists.txt +1 -0
- package/ReactCommon/jsinspector-modern/tracing/FrameTimingSequence.h +61 -0
- package/ReactCommon/jsinspector-modern/tracing/HostTracingProfile.h +43 -0
- package/ReactCommon/jsinspector-modern/tracing/HostTracingProfileSerializer.cpp +165 -0
- package/ReactCommon/jsinspector-modern/tracing/HostTracingProfileSerializer.h +50 -0
- package/ReactCommon/jsinspector-modern/tracing/PerformanceTracer.cpp +16 -14
- package/ReactCommon/jsinspector-modern/tracing/PerformanceTracerSection.h +113 -0
- package/ReactCommon/jsinspector-modern/tracing/React-jsinspectortracing.podspec +1 -0
- package/ReactCommon/jsinspector-modern/tracing/TimeWindowedBuffer.h +158 -0
- package/ReactCommon/jsinspector-modern/tracing/TraceEvent.h +2 -1
- package/ReactCommon/jsinspector-modern/tracing/TraceEventGenerator.cpp +100 -0
- package/ReactCommon/jsinspector-modern/tracing/TraceEventGenerator.h +60 -0
- package/ReactCommon/jsinspector-modern/tracing/TraceEventSerializer.cpp +44 -1
- package/ReactCommon/jsinspector-modern/tracing/TraceEventSerializer.h +7 -0
- package/ReactCommon/jsinspector-modern/tracing/TraceRecordingState.h +18 -7
- package/ReactCommon/jsinspector-modern/tracing/TracingCategory.h +136 -0
- package/ReactCommon/jsinspector-modern/tracing/tests/TimeWindowedBufferTest.cpp +352 -0
- package/ReactCommon/react/featureflags/ReactNativeFeatureFlags.cpp +9 -1
- package/ReactCommon/react/featureflags/ReactNativeFeatureFlags.h +11 -1
- package/ReactCommon/react/featureflags/ReactNativeFeatureFlagsAccessor.cpp +65 -29
- package/ReactCommon/react/featureflags/ReactNativeFeatureFlagsAccessor.h +6 -2
- package/ReactCommon/react/featureflags/ReactNativeFeatureFlagsDefaults.h +9 -1
- package/ReactCommon/react/featureflags/ReactNativeFeatureFlagsDynamicProvider.h +19 -1
- package/ReactCommon/react/featureflags/ReactNativeFeatureFlagsProvider.h +3 -1
- package/ReactCommon/react/nativemodule/core/platform/ios/ReactCommon/RCTTurboModule.mm +3 -1
- package/ReactCommon/react/nativemodule/featureflags/NativeReactNativeFeatureFlags.cpp +11 -1
- package/ReactCommon/react/nativemodule/featureflags/NativeReactNativeFeatureFlags.h +5 -1
- package/ReactCommon/react/performance/timeline/PerformanceObserver.cpp +18 -6
- package/ReactCommon/react/performance/timeline/PerformanceObserver.h +2 -0
- package/ReactCommon/react/runtime/platform/ios/ReactCommon/RCTHost.mm +115 -0
- package/ReactCommon/{jsinspector-modern → react/utils}/Base64.h +2 -2
- package/gradle/libs.versions.toml +1 -1
- package/package.json +8 -8
- package/scripts/cocoapods/utils.rb +1 -0
- package/src/private/featureflags/ReactNativeFeatureFlags.js +11 -1
- package/src/private/featureflags/specs/NativeReactNativeFeatureFlags.js +3 -1
- package/third-party-podspecs/RCT-Folly.podspec +1 -1
- package/third-party-podspecs/fmt.podspec +2 -2
- package/ReactAndroid/src/main/java/com/facebook/react/devsupport/interfaces/TracingState.kt +0 -19
- package/ReactCommon/jsinspector-modern/tracing/TraceRecordingStateSerializer.cpp +0 -68
- package/ReactCommon/jsinspector-modern/tracing/TraceRecordingStateSerializer.h +0 -42
- package/ReactCommon/jsinspector-modern/tracing/TracingState.h +0 -24
|
@@ -19,9 +19,7 @@ import com.facebook.react.common.build.ReactBuildConfig
|
|
|
19
19
|
import com.facebook.react.internal.featureflags.ReactNativeFeatureFlags
|
|
20
20
|
import java.net.SocketTimeoutException
|
|
21
21
|
import okhttp3.Headers
|
|
22
|
-
import okhttp3.Protocol
|
|
23
22
|
import okhttp3.Request
|
|
24
|
-
import okhttp3.Response
|
|
25
23
|
|
|
26
24
|
/**
|
|
27
25
|
* Utility class for reporting network lifecycle events to JavaScript and InspectorNetworkReporter.
|
|
@@ -206,11 +204,12 @@ internal object NetworkEventUtil {
|
|
|
206
204
|
requestId: Int,
|
|
207
205
|
devToolsRequestId: String,
|
|
208
206
|
requestUrl: String?,
|
|
209
|
-
|
|
207
|
+
statusCode: Int,
|
|
208
|
+
headers: Map<String, String>,
|
|
209
|
+
contentLength: Long,
|
|
210
210
|
) {
|
|
211
|
-
val headersMap = okHttpHeadersToMap(response.headers())
|
|
212
211
|
val headersBundle = Bundle()
|
|
213
|
-
for ((headerName, headerValue) in
|
|
212
|
+
for ((headerName, headerValue) in headers) {
|
|
214
213
|
headersBundle.putString(headerName, headerValue)
|
|
215
214
|
}
|
|
216
215
|
|
|
@@ -218,16 +217,16 @@ internal object NetworkEventUtil {
|
|
|
218
217
|
InspectorNetworkReporter.reportResponseStart(
|
|
219
218
|
devToolsRequestId,
|
|
220
219
|
requestUrl.orEmpty(),
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
220
|
+
statusCode,
|
|
221
|
+
headers,
|
|
222
|
+
contentLength,
|
|
224
223
|
)
|
|
225
224
|
}
|
|
226
225
|
reactContext?.emitDeviceEvent(
|
|
227
226
|
"didReceiveNetworkResponse",
|
|
228
227
|
Arguments.createArray().apply {
|
|
229
228
|
pushInt(requestId)
|
|
230
|
-
pushInt(
|
|
229
|
+
pushInt(statusCode)
|
|
231
230
|
pushMap(Arguments.fromBundle(headersBundle))
|
|
232
231
|
pushString(requestUrl)
|
|
233
232
|
},
|
|
@@ -244,33 +243,35 @@ internal object NetworkEventUtil {
|
|
|
244
243
|
headers: WritableMap?,
|
|
245
244
|
url: String?,
|
|
246
245
|
) {
|
|
247
|
-
val
|
|
246
|
+
val headersMap = mutableMapOf<String, String>()
|
|
248
247
|
headers?.let { map ->
|
|
249
248
|
val iterator = map.keySetIterator()
|
|
250
249
|
while (iterator.hasNextKey()) {
|
|
251
250
|
val key = iterator.nextKey()
|
|
252
251
|
val value = map.getString(key)
|
|
253
252
|
if (value != null) {
|
|
254
|
-
|
|
253
|
+
headersMap[key] = value
|
|
255
254
|
}
|
|
256
255
|
}
|
|
257
256
|
}
|
|
257
|
+
|
|
258
|
+
val contentLength =
|
|
259
|
+
headersMap["Content-Length"]?.toLongOrNull()
|
|
260
|
+
?: headersMap["content-length"]?.toLongOrNull()
|
|
261
|
+
?: 0L
|
|
262
|
+
|
|
258
263
|
onResponseReceived(
|
|
259
264
|
reactContext,
|
|
260
265
|
requestId,
|
|
261
266
|
devToolsRequestId,
|
|
262
267
|
url,
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
.headers(headersBuilder.build())
|
|
267
|
-
.code(statusCode)
|
|
268
|
-
.message("")
|
|
269
|
-
.build(),
|
|
268
|
+
statusCode,
|
|
269
|
+
headersMap,
|
|
270
|
+
contentLength,
|
|
270
271
|
)
|
|
271
272
|
}
|
|
272
273
|
|
|
273
|
-
|
|
274
|
+
internal fun okHttpHeadersToMap(headers: Headers): Map<String, String> {
|
|
274
275
|
val responseHeaders = mutableMapOf<String, String>()
|
|
275
276
|
for (i in 0 until headers.size()) {
|
|
276
277
|
val headerName = headers.name(i)
|
|
@@ -36,7 +36,6 @@ import okhttp3.JavaNetCookieJar
|
|
|
36
36
|
import okhttp3.MediaType
|
|
37
37
|
import okhttp3.MultipartBody
|
|
38
38
|
import okhttp3.OkHttpClient
|
|
39
|
-
import okhttp3.Protocol
|
|
40
39
|
import okhttp3.Request
|
|
41
40
|
import okhttp3.RequestBody
|
|
42
41
|
import okhttp3.Response
|
|
@@ -310,21 +309,14 @@ public class NetworkingModule(
|
|
|
310
309
|
if (handler.supports(uri, responseType)) {
|
|
311
310
|
val (res, rawBody) = handler.fetch(uri)
|
|
312
311
|
val encodedDataLength = res.toString().toByteArray().size
|
|
313
|
-
// fix: UriHandlers which are not using file:// scheme fail in whatwg-fetch at this line
|
|
314
|
-
// https://github.com/JakeChampion/fetch/blob/main/fetch.js#L547
|
|
315
|
-
val response =
|
|
316
|
-
Response.Builder()
|
|
317
|
-
.protocol(Protocol.HTTP_1_1)
|
|
318
|
-
.request(Request.Builder().url(url.orEmpty()).build())
|
|
319
|
-
.code(200)
|
|
320
|
-
.message("OK")
|
|
321
|
-
.build()
|
|
322
312
|
NetworkEventUtil.onResponseReceived(
|
|
323
313
|
reactApplicationContext,
|
|
324
314
|
requestId,
|
|
325
315
|
devToolsRequestId,
|
|
326
316
|
url,
|
|
327
|
-
|
|
317
|
+
200,
|
|
318
|
+
emptyMap(),
|
|
319
|
+
encodedDataLength.toLong(),
|
|
328
320
|
)
|
|
329
321
|
NetworkEventUtil.onDataReceived(
|
|
330
322
|
reactApplicationContext,
|
|
@@ -645,7 +637,9 @@ public class NetworkingModule(
|
|
|
645
637
|
requestId,
|
|
646
638
|
devToolsRequestId,
|
|
647
639
|
url,
|
|
648
|
-
response,
|
|
640
|
+
response.code(),
|
|
641
|
+
NetworkEventUtil.okHttpHeadersToMap(response.headers()),
|
|
642
|
+
response.body()?.contentLength() ?: 0L,
|
|
649
643
|
)
|
|
650
644
|
|
|
651
645
|
try {
|
|
@@ -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
|
|
@@ -43,8 +44,11 @@ import com.facebook.react.devsupport.DevMenuConfiguration
|
|
|
43
44
|
import com.facebook.react.devsupport.DevSupportManagerBase
|
|
44
45
|
import com.facebook.react.devsupport.DevSupportManagerFactory
|
|
45
46
|
import com.facebook.react.devsupport.InspectorFlags
|
|
47
|
+
import com.facebook.react.devsupport.inspector.FrameTimingsObserver
|
|
46
48
|
import com.facebook.react.devsupport.inspector.InspectorNetworkHelper
|
|
47
49
|
import com.facebook.react.devsupport.inspector.InspectorNetworkRequestListener
|
|
50
|
+
import com.facebook.react.devsupport.inspector.TracingState
|
|
51
|
+
import com.facebook.react.devsupport.inspector.TracingStateListener
|
|
48
52
|
import com.facebook.react.devsupport.interfaces.BundleLoadCallback
|
|
49
53
|
import com.facebook.react.devsupport.interfaces.DevSupportManager
|
|
50
54
|
import com.facebook.react.devsupport.interfaces.DevSupportManager.PausedInDebuggerOverlayCommandListener
|
|
@@ -147,6 +151,7 @@ public class ReactHostImpl(
|
|
|
147
151
|
private val beforeDestroyListeners: MutableList<() -> Unit> = CopyOnWriteArrayList()
|
|
148
152
|
|
|
149
153
|
internal var reactHostInspectorTarget: ReactHostInspectorTarget? = null
|
|
154
|
+
private var frameTimingsObserver: FrameTimingsObserver? = null
|
|
150
155
|
|
|
151
156
|
@Volatile private var hostInvalidated = false
|
|
152
157
|
|
|
@@ -246,6 +251,7 @@ public class ReactHostImpl(
|
|
|
246
251
|
stateTracker.enterState("onHostResume(activity)")
|
|
247
252
|
|
|
248
253
|
currentActivity = activity
|
|
254
|
+
frameTimingsObserver?.setCurrentWindow(activity?.window)
|
|
249
255
|
|
|
250
256
|
maybeEnableDevSupport(true)
|
|
251
257
|
reactLifecycleStateManager.moveToOnHostResume(currentReactContext, activity)
|
|
@@ -442,6 +448,43 @@ public class ReactHostImpl(
|
|
|
442
448
|
InspectorNetworkHelper.loadNetworkResource(url, listener)
|
|
443
449
|
}
|
|
444
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
|
+
|
|
445
488
|
/**
|
|
446
489
|
* Entrypoint to destroy the ReactInstance. If the ReactInstance is reloading, will wait until
|
|
447
490
|
* reload is finished, before destroying.
|
|
@@ -847,6 +890,7 @@ public class ReactHostImpl(
|
|
|
847
890
|
private fun moveToHostDestroy(currentContext: ReactContext?) {
|
|
848
891
|
reactLifecycleStateManager.moveToOnHostDestroy(currentContext)
|
|
849
892
|
currentActivity = null
|
|
893
|
+
frameTimingsObserver?.setCurrentWindow(null)
|
|
850
894
|
}
|
|
851
895
|
|
|
852
896
|
private fun raiseSoftException(
|
|
@@ -1442,8 +1486,7 @@ public class ReactHostImpl(
|
|
|
1442
1486
|
// If the host has been invalidated, now that the current context/instance
|
|
1443
1487
|
// has been unregistered, we can safely destroy the host's inspector
|
|
1444
1488
|
// target.
|
|
1445
|
-
|
|
1446
|
-
reactHostInspectorTarget = null
|
|
1489
|
+
destroyReactHostInspectorTarget()
|
|
1447
1490
|
}
|
|
1448
1491
|
|
|
1449
1492
|
// Step 1: Destroy DevSupportManager
|
|
@@ -1554,13 +1597,52 @@ public class ReactHostImpl(
|
|
|
1554
1597
|
|
|
1555
1598
|
internal fun getOrCreateReactHostInspectorTarget(): ReactHostInspectorTarget? {
|
|
1556
1599
|
if (reactHostInspectorTarget == null && InspectorFlags.getFuseboxEnabled()) {
|
|
1557
|
-
|
|
1558
|
-
reactHostInspectorTarget = ReactHostInspectorTarget(this)
|
|
1600
|
+
reactHostInspectorTarget = createReactHostInspectorTarget()
|
|
1559
1601
|
}
|
|
1560
1602
|
|
|
1561
1603
|
return reactHostInspectorTarget
|
|
1562
1604
|
}
|
|
1563
1605
|
|
|
1606
|
+
private fun createReactHostInspectorTarget(): ReactHostInspectorTarget {
|
|
1607
|
+
// NOTE: ReactHostInspectorTarget only retains a weak reference to `this`.
|
|
1608
|
+
val inspectorTarget = ReactHostInspectorTarget(this)
|
|
1609
|
+
inspectorTarget.registerTracingStateListener(
|
|
1610
|
+
TracingStateListener { state: TracingState, _screenshotsEnabled: Boolean ->
|
|
1611
|
+
when (state) {
|
|
1612
|
+
TracingState.ENABLED_IN_BACKGROUND_MODE,
|
|
1613
|
+
TracingState.ENABLED_IN_CDP_MODE -> {
|
|
1614
|
+
if (InspectorFlags.getFrameRecordingEnabled()) {
|
|
1615
|
+
val observer =
|
|
1616
|
+
FrameTimingsObserver(
|
|
1617
|
+
_screenshotsEnabled,
|
|
1618
|
+
{ frameTimingsSequence ->
|
|
1619
|
+
inspectorTarget.recordFrameTimings(frameTimingsSequence)
|
|
1620
|
+
},
|
|
1621
|
+
)
|
|
1622
|
+
observer.setCurrentWindow(currentActivity?.window)
|
|
1623
|
+
observer.start()
|
|
1624
|
+
frameTimingsObserver = observer
|
|
1625
|
+
}
|
|
1626
|
+
}
|
|
1627
|
+
TracingState.DISABLED -> {
|
|
1628
|
+
frameTimingsObserver?.stop()
|
|
1629
|
+
frameTimingsObserver = null
|
|
1630
|
+
}
|
|
1631
|
+
}
|
|
1632
|
+
}
|
|
1633
|
+
)
|
|
1634
|
+
|
|
1635
|
+
return inspectorTarget
|
|
1636
|
+
}
|
|
1637
|
+
|
|
1638
|
+
private fun destroyReactHostInspectorTarget() {
|
|
1639
|
+
frameTimingsObserver?.stop()
|
|
1640
|
+
frameTimingsObserver = null
|
|
1641
|
+
|
|
1642
|
+
reactHostInspectorTarget?.close()
|
|
1643
|
+
reactHostInspectorTarget = null
|
|
1644
|
+
}
|
|
1645
|
+
|
|
1564
1646
|
@ThreadConfined(ThreadConfined.UI)
|
|
1565
1647
|
internal fun unregisterInstanceFromInspector(reactInstance: ReactInstance?) {
|
|
1566
1648
|
if (reactInstance != null) {
|
|
@@ -16,8 +16,8 @@ import com.facebook.react.bridge.ReactContext
|
|
|
16
16
|
import com.facebook.react.common.annotations.FrameworkAPI
|
|
17
17
|
import com.facebook.react.common.annotations.UnstableReactNativeAPI
|
|
18
18
|
import com.facebook.react.devsupport.ReactInstanceDevHelper
|
|
19
|
-
import com.facebook.react.devsupport.
|
|
20
|
-
import com.facebook.react.devsupport.
|
|
19
|
+
import com.facebook.react.devsupport.inspector.TracingState
|
|
20
|
+
import com.facebook.react.devsupport.inspector.TracingStateProvider
|
|
21
21
|
import com.facebook.react.devsupport.perfmonitor.PerfMonitorDevHelper
|
|
22
22
|
import com.facebook.react.devsupport.perfmonitor.PerfMonitorInspectorTarget
|
|
23
23
|
import com.facebook.react.interfaces.TaskInterface
|
|
@@ -81,6 +81,6 @@ internal class ReactHostImplDevHelper(private val delegate: ReactHostImpl) :
|
|
|
81
81
|
delegate.loadBundle(bundleLoader)
|
|
82
82
|
|
|
83
83
|
override fun getTracingState(): TracingState {
|
|
84
|
-
return delegate.reactHostInspectorTarget?.getTracingState() ?: TracingState.
|
|
84
|
+
return delegate.reactHostInspectorTarget?.getTracingState() ?: TracingState.ENABLED_IN_CDP_MODE
|
|
85
85
|
}
|
|
86
86
|
}
|
|
@@ -12,7 +12,9 @@ import com.facebook.proguard.annotations.DoNotStripAny
|
|
|
12
12
|
import com.facebook.react.bridge.UiThreadUtil
|
|
13
13
|
import com.facebook.react.common.annotations.FrameworkAPI
|
|
14
14
|
import com.facebook.react.common.annotations.UnstableReactNativeAPI
|
|
15
|
-
import com.facebook.react.devsupport.
|
|
15
|
+
import com.facebook.react.devsupport.inspector.FrameTimingSequence
|
|
16
|
+
import com.facebook.react.devsupport.inspector.TracingState
|
|
17
|
+
import com.facebook.react.devsupport.inspector.TracingStateListener
|
|
16
18
|
import com.facebook.react.devsupport.perfmonitor.PerfMonitorInspectorTarget
|
|
17
19
|
import com.facebook.react.devsupport.perfmonitor.PerfMonitorUpdateListener
|
|
18
20
|
import com.facebook.soloader.SoLoader
|
|
@@ -41,11 +43,13 @@ internal class ReactHostInspectorTarget(reactHostImpl: ReactHostImpl) :
|
|
|
41
43
|
|
|
42
44
|
external fun stopAndDiscardBackgroundTrace()
|
|
43
45
|
|
|
44
|
-
external fun
|
|
46
|
+
external override fun getTracingState(): TracingState
|
|
45
47
|
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
48
|
+
external fun registerTracingStateListener(listener: TracingStateListener): Long
|
|
49
|
+
|
|
50
|
+
external fun unregisterTracingStateListener(subscriptionId: Long)
|
|
51
|
+
|
|
52
|
+
external fun recordFrameTimings(frameTimingSequence: FrameTimingSequence)
|
|
49
53
|
|
|
50
54
|
override fun addPerfMonitorListener(listener: PerfMonitorUpdateListener) {
|
|
51
55
|
perfMonitorListeners.add(listener)
|
|
@@ -63,7 +67,7 @@ internal class ReactHostInspectorTarget(reactHostImpl: ReactHostImpl) :
|
|
|
63
67
|
override fun resumeBackgroundTrace() {
|
|
64
68
|
startBackgroundTrace()
|
|
65
69
|
perfMonitorListeners.forEach { listener ->
|
|
66
|
-
listener.onRecordingStateChanged(TracingState.
|
|
70
|
+
listener.onRecordingStateChanged(TracingState.ENABLED_IN_BACKGROUND_MODE)
|
|
67
71
|
}
|
|
68
72
|
}
|
|
69
73
|
|
|
@@ -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<<
|
|
7
|
+
* @generated SignedSource<<d4aa5fd7828c31ac309551066662eeaa>>
|
|
8
8
|
*/
|
|
9
9
|
|
|
10
10
|
/**
|
|
@@ -381,12 +381,24 @@ class ReactNativeFeatureFlagsJavaProvider
|
|
|
381
381
|
return method(javaProvider_);
|
|
382
382
|
}
|
|
383
383
|
|
|
384
|
+
bool fuseboxFrameRecordingEnabled() override {
|
|
385
|
+
static const auto method =
|
|
386
|
+
getReactNativeFeatureFlagsProviderJavaClass()->getMethod<jboolean()>("fuseboxFrameRecordingEnabled");
|
|
387
|
+
return method(javaProvider_);
|
|
388
|
+
}
|
|
389
|
+
|
|
384
390
|
bool fuseboxNetworkInspectionEnabled() override {
|
|
385
391
|
static const auto method =
|
|
386
392
|
getReactNativeFeatureFlagsProviderJavaClass()->getMethod<jboolean()>("fuseboxNetworkInspectionEnabled");
|
|
387
393
|
return method(javaProvider_);
|
|
388
394
|
}
|
|
389
395
|
|
|
396
|
+
bool fuseboxScreenshotCaptureEnabled() override {
|
|
397
|
+
static const auto method =
|
|
398
|
+
getReactNativeFeatureFlagsProviderJavaClass()->getMethod<jboolean()>("fuseboxScreenshotCaptureEnabled");
|
|
399
|
+
return method(javaProvider_);
|
|
400
|
+
}
|
|
401
|
+
|
|
390
402
|
bool hideOffscreenVirtualViewsOnIOS() override {
|
|
391
403
|
static const auto method =
|
|
392
404
|
getReactNativeFeatureFlagsProviderJavaClass()->getMethod<jboolean()>("hideOffscreenVirtualViewsOnIOS");
|
|
@@ -838,11 +850,21 @@ bool JReactNativeFeatureFlagsCxxInterop::fuseboxEnabledRelease(
|
|
|
838
850
|
return ReactNativeFeatureFlags::fuseboxEnabledRelease();
|
|
839
851
|
}
|
|
840
852
|
|
|
853
|
+
bool JReactNativeFeatureFlagsCxxInterop::fuseboxFrameRecordingEnabled(
|
|
854
|
+
facebook::jni::alias_ref<JReactNativeFeatureFlagsCxxInterop> /*unused*/) {
|
|
855
|
+
return ReactNativeFeatureFlags::fuseboxFrameRecordingEnabled();
|
|
856
|
+
}
|
|
857
|
+
|
|
841
858
|
bool JReactNativeFeatureFlagsCxxInterop::fuseboxNetworkInspectionEnabled(
|
|
842
859
|
facebook::jni::alias_ref<JReactNativeFeatureFlagsCxxInterop> /*unused*/) {
|
|
843
860
|
return ReactNativeFeatureFlags::fuseboxNetworkInspectionEnabled();
|
|
844
861
|
}
|
|
845
862
|
|
|
863
|
+
bool JReactNativeFeatureFlagsCxxInterop::fuseboxScreenshotCaptureEnabled(
|
|
864
|
+
facebook::jni::alias_ref<JReactNativeFeatureFlagsCxxInterop> /*unused*/) {
|
|
865
|
+
return ReactNativeFeatureFlags::fuseboxScreenshotCaptureEnabled();
|
|
866
|
+
}
|
|
867
|
+
|
|
846
868
|
bool JReactNativeFeatureFlagsCxxInterop::hideOffscreenVirtualViewsOnIOS(
|
|
847
869
|
facebook::jni::alias_ref<JReactNativeFeatureFlagsCxxInterop> /*unused*/) {
|
|
848
870
|
return ReactNativeFeatureFlags::hideOffscreenVirtualViewsOnIOS();
|
|
@@ -1180,9 +1202,15 @@ void JReactNativeFeatureFlagsCxxInterop::registerNatives() {
|
|
|
1180
1202
|
makeNativeMethod(
|
|
1181
1203
|
"fuseboxEnabledRelease",
|
|
1182
1204
|
JReactNativeFeatureFlagsCxxInterop::fuseboxEnabledRelease),
|
|
1205
|
+
makeNativeMethod(
|
|
1206
|
+
"fuseboxFrameRecordingEnabled",
|
|
1207
|
+
JReactNativeFeatureFlagsCxxInterop::fuseboxFrameRecordingEnabled),
|
|
1183
1208
|
makeNativeMethod(
|
|
1184
1209
|
"fuseboxNetworkInspectionEnabled",
|
|
1185
1210
|
JReactNativeFeatureFlagsCxxInterop::fuseboxNetworkInspectionEnabled),
|
|
1211
|
+
makeNativeMethod(
|
|
1212
|
+
"fuseboxScreenshotCaptureEnabled",
|
|
1213
|
+
JReactNativeFeatureFlagsCxxInterop::fuseboxScreenshotCaptureEnabled),
|
|
1186
1214
|
makeNativeMethod(
|
|
1187
1215
|
"hideOffscreenVirtualViewsOnIOS",
|
|
1188
1216
|
JReactNativeFeatureFlagsCxxInterop::hideOffscreenVirtualViewsOnIOS),
|
|
@@ -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<<
|
|
7
|
+
* @generated SignedSource<<554bd02cd328ba462d4e703b653d6cdd>>
|
|
8
8
|
*/
|
|
9
9
|
|
|
10
10
|
/**
|
|
@@ -201,9 +201,15 @@ class JReactNativeFeatureFlagsCxxInterop
|
|
|
201
201
|
static bool fuseboxEnabledRelease(
|
|
202
202
|
facebook::jni::alias_ref<JReactNativeFeatureFlagsCxxInterop>);
|
|
203
203
|
|
|
204
|
+
static bool fuseboxFrameRecordingEnabled(
|
|
205
|
+
facebook::jni::alias_ref<JReactNativeFeatureFlagsCxxInterop>);
|
|
206
|
+
|
|
204
207
|
static bool fuseboxNetworkInspectionEnabled(
|
|
205
208
|
facebook::jni::alias_ref<JReactNativeFeatureFlagsCxxInterop>);
|
|
206
209
|
|
|
210
|
+
static bool fuseboxScreenshotCaptureEnabled(
|
|
211
|
+
facebook::jni::alias_ref<JReactNativeFeatureFlagsCxxInterop>);
|
|
212
|
+
|
|
207
213
|
static bool hideOffscreenVirtualViewsOnIOS(
|
|
208
214
|
facebook::jni::alias_ref<JReactNativeFeatureFlagsCxxInterop>);
|
|
209
215
|
|