Commit 1e986f5

Browse files
authored
[Fizz] Unify prerender only fields to save a field (#35067)
I need to regain a field because the SuspenseBoundary type is already at 16 fields in prod, after which it deopts v8. There are two fields that are only used in prerender to track postpones. These are ripe to be split into an optional object so that they only take up one field when they're not used.
1 parent 38bdda1 commit 1e986f5

1 file changed

Lines changed: 30 additions & 14 deletions

File tree

‎packages/react-server/src/ReactFizzServer.js‎

Lines changed: 30 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -257,8 +257,10 @@ type SuspenseBoundary = {
257257
fallbackState: HoistableState,
258258
contentPreamble: null|Preamble,
259259
fallbackPreamble: null|Preamble,
260-
trackedContentKeyPath: null|KeyNode,// used to track the path for replay nodes
261-
trackedFallbackNode: null|ReplayNode,// used to track the fallback for replay nodes
260+
tracked: null|{
261+
contentKeyPath: null|KeyNode,// used to track the path for replay nodes
262+
fallbackNode: null|ReplayNode,// used to track the fallback for replay nodes
263+
},
262264
errorDigest: ?string,// the error hash if it errors
263265
// DEV-only fields
264266
errorMessage?: null|string,// the error string if it errors
@@ -803,8 +805,7 @@ function createSuspenseBoundary(
803805
fallbackState: createHoistableState(),
804806
contentPreamble,
805807
fallbackPreamble,
806-
trackedContentKeyPath: null,
807-
trackedFallbackNode: null,
808+
tracked: null,
808809
};
809810
if(__DEV__){
810811
// DEV-only fields for hidden class
@@ -1303,9 +1304,6 @@ function renderSuspenseBoundary(
13031304
defer,
13041305
);
13051306
}
1306-
if(request.trackedPostpones!==null){
1307-
newBoundary.trackedContentKeyPath=keyPath;
1308-
}
13091307

13101308
constinsertionIndex=parentSegment.chunks.length;
13111309
// The children of the boundary segment is actually the fallback.
@@ -1358,9 +1356,12 @@ function renderSuspenseBoundary(
13581356
null,
13591357
];
13601358
trackedPostpones.workingMap.set(fallbackKeyPath,fallbackReplayNode);
1361-
// We are rendering the fallback before the boundary content so we keep track of
1362-
// the fallback replay node until we determine if the primary content suspends
1363-
newBoundary.trackedFallbackNode=fallbackReplayNode;
1359+
newBoundary.tracked={
1360+
contentKeyPath: keyPath,
1361+
// We are rendering the fallback before the boundary content so we keep track of
1362+
// the fallback replay node until we determine if the primary content suspends
1363+
fallbackNode: fallbackReplayNode,
1364+
};
13641365
}
13651366

13661367
task.blockedSegment=boundarySegment;
@@ -3793,14 +3794,21 @@ function trackPostponedBoundary(
37933794
// it before flushing and we know that we can't inline it.
37943795
boundary.rootSegmentID=request.nextSegmentId++;
37953796

3796-
constboundaryKeyPath=boundary.trackedContentKeyPath;
3797+
consttracked=boundary.tracked;
3798+
if(tracked===null){
3799+
thrownewError(
3800+
'It should not be possible to postpone at the root. This is a bug in React.',
3801+
);
3802+
}
3803+
3804+
constboundaryKeyPath=tracked.contentKeyPath;
37973805
if(boundaryKeyPath===null){
37983806
thrownewError(
37993807
'It should not be possible to postpone at the root. This is a bug in React.',
38003808
);
38013809
}
38023810

3803-
constfallbackReplayNode=boundary.trackedFallbackNode;
3811+
constfallbackReplayNode=tracked.fallbackNode;
38043812

38053813
constchildren: Array<ReplayNode> = [];
38063814
const boundaryNode: void | ReplayNode =
@@ -3853,7 +3861,11 @@ function trackPostpone(
38533861
trackedPostpones,
38543862
boundary,
38553863
);
3856-
if(boundary.trackedContentKeyPath===keyPath&&task.childIndex===-1){
3864+
if(
3865+
boundary.tracked!==null&&
3866+
boundary.tracked.contentKeyPath===keyPath&&
3867+
task.childIndex===-1
3868+
){
38573869
// Assign ID
38583870
if(segment.id===-1){
38593871
if(segment.parentFlushed){
@@ -3950,7 +3962,11 @@ function untrackBoundary(request: Request, boundary: SuspenseBoundary) {
39503962
if(trackedPostpones===null){
39513963
return;
39523964
}
3953-
constboundaryKeyPath=boundary.trackedContentKeyPath;
3965+
consttracked=boundary.tracked;
3966+
if(tracked===null){
3967+
return;
3968+
}
3969+
constboundaryKeyPath=tracked.contentKeyPath;
39543970
if(boundaryKeyPath===null){
39553971
return;
39563972
}

0 commit comments

Comments
 (0)
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n 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;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Commit 1e986f5

Browse files
authored
[Fizz] Unify prerender only fields to save a field (#35067)
I need to regain a field because the SuspenseBoundary type is already at 16 fields in prod, after which it deopts v8. There are two fields that are only used in prerender to track postpones. These are ripe to be split into an optional object so that they only take up one field when they're not used.
1 parent 38bdda1 commit 1e986f5

1 file changed

Lines changed: 30 additions & 14 deletions

File tree

‎packages/react-server/src/ReactFizzServer.js‎

Lines changed: 30 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -257,8 +257,10 @@ type SuspenseBoundary = {
257257
fallbackState: HoistableState,
258258
contentPreamble: null|Preamble,
259259
fallbackPreamble: null|Preamble,
260-
trackedContentKeyPath: null|KeyNode,// used to track the path for replay nodes
261-
trackedFallbackNode: null|ReplayNode,// used to track the fallback for replay nodes
260+
tracked: null|{
261+
contentKeyPath: null|KeyNode,// used to track the path for replay nodes
262+
fallbackNode: null|ReplayNode,// used to track the fallback for replay nodes
263+
},
262264
errorDigest: ?string,// the error hash if it errors
263265
// DEV-only fields
264266
errorMessage?: null|string,// the error string if it errors
@@ -803,8 +805,7 @@ function createSuspenseBoundary(
803805
fallbackState: createHoistableState(),
804806
contentPreamble,
805807
fallbackPreamble,
806-
trackedContentKeyPath: null,
807-
trackedFallbackNode: null,
808+
tracked: null,
808809
};
809810
if(__DEV__){
810811
// DEV-only fields for hidden class
@@ -1303,9 +1304,6 @@ function renderSuspenseBoundary(
13031304
defer,
13041305
);
13051306
}
1306-
if(request.trackedPostpones!==null){
1307-
newBoundary.trackedContentKeyPath=keyPath;
1308-
}
13091307

13101308
constinsertionIndex=parentSegment.chunks.length;
13111309
// The children of the boundary segment is actually the fallback.
@@ -1358,9 +1356,12 @@ function renderSuspenseBoundary(
13581356
null,
13591357
];
13601358
trackedPostpones.workingMap.set(fallbackKeyPath,fallbackReplayNode);
1361-
// We are rendering the fallback before the boundary content so we keep track of
1362-
// the fallback replay node until we determine if the primary content suspends
1363-
newBoundary.trackedFallbackNode=fallbackReplayNode;
1359+
newBoundary.tracked={
1360+
contentKeyPath: keyPath,
1361+
// We are rendering the fallback before the boundary content so we keep track of
1362+
// the fallback replay node until we determine if the primary content suspends
1363+
fallbackNode: fallbackReplayNode,
1364+
};
13641365
}
13651366

13661367
task.blockedSegment=boundarySegment;
@@ -3793,14 +3794,21 @@ function trackPostponedBoundary(
37933794
// it before flushing and we know that we can't inline it.
37943795
boundary.rootSegmentID=request.nextSegmentId++;
37953796

3796-
constboundaryKeyPath=boundary.trackedContentKeyPath;
3797+
consttracked=boundary.tracked;
3798+
if(tracked===null){
3799+
thrownewError(
3800+
'It should not be possible to postpone at the root. This is a bug in React.',
3801+
);
3802+
}
3803+
3804+
constboundaryKeyPath=tracked.contentKeyPath;
37973805
if(boundaryKeyPath===null){
37983806
thrownewError(
37993807
'It should not be possible to postpone at the root. This is a bug in React.',
38003808
);
38013809
}
38023810

3803-
constfallbackReplayNode=boundary.trackedFallbackNode;
3811+
constfallbackReplayNode=tracked.fallbackNode;
38043812

38053813
constchildren: Array<ReplayNode> = [];
38063814
const boundaryNode: void | ReplayNode =
@@ -3853,7 +3861,11 @@ function trackPostpone(
38533861
trackedPostpones,
38543862
boundary,
38553863
);
3856-
if(boundary.trackedContentKeyPath===keyPath&&task.childIndex===-1){
3864+
if(
3865+
boundary.tracked!==null&&
3866+
boundary.tracked.contentKeyPath===keyPath&&
3867+
task.childIndex===-1
3868+
){
38573869
// Assign ID
38583870
if(segment.id===-1){
38593871
if(segment.parentFlushed){
@@ -3950,7 +3962,11 @@ function untrackBoundary(request: Request, boundary: SuspenseBoundary) {
39503962
if(trackedPostpones===null){
39513963
return;
39523964
}
3953-
constboundaryKeyPath=boundary.trackedContentKeyPath;
3965+
consttracked=boundary.tracked;
3966+
if(tracked===null){
3967+
return;
3968+
}
3969+
constboundaryKeyPath=tracked.contentKeyPath;
39543970
if(boundaryKeyPath===null){
39553971
return;
39563972
}

0 commit comments

Comments
 (0)
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Commit 1e986f5

Browse files
authored
[Fizz] Unify prerender only fields to save a field (#35067)
I need to regain a field because the SuspenseBoundary type is already at 16 fields in prod, after which it deopts v8. There are two fields that are only used in prerender to track postpones. These are ripe to be split into an optional object so that they only take up one field when they're not used.
1 parent 38bdda1 commit 1e986f5

1 file changed

Lines changed: 30 additions & 14 deletions

File tree

‎packages/react-server/src/ReactFizzServer.js‎

Lines changed: 30 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -257,8 +257,10 @@ type SuspenseBoundary = {
257257
fallbackState: HoistableState,
258258
contentPreamble: null|Preamble,
259259
fallbackPreamble: null|Preamble,
260-
trackedContentKeyPath: null|KeyNode,// used to track the path for replay nodes
261-
trackedFallbackNode: null|ReplayNode,// used to track the fallback for replay nodes
260+
tracked: null|{
261+
contentKeyPath: null|KeyNode,// used to track the path for replay nodes
262+
fallbackNode: null|ReplayNode,// used to track the fallback for replay nodes
263+
},
262264
errorDigest: ?string,// the error hash if it errors
263265
// DEV-only fields
264266
errorMessage?: null|string,// the error string if it errors
@@ -803,8 +805,7 @@ function createSuspenseBoundary(
803805
fallbackState: createHoistableState(),
804806
contentPreamble,
805807
fallbackPreamble,
806-
trackedContentKeyPath: null,
807-
trackedFallbackNode: null,
808+
tracked: null,
808809
};
809810
if(__DEV__){
810811
// DEV-only fields for hidden class
@@ -1303,9 +1304,6 @@ function renderSuspenseBoundary(
13031304
defer,
13041305
);
13051306
}
1306-
if(request.trackedPostpones!==null){
1307-
newBoundary.trackedContentKeyPath=keyPath;
1308-
}
13091307

13101308
constinsertionIndex=parentSegment.chunks.length;
13111309
// The children of the boundary segment is actually the fallback.
@@ -1358,9 +1356,12 @@ function renderSuspenseBoundary(
13581356
null,
13591357
];
13601358
trackedPostpones.workingMap.set(fallbackKeyPath,fallbackReplayNode);
1361-
// We are rendering the fallback before the boundary content so we keep track of
1362-
// the fallback replay node until we determine if the primary content suspends
1363-
newBoundary.trackedFallbackNode=fallbackReplayNode;
1359+
newBoundary.tracked={
1360+
contentKeyPath: keyPath,
1361+
// We are rendering the fallback before the boundary content so we keep track of
1362+
// the fallback replay node until we determine if the primary content suspends
1363+
fallbackNode: fallbackReplayNode,
1364+
};
13641365
}
13651366

13661367
task.blockedSegment=boundarySegment;
@@ -3793,14 +3794,21 @@ function trackPostponedBoundary(
37933794
// it before flushing and we know that we can't inline it.
37943795
boundary.rootSegmentID=request.nextSegmentId++;
37953796

3796-
constboundaryKeyPath=boundary.trackedContentKeyPath;
3797+
consttracked=boundary.tracked;
3798+
if(tracked===null){
3799+
thrownewError(
3800+
'It should not be possible to postpone at the root. This is a bug in React.',
3801+
);
3802+
}
3803+
3804+
constboundaryKeyPath=tracked.contentKeyPath;
37973805
if(boundaryKeyPath===null){
37983806
thrownewError(
37993807
'It should not be possible to postpone at the root. This is a bug in React.',
38003808
);
38013809
}
38023810

3803-
constfallbackReplayNode=boundary.trackedFallbackNode;
3811+
constfallbackReplayNode=tracked.fallbackNode;
38043812

38053813
constchildren: Array<ReplayNode> = [];
38063814
const boundaryNode: void | ReplayNode =
@@ -3853,7 +3861,11 @@ function trackPostpone(
38533861
trackedPostpones,
38543862
boundary,
38553863
);
3856-
if(boundary.trackedContentKeyPath===keyPath&&task.childIndex===-1){
3864+
if(
3865+
boundary.tracked!==null&&
3866+
boundary.tracked.contentKeyPath===keyPath&&
3867+
task.childIndex===-1
3868+
){
38573869
// Assign ID
38583870
if(segment.id===-1){
38593871
if(segment.parentFlushed){
@@ -3950,7 +3962,11 @@ function untrackBoundary(request: Request, boundary: SuspenseBoundary) {
39503962
if(trackedPostpones===null){
39513963
return;
39523964
}
3953-
constboundaryKeyPath=boundary.trackedContentKeyPath;
3965+
consttracked=boundary.tracked;
3966+
if(tracked===null){
3967+
return;
3968+
}
3969+
constboundaryKeyPath=tracked.contentKeyPath;
39543970
if(boundaryKeyPath===null){
39553971
return;
39563972
}

0 commit comments

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

Commit 1e986f5

Browse files
authored
[Fizz] Unify prerender only fields to save a field (#35067)
I need to regain a field because the SuspenseBoundary type is already at 16 fields in prod, after which it deopts v8. There are two fields that are only used in prerender to track postpones. These are ripe to be split into an optional object so that they only take up one field when they're not used.
1 parent 38bdda1 commit 1e986f5

1 file changed

Lines changed: 30 additions & 14 deletions

File tree

‎packages/react-server/src/ReactFizzServer.js‎

Lines changed: 30 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -257,8 +257,10 @@ type SuspenseBoundary = {
257257
fallbackState: HoistableState,
258258
contentPreamble: null|Preamble,
259259
fallbackPreamble: null|Preamble,
260-
trackedContentKeyPath: null|KeyNode,// used to track the path for replay nodes
261-
trackedFallbackNode: null|ReplayNode,// used to track the fallback for replay nodes
260+
tracked: null|{
261+
contentKeyPath: null|KeyNode,// used to track the path for replay nodes
262+
fallbackNode: null|ReplayNode,// used to track the fallback for replay nodes
263+
},
262264
errorDigest: ?string,// the error hash if it errors
263265
// DEV-only fields
264266
errorMessage?: null|string,// the error string if it errors
@@ -803,8 +805,7 @@ function createSuspenseBoundary(
803805
fallbackState: createHoistableState(),
804806
contentPreamble,
805807
fallbackPreamble,
806-
trackedContentKeyPath: null,
807-
trackedFallbackNode: null,
808+
tracked: null,
808809
};
809810
if(__DEV__){
810811
// DEV-only fields for hidden class
@@ -1303,9 +1304,6 @@ function renderSuspenseBoundary(
13031304
defer,
13041305
);
13051306
}
1306-
if(request.trackedPostpones!==null){
1307-
newBoundary.trackedContentKeyPath=keyPath;
1308-
}
13091307

13101308
constinsertionIndex=parentSegment.chunks.length;
13111309
// The children of the boundary segment is actually the fallback.
@@ -1358,9 +1356,12 @@ function renderSuspenseBoundary(
13581356
null,
13591357
];
13601358
trackedPostpones.workingMap.set(fallbackKeyPath,fallbackReplayNode);
1361-
// We are rendering the fallback before the boundary content so we keep track of
1362-
// the fallback replay node until we determine if the primary content suspends
1363-
newBoundary.trackedFallbackNode=fallbackReplayNode;
1359+
newBoundary.tracked={
1360+
contentKeyPath: keyPath,
1361+
// We are rendering the fallback before the boundary content so we keep track of
1362+
// the fallback replay node until we determine if the primary content suspends
1363+
fallbackNode: fallbackReplayNode,
1364+
};
13641365
}
13651366

13661367
task.blockedSegment=boundarySegment;
@@ -3793,14 +3794,21 @@ function trackPostponedBoundary(
37933794
// it before flushing and we know that we can't inline it.
37943795
boundary.rootSegmentID=request.nextSegmentId++;
37953796

3796-
constboundaryKeyPath=boundary.trackedContentKeyPath;
3797+
consttracked=boundary.tracked;
3798+
if(tracked===null){
3799+
thrownewError(
3800+
'It should not be possible to postpone at the root. This is a bug in React.',
3801+
);
3802+
}
3803+
3804+
constboundaryKeyPath=tracked.contentKeyPath;
37973805
if(boundaryKeyPath===null){
37983806
thrownewError(
37993807
'It should not be possible to postpone at the root. This is a bug in React.',
38003808
);
38013809
}
38023810

3803-
constfallbackReplayNode=boundary.trackedFallbackNode;
3811+
constfallbackReplayNode=tracked.fallbackNode;
38043812

38053813
constchildren: Array<ReplayNode> = [];
38063814
const boundaryNode: void | ReplayNode =
@@ -3853,7 +3861,11 @@ function trackPostpone(
38533861
trackedPostpones,
38543862
boundary,
38553863
);
3856-
if(boundary.trackedContentKeyPath===keyPath&&task.childIndex===-1){
3864+
if(
3865+
boundary.tracked!==null&&
3866+
boundary.tracked.contentKeyPath===keyPath&&
3867+
task.childIndex===-1
3868+
){
38573869
// Assign ID
38583870
if(segment.id===-1){
38593871
if(segment.parentFlushed){
@@ -3950,7 +3962,11 @@ function untrackBoundary(request: Request, boundary: SuspenseBoundary) {
39503962
if(trackedPostpones===null){
39513963
return;
39523964
}
3953-
constboundaryKeyPath=boundary.trackedContentKeyPath;
3965+
consttracked=boundary.tracked;
3966+
if(tracked===null){
3967+
return;
3968+
}
3969+
constboundaryKeyPath=tracked.contentKeyPath;
39543970
if(boundaryKeyPath===null){
39553971
return;
39563972
}

0 commit comments

Comments
 (0)
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Commit 1e986f5

Browse files
authored
[Fizz] Unify prerender only fields to save a field (#35067)
I need to regain a field because the SuspenseBoundary type is already at 16 fields in prod, after which it deopts v8. There are two fields that are only used in prerender to track postpones. These are ripe to be split into an optional object so that they only take up one field when they're not used.
1 parent 38bdda1 commit 1e986f5

1 file changed

Lines changed: 30 additions & 14 deletions

File tree

‎packages/react-server/src/ReactFizzServer.js‎

Lines changed: 30 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -257,8 +257,10 @@ type SuspenseBoundary = {
257257
fallbackState: HoistableState,
258258
contentPreamble: null|Preamble,
259259
fallbackPreamble: null|Preamble,
260-
trackedContentKeyPath: null|KeyNode,// used to track the path for replay nodes
261-
trackedFallbackNode: null|ReplayNode,// used to track the fallback for replay nodes
260+
tracked: null|{
261+
contentKeyPath: null|KeyNode,// used to track the path for replay nodes
262+
fallbackNode: null|ReplayNode,// used to track the fallback for replay nodes
263+
},
262264
errorDigest: ?string,// the error hash if it errors
263265
// DEV-only fields
264266
errorMessage?: null|string,// the error string if it errors
@@ -803,8 +805,7 @@ function createSuspenseBoundary(
803805
fallbackState: createHoistableState(),
804806
contentPreamble,
805807
fallbackPreamble,
806-
trackedContentKeyPath: null,
807-
trackedFallbackNode: null,
808+
tracked: null,
808809
};
809810
if(__DEV__){
810811
// DEV-only fields for hidden class
@@ -1303,9 +1304,6 @@ function renderSuspenseBoundary(
13031304
defer,
13041305
);
13051306
}
1306-
if(request.trackedPostpones!==null){
1307-
newBoundary.trackedContentKeyPath=keyPath;
1308-
}
13091307

13101308
constinsertionIndex=parentSegment.chunks.length;
13111309
// The children of the boundary segment is actually the fallback.
@@ -1358,9 +1356,12 @@ function renderSuspenseBoundary(
13581356
null,
13591357
];
13601358
trackedPostpones.workingMap.set(fallbackKeyPath,fallbackReplayNode);
1361-
// We are rendering the fallback before the boundary content so we keep track of
1362-
// the fallback replay node until we determine if the primary content suspends
1363-
newBoundary.trackedFallbackNode=fallbackReplayNode;
1359+
newBoundary.tracked={
1360+
contentKeyPath: keyPath,
1361+
// We are rendering the fallback before the boundary content so we keep track of
1362+
// the fallback replay node until we determine if the primary content suspends
1363+
fallbackNode: fallbackReplayNode,
1364+
};
13641365
}
13651366

13661367
task.blockedSegment=boundarySegment;
@@ -3793,14 +3794,21 @@ function trackPostponedBoundary(
37933794
// it before flushing and we know that we can't inline it.
37943795
boundary.rootSegmentID=request.nextSegmentId++;
37953796

3796-
constboundaryKeyPath=boundary.trackedContentKeyPath;
3797+
consttracked=boundary.tracked;
3798+
if(tracked===null){
3799+
thrownewError(
3800+
'It should not be possible to postpone at the root. This is a bug in React.',
3801+
);
3802+
}
3803+
3804+
constboundaryKeyPath=tracked.contentKeyPath;
37973805
if(boundaryKeyPath===null){
37983806
thrownewError(
37993807
'It should not be possible to postpone at the root. This is a bug in React.',
38003808
);
38013809
}
38023810

3803-
constfallbackReplayNode=boundary.trackedFallbackNode;
3811+
constfallbackReplayNode=tracked.fallbackNode;
38043812

38053813
constchildren: Array<ReplayNode> = [];
38063814
const boundaryNode: void | ReplayNode =
@@ -3853,7 +3861,11 @@ function trackPostpone(
38533861
trackedPostpones,
38543862
boundary,
38553863
);
3856-
if(boundary.trackedContentKeyPath===keyPath&&task.childIndex===-1){
3864+
if(
3865+
boundary.tracked!==null&&
3866+
boundary.tracked.contentKeyPath===keyPath&&
3867+
task.childIndex===-1
3868+
){
38573869
// Assign ID
38583870
if(segment.id===-1){
38593871
if(segment.parentFlushed){
@@ -3950,7 +3962,11 @@ function untrackBoundary(request: Request, boundary: SuspenseBoundary) {
39503962
if(trackedPostpones===null){
39513963
return;
39523964
}
3953-
constboundaryKeyPath=boundary.trackedContentKeyPath;
3965+
consttracked=boundary.tracked;
3966+
if(tracked===null){
3967+
return;
3968+
}
3969+
constboundaryKeyPath=tracked.contentKeyPath;
39543970
if(boundaryKeyPath===null){
39553971
return;
39563972
}

0 commit comments

Comments
 (0)
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Commit 1e986f5

Browse files
authored
[Fizz] Unify prerender only fields to save a field (#35067)
I need to regain a field because the SuspenseBoundary type is already at 16 fields in prod, after which it deopts v8. There are two fields that are only used in prerender to track postpones. These are ripe to be split into an optional object so that they only take up one field when they're not used.
1 parent 38bdda1 commit 1e986f5

1 file changed

Lines changed: 30 additions & 14 deletions

File tree

‎packages/react-server/src/ReactFizzServer.js‎

Lines changed: 30 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -257,8 +257,10 @@ type SuspenseBoundary = {
257257
fallbackState: HoistableState,
258258
contentPreamble: null|Preamble,
259259
fallbackPreamble: null|Preamble,
260-
trackedContentKeyPath: null|KeyNode,// used to track the path for replay nodes
261-
trackedFallbackNode: null|ReplayNode,// used to track the fallback for replay nodes
260+
tracked: null|{
261+
contentKeyPath: null|KeyNode,// used to track the path for replay nodes
262+
fallbackNode: null|ReplayNode,// used to track the fallback for replay nodes
263+
},
262264
errorDigest: ?string,// the error hash if it errors
263265
// DEV-only fields
264266
errorMessage?: null|string,// the error string if it errors
@@ -803,8 +805,7 @@ function createSuspenseBoundary(
803805
fallbackState: createHoistableState(),
804806
contentPreamble,
805807
fallbackPreamble,
806-
trackedContentKeyPath: null,
807-
trackedFallbackNode: null,
808+
tracked: null,
808809
};
809810
if(__DEV__){
810811
// DEV-only fields for hidden class
@@ -1303,9 +1304,6 @@ function renderSuspenseBoundary(
13031304
defer,
13041305
);
13051306
}
1306-
if(request.trackedPostpones!==null){
1307-
newBoundary.trackedContentKeyPath=keyPath;
1308-
}
13091307

13101308
constinsertionIndex=parentSegment.chunks.length;
13111309
// The children of the boundary segment is actually the fallback.
@@ -1358,9 +1356,12 @@ function renderSuspenseBoundary(
13581356
null,
13591357
];
13601358
trackedPostpones.workingMap.set(fallbackKeyPath,fallbackReplayNode);
1361-
// We are rendering the fallback before the boundary content so we keep track of
1362-
// the fallback replay node until we determine if the primary content suspends
1363-
newBoundary.trackedFallbackNode=fallbackReplayNode;
1359+
newBoundary.tracked={
1360+
contentKeyPath: keyPath,
1361+
// We are rendering the fallback before the boundary content so we keep track of
1362+
// the fallback replay node until we determine if the primary content suspends
1363+
fallbackNode: fallbackReplayNode,
1364+
};
13641365
}
13651366

13661367
task.blockedSegment=boundarySegment;
@@ -3793,14 +3794,21 @@ function trackPostponedBoundary(
37933794
// it before flushing and we know that we can't inline it.
37943795
boundary.rootSegmentID=request.nextSegmentId++;
37953796

3796-
constboundaryKeyPath=boundary.trackedContentKeyPath;
3797+
consttracked=boundary.tracked;
3798+
if(tracked===null){
3799+
thrownewError(
3800+
'It should not be possible to postpone at the root. This is a bug in React.',
3801+
);
3802+
}
3803+
3804+
constboundaryKeyPath=tracked.contentKeyPath;
37973805
if(boundaryKeyPath===null){
37983806
thrownewError(
37993807
'It should not be possible to postpone at the root. This is a bug in React.',
38003808
);
38013809
}
38023810

3803-
constfallbackReplayNode=boundary.trackedFallbackNode;
3811+
constfallbackReplayNode=tracked.fallbackNode;
38043812

38053813
constchildren: Array<ReplayNode> = [];
38063814
const boundaryNode: void | ReplayNode =
@@ -3853,7 +3861,11 @@ function trackPostpone(
38533861
trackedPostpones,
38543862
boundary,
38553863
);
3856-
if(boundary.trackedContentKeyPath===keyPath&&task.childIndex===-1){
3864+
if(
3865+
boundary.tracked!==null&&
3866+
boundary.tracked.contentKeyPath===keyPath&&
3867+
task.childIndex===-1
3868+
){
38573869
// Assign ID
38583870
if(segment.id===-1){
38593871
if(segment.parentFlushed){
@@ -3950,7 +3962,11 @@ function untrackBoundary(request: Request, boundary: SuspenseBoundary) {
39503962
if(trackedPostpones===null){
39513963
return;
39523964
}
3953-
constboundaryKeyPath=boundary.trackedContentKeyPath;
3965+
consttracked=boundary.tracked;
3966+
if(tracked===null){
3967+
return;
3968+
}
3969+
constboundaryKeyPath=tracked.contentKeyPath;
39543970
if(boundaryKeyPath===null){
39553971
return;
39563972
}

0 commit comments

Comments
 (0)
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Commit 1e986f5

Browse files
authored
[Fizz] Unify prerender only fields to save a field (#35067)
I need to regain a field because the SuspenseBoundary type is already at 16 fields in prod, after which it deopts v8. There are two fields that are only used in prerender to track postpones. These are ripe to be split into an optional object so that they only take up one field when they're not used.
1 parent 38bdda1 commit 1e986f5

1 file changed

Lines changed: 30 additions & 14 deletions

File tree

‎packages/react-server/src/ReactFizzServer.js‎

Lines changed: 30 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -257,8 +257,10 @@ type SuspenseBoundary = {
257257
fallbackState: HoistableState,
258258
contentPreamble: null|Preamble,
259259
fallbackPreamble: null|Preamble,
260-
trackedContentKeyPath: null|KeyNode,// used to track the path for replay nodes
261-
trackedFallbackNode: null|ReplayNode,// used to track the fallback for replay nodes
260+
tracked: null|{
261+
contentKeyPath: null|KeyNode,// used to track the path for replay nodes
262+
fallbackNode: null|ReplayNode,// used to track the fallback for replay nodes
263+
},
262264
errorDigest: ?string,// the error hash if it errors
263265
// DEV-only fields
264266
errorMessage?: null|string,// the error string if it errors
@@ -803,8 +805,7 @@ function createSuspenseBoundary(
803805
fallbackState: createHoistableState(),
804806
contentPreamble,
805807
fallbackPreamble,
806-
trackedContentKeyPath: null,
807-
trackedFallbackNode: null,
808+
tracked: null,
808809
};
809810
if(__DEV__){
810811
// DEV-only fields for hidden class
@@ -1303,9 +1304,6 @@ function renderSuspenseBoundary(
13031304
defer,
13041305
);
13051306
}
1306-
if(request.trackedPostpones!==null){
1307-
newBoundary.trackedContentKeyPath=keyPath;
1308-
}
13091307

13101308
constinsertionIndex=parentSegment.chunks.length;
13111309
// The children of the boundary segment is actually the fallback.
@@ -1358,9 +1356,12 @@ function renderSuspenseBoundary(
13581356
null,
13591357
];
13601358
trackedPostpones.workingMap.set(fallbackKeyPath,fallbackReplayNode);
1361-
// We are rendering the fallback before the boundary content so we keep track of
1362-
// the fallback replay node until we determine if the primary content suspends
1363-
newBoundary.trackedFallbackNode=fallbackReplayNode;
1359+
newBoundary.tracked={
1360+
contentKeyPath: keyPath,
1361+
// We are rendering the fallback before the boundary content so we keep track of
1362+
// the fallback replay node until we determine if the primary content suspends
1363+
fallbackNode: fallbackReplayNode,
1364+
};
13641365
}
13651366

13661367
task.blockedSegment=boundarySegment;
@@ -3793,14 +3794,21 @@ function trackPostponedBoundary(
37933794
// it before flushing and we know that we can't inline it.
37943795
boundary.rootSegmentID=request.nextSegmentId++;
37953796

3796-
constboundaryKeyPath=boundary.trackedContentKeyPath;
3797+
consttracked=boundary.tracked;
3798+
if(tracked===null){
3799+
thrownewError(
3800+
'It should not be possible to postpone at the root. This is a bug in React.',
3801+
);
3802+
}
3803+
3804+
constboundaryKeyPath=tracked.contentKeyPath;
37973805
if(boundaryKeyPath===null){
37983806
thrownewError(
37993807
'It should not be possible to postpone at the root. This is a bug in React.',
38003808
);
38013809
}
38023810

3803-
constfallbackReplayNode=boundary.trackedFallbackNode;
3811+
constfallbackReplayNode=tracked.fallbackNode;
38043812

38053813
constchildren: Array<ReplayNode> = [];
38063814
const boundaryNode: void | ReplayNode =
@@ -3853,7 +3861,11 @@ function trackPostpone(
38533861
trackedPostpones,
38543862
boundary,
38553863
);
3856-
if(boundary.trackedContentKeyPath===keyPath&&task.childIndex===-1){
3864+
if(
3865+
boundary.tracked!==null&&
3866+
boundary.tracked.contentKeyPath===keyPath&&
3867+
task.childIndex===-1
3868+
){
38573869
// Assign ID
38583870
if(segment.id===-1){
38593871
if(segment.parentFlushed){
@@ -3950,7 +3962,11 @@ function untrackBoundary(request: Request, boundary: SuspenseBoundary) {
39503962
if(trackedPostpones===null){
39513963
return;
39523964
}
3953-
constboundaryKeyPath=boundary.trackedContentKeyPath;
3965+
consttracked=boundary.tracked;
3966+
if(tracked===null){
3967+
return;
3968+
}
3969+
constboundaryKeyPath=tracked.contentKeyPath;
39543970
if(boundaryKeyPath===null){
39553971
return;
39563972
}

0 commit comments

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

Commit 1e986f5

Browse files
authored
[Fizz] Unify prerender only fields to save a field (#35067)
I need to regain a field because the SuspenseBoundary type is already at 16 fields in prod, after which it deopts v8. There are two fields that are only used in prerender to track postpones. These are ripe to be split into an optional object so that they only take up one field when they're not used.
1 parent 38bdda1 commit 1e986f5

1 file changed

Lines changed: 30 additions & 14 deletions

File tree

‎packages/react-server/src/ReactFizzServer.js‎

Lines changed: 30 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -257,8 +257,10 @@ type SuspenseBoundary = {
257257
fallbackState: HoistableState,
258258
contentPreamble: null|Preamble,
259259
fallbackPreamble: null|Preamble,
260-
trackedContentKeyPath: null|KeyNode,// used to track the path for replay nodes
261-
trackedFallbackNode: null|ReplayNode,// used to track the fallback for replay nodes
260+
tracked: null|{
261+
contentKeyPath: null|KeyNode,// used to track the path for replay nodes
262+
fallbackNode: null|ReplayNode,// used to track the fallback for replay nodes
263+
},
262264
errorDigest: ?string,// the error hash if it errors
263265
// DEV-only fields
264266
errorMessage?: null|string,// the error string if it errors
@@ -803,8 +805,7 @@ function createSuspenseBoundary(
803805
fallbackState: createHoistableState(),
804806
contentPreamble,
805807
fallbackPreamble,
806-
trackedContentKeyPath: null,
807-
trackedFallbackNode: null,
808+
tracked: null,
808809
};
809810
if(__DEV__){
810811
// DEV-only fields for hidden class
@@ -1303,9 +1304,6 @@ function renderSuspenseBoundary(
13031304
defer,
13041305
);
13051306
}
1306-
if(request.trackedPostpones!==null){
1307-
newBoundary.trackedContentKeyPath=keyPath;
1308-
}
13091307

13101308
constinsertionIndex=parentSegment.chunks.length;
13111309
// The children of the boundary segment is actually the fallback.
@@ -1358,9 +1356,12 @@ function renderSuspenseBoundary(
13581356
null,
13591357
];
13601358
trackedPostpones.workingMap.set(fallbackKeyPath,fallbackReplayNode);
1361-
// We are rendering the fallback before the boundary content so we keep track of
1362-
// the fallback replay node until we determine if the primary content suspends
1363-
newBoundary.trackedFallbackNode=fallbackReplayNode;
1359+
newBoundary.tracked={
1360+
contentKeyPath: keyPath,
1361+
// We are rendering the fallback before the boundary content so we keep track of
1362+
// the fallback replay node until we determine if the primary content suspends
1363+
fallbackNode: fallbackReplayNode,
1364+
};
13641365
}
13651366

13661367
task.blockedSegment=boundarySegment;
@@ -3793,14 +3794,21 @@ function trackPostponedBoundary(
37933794
// it before flushing and we know that we can't inline it.
37943795
boundary.rootSegmentID=request.nextSegmentId++;
37953796

3796-
constboundaryKeyPath=boundary.trackedContentKeyPath;
3797+
consttracked=boundary.tracked;
3798+
if(tracked===null){
3799+
thrownewError(
3800+
'It should not be possible to postpone at the root. This is a bug in React.',
3801+
);
3802+
}
3803+
3804+
constboundaryKeyPath=tracked.contentKeyPath;
37973805
if(boundaryKeyPath===null){
37983806
thrownewError(
37993807
'It should not be possible to postpone at the root. This is a bug in React.',
38003808
);
38013809
}
38023810

3803-
constfallbackReplayNode=boundary.trackedFallbackNode;
3811+
constfallbackReplayNode=tracked.fallbackNode;
38043812

38053813
constchildren: Array<ReplayNode> = [];
38063814
const boundaryNode: void | ReplayNode =
@@ -3853,7 +3861,11 @@ function trackPostpone(
38533861
trackedPostpones,
38543862
boundary,
38553863
);
3856-
if(boundary.trackedContentKeyPath===keyPath&&task.childIndex===-1){
3864+
if(
3865+
boundary.tracked!==null&&
3866+
boundary.tracked.contentKeyPath===keyPath&&
3867+
task.childIndex===-1
3868+
){
38573869
// Assign ID
38583870
if(segment.id===-1){
38593871
if(segment.parentFlushed){
@@ -3950,7 +3962,11 @@ function untrackBoundary(request: Request, boundary: SuspenseBoundary) {
39503962
if(trackedPostpones===null){
39513963
return;
39523964
}
3953-
constboundaryKeyPath=boundary.trackedContentKeyPath;
3965+
consttracked=boundary.tracked;
3966+
if(tracked===null){
3967+
return;
3968+
}
3969+
constboundaryKeyPath=tracked.contentKeyPath;
39543970
if(boundaryKeyPath===null){
39553971
return;
39563972
}

0 commit comments

Comments
 (0)