Reduce dependencies on ReactHostDelegate (#37564)

Summary:
Pull Request resolved: https://github.com/facebook/react-native/pull/37564

In this diff I'm refactoring ReactHostDelegate to reduce API dependencies.
As part of this diff I'm also refactoring callsites to ensure everything works as expected.

changelog: [internal] internal

Reviewed By: cortinico, yungsters

Differential Revision: D45662329

fbshipit-source-id: 1cab4331b2636b9a5d0d48085b68610153bcf0c5
This commit is contained in:
David Vacca 2023-05-25 10:29:01 -07:00 коммит произвёл Facebook GitHub Bot
Родитель 8ae084675b
Коммит c99d6f6077
6 изменённых файлов: 21 добавлений и 30 удалений

Просмотреть файл

@ -945,7 +945,7 @@ public class ReactHost {
// Since metro is running, fetch the JS bundle from the server
return loadJSBundleFromMetro();
}
return Task.forResult(mReactHostDelegate.getJSBundleLoader(mContext));
return Task.forResult(mReactHostDelegate.getJSBundleLoader());
},
mBGExecutor);
} else {
@ -960,7 +960,7 @@ public class ReactHost {
* throws an exception, the task will fault, and we'll go through the ReactHost error
* reporting pipeline.
*/
return Task.call(() -> mReactHostDelegate.getJSBundleLoader(mContext));
return Task.call(() -> mReactHostDelegate.getJSBundleLoader());
}
}

Просмотреть файл

