diff --git a/components/script/dom/location.rs b/components/script/dom/location.rs index 2d123fcc95b..e8d7ee16f1e 100644 --- a/components/script/dom/location.rs +++ b/components/script/dom/location.rs @@ -315,13 +315,19 @@ impl LocationMethods for Location { // Step 5: Set copyURL's fragment to the empty string. // Step 6: Basic URL parse input, with copyURL as url and fragment state as // state override. - copy_url.as_mut_url().set_fragment(match value.0.as_str() { - "" => Some("#"), - _ if value.0.starts_with('#') => Some(&value.0[1..]), - _ => Some(&value.0), - }); + let new_fragment = if value.0.starts_with('#') { + Some(&value.0[1..]) + } else { + Some(value.0.as_str()) + }; + // Step 7: If copyURL's fragment is this's url's fragment, then return. + if copy_url.fragment() == new_fragment { + Ok(None) + } else { + copy_url.as_mut_url().set_fragment(new_fragment); - Ok(Some(copy_url)) + Ok(Some(copy_url)) + } }) } diff --git a/tests/wpt/meta/MANIFEST.json b/tests/wpt/meta/MANIFEST.json index 32a3349df8a..7b19a43e09f 100644 --- a/tests/wpt/meta/MANIFEST.json +++ b/tests/wpt/meta/MANIFEST.json @@ -641539,6 +641539,20 @@ {} ] ], + "location_hash_set_empty_string.html": [ + "bfde4e638290c0ef1b4068b399e7428d090544b2", + [ + null, + {} + ] + ], + "location_hashchange_infinite_loop.html": [ + "694c619ecabdb8b8e2f69fc6144e59f5a8279818", + [ + null, + {} + ] + ], "location_host.html": [ "d93bf47e506f131e29f2009e1f4446bc5844aee5", [ diff --git a/tests/wpt/tests/html/browsers/history/the-location-interface/location_hash_set_empty_string.html b/tests/wpt/tests/html/browsers/history/the-location-interface/location_hash_set_empty_string.html new file mode 100644 index 00000000000..bfde4e63829 --- /dev/null +++ b/tests/wpt/tests/html/browsers/history/the-location-interface/location_hash_set_empty_string.html @@ -0,0 +1,17 @@ + + +