diff --git a/ReactAndroid/src/main/java/com/facebook/react/ReactInstanceManager.java b/ReactAndroid/src/main/java/com/facebook/react/ReactInstanceManager.java index ec98de63758..48dcbc93471 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/ReactInstanceManager.java +++ b/ReactAndroid/src/main/java/com/facebook/react/ReactInstanceManager.java @@ -56,7 +56,6 @@ import com.facebook.react.bridge.JSIModuleType; import com.facebook.react.bridge.JavaJSExecutor; import com.facebook.react.bridge.JavaScriptExecutor; import com.facebook.react.bridge.JavaScriptExecutorFactory; -import com.facebook.react.bridge.NativeDeltaClient; import com.facebook.react.bridge.NativeModuleCallExceptionHandler; import com.facebook.react.bridge.NativeModuleRegistry; import com.facebook.react.bridge.NotThreadSafeBridgeIdleDebugListener; @@ -279,8 +278,8 @@ public class ReactInstanceManager { } @Override - public void onJSBundleLoadedFromServer(@Nullable NativeDeltaClient nativeDeltaClient) { - ReactInstanceManager.this.onJSBundleLoadedFromServer(nativeDeltaClient); + public void onJSBundleLoadedFromServer() { + ReactInstanceManager.this.onJSBundleLoadedFromServer(); } @Override @@ -389,7 +388,7 @@ public class ReactInstanceManager { && !devSettings.isRemoteJSDebugEnabled()) { // If there is a up-to-date bundle downloaded from server, // with remote JS debugging disabled, always use that. - onJSBundleLoadedFromServer(null); + onJSBundleLoadedFromServer(); } else { // If dev server is down, disable the remote JS debugging. devSettings.setRemoteJSDebugEnabled(false); @@ -883,15 +882,12 @@ public class ReactInstanceManager { } @ThreadConfined(UI) - private void onJSBundleLoadedFromServer(@Nullable NativeDeltaClient nativeDeltaClient) { + private void onJSBundleLoadedFromServer() { Log.d(ReactConstants.TAG, "ReactInstanceManager.onJSBundleLoadedFromServer()"); JSBundleLoader bundleLoader = - nativeDeltaClient == null - ? JSBundleLoader.createCachedBundleFromNetworkLoader( - mDevSupportManager.getSourceUrl(), mDevSupportManager.getDownloadedJSBundleFile()) - : JSBundleLoader.createDeltaFromNetworkLoader( - mDevSupportManager.getSourceUrl(), nativeDeltaClient); + JSBundleLoader.createCachedBundleFromNetworkLoader( + mDevSupportManager.getSourceUrl(), mDevSupportManager.getDownloadedJSBundleFile()); recreateReactContextInBackground(mJavaScriptExecutorFactory, bundleLoader); } diff --git a/ReactAndroid/src/main/java/com/facebook/react/bridge/CatalystInstanceImpl.java b/ReactAndroid/src/main/java/com/facebook/react/bridge/CatalystInstanceImpl.java index d2aa466665d..c2da5a77e5f 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/bridge/CatalystInstanceImpl.java +++ b/ReactAndroid/src/main/java/com/facebook/react/bridge/CatalystInstanceImpl.java @@ -233,13 +233,6 @@ public class CatalystInstanceImpl implements CatalystInstance { jniLoadScriptFromFile(fileName, sourceURL, loadSynchronously); } - @Override - public void loadScriptFromDeltaBundle( - String sourceURL, NativeDeltaClient deltaClient, boolean loadSynchronously) { - mSourceURL = sourceURL; - jniLoadScriptFromDeltaBundle(sourceURL, deltaClient, loadSynchronously); - } - private native void jniSetSourceURL(String sourceURL); private native void jniRegisterSegment(int segmentId, String path); @@ -250,9 +243,6 @@ public class CatalystInstanceImpl implements CatalystInstance { private native void jniLoadScriptFromFile( String fileName, String sourceURL, boolean loadSynchronously); - private native void jniLoadScriptFromDeltaBundle( - String sourceURL, NativeDeltaClient deltaClient, boolean loadSynchronously); - @Override public void runJSBundle() { Log.d(ReactConstants.TAG, "CatalystInstanceImpl.runJSBundle()"); diff --git a/ReactAndroid/src/main/java/com/facebook/react/bridge/JSBundleLoader.java b/ReactAndroid/src/main/java/com/facebook/react/bridge/JSBundleLoader.java index 12b35eb17a8..c83a40766a0 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/bridge/JSBundleLoader.java +++ b/ReactAndroid/src/main/java/com/facebook/react/bridge/JSBundleLoader.java @@ -72,28 +72,6 @@ public abstract class JSBundleLoader { }; } - /** - * This loader is used to load delta bundles from the dev server. We pass each delta message to - * the loader and process it in C++. Passing it as a string leads to inefficiencies due to memory - * copies, which will have to be addressed in a follow-up. - * - * @param nativeDeltaClient - */ - public static JSBundleLoader createDeltaFromNetworkLoader( - final String sourceURL, final NativeDeltaClient nativeDeltaClient) { - return new JSBundleLoader() { - @Override - public String loadScript(JSBundleLoaderDelegate delegate) { - try { - delegate.loadScriptFromDeltaBundle(sourceURL, nativeDeltaClient, false); - return sourceURL; - } catch (Exception e) { - throw DebugServerException.makeGeneric(sourceURL, e.getMessage(), e); - } - } - }; - } - /** * This loader is used when proxy debugging is enabled. In that case there is no point in fetching * the bundle from device as remote executor will have to do it anyway. diff --git a/ReactAndroid/src/main/java/com/facebook/react/bridge/JSBundleLoaderDelegate.java b/ReactAndroid/src/main/java/com/facebook/react/bridge/JSBundleLoaderDelegate.java index b21c5b6887d..d4e6bb1cb93 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/bridge/JSBundleLoaderDelegate.java +++ b/ReactAndroid/src/main/java/com/facebook/react/bridge/JSBundleLoaderDelegate.java @@ -32,17 +32,6 @@ public interface JSBundleLoaderDelegate { */ void loadScriptFromFile(String fileName, String sourceURL, boolean loadSynchronously); - /** - * Load a delta bundle from Metro. See {@link JSBundleLoader#createDeltaFromNetworkLoader(String, - * NativeDeltaClient)} - * - * @param sourceURL - * @param deltaClient - * @param loadSynchronously - */ - void loadScriptFromDeltaBundle( - String sourceURL, NativeDeltaClient deltaClient, boolean loadSynchronously); - /** * This API is used in situations where the JS bundle is being executed not on the device, but on * a host machine. In that case, we must provide two source URLs for the JS bundle: One to be used diff --git a/ReactAndroid/src/main/java/com/facebook/react/bridge/NativeDeltaClient.java b/ReactAndroid/src/main/java/com/facebook/react/bridge/NativeDeltaClient.java deleted file mode 100644 index 39ebf53b636..00000000000 --- a/ReactAndroid/src/main/java/com/facebook/react/bridge/NativeDeltaClient.java +++ /dev/null @@ -1,25 +0,0 @@ -/** - * Copyright (c) Facebook, Inc. and its affiliates. - * - *

This source code is licensed under the MIT license found in the LICENSE file in the root - * directory of this source tree. - */ -package com.facebook.react.bridge; - -import com.facebook.jni.HybridData; -import java.nio.channels.ReadableByteChannel; - -public class NativeDeltaClient { - static { - ReactBridge.staticInit(); - } - - // C++ parts - private final HybridData mHybridData = initHybrid(); - - private static native HybridData initHybrid(); - - public native void reset(); - - public native void processDelta(ReadableByteChannel deltaMessage); -} diff --git a/ReactAndroid/src/main/java/com/facebook/react/devsupport/BundleDeltaClient.java b/ReactAndroid/src/main/java/com/facebook/react/devsupport/BundleDeltaClient.java deleted file mode 100644 index 5dceb37de0e..00000000000 --- a/ReactAndroid/src/main/java/com/facebook/react/devsupport/BundleDeltaClient.java +++ /dev/null @@ -1,202 +0,0 @@ -/** - * Copyright (c) Facebook, Inc. and its affiliates. - * - *

This source code is licensed under the MIT license found in the LICENSE file in the root - * directory of this source tree. - */ -package com.facebook.react.devsupport; - -import android.util.JsonReader; -import android.util.Pair; -import androidx.annotation.Nullable; -import com.facebook.react.bridge.NativeDeltaClient; -import java.io.File; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.InputStreamReader; -import java.util.TreeMap; -import okhttp3.Headers; -import okio.BufferedSource; - -public abstract class BundleDeltaClient { - - private static final String METRO_DELTA_ID_HEADER = "X-Metro-Delta-ID"; - @Nullable private String mRevisionId; - - public enum ClientType { - NONE, - DEV_SUPPORT, - NATIVE - } - - static boolean isDeltaUrl(String bundleUrl) { - return bundleUrl.indexOf(".delta?") != -1; - } - - @Nullable - static BundleDeltaClient create(ClientType type) { - switch (type) { - case DEV_SUPPORT: - return new BundleDeltaJavaClient(); - case NATIVE: - return new BundleDeltaNativeClient(); - } - return null; - } - - public abstract boolean canHandle(ClientType type); - - protected abstract Pair processDelta( - BufferedSource body, File outputFile) throws IOException; - - public final synchronized String extendUrlForDelta(String bundleURL) { - return mRevisionId != null ? bundleURL + "&revisionId=" + mRevisionId : bundleURL; - } - - public synchronized void reset() { - mRevisionId = null; - } - - public synchronized Pair processDelta( - Headers headers, BufferedSource body, File outputFile) throws IOException { - - mRevisionId = headers.get(METRO_DELTA_ID_HEADER); - return processDelta(body, outputFile); - } - - private static class BundleDeltaJavaClient extends BundleDeltaClient { - - byte[] mPreCode; - byte[] mPostCode; - final TreeMap mModules = new TreeMap(); - - @Override - public boolean canHandle(ClientType type) { - return type == ClientType.DEV_SUPPORT; - } - - public synchronized void reset() { - super.reset(); - mPreCode = null; - mPostCode = null; - mModules.clear(); - } - - @Override - public synchronized Pair processDelta( - BufferedSource body, File outputFile) throws IOException { - JsonReader jsonReader = new JsonReader(new InputStreamReader(body.inputStream())); - jsonReader.beginObject(); - int numChangedModules = 0; - - while (jsonReader.hasNext()) { - String name = jsonReader.nextName(); - if (name.equals("pre")) { - mPreCode = jsonReader.nextString().getBytes(); - } else if (name.equals("post")) { - mPostCode = jsonReader.nextString().getBytes(); - } else if (name.equals("modules")) { - numChangedModules += setModules(jsonReader, mModules); - } else if (name.equals("added")) { - numChangedModules += setModules(jsonReader, mModules); - } else if (name.equals("modified")) { - numChangedModules += setModules(jsonReader, mModules); - } else if (name.equals("deleted")) { - numChangedModules += removeModules(jsonReader, mModules); - } else { - jsonReader.skipValue(); - } - } - - jsonReader.endObject(); - jsonReader.close(); - - if (numChangedModules == 0) { - // If we receive an empty delta, we don't need to save the file again (it'll have the - // same content). - return Pair.create(Boolean.FALSE, null); - } - - FileOutputStream fileOutputStream = new FileOutputStream(outputFile); - - try { - fileOutputStream.write(mPreCode); - fileOutputStream.write('\n'); - - for (byte[] code : mModules.values()) { - fileOutputStream.write(code); - fileOutputStream.write('\n'); - } - - fileOutputStream.write(mPostCode); - fileOutputStream.write('\n'); - } finally { - fileOutputStream.flush(); - fileOutputStream.close(); - } - - return Pair.create(Boolean.TRUE, null); - } - - private static int setModules(JsonReader jsonReader, TreeMap map) - throws IOException { - jsonReader.beginArray(); - - int numModules = 0; - while (jsonReader.hasNext()) { - jsonReader.beginArray(); - - int moduleId = jsonReader.nextInt(); - - map.put(moduleId, jsonReader.nextString().getBytes()); - - jsonReader.endArray(); - numModules++; - } - - jsonReader.endArray(); - - return numModules; - } - - private static int removeModules(JsonReader jsonReader, TreeMap map) - throws IOException { - jsonReader.beginArray(); - - int numModules = 0; - while (jsonReader.hasNext()) { - int moduleId = jsonReader.nextInt(); - - map.remove(moduleId); - - numModules++; - } - - jsonReader.endArray(); - - return numModules; - } - } - - private static class BundleDeltaNativeClient extends BundleDeltaClient { - private final NativeDeltaClient nativeClient = new NativeDeltaClient(); - - @Override - public boolean canHandle(ClientType type) { - return type == ClientType.NATIVE; - } - - @Override - protected Pair processDelta(BufferedSource body, File outputFile) - throws IOException { - nativeClient.processDelta(body); - return Pair.create(Boolean.FALSE, nativeClient); - } - - @Override - public void reset() { - super.reset(); - nativeClient.reset(); - } - } -} diff --git a/ReactAndroid/src/main/java/com/facebook/react/devsupport/BundleDownloader.java b/ReactAndroid/src/main/java/com/facebook/react/devsupport/BundleDownloader.java index 6478591c588..f5984bc8bb2 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/devsupport/BundleDownloader.java +++ b/ReactAndroid/src/main/java/com/facebook/react/devsupport/BundleDownloader.java @@ -7,11 +7,9 @@ package com.facebook.react.devsupport; import android.util.Log; -import android.util.Pair; import androidx.annotation.Nullable; import com.facebook.common.logging.FLog; import com.facebook.infer.annotation.Assertions; -import com.facebook.react.bridge.NativeDeltaClient; import com.facebook.react.common.DebugServerException; import com.facebook.react.common.ReactConstants; import com.facebook.react.devsupport.interfaces.DevBundleDownloadListener; @@ -41,12 +39,9 @@ public class BundleDownloader { private final OkHttpClient mClient; - private BundleDeltaClient mBundleDeltaClient; - private @Nullable Call mDownloadBundleFromURLCall; public static class BundleInfo { - private @Nullable String mDeltaClientName; private @Nullable String mUrl; private int mFilesChangedCount; @@ -59,7 +54,6 @@ public class BundleDownloader { try { JSONObject obj = new JSONObject(jsonStr); - info.mDeltaClientName = obj.getString("deltaClient"); info.mUrl = obj.getString("url"); info.mFilesChangedCount = obj.getInt("filesChangedCount"); } catch (JSONException e) { @@ -74,7 +68,6 @@ public class BundleDownloader { JSONObject obj = new JSONObject(); try { - obj.put("deltaClient", mDeltaClientName); obj.put("url", mUrl); obj.put("filesChangedCount", mFilesChangedCount); } catch (JSONException e) { @@ -85,10 +78,6 @@ public class BundleDownloader { return obj.toString(); } - public @Nullable String getDeltaClient() { - return mDeltaClientName; - } - public String getUrl() { return mUrl != null ? mUrl : "unknown"; } @@ -106,10 +95,8 @@ public class BundleDownloader { final DevBundleDownloadListener callback, final File outputFile, final String bundleURL, - final @Nullable BundleInfo bundleInfo, - final BundleDeltaClient.ClientType clientType) { - downloadBundleFromURL( - callback, outputFile, bundleURL, bundleInfo, clientType, new Request.Builder()); + final @Nullable BundleInfo bundleInfo) { + downloadBundleFromURL(callback, outputFile, bundleURL, bundleInfo, new Request.Builder()); } public void downloadBundleFromURL( @@ -117,12 +104,11 @@ public class BundleDownloader { final File outputFile, final String bundleURL, final @Nullable BundleInfo bundleInfo, - final BundleDeltaClient.ClientType clientType, Request.Builder requestBuilder) { final Request request = requestBuilder - .url(formatBundleUrl(bundleURL, clientType)) + .url(formatBundleUrl(bundleURL)) // FIXME: there is a bug that makes MultipartStreamReader to never find the end of the // multipart message. This temporarily disables the multipart mode to work around it, // but @@ -165,8 +151,7 @@ public class BundleDownloader { Matcher match = regex.matcher(contentType); try (Response r = response) { if (match.find()) { - processMultipartResponse( - url, r, match.group(1), outputFile, bundleInfo, clientType, callback); + processMultipartResponse(url, r, match.group(1), outputFile, bundleInfo, callback); } else { // In case the server doesn't support multipart/mixed responses, fallback to normal // download. @@ -177,7 +162,6 @@ public class BundleDownloader { Okio.buffer(r.body().source()), outputFile, bundleInfo, - clientType, callback); } } @@ -185,12 +169,8 @@ public class BundleDownloader { }); } - private String formatBundleUrl(String bundleURL, BundleDeltaClient.ClientType clientType) { - return BundleDeltaClient.isDeltaUrl(bundleURL) - && mBundleDeltaClient != null - && mBundleDeltaClient.canHandle(clientType) - ? mBundleDeltaClient.extendUrlForDelta(bundleURL) - : bundleURL; + private String formatBundleUrl(String bundleURL) { + return bundleURL; } private void processMultipartResponse( @@ -199,7 +179,6 @@ public class BundleDownloader { String boundary, final File outputFile, @Nullable final BundleInfo bundleInfo, - final BundleDeltaClient.ClientType clientType, final DevBundleDownloadListener callback) throws IOException { @@ -223,14 +202,7 @@ public class BundleDownloader { status = Integer.parseInt(headers.get("X-Http-Status")); } processBundleResult( - url, - status, - Headers.of(headers), - body, - outputFile, - bundleInfo, - clientType, - callback); + url, status, Headers.of(headers), body, outputFile, bundleInfo, callback); } else { if (!headers.containsKey("Content-Type") || !headers.get("Content-Type").equals("application/json")) { @@ -286,7 +258,6 @@ public class BundleDownloader { BufferedSource body, File outputFile, BundleInfo bundleInfo, - BundleDeltaClient.ClientType clientType, DevBundleDownloadListener callback) throws IOException { // Check for server errors. If the server error has the expected form, fail with more info. @@ -311,41 +282,19 @@ public class BundleDownloader { } if (bundleInfo != null) { - populateBundleInfo(url, headers, clientType, bundleInfo); + populateBundleInfo(url, headers, bundleInfo); } File tmpFile = new File(outputFile.getPath() + ".tmp"); - boolean bundleWritten; - NativeDeltaClient nativeDeltaClient = null; - - if (BundleDeltaClient.isDeltaUrl(url)) { - // If the bundle URL has the delta extension, we need to use the delta patching logic. - BundleDeltaClient deltaClient = getBundleDeltaClient(clientType); - Assertions.assertNotNull(deltaClient); - Pair result = deltaClient.processDelta(headers, body, tmpFile); - bundleWritten = result.first; - nativeDeltaClient = result.second; - } else { - mBundleDeltaClient = null; - bundleWritten = storePlainJSInFile(body, tmpFile); - } - - if (bundleWritten) { + if (storePlainJSInFile(body, tmpFile)) { // If we have received a new bundle from the server, move it to its final destination. if (!tmpFile.renameTo(outputFile)) { throw new IOException("Couldn't rename " + tmpFile + " to " + outputFile); } } - callback.onSuccess(nativeDeltaClient); - } - - private BundleDeltaClient getBundleDeltaClient(BundleDeltaClient.ClientType clientType) { - if (mBundleDeltaClient == null || !mBundleDeltaClient.canHandle(clientType)) { - mBundleDeltaClient = BundleDeltaClient.create(clientType); - } - return mBundleDeltaClient; + callback.onSuccess(); } private static boolean storePlainJSInFile(BufferedSource body, File outputFile) @@ -363,10 +312,7 @@ public class BundleDownloader { return true; } - private static void populateBundleInfo( - String url, Headers headers, BundleDeltaClient.ClientType clientType, BundleInfo bundleInfo) { - bundleInfo.mDeltaClientName = - clientType == BundleDeltaClient.ClientType.NONE ? null : clientType.name(); + private static void populateBundleInfo(String url, Headers headers, BundleInfo bundleInfo) { bundleInfo.mUrl = url; String filesChangedCountStr = headers.get("X-Metro-Files-Changed-Count"); diff --git a/ReactAndroid/src/main/java/com/facebook/react/devsupport/DevInternalSettings.java b/ReactAndroid/src/main/java/com/facebook/react/devsupport/DevInternalSettings.java index c4a48a4281b..4465e8a6e9d 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/devsupport/DevInternalSettings.java +++ b/ReactAndroid/src/main/java/com/facebook/react/devsupport/DevInternalSettings.java @@ -6,7 +6,6 @@ */ package com.facebook.react.devsupport; -import android.annotation.SuppressLint; import android.content.Context; import android.content.SharedPreferences; import android.preference.PreferenceManager; @@ -27,8 +26,6 @@ public class DevInternalSettings private static final String PREFS_FPS_DEBUG_KEY = "fps_debug"; private static final String PREFS_JS_DEV_MODE_DEBUG_KEY = "js_dev_mode_debug"; private static final String PREFS_JS_MINIFY_DEBUG_KEY = "js_minify_debug"; - private static final String PREFS_JS_BUNDLE_DELTAS_KEY = "js_bundle_deltas"; - private static final String PREFS_JS_BUNDLE_DELTAS_CPP_KEY = "js_bundle_deltas_cpp"; private static final String PREFS_ANIMATIONS_DEBUG_KEY = "animations_debug"; // This option is no longer exposed in the dev menu UI. // It was renamed in D15958697 so it doesn't get stuck with no way to turn it off: @@ -42,24 +39,12 @@ public class DevInternalSettings private final SharedPreferences mPreferences; private final Listener mListener; private final PackagerConnectionSettings mPackagerConnectionSettings; - private final boolean mSupportsNativeDeltaClients; - - public static DevInternalSettings withoutNativeDeltaClient( - Context applicationContext, Listener listener) { - return new DevInternalSettings(applicationContext, listener, false); - } public DevInternalSettings(Context applicationContext, Listener listener) { - this(applicationContext, listener, true); - } - - private DevInternalSettings( - Context applicationContext, Listener listener, boolean supportsNativeDeltaClients) { mListener = listener; mPreferences = PreferenceManager.getDefaultSharedPreferences(applicationContext); mPreferences.registerOnSharedPreferenceChangeListener(this); mPackagerConnectionSettings = new PackagerConnectionSettings(applicationContext); - mSupportsNativeDeltaClients = supportsNativeDeltaClients; } public PackagerConnectionSettings getPackagerConnectionSettings() { @@ -99,8 +84,6 @@ public class DevInternalSettings if (PREFS_FPS_DEBUG_KEY.equals(key) || PREFS_RELOAD_ON_JS_CHANGE_KEY.equals(key) || PREFS_JS_DEV_MODE_DEBUG_KEY.equals(key) - || PREFS_JS_BUNDLE_DELTAS_KEY.equals(key) - || PREFS_JS_BUNDLE_DELTAS_CPP_KEY.equals(key) || PREFS_START_SAMPLING_PROFILER_ON_INIT.equals(key) || PREFS_JS_MINIFY_DEBUG_KEY.equals(key)) { mListener.onInternalSettingsChanged(); @@ -132,27 +115,6 @@ public class DevInternalSettings mPreferences.edit().putBoolean(PREFS_INSPECTOR_DEBUG_KEY, enabled).apply(); } - @SuppressLint("SharedPreferencesUse") - public boolean isBundleDeltasEnabled() { - return mPreferences.getBoolean(PREFS_JS_BUNDLE_DELTAS_KEY, false); - } - - @SuppressLint("SharedPreferencesUse") - public void setBundleDeltasEnabled(boolean enabled) { - mPreferences.edit().putBoolean(PREFS_JS_BUNDLE_DELTAS_KEY, enabled).apply(); - } - - @SuppressLint("SharedPreferencesUse") - public boolean isBundleDeltasCppEnabled() { - return mSupportsNativeDeltaClients - && mPreferences.getBoolean(PREFS_JS_BUNDLE_DELTAS_CPP_KEY, false); - } - - @SuppressLint("SharedPreferencesUse") - public void setBundleDeltasCppEnabled(boolean enabled) { - mPreferences.edit().putBoolean(PREFS_JS_BUNDLE_DELTAS_CPP_KEY, enabled).apply(); - } - @Override public boolean isNuclideJSDebugEnabled() { return ReactBuildConfig.IS_INTERNAL_BUILD && ReactBuildConfig.DEBUG; diff --git a/ReactAndroid/src/main/java/com/facebook/react/devsupport/DevServerHelper.java b/ReactAndroid/src/main/java/com/facebook/react/devsupport/DevServerHelper.java index 09681da38cf..52c64777611 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/devsupport/DevServerHelper.java +++ b/ReactAndroid/src/main/java/com/facebook/react/devsupport/DevServerHelper.java @@ -102,7 +102,6 @@ public class DevServerHelper { private enum BundleType { BUNDLE("bundle"), - DELTA("delta"), MAP("map"); private final String mTypeID; @@ -397,8 +396,7 @@ public class DevServerHelper { File outputFile, String bundleURL, BundleDownloader.BundleInfo bundleInfo) { - mBundleDownloader.downloadBundleFromURL( - callback, outputFile, bundleURL, bundleInfo, getDeltaClientType()); + mBundleDownloader.downloadBundleFromURL(callback, outputFile, bundleURL, bundleInfo); } public void downloadBundleFromURL( @@ -408,17 +406,7 @@ public class DevServerHelper { BundleDownloader.BundleInfo bundleInfo, Request.Builder requestBuilder) { mBundleDownloader.downloadBundleFromURL( - callback, outputFile, bundleURL, bundleInfo, getDeltaClientType(), requestBuilder); - } - - private BundleDeltaClient.ClientType getDeltaClientType() { - if (mSettings.isBundleDeltasCppEnabled()) { - return BundleDeltaClient.ClientType.NATIVE; - } else if (mSettings.isBundleDeltasEnabled()) { - return BundleDeltaClient.ClientType.DEV_SUPPORT; - } else { - return BundleDeltaClient.ClientType.NONE; - } + callback, outputFile, bundleURL, bundleInfo, requestBuilder); } /** @return the host to use when connecting to the bundle server from the host itself. */ @@ -475,7 +463,7 @@ public class DevServerHelper { public String getDevServerBundleURL(final String jsModulePath) { return createBundleURL( jsModulePath, - mSettings.isBundleDeltasEnabled() ? BundleType.DELTA : BundleType.BUNDLE, + BundleType.BUNDLE, mSettings.getPackagerConnectionSettings().getDebugServerHost()); } @@ -652,8 +640,7 @@ public class DevServerHelper { } public String getSourceUrl(String mainModuleName) { - return createBundleURL( - mainModuleName, mSettings.isBundleDeltasEnabled() ? BundleType.DELTA : BundleType.BUNDLE); + return createBundleURL(mainModuleName, BundleType.BUNDLE); } public String getJSBundleURLForRemoteDebugging(String mainModuleName) { diff --git a/ReactAndroid/src/main/java/com/facebook/react/devsupport/DevSupportManagerImpl.java b/ReactAndroid/src/main/java/com/facebook/react/devsupport/DevSupportManagerImpl.java index 70b3eb954d0..163e27e4ef6 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/devsupport/DevSupportManagerImpl.java +++ b/ReactAndroid/src/main/java/com/facebook/react/devsupport/DevSupportManagerImpl.java @@ -30,7 +30,6 @@ import com.facebook.react.bridge.CatalystInstance; import com.facebook.react.bridge.DefaultNativeModuleCallExceptionHandler; import com.facebook.react.bridge.JavaJSExecutor; import com.facebook.react.bridge.JavaScriptExecutorFactory; -import com.facebook.react.bridge.NativeDeltaClient; import com.facebook.react.bridge.ReactContext; import com.facebook.react.bridge.ReactMarker; import com.facebook.react.bridge.ReactMarkerConstants; @@ -1026,7 +1025,7 @@ public class DevSupportManagerImpl mDevServerHelper.downloadBundleFromURL( new DevBundleDownloadListener() { @Override - public void onSuccess(final @Nullable NativeDeltaClient nativeDeltaClient) { + public void onSuccess() { mDevLoadingViewController.hide(); mDevLoadingViewVisible = false; synchronized (DevSupportManagerImpl.this) { @@ -1034,7 +1033,7 @@ public class DevSupportManagerImpl mBundleStatus.updateTimestamp = System.currentTimeMillis(); } if (mBundleDownloadListener != null) { - mBundleDownloadListener.onSuccess(nativeDeltaClient); + mBundleDownloadListener.onSuccess(); } UiThreadUtil.runOnUiThread( new Runnable() { @@ -1042,7 +1041,7 @@ public class DevSupportManagerImpl public void run() { ReactMarker.logMarker( ReactMarkerConstants.DOWNLOAD_END, bundleInfo.toJSONString()); - mReactInstanceManagerHelper.onJSBundleLoadedFromServer(nativeDeltaClient); + mReactInstanceManagerHelper.onJSBundleLoadedFromServer(); } }); } diff --git a/ReactAndroid/src/main/java/com/facebook/react/devsupport/ReactInstanceManagerDevHelper.java b/ReactAndroid/src/main/java/com/facebook/react/devsupport/ReactInstanceManagerDevHelper.java index 6cb86590225..5807b243d00 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/devsupport/ReactInstanceManagerDevHelper.java +++ b/ReactAndroid/src/main/java/com/facebook/react/devsupport/ReactInstanceManagerDevHelper.java @@ -10,7 +10,6 @@ import android.app.Activity; import androidx.annotation.Nullable; import com.facebook.react.bridge.JavaJSExecutor; import com.facebook.react.bridge.JavaScriptExecutorFactory; -import com.facebook.react.bridge.NativeDeltaClient; /** * Interface used by {@link DevSupportManager} for accessing some fields and methods of {@link @@ -22,7 +21,7 @@ public interface ReactInstanceManagerDevHelper { void onReloadWithJSDebugger(JavaJSExecutor.Factory proxyExecutorFactory); /** Notify react instance manager about new JS bundle version downloaded from the server. */ - void onJSBundleLoadedFromServer(@Nullable NativeDeltaClient nativeDeltaClient); + void onJSBundleLoadedFromServer(); /** Request to toggle the react element inspector. */ void toggleElementInspector(); diff --git a/ReactAndroid/src/main/java/com/facebook/react/devsupport/interfaces/DevBundleDownloadListener.java b/ReactAndroid/src/main/java/com/facebook/react/devsupport/interfaces/DevBundleDownloadListener.java index 8ddd20af41c..00ed879e355 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/devsupport/interfaces/DevBundleDownloadListener.java +++ b/ReactAndroid/src/main/java/com/facebook/react/devsupport/interfaces/DevBundleDownloadListener.java @@ -7,10 +7,9 @@ package com.facebook.react.devsupport.interfaces; import androidx.annotation.Nullable; -import com.facebook.react.bridge.NativeDeltaClient; public interface DevBundleDownloadListener { - void onSuccess(@Nullable NativeDeltaClient nativeDeltaClient); + void onSuccess(); void onProgress(@Nullable String status, @Nullable Integer done, @Nullable Integer total); diff --git a/ReactAndroid/src/main/jni/react/jni/CatalystInstanceImpl.cpp b/ReactAndroid/src/main/jni/react/jni/CatalystInstanceImpl.cpp index 3782296ea28..1f03c154ae8 100644 --- a/ReactAndroid/src/main/jni/react/jni/CatalystInstanceImpl.cpp +++ b/ReactAndroid/src/main/jni/react/jni/CatalystInstanceImpl.cpp @@ -5,32 +5,31 @@ #include "CatalystInstanceImpl.h" -#include #include +#include #include #include +#include #include #include #include #include -#include #include #include #include -#include #include -#include +#include #include -#include +#include #include +#include #include #include -#include #include "CxxModuleWrapper.h" -#include "JavaScriptExecutorHolder.h" #include "JNativeRunnable.h" +#include "JavaScriptExecutorHolder.h" #include "JniJSModulesUnbundle.h" #include "NativeArray.h" @@ -48,14 +47,15 @@ class Exception : public jni::JavaClass { class JInstanceCallback : public InstanceCallback { public: explicit JInstanceCallback( - alias_ref jobj, - std::shared_ptr messageQueueThread) - : jobj_(make_global(jobj)), messageQueueThread_(std::move(messageQueueThread)) {} + alias_ref jobj, + std::shared_ptr messageQueueThread) + : jobj_(make_global(jobj)), + messageQueueThread_(std::move(messageQueueThread)) {} void onBatchComplete() override { messageQueueThread_->runOnQueue([this] { - static auto method = - ReactCallback::javaClassStatic()->getMethod("onBatchComplete"); + static auto method = ReactCallback::javaClassStatic()->getMethod( + "onBatchComplete"); method(jobj_); }); } @@ -65,15 +65,15 @@ class JInstanceCallback : public InstanceCallback { // managed by the module, via callJSCallback or callJSFunction. So, // we ensure that it is registered with the JVM. jni::ThreadScope guard; - static auto method = - ReactCallback::javaClassStatic()->getMethod("incrementPendingJSCalls"); + static auto method = ReactCallback::javaClassStatic()->getMethod( + "incrementPendingJSCalls"); method(jobj_); } void decrementPendingJSCalls() override { jni::ThreadScope guard; - static auto method = - ReactCallback::javaClassStatic()->getMethod("decrementPendingJSCalls"); + static auto method = ReactCallback::javaClassStatic()->getMethod( + "decrementPendingJSCalls"); method(jobj_); } @@ -82,15 +82,15 @@ class JInstanceCallback : public InstanceCallback { std::shared_ptr messageQueueThread_; }; -} +} // namespace -jni::local_ref CatalystInstanceImpl::initHybrid( - jni::alias_ref) { +jni::local_ref +CatalystInstanceImpl::initHybrid(jni::alias_ref) { return makeCxxInstance(); } CatalystInstanceImpl::CatalystInstanceImpl() - : instance_(folly::make_unique()) {} + : instance_(folly::make_unique()) {} CatalystInstanceImpl::~CatalystInstanceImpl() { if (moduleMessageQueue_ != NULL) { @@ -100,20 +100,34 @@ CatalystInstanceImpl::~CatalystInstanceImpl() { void CatalystInstanceImpl::registerNatives() { registerHybrid({ - makeNativeMethod("initHybrid", CatalystInstanceImpl::initHybrid), - makeNativeMethod("initializeBridge", CatalystInstanceImpl::initializeBridge), - makeNativeMethod("jniExtendNativeModules", CatalystInstanceImpl::extendNativeModules), - makeNativeMethod("jniSetSourceURL", CatalystInstanceImpl::jniSetSourceURL), - makeNativeMethod("jniRegisterSegment", CatalystInstanceImpl::jniRegisterSegment), - makeNativeMethod("jniLoadScriptFromAssets", CatalystInstanceImpl::jniLoadScriptFromAssets), - makeNativeMethod("jniLoadScriptFromFile", CatalystInstanceImpl::jniLoadScriptFromFile), - makeNativeMethod("jniLoadScriptFromDeltaBundle", CatalystInstanceImpl::jniLoadScriptFromDeltaBundle), - makeNativeMethod("jniCallJSFunction", CatalystInstanceImpl::jniCallJSFunction), - makeNativeMethod("jniCallJSCallback", CatalystInstanceImpl::jniCallJSCallback), - makeNativeMethod("setGlobalVariable", CatalystInstanceImpl::setGlobalVariable), - makeNativeMethod("getJavaScriptContext", CatalystInstanceImpl::getJavaScriptContext), - makeNativeMethod("getJSCallInvokerHolder", CatalystInstanceImpl::getJSCallInvokerHolder), - makeNativeMethod("jniHandleMemoryPressure", CatalystInstanceImpl::handleMemoryPressure), + makeNativeMethod("initHybrid", CatalystInstanceImpl::initHybrid), + makeNativeMethod( + "initializeBridge", CatalystInstanceImpl::initializeBridge), + makeNativeMethod( + "jniExtendNativeModules", CatalystInstanceImpl::extendNativeModules), + makeNativeMethod( + "jniSetSourceURL", CatalystInstanceImpl::jniSetSourceURL), + makeNativeMethod( + "jniRegisterSegment", CatalystInstanceImpl::jniRegisterSegment), + makeNativeMethod( + "jniLoadScriptFromAssets", + CatalystInstanceImpl::jniLoadScriptFromAssets), + makeNativeMethod( + "jniLoadScriptFromFile", CatalystInstanceImpl::jniLoadScriptFromFile), + makeNativeMethod( + "jniCallJSFunction", CatalystInstanceImpl::jniCallJSFunction), + makeNativeMethod( + "jniCallJSCallback", CatalystInstanceImpl::jniCallJSCallback), + makeNativeMethod( + "setGlobalVariable", CatalystInstanceImpl::setGlobalVariable), + makeNativeMethod( + "getJavaScriptContext", CatalystInstanceImpl::getJavaScriptContext), + makeNativeMethod( + "getJSCallInvokerHolder", + CatalystInstanceImpl::getJSCallInvokerHolder), + makeNativeMethod( + "jniHandleMemoryPressure", + CatalystInstanceImpl::handleMemoryPressure), }); JNativeRunnable::registerNatives(); @@ -122,18 +136,23 @@ void CatalystInstanceImpl::registerNatives() { void CatalystInstanceImpl::initializeBridge( jni::alias_ref callback, // This executor is actually a factory holder. - JavaScriptExecutorHolder* jseh, + JavaScriptExecutorHolder *jseh, jni::alias_ref jsQueue, jni::alias_ref nativeModulesQueue, - jni::alias_ref::javaobject> javaModules, - jni::alias_ref::javaobject> cxxModules) { + jni::alias_ref::javaobject> + javaModules, + jni::alias_ref::javaobject> + cxxModules) { // TODO mhorowitz: how to assert here? - // Assertions.assertCondition(mBridge == null, "initializeBridge should be called once"); - moduleMessageQueue_ = std::make_shared(nativeModulesQueue); + // Assertions.assertCondition(mBridge == null, "initializeBridge should be + // called once"); + moduleMessageQueue_ = + std::make_shared(nativeModulesQueue); // This used to be: // - // Java CatalystInstanceImpl -> C++ CatalystInstanceImpl -> Bridge -> Bridge::Callback + // Java CatalystInstanceImpl -> C++ CatalystInstanceImpl -> Bridge -> + // Bridge::Callback // --weak--> ReactCallback -> Java CatalystInstanceImpl // // Now the weak ref is a global ref. So breaking the loop depends on @@ -147,45 +166,46 @@ void CatalystInstanceImpl::initializeBridge( // don't need jsModuleDescriptions any more, all the way up and down the // stack. - moduleRegistry_ = std::make_shared( - buildNativeModuleList( - std::weak_ptr(instance_), - javaModules, - cxxModules, - moduleMessageQueue_)); + moduleRegistry_ = std::make_shared(buildNativeModuleList( + std::weak_ptr(instance_), + javaModules, + cxxModules, + moduleMessageQueue_)); instance_->initializeBridge( - std::make_unique( - callback, - moduleMessageQueue_), - jseh->getExecutorFactory(), - folly::make_unique(jsQueue), - moduleRegistry_); + std::make_unique(callback, moduleMessageQueue_), + jseh->getExecutorFactory(), + folly::make_unique(jsQueue), + moduleRegistry_); } void CatalystInstanceImpl::extendNativeModules( - jni::alias_ref::javaobject> javaModules, - jni::alias_ref::javaobject> cxxModules) { + jni::alias_ref::javaobject> + javaModules, + jni::alias_ref::javaobject> + cxxModules) { moduleRegistry_->registerModules(buildNativeModuleList( - std::weak_ptr(instance_), - javaModules, - cxxModules, - moduleMessageQueue_)); + std::weak_ptr(instance_), + javaModules, + cxxModules, + moduleMessageQueue_)); } -void CatalystInstanceImpl::jniSetSourceURL(const std::string& sourceURL) { +void CatalystInstanceImpl::jniSetSourceURL(const std::string &sourceURL) { instance_->setSourceURL(sourceURL); } -void CatalystInstanceImpl::jniRegisterSegment(int segmentId, const std::string& path) { +void CatalystInstanceImpl::jniRegisterSegment( + int segmentId, + const std::string &path) { instance_->registerBundle((uint32_t)segmentId, path); } void CatalystInstanceImpl::jniLoadScriptFromAssets( jni::alias_ref assetManager, - const std::string& assetURL, + const std::string &assetURL, bool loadSynchronously) { - const int kAssetsLength = 9; // strlen("assets://"); + const int kAssetsLength = 9; // strlen("assets://"); auto sourceURL = assetURL.substr(kAssetsLength); auto manager = extractAssetManager(assetManager); @@ -194,47 +214,37 @@ void CatalystInstanceImpl::jniLoadScriptFromAssets( auto bundle = JniJSModulesUnbundle::fromEntryFile(manager, sourceURL); auto registry = RAMBundleRegistry::singleBundleRegistry(std::move(bundle)); instance_->loadRAMBundle( - std::move(registry), - std::move(script), - sourceURL, - loadSynchronously); + std::move(registry), std::move(script), sourceURL, loadSynchronously); return; } else if (Instance::isIndexedRAMBundle(&script)) { instance_->loadRAMBundleFromString(std::move(script), sourceURL); } else { - instance_->loadScriptFromString(std::move(script), sourceURL, loadSynchronously); + instance_->loadScriptFromString( + std::move(script), sourceURL, loadSynchronously); } } -void CatalystInstanceImpl::jniLoadScriptFromFile(const std::string& fileName, - const std::string& sourceURL, - bool loadSynchronously) { +void CatalystInstanceImpl::jniLoadScriptFromFile( + const std::string &fileName, + const std::string &sourceURL, + bool loadSynchronously) { if (Instance::isIndexedRAMBundle(fileName.c_str())) { instance_->loadRAMBundleFromFile(fileName, sourceURL, loadSynchronously); } else { std::unique_ptr script; RecoverableError::runRethrowingAsRecoverable( - [&fileName, &script]() { - script = JSBigFileString::fromPath(fileName); - }); - instance_->loadScriptFromString(std::move(script), sourceURL, loadSynchronously); + [&fileName, &script]() { + script = JSBigFileString::fromPath(fileName); + }); + instance_->loadScriptFromString( + std::move(script), sourceURL, loadSynchronously); } } -void CatalystInstanceImpl::jniLoadScriptFromDeltaBundle( - const std::string& sourceURL, - jni::alias_ref jDeltaClient, - bool loadSynchronously) { - - auto deltaClient = jDeltaClient->cthis()->getDeltaClient(); - auto registry = RAMBundleRegistry::singleBundleRegistry( - folly::make_unique(deltaClient)); - - instance_->loadRAMBundle( - std::move(registry), deltaClient->getStartupCode(), sourceURL, loadSynchronously); -} - -void CatalystInstanceImpl::jniCallJSFunction(std::string module, std::string method, NativeArray* arguments) { +void CatalystInstanceImpl::jniCallJSFunction( + std::string module, + std::string method, + NativeArray *arguments) { // We want to share the C++ code, and on iOS, modules pass module/method // names as strings all the way through to JS, and there's no way to do // string -> id mapping on the objc side. So on Android, we convert the @@ -242,39 +252,45 @@ void CatalystInstanceImpl::jniCallJSFunction(std::string module, std::string met // used as ids if isFinite(), which handles this case, and looked up as // strings otherwise. Eventually, we'll probably want to modify the stack // from the JS proxy through here to use strings, too. - instance_->callJSFunction(std::move(module), - std::move(method), - arguments->consume()); + instance_->callJSFunction( + std::move(module), std::move(method), arguments->consume()); } -void CatalystInstanceImpl::jniCallJSCallback(jint callbackId, NativeArray* arguments) { +void CatalystInstanceImpl::jniCallJSCallback( + jint callbackId, + NativeArray *arguments) { instance_->callJSCallback(callbackId, arguments->consume()); } -void CatalystInstanceImpl::setGlobalVariable(std::string propName, - std::string&& jsonValue) { +void CatalystInstanceImpl::setGlobalVariable( + std::string propName, + std::string &&jsonValue) { // This is only ever called from Java with short strings, and only // for testing, so no need to try hard for zero-copy here. - instance_->setGlobalVariable(std::move(propName), - folly::make_unique(std::move(jsonValue))); + instance_->setGlobalVariable( + std::move(propName), + folly::make_unique(std::move(jsonValue))); } jlong CatalystInstanceImpl::getJavaScriptContext() { - return (jlong) (intptr_t) instance_->getJavaScriptContext(); + return (jlong)(intptr_t)instance_->getJavaScriptContext(); } void CatalystInstanceImpl::handleMemoryPressure(int pressureLevel) { instance_->handleMemoryPressure(pressureLevel); } -jni::alias_ref CatalystInstanceImpl::getJSCallInvokerHolder() { +jni::alias_ref +CatalystInstanceImpl::getJSCallInvokerHolder() { if (!javaInstanceHolder_) { jsCallInvoker_ = std::make_shared(instance_); - javaInstanceHolder_ = jni::make_global(JSCallInvokerHolder::newObjectCxxArgs(jsCallInvoker_)); + javaInstanceHolder_ = + jni::make_global(JSCallInvokerHolder::newObjectCxxArgs(jsCallInvoker_)); } return javaInstanceHolder_; } -}} +} // namespace react +} // namespace facebook diff --git a/ReactAndroid/src/main/jni/react/jni/CatalystInstanceImpl.h b/ReactAndroid/src/main/jni/react/jni/CatalystInstanceImpl.h index dab2007434e..6c39ae90f5c 100644 --- a/ReactAndroid/src/main/jni/react/jni/CatalystInstanceImpl.h +++ b/ReactAndroid/src/main/jni/react/jni/CatalystInstanceImpl.h @@ -5,17 +5,16 @@ #include +#include +#include #include #include -#include -#include #include "CxxModuleWrapper.h" -#include "JavaModuleWrapper.h" #include "JMessageQueueThread.h" #include "JSLoader.h" +#include "JavaModuleWrapper.h" #include "ModuleRegistryBuilder.h" -#include "NativeDeltaClient.h" namespace facebook { namespace react { @@ -25,12 +24,14 @@ class JavaScriptExecutorHolder; class NativeArray; struct ReactCallback : public jni::JavaClass { - static constexpr auto kJavaDescriptor = "Lcom/facebook/react/bridge/ReactCallback;"; + static constexpr auto kJavaDescriptor = + "Lcom/facebook/react/bridge/ReactCallback;"; }; class CatalystInstanceImpl : public jni::HybridClass { public: - static constexpr auto kJavaDescriptor = "Lcom/facebook/react/bridge/CatalystInstanceImpl;"; + static constexpr auto kJavaDescriptor = + "Lcom/facebook/react/bridge/CatalystInstanceImpl;"; static jni::local_ref initHybrid(jni::alias_ref); ~CatalystInstanceImpl() override; @@ -49,35 +50,47 @@ class CatalystInstanceImpl : public jni::HybridClass { void initializeBridge( jni::alias_ref callback, // This executor is actually a factory holder. - JavaScriptExecutorHolder* jseh, + JavaScriptExecutorHolder *jseh, jni::alias_ref jsQueue, jni::alias_ref moduleQueue, - jni::alias_ref::javaobject> javaModules, - jni::alias_ref::javaobject> cxxModules); + jni::alias_ref< + jni::JCollection::javaobject> + javaModules, + jni::alias_ref::javaobject> + cxxModules); void extendNativeModules( - jni::alias_ref::javaobject> javaModules, - jni::alias_ref::javaobject> cxxModules); + jni::alias_ref::javaobject> javaModules, + jni::alias_ref::javaobject> + cxxModules); /** * Sets the source URL of the underlying bridge without loading any JS code. */ - void jniSetSourceURL(const std::string& sourceURL); + void jniSetSourceURL(const std::string &sourceURL); /** * Registers the file path of an additional JS segment by its ID. * */ - void jniRegisterSegment(int segmentId, const std::string& path); + void jniRegisterSegment(int segmentId, const std::string &path); - void jniLoadScriptFromAssets(jni::alias_ref assetManager, const std::string& assetURL, bool loadSynchronously); - void jniLoadScriptFromFile(const std::string& fileName, const std::string& sourceURL, bool loadSynchronously); - void jniLoadScriptFromDeltaBundle(const std::string& sourceURL, jni::alias_ref deltaClient, bool loadSynchronously); - void jniCallJSFunction(std::string module, std::string method, NativeArray* arguments); - void jniCallJSCallback(jint callbackId, NativeArray* arguments); + void jniLoadScriptFromAssets( + jni::alias_ref assetManager, + const std::string &assetURL, + bool loadSynchronously); + void jniLoadScriptFromFile( + const std::string &fileName, + const std::string &sourceURL, + bool loadSynchronously); + void jniCallJSFunction( + std::string module, + std::string method, + NativeArray *arguments); + void jniCallJSCallback(jint callbackId, NativeArray *arguments); jni::alias_ref getJSCallInvokerHolder(); - void setGlobalVariable(std::string propName, - std::string&& jsonValue); + void setGlobalVariable(std::string propName, std::string &&jsonValue); jlong getJavaScriptContext(); void handleMemoryPressure(int pressureLevel); @@ -90,4 +103,5 @@ class CatalystInstanceImpl : public jni::HybridClass { std::shared_ptr jsCallInvoker_; }; -}} +} // namespace react +} // namespace facebook diff --git a/ReactAndroid/src/main/jni/react/jni/NativeDeltaClient.cpp b/ReactAndroid/src/main/jni/react/jni/NativeDeltaClient.cpp deleted file mode 100644 index 5a9c007bb24..00000000000 --- a/ReactAndroid/src/main/jni/react/jni/NativeDeltaClient.cpp +++ /dev/null @@ -1,57 +0,0 @@ -// Copyright (c) Facebook, Inc. and its affiliates. - -// This source code is licensed under the MIT license found in the -// LICENSE file in the root directory of this source tree. - -#include "NativeDeltaClient.h" - -#include -#include -#include - -namespace facebook { -namespace react { - -jni::local_ref NativeDeltaClient::initHybrid( - jni::alias_ref) { - return makeCxxInstance(); -} - -void NativeDeltaClient::registerNatives() { - registerHybrid({ - makeNativeMethod("initHybrid", NativeDeltaClient::initHybrid), - makeNativeMethod("processDelta", NativeDeltaClient::jniProcessDelta), - makeNativeMethod("reset", NativeDeltaClient::jniReset), - }); -} - -void NativeDeltaClient::jniProcessDelta( - jni::alias_ref delta) { - - std::ostringstream deltaMessage; - std::vector buffer(8192); - auto byteBuffer = jni::JByteBuffer::wrapBytes(buffer.data(), buffer.size()); - - size_t pos = 0; - int read = 0; - do { - read = delta->read(byteBuffer); - if (read < 1) { - deltaMessage.write(reinterpret_cast(buffer.data()), pos); - byteBuffer->rewind(); - pos = 0; - } else { - pos += read; - } - } while (read != -1); - - - deltaClient_->patch(folly::parseJson(deltaMessage.str())); -} - -void NativeDeltaClient::jniReset() { - deltaClient_->clear(); -} - -} // namespace react -} // namespace facebook diff --git a/ReactAndroid/src/main/jni/react/jni/NativeDeltaClient.h b/ReactAndroid/src/main/jni/react/jni/NativeDeltaClient.h deleted file mode 100644 index a991e3a2c03..00000000000 --- a/ReactAndroid/src/main/jni/react/jni/NativeDeltaClient.h +++ /dev/null @@ -1,41 +0,0 @@ -// Copyright (c) Facebook, Inc. and its affiliates. - -// This source code is licensed under the MIT license found in the -// LICENSE file in the root directory of this source tree. - -#pragma once - -#include - -#include -#include -#include -#include - -namespace facebook { -namespace react { - -class NativeDeltaClient : public jni::HybridClass { - -public: - static constexpr auto kJavaDescriptor = - "Lcom/facebook/react/bridge/NativeDeltaClient;"; - static jni::local_ref initHybrid(jni::alias_ref); - static void registerNatives(); - - ~NativeDeltaClient() override = default; - - std::shared_ptr getDeltaClient() { - return deltaClient_; - } - -private: - friend HybridBase; - void jniProcessDelta(jni::alias_ref delta); - void jniReset(); - const std::shared_ptr deltaClient_ = - std::make_shared(); -}; - -} // namespace react -} // namespace facebook diff --git a/ReactAndroid/src/main/jni/react/jni/OnLoad.cpp b/ReactAndroid/src/main/jni/react/jni/OnLoad.cpp index c754eb12b16..8c11fb99eb1 100644 --- a/ReactAndroid/src/main/jni/react/jni/OnLoad.cpp +++ b/ReactAndroid/src/main/jni/react/jni/OnLoad.cpp @@ -13,9 +13,8 @@ #include "CatalystInstanceImpl.h" #include "CxxModuleWrapper.h" -#include "JavaScriptExecutorHolder.h" #include "JCallback.h" -#include "NativeDeltaClient.h" +#include "JavaScriptExecutorHolder.h" #include "ProxyExecutor.h" #include "WritableNativeArray.h" #include "WritableNativeMap.h" @@ -32,24 +31,28 @@ namespace react { namespace { struct JavaJSExecutor : public JavaClass { - static constexpr auto kJavaDescriptor = "Lcom/facebook/react/bridge/JavaJSExecutor;"; + static constexpr auto kJavaDescriptor = + "Lcom/facebook/react/bridge/JavaJSExecutor;"; }; -class ProxyJavaScriptExecutorHolder : public HybridClass { +class ProxyJavaScriptExecutorHolder : public HybridClass< + ProxyJavaScriptExecutorHolder, + JavaScriptExecutorHolder> { public: - static constexpr auto kJavaDescriptor = "Lcom/facebook/react/bridge/ProxyJavaScriptExecutor;"; + static constexpr auto kJavaDescriptor = + "Lcom/facebook/react/bridge/ProxyJavaScriptExecutor;"; static local_ref initHybrid( - alias_ref, alias_ref executorInstance) { - return makeCxxInstance( - std::make_shared( + alias_ref, + alias_ref executorInstance) { + return makeCxxInstance(std::make_shared( make_global(executorInstance))); } static void registerNatives() { registerHybrid({ - makeNativeMethod("initHybrid", ProxyJavaScriptExecutorHolder::initHybrid), + makeNativeMethod( + "initHybrid", ProxyJavaScriptExecutorHolder::initHybrid), }); } @@ -58,9 +61,9 @@ class ProxyJavaScriptExecutorHolder : public HybridClass - - + - - This source code is licensed under the MIT license found in the LICENSE file in the root - * directory of this source tree. - */ -package com.facebook.react.devsupport; - -import static org.fest.assertions.api.Assertions.assertThat; - -import com.facebook.react.common.StandardCharsets; -import java.io.ByteArrayInputStream; -import java.io.File; -import java.io.IOException; -import java.nio.file.Files; -import okio.BufferedSource; -import okio.Okio; -import org.junit.Before; -import org.junit.Rule; -import org.junit.Test; -import org.junit.rules.TemporaryFolder; -import org.junit.runner.RunWith; -import org.robolectric.RobolectricTestRunner; - -@RunWith(RobolectricTestRunner.class) -public class BundleDeltaClientTest { - private BundleDeltaClient mClient; - - @Rule public TemporaryFolder mFolder = new TemporaryFolder(); - - @Before - public void setUp() { - mClient = BundleDeltaClient.create(BundleDeltaClient.ClientType.DEV_SUPPORT); - } - - @Test - public void testAcceptsSimpleInitialBundle() throws IOException { - File file = mFolder.newFile(); - mClient.processDelta( - bufferedSource( - "{" - + "\"pre\": \"console.log('Hello World!');\"," - + "\"post\": \"console.log('That is all folks!');\"," - + "\"modules\": [[0, \"console.log('Best module.');\"]]" - + "}"), - file); - assertThat(contentOf(file)) - .isEqualTo( - "console.log('Hello World!');\n" - + "console.log('Best module.');\n" - + "console.log('That is all folks!');\n"); - } - - @Test - public void testPatchesInitialBundleWithDeltaBundle() throws IOException { - File file = mFolder.newFile(); - mClient.processDelta( - bufferedSource( - "{" - + "\"pre\": \"pre\"," - + "\"post\": \"post\"," - + "\"modules\": [[0, \"0\"], [1, \"1\"]]" - + "}"), - file); - file = mFolder.newFile(); - mClient.processDelta( - bufferedSource( - "{" - + "\"added\": [[2, \"2\"]]," - + "\"modified\": [[0, \"0.1\"]]," - + "\"deleted\": [1]" - + "}"), - file); - assertThat(contentOf(file)).isEqualTo("pre\n" + "0.1\n" + "2\n" + "post\n"); - } - - @Test - public void testSortsModulesByIdInInitialBundle() throws IOException { - File file = mFolder.newFile(); - mClient.processDelta( - bufferedSource( - "{" - + "\"pre\": \"console.log('Hello World!');\"," - + "\"post\": \"console.log('That is all folks!');\"," - + "\"modules\": [[3, \"3\"], [0, \"0\"], [2, \"2\"], [1, \"1\"]]" - + "}"), - file); - assertThat(contentOf(file)) - .isEqualTo( - "console.log('Hello World!');\n" - + "0\n" - + "1\n" - + "2\n" - + "3\n" - + "console.log('That is all folks!');\n"); - } - - @Test - public void testSortsModulesByIdInPatchedBundle() throws IOException { - File file = mFolder.newFile(); - mClient.processDelta( - bufferedSource( - "{" - + "\"pre\": \"console.log('Hello World!');\"," - + "\"post\": \"console.log('That is all folks!');\"," - + "\"modules\": [[3, \"3\"], [0, \"0\"], [1, \"1\"]]" - + "}"), - file); - file = mFolder.newFile(); - mClient.processDelta( - bufferedSource( - "{" - + "\"added\": [[2, \"2\"]]," - + "\"modified\": [[0, \"0.1\"]]," - + "\"deleted\": [1]" - + "}"), - file); - assertThat(contentOf(file)) - .isEqualTo( - "console.log('Hello World!');\n" - + "0.1\n" - + "2\n" - + "3\n" - + "console.log('That is all folks!');\n"); - } - - private static BufferedSource bufferedSource(String string) { - return Okio.buffer( - Okio.source(new ByteArrayInputStream(string.getBytes(StandardCharsets.UTF_8)))); - } - - private static String contentOf(File file) throws IOException { - return new String(Files.readAllBytes(file.toPath()), StandardCharsets.UTF_8); - } -}