From 73d22ecea34282f6c2d974a8ad4dc4da1f9f9d1a Mon Sep 17 00:00:00 2001 From: Davide Donadello Date: Tue, 6 May 2025 17:31:09 +0200 Subject: [PATCH 1/6] Fixed devtools url used for debug with chrome and edge Fixes #61559 --- .../WebAssembly/Server/src/TargetPickerUi.cs | 27 ++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/src/Components/WebAssembly/Server/src/TargetPickerUi.cs b/src/Components/WebAssembly/Server/src/TargetPickerUi.cs index 7ec8a74362e8..113b770a4050 100644 --- a/src/Components/WebAssembly/Server/src/TargetPickerUi.cs +++ b/src/Components/WebAssembly/Server/src/TargetPickerUi.cs @@ -366,9 +366,34 @@ private string GetDevToolsUrlWithProxy(BrowserTab tabToDebug) { var underlyingV8Endpoint = new Uri(tabToDebug.WebSocketDebuggerUrl); var proxyEndpoint = new Uri(_debugProxyUrl); - var devToolsUrlAbsolute = new Uri(_browserHost + tabToDebug.DevtoolsFrontendUrl); + var devToolsUrlAbsolute = new Uri(new Uri(_browserHost), relativeUri: NormalizeDevtoolsFrontendUrl(tabToDebug.DevtoolsFrontendUrl)); var devToolsUrlWithProxy = $"{devToolsUrlAbsolute.Scheme}://{devToolsUrlAbsolute.Authority}{devToolsUrlAbsolute.AbsolutePath}?{underlyingV8Endpoint.Scheme}={proxyEndpoint.Authority}{underlyingV8Endpoint.PathAndQuery}"; return devToolsUrlWithProxy; + + static string NormalizeDevtoolsFrontendUrl(string devtoolsFrontendUrl) + { + // Frontend url can be absolute or relative based on browser + string localPath; + string queryString; + if (Uri.TryCreate(devtoolsFrontendUrl, UriKind.Absolute, out var devtoolsFrontendUri)) + { + localPath = devtoolsFrontendUri.LocalPath; + queryString = devtoolsFrontendUri.Query; + } + else + { + var queryStringBeginCharIndex = devtoolsFrontendUrl.IndexOf('?'); + localPath = devtoolsFrontendUrl[..queryStringBeginCharIndex]; + queryString = devtoolsFrontendUrl[queryStringBeginCharIndex..]; + } + + // We need only the last segment of the path + localPath = localPath.Split('/').Last().TrimStart('/'); + // Ensure starts with "devtools" + localPath = $"devtools/{localPath}"; + + return $"{localPath}?{queryString}"; + } } private string GetLaunchChromeInstructions(string targetApplicationUrl) From ff4defaceb00fa081c3d7146e281c4bcee66c595 Mon Sep 17 00:00:00 2001 From: Davide Donadello Date: Thu, 8 May 2025 23:29:41 +0200 Subject: [PATCH 2/6] Simplify url normalization and added comments --- .../WebAssembly/Server/src/TargetPickerUi.cs | 33 +++++++++---------- 1 file changed, 15 insertions(+), 18 deletions(-) diff --git a/src/Components/WebAssembly/Server/src/TargetPickerUi.cs b/src/Components/WebAssembly/Server/src/TargetPickerUi.cs index 113b770a4050..25c975724311 100644 --- a/src/Components/WebAssembly/Server/src/TargetPickerUi.cs +++ b/src/Components/WebAssembly/Server/src/TargetPickerUi.cs @@ -372,27 +372,24 @@ private string GetDevToolsUrlWithProxy(BrowserTab tabToDebug) static string NormalizeDevtoolsFrontendUrl(string devtoolsFrontendUrl) { - // Frontend url can be absolute or relative based on browser - string localPath; - string queryString; - if (Uri.TryCreate(devtoolsFrontendUrl, UriKind.Absolute, out var devtoolsFrontendUri)) + // Currently frontend url can be: + // - absolute (since v135 of chrome and edge) + // chrome example: https://chrome-devtools-frontend.appspot.com/serve_rev/@031848bc6ad02b97854f3d6154d3aefd0434756a/inspector.html?ws=localhost:9222/devtools/page/719FE9D3B43570193235446E0AB36859 + // edge example: https://aka.ms/docs-landing-page/serve_rev/@4e2c41645f24197463afa2ab6aa999352ee8255c/inspector.html?ws=localhost:9222/devtools/page/3A4D56E09776321628432588FC9299F4 + // - relative (managed as fallback for brosers with prior version) + // example: /devtools/inspector.html?ws=localhost:9222/devtools/page/DAB7FB6187B554E10B0BD18821265734 + // The absolute url can't be used as-is because is not valid for debugging and cannot be made relative because of lack "devtools" segment + // before "inspector.html" but we can keep the query string and append to the default "devtools/inspector.html" browser devtools page + + const string DefaultBrowserDevToolsPagePath = "devtools/inspector.html"; + + if (devtoolsFrontendUrl.StartsWith(DefaultBrowserDevToolsPagePath)) { - localPath = devtoolsFrontendUri.LocalPath; - queryString = devtoolsFrontendUri.Query; + return devtoolsFrontendUrl; } - else - { - var queryStringBeginCharIndex = devtoolsFrontendUrl.IndexOf('?'); - localPath = devtoolsFrontendUrl[..queryStringBeginCharIndex]; - queryString = devtoolsFrontendUrl[queryStringBeginCharIndex..]; - } - - // We need only the last segment of the path - localPath = localPath.Split('/').Last().TrimStart('/'); - // Ensure starts with "devtools" - localPath = $"devtools/{localPath}"; - return $"{localPath}?{queryString}"; + string queryString = devtoolsFrontendUrl[devtoolsFrontendUrl.IndexOf('?')..]; + return $"{DefaultBrowserDevToolsPagePath}?{queryString}"; } } From 378c0995fa3d0d39a0f120b47ecd87cc2f05987f Mon Sep 17 00:00:00 2001 From: Davide Donadello Date: Thu, 8 May 2025 23:42:41 +0200 Subject: [PATCH 3/6] Ignored leading slash --- src/Components/WebAssembly/Server/src/TargetPickerUi.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Components/WebAssembly/Server/src/TargetPickerUi.cs b/src/Components/WebAssembly/Server/src/TargetPickerUi.cs index 25c975724311..8c1af6ac5855 100644 --- a/src/Components/WebAssembly/Server/src/TargetPickerUi.cs +++ b/src/Components/WebAssembly/Server/src/TargetPickerUi.cs @@ -383,7 +383,7 @@ static string NormalizeDevtoolsFrontendUrl(string devtoolsFrontendUrl) const string DefaultBrowserDevToolsPagePath = "devtools/inspector.html"; - if (devtoolsFrontendUrl.StartsWith(DefaultBrowserDevToolsPagePath)) + if (devtoolsFrontendUrl.AsSpan().TrimStart('/').StartsWith(DefaultBrowserDevToolsPagePath)) { return devtoolsFrontendUrl; } From ef17c2d30b496ff9f1e4c9ac87aba7328c84600d Mon Sep 17 00:00:00 2001 From: Davide Donadello Date: Fri, 9 May 2025 09:15:31 +0200 Subject: [PATCH 4/6] Used UriHelper to parse url and get query --- src/Components/WebAssembly/Server/src/TargetPickerUi.cs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/Components/WebAssembly/Server/src/TargetPickerUi.cs b/src/Components/WebAssembly/Server/src/TargetPickerUi.cs index 8c1af6ac5855..0515799d9469 100644 --- a/src/Components/WebAssembly/Server/src/TargetPickerUi.cs +++ b/src/Components/WebAssembly/Server/src/TargetPickerUi.cs @@ -10,6 +10,7 @@ using System.Text.Json; using System.Text.Json.Serialization; using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Http.Extensions; using System.Dynamic; namespace Microsoft.AspNetCore.Components.WebAssembly.Server; @@ -388,8 +389,8 @@ static string NormalizeDevtoolsFrontendUrl(string devtoolsFrontendUrl) return devtoolsFrontendUrl; } - string queryString = devtoolsFrontendUrl[devtoolsFrontendUrl.IndexOf('?')..]; - return $"{DefaultBrowserDevToolsPagePath}?{queryString}"; + UriHelper.FromAbsolute(url, out _, out _, out _, out var query, out _); + return $"{DefaultBrowserDevToolsPagePath}{query}"; } } From 041c39b97aef0a500872df1aaee95810c8664da4 Mon Sep 17 00:00:00 2001 From: Davide Donadello Date: Fri, 9 May 2025 10:49:14 +0200 Subject: [PATCH 5/6] typo --- src/Components/WebAssembly/Server/src/TargetPickerUi.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Components/WebAssembly/Server/src/TargetPickerUi.cs b/src/Components/WebAssembly/Server/src/TargetPickerUi.cs index 0515799d9469..9f489ea9a161 100644 --- a/src/Components/WebAssembly/Server/src/TargetPickerUi.cs +++ b/src/Components/WebAssembly/Server/src/TargetPickerUi.cs @@ -389,7 +389,7 @@ static string NormalizeDevtoolsFrontendUrl(string devtoolsFrontendUrl) return devtoolsFrontendUrl; } - UriHelper.FromAbsolute(url, out _, out _, out _, out var query, out _); + UriHelper.FromAbsolute(devtoolsFrontendUrl, out _, out _, out _, out var query, out _); return $"{DefaultBrowserDevToolsPagePath}{query}"; } } From 138f00bcf24b52e9a3bdc88f42c2bbcacec57fe5 Mon Sep 17 00:00:00 2001 From: Ilona Tomkowicz Date: Fri, 23 May 2025 09:28:07 +0200 Subject: [PATCH 6/6] Backport blocking the failing test. --- .../FormHandlingTests/FormWithParentBindingContextTest.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Components/test/E2ETest/ServerRenderingTests/FormHandlingTests/FormWithParentBindingContextTest.cs b/src/Components/test/E2ETest/ServerRenderingTests/FormHandlingTests/FormWithParentBindingContextTest.cs index 792e222f4183..53fd2addd404 100644 --- a/src/Components/test/E2ETest/ServerRenderingTests/FormHandlingTests/FormWithParentBindingContextTest.cs +++ b/src/Components/test/E2ETest/ServerRenderingTests/FormHandlingTests/FormWithParentBindingContextTest.cs @@ -1287,7 +1287,7 @@ public void CanBindToFormWithFiles() } [Theory] - [InlineData(true)] + // [InlineData(true)] QuarantinedTest: https://github.com/dotnet/aspnetcore/issues/61882 [InlineData(false)] public void CanUseFormWithMethodGet(bool suppressEnhancedNavigation) {