From 6e36d046a313c7961cc2f91e0422f4bf29005eb6 Mon Sep 17 00:00:00 2001 From: Vladislav Shabanov Date: Thu, 14 Jan 2021 14:43:30 -0800 Subject: [PATCH] Fix ScrollView getInnerViewNode and getInnerViewRef ref methods (#30588) Summary: Currently ScrollView ref's `getInnerViewNode` and `getInnerViewRef` are unbound and don't work as expected returning empty values. The origin of this problem probably is issued by https://github.com/facebook/react-native/commit/d2f314af75b63443db23e131aaf93c2d064e4f44 Working example of the problem is available here: https://github.com/vshab/RNGetInnerViewBug This PR binds getInnerViewNode and getInnerViewRef to ScrollView and adds test checking the value of getInnerViewRef. Before: ![Simulator Screen Shot - iPhone 11 - 2020-12-15 at 02 07 03](https://user-images.githubusercontent.com/6755908/102149544-c7df4900-3e7f-11eb-89de-de39a28fbdb3.png) After: ![Simulator Screen Shot - iPhone 11 - 2020-12-15 at 01 49 31](https://user-images.githubusercontent.com/6755908/102149559-d168b100-3e7f-11eb-8b27-031c9e43112c.png) ## Changelog [JavaScript] [Fixed] - ScrollView: Fix `getInnerViewNode` and `getInnerViewRef` ref methods Pull Request resolved: https://github.com/facebook/react-native/pull/30588 Test Plan: 1. The test checking the value of getInnerViewRef is added. 2. Example app demonstrating the problem is provided with before/after screenshots. Reviewed By: TheSavior, nadiia Differential Revision: D25916413 Pulled By: kacieb fbshipit-source-id: bf18079682be7c647b8715bd0f36cf84953abcfa --- Libraries/Components/ScrollView/ScrollView.js | 8 ++++---- .../ScrollView/__tests__/ScrollView-test.js | 16 ++++++++++++++++ 2 files changed, 20 insertions(+), 4 deletions(-) diff --git a/Libraries/Components/ScrollView/ScrollView.js b/Libraries/Components/ScrollView/ScrollView.js index 99407340c50cc1..4ef4f50d3f0ff5 100644 --- a/Libraries/Components/ScrollView/ScrollView.js +++ b/Libraries/Components/ScrollView/ScrollView.js @@ -808,13 +808,13 @@ class ScrollView extends React.Component { return ReactNative.findNodeHandle(this._scrollViewRef); }; - getInnerViewNode(): ?number { + getInnerViewNode: () => ?number = () => { return ReactNative.findNodeHandle(this._innerViewRef); - } + }; - getInnerViewRef(): ?React.ElementRef { + getInnerViewRef: () => ?React.ElementRef = () => { return this._innerViewRef; - } + }; getNativeScrollRef: () => ?React.ElementRef> = () => { return this._scrollViewRef; diff --git a/Libraries/Components/ScrollView/__tests__/ScrollView-test.js b/Libraries/Components/ScrollView/__tests__/ScrollView-test.js index fb7aa74a55703e..6800bb2a681931 100644 --- a/Libraries/Components/ScrollView/__tests__/ScrollView-test.js +++ b/Libraries/Components/ScrollView/__tests__/ScrollView-test.js @@ -48,4 +48,20 @@ describe('', () => { jest.fn().constructor, ); }); + it('getInnerViewRef for case where it returns a native view', () => { + jest.resetModules(); + jest.unmock('../ScrollView'); + + const scrollViewRef = React.createRef(null); + + ReactTestRenderer.create(); + + const innerViewRef = scrollViewRef.current.getInnerViewRef(); + + // This is checking if the ref acts like a host component. If we had an + // `isHostComponent(ref)` method, that would be preferred. + expect(innerViewRef.measure).toBeInstanceOf(jest.fn().constructor); + expect(innerViewRef.measureLayout).toBeInstanceOf(jest.fn().constructor); + expect(innerViewRef.measureInWindow).toBeInstanceOf(jest.fn().constructor); + }); });