Skip to content

Commit 755724a

Browse files
awearygaearon
authored andcommitted
Implement event-specific pooling for SyntheticEvent (#10237)
* Remove PooledClass from FallbackCompositionState The only module that uses FallbackCompositonState is BeforeInputEventPlugin. The way its structured means there can only be a single instance of FallbackCompositionState at any given time (stored in a local variable at the top-level) so we don't really need pooling here at all. Instead, a single object is now stored in FallbackCompositionState, and access (initializing, reseting, getting data) is gaurded by the exported helper object. * Use new FallbackCompositionState API in BeforeInputEventPlugin * Implement event-specific pooling in SyntheticEvent * Remove PooledClass from TopLevelCallbackBookKeeping * Update results.json * Add pooled event test fixtures (#1) * Fix fixture lint
1 parent efa7148 commit 755724a

File tree

12 files changed

+368
-159
lines changed

12 files changed

+368
-159
lines changed

fixtures/dom/src/components/Header.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,7 @@ class Header extends React.Component {
6161
<option value="/buttons">Buttons</option>
6262
<option value="/date-inputs">Date Inputs</option>
6363
<option value="/error-handling">Error Handling</option>
64+
<option value="/event-pooling">Event Pooling</option>
6465
</select>
6566
</label>
6667
<label htmlFor="react_version">
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
const React = window.React;
2+
3+
class HitBox extends React.Component {
4+
state = {
5+
x: 0,
6+
y: 0,
7+
};
8+
9+
static defaultProps = {
10+
onMouseMove: n => n,
11+
};
12+
13+
onMove = event => {
14+
this.setState({x: event.clientX, y: event.clientY});
15+
this.props.onMouseMove(event);
16+
};
17+
18+
render() {
19+
const {x, y} = this.state;
20+
21+
const boxStyle = {
22+
padding: '10px 20px',
23+
border: '1px solid #d9d9d9',
24+
margin: '10px 0 20px',
25+
};
26+
27+
return (
28+
<div onMouseMove={this.onMove} style={boxStyle}>
29+
<p>Trace your mouse over this box.</p>
30+
<p>
31+
Last movement: {x},{y}
32+
</p>
33+
</div>
34+
);
35+
}
36+
}
37+
38+
export default HitBox;
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
import FixtureSet from '../../FixtureSet';
2+
import MouseMove from './mouse-move';
3+
import Persistence from './persistence';
4+
5+
const React = window.React;
6+
7+
class EventPooling extends React.Component {
8+
render() {
9+
return (
10+
<FixtureSet title="Event Pooling" description="">
11+
<MouseMove />
12+
<Persistence />
13+
</FixtureSet>
14+
);
15+
}
16+
}
17+
18+
export default EventPooling;
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
import TestCase from '../../TestCase';
2+
import HitBox from './hit-box';
3+
4+
const React = window.React;
5+
6+
class MouseMove extends React.Component {
7+
state = {
8+
events: [],
9+
};
10+
11+
checkEvent = event => {
12+
let {events} = this.state;
13+
14+
if (event.type === 'mousemove' && events.indexOf(event) === -1) {
15+
this.setState({events: events.concat(event)});
16+
}
17+
};
18+
19+
render() {
20+
const {events} = this.state;
21+
22+
return (
23+
<TestCase title="Mouse Move" description="">
24+
<TestCase.Steps>
25+
<li>Mouse over the box below</li>
26+
</TestCase.Steps>
27+
28+
<TestCase.ExpectedResult>
29+
Mousemove should share the same instance of the event between
30+
dispatches.
31+
</TestCase.ExpectedResult>
32+
33+
<HitBox onMouseMove={this.checkEvent} />
34+
35+
<p>
36+
Was the event pooled?{' '}
37+
<b>
38+
{events.length ? events.length <= 1 ? 'Yes' : 'No' : 'Unsure'}
39+
{' '}
40+
(
41+
{events.length}
42+
{' '}
43+
events)
44+
</b>
45+
</p>
46+
</TestCase>
47+
);
48+
}
49+
}
50+
51+
export default MouseMove;
Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
import TestCase from '../../TestCase';
2+
import HitBox from './hit-box';
3+
4+
const React = window.React;
5+
6+
class Persistence extends React.Component {
7+
state = {
8+
persisted: 0,
9+
pooled: [],
10+
};
11+
12+
addPersisted = event => {
13+
let {persisted, pooled} = this.state;
14+
15+
event.persist();
16+
17+
if (event.type === 'mousemove') {
18+
this.setState({
19+
persisted: persisted + 1,
20+
pooled: pooled.filter(e => e !== event),
21+
});
22+
}
23+
};
24+
25+
addPooled = event => {
26+
let {pooled} = this.state;
27+
28+
if (event.type === 'mousemove' && pooled.indexOf(event) === -1) {
29+
this.setState({pooled: pooled.concat(event)});
30+
}
31+
};
32+
33+
render() {
34+
const {pooled, persisted} = this.state;
35+
36+
return (
37+
<TestCase title="Persistence" description="">
38+
<TestCase.Steps>
39+
<li>Mouse over the pooled event box</li>
40+
<li>Mouse over the persisted event box</li>
41+
</TestCase.Steps>
42+
43+
<TestCase.ExpectedResult>
44+
The pool size should not increase above 1, but reduce to 0 when hovering over the persisted region.
45+
</TestCase.ExpectedResult>
46+
47+
<h2>Add Pooled Event:</h2>
48+
<HitBox onMouseMove={this.addPooled} />
49+
50+
<h2>Add Persisted Event:</h2>
51+
<HitBox onMouseMove={this.addPersisted} />
52+
53+
<p>
54+
Pool size: {pooled.length}
55+
</p>
56+
57+
<p>
58+
Persisted size: {persisted}
59+
</p>
60+
</TestCase>
61+
);
62+
}
63+
}
64+
65+
export default Persistence;

fixtures/dom/src/components/fixtures/index.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import PasswordInputFixtures from './password-inputs';
88
import ButtonFixtures from './buttons';
99
import DateInputFixtures from './date-inputs';
1010
import ErrorHandling from './error-handling';
11+
import EventPooling from './event-pooling';
1112

1213
const React = window.React;
1314

@@ -37,6 +38,8 @@ function FixturesPage() {
3738
return <DateInputFixtures />;
3839
case '/error-handling':
3940
return <ErrorHandling />;
41+
case '/event-pooling':
42+
return <EventPooling />;
4043
default:
4144
return <p>Please select a test fixture.</p>;
4245
}

0 commit comments

Comments
 (0)