@samitouri / QOS-React / commits / 8791325db0

Finish ReactGenericBatching (#8405)

Ben Alpert committed Nov 23, 2016 at 17:40 UTC 8791325db03725ef4801fc58b35a3bb4486a8904
6 files changed +20 -20
scripts/fiber/tests-failing.txt
+2 -2
@@ -42,8 +42,8 @@ src/renderers/dom/shared/__tests__/ReactDOMTextComponent-test.js
42 * can reconcile text arbitrarily split into multiple nodes
43 * can reconcile text arbitrarily split into multiple nodes on some substitutions only
44
45 -src/renderers/dom/shared/__tests__/ReactEventListener-test.js
46 -* should batch between handlers from different roots
45 +src/renderers/dom/shared/wrappers/__tests__/ReactDOMInput-test.js
46 +* should control a value in reentrant events
47
48 src/renderers/dom/stack/client/__tests__/ReactDOM-test.js
49 * throws in render() if the mount callback is not a function
scripts/fiber/tests-passing.txt
+1 -1
@@ -648,6 +648,7 @@ src/renderers/dom/shared/__tests__/ReactEventListener-test.js
648 * should propagate events one level down
649 * should propagate events two levels down
650 * should not get confused by disappearing elements
651 +* should batch between handlers from different roots
652 * should not fire duplicate events for a React DOM tree
653
654 src/renderers/dom/shared/__tests__/escapeTextContentForBrowser-test.js
@@ -812,7 +813,6 @@ src/renderers/dom/shared/wrappers/__tests__/ReactDOMIframe-test.js
813
814 src/renderers/dom/shared/wrappers/__tests__/ReactDOMInput-test.js
815 * should properly control a value even if no event listener exists
815 -* should control a value in reentrant events
816 * should control values in reentrant events with different targets
817 * should display `defaultValue` of number 0
818 * only assigns defaultValue if it changes
src/renderers/dom/ReactDOM.js
+2 -2
@@ -16,9 +16,9 @@
16 var ReactDOMComponentTree = require('ReactDOMComponentTree');
17 var ReactDOMInjection = require('ReactDOMInjection');
18 var ReactDOMStackInjection = require('ReactDOMStackInjection');
19 +var ReactGenericBatching = require('ReactGenericBatching');
20 var ReactMount = require('ReactMount');
21 var ReactReconciler = require('ReactReconciler');
21 -var ReactUpdates = require('ReactUpdates');
22 var ReactVersion = require('ReactVersion');
23
24 var findDOMNode = require('findDOMNode');
@@ -35,7 +35,7 @@ var ReactDOM = {
35 version: ReactVersion,
36
37 /* eslint-disable camelcase */
38 - unstable_batchedUpdates: ReactUpdates.batchedUpdates,
38 + unstable_batchedUpdates: ReactGenericBatching.batchedUpdates,
39 unstable_renderSubtreeIntoContainer: ReactMount.renderSubtreeIntoContainer,
40 /* eslint-enable camelcase */
41 };
src/renderers/dom/fiber/ReactDOMFiber.js
+4 -3
@@ -22,6 +22,7 @@ var ReactDOMComponentTree = require('ReactDOMComponentTree');
22 var ReactDOMFeatureFlags = require('ReactDOMFeatureFlags');
23 var ReactDOMFiberComponent = require('ReactDOMFiberComponent');
24 var ReactDOMInjection = require('ReactDOMInjection');
25 +var ReactGenericBatching = require('ReactGenericBatching');
26 var ReactFiberReconciler = require('ReactFiberReconciler');
27 var ReactInputSelection = require('ReactInputSelection');
28 var ReactInstanceMap = require('ReactInstanceMap');
@@ -165,6 +166,8 @@ var DOMRenderer = ReactFiberReconciler({
166
167 });
168
169 +ReactGenericBatching.injection.injectFiberBatchedUpdates(DOMRenderer.batchedUpdates);
170 +
171 var warned = false;
172
173 function warnAboutUnstableUse() {
@@ -220,9 +223,7 @@ var ReactDOM = {
223 return ReactPortal.createPortal(children, container, null, key);
224 },
225
223 - unstable_batchedUpdates<A>(fn : () => A) : A {
224 - return DOMRenderer.batchedUpdates(fn);
225 - },
226 + unstable_batchedUpdates: ReactGenericBatching.batchedUpdates,
227
228 };
229
src/renderers/shared/fiber/ReactFiberScheduler.js
+2 -2
@@ -790,11 +790,11 @@ module.exports = function<T, P, I, TI, C>(config : HostConfig<T, P, I, TI, C>) {
790 }
791 }
792
793 - function batchedUpdates<A>(fn : () => A) : A {
793 + function batchedUpdates<A, R>(fn : (a: A) => R, a : A) : R {
794 const prev = shouldBatchUpdates;
795 shouldBatchUpdates = true;
796 try {
797 - return fn();
797 + return fn(a);
798 } finally {
799 // If we're exiting the batch, perform any scheduled task work
800 try {
src/renderers/shared/shared/event/ReactGenericBatching.js
+9 -10
@@ -21,21 +21,21 @@ var ReactControlledComponent = require('ReactControlledComponent');
21
22 // Defaults
23 var stackBatchedUpdates = function(fn, a, b, c, d, e) {
24 - fn(a, b, c, d, e);
24 + return fn(a, b, c, d, e);
25 };
26 -var fiberPerformSynchronousWork = function(fn, bookkeeping) {
27 - fn(bookkeeping);
26 +var fiberBatchedUpdates = function(fn, bookkeeping) {
27 + return fn(bookkeeping);
28 };
29
30 function performFiberBatchedUpdates(fn, bookkeeping) {
31 // If we have Fiber loaded, we need to wrap this in a batching call so that
32 // Fiber can apply its default priority for this call.
33 - fiberPerformSynchronousWork(fn, bookkeeping);
33 + return fiberBatchedUpdates(fn, bookkeeping);
34 }
35 function batchedUpdates(fn, bookkeeping) {
36 // We first perform work with the stack batching strategy, by passing our
37 // indirection to it.
38 - stackBatchedUpdates(performFiberBatchedUpdates, fn, bookkeeping);
38 + return stackBatchedUpdates(performFiberBatchedUpdates, fn, bookkeeping);
39 }
40
41 var isNestingBatched = false;
@@ -44,12 +44,11 @@ function batchedUpdatesWithControlledComponents(fn, bookkeeping) {
44 // If we are currently inside another batch, we need to wait until it
45 // fully completes before restoring state. Therefore, we add the target to
46 // a queue of work.
47 - batchedUpdates(fn, bookkeeping);
48 - return;
47 + return batchedUpdates(fn, bookkeeping);
48 }
49 isNestingBatched = true;
50 try {
52 - batchedUpdates(fn, bookkeeping);
51 + return batchedUpdates(fn, bookkeeping);
52 } finally {
53 // Here we wait until all updates have propagated, which is important
54 // when using controlled components within layers:
@@ -64,8 +63,8 @@ var ReactGenericBatchingInjection = {
63 injectStackBatchedUpdates: function(_batchedUpdates) {
64 stackBatchedUpdates = _batchedUpdates;
65 },
67 - injectFiberPerformSynchronousWork: function(_performSynchronousWork) {
68 - fiberPerformSynchronousWork = _performSynchronousWork;
66 + injectFiberBatchedUpdates: function(_batchedUpdates) {
67 + fiberBatchedUpdates = _batchedUpdates;
68 },
69 };
70