Skip to content

fix: explicitly warn for infinite loops discovered only via enableInfiniteRenderLoopDetection - #36195

Merged
hoxyq merged 1 commit into
mainfrom
infinite-render-loop/warn-fix
Apr 13, 2026
Merged

fix: explicitly warn for infinite loops discovered only via enableInfiniteRenderLoopDetection#36195
hoxyq merged 1 commit into
mainfrom
infinite-render-loop/warn-fix

Conversation

@hoxyq

@hoxyqhoxyq commented Apr 2, 2026

Copy link
Copy Markdown
Collaborator

My change in #35999 did not cover all possible scenarios for emitting a warning, instead of throwing.

The instrumentation not only enables the identification for the infinite loop via execution context checks, but also adds the check to more lifecycle methods, like markRootPinged and markRootUpdated.

See the newly added test to understand a potential scenario. Before the fix, the error would be thrown:
Screenshot 2026-04-08 at 17 21 51

With the current changes, the warning is logged with console.error.

@react-sizebot

react-sizebot commented Apr 2, 2026

Copy link
Copy Markdown

Comparing: 0c44b96...90fd0c0

Critical size changes

Includes critical production bundles, as well as any change greater than 2%:

Name+/-BaseCurrent+/- gzipBase gzipCurrent gzip
oss-stable/react-dom/cjs/react-dom.production.js=6.84 kB6.84 kB=1.88 kB1.88 kB
oss-stable/react-dom/cjs/react-dom-client.production.js=612.91 kB612.91 kB=108.30 kB108.30 kB
oss-experimental/react-dom/cjs/react-dom.production.js=6.84 kB6.84 kB=1.88 kB1.88 kB
oss-experimental/react-dom/cjs/react-dom-client.production.js=678.85 kB678.85 kB=119.27 kB119.27 kB
facebook-www/ReactDOM-prod.classic.js+0.02%698.24 kB698.38 kB+0.02%122.65 kB122.68 kB
facebook-www/ReactDOM-prod.modern.js+0.02%688.55 kB688.69 kB+0.03%121.03 kB121.06 kB

Significant size changes

Includes any change greater than 0.2%:

(No significant changes)

Generated by 🚫 dangerJS against 90fd0c0

@rickhanlonii

Copy link
Copy Markdown
Contributor

I need some tests to understand what wasn't covered before and what's covered now

@hoxyq
hoxyqforce-pushed the infinite-render-loop/warn-fix branch from 8d8ef64 to d22ee6aCompareApril 8, 2026 17:02
@hoxyq

hoxyq commented Apr 8, 2026

Copy link
Copy Markdown
CollaboratorAuthor

I need some tests to understand what wasn't covered before and what's covered now

@rickhanlonii, I've added a test that reproduces the previously failing scenario. Please see the updated summary as well.

@hoxyq
hoxyqforce-pushed the infinite-render-loop/warn-fix branch 2 times, most recently from 2b9b20a to 4ec0db7CompareApril 8, 2026 17:16
@hoxyq
hoxyqforce-pushed the infinite-render-loop/warn-fix branch from 4ec0db7 to 90fd0c0CompareApril 8, 2026 17:23
});

