From f23c022f1b4459d80070d94275d383fe306ac9ea Mon Sep 17 00:00:00 2001 From: Andy Street Date: Thu, 25 Jun 2015 05:37:22 -0700 Subject: [PATCH] [ReactNative] Send debug component ownership info in createView --- .../RCTDebugComponentOwnership.js | 55 +++++++++++++++++++ .../InitializeJavaScriptAppEngine.js | 1 + 2 files changed, 56 insertions(+) create mode 100644 Libraries/DebugComponentHierarchy/RCTDebugComponentOwnership.js diff --git a/Libraries/DebugComponentHierarchy/RCTDebugComponentOwnership.js b/Libraries/DebugComponentHierarchy/RCTDebugComponentOwnership.js new file mode 100644 index 000000000..4ee5a1f03 --- /dev/null +++ b/Libraries/DebugComponentHierarchy/RCTDebugComponentOwnership.js @@ -0,0 +1,55 @@ +/** + * Copyright (c) 2015-present, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * Utility class to provide the component owner hierarchy to native code for + * debugging purposes. + * + * @providesModule RCTDebugComponentOwnership + * @flow + */ + +'use strict'; + +var DebugComponentOwnershipModule = require('NativeModules').DebugComponentOwnershipModule; +var InspectorUtils = require('InspectorUtils'); +var ReactNativeTagHandles = require('ReactNativeTagHandles'); + +function componentToString(component) { + return component.getName ? component.getName() : 'Unknown'; +} + +function getRootTagForTag(tag: number): ?number { + var rootNodeID = ReactNativeTagHandles.tagToRootNodeID[tag]; + if (!rootNodeID) { + return null; + } + var rootID = ReactNativeTagHandles.getNativeTopRootIDFromNodeID(rootNodeID); + if (!rootID) { + return null; + } + return ReactNativeTagHandles.rootNodeIDToTag[rootID]; +} + +module.exports = { + + /** + * Asynchronously returns the owner hierarchy as an array of strings. Request id is + * passed along to the native module so that the native module can identify the + * particular call instance. + * + * Example returned owner hierarchy: ['RootView', 'Dialog', 'TitleView', 'Text'] + */ + getOwnerHierarchy: function(requestID: number, tag: number) { + var rootTag = getRootTagForTag(tag); + var instance = InspectorUtils.findInstanceByNativeTag(rootTag, tag); + var ownerHierarchy = instance ? + InspectorUtils.getOwnerHierarchy(instance).map(componentToString) : + null; + DebugComponentOwnershipModule.receiveOwnershipHierarchy(requestID, tag, ownerHierarchy); + }, +}; diff --git a/Libraries/JavaScriptAppEngine/Initialization/InitializeJavaScriptAppEngine.js b/Libraries/JavaScriptAppEngine/Initialization/InitializeJavaScriptAppEngine.js index 8b6218882..b6337f670 100644 --- a/Libraries/JavaScriptAppEngine/Initialization/InitializeJavaScriptAppEngine.js +++ b/Libraries/JavaScriptAppEngine/Initialization/InitializeJavaScriptAppEngine.js @@ -23,6 +23,7 @@ /* globals GLOBAL: true, window: true */ // Just to make sure the JS gets packaged up. +require('RCTDebugComponentOwnership'); require('RCTDeviceEventEmitter'); require('PerformanceLogger');