From da14fad829732b638373464b55a79d3b143116a9 Mon Sep 17 00:00:00 2001 From: Paco Estevez Garcia Date: Tue, 3 Oct 2017 05:45:31 -0700 Subject: [PATCH] Add AppIdentity and DeviceIdentity to Inspector Reviewed By: Hypuk Differential Revision: D5924011 fbshipit-source-id: a81d420dbe1a5ede203d2fa313548e19664b9587 --- React/CxxBridge/RCTCxxBridge.mm | 4 ++++ .../com/facebook/react/testing/ReactTestHelper.java | 2 +- .../facebook/react/ReactInstanceManagerBuilder.java | 9 ++++++++- .../react/bridge/JSCJavaScriptExecutorFactory.java | 10 ++++++++++ .../react/modules/systeminfo/AndroidInfoHelpers.java | 1 + ReactCommon/cxxreact/JSCExecutor.cpp | 9 +++++++-- ReactCommon/jschelpers/InspectorInterfaces.h | 4 +++- 7 files changed, 34 insertions(+), 5 deletions(-) diff --git a/React/CxxBridge/RCTCxxBridge.mm b/React/CxxBridge/RCTCxxBridge.mm index cf667c325e3..5d187c7a08e 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 212397f00a5..63554242b9d 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 7344bcfb686..5397e40f5aa 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 b02a2f94de2..da2c87c1f02 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 b3dd6f1a7e7..6706ab2f79b 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 f1162fe37a9..26dd5d33674 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 d1da62f6698..abf92bf371a 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;