From 64b2210acfd600f3af2a604cf7e2bb36227c98b3 Mon Sep 17 00:00:00 2001 From: Rick Hanlon Date: Wed, 21 Feb 2024 15:43:16 -0500 Subject: [PATCH 1/5] s/getRootNode/ownerDocument --- .../react-dom-bindings/src/events/ReactDOMEventReplaying.js | 2 +- .../ReactDOMFizzInstructionSetInlineCodeStrings.js | 2 +- .../fizz-instruction-set/ReactDOMFizzInstructionSetShared.js | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/react-dom-bindings/src/events/ReactDOMEventReplaying.js b/packages/react-dom-bindings/src/events/ReactDOMEventReplaying.js index a7846ab455214..3567fe708983c 100644 --- a/packages/react-dom-bindings/src/events/ReactDOMEventReplaying.js +++ b/packages/react-dom-bindings/src/events/ReactDOMEventReplaying.js @@ -537,7 +537,7 @@ export function retryIfBlockedOn( if (enableFormActions) { // Check the document if there are any queued form actions. - const root = unblocked.getRootNode(); + const root = unblocked.ownerDocument; const formReplayingQueue: void | FormReplayingQueue = (root: any) .$$reactFormReplay; if (formReplayingQueue != null) { diff --git a/packages/react-dom-bindings/src/server/fizz-instruction-set/ReactDOMFizzInstructionSetInlineCodeStrings.js b/packages/react-dom-bindings/src/server/fizz-instruction-set/ReactDOMFizzInstructionSetInlineCodeStrings.js index d7195d43ca063..43c21a54ed5e1 100644 --- a/packages/react-dom-bindings/src/server/fizz-instruction-set/ReactDOMFizzInstructionSetInlineCodeStrings.js +++ b/packages/react-dom-bindings/src/server/fizz-instruction-set/ReactDOMFizzInstructionSetInlineCodeStrings.js @@ -10,4 +10,4 @@ export const completeBoundaryWithStyles = export const completeSegment = '$RS=function(a,b){a=document.getElementById(a);b=document.getElementById(b);for(a.parentNode.removeChild(a);a.firstChild;)b.parentNode.insertBefore(a.firstChild,b);b.parentNode.removeChild(b)};'; export const formReplaying = - 'addEventListener("submit",function(a){if(!a.defaultPrevented){var c=a.target,d=a.submitter,e=c.action,b=d;if(d){var f=d.getAttribute("formAction");null!=f&&(e=f,b=null)}"javascript:throw new Error(\'A React form was unexpectedly submitted.\')"===e&&(a.preventDefault(),b?(a=document.createElement("input"),a.name=b.name,a.value=b.value,b.parentNode.insertBefore(a,b),b=new FormData(c),a.parentNode.removeChild(a)):b=new FormData(c),a=c.getRootNode(),(a.$$reactFormReplay=a.$$reactFormReplay||[]).push(c,\nd,b))}});'; + 'addEventListener("submit",function(a){if(!a.defaultPrevented){var c=a.target,d=a.submitter,e=c.action,b=d;if(d){var f=d.getAttribute("formAction");null!=f&&(e=f,b=null)}"javascript:throw new Error(\'A React form was unexpectedly submitted.\')"===e&&(a.preventDefault(),b?(a=document.createElement("input"),a.name=b.name,a.value=b.value,b.parentNode.insertBefore(a,b),b=new FormData(c),a.parentNode.removeChild(a)):b=new FormData(c),a=c.ownerDocument,(a.$$reactFormReplay=a.$$reactFormReplay||[]).push(c,\nd,b))}});'; diff --git a/packages/react-dom-bindings/src/server/fizz-instruction-set/ReactDOMFizzInstructionSetShared.js b/packages/react-dom-bindings/src/server/fizz-instruction-set/ReactDOMFizzInstructionSetShared.js index 4d826753dc097..09bd265de0751 100644 --- a/packages/react-dom-bindings/src/server/fizz-instruction-set/ReactDOMFizzInstructionSetShared.js +++ b/packages/react-dom-bindings/src/server/fizz-instruction-set/ReactDOMFizzInstructionSetShared.js @@ -198,7 +198,7 @@ export function listenToFormSubmissionsForReplaying() { // where we preserve sequencing and where we'll pick it up from during hydration. // In practice, this is just the same as document but we might support shadow trees // in the future. - const root = form.getRootNode(); + const root = form.ownerDocument; (root['$$reactFormReplay'] = root['$$reactFormReplay'] || []).push( form, submitter, From cdf0c6b42592f4da69e9da9888adfc93d4dc11be Mon Sep 17 00:00:00 2001 From: Rick Hanlon Date: Thu, 22 Feb 2024 10:19:11 -0500 Subject: [PATCH 2/5] use document --- .../react-dom-bindings/src/events/ReactDOMEventReplaying.js | 2 +- .../ReactDOMFizzInstructionSetInlineCodeStrings.js | 2 +- .../fizz-instruction-set/ReactDOMFizzInstructionSetShared.js | 4 +--- 3 files changed, 3 insertions(+), 5 deletions(-) diff --git a/packages/react-dom-bindings/src/events/ReactDOMEventReplaying.js b/packages/react-dom-bindings/src/events/ReactDOMEventReplaying.js index 3567fe708983c..5fa920a13f0fa 100644 --- a/packages/react-dom-bindings/src/events/ReactDOMEventReplaying.js +++ b/packages/react-dom-bindings/src/events/ReactDOMEventReplaying.js @@ -537,7 +537,7 @@ export function retryIfBlockedOn( if (enableFormActions) { // Check the document if there are any queued form actions. - const root = unblocked.ownerDocument; + const root = unblocked === document ? unblocked : unblocked.ownerDocument; const formReplayingQueue: void | FormReplayingQueue = (root: any) .$$reactFormReplay; if (formReplayingQueue != null) { diff --git a/packages/react-dom-bindings/src/server/fizz-instruction-set/ReactDOMFizzInstructionSetInlineCodeStrings.js b/packages/react-dom-bindings/src/server/fizz-instruction-set/ReactDOMFizzInstructionSetInlineCodeStrings.js index 43c21a54ed5e1..c52ae5a3e34d9 100644 --- a/packages/react-dom-bindings/src/server/fizz-instruction-set/ReactDOMFizzInstructionSetInlineCodeStrings.js +++ b/packages/react-dom-bindings/src/server/fizz-instruction-set/ReactDOMFizzInstructionSetInlineCodeStrings.js @@ -10,4 +10,4 @@ export const completeBoundaryWithStyles = export const completeSegment = '$RS=function(a,b){a=document.getElementById(a);b=document.getElementById(b);for(a.parentNode.removeChild(a);a.firstChild;)b.parentNode.insertBefore(a.firstChild,b);b.parentNode.removeChild(b)};'; export const formReplaying = - 'addEventListener("submit",function(a){if(!a.defaultPrevented){var c=a.target,d=a.submitter,e=c.action,b=d;if(d){var f=d.getAttribute("formAction");null!=f&&(e=f,b=null)}"javascript:throw new Error(\'A React form was unexpectedly submitted.\')"===e&&(a.preventDefault(),b?(a=document.createElement("input"),a.name=b.name,a.value=b.value,b.parentNode.insertBefore(a,b),b=new FormData(c),a.parentNode.removeChild(a)):b=new FormData(c),a=c.ownerDocument,(a.$$reactFormReplay=a.$$reactFormReplay||[]).push(c,\nd,b))}});'; + 'addEventListener("submit",function(a){if(!a.defaultPrevented){var c=a.target,d=a.submitter,e=c.action,b=d;if(d){var f=d.getAttribute("formAction");null!=f&&(e=f,b=null)}"javascript:throw new Error(\'A React form was unexpectedly submitted.\')"===e&&(a.preventDefault(),b?(a=document.createElement("input"),a.name=b.name,a.value=b.value,b.parentNode.insertBefore(a,b),b=new FormData(c),a.parentNode.removeChild(a)):b=new FormData(c),a=c===document?c:c.ownerDocument,(a.$$reactFormReplay=a.$$reactFormReplay||\n[]).push(c,d,b))}});'; diff --git a/packages/react-dom-bindings/src/server/fizz-instruction-set/ReactDOMFizzInstructionSetShared.js b/packages/react-dom-bindings/src/server/fizz-instruction-set/ReactDOMFizzInstructionSetShared.js index 09bd265de0751..73d1ccfd8ce4b 100644 --- a/packages/react-dom-bindings/src/server/fizz-instruction-set/ReactDOMFizzInstructionSetShared.js +++ b/packages/react-dom-bindings/src/server/fizz-instruction-set/ReactDOMFizzInstructionSetShared.js @@ -196,9 +196,7 @@ export function listenToFormSubmissionsForReplaying() { // javascript: URL placeholder value. So we might not be the first to declare it. // We attach it to the form's root node, which is the shared environment context // where we preserve sequencing and where we'll pick it up from during hydration. - // In practice, this is just the same as document but we might support shadow trees - // in the future. - const root = form.ownerDocument; + const root = form === document ? form : form.ownerDocument; (root['$$reactFormReplay'] = root['$$reactFormReplay'] || []).push( form, submitter, From fab27028a98ca2fd78e1ffb175f5bd65ded06baa Mon Sep 17 00:00:00 2001 From: Ricky Hanlon Date: Thu, 22 Feb 2024 10:47:57 -0500 Subject: [PATCH 3/5] unblocked may not === document --- .../react-dom-bindings/src/events/ReactDOMEventReplaying.js | 3 ++- .../ReactDOMFizzInstructionSetInlineCodeStrings.js | 2 +- .../fizz-instruction-set/ReactDOMFizzInstructionSetShared.js | 3 ++- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/packages/react-dom-bindings/src/events/ReactDOMEventReplaying.js b/packages/react-dom-bindings/src/events/ReactDOMEventReplaying.js index 5fa920a13f0fa..59c2920778008 100644 --- a/packages/react-dom-bindings/src/events/ReactDOMEventReplaying.js +++ b/packages/react-dom-bindings/src/events/ReactDOMEventReplaying.js @@ -537,7 +537,8 @@ export function retryIfBlockedOn( if (enableFormActions) { // Check the document if there are any queued form actions. - const root = unblocked === document ? unblocked : unblocked.ownerDocument; + // If there's no ownerDocument, then this is the document. + const root = unblocked.ownerDocument || unblocked; const formReplayingQueue: void | FormReplayingQueue = (root: any) .$$reactFormReplay; if (formReplayingQueue != null) { diff --git a/packages/react-dom-bindings/src/server/fizz-instruction-set/ReactDOMFizzInstructionSetInlineCodeStrings.js b/packages/react-dom-bindings/src/server/fizz-instruction-set/ReactDOMFizzInstructionSetInlineCodeStrings.js index c52ae5a3e34d9..44b624c736297 100644 --- a/packages/react-dom-bindings/src/server/fizz-instruction-set/ReactDOMFizzInstructionSetInlineCodeStrings.js +++ b/packages/react-dom-bindings/src/server/fizz-instruction-set/ReactDOMFizzInstructionSetInlineCodeStrings.js @@ -10,4 +10,4 @@ export const completeBoundaryWithStyles = export const completeSegment = '$RS=function(a,b){a=document.getElementById(a);b=document.getElementById(b);for(a.parentNode.removeChild(a);a.firstChild;)b.parentNode.insertBefore(a.firstChild,b);b.parentNode.removeChild(b)};'; export const formReplaying = - 'addEventListener("submit",function(a){if(!a.defaultPrevented){var c=a.target,d=a.submitter,e=c.action,b=d;if(d){var f=d.getAttribute("formAction");null!=f&&(e=f,b=null)}"javascript:throw new Error(\'A React form was unexpectedly submitted.\')"===e&&(a.preventDefault(),b?(a=document.createElement("input"),a.name=b.name,a.value=b.value,b.parentNode.insertBefore(a,b),b=new FormData(c),a.parentNode.removeChild(a)):b=new FormData(c),a=c===document?c:c.ownerDocument,(a.$$reactFormReplay=a.$$reactFormReplay||\n[]).push(c,d,b))}});'; + 'addEventListener("submit",function(a){if(!a.defaultPrevented){var c=a.target,d=a.submitter,e=c.action,b=d;if(d){var f=d.getAttribute("formAction");null!=f&&(e=f,b=null)}"javascript:throw new Error(\'A React form was unexpectedly submitted.\')"===e&&(a.preventDefault(),b?(a=document.createElement("input"),a.name=b.name,a.value=b.value,b.parentNode.insertBefore(a,b),b=new FormData(c),a.parentNode.removeChild(a)):b=new FormData(c),a=c.ownerDocument||c,(a.$$reactFormReplay=a.$$reactFormReplay||[]).push(c,\nd,b))}});'; diff --git a/packages/react-dom-bindings/src/server/fizz-instruction-set/ReactDOMFizzInstructionSetShared.js b/packages/react-dom-bindings/src/server/fizz-instruction-set/ReactDOMFizzInstructionSetShared.js index 73d1ccfd8ce4b..89f6c3cafe7ed 100644 --- a/packages/react-dom-bindings/src/server/fizz-instruction-set/ReactDOMFizzInstructionSetShared.js +++ b/packages/react-dom-bindings/src/server/fizz-instruction-set/ReactDOMFizzInstructionSetShared.js @@ -196,7 +196,8 @@ export function listenToFormSubmissionsForReplaying() { // javascript: URL placeholder value. So we might not be the first to declare it. // We attach it to the form's root node, which is the shared environment context // where we preserve sequencing and where we'll pick it up from during hydration. - const root = form === document ? form : form.ownerDocument; + // If there's no ownerDocument, then this is the document. + const root = form.ownerDocument || form; (root['$$reactFormReplay'] = root['$$reactFormReplay'] || []).push( form, submitter, From a7e3cdf8e6b5fdca00b0bff6a81944e4c098795a Mon Sep 17 00:00:00 2001 From: Ricky Hanlon Date: Thu, 22 Feb 2024 13:03:56 -0500 Subject: [PATCH 4/5] Compress error message --- .../ReactDOMFizzInstructionSetInlineCodeStrings.js | 2 +- .../fizz-instruction-set/ReactDOMFizzInstructionSetShared.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/react-dom-bindings/src/server/fizz-instruction-set/ReactDOMFizzInstructionSetInlineCodeStrings.js b/packages/react-dom-bindings/src/server/fizz-instruction-set/ReactDOMFizzInstructionSetInlineCodeStrings.js index 44b624c736297..042cfb23fefcd 100644 --- a/packages/react-dom-bindings/src/server/fizz-instruction-set/ReactDOMFizzInstructionSetInlineCodeStrings.js +++ b/packages/react-dom-bindings/src/server/fizz-instruction-set/ReactDOMFizzInstructionSetInlineCodeStrings.js @@ -10,4 +10,4 @@ export const completeBoundaryWithStyles = export const completeSegment = '$RS=function(a,b){a=document.getElementById(a);b=document.getElementById(b);for(a.parentNode.removeChild(a);a.firstChild;)b.parentNode.insertBefore(a.firstChild,b);b.parentNode.removeChild(b)};'; export const formReplaying = - 'addEventListener("submit",function(a){if(!a.defaultPrevented){var c=a.target,d=a.submitter,e=c.action,b=d;if(d){var f=d.getAttribute("formAction");null!=f&&(e=f,b=null)}"javascript:throw new Error(\'A React form was unexpectedly submitted.\')"===e&&(a.preventDefault(),b?(a=document.createElement("input"),a.name=b.name,a.value=b.value,b.parentNode.insertBefore(a,b),b=new FormData(c),a.parentNode.removeChild(a)):b=new FormData(c),a=c.ownerDocument||c,(a.$$reactFormReplay=a.$$reactFormReplay||[]).push(c,\nd,b))}});'; + 'addEventListener("submit",function(a){if(!a.defaultPrevented){var c=a.target,d=a.submitter,e=c.action,b=d;if(d){var f=d.getAttribute("formAction");null!=f&&(e=f,b=null)}"javascript:throw new Error(\'React form unexpectedly submitted.\')"===e&&(a.preventDefault(),b?(a=document.createElement("input"),a.name=b.name,a.value=b.value,b.parentNode.insertBefore(a,b),b=new FormData(c),a.parentNode.removeChild(a)):b=new FormData(c),a=c.ownerDocument||c,(a.$$reactFormReplay=a.$$reactFormReplay||[]).push(c,d,b))}});'; diff --git a/packages/react-dom-bindings/src/server/fizz-instruction-set/ReactDOMFizzInstructionSetShared.js b/packages/react-dom-bindings/src/server/fizz-instruction-set/ReactDOMFizzInstructionSetShared.js index 89f6c3cafe7ed..a41c7d6f362ff 100644 --- a/packages/react-dom-bindings/src/server/fizz-instruction-set/ReactDOMFizzInstructionSetShared.js +++ b/packages/react-dom-bindings/src/server/fizz-instruction-set/ReactDOMFizzInstructionSetShared.js @@ -131,7 +131,7 @@ export function completeSegment(containerID, placeholderID) { // as a shared module for that reason. const EXPECTED_FORM_ACTION_URL = // eslint-disable-next-line no-script-url - "javascript:throw new Error('A React form was unexpectedly submitted.')"; + "javascript:throw new Error('React form unexpectedly submitted.')"; export function listenToFormSubmissionsForReplaying() { // A global replay queue ensures actions are replayed in order. From f4e3c836458f06ecf9a69b04d4501b9b42870254 Mon Sep 17 00:00:00 2001 From: Ricky Hanlon Date: Thu, 22 Feb 2024 13:52:57 -0500 Subject: [PATCH 5/5] Fix other strings --- packages/react-dom-bindings/src/client/ReactDOMComponent.js | 2 +- packages/react-dom-bindings/src/server/ReactFizzConfigDOM.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/react-dom-bindings/src/client/ReactDOMComponent.js b/packages/react-dom-bindings/src/client/ReactDOMComponent.js index 46bdd05f627d6..cc773dea4de36 100644 --- a/packages/react-dom-bindings/src/client/ReactDOMComponent.js +++ b/packages/react-dom-bindings/src/client/ReactDOMComponent.js @@ -2273,7 +2273,7 @@ function diffHydratedCustomComponent( // as a shared module for that reason. const EXPECTED_FORM_ACTION_URL = // eslint-disable-next-line no-script-url - "javascript:throw new Error('A React form was unexpectedly submitted.')"; + "javascript:throw new Error('React form unexpectedly submitted.')"; function diffHydratedGenericElement( domElement: Element, diff --git a/packages/react-dom-bindings/src/server/ReactFizzConfigDOM.js b/packages/react-dom-bindings/src/server/ReactFizzConfigDOM.js index 388491a79fd38..411e81180d9cf 100644 --- a/packages/react-dom-bindings/src/server/ReactFizzConfigDOM.js +++ b/packages/react-dom-bindings/src/server/ReactFizzConfigDOM.js @@ -1015,7 +1015,7 @@ function makeFormFieldPrefix(resumableState: ResumableState): string { const actionJavaScriptURL = stringToPrecomputedChunk( escapeTextForBrowser( // eslint-disable-next-line no-script-url - "javascript:throw new Error('A React form was unexpectedly submitted.')", + "javascript:throw new Error('React form unexpectedly submitted.')", ), );