diff --git a/src/test/ReactDefaultPerf.js b/src/test/ReactDefaultPerf.js index 7fdc6e518e..f7de7934f2 100644 --- a/src/test/ReactDefaultPerf.js +++ b/src/test/ReactDefaultPerf.js @@ -205,6 +205,9 @@ var ReactDefaultPerf = { var id = args[0]; if (moduleName === 'EventPluginHub') { id = id._rootNodeID; + } else if (fnName === 'replaceNodeWithMarkup') { + // Old node is already unmounted; can't get its instance + id = ReactDOMComponentTree.getInstanceFromNode(args[1].node)._rootNodeID; } else if (typeof id === 'object') { id = ReactDOMComponentTree.getInstanceFromNode(args[0])._rootNodeID; } diff --git a/src/test/__tests__/ReactDefaultPerf-test.js b/src/test/__tests__/ReactDefaultPerf-test.js index 9eb3867a9e..f04f9bebaf 100644 --- a/src/test/__tests__/ReactDefaultPerf-test.js +++ b/src/test/__tests__/ReactDefaultPerf-test.js @@ -36,13 +36,13 @@ describe('ReactDefaultPerf', function() { App = React.createClass({ render: function() { - return
; + return
; }, }); Box = React.createClass({ render: function() { - return
; + return
; }, }); @@ -84,6 +84,28 @@ describe('ReactDefaultPerf', function() { /*eslint-enable dot-notation */ }); + it('should count no-op update in child as waste', function() { + var container = document.createElement('div'); + ReactDOM.render(, container); + + // Here, we add a Box -- two of the updates are wasted time (but the + // addition of the third is not) + var measurements = measure(() => { + ReactDOM.render(, container); + }); + + var summary = ReactDefaultPerf.getMeasurementsSummaryMap(measurements); + expect(summary.length).toBe(1); + + /*eslint-disable dot-notation */ + + expect(summary[0]['Owner > component']).toBe('App > Box'); + expect(summary[0]['Wasted time (ms)']).not.toBe(0); + expect(summary[0]['Instances']).toBe(1); + + /*eslint-enable dot-notation */ + }); + function expectNoWaste(fn) { var measurements = measure(fn); var summary = ReactDefaultPerf.getMeasurementsSummaryMap(measurements);