diff --git a/components/script/dom/html/htmlformelement.rs b/components/script/dom/html/htmlformelement.rs index 00234979ef1..2ca6cb5cec7 100644 --- a/components/script/dom/html/htmlformelement.rs +++ b/components/script/dom/html/htmlformelement.rs @@ -877,16 +877,20 @@ impl HTMLFormElement { // Step 23. If targetNavigable is null, then return. return; }; - // Step 24. Let historyHandling be "auto". - // TODO - // Step 25. If form document equals targetNavigable's active document, and form document has not yet completely loaded, - // then set historyHandling to "replace". - // TODO - let target_document = match chosen.document() { Some(doc) => doc, None => return, }; + + // Step 24. Let historyHandling be "auto". + // Step 25. If form document equals targetNavigable's active document, and form document has not yet completely loaded, + // then set historyHandling to "replace". + let history_handling = if doc == target_document && !doc.completely_loaded() { + NavigationHistoryBehavior::Replace + } else { + NavigationHistoryBehavior::Auto + }; + let target_window = target_document.window(); let mut load_data = LoadData::new( LoadOrigin::Script(doc.origin().snapshot()), @@ -914,7 +918,13 @@ impl HTMLFormElement { load_data .headers .typed_insert(ContentType::from(mime::APPLICATION_WWW_FORM_URLENCODED)); - self.mutate_action_url(&mut form_data, load_data, encoding, target_window); + self.mutate_action_url( + &mut form_data, + load_data, + encoding, + target_window, + history_handling, + ); }, // https://html.spec.whatwg.org/multipage/#submit-body ("http", FormMethod::Post) | ("https", FormMethod::Post) => { @@ -925,6 +935,7 @@ impl HTMLFormElement { enctype, encoding, target_window, + history_handling, can_gc, ); }, @@ -934,7 +945,7 @@ impl HTMLFormElement { ("data", FormMethod::Post) | ("ftp", _) | ("javascript", _) => { - self.plan_to_navigate(load_data, target_window); + self.plan_to_navigate(load_data, target_window, history_handling); }, ("mailto", FormMethod::Post) => { // TODO: Mail as body @@ -955,6 +966,7 @@ impl HTMLFormElement { mut load_data: LoadData, encoding: &'static Encoding, target: &Window, + history_handling: NavigationHistoryBehavior, ) { let charset = encoding.name(); @@ -965,10 +977,11 @@ impl HTMLFormElement { .map(|field| (field.name.str(), field.replace_value(charset))), ); - self.plan_to_navigate(load_data, target); + self.plan_to_navigate(load_data, target, history_handling); } /// + #[allow(clippy::too_many_arguments)] fn submit_entity_body( &self, form_data: &mut [FormDatum], @@ -976,6 +989,7 @@ impl HTMLFormElement { enctype: FormEncType, encoding: &'static Encoding, target: &Window, + history_handling: NavigationHistoryBehavior, can_gc: CanGc, ) { let boundary = generate_boundary(); @@ -1020,7 +1034,7 @@ impl HTMLFormElement { .0; load_data.data = Some(request_body); - self.plan_to_navigate(load_data, target); + self.plan_to_navigate(load_data, target, history_handling); } fn set_url_query_pairs( @@ -1039,7 +1053,12 @@ impl HTMLFormElement { } /// [Planned navigation](https://html.spec.whatwg.org/multipage/#planned-navigation) - fn plan_to_navigate(&self, mut load_data: LoadData, target: &Window) { + fn plan_to_navigate( + &self, + mut load_data: LoadData, + target: &Window, + history_handling: NavigationHistoryBehavior, + ) { // 1. Let referrerPolicy be the empty string. // 2. If the form element's link types include the noreferrer keyword, // then set referrerPolicy to "no-referrer". @@ -1113,10 +1132,10 @@ impl HTMLFormElement { navigate( cx, &window.root(), - NavigationHistoryBehavior::Push, + history_handling, false, load_data, - ); + ) }); // 5. Set the form's planned navigation to the just-queued task. diff --git a/tests/wpt/meta/html/browsers/browsing-the-web/navigating-across-documents/replace-before-load/a-click.html.ini b/tests/wpt/meta/html/browsers/browsing-the-web/navigating-across-documents/replace-before-load/a-click.html.ini new file mode 100644 index 00000000000..60a4fa51f8a --- /dev/null +++ b/tests/wpt/meta/html/browsers/browsing-the-web/navigating-across-documents/replace-before-load/a-click.html.ini @@ -0,0 +1,3 @@ +[a-click.html] + [aElement.click() before the load event must NOT replace] + expected: FAIL diff --git a/tests/wpt/meta/html/browsers/browsing-the-web/navigating-across-documents/replace-before-load/form-requestsubmit-during-load.html.ini b/tests/wpt/meta/html/browsers/browsing-the-web/navigating-across-documents/replace-before-load/form-requestsubmit-during-load.html.ini index d2629f4f8b1..236feee01de 100644 --- a/tests/wpt/meta/html/browsers/browsing-the-web/navigating-across-documents/replace-before-load/form-requestsubmit-during-load.html.ini +++ b/tests/wpt/meta/html/browsers/browsing-the-web/navigating-across-documents/replace-before-load/form-requestsubmit-during-load.html.ini @@ -1,3 +1,4 @@ [form-requestsubmit-during-load.html] + expected: TIMEOUT [Replace during the load event, triggered by formElement.submit()] - expected: FAIL + expected: TIMEOUT diff --git a/tests/wpt/meta/html/browsers/browsing-the-web/navigating-across-documents/replace-before-load/form-requestsubmit-during-pageshow.html.ini b/tests/wpt/meta/html/browsers/browsing-the-web/navigating-across-documents/replace-before-load/form-requestsubmit-during-pageshow.html.ini index 33f4c4651b8..00d27b27114 100644 --- a/tests/wpt/meta/html/browsers/browsing-the-web/navigating-across-documents/replace-before-load/form-requestsubmit-during-pageshow.html.ini +++ b/tests/wpt/meta/html/browsers/browsing-the-web/navigating-across-documents/replace-before-load/form-requestsubmit-during-pageshow.html.ini @@ -1,3 +1,4 @@ [form-requestsubmit-during-pageshow.html] + expected: TIMEOUT [Replace during the pageshow event, triggered by formElement.submit()] - expected: FAIL + expected: TIMEOUT diff --git a/tests/wpt/meta/html/browsers/browsing-the-web/navigating-across-documents/replace-before-load/form-requestsubmit.html.ini b/tests/wpt/meta/html/browsers/browsing-the-web/navigating-across-documents/replace-before-load/form-requestsubmit.html.ini index 012403eab43..9c79e11e5d1 100644 --- a/tests/wpt/meta/html/browsers/browsing-the-web/navigating-across-documents/replace-before-load/form-requestsubmit.html.ini +++ b/tests/wpt/meta/html/browsers/browsing-the-web/navigating-across-documents/replace-before-load/form-requestsubmit.html.ini @@ -1,3 +1,4 @@ [form-requestsubmit.html] + expected: TIMEOUT [Replace before load, triggered by formElement.requestSubmit()] - expected: FAIL + expected: TIMEOUT diff --git a/tests/wpt/meta/html/browsers/browsing-the-web/navigating-across-documents/replace-before-load/form-submit-button-click-during-load.html.ini b/tests/wpt/meta/html/browsers/browsing-the-web/navigating-across-documents/replace-before-load/form-submit-button-click-during-load.html.ini index 5b1109d8aca..1652f1ac822 100644 --- a/tests/wpt/meta/html/browsers/browsing-the-web/navigating-across-documents/replace-before-load/form-submit-button-click-during-load.html.ini +++ b/tests/wpt/meta/html/browsers/browsing-the-web/navigating-across-documents/replace-before-load/form-submit-button-click-during-load.html.ini @@ -1,3 +1,4 @@ [form-submit-button-click-during-load.html] + expected: TIMEOUT [Replace during load, triggered by submitButton.click()] - expected: FAIL + expected: TIMEOUT diff --git a/tests/wpt/meta/html/browsers/browsing-the-web/navigating-across-documents/replace-before-load/form-submit-button-click-during-pageshow.html.ini b/tests/wpt/meta/html/browsers/browsing-the-web/navigating-across-documents/replace-before-load/form-submit-button-click-during-pageshow.html.ini index 1f05ddb8858..6c874bb1071 100644 --- a/tests/wpt/meta/html/browsers/browsing-the-web/navigating-across-documents/replace-before-load/form-submit-button-click-during-pageshow.html.ini +++ b/tests/wpt/meta/html/browsers/browsing-the-web/navigating-across-documents/replace-before-load/form-submit-button-click-during-pageshow.html.ini @@ -1,3 +1,4 @@ [form-submit-button-click-during-pageshow.html] + expected: TIMEOUT [Replace during pageshow, triggered by submitButton.click()] - expected: FAIL + expected: TIMEOUT diff --git a/tests/wpt/meta/html/browsers/browsing-the-web/navigating-across-documents/replace-before-load/form-submit-button-click.html.ini b/tests/wpt/meta/html/browsers/browsing-the-web/navigating-across-documents/replace-before-load/form-submit-button-click.html.ini index e84cccbbd1f..6c777ea167c 100644 --- a/tests/wpt/meta/html/browsers/browsing-the-web/navigating-across-documents/replace-before-load/form-submit-button-click.html.ini +++ b/tests/wpt/meta/html/browsers/browsing-the-web/navigating-across-documents/replace-before-load/form-submit-button-click.html.ini @@ -1,3 +1,4 @@ [form-submit-button-click.html] + expected: TIMEOUT [Replace before load, triggered by submitButton.click()] - expected: FAIL + expected: TIMEOUT diff --git a/tests/wpt/meta/html/browsers/browsing-the-web/navigating-across-documents/replace-before-load/form-submit-during-load.html.ini b/tests/wpt/meta/html/browsers/browsing-the-web/navigating-across-documents/replace-before-load/form-submit-during-load.html.ini index ef760fb3547..870e89eda54 100644 --- a/tests/wpt/meta/html/browsers/browsing-the-web/navigating-across-documents/replace-before-load/form-submit-during-load.html.ini +++ b/tests/wpt/meta/html/browsers/browsing-the-web/navigating-across-documents/replace-before-load/form-submit-during-load.html.ini @@ -1,3 +1,4 @@ [form-submit-during-load.html] + expected: TIMEOUT [Replace during the load event, triggered by formElement.submit()] - expected: FAIL + expected: TIMEOUT diff --git a/tests/wpt/meta/html/browsers/browsing-the-web/navigating-across-documents/replace-before-load/form-submit-during-pageshow.html.ini b/tests/wpt/meta/html/browsers/browsing-the-web/navigating-across-documents/replace-before-load/form-submit-during-pageshow.html.ini index 330630d697d..e2eea07dc2f 100644 --- a/tests/wpt/meta/html/browsers/browsing-the-web/navigating-across-documents/replace-before-load/form-submit-during-pageshow.html.ini +++ b/tests/wpt/meta/html/browsers/browsing-the-web/navigating-across-documents/replace-before-load/form-submit-during-pageshow.html.ini @@ -1,3 +1,4 @@ [form-submit-during-pageshow.html] + expected: TIMEOUT [Replace during the pageshow event, triggered by formElement.submit()] - expected: FAIL + expected: TIMEOUT diff --git a/tests/wpt/meta/html/browsers/browsing-the-web/navigating-across-documents/replace-before-load/form-submit.html.ini b/tests/wpt/meta/html/browsers/browsing-the-web/navigating-across-documents/replace-before-load/form-submit.html.ini index 69c6893f467..edbeb3df404 100644 --- a/tests/wpt/meta/html/browsers/browsing-the-web/navigating-across-documents/replace-before-load/form-submit.html.ini +++ b/tests/wpt/meta/html/browsers/browsing-the-web/navigating-across-documents/replace-before-load/form-submit.html.ini @@ -1,6 +1,5 @@ [form-submit.html] [Replace before load, triggered by formElement.submit()] - expected: FAIL - + expected: TIMEOUT [Replace before load, triggered by same-document formElement.submit()] - expected: FAIL + expected: [FAIL, TIMEOUT] diff --git a/tests/wpt/meta/html/browsers/history/the-session-history-of-browsing-contexts/navigation-in-onload.html.ini b/tests/wpt/meta/html/browsers/history/the-session-history-of-browsing-contexts/navigation-in-onload.html.ini deleted file mode 100644 index dcbea543673..00000000000 --- a/tests/wpt/meta/html/browsers/history/the-session-history-of-browsing-contexts/navigation-in-onload.html.ini +++ /dev/null @@ -1,3 +0,0 @@ -[navigation-in-onload.html] - [Navigation in onload handler] - expected: FAIL