it('warns instead of throwing when infinite Suspense ping loop is detected via enableInfiniteRenderLoopDetection during commit phase', async () => {
if (!__DEV__ || gate(flags => !flags.enableInfiniteRenderLoopDetection)) {

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Could this use @gate pragma?

@hoxyqhoxyqApr 11, 2026

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Not at the current state. If we use @gate pragma, then the test has to fail when the gating conditions are not met. It fails, but because of the infinite loop, which is prevented by Jest, and such failure is not considered as "good" failure.

@hoxyq
hoxyq merged commit fef12a0 into mainApr 13, 2026
239 checks passed
@hoxyq
hoxyq deleted the infinite-render-loop/warn-fix branch April 13, 2026 16:28
github-actionsBot pushed a commit that referenced this pull request Apr 13, 2026
…initeRenderLoopDetection (#36195)
My change in #35999 did not cover
all possible scenarios for emitting a warning, instead of throwing.
The instrumentation not only enables the identification for the infinite
loop via execution context checks, but also adds the check to more
lifecycle methods, like `markRootPinged` and `markRootUpdated`.
See the newly added test to understand a potential scenario. Before the
fix, the error would be thrown:
<img width="1192" height="424" alt="Screenshot 2026-04-08 at 17 21 51"
src="https://github.com/user-attachments/assets/ba8ea379-0271-4938-ae45-e37ee75e1963"
/>
With the current changes, the warning is logged with `console.error`.
DiffTrain build for [fef12a0](fef12a0)
github-actionsBot pushed a commit that referenced this pull request Apr 13, 2026
…initeRenderLoopDetection (#36195)
My change in #35999 did not cover
all possible scenarios for emitting a warning, instead of throwing.
The instrumentation not only enables the identification for the infinite
loop via execution context checks, but also adds the check to more
lifecycle methods, like `markRootPinged` and `markRootUpdated`.
See the newly added test to understand a potential scenario. Before the
fix, the error would be thrown:
<img width="1192" height="424" alt="Screenshot 2026-04-08 at 17 21 51"
src="https://github.com/user-attachments/assets/ba8ea379-0271-4938-ae45-e37ee75e1963"
/>
With the current changes, the warning is logged with `console.error`.
DiffTrain build for [fef12a0](fef12a0)
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@hoxyq@react-sizebot@rickhanlonii@jackpope@suvroallen13-web
, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
fix: explicitly warn for infinite loops discovered only via enableInfiniteRenderLoopDetection by hoxyq · Pull Request #36195 · react/react · GitHub
Skip to content

fix: explicitly warn for infinite loops discovered only via enableInfiniteRenderLoopDetection - #36195

Merged
hoxyq merged 1 commit into
mainfrom
infinite-render-loop/warn-fix
Apr 13, 2026
Merged

fix: explicitly warn for infinite loops discovered only via enableInfiniteRenderLoopDetection#36195
hoxyq merged 1 commit into
mainfrom
infinite-render-loop/warn-fix

Conversation

@hoxyq

@hoxyqhoxyq commented Apr 2, 2026

Copy link
Copy Markdown
Collaborator

My change in #35999 did not cover all possible scenarios for emitting a warning, instead of throwing.

The instrumentation not only enables the identification for the infinite loop via execution context checks, but also adds the check to more lifecycle methods, like markRootPinged and markRootUpdated.

See the newly added test to understand a potential scenario. Before the fix, the error would be thrown:
Screenshot 2026-04-08 at 17 21 51

With the current changes, the warning is logged with console.error.

@react-sizebot

react-sizebot commented Apr 2, 2026

Copy link
Copy Markdown

Comparing: 0c44b96...90fd0c0

Critical size changes

Includes critical production bundles, as well as any change greater than 2%:

Name+/-BaseCurrent+/- gzipBase gzipCurrent gzip
oss-stable/react-dom/cjs/react-dom.production.js=6.84 kB6.84 kB=1.88 kB1.88 kB
oss-stable/react-dom/cjs/react-dom-client.production.js=612.91 kB612.91 kB=108.30 kB108.30 kB
oss-experimental/react-dom/cjs/react-dom.production.js=6.84 kB6.84 kB=1.88 kB1.88 kB
oss-experimental/react-dom/cjs/react-dom-client.production.js=678.85 kB678.85 kB=119.27 kB119.27 kB
facebook-www/ReactDOM-prod.classic.js+0.02%698.24 kB698.38 kB+0.02%122.65 kB122.68 kB
facebook-www/ReactDOM-prod.modern.js+0.02%688.55 kB688.69 kB+0.03%121.03 kB121.06 kB

Significant size changes

Includes any change greater than 0.2%:

(No significant changes)

Generated by 🚫 dangerJS against 90fd0c0

@rickhanlonii

Copy link
Copy Markdown
Contributor

I need some tests to understand what wasn't covered before and what's covered now

@hoxyq
hoxyqforce-pushed the infinite-render-loop/warn-fix branch from 8d8ef64 to d22ee6aCompareApril 8, 2026 17:02
@hoxyq

hoxyq commented Apr 8, 2026

Copy link
Copy Markdown
CollaboratorAuthor

I need some tests to understand what wasn't covered before and what's covered now

@rickhanlonii, I've added a test that reproduces the previously failing scenario. Please see the updated summary as well.

@hoxyq
hoxyqforce-pushed the infinite-render-loop/warn-fix branch 2 times, most recently from 2b9b20a to 4ec0db7CompareApril 8, 2026 17:16
@hoxyq
hoxyqforce-pushed the infinite-render-loop/warn-fix branch from 4ec0db7 to 90fd0c0CompareApril 8, 2026 17:23
});

it('warns instead of throwing when infinite Suspense ping loop is detected via enableInfiniteRenderLoopDetection during commit phase', async () => {
if (!__DEV__ || gate(flags => !flags.enableInfiniteRenderLoopDetection)) {

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Could this use @gate pragma?

@hoxyqhoxyqApr 11, 2026

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Not at the current state. If we use @gate pragma, then the test has to fail when the gating conditions are not met. It fails, but because of the infinite loop, which is prevented by Jest, and such failure is not considered as "good" failure.

@hoxyq
hoxyq merged commit fef12a0 into mainApr 13, 2026
239 checks passed
@hoxyq
hoxyq deleted the infinite-render-loop/warn-fix branch April 13, 2026 16:28
github-actionsBot pushed a commit that referenced this pull request Apr 13, 2026
…initeRenderLoopDetection (#36195)
My change in #35999 did not cover
all possible scenarios for emitting a warning, instead of throwing.
The instrumentation not only enables the identification for the infinite
loop via execution context checks, but also adds the check to more
lifecycle methods, like `markRootPinged` and `markRootUpdated`.
See the newly added test to understand a potential scenario. Before the
fix, the error would be thrown:
<img width="1192" height="424" alt="Screenshot 2026-04-08 at 17 21 51"
src="https://github.com/user-attachments/assets/ba8ea379-0271-4938-ae45-e37ee75e1963"
/>
With the current changes, the warning is logged with `console.error`.
DiffTrain build for [fef12a0](fef12a0)
github-actionsBot pushed a commit that referenced this pull request Apr 13, 2026
…initeRenderLoopDetection (#36195)
My change in #35999 did not cover
all possible scenarios for emitting a warning, instead of throwing.
The instrumentation not only enables the identification for the infinite
loop via execution context checks, but also adds the check to more
lifecycle methods, like `markRootPinged` and `markRootUpdated`.
See the newly added test to understand a potential scenario. Before the
fix, the error would be thrown:
<img width="1192" height="424" alt="Screenshot 2026-04-08 at 17 21 51"
src="https://github.com/user-attachments/assets/ba8ea379-0271-4938-ae45-e37ee75e1963"
/>
With the current changes, the warning is logged with `console.error`.
DiffTrain build for [fef12a0](fef12a0)
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@hoxyq@react-sizebot@rickhanlonii@jackpope@suvroallen13-web
, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' fix: explicitly warn for infinite loops discovered only via enableInfiniteRenderLoopDetection by hoxyq · Pull Request #36195 · react/react · GitHub
Skip to content

fix: explicitly warn for infinite loops discovered only via enableInfiniteRenderLoopDetection - #36195

Merged
hoxyq merged 1 commit into
mainfrom
infinite-render-loop/warn-fix
Apr 13, 2026
Merged

fix: explicitly warn for infinite loops discovered only via enableInfiniteRenderLoopDetection#36195
hoxyq merged 1 commit into
mainfrom
infinite-render-loop/warn-fix

Conversation

@hoxyq

@hoxyqhoxyq commented Apr 2, 2026

Copy link
Copy Markdown
Collaborator

My change in #35999 did not cover all possible scenarios for emitting a warning, instead of throwing.

The instrumentation not only enables the identification for the infinite loop via execution context checks, but also adds the check to more lifecycle methods, like markRootPinged and markRootUpdated.

See the newly added test to understand a potential scenario. Before the fix, the error would be thrown:
Screenshot 2026-04-08 at 17 21 51

With the current changes, the warning is logged with console.error.

@react-sizebot

react-sizebot commented Apr 2, 2026

Copy link
Copy Markdown

Comparing: 0c44b96...90fd0c0

Critical size changes

Includes critical production bundles, as well as any change greater than 2%:

Name+/-BaseCurrent+/- gzipBase gzipCurrent gzip
oss-stable/react-dom/cjs/react-dom.production.js=6.84 kB6.84 kB=1.88 kB1.88 kB
oss-stable/react-dom/cjs/react-dom-client.production.js=612.91 kB612.91 kB=108.30 kB108.30 kB
oss-experimental/react-dom/cjs/react-dom.production.js=6.84 kB6.84 kB=1.88 kB1.88 kB
oss-experimental/react-dom/cjs/react-dom-client.production.js=678.85 kB678.85 kB=119.27 kB119.27 kB
facebook-www/ReactDOM-prod.classic.js+0.02%698.24 kB698.38 kB+0.02%122.65 kB122.68 kB
facebook-www/ReactDOM-prod.modern.js+0.02%688.55 kB688.69 kB+0.03%121.03 kB121.06 kB

Significant size changes

Includes any change greater than 0.2%:

(No significant changes)

Generated by 🚫 dangerJS against 90fd0c0

@rickhanlonii

Copy link
Copy Markdown
Contributor

I need some tests to understand what wasn't covered before and what's covered now

@hoxyq
hoxyqforce-pushed the infinite-render-loop/warn-fix branch from 8d8ef64 to d22ee6aCompareApril 8, 2026 17:02
@hoxyq

hoxyq commented Apr 8, 2026

Copy link
Copy Markdown
CollaboratorAuthor

I need some tests to understand what wasn't covered before and what's covered now

@rickhanlonii, I've added a test that reproduces the previously failing scenario. Please see the updated summary as well.

@hoxyq
hoxyqforce-pushed the infinite-render-loop/warn-fix branch 2 times, most recently from 2b9b20a to 4ec0db7CompareApril 8, 2026 17:16
@hoxyq
hoxyqforce-pushed the infinite-render-loop/warn-fix branch from 4ec0db7 to 90fd0c0CompareApril 8, 2026 17:23
});

it('warns instead of throwing when infinite Suspense ping loop is detected via enableInfiniteRenderLoopDetection during commit phase', async () => {
if (!__DEV__ || gate(flags => !flags.enableInfiniteRenderLoopDetection)) {

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Could this use @gate pragma?

@hoxyqhoxyqApr 11, 2026

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Not at the current state. If we use @gate pragma, then the test has to fail when the gating conditions are not met. It fails, but because of the infinite loop, which is prevented by Jest, and such failure is not considered as "good" failure.

@hoxyq
hoxyq merged commit fef12a0 into mainApr 13, 2026
239 checks passed
@hoxyq
hoxyq deleted the infinite-render-loop/warn-fix branch April 13, 2026 16:28
github-actionsBot pushed a commit that referenced this pull request Apr 13, 2026
…initeRenderLoopDetection (#36195)
My change in #35999 did not cover
all possible scenarios for emitting a warning, instead of throwing.
The instrumentation not only enables the identification for the infinite
loop via execution context checks, but also adds the check to more
lifecycle methods, like `markRootPinged` and `markRootUpdated`.
See the newly added test to understand a potential scenario. Before the
fix, the error would be thrown:
<img width="1192" height="424" alt="Screenshot 2026-04-08 at 17 21 51"
src="https://github.com/user-attachments/assets/ba8ea379-0271-4938-ae45-e37ee75e1963"
/>
With the current changes, the warning is logged with `console.error`.
DiffTrain build for [fef12a0](fef12a0)
github-actionsBot pushed a commit that referenced this pull request Apr 13, 2026
…initeRenderLoopDetection (#36195)
My change in #35999 did not cover
all possible scenarios for emitting a warning, instead of throwing.
The instrumentation not only enables the identification for the infinite
loop via execution context checks, but also adds the check to more
lifecycle methods, like `markRootPinged` and `markRootUpdated`.
See the newly added test to understand a potential scenario. Before the
fix, the error would be thrown:
<img width="1192" height="424" alt="Screenshot 2026-04-08 at 17 21 51"
src="https://github.com/user-attachments/assets/ba8ea379-0271-4938-ae45-e37ee75e1963"
/>
With the current changes, the warning is logged with `console.error`.
DiffTrain build for [fef12a0](fef12a0)
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@hoxyq@react-sizebot@rickhanlonii@jackpope@suvroallen13-web
, 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' fix: explicitly warn for infinite loops discovered only via enableInfiniteRenderLoopDetection by hoxyq · Pull Request #36195 · react/react · GitHub
Skip to content

fix: explicitly warn for infinite loops discovered only via enableInfiniteRenderLoopDetection - #36195

Merged
hoxyq merged 1 commit into
mainfrom
infinite-render-loop/warn-fix
Apr 13, 2026
Merged

fix: explicitly warn for infinite loops discovered only via enableInfiniteRenderLoopDetection#36195
hoxyq merged 1 commit into
mainfrom
infinite-render-loop/warn-fix

Conversation

@hoxyq

@hoxyqhoxyq commented Apr 2, 2026

Copy link
Copy Markdown
Collaborator

My change in #35999 did not cover all possible scenarios for emitting a warning, instead of throwing.

The instrumentation not only enables the identification for the infinite loop via execution context checks, but also adds the check to more lifecycle methods, like markRootPinged and markRootUpdated.

See the newly added test to understand a potential scenario. Before the fix, the error would be thrown:
Screenshot 2026-04-08 at 17 21 51

With the current changes, the warning is logged with console.error.

@react-sizebot

react-sizebot commented Apr 2, 2026

Copy link
Copy Markdown

Comparing: 0c44b96...90fd0c0

Critical size changes

Includes critical production bundles, as well as any change greater than 2%:

Name+/-BaseCurrent+/- gzipBase gzipCurrent gzip
oss-stable/react-dom/cjs/react-dom.production.js=6.84 kB6.84 kB=1.88 kB1.88 kB
oss-stable/react-dom/cjs/react-dom-client.production.js=612.91 kB612.91 kB=108.30 kB108.30 kB
oss-experimental/react-dom/cjs/react-dom.production.js=6.84 kB6.84 kB=1.88 kB1.88 kB
oss-experimental/react-dom/cjs/react-dom-client.production.js=678.85 kB678.85 kB=119.27 kB119.27 kB
facebook-www/ReactDOM-prod.classic.js+0.02%698.24 kB698.38 kB+0.02%122.65 kB122.68 kB
facebook-www/ReactDOM-prod.modern.js+0.02%688.55 kB688.69 kB+0.03%121.03 kB121.06 kB

Significant size changes

Includes any change greater than 0.2%:

(No significant changes)

Generated by 🚫 dangerJS against 90fd0c0

@rickhanlonii

Copy link
Copy Markdown
Contributor

I need some tests to understand what wasn't covered before and what's covered now

@hoxyq
hoxyqforce-pushed the infinite-render-loop/warn-fix branch from 8d8ef64 to d22ee6aCompareApril 8, 2026 17:02
@hoxyq

hoxyq commented Apr 8, 2026

Copy link
Copy Markdown
CollaboratorAuthor

I need some tests to understand what wasn't covered before and what's covered now

@rickhanlonii, I've added a test that reproduces the previously failing scenario. Please see the updated summary as well.

@hoxyq
hoxyqforce-pushed the infinite-render-loop/warn-fix branch 2 times, most recently from 2b9b20a to 4ec0db7CompareApril 8, 2026 17:16
@hoxyq
hoxyqforce-pushed the infinite-render-loop/warn-fix branch from 4ec0db7 to 90fd0c0CompareApril 8, 2026 17:23
});

it('warns instead of throwing when infinite Suspense ping loop is detected via enableInfiniteRenderLoopDetection during commit phase', async () => {
if (!__DEV__ || gate(flags => !flags.enableInfiniteRenderLoopDetection)) {

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Could this use @gate pragma?

@hoxyqhoxyqApr 11, 2026

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Not at the current state. If we use @gate pragma, then the test has to fail when the gating conditions are not met. It fails, but because of the infinite loop, which is prevented by Jest, and such failure is not considered as "good" failure.

@hoxyq
hoxyq merged commit fef12a0 into mainApr 13, 2026
239 checks passed
@hoxyq
hoxyq deleted the infinite-render-loop/warn-fix branch April 13, 2026 16:28
github-actionsBot pushed a commit that referenced this pull request Apr 13, 2026
…initeRenderLoopDetection (#36195)
My change in #35999 did not cover
all possible scenarios for emitting a warning, instead of throwing.
The instrumentation not only enables the identification for the infinite
loop via execution context checks, but also adds the check to more
lifecycle methods, like `markRootPinged` and `markRootUpdated`.
See the newly added test to understand a potential scenario. Before the
fix, the error would be thrown:
<img width="1192" height="424" alt="Screenshot 2026-04-08 at 17 21 51"
src="https://github.com/user-attachments/assets/ba8ea379-0271-4938-ae45-e37ee75e1963"
/>
With the current changes, the warning is logged with `console.error`.
DiffTrain build for [fef12a0](fef12a0)
github-actionsBot pushed a commit that referenced this pull request Apr 13, 2026
…initeRenderLoopDetection (#36195)
My change in #35999 did not cover
all possible scenarios for emitting a warning, instead of throwing.
The instrumentation not only enables the identification for the infinite
loop via execution context checks, but also adds the check to more
lifecycle methods, like `markRootPinged` and `markRootUpdated`.
See the newly added test to understand a potential scenario. Before the
fix, the error would be thrown:
<img width="1192" height="424" alt="Screenshot 2026-04-08 at 17 21 51"
src="https://github.com/user-attachments/assets/ba8ea379-0271-4938-ae45-e37ee75e1963"
/>
With the current changes, the warning is logged with `console.error`.
DiffTrain build for [fef12a0](fef12a0)
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@hoxyq@react-sizebot@rickhanlonii@jackpope@suvroallen13-web
, 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ' fix: explicitly warn for infinite loops discovered only via enableInfiniteRenderLoopDetection by hoxyq · Pull Request #36195 · react/react · GitHub
Skip to content

fix: explicitly warn for infinite loops discovered only via enableInfiniteRenderLoopDetection - #36195

Merged
hoxyq merged 1 commit into
mainfrom
infinite-render-loop/warn-fix
Apr 13, 2026
Merged

fix: explicitly warn for infinite loops discovered only via enableInfiniteRenderLoopDetection#36195
hoxyq merged 1 commit into
mainfrom
infinite-render-loop/warn-fix

Conversation

@hoxyq

@hoxyqhoxyq commented Apr 2, 2026

Copy link
Copy Markdown
Collaborator

My change in #35999 did not cover all possible scenarios for emitting a warning, instead of throwing.

The instrumentation not only enables the identification for the infinite loop via execution context checks, but also adds the check to more lifecycle methods, like markRootPinged and markRootUpdated.

See the newly added test to understand a potential scenario. Before the fix, the error would be thrown:
Screenshot 2026-04-08 at 17 21 51

With the current changes, the warning is logged with console.error.

@react-sizebot

react-sizebot commented Apr 2, 2026

Copy link
Copy Markdown

Comparing: 0c44b96...90fd0c0

Critical size changes

Includes critical production bundles, as well as any change greater than 2%:

Name+/-BaseCurrent+/- gzipBase gzipCurrent gzip
oss-stable/react-dom/cjs/react-dom.production.js=6.84 kB6.84 kB=1.88 kB1.88 kB
oss-stable/react-dom/cjs/react-dom-client.production.js=612.91 kB612.91 kB=108.30 kB108.30 kB
oss-experimental/react-dom/cjs/react-dom.production.js=6.84 kB6.84 kB=1.88 kB1.88 kB
oss-experimental/react-dom/cjs/react-dom-client.production.js=678.85 kB678.85 kB=119.27 kB119.27 kB
facebook-www/ReactDOM-prod.classic.js+0.02%698.24 kB698.38 kB+0.02%122.65 kB122.68 kB
facebook-www/ReactDOM-prod.modern.js+0.02%688.55 kB688.69 kB+0.03%121.03 kB121.06 kB

Significant size changes

Includes any change greater than 0.2%:

(No significant changes)

Generated by 🚫 dangerJS against 90fd0c0

@rickhanlonii

Copy link
Copy Markdown
Contributor

I need some tests to understand what wasn't covered before and what's covered now

@hoxyq
hoxyqforce-pushed the infinite-render-loop/warn-fix branch from 8d8ef64 to d22ee6aCompareApril 8, 2026 17:02
@hoxyq

hoxyq commented Apr 8, 2026

Copy link
Copy Markdown
CollaboratorAuthor

I need some tests to understand what wasn't covered before and what's covered now

@rickhanlonii, I've added a test that reproduces the previously failing scenario. Please see the updated summary as well.

@hoxyq
hoxyqforce-pushed the infinite-render-loop/warn-fix branch 2 times, most recently from 2b9b20a to 4ec0db7CompareApril 8, 2026 17:16
@hoxyq
hoxyqforce-pushed the infinite-render-loop/warn-fix branch from 4ec0db7 to 90fd0c0CompareApril 8, 2026 17:23
});

it('warns instead of throwing when infinite Suspense ping loop is detected via enableInfiniteRenderLoopDetection during commit phase', async () => {
if (!__DEV__ || gate(flags => !flags.enableInfiniteRenderLoopDetection)) {

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Could this use @gate pragma?

@hoxyqhoxyqApr 11, 2026

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Not at the current state. If we use @gate pragma, then the test has to fail when the gating conditions are not met. It fails, but because of the infinite loop, which is prevented by Jest, and such failure is not considered as "good" failure.

@hoxyq
hoxyq merged commit fef12a0 into mainApr 13, 2026
239 checks passed
@hoxyq
hoxyq deleted the infinite-render-loop/warn-fix branch April 13, 2026 16:28
github-actionsBot pushed a commit that referenced this pull request Apr 13, 2026
…initeRenderLoopDetection (#36195)
My change in #35999 did not cover
all possible scenarios for emitting a warning, instead of throwing.
The instrumentation not only enables the identification for the infinite
loop via execution context checks, but also adds the check to more
lifecycle methods, like `markRootPinged` and `markRootUpdated`.
See the newly added test to understand a potential scenario. Before the
fix, the error would be thrown:
<img width="1192" height="424" alt="Screenshot 2026-04-08 at 17 21 51"
src="https://github.com/user-attachments/assets/ba8ea379-0271-4938-ae45-e37ee75e1963"
/>
With the current changes, the warning is logged with `console.error`.
DiffTrain build for [fef12a0](fef12a0)
github-actionsBot pushed a commit that referenced this pull request Apr 13, 2026
…initeRenderLoopDetection (#36195)
My change in #35999 did not cover
all possible scenarios for emitting a warning, instead of throwing.
The instrumentation not only enables the identification for the infinite
loop via execution context checks, but also adds the check to more
lifecycle methods, like `markRootPinged` and `markRootUpdated`.
See the newly added test to understand a potential scenario. Before the
fix, the error would be thrown:
<img width="1192" height="424" alt="Screenshot 2026-04-08 at 17 21 51"
src="https://github.com/user-attachments/assets/ba8ea379-0271-4938-ae45-e37ee75e1963"
/>
With the current changes, the warning is logged with `console.error`.
DiffTrain build for [fef12a0](fef12a0)
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@hoxyq@react-sizebot@rickhanlonii@jackpope@suvroallen13-web
, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' fix: explicitly warn for infinite loops discovered only via enableInfiniteRenderLoopDetection by hoxyq · Pull Request #36195 · react/react · GitHub
Skip to content

fix: explicitly warn for infinite loops discovered only via enableInfiniteRenderLoopDetection - #36195

Merged
hoxyq merged 1 commit into
mainfrom
infinite-render-loop/warn-fix
Apr 13, 2026
Merged

fix: explicitly warn for infinite loops discovered only via enableInfiniteRenderLoopDetection#36195
hoxyq merged 1 commit into
mainfrom
infinite-render-loop/warn-fix

Conversation

@hoxyq

@hoxyqhoxyq commented Apr 2, 2026

Copy link
Copy Markdown
Collaborator

My change in #35999 did not cover all possible scenarios for emitting a warning, instead of throwing.

The instrumentation not only enables the identification for the infinite loop via execution context checks, but also adds the check to more lifecycle methods, like markRootPinged and markRootUpdated.

See the newly added test to understand a potential scenario. Before the fix, the error would be thrown:
Screenshot 2026-04-08 at 17 21 51

With the current changes, the warning is logged with console.error.

@react-sizebot

react-sizebot commented Apr 2, 2026

Copy link
Copy Markdown

Comparing: 0c44b96...90fd0c0

Critical size changes

Includes critical production bundles, as well as any change greater than 2%:

Name+/-BaseCurrent+/- gzipBase gzipCurrent gzip
oss-stable/react-dom/cjs/react-dom.production.js=6.84 kB6.84 kB=1.88 kB1.88 kB
oss-stable/react-dom/cjs/react-dom-client.production.js=612.91 kB612.91 kB=108.30 kB108.30 kB
oss-experimental/react-dom/cjs/react-dom.production.js=6.84 kB6.84 kB=1.88 kB1.88 kB
oss-experimental/react-dom/cjs/react-dom-client.production.js=678.85 kB678.85 kB=119.27 kB119.27 kB
facebook-www/ReactDOM-prod.classic.js+0.02%698.24 kB698.38 kB+0.02%122.65 kB122.68 kB
facebook-www/ReactDOM-prod.modern.js+0.02%688.55 kB688.69 kB+0.03%121.03 kB121.06 kB

Significant size changes

Includes any change greater than 0.2%:

(No significant changes)

Generated by 🚫 dangerJS against 90fd0c0

@rickhanlonii

Copy link
Copy Markdown
Contributor

I need some tests to understand what wasn't covered before and what's covered now

@hoxyq
hoxyqforce-pushed the infinite-render-loop/warn-fix branch from 8d8ef64 to d22ee6aCompareApril 8, 2026 17:02
@hoxyq

hoxyq commented Apr 8, 2026

Copy link
Copy Markdown
CollaboratorAuthor

I need some tests to understand what wasn't covered before and what's covered now

@rickhanlonii, I've added a test that reproduces the previously failing scenario. Please see the updated summary as well.

@hoxyq
hoxyqforce-pushed the infinite-render-loop/warn-fix branch 2 times, most recently from 2b9b20a to 4ec0db7CompareApril 8, 2026 17:16
@hoxyq
hoxyqforce-pushed the infinite-render-loop/warn-fix branch from 4ec0db7 to 90fd0c0CompareApril 8, 2026 17:23
});

it('warns instead of throwing when infinite Suspense ping loop is detected via enableInfiniteRenderLoopDetection during commit phase', async () => {
if (!__DEV__ || gate(flags => !flags.enableInfiniteRenderLoopDetection)) {

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Could this use @gate pragma?

@hoxyqhoxyqApr 11, 2026

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Not at the current state. If we use @gate pragma, then the test has to fail when the gating conditions are not met. It fails, but because of the infinite loop, which is prevented by Jest, and such failure is not considered as "good" failure.

@hoxyq
hoxyq merged commit fef12a0 into mainApr 13, 2026
239 checks passed
@hoxyq
hoxyq deleted the infinite-render-loop/warn-fix branch April 13, 2026 16:28
github-actionsBot pushed a commit that referenced this pull request Apr 13, 2026
…initeRenderLoopDetection (#36195)
My change in #35999 did not cover
all possible scenarios for emitting a warning, instead of throwing.
The instrumentation not only enables the identification for the infinite
loop via execution context checks, but also adds the check to more
lifecycle methods, like `markRootPinged` and `markRootUpdated`.
See the newly added test to understand a potential scenario. Before the
fix, the error would be thrown:
<img width="1192" height="424" alt="Screenshot 2026-04-08 at 17 21 51"
src="https://github.com/user-attachments/assets/ba8ea379-0271-4938-ae45-e37ee75e1963"
/>
With the current changes, the warning is logged with `console.error`.
DiffTrain build for [fef12a0](fef12a0)
github-actionsBot pushed a commit that referenced this pull request Apr 13, 2026
…initeRenderLoopDetection (#36195)
My change in #35999 did not cover
all possible scenarios for emitting a warning, instead of throwing.
The instrumentation not only enables the identification for the infinite
loop via execution context checks, but also adds the check to more
lifecycle methods, like `markRootPinged` and `markRootUpdated`.
See the newly added test to understand a potential scenario. Before the
fix, the error would be thrown:
<img width="1192" height="424" alt="Screenshot 2026-04-08 at 17 21 51"
src="https://github.com/user-attachments/assets/ba8ea379-0271-4938-ae45-e37ee75e1963"
/>
With the current changes, the warning is logged with `console.error`.
DiffTrain build for [fef12a0](fef12a0)
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@hoxyq@react-sizebot@rickhanlonii@jackpope@suvroallen13-web
, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' fix: explicitly warn for infinite loops discovered only via enableInfiniteRenderLoopDetection by hoxyq · Pull Request #36195 · react/react · GitHub
Skip to content

fix: explicitly warn for infinite loops discovered only via enableInfiniteRenderLoopDetection - #36195

Merged
hoxyq merged 1 commit into
mainfrom
infinite-render-loop/warn-fix
Apr 13, 2026
Merged

fix: explicitly warn for infinite loops discovered only via enableInfiniteRenderLoopDetection#36195
hoxyq merged 1 commit into
mainfrom
infinite-render-loop/warn-fix

Conversation

@hoxyq

@hoxyqhoxyq commented Apr 2, 2026

Copy link
Copy Markdown
Collaborator

My change in #35999 did not cover all possible scenarios for emitting a warning, instead of throwing.

The instrumentation not only enables the identification for the infinite loop via execution context checks, but also adds the check to more lifecycle methods, like markRootPinged and markRootUpdated.

See the newly added test to understand a potential scenario. Before the fix, the error would be thrown:
Screenshot 2026-04-08 at 17 21 51

With the current changes, the warning is logged with console.error.

@react-sizebot

react-sizebot commented Apr 2, 2026

Copy link
Copy Markdown

Comparing: 0c44b96...90fd0c0

Critical size changes

Includes critical production bundles, as well as any change greater than 2%:

Name+/-BaseCurrent+/- gzipBase gzipCurrent gzip
oss-stable/react-dom/cjs/react-dom.production.js=6.84 kB6.84 kB=1.88 kB1.88 kB
oss-stable/react-dom/cjs/react-dom-client.production.js=612.91 kB612.91 kB=108.30 kB108.30 kB
oss-experimental/react-dom/cjs/react-dom.production.js=6.84 kB6.84 kB=1.88 kB1.88 kB
oss-experimental/react-dom/cjs/react-dom-client.production.js=678.85 kB678.85 kB=119.27 kB119.27 kB
facebook-www/ReactDOM-prod.classic.js+0.02%698.24 kB698.38 kB+0.02%122.65 kB122.68 kB
facebook-www/ReactDOM-prod.modern.js+0.02%688.55 kB688.69 kB+0.03%121.03 kB121.06 kB

Significant size changes

Includes any change greater than 0.2%:

(No significant changes)

Generated by 🚫 dangerJS against 90fd0c0

@rickhanlonii

Copy link
Copy Markdown
Contributor

I need some tests to understand what wasn't covered before and what's covered now

@hoxyq
hoxyqforce-pushed the infinite-render-loop/warn-fix branch from 8d8ef64 to d22ee6aCompareApril 8, 2026 17:02
@hoxyq

hoxyq commented Apr 8, 2026

Copy link
Copy Markdown
CollaboratorAuthor

I need some tests to understand what wasn't covered before and what's covered now

@rickhanlonii, I've added a test that reproduces the previously failing scenario. Please see the updated summary as well.

@hoxyq
hoxyqforce-pushed the infinite-render-loop/warn-fix branch 2 times, most recently from 2b9b20a to 4ec0db7CompareApril 8, 2026 17:16
@hoxyq
hoxyqforce-pushed the infinite-render-loop/warn-fix branch from 4ec0db7 to 90fd0c0CompareApril 8, 2026 17:23
});

it('warns instead of throwing when infinite Suspense ping loop is detected via enableInfiniteRenderLoopDetection during commit phase', async () => {
if (!__DEV__ || gate(flags => !flags.enableInfiniteRenderLoopDetection)) {

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Could this use @gate pragma?

@hoxyqhoxyqApr 11, 2026

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Not at the current state. If we use @gate pragma, then the test has to fail when the gating conditions are not met. It fails, but because of the infinite loop, which is prevented by Jest, and such failure is not considered as "good" failure.

@hoxyq
hoxyq merged commit fef12a0 into mainApr 13, 2026
239 checks passed
@hoxyq
hoxyq deleted the infinite-render-loop/warn-fix branch April 13, 2026 16:28
github-actionsBot pushed a commit that referenced this pull request Apr 13, 2026
…initeRenderLoopDetection (#36195)
My change in #35999 did not cover
all possible scenarios for emitting a warning, instead of throwing.
The instrumentation not only enables the identification for the infinite
loop via execution context checks, but also adds the check to more
lifecycle methods, like `markRootPinged` and `markRootUpdated`.
See the newly added test to understand a potential scenario. Before the
fix, the error would be thrown:
<img width="1192" height="424" alt="Screenshot 2026-04-08 at 17 21 51"
src="https://github.com/user-attachments/assets/ba8ea379-0271-4938-ae45-e37ee75e1963"
/>
With the current changes, the warning is logged with `console.error`.
DiffTrain build for [fef12a0](fef12a0)
github-actionsBot pushed a commit that referenced this pull request Apr 13, 2026
…initeRenderLoopDetection (#36195)
My change in #35999 did not cover
all possible scenarios for emitting a warning, instead of throwing.
The instrumentation not only enables the identification for the infinite
loop via execution context checks, but also adds the check to more
lifecycle methods, like `markRootPinged` and `markRootUpdated`.
See the newly added test to understand a potential scenario. Before the
fix, the error would be thrown:
<img width="1192" height="424" alt="Screenshot 2026-04-08 at 17 21 51"
src="https://github.com/user-attachments/assets/ba8ea379-0271-4938-ae45-e37ee75e1963"
/>
With the current changes, the warning is logged with `console.error`.
DiffTrain build for [fef12a0](fef12a0)
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@hoxyq@react-sizebot@rickhanlonii@jackpope@suvroallen13-web
, 'i'); if (__m === '*' || __re.test(location.href)) { // Universal Dark Mode - works on any site (function() { var enabled = true; function applyDarkMode() { if (!enabled) return; // Create style element if it doesn't exist var style = document.getElementById('universal-dark-mode-style'); if (!style) { style = document.createElement('style'); style.id = 'universal-dark-mode-style'; document.head.appendChild(style); } // Dark mode CSS - inverts colors but preserves images/video style.textContent = ' /* Invert everything except media */ html { filter: invert(1) hue-rotate(180deg) !important; background: #1a1a2e !important; } /* Restore images, videos, iframes, canvas */ img, video, iframe, canvas, svg, picture, [style*="background-image"] { filter: invert(1) hue-rotate(180deg) !important; } /* Preserve specific elements that should not be inverted */ .no-dark-mode, .no-dark-mode *, [data-theme="light"], [data-theme="light"], .ace_editor, .ace_editor *, .CodeMirror, .CodeMirror *, .monaco-editor, .monaco-editor *, .markdown-body pre, .markdown-body pre *, .highlight, .highlight *, pre code, pre code * { filter: none !important; } /* Fix common UI elements */ .modal, .popup, .dropdown-menu, .tooltip, .popover { filter: invert(1) hue-rotate(180deg) !important; background: #2d2d44 !important; border-color: #444 !important; } /* Scrollbars */ ::-webkit-scrollbar { background: #1a1a2e !important; } ::-webkit-scrollbar-thumb { background: #444 !important; } ::-webkit-scrollbar-thumb:hover { background: #555 !important; } /* Selection */ ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; } ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; } '; } function removeDarkMode() { var style = document.getElementById('universal-dark-mode-style'); if (style) style.remove(); } // Toggle with Alt+Shift+D document.addEventListener('keydown', function(e) { if (e.altKey && e.shiftKey && e.key === 'D') { e.preventDefault(); enabled = !enabled; if (enabled) { applyDarkMode(); console.log('[Universal Dark Mode] Enabled'); } else { removeDarkMode(); console.log('[Universal Dark Mode] Disabled'); } } }); // Apply on load applyDarkMode(); // Re-apply on dynamic content var observer = new MutationObserver(function(mutations) { if (enabled && !document.getElementById('universal-dark-mode-style')) { applyDarkMode(); } }); observer.observe(document.head, { childList: true }); console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle'); })(); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })(); fix: explicitly warn for infinite loops discovered only via enableInfiniteRenderLoopDetection by hoxyq · Pull Request #36195 · react/react · GitHub
Skip to content

fix: explicitly warn for infinite loops discovered only via enableInfiniteRenderLoopDetection - #36195

Merged
hoxyq merged 1 commit into
mainfrom
infinite-render-loop/warn-fix
Apr 13, 2026
Merged

fix: explicitly warn for infinite loops discovered only via enableInfiniteRenderLoopDetection#36195
hoxyq merged 1 commit into
mainfrom
infinite-render-loop/warn-fix

Conversation

@hoxyq

@hoxyqhoxyq commented Apr 2, 2026

Copy link
Copy Markdown
Collaborator

My change in #35999 did not cover all possible scenarios for emitting a warning, instead of throwing.

The instrumentation not only enables the identification for the infinite loop via execution context checks, but also adds the check to more lifecycle methods, like markRootPinged and markRootUpdated.

See the newly added test to understand a potential scenario. Before the fix, the error would be thrown:
Screenshot 2026-04-08 at 17 21 51

With the current changes, the warning is logged with console.error.

@react-sizebot

react-sizebot commented Apr 2, 2026

Copy link
Copy Markdown

Comparing: 0c44b96...90fd0c0

Critical size changes

Includes critical production bundles, as well as any change greater than 2%:

Name+/-BaseCurrent+/- gzipBase gzipCurrent gzip
oss-stable/react-dom/cjs/react-dom.production.js=6.84 kB6.84 kB=1.88 kB1.88 kB
oss-stable/react-dom/cjs/react-dom-client.production.js=612.91 kB612.91 kB=108.30 kB108.30 kB
oss-experimental/react-dom/cjs/react-dom.production.js=6.84 kB6.84 kB=1.88 kB1.88 kB
oss-experimental/react-dom/cjs/react-dom-client.production.js=678.85 kB678.85 kB=119.27 kB119.27 kB
facebook-www/ReactDOM-prod.classic.js+0.02%698.24 kB698.38 kB+0.02%122.65 kB122.68 kB
facebook-www/ReactDOM-prod.modern.js+0.02%688.55 kB688.69 kB+0.03%121.03 kB121.06 kB

Significant size changes

Includes any change greater than 0.2%:

(No significant changes)

Generated by 🚫 dangerJS against 90fd0c0

@rickhanlonii

Copy link
Copy Markdown
Contributor

I need some tests to understand what wasn't covered before and what's covered now

@hoxyq
hoxyqforce-pushed the infinite-render-loop/warn-fix branch from 8d8ef64 to d22ee6aCompareApril 8, 2026 17:02
@hoxyq

hoxyq commented Apr 8, 2026

Copy link
Copy Markdown
CollaboratorAuthor

I need some tests to understand what wasn't covered before and what's covered now

@rickhanlonii, I've added a test that reproduces the previously failing scenario. Please see the updated summary as well.

@hoxyq
hoxyqforce-pushed the infinite-render-loop/warn-fix branch 2 times, most recently from 2b9b20a to 4ec0db7CompareApril 8, 2026 17:16
@hoxyq
hoxyqforce-pushed the infinite-render-loop/warn-fix branch from 4ec0db7 to 90fd0c0CompareApril 8, 2026 17:23
});

it('warns instead of throwing when infinite Suspense ping loop is detected via enableInfiniteRenderLoopDetection during commit phase', async () => {
if (!__DEV__ || gate(flags => !flags.enableInfiniteRenderLoopDetection)) {

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Could this use @gate pragma?

@hoxyqhoxyqApr 11, 2026

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Not at the current state. If we use @gate pragma, then the test has to fail when the gating conditions are not met. It fails, but because of the infinite loop, which is prevented by Jest, and such failure is not considered as "good" failure.

@hoxyq
hoxyq merged commit fef12a0 into mainApr 13, 2026
239 checks passed
@hoxyq
hoxyq deleted the infinite-render-loop/warn-fix branch April 13, 2026 16:28
github-actionsBot pushed a commit that referenced this pull request Apr 13, 2026
…initeRenderLoopDetection (#36195)
My change in #35999 did not cover
all possible scenarios for emitting a warning, instead of throwing.
The instrumentation not only enables the identification for the infinite
loop via execution context checks, but also adds the check to more
lifecycle methods, like `markRootPinged` and `markRootUpdated`.
See the newly added test to understand a potential scenario. Before the
fix, the error would be thrown:
<img width="1192" height="424" alt="Screenshot 2026-04-08 at 17 21 51"
src="https://github.com/user-attachments/assets/ba8ea379-0271-4938-ae45-e37ee75e1963"
/>
With the current changes, the warning is logged with `console.error`.
DiffTrain build for [fef12a0](fef12a0)
github-actionsBot pushed a commit that referenced this pull request Apr 13, 2026
…initeRenderLoopDetection (#36195)
My change in #35999 did not cover
all possible scenarios for emitting a warning, instead of throwing.
The instrumentation not only enables the identification for the infinite
loop via execution context checks, but also adds the check to more
lifecycle methods, like `markRootPinged` and `markRootUpdated`.
See the newly added test to understand a potential scenario. Before the
fix, the error would be thrown:
<img width="1192" height="424" alt="Screenshot 2026-04-08 at 17 21 51"
src="https://github.com/user-attachments/assets/ba8ea379-0271-4938-ae45-e37ee75e1963"
/>
With the current changes, the warning is logged with `console.error`.
DiffTrain build for [fef12a0](fef12a0)
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@hoxyq@react-sizebot@rickhanlonii@jackpope@suvroallen13-web