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