Skip to content

Commit

Permalink
[DevTools] only polyfill requestAnimationFrame when necessary (#24651)
Browse files Browse the repository at this point in the history
  • Loading branch information
mondaychen authored Jun 1, 2022
1 parent d2c9e83 commit d300ceb
Showing 1 changed file with 18 additions and 11 deletions.
29 changes: 18 additions & 11 deletions packages/react-devtools-extensions/src/main.js
Original file line number Diff line number Diff line change
Expand Up @@ -33,18 +33,25 @@ const isEdge = getBrowserName() === 'Edge';
// since Chromium v102, requestAnimationFrame no longer fires in devtools_page (i.e. this file)
// mock requestAnimationFrame with setTimeout as a temporary workaround
// https://github.com/facebook/react/issues/24626
// The polyfill is based on https://gist.github.com/jalbam/5fe05443270fa6d8136238ec72accbc0
if (isChrome || isEdge) {
const FRAME_TIME = 16;
let lastTime = 0;
window.requestAnimationFrame = function(callback, element) {
const now = window.performance.now();
const nextTime = Math.max(lastTime + FRAME_TIME, now);
return setTimeout(function() {
callback((lastTime = nextTime));
}, nextTime - now);
};
window.cancelAnimationFrame = clearTimeout;
const timeoutID = setTimeout(() => {
// if requestAnimationFrame is not working, polyfill it
// The polyfill is based on https://gist.github.com/jalbam/5fe05443270fa6d8136238ec72accbc0
const FRAME_TIME = 16;
let lastTime = 0;
window.requestAnimationFrame = function(callback, element) {
const now = window.performance.now();
const nextTime = Math.max(lastTime + FRAME_TIME, now);
return setTimeout(function() {
callback((lastTime = nextTime));
}, nextTime - now);
};
window.cancelAnimationFrame = clearTimeout;
}, 400);

requestAnimationFrame(() => {
clearTimeout(timeoutID);
});
}

let panelCreated = false;
Expand Down

0 comments on commit d300ceb

Please sign in to comment.