diff --git a/packages/react-reconciler/src/ReactFiberScheduler.js b/packages/react-reconciler/src/ReactFiberScheduler.js index 562039393d..225c66c827 100644 --- a/packages/react-reconciler/src/ReactFiberScheduler.js +++ b/packages/react-reconciler/src/ReactFiberScheduler.js @@ -962,12 +962,17 @@ export default function( let next; if (enableProfilerTimer) { - startBaseRenderTimer(); + if (workInProgress.mode & ProfileMode) { + startBaseRenderTimer(); + } + next = beginWork(current, workInProgress, nextRenderExpirationTime); - // Update "base" time if the render wasn't bailed out on. - recordElapsedBaseRenderTimeIfRunning(workInProgress); - stopBaseRenderTimerIfRunning(); + if (workInProgress.mode & ProfileMode) { + // Update "base" time if the render wasn't bailed out on. + recordElapsedBaseRenderTimeIfRunning(workInProgress); + stopBaseRenderTimerIfRunning(); + } } else { next = beginWork(current, workInProgress, nextRenderExpirationTime); } diff --git a/packages/react/src/__tests__/ReactProfiler-test.internal.js b/packages/react/src/__tests__/ReactProfiler-test.internal.js index e97d8eeef9..f3b12109b6 100644 --- a/packages/react/src/__tests__/ReactProfiler-test.internal.js +++ b/packages/react/src/__tests__/ReactProfiler-test.internal.js @@ -108,10 +108,14 @@ describe('Profiler', () => { describe('onRender callback', () => { let AdvanceTime; let advanceTimeBy; + let mockNow; const mockNowForTests = () => { let currentTime = 0; - ReactTestRenderer.unstable_setNowImplementation(() => currentTime); + + mockNow = jest.fn().mockImplementation(() => currentTime); + + ReactTestRenderer.unstable_setNowImplementation(mockNow); advanceTimeBy = amount => { currentTime += amount; }; @@ -164,6 +168,20 @@ describe('Profiler', () => { expect(callback).toHaveBeenCalledTimes(1); }); + it('does not record times for components outside of Profiler tree', () => { + ReactTestRenderer.create( +
+ + + +
, + ); + + // Should only be called twice, for normal expiration time purposes. + // No additional calls from ProfilerTimer are expected. + expect(mockNow).toHaveBeenCalledTimes(2); + }); + it('logs render times for both mount and update', () => { const callback = jest.fn();