diff --git a/src/Components/test/E2ETest/Tests/RoutingTest.cs b/src/Components/test/E2ETest/Tests/RoutingTest.cs
index c0bec63c61..166692a865 100644
--- a/src/Components/test/E2ETest/Tests/RoutingTest.cs
+++ b/src/Components/test/E2ETest/Tests/RoutingTest.cs
@@ -455,6 +455,49 @@ namespace Microsoft.AspNetCore.Components.E2ETest.Tests
Browser.Equal(0, () => BrowserScrollY);
}
+ [Theory]
+ [InlineData("external", "ancestor")]
+ [InlineData("external", "target")]
+ [InlineData("external", "descendant")]
+ [InlineData("internal", "ancestor")]
+ [InlineData("internal", "target")]
+ [InlineData("internal", "descendant")]
+ public void PreventDefault_CanBlockNavigation(string navigationType, string whereToPreventDefault)
+ {
+ SetUrlViaPushState("/PreventDefaultCases");
+ var app = Browser.MountTestComponent();
+ var preventDefaultToggle = app.FindElement(By.CssSelector($".prevent-default .{whereToPreventDefault}"));
+ var linkElement = app.FindElement(By.Id($"{navigationType}-navigation"));
+ var counterButton = app.FindElement(By.ClassName("counter-button"));
+ if (whereToPreventDefault == "descendant")
+ {
+ // We're testing clicks on the link's descendant element
+ linkElement = linkElement.FindElement(By.TagName("span"));
+ }
+
+ // If preventDefault is on, then navigation does not occur
+ preventDefaultToggle.Click();
+ linkElement.Click();
+
+ // We check that no navigation ocurred by observing that we can still use the counter
+ counterButton.Click();
+ Browser.Equal("Counter: 1", () => counterButton.Text);
+
+ // Now if we toggle preventDefault back off, then navigation will occur
+ preventDefaultToggle.Click();
+ linkElement.Click();
+
+ if (navigationType == "external")
+ {
+ Browser.Equal("about:blank", () => Browser.Url);
+ }
+ else
+ {
+ Browser.Equal("This is another page.", () => app.FindElement(By.Id("test-info")).Text);
+ AssertHighlightedLinks("Other", "Other with base-relative URL (matches all)");
+ }
+ }
+
private long BrowserScrollY
{
get => (long)((IJavaScriptExecutor)Browser).ExecuteScript("return window.scrollY");
diff --git a/src/Components/test/testassets/BasicTestApp/RouterTest/PreventDefaultCases.razor b/src/Components/test/testassets/BasicTestApp/RouterTest/PreventDefaultCases.razor
index d0eeaf2c9b..bb3591010f 100644
--- a/src/Components/test/testassets/BasicTestApp/RouterTest/PreventDefaultCases.razor
+++ b/src/Components/test/testassets/BasicTestApp/RouterTest/PreventDefaultCases.razor
@@ -9,13 +9,13 @@
-
+
External navigation
[Descendant element]
-
+
Internal navigation
[Descendant element]
@@ -28,7 +28,7 @@
@* So we can assert that navigation didn't happen *@
-
+
@code {