diff --git a/React/CxxBridge/RCTCxxBridge.mm b/React/CxxBridge/RCTCxxBridge.mm index cf667c325..5d187c7a0 100644 --- a/React/CxxBridge/RCTCxxBridge.mm +++ b/React/CxxBridge/RCTCxxBridge.mm @@ -328,9 +328,13 @@ struct RCTInstanceCallback : public InstanceCallback { BOOL useCustomJSC = [self.delegate respondsToSelector:@selector(shouldBridgeUseCustomJSC:)] && [self.delegate shouldBridgeUseCustomJSC:self]; + NSString *escapedDeviceName = [[[UIDevice currentDevice] name] stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; + NSString *escapedAppName = [[[NSBundle mainBundle] bundleIdentifier] stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; // The arg is a cache dir. It's not used with standard JSC. executorFactory.reset(new JSCExecutorFactory(folly::dynamic::object ("OwnerIdentity", "ReactNative") + ("AppIdentity", [(escapedAppName ?: @"unknown") UTF8String]) + ("DeviceIdentity", [(escapedDeviceName ?: @"unknown") UTF8String]) ("UseCustomJSC", (bool)useCustomJSC) #if RCT_PROFILE ("StartSamplingProfilerOnInit", (bool)self.devSettings.startSamplingProfilerOnLaunch) diff --git a/ReactAndroid/src/androidTest/java/com/facebook/react/testing/ReactTestHelper.java b/ReactAndroid/src/androidTest/java/com/facebook/react/testing/ReactTestHelper.java index 212397f00..63554242b 100644 --- a/ReactAndroid/src/androidTest/java/com/facebook/react/testing/ReactTestHelper.java +++ b/ReactAndroid/src/androidTest/java/com/facebook/react/testing/ReactTestHelper.java @@ -73,7 +73,7 @@ public class ReactTestHelper { } JavaScriptExecutor executor = null; try { - executor = new JSCJavaScriptExecutorFactory().create(); + executor = new JSCJavaScriptExecutorFactory("ReactTestHelperApp", "ReactTestHelperDevice").create(); } catch (Exception e) { throw new RuntimeException(e); } diff --git a/ReactAndroid/src/main/java/com/facebook/react/ReactInstanceManagerBuilder.java b/ReactAndroid/src/main/java/com/facebook/react/ReactInstanceManagerBuilder.java index 7344bcfb6..5397e40f5 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/ReactInstanceManagerBuilder.java +++ b/ReactAndroid/src/main/java/com/facebook/react/ReactInstanceManagerBuilder.java @@ -2,8 +2,12 @@ package com.facebook.react; +import static com.facebook.react.modules.systeminfo.AndroidInfoHelpers.getFriendlyDeviceName; + import android.app.Activity; import android.app.Application; +import android.net.Uri; +import android.os.Build; import com.facebook.infer.annotation.Assertions; import com.facebook.react.bridge.JSBundleLoader; import com.facebook.react.bridge.JSCJavaScriptExecutorFactory; @@ -262,12 +266,15 @@ public class ReactInstanceManagerBuilder { mUIImplementationProvider = new UIImplementationProvider(); } + String appName = Uri.encode(mApplication.getPackageName()); + String deviceName = Uri.encode(getFriendlyDeviceName()); + return new ReactInstanceManager( mApplication, mCurrentActivity, mDefaultHardwareBackBtnHandler, mJavaScriptExecutorFactory == null - ? new JSCJavaScriptExecutorFactory() + ? new JSCJavaScriptExecutorFactory(appName, deviceName) : mJavaScriptExecutorFactory, (mJSBundleLoader == null && mJSBundleAssetUrl != null) ? JSBundleLoader.createAssetLoader( diff --git a/ReactAndroid/src/main/java/com/facebook/react/bridge/JSCJavaScriptExecutorFactory.java b/ReactAndroid/src/main/java/com/facebook/react/bridge/JSCJavaScriptExecutorFactory.java index b02a2f94d..da2c87c1f 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/bridge/JSCJavaScriptExecutorFactory.java +++ b/ReactAndroid/src/main/java/com/facebook/react/bridge/JSCJavaScriptExecutorFactory.java @@ -10,10 +10,20 @@ package com.facebook.react.bridge; public class JSCJavaScriptExecutorFactory implements JavaScriptExecutorFactory { + private final String mAppName; + private final String mDeviceName; + + public JSCJavaScriptExecutorFactory(String appName, String deviceName) { + this.mAppName = appName; + this.mDeviceName = deviceName; + } + @Override public JavaScriptExecutor create() throws Exception { WritableNativeMap jscConfig = new WritableNativeMap(); jscConfig.putString("OwnerIdentity", "ReactNative"); + jscConfig.putString("AppIdentity", mAppName); + jscConfig.putString("OwnerIdentity", mDeviceName); return new JSCJavaScriptExecutor(jscConfig); } } diff --git a/ReactAndroid/src/main/java/com/facebook/react/modules/systeminfo/AndroidInfoHelpers.java b/ReactAndroid/src/main/java/com/facebook/react/modules/systeminfo/AndroidInfoHelpers.java index b3dd6f1a7..6706ab2f7 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/modules/systeminfo/AndroidInfoHelpers.java +++ b/ReactAndroid/src/main/java/com/facebook/react/modules/systeminfo/AndroidInfoHelpers.java @@ -31,6 +31,7 @@ public class AndroidInfoHelpers { return getServerIpAddress(INSPECTOR_PROXY_PORT); } + // FIXME(festevezga): This method is duplicated in an internal module. Any changes should be applied to both. public static String getFriendlyDeviceName() { if (isRunningOnGenymotion()) { // Genymotion already has a friendly name by default diff --git a/ReactCommon/cxxreact/JSCExecutor.cpp b/ReactCommon/cxxreact/JSCExecutor.cpp index f1162fe37..26dd5d336 100644 --- a/ReactCommon/cxxreact/JSCExecutor.cpp +++ b/ReactCommon/cxxreact/JSCExecutor.cpp @@ -209,9 +209,14 @@ void JSCExecutor::initOnJSVMThread() throw(JSException) { Object::getGlobalObject(m_context).setPrivate(this); if (canUseInspector(m_context)) { - const std::string ownerId = m_jscConfig.getDefault("OwnerIdentity", "main").getString(); + const std::string ownerId = m_jscConfig.getDefault("OwnerIdentity", "unknown").getString(); + const std::string appId = m_jscConfig.getDefault("AppIdentity", "unknown").getString(); + const std::string deviceId = m_jscConfig.getDefault("DeviceIdentity", "unknown").getString(); + const std::function checkIsInspectedRemote = [&ownerId, &appId, &deviceId](){ + return false; + }; IInspector* pInspector = JSC_JSInspectorGetInstance(true); - pInspector->registerGlobalContext(ownerId, m_context); + pInspector->registerGlobalContext(ownerId, checkIsInspectedRemote, m_context); } installNativeHook<&JSCExecutor::nativeFlushQueueImmediate>("nativeFlushQueueImmediate"); diff --git a/ReactCommon/jschelpers/InspectorInterfaces.h b/ReactCommon/jschelpers/InspectorInterfaces.h index d1da62f66..abf92bf37 100644 --- a/ReactCommon/jschelpers/InspectorInterfaces.h +++ b/ReactCommon/jschelpers/InspectorInterfaces.h @@ -9,9 +9,11 @@ #pragma once +#include #include #include #include + #include namespace facebook { @@ -44,7 +46,7 @@ public: // Note: not destructible! class IInspector { public: - virtual void registerGlobalContext(std::string title, JSGlobalContextRef ctx) = 0; + virtual void registerGlobalContext(const std::string& title, const std::function &checkIsInspectedRemote, JSGlobalContextRef ctx) = 0; virtual void unregisterGlobalContext(JSGlobalContextRef ctx) = 0; virtual std::vector getPages() const = 0;