From 00d4b68507f68e4442b26931ff38db7254d96c79 Mon Sep 17 00:00:00 2001 From: Ronaldo Lima Date: Fri, 12 Oct 2018 12:17:27 +0200 Subject: [PATCH 1/2] Removing TimerMixin #21485 --- IntegrationTests/TimersTest.js | 156 +++++++++++++++++++-------------- 1 file changed, 90 insertions(+), 66 deletions(-) diff --git a/IntegrationTests/TimersTest.js b/IntegrationTests/TimersTest.js index 026a14e4118b3d..15b9dc0425f149 100644 --- a/IntegrationTests/TimersTest.js +++ b/IntegrationTests/TimersTest.js @@ -11,98 +11,107 @@ 'use strict'; const React = require('react'); -const createReactClass = require('create-react-class'); const ReactNative = require('react-native'); /* $FlowFixMe(>=0.54.0 site=react_native_oss) This comment suppresses an error * found when Flow v0.54 was deployed. To see the error delete this comment and * run Flow. */ -const TimerMixin = require('react-timer-mixin'); const {StyleSheet, Text, View} = ReactNative; const {TestModule} = ReactNative.NativeModules; - -const TimersTest = createReactClass({ - displayName: 'TimersTest', - mixins: [TimerMixin], - - _nextTest: () => {}, - _interval: -1, - - getInitialState() { - return { - count: 0, - done: false, - }; - }, +const requestAnimationFrame = require('fbjs/lib/requestAnimationFrame'); + +type Props = $ReadOnly<{||}>; + +type State = {| + count: number, + done: boolean, +|}; +class TimersTest extends React.Component { + _nextTest = () => {}; + _interval = -1; + _timeoutID: ?TimeoutID = null; + // $FlowFixMe + _intervalId: ?IntervalID = -1; + _immediateId: ?Object = null; + + state = { + count: 0, + done: false, + }; componentDidMount() { - this.setTimeout(this.testSetTimeout0, 1000); - }, + this._timeoutID = setTimeout(this.testSetTimeout0, 1000); + } testSetTimeout0() { - this.setTimeout(this.testSetTimeout1, 0); - }, + this._timeoutID = setTimeout(this.testSetTimeout1, 0); + } testSetTimeout1() { - this.setTimeout(this.testSetTimeout50, 1); - }, + this._timeoutID = setTimeout(this.testSetTimeout50, 1); + } testSetTimeout50() { - this.setTimeout(this.testRequestAnimationFrame, 50); - }, + this._timeoutID = setTimeout(this.testRequestAnimationFrame, 50); + } testRequestAnimationFrame() { - this.requestAnimationFrame(this.testSetInterval0); - }, + requestAnimationFrame(this.testSetInterval0); + } testSetInterval0() { this._nextTest = this.testSetInterval20; - this._interval = this.setInterval(this._incrementInterval, 0); - }, + this._intervalId = setInterval(this._incrementInterval, 0); + } testSetInterval20() { this._nextTest = this.testSetImmediate; - this._interval = this.setInterval(this._incrementInterval, 20); - }, + this._intervalId = setInterval(this._incrementInterval, 20); + } testSetImmediate() { - this.setImmediate(this.testClearTimeout0); - }, + this._immediateId = setImmediate(this.testClearTimeout0); + } testClearTimeout0() { - const timeout = this.setTimeout(() => this._fail('testClearTimeout0'), 0); - this.clearTimeout(timeout); + const timeout = setTimeout(() => this._fail('testClearTimeout0'), 0); + clearTimeout(timeout); this.testClearTimeout30(); - }, + } testClearTimeout30() { - const timeout = this.setTimeout(() => this._fail('testClearTimeout30'), 30); - this.clearTimeout(timeout); - this.setTimeout(this.testClearMulti, 50); - }, + const timeout = setTimeout(() => this._fail('testClearTimeout30'), 30); + clearTimeout(timeout); + this._timeoutID = setTimeout(this.testClearMulti, 50); + } testClearMulti() { const fails = []; - fails.push(this.setTimeout(() => this._fail('testClearMulti-1'), 20)); - fails.push(this.setTimeout(() => this._fail('testClearMulti-2'), 50)); - const delayClear = this.setTimeout( - () => this._fail('testClearMulti-3'), - 50, + fails.push( + (this._timeoutID = setTimeout(() => this._fail('testClearMulti-1'), 20)), + ); + fails.push( + (this._timeoutID = setTimeout(() => this._fail('testClearMulti-2'), 50)), + ); + const delayClear = setTimeout(() => this._fail('testClearMulti-3'), 50); + fails.push( + (this._timeoutID = setTimeout(() => this._fail('testClearMulti-4'), 0)), + ); + fails.push( + (this._timeoutID = setTimeout(() => this._fail('testClearMulti-5'), 10)), ); - fails.push(this.setTimeout(() => this._fail('testClearMulti-4'), 0)); - fails.push(this.setTimeout(() => this._fail('testClearMulti-5'), 10)); - fails.forEach(timeout => this.clearTimeout(timeout)); - this.setTimeout(() => this.clearTimeout(delayClear), 20); + fails.forEach(timeout => clearTimeout(timeout)); + this._timeoutID = setTimeout(() => clearTimeout(delayClear), 20); - this.setTimeout(this.testOrdering, 50); - }, + this._timeoutID = setTimeout(this.testOrdering, 50); + } testOrdering() { // Clear timers are set first because it's more likely to uncover bugs. let fail0; - this.setImmediate(() => this.clearTimeout(fail0)); - fail0 = this.setTimeout( + this._immediateId = setImmediate(() => clearTimeout(fail0)); + fail0 = setTimeout( () => this._fail( 'testOrdering-t0, setImmediate should happen before ' + @@ -111,18 +120,18 @@ const TimersTest = createReactClass({ 0, ); let failAnim; // This should fail without the t=0 fastpath feature. - this.setTimeout(() => this.cancelAnimationFrame(failAnim), 0); - failAnim = this.requestAnimationFrame(() => + this._timeoutID = setTimeout(() => cancelAnimationFrame(failAnim), 0); + failAnim = requestAnimationFrame(() => this._fail( 'testOrdering-Anim, setTimeout 0 should happen before ' + 'requestAnimationFrame', ), ); let fail25; - this.setTimeout(() => { - this.clearTimeout(fail25); + this._timeoutID = setTimeout(() => { + clearTimeout(fail25); }, 20); - fail25 = this.setTimeout( + fail25 = setTimeout( () => this._fail( 'testOrdering-t25, setTimeout 20 should happen before ' + @@ -130,43 +139,58 @@ const TimersTest = createReactClass({ ), 25, ); - this.setTimeout(this.done, 50); - }, + this._timeoutID = setTimeout(this.done, 50); + } done() { this.setState({done: true}, () => { TestModule.markTestCompleted(); }); - }, + } + + componentWillUnmount() { + if (this._timeoutID != null) { + clearTimeout(this._timeoutID); + } + if (this._immediateId != null) { + clearImmediate(this._immediateId); + } + if (this._intervalId != null) { + clearInterval(this._intervalId); + } + } render() { return ( - {this.constructor.displayName + ': \n'} + {/* $FlowFixMe(>=0.54.0 site=react_native_fb,react_native_oss) This + * comment suppresses an error found when Flow v0.54 was deployed. + * To see the error delete this comment and run Flow. */ + this.constructor.displayName + ': \n'} Intervals: {this.state.count + '\n'} {this.state.done ? 'Done' : 'Testing...'} ); - }, + } _incrementInterval() { if (this.state.count > 3) { throw new Error('interval incremented past end.'); } if (this.state.count === 3) { - this.clearInterval(this._interval); + clearInterval(this._intervalId); this.setState({count: 0}, this._nextTest); return; } this.setState({count: this.state.count + 1}); - }, + } _fail(caller: string): void { throw new Error('_fail called by ' + caller); - }, -}); + } +} const styles = StyleSheet.create({ container: { From 7cf0f9994da9cee8da7fdb6d1cdd509eb3584ee2 Mon Sep 17 00:00:00 2001 From: Ronaldo Lima Date: Fri, 12 Oct 2018 12:25:54 +0200 Subject: [PATCH 2/2] remove unused --- IntegrationTests/TimersTest.js | 1 - 1 file changed, 1 deletion(-) diff --git a/IntegrationTests/TimersTest.js b/IntegrationTests/TimersTest.js index 15b9dc0425f149..3ab086d707aa86 100644 --- a/IntegrationTests/TimersTest.js +++ b/IntegrationTests/TimersTest.js @@ -28,7 +28,6 @@ type State = {| |}; class TimersTest extends React.Component { _nextTest = () => {}; - _interval = -1; _timeoutID: ?TimeoutID = null; // $FlowFixMe _intervalId: ?IntervalID = -1;