Skip to content

Commit 64b6beb

Browse files
Keep non-layout animations on the synchronous path while another view animates layout: tests and scaffolding
Tests and C++ API snapshots for the change in the parent commit.
1 parent d88e488 commit 64b6beb

10 files changed

Lines changed: 84 additions & 63 deletions

‎packages/react-native/Libraries/Animated/__tests__/AnimatedBackend-itest.js‎

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,72 @@ test('animate marginLeft layout prop', () => {
7777
);
7878
});
7979

80+
// A layout animation on one view must not push the other views of the
81+
// surface through a shadow tree commit: their non-layout props keep taking
82+
// the direct path to the mounted views.
83+
test('non-layout props stay on the direct path while another view animates layout', () => {
84+
const movingRef = createRef<HostInstance>();
85+
86+
let _translateX;
87+
let _translateXAnimation;
88+
let _siblingHeight;
89+
let _siblingHeightAnimation;
90+
91+
function MyApp() {
92+
const translateX = useAnimatedValue(0);
93+
const siblingHeight = useAnimatedValue(10);
94+
_translateX = translateX;
95+
_siblingHeight = siblingHeight;
96+
return (
97+
<View collapsable={false}>
98+
<Animated.View
99+
ref={movingRef}
100+
style={{width: 100, height: 100, transform: [{translateX}]}}
101+
/>
102+
<Animated.View style={{width: 100, height: siblingHeight}} />
103+
</View>
104+
);
105+
}
106+
107+
const root = Fantom.createRoot();
108+
109+
Fantom.runTask(() => {
110+
root.render(<MyApp />);
111+
});
112+
113+
Fantom.runTask(() => {
114+
_translateXAnimation = Animated.timing(_translateX, {
115+
toValue: 100,
116+
duration: 200,
117+
useNativeDriver: true,
118+
}).start();
119+
_siblingHeightAnimation = Animated.timing(_siblingHeight, {
120+
toValue: 110,
121+
duration: 200,
122+
useNativeDriver: true,
123+
}).start();
124+
});
125+
126+
Fantom.unstable_produceFramesForDuration(100);
127+
128+
// The sibling's height went through a commit; the transform did not.
129+
expect(root.getRenderedOutput({props: ['height']}).toJSX()).toEqual(
130+
<rn-view>
131+
<rn-view key={0} height="100" />
132+
<rn-view key={1} height="60" />
133+
</rn-view>,
134+
);
135+
expect(
136+
Fantom.unstable_getDirectManipulationProps(nullthrows(movingRef.current))
137+
.transform,
138+
).toEqual([{translateX: 50}]);
139+
140+
Fantom.runTask(() => {
141+
_translateXAnimation?.stop();
142+
_siblingHeightAnimation?.stop();
143+
});
144+
});
145+
80146
test('animated opacity', () => {
81147
let _opacity;
82148
let _opacityAnimation;

‎scripts/cxx-api/api-snapshots/ReactAndroidDebugCxx.api‎

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -710,6 +710,7 @@ using facebook::react::SizeAsTuple = std::tuple<facebook::react::Float, facebook
710710
using facebook::react::SnapshotMap = std::unordered_map<facebook::react::Tag, std::unique_ptr<facebook::react::PropsSnapshot>>;
711711
using facebook::react::StatePipe = std::function<void(const facebook::react::StateUpdate& stateUpdate)>;
712712
using facebook::react::SurfaceId = int32_t;
713+
using facebook::react::SurfaceUpdates = std::unordered_map<facebook::react::Tag, facebook::react::AnimationMutation>;
713714
using facebook::react::Tag = int32_t;
714715
using facebook::react::TelemetryClock = std::chrono::steady_clock;
715716
using facebook::react::TelemetryDuration = std::chrono::nanoseconds;
@@ -1580,7 +1581,7 @@ class facebook::react::AnimatedPropsRegistry {
15801581
public void clear(facebook::react::SurfaceId surfaceId);
15811582
public void clearOnSurfaceStop(facebook::react::SurfaceId surfaceId);
15821583
public void initializeSurface(facebook::react::SurfaceId surfaceId);
1583-
public void update(const std::unordered_map<facebook::react::SurfaceId, facebook::react::SurfaceUpdates>& surfaceUpdates);
1584+
public void update(const std::vector<facebook::react::AnimationMutations>& batches);
15841585
}
15851586

15861587
class facebook::react::AnimationBackend : public facebook::react::UIManagerAnimationBackend {
@@ -8112,12 +8113,6 @@ struct facebook::react::SurfaceContext {
81128113
public std::unordered_set<std::shared_ptr<const facebook::react::ShadowNodeFamily>> pendingFamilies;
81138114
}
81148115

8115-
struct facebook::react::SurfaceUpdates {
8116-
public bool hasLayoutUpdates;
8117-
public std::unordered_map<facebook::react::Tag, facebook::react::AnimatedProps> propsMap;
8118-
public std::unordered_set<std::shared_ptr<const facebook::react::ShadowNodeFamily>> families;
8119-
}
8120-
81218116
struct facebook::react::SystraceSection : public facebook::react::DummyTraceSection {
81228117
template <typename... ConvertsToStringPiece>
81238118
public SystraceSection(const char* name, ConvertsToStringPiece &&... args);

‎scripts/cxx-api/api-snapshots/ReactAndroidNewarchCxx.api‎

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -709,6 +709,7 @@ using facebook::react::SizeAsTuple = std::tuple<facebook::react::Float, facebook
709709
using facebook::react::SnapshotMap = std::unordered_map<facebook::react::Tag, std::unique_ptr<facebook::react::PropsSnapshot>>;
710710
using facebook::react::StatePipe = std::function<void(const facebook::react::StateUpdate& stateUpdate)>;
711711
using facebook::react::SurfaceId = int32_t;
712+
using facebook::react::SurfaceUpdates = std::unordered_map<facebook::react::Tag, facebook::react::AnimationMutation>;
712713
using facebook::react::Tag = int32_t;
713714
using facebook::react::TelemetryClock = std::chrono::steady_clock;
714715
using facebook::react::TelemetryDuration = std::chrono::nanoseconds;
@@ -1575,7 +1576,7 @@ class facebook::react::AnimatedPropsRegistry {
15751576
public void clear(facebook::react::SurfaceId surfaceId);
15761577
public void clearOnSurfaceStop(facebook::react::SurfaceId surfaceId);
15771578
public void initializeSurface(facebook::react::SurfaceId surfaceId);
1578-
public void update(const std::unordered_map<facebook::react::SurfaceId, facebook::react::SurfaceUpdates>& surfaceUpdates);
1579+
public void update(const std::vector<facebook::react::AnimationMutations>& batches);
15791580
}
15801581

15811582
class facebook::react::AnimationBackend : public facebook::react::UIManagerAnimationBackend {
@@ -7872,12 +7873,6 @@ struct facebook::react::SurfaceContext {
78727873
public std::unordered_set<std::shared_ptr<const facebook::react::ShadowNodeFamily>> pendingFamilies;
78737874
}
78747875

7875-
struct facebook::react::SurfaceUpdates {
7876-
public bool hasLayoutUpdates;
7877-
public std::unordered_map<facebook::react::Tag, facebook::react::AnimatedProps> propsMap;
7878-
public std::unordered_set<std::shared_ptr<const facebook::react::ShadowNodeFamily>> families;
7879-
}
7880-
78817876
struct facebook::react::SystraceSection : public facebook::react::DummyTraceSection {
78827877
template <typename... ConvertsToStringPiece>
78837878
public SystraceSection(const char* name, ConvertsToStringPiece &&... args);

‎scripts/cxx-api/api-snapshots/ReactAndroidReleaseCxx.api‎

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -710,6 +710,7 @@ using facebook::react::SizeAsTuple = std::tuple<facebook::react::Float, facebook
710710
using facebook::react::SnapshotMap = std::unordered_map<facebook::react::Tag, std::unique_ptr<facebook::react::PropsSnapshot>>;
711711
using facebook::react::StatePipe = std::function<void(const facebook::react::StateUpdate& stateUpdate)>;
712712
using facebook::react::SurfaceId = int32_t;
713+
using facebook::react::SurfaceUpdates = std::unordered_map<facebook::react::Tag, facebook::react::AnimationMutation>;
713714
using facebook::react::Tag = int32_t;
714715
using facebook::react::TelemetryClock = std::chrono::steady_clock;
715716
using facebook::react::TelemetryDuration = std::chrono::nanoseconds;
@@ -1579,7 +1580,7 @@ class facebook::react::AnimatedPropsRegistry {
15791580
public void clear(facebook::react::SurfaceId surfaceId);
15801581
public void clearOnSurfaceStop(facebook::react::SurfaceId surfaceId);
15811582
public void initializeSurface(facebook::react::SurfaceId surfaceId);
1582-
public void update(const std::unordered_map<facebook::react::SurfaceId, facebook::react::SurfaceUpdates>& surfaceUpdates);
1583+
public void update(const std::vector<facebook::react::AnimationMutations>& batches);
15831584
}
15841585

15851586
class facebook::react::AnimationBackend : public facebook::react::UIManagerAnimationBackend {
@@ -8103,12 +8104,6 @@ struct facebook::react::SurfaceContext {
81038104
public std::unordered_set<std::shared_ptr<const facebook::react::ShadowNodeFamily>> pendingFamilies;
81048105
}
81058106

8106-
struct facebook::react::SurfaceUpdates {
8107-
public bool hasLayoutUpdates;
8108-
public std::unordered_map<facebook::react::Tag, facebook::react::AnimatedProps> propsMap;
8109-
public std::unordered_set<std::shared_ptr<const facebook::react::ShadowNodeFamily>> families;
8110-
}
8111-
81128107
struct facebook::react::SystraceSection : public facebook::react::DummyTraceSection {
81138108
template <typename... ConvertsToStringPiece>
81148109
public SystraceSection(const char* name, ConvertsToStringPiece &&... args);

‎scripts/cxx-api/api-snapshots/ReactAppleDebugCxx.api‎

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3538,6 +3538,7 @@ using facebook::react::SizeAsTuple = std::tuple<facebook::react::Float, facebook
35383538
using facebook::react::SnapshotMap = std::unordered_map<facebook::react::Tag, std::unique_ptr<facebook::react::PropsSnapshot>>;
35393539
using facebook::react::StatePipe = std::function<void(const facebook::react::StateUpdate& stateUpdate)>;
35403540
using facebook::react::SurfaceId = int32_t;
3541+
using facebook::react::SurfaceUpdates = std::unordered_map<facebook::react::Tag, facebook::react::AnimationMutation>;
35413542
using facebook::react::Tag = int32_t;
35423543
using facebook::react::TelemetryClock = std::chrono::steady_clock;
35433544
using facebook::react::TelemetryDuration = std::chrono::nanoseconds;
@@ -4126,7 +4127,7 @@ class facebook::react::AnimatedPropsRegistry {
41264127
public void clear(facebook::react::SurfaceId surfaceId);
41274128
public void clearOnSurfaceStop(facebook::react::SurfaceId surfaceId);
41284129
public void initializeSurface(facebook::react::SurfaceId surfaceId);
4129-
public void update(const std::unordered_map<facebook::react::SurfaceId, facebook::react::SurfaceUpdates>& surfaceUpdates);
4130+
public void update(const std::vector<facebook::react::AnimationMutations>& batches);
41304131
}
41314132

41324133
class facebook::react::AnimationBackend : public facebook::react::UIManagerAnimationBackend {
@@ -10076,12 +10077,6 @@ struct facebook::react::SurfaceContext {
1007610077
public std::unordered_set<std::shared_ptr<const facebook::react::ShadowNodeFamily>> pendingFamilies;
1007710078
}
1007810079

10079-
struct facebook::react::SurfaceUpdates {
10080-
public bool hasLayoutUpdates;
10081-
public std::unordered_map<facebook::react::Tag, facebook::react::AnimatedProps> propsMap;
10082-
public std::unordered_set<std::shared_ptr<const facebook::react::ShadowNodeFamily>> families;
10083-
}
10084-
1008510080
struct facebook::react::SystraceSection : public facebook::react::DummyTraceSection {
1008610081
template <typename... ConvertsToStringPiece>
1008710082
public SystraceSection(const char* name, ConvertsToStringPiece &&... args);

‎scripts/cxx-api/api-snapshots/ReactAppleNewarchCxx.api‎

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3529,6 +3529,7 @@ using facebook::react::SizeAsTuple = std::tuple<facebook::react::Float, facebook
35293529
using facebook::react::SnapshotMap = std::unordered_map<facebook::react::Tag, std::unique_ptr<facebook::react::PropsSnapshot>>;
35303530
using facebook::react::StatePipe = std::function<void(const facebook::react::StateUpdate& stateUpdate)>;
35313531
using facebook::react::SurfaceId = int32_t;
3532+
using facebook::react::SurfaceUpdates = std::unordered_map<facebook::react::Tag, facebook::react::AnimationMutation>;
35323533
using facebook::react::Tag = int32_t;
35333534
using facebook::react::TelemetryClock = std::chrono::steady_clock;
35343535
using facebook::react::TelemetryDuration = std::chrono::nanoseconds;
@@ -4114,7 +4115,7 @@ class facebook::react::AnimatedPropsRegistry {
41144115
public void clear(facebook::react::SurfaceId surfaceId);
41154116
public void clearOnSurfaceStop(facebook::react::SurfaceId surfaceId);
41164117
public void initializeSurface(facebook::react::SurfaceId surfaceId);
4117-
public void update(const std::unordered_map<facebook::react::SurfaceId, facebook::react::SurfaceUpdates>& surfaceUpdates);
4118+
public void update(const std::vector<facebook::react::AnimationMutations>& batches);
41184119
}
41194120

41204121
class facebook::react::AnimationBackend : public facebook::react::UIManagerAnimationBackend {
@@ -9892,12 +9893,6 @@ struct facebook::react::SurfaceContext {
98929893
public std::unordered_set<std::shared_ptr<const facebook::react::ShadowNodeFamily>> pendingFamilies;
98939894
}
98949895

9895-
struct facebook::react::SurfaceUpdates {
9896-
public bool hasLayoutUpdates;
9897-
public std::unordered_map<facebook::react::Tag, facebook::react::AnimatedProps> propsMap;
9898-
public std::unordered_set<std::shared_ptr<const facebook::react::ShadowNodeFamily>> families;
9899-
}
9900-
99019896
struct facebook::react::SystraceSection : public facebook::react::DummyTraceSection {
99029897
template <typename... ConvertsToStringPiece>
99039898
public SystraceSection(const char* name, ConvertsToStringPiece &&... args);

‎scripts/cxx-api/api-snapshots/ReactAppleReleaseCxx.api‎

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3538,6 +3538,7 @@ using facebook::react::SizeAsTuple = std::tuple<facebook::react::Float, facebook
35383538
using facebook::react::SnapshotMap = std::unordered_map<facebook::react::Tag, std::unique_ptr<facebook::react::PropsSnapshot>>;
35393539
using facebook::react::StatePipe = std::function<void(const facebook::react::StateUpdate& stateUpdate)>;
35403540
using facebook::react::SurfaceId = int32_t;
3541+
using facebook::react::SurfaceUpdates = std::unordered_map<facebook::react::Tag, facebook::react::AnimationMutation>;
35413542
using facebook::react::Tag = int32_t;
35423543
using facebook::react::TelemetryClock = std::chrono::steady_clock;
35433544
using facebook::react::TelemetryDuration = std::chrono::nanoseconds;
@@ -4125,7 +4126,7 @@ class facebook::react::AnimatedPropsRegistry {
41254126
public void clear(facebook::react::SurfaceId surfaceId);
41264127
public void clearOnSurfaceStop(facebook::react::SurfaceId surfaceId);
41274128
public void initializeSurface(facebook::react::SurfaceId surfaceId);
4128-
public void update(const std::unordered_map<facebook::react::SurfaceId, facebook::react::SurfaceUpdates>& surfaceUpdates);
4129+
public void update(const std::vector<facebook::react::AnimationMutations>& batches);
41294130
}
41304131

41314132
class facebook::react::AnimationBackend : public facebook::react::UIManagerAnimationBackend {
@@ -10067,12 +10068,6 @@ struct facebook::react::SurfaceContext {
1006710068
public std::unordered_set<std::shared_ptr<const facebook::react::ShadowNodeFamily>> pendingFamilies;
1006810069
}
1006910070

10070-
struct facebook::react::SurfaceUpdates {
10071-
public bool hasLayoutUpdates;
10072-
public std::unordered_map<facebook::react::Tag, facebook::react::AnimatedProps> propsMap;
10073-
public std::unordered_set<std::shared_ptr<const facebook::react::ShadowNodeFamily>> families;
10074-
}
10075-
1007610071
struct facebook::react::SystraceSection : public facebook::react::DummyTraceSection {
1007710072
template <typename... ConvertsToStringPiece>
1007810073
public SystraceSection(const char* name, ConvertsToStringPiece &&... args);

‎scripts/cxx-api/api-snapshots/ReactCommonDebugCxx.api‎

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -331,6 +331,7 @@ using facebook::react::SizeAsTuple = std::tuple<Float, Float>;
331331
using facebook::react::SnapshotMap = std::unordered_map<facebook::react::Tag, std::unique_ptr<facebook::react::PropsSnapshot>>;
332332
using facebook::react::StatePipe = std::function<void(const facebook::react::StateUpdate& stateUpdate)>;
333333
using facebook::react::SurfaceId = int32_t;
334+
using facebook::react::SurfaceUpdates = std::unordered_map<facebook::react::Tag, facebook::react::AnimationMutation>;
334335
using facebook::react::Tag = int32_t;
335336
using facebook::react::TelemetryClock = std::chrono::steady_clock;
336337
using facebook::react::TelemetryDuration = std::chrono::nanoseconds;
@@ -904,7 +905,7 @@ class facebook::react::AnimatedPropsRegistry {
904905
public void clear(facebook::react::SurfaceId surfaceId);
905906
public void clearOnSurfaceStop(facebook::react::SurfaceId surfaceId);
906907
public void initializeSurface(facebook::react::SurfaceId surfaceId);
907-
public void update(const std::unordered_map<facebook::react::SurfaceId, facebook::react::SurfaceUpdates>& surfaceUpdates);
908+
public void update(const std::vector<facebook::react::AnimationMutations>& batches);
908909
}
909910

910911
class facebook::react::AnimationBackend : public facebook::react::UIManagerAnimationBackend {
@@ -6228,12 +6229,6 @@ struct facebook::react::SurfaceContext {
62286229
public std::unordered_set<std::shared_ptr<const facebook::react::ShadowNodeFamily>> pendingFamilies;
62296230
}
62306231

6231-
struct facebook::react::SurfaceUpdates {
6232-
public bool hasLayoutUpdates;
6233-
public std::unordered_map<facebook::react::Tag, facebook::react::AnimatedProps> propsMap;
6234-
public std::unordered_set<std::shared_ptr<const facebook::react::ShadowNodeFamily>> families;
6235-
}
6236-
62376232
struct facebook::react::SystraceSection : public facebook::react::DummyTraceSection {
62386233
template <typename... ConvertsToStringPiece>
62396234
public SystraceSection(const char* name, ConvertsToStringPiece &&... args);

‎scripts/cxx-api/api-snapshots/ReactCommonNewarchCxx.api‎

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -330,6 +330,7 @@ using facebook::react::SizeAsTuple = std::tuple<Float, Float>;
330330
using facebook::react::SnapshotMap = std::unordered_map<facebook::react::Tag, std::unique_ptr<facebook::react::PropsSnapshot>>;
331331
using facebook::react::StatePipe = std::function<void(const facebook::react::StateUpdate& stateUpdate)>;
332332
using facebook::react::SurfaceId = int32_t;
333+
using facebook::react::SurfaceUpdates = std::unordered_map<facebook::react::Tag, facebook::react::AnimationMutation>;
333334
using facebook::react::Tag = int32_t;
334335
using facebook::react::TelemetryClock = std::chrono::steady_clock;
335336
using facebook::react::TelemetryDuration = std::chrono::nanoseconds;
@@ -900,7 +901,7 @@ class facebook::react::AnimatedPropsRegistry {
900901
public void clear(facebook::react::SurfaceId surfaceId);
901902
public void clearOnSurfaceStop(facebook::react::SurfaceId surfaceId);
902903
public void initializeSurface(facebook::react::SurfaceId surfaceId);
903-
public void update(const std::unordered_map<facebook::react::SurfaceId, facebook::react::SurfaceUpdates>& surfaceUpdates);
904+
public void update(const std::vector<facebook::react::AnimationMutations>& batches);
904905
}
905906

906907
class facebook::react::AnimationBackend : public facebook::react::UIManagerAnimationBackend {
@@ -6052,12 +6053,6 @@ struct facebook::react::SurfaceContext {
60526053
public std::unordered_set<std::shared_ptr<const facebook::react::ShadowNodeFamily>> pendingFamilies;
60536054
}
60546055

6055-
struct facebook::react::SurfaceUpdates {
6056-
public bool hasLayoutUpdates;
6057-
public std::unordered_map<facebook::react::Tag, facebook::react::AnimatedProps> propsMap;
6058-
public std::unordered_set<std::shared_ptr<const facebook::react::ShadowNodeFamily>> families;
6059-
}
6060-
60616056
struct facebook::react::SystraceSection : public facebook::react::DummyTraceSection {
60626057
template <typename... ConvertsToStringPiece>
60636058
public SystraceSection(const char* name, ConvertsToStringPiece &&... args);

‎scripts/cxx-api/api-snapshots/ReactCommonReleaseCxx.api‎

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -331,6 +331,7 @@ using facebook::react::SizeAsTuple = std::tuple<Float, Float>;
331331
using facebook::react::SnapshotMap = std::unordered_map<facebook::react::Tag, std::unique_ptr<facebook::react::PropsSnapshot>>;
332332
using facebook::react::StatePipe = std::function<void(const facebook::react::StateUpdate& stateUpdate)>;
333333
using facebook::react::SurfaceId = int32_t;
334+
using facebook::react::SurfaceUpdates = std::unordered_map<facebook::react::Tag, facebook::react::AnimationMutation>;
334335
using facebook::react::Tag = int32_t;
335336
using facebook::react::TelemetryClock = std::chrono::steady_clock;
336337
using facebook::react::TelemetryDuration = std::chrono::nanoseconds;
@@ -903,7 +904,7 @@ class facebook::react::AnimatedPropsRegistry {
903904
public void clear(facebook::react::SurfaceId surfaceId);
904905
public void clearOnSurfaceStop(facebook::react::SurfaceId surfaceId);
905906
public void initializeSurface(facebook::react::SurfaceId surfaceId);
906-
public void update(const std::unordered_map<facebook::react::SurfaceId, facebook::react::SurfaceUpdates>& surfaceUpdates);
907+
public void update(const std::vector<facebook::react::AnimationMutations>& batches);
907908
}
908909

909910
class facebook::react::AnimationBackend : public facebook::react::UIManagerAnimationBackend {
@@ -6219,12 +6220,6 @@ struct facebook::react::SurfaceContext {
62196220
public std::unordered_set<std::shared_ptr<const facebook::react::ShadowNodeFamily>> pendingFamilies;
62206221
}
62216222

6222-
struct facebook::react::SurfaceUpdates {
6223-
public bool hasLayoutUpdates;
6224-
public std::unordered_map<facebook::react::Tag, facebook::react::AnimatedProps> propsMap;
6225-
public std::unordered_set<std::shared_ptr<const facebook::react::ShadowNodeFamily>> families;
6226-
}
6227-
62286223
struct facebook::react::SystraceSection : public facebook::react::DummyTraceSection {
62296224
template <typename... ConvertsToStringPiece>
62306225
public SystraceSection(const char* name, ConvertsToStringPiece &&... args);

0 commit comments

Comments
 (0)