mirror of
https://github.com/facebook/react-native.git
synced 2025-11-01 09:14:26 +00:00
Animated module: don't use random IDs as waiting identifier for queueing
Summary: In D24521951 (https://github.com/facebook/react-native/commit/2ff1d4c041ee662871a84363a3f85a8bc9e857ce) I refactored the JS-side queueing for NativeAnimated API calls, and used randomized IDs for queueing. This could cause bugs or unexpected behavior, and potentially crashes, if there's ever a collision in random numbers generated or a collision between random number and one of the deterministic numbers generated in createAnimatedComponent. In this diff I make both of them namespaced with a string, and deterministic, to eliminate any potential collisions. This could also be slightly faster (but not meaningfully) since we're not relying on Math.random. Changelog: [Internal] Reviewed By: yungsters Differential Revision: D24553557 fbshipit-source-id: 8b765e21597ad4f8e641453c1f9f90bdf1ee022f
This commit is contained in:
committed by
Facebook GitHub Bot
parent
e9116519c8
commit
3ddba567a8
@@ -53,11 +53,11 @@ const API = {
|
||||
NativeAnimatedModule.getValue(tag, saveValueCallback);
|
||||
}
|
||||
},
|
||||
setWaitingForIdentifier: function(id: number): void {
|
||||
setWaitingForIdentifier: function(id: string): void {
|
||||
waitingForQueuedOperations.add(id);
|
||||
queueOperations = true;
|
||||
},
|
||||
unsetWaitingForIdentifier: function(id: number): void {
|
||||
unsetWaitingForIdentifier: function(id: string): void {
|
||||
waitingForQueuedOperations.delete(id);
|
||||
|
||||
if (waitingForQueuedOperations.size === 0) {
|
||||
|
||||
@@ -24,6 +24,8 @@ export type AnimationConfig = {
|
||||
iterations?: number,
|
||||
};
|
||||
|
||||
let startNativeAnimationNextId = 1;
|
||||
|
||||
// Important note: start() and stop() will only be called at most once.
|
||||
// Once an animation has been stopped or finished its course, it will
|
||||
// not be reused.
|
||||
@@ -57,8 +59,11 @@ class Animation {
|
||||
onEnd && onEnd(result);
|
||||
}
|
||||
__startNativeAnimation(animatedValue: AnimatedValue): void {
|
||||
const arbitraryValue = Math.random();
|
||||
NativeAnimatedHelper.API.setWaitingForIdentifier(arbitraryValue);
|
||||
const startNativeAnimationWaitId = `${startNativeAnimationNextId}:startAnimation`;
|
||||
startNativeAnimationNextId += 1;
|
||||
NativeAnimatedHelper.API.setWaitingForIdentifier(
|
||||
startNativeAnimationWaitId,
|
||||
);
|
||||
try {
|
||||
animatedValue.__makeNative();
|
||||
this.__nativeId = NativeAnimatedHelper.generateNewAnimationId();
|
||||
@@ -71,7 +76,9 @@ class Animation {
|
||||
} catch (e) {
|
||||
throw e;
|
||||
} finally {
|
||||
NativeAnimatedHelper.API.unsetWaitingForIdentifier(arbitraryValue);
|
||||
NativeAnimatedHelper.API.unsetWaitingForIdentifier(
|
||||
startNativeAnimationWaitId,
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -55,7 +55,7 @@ function createAnimatedComponent<Props: {+[string]: mixed, ...}, Instance>(
|
||||
_eventDetachers: Array<Function> = [];
|
||||
|
||||
// Only to be used in this file, and only in Fabric.
|
||||
_animatedComponentId: number = animatedComponentNextId++;
|
||||
_animatedComponentId: string = `${animatedComponentNextId++}:animatedComponent`;
|
||||
|
||||
_attachNativeEvents() {
|
||||
// Make sure to get the scrollable node for components that implement
|
||||
|
||||
Reference in New Issue
Block a user