@ -7,14 +7,13 @@
package com.facebook.react.bridgeless
import android.content.Context
import com.facebook.infer.annotation.ThreadSafe
import com.facebook.react.ReactPackage
import com.facebook.react.bridge.JSBundleLoader
import com.facebook.react.bridge.ReactApplicationContext
import com.facebook.react.bridge.ReactContext
import com.facebook.react.common.annotations.UnstableReactNativeAPI
import com.facebook.react.fabric.ReactNativeConfig
import com.facebook.react.turbomodule.core.TurboModuleManager
import com.facebook.react.turbomodule.core.TurboModuleManagerDelegate
/** TODO: add javadoc for class and methods */
@ -27,36 +26,33 @@ interface ReactHostDelegate {
val reactPackages: List<ReactPackage>
fun getJSBundleLoader(context: Context): JSBundleLoader
val jSEngineInstance: JSEngineInstance
val jSBundleLoader: JSBundleLoader
fun getTurboModuleManagerDelegate(context: ReactApplicationContext): TurboModuleManagerDelegate
fun getJSEngineInstance(context: ReactApplicationContext): JSEngineInstance
fun handleInstanceException(e: Exception)
// TODO: remove TurboModuleManager as a parameter
fun getReactNativeConfig(turboModuleManager: TurboModuleManager): ReactNativeConfig
fun getReactNativeConfig(context: ReactContext): ReactNativeConfig
@UnstableReactNativeAPI
class ReactHostDelegateBase(
override val jSMainModulePath: String,
override val jSBundleLoader: JSBundleLoader,
override val jSEngineInstance: JSEngineInstance,
override val reactPackages: List<ReactPackage> = emptyList(),
override val bindingsInstaller: BindingsInstaller? = null,
override val reactPackages: List<ReactPackage>,
private val jsBundleLoader: JSBundleLoader,
private val turboModuleManagerDelegate: TurboModuleManagerDelegate,
private val jsEngineInstance: JSEngineInstance,
private val turboModuleManagerDelegate:
(context: ReactApplicationContext) -> TurboModuleManagerDelegate,
private val reactNativeConfig: ReactNativeConfig = ReactNativeConfig.DEFAULT_CONFIG,
private val exceptionHandler: (Exception) -> Unit = {}
) : ReactHostDelegate {
override fun getJSBundleLoader(context: Context) = jsBundleLoader
override fun getTurboModuleManagerDelegate(context: ReactApplicationContext) =
turboModuleManagerDelegate
turboModuleManagerDelegate(context)
override fun getJSEngineInstance(context: ReactApplicationContext) = jsEngineInstance
override fun getReactNativeConfig(turboModuleManager: TurboModuleManager) = reactNativeConfig
override fun getReactNativeConfig(context: ReactContext) = reactNativeConfig
override fun handleInstanceException(e: Exception) = exceptionHandler(e)
}

Просмотреть файл

@ -150,7 +150,7 @@ final class ReactInstance {
}
});
JSEngineInstance jsEngineInstance = mDelegate.getJSEngineInstance(mBridgelessReactContext);
JSEngineInstance jsEngineInstance = mDelegate.getJSEngineInstance();
BindingsInstaller bindingsInstaller = mDelegate.getBindingsInstaller();
// Notify JS if profiling is enabled
boolean isProfiling =
@ -225,7 +225,7 @@ final class ReactInstance {
mFabricUIManager =
new FabricUIManager(mBridgelessReactContext, viewManagerRegistry, eventBeatManager);
ReactNativeConfig config = mDelegate.getReactNativeConfig(mTurboModuleManager);
ReactNativeConfig config = mDelegate.getReactNativeConfig(mBridgelessReactContext);
// Misc initialization that needs to be done before Fabric init
DisplayMetricsHolder.initDisplayMetricsIfNotInitialized(mBridgelessReactContext);
@ -383,7 +383,7 @@ final class ReactInstance {
JavaTimerManager timerManager,
JSTimerExecutor jsTimerExecutor,
ReactJsExceptionHandler jReactExceptionsManager,
BindingsInstaller jBindingsInstaller,
@Nullable BindingsInstaller jBindingsInstaller,
boolean isProfiling);
@DoNotStrip

Просмотреть файл

@ -11,7 +11,6 @@ import com.facebook.jni.HybridData
import com.facebook.jni.annotations.DoNotStrip
import com.facebook.react.bridgeless.JSEngineInstance
import com.facebook.soloader.SoLoader
import kotlin.jvm.JvmStatic
class HermesInstance() : JSEngineInstance(initHybrid()!!) {

Просмотреть файл

@ -40,12 +40,12 @@ class ReactHostDelegateTest {
val delegate =
ReactHostDelegate.ReactHostDelegateBase(
jsMainModulePathMocked,
jsBundleLoader = jsBundleLoader,
jSBundleLoader = jsBundleLoader,
reactPackages = reactPackages,
bindingsInstaller = bindingsInstallerMock,
jsEngineInstance = jsEngineInstanceMock,
jSEngineInstance = jsEngineInstanceMock,
reactNativeConfig = reactNativeConfigMock,
turboModuleManagerDelegate = turboModuleManagerDelegateMock,
turboModuleManagerDelegate = { turboModuleManagerDelegateMock },
exceptionHandler = {})
assertThat(delegate.jSMainModulePath).isEqualTo(jsMainModulePathMocked)

Просмотреть файл

@ -20,7 +20,6 @@ import android.app.Activity;
import com.facebook.react.MemoryPressureRouter;
import com.facebook.react.bridge.JSBundleLoader;
import com.facebook.react.bridge.MemoryPressureListener;
import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.bridge.UIManager;
import com.facebook.react.bridgeless.internal.bolts.TaskCompletionSource;
import com.facebook.react.devsupport.interfaces.PackagerStatusCallback;
@ -32,7 +31,6 @@ import org.junit.Ignore;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.ArgumentMatchers;
import org.powermock.core.classloader.annotations.PowerMockIgnore;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.core.classloader.annotations.SuppressStaticInitializationFor;
@ -83,9 +81,7 @@ public class ReactHostTest {
whenNew(MemoryPressureRouter.class).withAnyArguments().thenReturn(mMemoryPressureRouter);
whenNew(BridgelessDevSupportManager.class).withAnyArguments().thenReturn(mDevSupportManager);
doReturn(mJSBundleLoader)
.when(mReactHostDelegate)
.getJSBundleLoader(ArgumentMatchers.<ReactApplicationContext>any());
doReturn(mJSBundleLoader).when(mReactHostDelegate).getJSBundleLoader();
mReactHost =
new ReactHost(