From 43bd3a41f2c29b6612ff8ae101d95d6e340c4649 Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Tue, 15 Oct 2019 09:53:08 -0700 Subject: [PATCH 01/32] [3.0] Skip known failure in ShutdownTestWaitForShutdown (#14744) - update src/Hosting/test/FunctionalTests/ShutdownTests.cs Co-Authored-By: Andrew Stanton-Nurse --- src/Hosting/test/FunctionalTests/ShutdownTests.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Hosting/test/FunctionalTests/ShutdownTests.cs b/src/Hosting/test/FunctionalTests/ShutdownTests.cs index ce79a471d5..7394fbe125 100644 --- a/src/Hosting/test/FunctionalTests/ShutdownTests.cs +++ b/src/Hosting/test/FunctionalTests/ShutdownTests.cs @@ -33,7 +33,7 @@ namespace Microsoft.AspNetCore.Hosting.FunctionalTests await ExecuteShutdownTest(nameof(ShutdownTestRun), "Run"); } - [ConditionalFact] + [ConditionalFact(Skip = "https://github.com/aspnet/AspNetCore-Internal/issues/2577")] [Flaky("https://github.com/aspnet/Hosting/issues/1214", FlakyOn.All)] [OSSkipCondition(OperatingSystems.Windows)] [OSSkipCondition(OperatingSystems.MacOSX)] From 5ceb94f3fe9462afc2e730e94d0a2fb59b8aaae3 Mon Sep 17 00:00:00 2001 From: Matt Mitchell Date: Wed, 16 Oct 2019 14:24:20 -0700 Subject: [PATCH 02/32] [release/3.0] Pin Microsoft.Internal.Extensions.Refs (#15062) * Pin Microsoft.Internal.Extensions.Refs This is not being produced in current 3.0 builds so the coherent parent dependency attribute cannot be satisfied. --- eng/Version.Details.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index 8631795af9..0c7539eb0b 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -281,7 +281,7 @@ https://github.com/aspnet/Extensions 0b951c16de0f39e13cce8372e11c28eb90576662 - + https://github.com/aspnet/Extensions 0b951c16de0f39e13cce8372e11c28eb90576662 From e8c9952a2b5a933e2b781adbf36e61a0510e35d2 Mon Sep 17 00:00:00 2001 From: Adrian Wright Date: Thu, 26 Sep 2019 12:29:37 +0100 Subject: [PATCH 03/32] Add .sidebar to .nav-item so to just target the nav in the template and not any other .nav-item's in the html --- .../Client/wwwroot/css/site.css | 71 ++++++++------ .../StandaloneApp/wwwroot/css/site.css | 71 ++++++++------ .../BlazorServerApp/wwwroot/css/site.css | 92 ++++++++--------- .../ComponentsApp.Server/wwwroot/css/site.css | 69 ++++++++----- .../wwwroot/css/site.css | 98 +++++++++---------- 5 files changed, 223 insertions(+), 178 deletions(-) diff --git a/src/Components/Blazor/Templates/src/content/BlazorWasm-CSharp/Client/wwwroot/css/site.css b/src/Components/Blazor/Templates/src/content/BlazorWasm-CSharp/Client/wwwroot/css/site.css index 22f9ecb710..426ac972d6 100644 --- a/src/Components/Blazor/Templates/src/content/BlazorWasm-CSharp/Client/wwwroot/css/site.css +++ b/src/Components/Blazor/Templates/src/content/BlazorWasm-CSharp/Client/wwwroot/css/site.css @@ -1,9 +1,19 @@ -@import url('open-iconic/font/css/open-iconic-bootstrap.min.css'); +@import url('open-iconic/font/css/open-iconic-bootstrap.min.css'); html, body { font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; } +a, .btn-link { + color: #0366d6; +} + +.btn-primary { + color: #fff; + background-color: #1b6ec2; + border-color: #1861ac; +} + app { position: relative; display: flex; @@ -21,10 +31,15 @@ app { } .main .top-row { - background-color: #e6e6e6; + background-color: #f7f7f7; border-bottom: 1px solid #d6d5d5; + justify-content: flex-end; } + .main .top-row > a { + margin-left: 1.5rem; + } + .sidebar { background-image: linear-gradient(180deg, rgb(5, 39, 103) 0%, #3a0647 70%); } @@ -44,38 +59,38 @@ app { top: -2px; } -.nav-item { - font-size: 0.9rem; - padding-bottom: 0.5rem; -} - - .nav-item:first-of-type { - padding-top: 1rem; + .sidebar .nav-item { + font-size: 0.9rem; + padding-bottom: 0.5rem; } - .nav-item:last-of-type { - padding-bottom: 1rem; - } - - .nav-item a { - color: #d7d7d7; - border-radius: 4px; - height: 3rem; - display: flex; - align-items: center; - line-height: 3rem; - } - - .nav-item a.active { - background-color: rgba(255,255,255,0.25); - color: white; + .sidebar .nav-item:first-of-type { + padding-top: 1rem; } - .nav-item a:hover { - background-color: rgba(255,255,255,0.1); - color: white; + .sidebar .nav-item:last-of-type { + padding-bottom: 1rem; } + .sidebar .nav-item a { + color: #d7d7d7; + border-radius: 4px; + height: 3rem; + display: flex; + align-items: center; + line-height: 3rem; + } + + .sidebar .nav-item a.active { + background-color: rgba(255,255,255,0.25); + color: white; + } + + .sidebar .nav-item a:hover { + background-color: rgba(255,255,255,0.1); + color: white; + } + .content { padding-top: 1.1rem; } diff --git a/src/Components/Blazor/testassets/StandaloneApp/wwwroot/css/site.css b/src/Components/Blazor/testassets/StandaloneApp/wwwroot/css/site.css index fa2c7f19b7..612b7666bd 100644 --- a/src/Components/Blazor/testassets/StandaloneApp/wwwroot/css/site.css +++ b/src/Components/Blazor/testassets/StandaloneApp/wwwroot/css/site.css @@ -1,9 +1,19 @@ -@import url('open-iconic/font/css/open-iconic-bootstrap.min.css'); +@import url('open-iconic/font/css/open-iconic-bootstrap.min.css'); html, body { font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; } +a, .btn-link { + color: #0366d6; +} + +.btn-primary { + color: #fff; + background-color: #1b6ec2; + border-color: #1861ac; +} + app { position: relative; display: flex; @@ -21,10 +31,15 @@ app { } .main .top-row { - background-color: #e6e6e6; + background-color: #f7f7f7; border-bottom: 1px solid #d6d5d5; + justify-content: flex-end; } + .main .top-row > a { + margin-left: 1.5rem; + } + .sidebar { background-image: linear-gradient(180deg, rgb(5, 39, 103) 0%, #3a0647 70%); } @@ -44,38 +59,38 @@ app { top: -2px; } -.nav-item { - font-size: 0.9rem; - padding-bottom: 0.5rem; -} - - .nav-item:first-of-type { - padding-top: 1rem; + .sidebar .nav-item { + font-size: 0.9rem; + padding-bottom: 0.5rem; } - .nav-item:last-of-type { - padding-bottom: 1rem; - } - - .nav-item a { - color: #d7d7d7; - border-radius: 4px; - height: 3rem; - display: flex; - align-items: center; - line-height: 3rem; - } - - .nav-item a.active { - background-color: rgba(255,255,255,0.25); - color: white; + .sidebar .nav-item:first-of-type { + padding-top: 1rem; } - .nav-item a:hover { - background-color: rgba(255,255,255,0.1); - color: white; + .sidebar .nav-item:last-of-type { + padding-bottom: 1rem; } + .sidebar .nav-item a { + color: #d7d7d7; + border-radius: 4px; + height: 3rem; + display: flex; + align-items: center; + line-height: 3rem; + } + + .sidebar .nav-item a.active { + background-color: rgba(255,255,255,0.25); + color: white; + } + + .sidebar .nav-item a:hover { + background-color: rgba(255,255,255,0.1); + color: white; + } + .content { padding-top: 1.1rem; } diff --git a/src/Components/Samples/BlazorServerApp/wwwroot/css/site.css b/src/Components/Samples/BlazorServerApp/wwwroot/css/site.css index 17b0a5e617..426ac972d6 100644 --- a/src/Components/Samples/BlazorServerApp/wwwroot/css/site.css +++ b/src/Components/Samples/BlazorServerApp/wwwroot/css/site.css @@ -30,66 +30,66 @@ app { flex: 1; } -.main .top-row { - background-color: #f7f7f7; - border-bottom: 1px solid #d6d5d5; - justify-content: flex-end; -} + .main .top-row { + background-color: #f7f7f7; + border-bottom: 1px solid #d6d5d5; + justify-content: flex-end; + } -.main .top-row > a { - margin-left: 1.5rem; -} + .main .top-row > a { + margin-left: 1.5rem; + } .sidebar { background-image: linear-gradient(180deg, rgb(5, 39, 103) 0%, #3a0647 70%); } -.sidebar .top-row { - background-color: rgba(0,0,0,0.4); -} + .sidebar .top-row { + background-color: rgba(0,0,0,0.4); + } -.sidebar .navbar-brand { - font-size: 1.1rem; -} + .sidebar .navbar-brand { + font-size: 1.1rem; + } -.sidebar .oi { - width: 2rem; - font-size: 1.1rem; - vertical-align: text-top; - top: -2px; -} + .sidebar .oi { + width: 2rem; + font-size: 1.1rem; + vertical-align: text-top; + top: -2px; + } -.nav-item { - font-size: 0.9rem; - padding-bottom: 0.5rem; -} + .sidebar .nav-item { + font-size: 0.9rem; + padding-bottom: 0.5rem; + } -.nav-item:first-of-type { - padding-top: 1rem; -} + .sidebar .nav-item:first-of-type { + padding-top: 1rem; + } -.nav-item:last-of-type { - padding-bottom: 1rem; -} + .sidebar .nav-item:last-of-type { + padding-bottom: 1rem; + } -.nav-item a { - color: #d7d7d7; - border-radius: 4px; - height: 3rem; - display: flex; - align-items: center; - line-height: 3rem; -} + .sidebar .nav-item a { + color: #d7d7d7; + border-radius: 4px; + height: 3rem; + display: flex; + align-items: center; + line-height: 3rem; + } -.nav-item a.active { - background-color: rgba(255,255,255,0.25); - color: white; -} + .sidebar .nav-item a.active { + background-color: rgba(255,255,255,0.25); + color: white; + } -.nav-item a:hover { - background-color: rgba(255,255,255,0.1); - color: white; -} + .sidebar .nav-item a:hover { + background-color: rgba(255,255,255,0.1); + color: white; + } .content { padding-top: 1.1rem; diff --git a/src/Components/test/testassets/ComponentsApp.Server/wwwroot/css/site.css b/src/Components/test/testassets/ComponentsApp.Server/wwwroot/css/site.css index 2789bc7b8d..612b7666bd 100644 --- a/src/Components/test/testassets/ComponentsApp.Server/wwwroot/css/site.css +++ b/src/Components/test/testassets/ComponentsApp.Server/wwwroot/css/site.css @@ -4,6 +4,16 @@ html, body { font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; } +a, .btn-link { + color: #0366d6; +} + +.btn-primary { + color: #fff; + background-color: #1b6ec2; + border-color: #1861ac; +} + app { position: relative; display: flex; @@ -21,10 +31,15 @@ app { } .main .top-row { - background-color: #e6e6e6; + background-color: #f7f7f7; border-bottom: 1px solid #d6d5d5; + justify-content: flex-end; } + .main .top-row > a { + margin-left: 1.5rem; + } + .sidebar { background-image: linear-gradient(180deg, rgb(5, 39, 103) 0%, #3a0647 70%); } @@ -44,38 +59,38 @@ app { top: -2px; } -.nav-item { - font-size: 0.9rem; - padding-bottom: 0.5rem; -} - - .nav-item:first-of-type { - padding-top: 1rem; + .sidebar .nav-item { + font-size: 0.9rem; + padding-bottom: 0.5rem; } - .nav-item:last-of-type { - padding-bottom: 1rem; - } - - .nav-item a { - color: #d7d7d7; - border-radius: 4px; - height: 3rem; - display: flex; - align-items: center; - line-height: 3rem; - } - - .nav-item a.active { - background-color: rgba(255,255,255,0.25); - color: white; + .sidebar .nav-item:first-of-type { + padding-top: 1rem; } - .nav-item a:hover { - background-color: rgba(255,255,255,0.1); - color: white; + .sidebar .nav-item:last-of-type { + padding-bottom: 1rem; } + .sidebar .nav-item a { + color: #d7d7d7; + border-radius: 4px; + height: 3rem; + display: flex; + align-items: center; + line-height: 3rem; + } + + .sidebar .nav-item a.active { + background-color: rgba(255,255,255,0.25); + color: white; + } + + .sidebar .nav-item a:hover { + background-color: rgba(255,255,255,0.1); + color: white; + } + .content { padding-top: 1.1rem; } diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/BlazorServerWeb-CSharp/wwwroot/css/site.css b/src/ProjectTemplates/Web.ProjectTemplates/content/BlazorServerWeb-CSharp/wwwroot/css/site.css index 0ddeb1311e..426ac972d6 100644 --- a/src/ProjectTemplates/Web.ProjectTemplates/content/BlazorServerWeb-CSharp/wwwroot/css/site.css +++ b/src/ProjectTemplates/Web.ProjectTemplates/content/BlazorServerWeb-CSharp/wwwroot/css/site.css @@ -9,9 +9,9 @@ a, .btn-link { } .btn-primary { - color: #fff; - background-color: #1b6ec2; - border-color: #1861ac; + color: #fff; + background-color: #1b6ec2; + border-color: #1861ac; } app { @@ -30,66 +30,66 @@ app { flex: 1; } -.main .top-row { - background-color: #f7f7f7; - border-bottom: 1px solid #d6d5d5; - justify-content: flex-end; -} + .main .top-row { + background-color: #f7f7f7; + border-bottom: 1px solid #d6d5d5; + justify-content: flex-end; + } -.main .top-row > a { - margin-left: 1.5rem; -} + .main .top-row > a { + margin-left: 1.5rem; + } .sidebar { background-image: linear-gradient(180deg, rgb(5, 39, 103) 0%, #3a0647 70%); } -.sidebar .top-row { - background-color: rgba(0,0,0,0.4); -} + .sidebar .top-row { + background-color: rgba(0,0,0,0.4); + } -.sidebar .navbar-brand { - font-size: 1.1rem; -} + .sidebar .navbar-brand { + font-size: 1.1rem; + } -.sidebar .oi { - width: 2rem; - font-size: 1.1rem; - vertical-align: text-top; - top: -2px; -} + .sidebar .oi { + width: 2rem; + font-size: 1.1rem; + vertical-align: text-top; + top: -2px; + } -.nav-item { - font-size: 0.9rem; - padding-bottom: 0.5rem; -} + .sidebar .nav-item { + font-size: 0.9rem; + padding-bottom: 0.5rem; + } -.nav-item:first-of-type { - padding-top: 1rem; -} + .sidebar .nav-item:first-of-type { + padding-top: 1rem; + } -.nav-item:last-of-type { - padding-bottom: 1rem; -} + .sidebar .nav-item:last-of-type { + padding-bottom: 1rem; + } -.nav-item a { - color: #d7d7d7; - border-radius: 4px; - height: 3rem; - display: flex; - align-items: center; - line-height: 3rem; -} + .sidebar .nav-item a { + color: #d7d7d7; + border-radius: 4px; + height: 3rem; + display: flex; + align-items: center; + line-height: 3rem; + } -.nav-item a.active { - background-color: rgba(255,255,255,0.25); - color: white; -} + .sidebar .nav-item a.active { + background-color: rgba(255,255,255,0.25); + color: white; + } -.nav-item a:hover { - background-color: rgba(255,255,255,0.1); - color: white; -} + .sidebar .nav-item a:hover { + background-color: rgba(255,255,255,0.1); + color: white; + } .content { padding-top: 1.1rem; From 1b2c44313bc2cd8a398e0b13548e570eed73eef8 Mon Sep 17 00:00:00 2001 From: Steve Sanderson Date: Thu, 17 Oct 2019 13:47:05 +1100 Subject: [PATCH 04/32] In Blazor Server template, show login UI on small screens too. Fixes #13003 --- .../Client/wwwroot/css/site.css | 20 ++++++++-- .../StandaloneApp/wwwroot/css/site.css | 37 ++++++++++++++++++- .../BlazorServerApp/wwwroot/css/site.css | 18 ++++++++- .../ComponentsApp.Server/wwwroot/css/site.css | 37 ++++++++++++++++++- .../Shared/MainLayout.Auth.razor | 2 +- .../wwwroot/css/site.css | 18 ++++++++- 6 files changed, 120 insertions(+), 12 deletions(-) diff --git a/src/Components/Blazor/Templates/src/content/BlazorWasm-CSharp/Client/wwwroot/css/site.css b/src/Components/Blazor/Templates/src/content/BlazorWasm-CSharp/Client/wwwroot/css/site.css index 426ac972d6..4e4425c9b3 100644 --- a/src/Components/Blazor/Templates/src/content/BlazorWasm-CSharp/Client/wwwroot/css/site.css +++ b/src/Components/Blazor/Templates/src/content/BlazorWasm-CSharp/Client/wwwroot/css/site.css @@ -1,4 +1,4 @@ -@import url('open-iconic/font/css/open-iconic-bootstrap.min.css'); +@import url('open-iconic/font/css/open-iconic-bootstrap.min.css'); html, body { font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; @@ -36,10 +36,16 @@ app { justify-content: flex-end; } - .main .top-row > a { + .main .top-row > a, .main .top-row .btn-link { + white-space: nowrap; margin-left: 1.5rem; } +.main .top-row a:first-child { + overflow: hidden; + text-overflow: ellipsis; +} + .sidebar { background-image: linear-gradient(180deg, rgb(5, 39, 103) 0%, #3a0647 70%); } @@ -131,9 +137,17 @@ app { } @media (max-width: 767.98px) { - .main .top-row { + .main .top-row:not(.auth) { display: none; } + + .main .top-row.auth { + justify-content: space-between; + } + + .main .top-row a, .main .top-row .btn-link { + margin-left: 0; + } } @media (min-width: 768px) { diff --git a/src/Components/Blazor/testassets/StandaloneApp/wwwroot/css/site.css b/src/Components/Blazor/testassets/StandaloneApp/wwwroot/css/site.css index 612b7666bd..c15c2e1556 100644 --- a/src/Components/Blazor/testassets/StandaloneApp/wwwroot/css/site.css +++ b/src/Components/Blazor/testassets/StandaloneApp/wwwroot/css/site.css @@ -36,10 +36,16 @@ app { justify-content: flex-end; } - .main .top-row > a { + .main .top-row > a, .main .top-row .btn-link { + white-space: nowrap; margin-left: 1.5rem; } +.main .top-row a:first-child { + overflow: hidden; + text-overflow: ellipsis; +} + .sidebar { background-image: linear-gradient(180deg, rgb(5, 39, 103) 0%, #3a0647 70%); } @@ -111,10 +117,37 @@ app { color: red; } +#blazor-error-ui { + background: lightyellow; + bottom: 0; + box-shadow: 0 -1px 2px rgba(0, 0, 0, 0.2); + display: none; + left: 0; + padding: 0.6rem 1.25rem 0.7rem 1.25rem; + position: fixed; + width: 100%; + z-index: 1000; +} + +#blazor-error-ui .dismiss { + cursor: pointer; + position: absolute; + right: 0.75rem; + top: 0.5rem; +} + @media (max-width: 767.98px) { - .main .top-row { + .main .top-row:not(.auth) { display: none; } + + .main .top-row.auth { + justify-content: space-between; + } + + .main .top-row a, .main .top-row .btn-link { + margin-left: 0; + } } @media (min-width: 768px) { diff --git a/src/Components/Samples/BlazorServerApp/wwwroot/css/site.css b/src/Components/Samples/BlazorServerApp/wwwroot/css/site.css index 426ac972d6..c15c2e1556 100644 --- a/src/Components/Samples/BlazorServerApp/wwwroot/css/site.css +++ b/src/Components/Samples/BlazorServerApp/wwwroot/css/site.css @@ -36,10 +36,16 @@ app { justify-content: flex-end; } - .main .top-row > a { + .main .top-row > a, .main .top-row .btn-link { + white-space: nowrap; margin-left: 1.5rem; } +.main .top-row a:first-child { + overflow: hidden; + text-overflow: ellipsis; +} + .sidebar { background-image: linear-gradient(180deg, rgb(5, 39, 103) 0%, #3a0647 70%); } @@ -131,9 +137,17 @@ app { } @media (max-width: 767.98px) { - .main .top-row { + .main .top-row:not(.auth) { display: none; } + + .main .top-row.auth { + justify-content: space-between; + } + + .main .top-row a, .main .top-row .btn-link { + margin-left: 0; + } } @media (min-width: 768px) { diff --git a/src/Components/test/testassets/ComponentsApp.Server/wwwroot/css/site.css b/src/Components/test/testassets/ComponentsApp.Server/wwwroot/css/site.css index 612b7666bd..c15c2e1556 100644 --- a/src/Components/test/testassets/ComponentsApp.Server/wwwroot/css/site.css +++ b/src/Components/test/testassets/ComponentsApp.Server/wwwroot/css/site.css @@ -36,10 +36,16 @@ app { justify-content: flex-end; } - .main .top-row > a { + .main .top-row > a, .main .top-row .btn-link { + white-space: nowrap; margin-left: 1.5rem; } +.main .top-row a:first-child { + overflow: hidden; + text-overflow: ellipsis; +} + .sidebar { background-image: linear-gradient(180deg, rgb(5, 39, 103) 0%, #3a0647 70%); } @@ -111,10 +117,37 @@ app { color: red; } +#blazor-error-ui { + background: lightyellow; + bottom: 0; + box-shadow: 0 -1px 2px rgba(0, 0, 0, 0.2); + display: none; + left: 0; + padding: 0.6rem 1.25rem 0.7rem 1.25rem; + position: fixed; + width: 100%; + z-index: 1000; +} + +#blazor-error-ui .dismiss { + cursor: pointer; + position: absolute; + right: 0.75rem; + top: 0.5rem; +} + @media (max-width: 767.98px) { - .main .top-row { + .main .top-row:not(.auth) { display: none; } + + .main .top-row.auth { + justify-content: space-between; + } + + .main .top-row a, .main .top-row .btn-link { + margin-left: 0; + } } @media (min-width: 768px) { diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/BlazorServerWeb-CSharp/Shared/MainLayout.Auth.razor b/src/ProjectTemplates/Web.ProjectTemplates/content/BlazorServerWeb-CSharp/Shared/MainLayout.Auth.razor index 842ef1f6bc..fafa2f55f1 100644 --- a/src/ProjectTemplates/Web.ProjectTemplates/content/BlazorServerWeb-CSharp/Shared/MainLayout.Auth.razor +++ b/src/ProjectTemplates/Web.ProjectTemplates/content/BlazorServerWeb-CSharp/Shared/MainLayout.Auth.razor @@ -5,7 +5,7 @@
-
+ diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/BlazorServerWeb-CSharp/wwwroot/css/site.css b/src/ProjectTemplates/Web.ProjectTemplates/content/BlazorServerWeb-CSharp/wwwroot/css/site.css index 426ac972d6..c15c2e1556 100644 --- a/src/ProjectTemplates/Web.ProjectTemplates/content/BlazorServerWeb-CSharp/wwwroot/css/site.css +++ b/src/ProjectTemplates/Web.ProjectTemplates/content/BlazorServerWeb-CSharp/wwwroot/css/site.css @@ -36,10 +36,16 @@ app { justify-content: flex-end; } - .main .top-row > a { + .main .top-row > a, .main .top-row .btn-link { + white-space: nowrap; margin-left: 1.5rem; } +.main .top-row a:first-child { + overflow: hidden; + text-overflow: ellipsis; +} + .sidebar { background-image: linear-gradient(180deg, rgb(5, 39, 103) 0%, #3a0647 70%); } @@ -131,9 +137,17 @@ app { } @media (max-width: 767.98px) { - .main .top-row { + .main .top-row:not(.auth) { display: none; } + + .main .top-row.auth { + justify-content: space-between; + } + + .main .top-row a, .main .top-row .btn-link { + margin-left: 0; + } } @media (min-width: 768px) { From c76df96c701e6bec0b05794bf80cd137b604fcfb Mon Sep 17 00:00:00 2001 From: Pranav K Date: Thu, 17 Oct 2019 10:06:57 -0700 Subject: [PATCH 05/32] Treat FormatExceptions and OverflowExceptions to be treated as model state errors (#15035) In SystemTextJsonInputFormatter and NewtonsoftJsonInputFormatter, suppress FormatExceptions and OverflowExceptions and instead report them as model state errors. This makes the behavior more consistent between these formatters, model binders, and the XML formatters Fixes https://github.com/aspnet/AspNetCore/issues/14504 --- .../SystemTextJsonInputFormatter.cs | 11 ++- .../Formatters/JsonInputFormatterTestBase.cs | 3 +- .../SystemTextJsonInputFormatterTest.cs | 79 +++++++++++++++ .../src/NewtonsoftJsonInputFormatter.cs | 9 +- .../test/NewtonsoftJsonInputFormatterTest.cs | 98 +++++++++++++++++-- 5 files changed, 190 insertions(+), 10 deletions(-) diff --git a/src/Mvc/Mvc.Core/src/Formatters/SystemTextJsonInputFormatter.cs b/src/Mvc/Mvc.Core/src/Formatters/SystemTextJsonInputFormatter.cs index aeecafa6b1..6b43fdf276 100644 --- a/src/Mvc/Mvc.Core/src/Formatters/SystemTextJsonInputFormatter.cs +++ b/src/Mvc/Mvc.Core/src/Formatters/SystemTextJsonInputFormatter.cs @@ -8,7 +8,6 @@ using System.Text.Json; using System.Threading.Tasks; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc.Formatters.Json; -using Microsoft.AspNetCore.Mvc.ModelBinding; using Microsoft.Extensions.Logging; namespace Microsoft.AspNetCore.Mvc.Formatters @@ -87,6 +86,16 @@ namespace Microsoft.AspNetCore.Mvc.Formatters return InputFormatterResult.Failure(); } + catch (Exception exception) when (exception is FormatException || exception is OverflowException) + { + // The code in System.Text.Json never throws these exceptions. However a custom converter could produce these errors for instance when + // parsing a value. These error messages are considered safe to report to users using ModelState. + + context.ModelState.TryAddModelError(string.Empty, exception, context.Metadata); + Log.JsonInputException(_logger, exception); + + return InputFormatterResult.Failure(); + } finally { if (inputStream is TranscodingReadStream transcoding) diff --git a/src/Mvc/Mvc.Core/test/Formatters/JsonInputFormatterTestBase.cs b/src/Mvc/Mvc.Core/test/Formatters/JsonInputFormatterTestBase.cs index 11c8ce9baf..fd08c4978e 100644 --- a/src/Mvc/Mvc.Core/test/Formatters/JsonInputFormatterTestBase.cs +++ b/src/Mvc/Mvc.Core/test/Formatters/JsonInputFormatterTestBase.cs @@ -334,7 +334,8 @@ namespace Microsoft.AspNetCore.Mvc.Formatters // Assert Assert.True(result.HasError, "Model should have produced an error!"); Assert.Collection(formatterContext.ModelState.OrderBy(k => k.Key), - kvp => { + kvp => + { Assert.Equal(expectedValue, kvp.Key); }); } diff --git a/src/Mvc/Mvc.Core/test/Formatters/SystemTextJsonInputFormatterTest.cs b/src/Mvc/Mvc.Core/test/Formatters/SystemTextJsonInputFormatterTest.cs index 411725c7a9..d3019b0887 100644 --- a/src/Mvc/Mvc.Core/test/Formatters/SystemTextJsonInputFormatterTest.cs +++ b/src/Mvc/Mvc.Core/test/Formatters/SystemTextJsonInputFormatterTest.cs @@ -5,6 +5,8 @@ using System; using System.Collections.Generic; using System.Linq; using System.Text; +using System.Text.Json; +using System.Text.Json.Serialization; using System.Threading.Tasks; using Microsoft.Extensions.Logging; using Xunit; @@ -81,6 +83,48 @@ namespace Microsoft.AspNetCore.Mvc.Formatters }); } + [Fact] + public async Task ReadAsync_DoesNotThrowFormatException() + { + // Arrange + var formatter = GetInputFormatter(); + + var contentBytes = Encoding.UTF8.GetBytes("{\"dateValue\":\"not-a-date\"}"); + var httpContext = GetHttpContext(contentBytes); + + var formatterContext = CreateInputFormatterContext(typeof(TypeWithBadConverters), httpContext); + + // Act + await formatter.ReadAsync(formatterContext); + + Assert.False(formatterContext.ModelState.IsValid); + var kvp = Assert.Single(formatterContext.ModelState); + Assert.Empty(kvp.Key); + var error = Assert.Single(kvp.Value.Errors); + Assert.Equal("The supplied value is invalid.", error.ErrorMessage); + } + + [Fact] + public async Task ReadAsync_DoesNotThrowOverflowException() + { + // Arrange + var formatter = GetInputFormatter(); + + var contentBytes = Encoding.UTF8.GetBytes("{\"shortValue\":\"32768\"}"); + var httpContext = GetHttpContext(contentBytes); + + var formatterContext = CreateInputFormatterContext(typeof(TypeWithBadConverters), httpContext); + + // Act + await formatter.ReadAsync(formatterContext); + + Assert.False(formatterContext.ModelState.IsValid); + var kvp = Assert.Single(formatterContext.ModelState); + Assert.Empty(kvp.Key); + var error = Assert.Single(kvp.Value.Errors); + Assert.Equal("The supplied value is invalid.", error.ErrorMessage); + } + protected override TextInputFormatter GetInputFormatter() { return new SystemTextJsonInputFormatter(new JsonOptions(), LoggerFactory.CreateLogger()); @@ -99,5 +143,40 @@ namespace Microsoft.AspNetCore.Mvc.Formatters internal override string ReadAsync_InvalidComplexArray_AddsOverflowErrorsToModelState_Expected => "$[1].Small"; internal override string ReadAsync_ComplexPoco_Expected => "$.Person.Numbers[2]"; + + private class TypeWithBadConverters + { + [JsonConverter(typeof(DateTimeConverter))] + public DateTime DateValue { get; set; } + + [JsonConverter(typeof(ShortConverter))] + public short ShortValue { get; set; } + } + + private class ShortConverter : JsonConverter + { + public override short Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) + { + return short.Parse(reader.GetString()); + } + + public override void Write(Utf8JsonWriter writer, short value, JsonSerializerOptions options) + { + throw new NotImplementedException(); + } + } + + private class DateTimeConverter : JsonConverter + { + public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) + { + return DateTime.Parse(reader.GetString()); + } + + public override void Write(Utf8JsonWriter writer, DateTime value, JsonSerializerOptions options) + { + throw new NotImplementedException(); + } + } } } diff --git a/src/Mvc/Mvc.NewtonsoftJson/src/NewtonsoftJsonInputFormatter.cs b/src/Mvc/Mvc.NewtonsoftJson/src/NewtonsoftJsonInputFormatter.cs index 1d30afcbac..2138c5b117 100644 --- a/src/Mvc/Mvc.NewtonsoftJson/src/NewtonsoftJsonInputFormatter.cs +++ b/src/Mvc/Mvc.NewtonsoftJson/src/NewtonsoftJsonInputFormatter.cs @@ -196,8 +196,15 @@ namespace Microsoft.AspNetCore.Mvc.Formatters } } - if (!(exception is JsonException || exception is OverflowException)) + if (!(exception is JsonException || exception is OverflowException || exception is FormatException)) { + // At this point we've already recorded all exceptions as an entry in the ModelStateDictionary. + // We only need to rethrow an exception if we believe it needs to be handled by something further up + // the stack. + // JsonException, OverflowException, and FormatException are assumed to be only encountered when + // parsing the JSON and are consequently "safe" to be exposed as part of ModelState. Everything else + // needs to be rethrown. + var exceptionDispatchInfo = ExceptionDispatchInfo.Capture(exception); exceptionDispatchInfo.Throw(); } diff --git a/src/Mvc/Mvc.NewtonsoftJson/test/NewtonsoftJsonInputFormatterTest.cs b/src/Mvc/Mvc.NewtonsoftJson/test/NewtonsoftJsonInputFormatterTest.cs index d9b1406a05..a5eec9f307 100644 --- a/src/Mvc/Mvc.NewtonsoftJson/test/NewtonsoftJsonInputFormatterTest.cs +++ b/src/Mvc/Mvc.NewtonsoftJson/test/NewtonsoftJsonInputFormatterTest.cs @@ -14,6 +14,7 @@ using Microsoft.Extensions.Logging.Abstractions; using Microsoft.Extensions.ObjectPool; using Moq; using Newtonsoft.Json; +using Newtonsoft.Json.Converters; using Newtonsoft.Json.Serialization; using Xunit; @@ -21,8 +22,8 @@ namespace Microsoft.AspNetCore.Mvc.Formatters { public class NewtonsoftJsonInputFormatterTest : JsonInputFormatterTestBase { - private static readonly ObjectPoolProvider _objectPoolProvider = new DefaultObjectPoolProvider(); - private static readonly JsonSerializerSettings _serializerSettings = new JsonSerializerSettings(); + private readonly ObjectPoolProvider _objectPoolProvider = new DefaultObjectPoolProvider(); + private readonly JsonSerializerSettings _serializerSettings = new JsonSerializerSettings(); [Fact] public async Task Constructor_BuffersRequestBody_UsingDefaultOptions() @@ -144,7 +145,7 @@ namespace Microsoft.AspNetCore.Mvc.Formatters var serializerSettings = new JsonSerializerSettings(); // Act - var formatter = new TestableJsonInputFormatter(serializerSettings); + var formatter = new TestableJsonInputFormatter(serializerSettings, _objectPoolProvider); // Assert Assert.Same(serializerSettings, formatter.SerializerSettings); @@ -185,7 +186,7 @@ namespace Microsoft.AspNetCore.Mvc.Formatters MaxDepth = 2, DateTimeZoneHandling = DateTimeZoneHandling.RoundtripKind, }; - var formatter = new TestableJsonInputFormatter(settings); + var formatter = new TestableJsonInputFormatter(settings, _objectPoolProvider); // Act var actual = formatter.CreateJsonSerializer(null); @@ -304,7 +305,7 @@ namespace Microsoft.AspNetCore.Mvc.Formatters } [Fact] - public async Task ReadAsync_lowInputFormatterExceptionMessages_DoesNotWrapJsonInputExceptions() + public async Task ReadAsync_AllowInputFormatterExceptionMessages_DoesNotWrapJsonInputExceptions() { // Arrange var formatter = new NewtonsoftJsonInputFormatter( @@ -336,10 +337,72 @@ namespace Microsoft.AspNetCore.Mvc.Formatters Assert.NotEmpty(modelError.ErrorMessage); } + [Fact] + public async Task ReadAsync_DoesNotRethrowFormatExceptions() + { + // Arrange + _serializerSettings.Converters.Add(new IsoDateTimeConverter()); + + var formatter = new NewtonsoftJsonInputFormatter( + GetLogger(), + _serializerSettings, + ArrayPool.Shared, + _objectPoolProvider, + new MvcOptions(), + new MvcNewtonsoftJsonOptions()); + + var contentBytes = Encoding.UTF8.GetBytes("{\"dateValue\":\"not-a-date\"}"); + var httpContext = GetHttpContext(contentBytes); + + var formatterContext = CreateInputFormatterContext(typeof(TypeWithPrimitives), httpContext); + + // Act + var result = await formatter.ReadAsync(formatterContext); + + // Assert + Assert.True(result.HasError); + Assert.False(formatterContext.ModelState.IsValid); + + var modelError = Assert.Single(formatterContext.ModelState["dateValue"].Errors); + Assert.Null(modelError.Exception); + Assert.Equal("The supplied value is invalid.", modelError.ErrorMessage); + } + + [Fact] + public async Task ReadAsync_DoesNotRethrowOverflowExceptions() + { + // Arrange + _serializerSettings.Converters.Add(new IsoDateTimeConverter()); + + var formatter = new NewtonsoftJsonInputFormatter( + GetLogger(), + _serializerSettings, + ArrayPool.Shared, + _objectPoolProvider, + new MvcOptions(), + new MvcNewtonsoftJsonOptions()); + + var contentBytes = Encoding.UTF8.GetBytes("{\"shortValue\":\"32768\"}"); + var httpContext = GetHttpContext(contentBytes); + + var formatterContext = CreateInputFormatterContext(typeof(TypeWithPrimitives), httpContext); + + // Act + var result = await formatter.ReadAsync(formatterContext); + + // Assert + Assert.True(result.HasError); + Assert.False(formatterContext.ModelState.IsValid); + + var modelError = Assert.Single(formatterContext.ModelState["shortValue"].Errors); + Assert.Null(modelError.Exception); + Assert.Equal("The supplied value is invalid.", modelError.ErrorMessage); + } + private class TestableJsonInputFormatter : NewtonsoftJsonInputFormatter { - public TestableJsonInputFormatter(JsonSerializerSettings settings) - : base(GetLogger(), settings, ArrayPool.Shared, _objectPoolProvider, new MvcOptions(), new MvcNewtonsoftJsonOptions()) + public TestableJsonInputFormatter(JsonSerializerSettings settings, ObjectPoolProvider objectPoolProvider) + : base(GetLogger(), settings, ArrayPool.Shared, objectPoolProvider, new MvcOptions(), new MvcNewtonsoftJsonOptions()) { } @@ -418,5 +481,26 @@ namespace Microsoft.AspNetCore.Mvc.Formatters [JsonProperty(Required = Required.Always)] public string Password { get; set; } } + + public class TypeWithPrimitives + { + public DateTime DateValue { get; set; } + + [JsonConverter(typeof(IncorrectShortConverter))] + public short ShortValue { get; set; } + } + + private class IncorrectShortConverter : JsonConverter + { + public override short ReadJson(JsonReader reader, Type objectType, short existingValue, bool hasExistingValue, JsonSerializer serializer) + { + return short.Parse(reader.Value.ToString()); + } + + public override void WriteJson(JsonWriter writer, short value, JsonSerializer serializer) + { + throw new NotImplementedException(); + } + } } } From 90b42ba0992b7d194c3ae42d1756d594500073b5 Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Thu, 17 Oct 2019 10:33:09 -0700 Subject: [PATCH 06/32] Update Facebook API to 4.0 #4684 (#14798) --- .../Authentication/Facebook/src/FacebookDefaults.cs | 6 +++--- src/Security/Authentication/test/FacebookTests.cs | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/Security/Authentication/Facebook/src/FacebookDefaults.cs b/src/Security/Authentication/Facebook/src/FacebookDefaults.cs index d85b99353a..0e155bf3b6 100644 --- a/src/Security/Authentication/Facebook/src/FacebookDefaults.cs +++ b/src/Security/Authentication/Facebook/src/FacebookDefaults.cs @@ -10,10 +10,10 @@ namespace Microsoft.AspNetCore.Authentication.Facebook public static readonly string DisplayName = "Facebook"; // https://developers.facebook.com/docs/facebook-login/manually-build-a-login-flow#login - public static readonly string AuthorizationEndpoint = "https://www.facebook.com/v3.3/dialog/oauth"; + public static readonly string AuthorizationEndpoint = "https://www.facebook.com/v4.0/dialog/oauth"; - public static readonly string TokenEndpoint = "https://graph.facebook.com/v3.3/oauth/access_token"; + public static readonly string TokenEndpoint = "https://graph.facebook.com/v4.0/oauth/access_token"; - public static readonly string UserInformationEndpoint = "https://graph.facebook.com/v3.3/me"; + public static readonly string UserInformationEndpoint = "https://graph.facebook.com/v4.0/me"; } } diff --git a/src/Security/Authentication/test/FacebookTests.cs b/src/Security/Authentication/test/FacebookTests.cs index c0fc415c9c..66a3605757 100644 --- a/src/Security/Authentication/test/FacebookTests.cs +++ b/src/Security/Authentication/test/FacebookTests.cs @@ -225,7 +225,7 @@ namespace Microsoft.AspNetCore.Authentication.Facebook var transaction = await server.SendAsync("http://example.com/base/login"); Assert.Equal(HttpStatusCode.Redirect, transaction.Response.StatusCode); var location = transaction.Response.Headers.Location.AbsoluteUri; - Assert.Contains("https://www.facebook.com/v3.3/dialog/oauth", location); + Assert.Contains("https://www.facebook.com/v4.0/dialog/oauth", location); Assert.Contains("response_type=code", location); Assert.Contains("client_id=", location); Assert.Contains("redirect_uri=" + UrlEncoder.Default.Encode("http://example.com/base/signin-facebook"), location); @@ -257,7 +257,7 @@ namespace Microsoft.AspNetCore.Authentication.Facebook var transaction = await server.SendAsync("http://example.com/login"); Assert.Equal(HttpStatusCode.Redirect, transaction.Response.StatusCode); var location = transaction.Response.Headers.Location.AbsoluteUri; - Assert.Contains("https://www.facebook.com/v3.3/dialog/oauth", location); + Assert.Contains("https://www.facebook.com/v4.0/dialog/oauth", location); Assert.Contains("response_type=code", location); Assert.Contains("client_id=", location); Assert.Contains("redirect_uri=" + UrlEncoder.Default.Encode("http://example.com/signin-facebook"), location); @@ -291,7 +291,7 @@ namespace Microsoft.AspNetCore.Authentication.Facebook var transaction = await server.SendAsync("http://example.com/challenge"); Assert.Equal(HttpStatusCode.Redirect, transaction.Response.StatusCode); var location = transaction.Response.Headers.Location.AbsoluteUri; - Assert.Contains("https://www.facebook.com/v3.3/dialog/oauth", location); + Assert.Contains("https://www.facebook.com/v4.0/dialog/oauth", location); Assert.Contains("response_type=code", location); Assert.Contains("client_id=", location); Assert.Contains("redirect_uri=", location); From 6d43b50183950dbd8d9da7743b6a165b193f55a3 Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Thu, 17 Oct 2019 10:37:07 -0700 Subject: [PATCH 07/32] Handle large limits for form keys and values #13719 (#15066) --- src/Http/WebUtilities/src/FormPipeReader.cs | 4 +- .../WebUtilities/test/FormPipeReaderTests.cs | 44 +++++++++++++++++++ 2 files changed, 46 insertions(+), 2 deletions(-) diff --git a/src/Http/WebUtilities/src/FormPipeReader.cs b/src/Http/WebUtilities/src/FormPipeReader.cs index b0a7d4684c..60f337757b 100644 --- a/src/Http/WebUtilities/src/FormPipeReader.cs +++ b/src/Http/WebUtilities/src/FormPipeReader.cs @@ -167,7 +167,7 @@ namespace Microsoft.AspNetCore.WebUtilities if (!isFinalBlock) { // Don't buffer indefinately - if (span.Length > KeyLengthLimit + ValueLengthLimit) + if ((uint)span.Length > (uint)KeyLengthLimit + (uint)ValueLengthLimit) { ThrowKeyOrValueTooLargeException(); } @@ -236,7 +236,7 @@ namespace Microsoft.AspNetCore.WebUtilities if (!isFinalBlock) { // Don't buffer indefinately - if ((sequenceReader.Consumed - consumedBytes) > KeyLengthLimit + ValueLengthLimit) + if ((uint)(sequenceReader.Consumed - consumedBytes) > (uint)KeyLengthLimit + (uint)ValueLengthLimit) { ThrowKeyOrValueTooLargeException(); } diff --git a/src/Http/WebUtilities/test/FormPipeReaderTests.cs b/src/Http/WebUtilities/test/FormPipeReaderTests.cs index 58d3af12d5..f0e806aae0 100644 --- a/src/Http/WebUtilities/test/FormPipeReaderTests.cs +++ b/src/Http/WebUtilities/test/FormPipeReaderTests.cs @@ -211,6 +211,28 @@ namespace Microsoft.AspNetCore.WebUtilities Assert.Equal("", dict["t"]); } + [Theory] + [MemberData(nameof(Encodings))] + public void TryParseFormValues_LimitsCanBeLarge(Encoding encoding) + { + var readOnlySequence = ReadOnlySequenceFactory.SingleSegmentFactory.CreateWithContent(encoding.GetBytes("foo=bar&baz=boo&t=")); + + KeyValueAccumulator accumulator = default; + + var formReader = new FormPipeReader(null, encoding); + formReader.KeyLengthLimit = int.MaxValue; + formReader.ValueLengthLimit = int.MaxValue; + formReader.ParseFormValues(ref readOnlySequence, ref accumulator, isFinalBlock: false); + formReader.ParseFormValues(ref readOnlySequence, ref accumulator, isFinalBlock: true); + Assert.True(readOnlySequence.IsEmpty); + + Assert.Equal(3, accumulator.KeyCount); + var dict = accumulator.GetResults(); + Assert.Equal("bar", dict["foo"]); + Assert.Equal("boo", dict["baz"]); + Assert.Equal("", dict["t"]); + } + [Theory] [MemberData(nameof(Encodings))] public void TryParseFormValues_SplitAcrossSegmentsWorks(Encoding encoding) @@ -230,6 +252,28 @@ namespace Microsoft.AspNetCore.WebUtilities Assert.Equal("", dict["t"]); } + [Theory] + [MemberData(nameof(Encodings))] + public void TryParseFormValues_SplitAcrossSegmentsWorks_LimitsCanBeLarge(Encoding encoding) + { + var readOnlySequence = ReadOnlySequenceFactory.SegmentPerByteFactory.CreateWithContent(encoding.GetBytes("foo=bar&baz=boo&t=")); + + KeyValueAccumulator accumulator = default; + + var formReader = new FormPipeReader(null, encoding); + formReader.KeyLengthLimit = int.MaxValue; + formReader.ValueLengthLimit = int.MaxValue; + formReader.ParseFormValues(ref readOnlySequence, ref accumulator, isFinalBlock: false); + formReader.ParseFormValues(ref readOnlySequence, ref accumulator, isFinalBlock: true); + Assert.True(readOnlySequence.IsEmpty); + + Assert.Equal(3, accumulator.KeyCount); + var dict = accumulator.GetResults(); + Assert.Equal("bar", dict["foo"]); + Assert.Equal("boo", dict["baz"]); + Assert.Equal("", dict["t"]); + } + [Theory] [MemberData(nameof(Encodings))] public void TryParseFormValues_MultiSegmentWithArrayPoolAcrossSegmentsWorks(Encoding encoding) From 6f9f6595773ad6fc702e7d8c79dd3bb8d96d83db Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" Date: Thu, 17 Oct 2019 17:00:18 +0000 Subject: [PATCH 08/32] Update dependencies from https://github.com/aspnet/AspNetCore-Tooling build 20191017.5 - Microsoft.NET.Sdk.Razor - 3.0.1 - Microsoft.CodeAnalysis.Razor - 3.0.1 - Microsoft.AspNetCore.Razor.Language - 3.0.1 - Microsoft.AspNetCore.Mvc.Razor.Extensions - 3.0.1 --- NuGet.config | 2 +- eng/Version.Details.xml | 16 ++++++++-------- eng/Versions.props | 16 ++++++---------- 3 files changed, 15 insertions(+), 19 deletions(-) diff --git a/NuGet.config b/NuGet.config index 46f8b50c84..4d7d2836ae 100644 --- a/NuGet.config +++ b/NuGet.config @@ -7,7 +7,7 @@ - + diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index 0c7539eb0b..bc99f09ed7 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -13,21 +13,21 @@ https://github.com/aspnet/Blazor 348e050ecd9bd8924581afb677089ae5e2d5e508 - + https://github.com/aspnet/AspNetCore-Tooling - 16b0ca4a5838c39c8852e6cf144232597e2bee2e + 4ef35e11af80a5907438d1a715e51803acf1077c - + https://github.com/aspnet/AspNetCore-Tooling - 16b0ca4a5838c39c8852e6cf144232597e2bee2e + 4ef35e11af80a5907438d1a715e51803acf1077c - + https://github.com/aspnet/AspNetCore-Tooling - 16b0ca4a5838c39c8852e6cf144232597e2bee2e + 4ef35e11af80a5907438d1a715e51803acf1077c - + https://github.com/aspnet/AspNetCore-Tooling - 16b0ca4a5838c39c8852e6cf144232597e2bee2e + 4ef35e11af80a5907438d1a715e51803acf1077c https://github.com/aspnet/EntityFrameworkCore diff --git a/eng/Versions.props b/eng/Versions.props index c7f31b506f..2807f94588 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -9,13 +9,11 @@ 3 0 1 - false release - true false servicing @@ -30,11 +28,9 @@ Until package baselines are updated (see aspnet/AspNetCore#12702), ignore them and PatchConfig.props. This also gives us time to build the entire repo and settle the infrastructure. Do _not_ do this when stabilizing versions. --> - true + true - true + true $(AspNetCoreMajorVersion).$(AspNetCoreMinorVersion).$(AspNetCorePatchVersion) $(VersionPrefix) @@ -174,10 +170,10 @@ 3.0.0 3.0.0 - 3.0.0 - 3.0.0 - 3.0.0 - 3.0.0 + 3.0.1 + 3.0.1 + 3.0.1 + 3.0.1 diff --git a/src/Installers/Rpm/Directory.Build.targets b/src/Installers/Rpm/Directory.Build.targets index 3dc3ab8202..b1779c0a1e 100644 --- a/src/Installers/Rpm/Directory.Build.targets +++ b/src/Installers/Rpm/Directory.Build.targets @@ -32,7 +32,8 @@ - + DATE=$([System.DateTime]::UtcNow.ToString(ddd MMM dd yyyy)) diff --git a/src/Installers/Windows/TargetingPack/TargetingPack.wixproj b/src/Installers/Windows/TargetingPack/TargetingPack.wixproj index e7cbb1f2ce..72c6afc6a0 100644 --- a/src/Installers/Windows/TargetingPack/TargetingPack.wixproj +++ b/src/Installers/Windows/TargetingPack/TargetingPack.wixproj @@ -82,7 +82,8 @@ - + $(InstallersOutputPath)$(PackageFileName) From 5dfb923c68fe4cc86b5af296449da5c4427c9795 Mon Sep 17 00:00:00 2001 From: Hao Kung Date: Thu, 17 Oct 2019 13:04:13 -0700 Subject: [PATCH 10/32] Flow return url in register confirmation (#15075) --- .../UI/ref/Microsoft.AspNetCore.Identity.UI.netcoreapp.cs | 4 ++-- .../src/Areas/Identity/Pages/V3/Account/Register.cshtml.cs | 4 ++-- .../Pages/V3/Account/RegisterConfirmation.cshtml.cs | 7 ++++--- .../src/Areas/Identity/Pages/V4/Account/Register.cshtml.cs | 4 ++-- .../Pages/V4/Account/RegisterConfirmation.cshtml.cs | 7 ++++--- .../Identity.FunctionalTests/Pages/Account/Register.cs | 2 +- 6 files changed, 15 insertions(+), 13 deletions(-) diff --git a/src/Identity/UI/ref/Microsoft.AspNetCore.Identity.UI.netcoreapp.cs b/src/Identity/UI/ref/Microsoft.AspNetCore.Identity.UI.netcoreapp.cs index 946e9c778c..a6f27855f0 100644 --- a/src/Identity/UI/ref/Microsoft.AspNetCore.Identity.UI.netcoreapp.cs +++ b/src/Identity/UI/ref/Microsoft.AspNetCore.Identity.UI.netcoreapp.cs @@ -177,7 +177,7 @@ namespace Microsoft.AspNetCore.Identity.UI.V3.Pages.Account.Internal public bool DisplayConfirmAccountLink { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } [System.Runtime.CompilerServices.CompilerGeneratedAttribute]set { } } public string Email { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } [System.Runtime.CompilerServices.CompilerGeneratedAttribute]set { } } public string EmailConfirmationUrl { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } [System.Runtime.CompilerServices.CompilerGeneratedAttribute]set { } } - public virtual System.Threading.Tasks.Task OnGetAsync(string email) { throw null; } + public virtual System.Threading.Tasks.Task OnGetAsync(string email, string returnUrl = null) { throw null; } } [Microsoft.AspNetCore.Authorization.AllowAnonymousAttribute] public abstract partial class RegisterModel : Microsoft.AspNetCore.Mvc.RazorPages.PageModel @@ -627,7 +627,7 @@ namespace Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal public bool DisplayConfirmAccountLink { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } [System.Runtime.CompilerServices.CompilerGeneratedAttribute]set { } } public string Email { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } [System.Runtime.CompilerServices.CompilerGeneratedAttribute]set { } } public string EmailConfirmationUrl { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } [System.Runtime.CompilerServices.CompilerGeneratedAttribute]set { } } - public virtual System.Threading.Tasks.Task OnGetAsync(string email) { throw null; } + public virtual System.Threading.Tasks.Task OnGetAsync(string email, string returnUrl = null) { throw null; } } [Microsoft.AspNetCore.Authorization.AllowAnonymousAttribute] public abstract partial class RegisterModel : Microsoft.AspNetCore.Mvc.RazorPages.PageModel diff --git a/src/Identity/UI/src/Areas/Identity/Pages/V3/Account/Register.cshtml.cs b/src/Identity/UI/src/Areas/Identity/Pages/V3/Account/Register.cshtml.cs index 4b2a418d8a..ade1e60d2a 100644 --- a/src/Identity/UI/src/Areas/Identity/Pages/V3/Account/Register.cshtml.cs +++ b/src/Identity/UI/src/Areas/Identity/Pages/V3/Account/Register.cshtml.cs @@ -147,7 +147,7 @@ namespace Microsoft.AspNetCore.Identity.UI.V3.Pages.Account.Internal var callbackUrl = Url.Page( "/Account/ConfirmEmail", pageHandler: null, - values: new { area = "Identity", userId = userId, code = code }, + values: new { area = "Identity", userId = userId, code = code, returnUrl = returnUrl }, protocol: Request.Scheme); await _emailSender.SendEmailAsync(Input.Email, "Confirm your email", @@ -155,7 +155,7 @@ namespace Microsoft.AspNetCore.Identity.UI.V3.Pages.Account.Internal if (_userManager.Options.SignIn.RequireConfirmedAccount) { - return RedirectToPage("RegisterConfirmation", new { email = Input.Email }); + return RedirectToPage("RegisterConfirmation", new { email = Input.Email, returnUrl = returnUrl }); } else { diff --git a/src/Identity/UI/src/Areas/Identity/Pages/V3/Account/RegisterConfirmation.cshtml.cs b/src/Identity/UI/src/Areas/Identity/Pages/V3/Account/RegisterConfirmation.cshtml.cs index 39db719ff9..0220bb7bd1 100644 --- a/src/Identity/UI/src/Areas/Identity/Pages/V3/Account/RegisterConfirmation.cshtml.cs +++ b/src/Identity/UI/src/Areas/Identity/Pages/V3/Account/RegisterConfirmation.cshtml.cs @@ -43,7 +43,7 @@ namespace Microsoft.AspNetCore.Identity.UI.V3.Pages.Account.Internal /// This API supports the ASP.NET Core Identity default UI infrastructure and is not intended to be used /// directly from your code. This API may change or be removed in future releases. /// - public virtual Task OnGetAsync(string email) => throw new NotImplementedException(); + public virtual Task OnGetAsync(string email, string returnUrl = null) => throw new NotImplementedException(); } internal class RegisterConfirmationModel : RegisterConfirmationModel where TUser : class @@ -57,12 +57,13 @@ namespace Microsoft.AspNetCore.Identity.UI.V3.Pages.Account.Internal _sender = sender; } - public override async Task OnGetAsync(string email) + public override async Task OnGetAsync(string email, string returnUrl = null) { if (email == null) { return RedirectToPage("/Index"); } + returnUrl = returnUrl ?? Url.Content("~/"); var user = await _userManager.FindByEmailAsync(email); if (user == null) @@ -81,7 +82,7 @@ namespace Microsoft.AspNetCore.Identity.UI.V3.Pages.Account.Internal EmailConfirmationUrl = Url.Page( "/Account/ConfirmEmail", pageHandler: null, - values: new { area = "Identity", userId = userId, code = code }, + values: new { area = "Identity", userId = userId, code = code, returnUrl = returnUrl }, protocol: Request.Scheme); } diff --git a/src/Identity/UI/src/Areas/Identity/Pages/V4/Account/Register.cshtml.cs b/src/Identity/UI/src/Areas/Identity/Pages/V4/Account/Register.cshtml.cs index 512adeb754..8e2a7e2faf 100644 --- a/src/Identity/UI/src/Areas/Identity/Pages/V4/Account/Register.cshtml.cs +++ b/src/Identity/UI/src/Areas/Identity/Pages/V4/Account/Register.cshtml.cs @@ -146,7 +146,7 @@ namespace Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal var callbackUrl = Url.Page( "/Account/ConfirmEmail", pageHandler: null, - values: new { area = "Identity", userId = userId, code = code }, + values: new { area = "Identity", userId = userId, code = code, returnUrl = returnUrl }, protocol: Request.Scheme); await _emailSender.SendEmailAsync(Input.Email, "Confirm your email", @@ -154,7 +154,7 @@ namespace Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal if (_userManager.Options.SignIn.RequireConfirmedAccount) { - return RedirectToPage("RegisterConfirmation", new { email = Input.Email }); + return RedirectToPage("RegisterConfirmation", new { email = Input.Email, returnUrl = returnUrl }); } else { diff --git a/src/Identity/UI/src/Areas/Identity/Pages/V4/Account/RegisterConfirmation.cshtml.cs b/src/Identity/UI/src/Areas/Identity/Pages/V4/Account/RegisterConfirmation.cshtml.cs index aa32c17361..7b88864fa0 100644 --- a/src/Identity/UI/src/Areas/Identity/Pages/V4/Account/RegisterConfirmation.cshtml.cs +++ b/src/Identity/UI/src/Areas/Identity/Pages/V4/Account/RegisterConfirmation.cshtml.cs @@ -43,7 +43,7 @@ namespace Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal /// This API supports the ASP.NET Core Identity default UI infrastructure and is not intended to be used /// directly from your code. This API may change or be removed in future releases. /// - public virtual Task OnGetAsync(string email) => throw new NotImplementedException(); + public virtual Task OnGetAsync(string email, string returnUrl = null) => throw new NotImplementedException(); } internal class RegisterConfirmationModel : RegisterConfirmationModel where TUser : class @@ -57,12 +57,13 @@ namespace Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal _sender = sender; } - public override async Task OnGetAsync(string email) + public override async Task OnGetAsync(string email, string returnUrl = null) { if (email == null) { return RedirectToPage("/Index"); } + returnUrl = returnUrl ?? Url.Content("~/"); var user = await _userManager.FindByEmailAsync(email); if (user == null) @@ -81,7 +82,7 @@ namespace Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal EmailConfirmationUrl = Url.Page( "/Account/ConfirmEmail", pageHandler: null, - values: new { area = "Identity", userId = userId, code = code }, + values: new { area = "Identity", userId = userId, code = code, returnUrl = returnUrl }, protocol: Request.Scheme); } diff --git a/src/Identity/test/Identity.FunctionalTests/Pages/Account/Register.cs b/src/Identity/test/Identity.FunctionalTests/Pages/Account/Register.cs index cbddb15df4..52d883cbf1 100644 --- a/src/Identity/test/Identity.FunctionalTests/Pages/Account/Register.cs +++ b/src/Identity/test/Identity.FunctionalTests/Pages/Account/Register.cs @@ -64,7 +64,7 @@ namespace Microsoft.AspNetCore.Identity.FunctionalTests.Account }); var registeredLocation = ResponseAssert.IsRedirect(registered); - Assert.Equal(RegisterConfirmation.Path + "?email="+userName, registeredLocation.ToString()); + Assert.Equal(RegisterConfirmation.Path + "?email="+userName+"&returnUrl=%2F", registeredLocation.ToString()); var registerResponse = await Client.GetAsync(registeredLocation); var register = await ResponseAssert.IsHtmlDocumentAsync(registerResponse); From a4af6185ea14f8d498db324806bb67471d3c1e23 Mon Sep 17 00:00:00 2001 From: Stephen Halter Date: Thu, 17 Oct 2019 13:31:25 -0700 Subject: [PATCH 11/32] Add "allowReconnect" to SignalR CloseMessages (#14908) --- .../src/BlazorPack/BlazorPackHubProtocol.cs | 34 +++- .../csharp/Client.Core/src/HubConnection.cs | 35 ++-- .../UnitTests/HubConnectionTests.Reconnect.cs | 150 ++++++++++++++++++ .../src/MessagePackHubProtocol.ts | 1 + .../clients/ts/signalr/src/HubConnection.ts | 14 +- .../clients/ts/signalr/src/IHubProtocol.ts | 3 + .../tests/HubConnection.Reconnect.test.ts | 57 +++++++ .../ts/signalr/tests/HubConnection.test.ts | 2 + .../src/Protocol/JsonHubProtocol.cs | 21 ++- .../src/Protocol/MessagePackHubProtocol.cs | 40 ++++- .../src/Protocol/NewtonsoftJsonHubProtocol.cs | 20 ++- src/SignalR/common/Shared/JsonUtils.cs | 12 ++ .../common/Shared/SystemTextJsonExtensions.cs | 12 ++ ...ft.AspNetCore.SignalR.Common.netcoreapp.cs | 2 + ...spNetCore.SignalR.Common.netstandard2.0.cs | 2 + .../src/Protocol/CloseMessage.cs | 26 ++- .../Protocol/JsonHubProtocolTestsBase.cs | 2 + .../MessagePackHubProtocolTestBase.cs | 18 +++ src/SignalR/docs/specs/HubProtocol.md | 30 +++- .../server/Core/src/HubConnectionContext.cs | 26 ++- .../server/Core/src/HubConnectionHandler.cs | 13 +- 21 files changed, 471 insertions(+), 49 deletions(-) diff --git a/src/Components/Server/src/BlazorPack/BlazorPackHubProtocol.cs b/src/Components/Server/src/BlazorPack/BlazorPackHubProtocol.cs index 32034b556e..bc5b7825df 100644 --- a/src/Components/Server/src/BlazorPack/BlazorPackHubProtocol.cs +++ b/src/Components/Server/src/BlazorPack/BlazorPackHubProtocol.cs @@ -78,7 +78,7 @@ namespace Microsoft.AspNetCore.Components.Server.BlazorPack message = PingMessage.Instance; return true; case HubProtocolConstants.CloseMessageType: - message = CreateCloseMessage(ref reader); + message = CreateCloseMessage(ref reader, itemCount); return true; default: // Future protocol changes can add message types, old clients can ignore them @@ -196,10 +196,23 @@ namespace Microsoft.AspNetCore.Components.Server.BlazorPack return ApplyHeaders(headers, new CancelInvocationMessage(invocationId)); } - private static CloseMessage CreateCloseMessage(ref MessagePackReader reader) + private static CloseMessage CreateCloseMessage(ref MessagePackReader reader, int itemCount) { var error = ReadString(ref reader, "error"); - return new CloseMessage(error); + var allowReconnect = false; + + if (itemCount > 2) + { + allowReconnect = ReadBoolean(ref reader, "allowReconnect"); + } + + // An empty string is still an error + if (error == null && !allowReconnect) + { + return CloseMessage.Empty; + } + + return new CloseMessage(error, allowReconnect); } private static Dictionary ReadHeaders(ref MessagePackReader reader) @@ -515,7 +528,7 @@ namespace Microsoft.AspNetCore.Components.Server.BlazorPack private void WriteCloseMessage(CloseMessage message, ref MessagePackWriter writer) { - writer.WriteArrayHeader(2); + writer.WriteArrayHeader(3); writer.Write(HubProtocolConstants.CloseMessageType); if (string.IsNullOrEmpty(message.Error)) { @@ -525,6 +538,8 @@ namespace Microsoft.AspNetCore.Components.Server.BlazorPack { writer.Write(message.Error); } + + writer.Write(message.AllowReconnect); } private void WritePingMessage(PingMessage _, ref MessagePackWriter writer) @@ -559,6 +574,17 @@ namespace Microsoft.AspNetCore.Components.Server.BlazorPack return destination; } + [MethodImpl(MethodImplOptions.AggressiveInlining)] + private static bool ReadBoolean(ref MessagePackReader reader, string field) + { + if (reader.End || reader.NextMessagePackType != MessagePackType.Boolean) + { + ThrowInvalidDataException(field, "Boolean"); + } + + return reader.ReadBoolean(); + } + [MethodImpl(MethodImplOptions.AggressiveInlining)] private static int ReadInt32(ref MessagePackReader reader, string field) { diff --git a/src/SignalR/clients/csharp/Client.Core/src/HubConnection.cs b/src/SignalR/clients/csharp/Client.Core/src/HubConnection.cs index 5e04bd309a..caf9a4b514 100644 --- a/src/SignalR/clients/csharp/Client.Core/src/HubConnection.cs +++ b/src/SignalR/clients/csharp/Client.Core/src/HubConnection.cs @@ -878,7 +878,7 @@ namespace Microsoft.AspNetCore.SignalR.Client } } - private async Task<(bool close, Exception exception)> ProcessMessagesAsync(HubMessage message, ConnectionState connectionState, ChannelWriter invocationMessageWriter) + private async Task ProcessMessagesAsync(HubMessage message, ConnectionState connectionState, ChannelWriter invocationMessageWriter) { Log.ResettingKeepAliveTimer(_logger); connectionState.ResetTimeout(); @@ -911,7 +911,7 @@ namespace Microsoft.AspNetCore.SignalR.Client if (!connectionState.TryGetInvocation(streamItem.InvocationId, out irq)) { Log.DroppedStreamMessage(_logger, streamItem.InvocationId); - return (close: false, exception: null); + break; } await DispatchInvocationStreamItemAsync(streamItem, irq); break; @@ -919,13 +919,12 @@ namespace Microsoft.AspNetCore.SignalR.Client if (string.IsNullOrEmpty(close.Error)) { Log.ReceivedClose(_logger); - return (close: true, exception: null); } else { Log.ReceivedCloseWithError(_logger, close.Error); - return (close: true, exception: new HubException($"The server closed the connection with the following error: {close.Error}")); } + return close; case PingMessage _: Log.ReceivedPing(_logger); // timeout is reset above, on receiving any message @@ -934,7 +933,7 @@ namespace Microsoft.AspNetCore.SignalR.Client throw new InvalidOperationException($"Unexpected message type: {message.GetType().FullName}"); } - return (close: false, exception: null); + return null; } private async Task DispatchInvocationAsync(InvocationMessage invocation) @@ -1150,25 +1149,33 @@ namespace Microsoft.AspNetCore.SignalR.Client { Log.ProcessingMessage(_logger, buffer.Length); - var close = false; + CloseMessage closeMessage = null; while (_protocol.TryParseMessage(ref buffer, connectionState, out var message)) { - Exception exception; - // We have data, process it - (close, exception) = await ProcessMessagesAsync(message, connectionState, invocationMessageChannel.Writer); - if (close) + closeMessage = await ProcessMessagesAsync(message, connectionState, invocationMessageChannel.Writer); + + if (closeMessage != null) { // Closing because we got a close frame, possibly with an error in it. - connectionState.CloseException = exception; - connectionState.Stopping = true; + if (closeMessage.Error != null) + { + connectionState.CloseException = new HubException($"The server closed the connection with the following error: {closeMessage.Error}"); + } + + // Stopping being true indicates the client shouldn't try to reconnect even if automatic reconnects are enabled. + if (!closeMessage.AllowReconnect) + { + connectionState.Stopping = true; + } + break; } } // If we're closing stop everything - if (close) + if (closeMessage != null) { break; } @@ -1637,6 +1644,8 @@ namespace Microsoft.AspNetCore.SignalR.Client public Exception CloseException { get; set; } public CancellationToken UploadStreamToken { get; set; } + // Indicates the connection is stopping AND the client should NOT attempt to reconnect even if automatic reconnects are enabled. + // This means either HubConnection.DisposeAsync/StopAsync was called OR a CloseMessage with AllowReconnects set to false was received. public bool Stopping { get => _stopping; diff --git a/src/SignalR/clients/csharp/Client/test/UnitTests/HubConnectionTests.Reconnect.cs b/src/SignalR/clients/csharp/Client/test/UnitTests/HubConnectionTests.Reconnect.cs index 8b1743fdef..9c46f0e0d6 100644 --- a/src/SignalR/clients/csharp/Client/test/UnitTests/HubConnectionTests.Reconnect.cs +++ b/src/SignalR/clients/csharp/Client/test/UnitTests/HubConnectionTests.Reconnect.cs @@ -368,6 +368,156 @@ namespace Microsoft.AspNetCore.SignalR.Client.Tests } } + [Fact] + public async Task CanBeInducedByCloseMessageWithAllowReconnectSet() + { + bool ExpectedErrors(WriteContext writeContext) + { + return writeContext.LoggerName == typeof(HubConnection).FullName && + (writeContext.EventId.Name == "ReceivedCloseWithError" || + writeContext.EventId.Name == "ReconnectingWithError"); + } + + var failReconnectTcs = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously); + + using (StartVerifiableLog(ExpectedErrors)) + { + var builder = new HubConnectionBuilder().WithLoggerFactory(LoggerFactory).WithUrl("http://example.com"); + var testConnectionFactory = default(ReconnectingConnectionFactory); + + testConnectionFactory = new ReconnectingConnectionFactory(() => new TestConnection()); + builder.Services.AddSingleton(testConnectionFactory); + + var retryContexts = new List(); + var mockReconnectPolicy = new Mock(); + mockReconnectPolicy.Setup(p => p.NextRetryDelay(It.IsAny())).Returns(context => + { + retryContexts.Add(context); + return TimeSpan.Zero; + }); + builder.WithAutomaticReconnect(mockReconnectPolicy.Object); + + await using var hubConnection = builder.Build(); + var reconnectingCount = 0; + var reconnectedCount = 0; + var reconnectingErrorTcs = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously); + var reconnectedConnectionIdTcs = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously); + var closedErrorTcs = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously); + + hubConnection.Reconnecting += error => + { + reconnectingCount++; + reconnectingErrorTcs.SetResult(error); + return Task.CompletedTask; + }; + + hubConnection.Reconnected += connectionId => + { + reconnectedCount++; + reconnectedConnectionIdTcs.SetResult(connectionId); + return Task.CompletedTask; + }; + + hubConnection.Closed += error => + { + closedErrorTcs.SetResult(error); + return Task.CompletedTask; + }; + + await hubConnection.StartAsync().OrTimeout(); + + var currentConnection = await testConnectionFactory.GetNextOrCurrentTestConnection(); + await currentConnection.ReceiveJsonMessage(new + { + type = HubProtocolConstants.CloseMessageType, + error = "Error!", + allowReconnect = true, + }); + + var reconnectingException = await reconnectingErrorTcs.Task.OrTimeout(); + var expectedMessage = "The server closed the connection with the following error: Error!"; + + Assert.Equal(expectedMessage, reconnectingException.Message); + Assert.Single(retryContexts); + Assert.Equal(expectedMessage, retryContexts[0].RetryReason.Message); + Assert.Equal(0, retryContexts[0].PreviousRetryCount); + Assert.Equal(TimeSpan.Zero, retryContexts[0].ElapsedTime); + + await reconnectedConnectionIdTcs.Task.OrTimeout(); + + await hubConnection.StopAsync().OrTimeout(); + + var closeError = await closedErrorTcs.Task.OrTimeout(); + Assert.Null(closeError); + Assert.Equal(1, reconnectingCount); + Assert.Equal(1, reconnectedCount); + } + } + + [Fact] + public async Task CannotBeInducedByCloseMessageWithAllowReconnectOmitted() + { + bool ExpectedErrors(WriteContext writeContext) + { + return writeContext.LoggerName == typeof(HubConnection).FullName && + (writeContext.EventId.Name == "ReceivedCloseWithError" || + writeContext.EventId.Name == "ShutdownWithError"); + } + + var failReconnectTcs = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously); + + using (StartVerifiableLog(ExpectedErrors)) + { + var builder = new HubConnectionBuilder().WithLoggerFactory(LoggerFactory).WithUrl("http://example.com"); + var testConnectionFactory = default(ReconnectingConnectionFactory); + + testConnectionFactory = new ReconnectingConnectionFactory(() => new TestConnection()); + builder.Services.AddSingleton(testConnectionFactory); + + var reconnectingCount = 0; + var nextRetryDelayCallCount = 0; + var closedErrorTcs = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously); + + var mockReconnectPolicy = new Mock(); + mockReconnectPolicy.Setup(p => p.NextRetryDelay(It.IsAny())).Returns(context => + { + nextRetryDelayCallCount++; + return TimeSpan.Zero; + }); + + builder.WithAutomaticReconnect(mockReconnectPolicy.Object); + + await using var hubConnection = builder.Build(); + + hubConnection.Reconnecting += error => + { + reconnectingCount++; + return Task.CompletedTask; + }; + + hubConnection.Closed += error => + { + closedErrorTcs.SetResult(error); + return Task.CompletedTask; + }; + + await hubConnection.StartAsync().OrTimeout(); + + var currentConnection = await testConnectionFactory.GetNextOrCurrentTestConnection(); + await currentConnection.ReceiveJsonMessage(new + { + type = HubProtocolConstants.CloseMessageType, + error = "Error!", + }); + + var closeError = await closedErrorTcs.Task.OrTimeout(); + + Assert.Equal("The server closed the connection with the following error: Error!", closeError.Message); + Assert.Equal(0, nextRetryDelayCallCount); + Assert.Equal(0, reconnectingCount); + } + } + [Fact] public async Task EventsNotFiredIfFirstRetryDelayIsNull() { diff --git a/src/SignalR/clients/ts/signalr-protocol-msgpack/src/MessagePackHubProtocol.ts b/src/SignalR/clients/ts/signalr-protocol-msgpack/src/MessagePackHubProtocol.ts index 769b96d28a..66b0a893af 100644 --- a/src/SignalR/clients/ts/signalr-protocol-msgpack/src/MessagePackHubProtocol.ts +++ b/src/SignalR/clients/ts/signalr-protocol-msgpack/src/MessagePackHubProtocol.ts @@ -124,6 +124,7 @@ export class MessagePackHubProtocol implements IHubProtocol { return { // Close messages have no headers. + allowReconnect: properties.length >= 3 ? properties[2] : undefined, error: properties[1], type: MessageType.Close, } as HubMessage; diff --git a/src/SignalR/clients/ts/signalr/src/HubConnection.ts b/src/SignalR/clients/ts/signalr/src/HubConnection.ts index d47006b1d3..62190c166c 100644 --- a/src/SignalR/clients/ts/signalr/src/HubConnection.ts +++ b/src/SignalR/clients/ts/signalr/src/HubConnection.ts @@ -545,8 +545,18 @@ export class HubConnection { case MessageType.Close: this.logger.log(LogLevel.Information, "Close message received from server."); - // We don't want to wait on the stop itself. - this.stopPromise = this.stopInternal(message.error ? new Error("Server returned an error on close: " + message.error) : undefined); + const error = message.error ? new Error("Server returned an error on close: " + message.error) : undefined; + + if (message.allowReconnect === true) { + // It feels wrong not to await connection.stop() here, but processIncomingData is called as part of an onreceive callback which is not async, + // this is already the behavior for serverTimeout(), and HttpConnection.Stop() should catch and log all possible exceptions. + + // tslint:disable-next-line:no-floating-promises + this.connection.stop(error); + } else { + // We cannot await stopInternal() here, but subsequent calls to stop() will await this if stopInternal() is still ongoing. + this.stopPromise = this.stopInternal(error); + } break; default: diff --git a/src/SignalR/clients/ts/signalr/src/IHubProtocol.ts b/src/SignalR/clients/ts/signalr/src/IHubProtocol.ts index ea48040298..7a250dbc41 100644 --- a/src/SignalR/clients/ts/signalr/src/IHubProtocol.ts +++ b/src/SignalR/clients/ts/signalr/src/IHubProtocol.ts @@ -131,6 +131,9 @@ export interface CloseMessage extends HubMessageBase { * If this property is undefined, the connection was closed normally and without error. */ readonly error?: string; + + /** If true, clients with automatic reconnects enabled should attempt to reconnect after receiving the CloseMessage. Otherwise, they should not. */ + readonly allowReconnect?: boolean; } /** A hub message sent to request that a streaming invocation be canceled. */ diff --git a/src/SignalR/clients/ts/signalr/tests/HubConnection.Reconnect.test.ts b/src/SignalR/clients/ts/signalr/tests/HubConnection.Reconnect.test.ts index 542a5217d9..15e5e953a0 100644 --- a/src/SignalR/clients/ts/signalr/tests/HubConnection.Reconnect.test.ts +++ b/src/SignalR/clients/ts/signalr/tests/HubConnection.Reconnect.test.ts @@ -3,6 +3,7 @@ import { DefaultReconnectPolicy } from "../src/DefaultReconnectPolicy"; import { HubConnection, HubConnectionState } from "../src/HubConnection"; +import { MessageType } from "../src/IHubProtocol"; import { RetryContext } from "../src/IRetryPolicy"; import { JsonHubProtocol } from "../src/JsonHubProtocol"; @@ -728,4 +729,60 @@ describe("auto reconnect", () => { expect(closeCount).toBe(1); }); }); + + it("reconnect on close message if allowReconnect is true and auto reconnect is enabled", async () => { + await VerifyLogger.run(async (logger) => { + const connection = new TestConnection(); + const hubConnection = HubConnection.create(connection, logger, new JsonHubProtocol(), new DefaultReconnectPolicy()); + try { + let isReconnecting = false; + let reconnectingError: Error | undefined; + + hubConnection.onreconnecting((e) => { + isReconnecting = true; + reconnectingError = e; + }); + + await hubConnection.start(); + + connection.receive({ + allowReconnect: true, + error: "Error!", + type: MessageType.Close, + }); + + expect(isReconnecting).toEqual(true); + expect(reconnectingError!.message).toEqual("Server returned an error on close: Error!"); + } finally { + await hubConnection.stop(); + } + }); + }); + + it("stop on close message if allowReconnect is missing and auto reconnect is enabled", async () => { + await VerifyLogger.run(async (logger) => { + const connection = new TestConnection(); + const hubConnection = HubConnection.create(connection, logger, new JsonHubProtocol(), new DefaultReconnectPolicy()); + try { + let isClosed = false; + let closeError: Error | undefined; + hubConnection.onclose((e) => { + isClosed = true; + closeError = e; + }); + + await hubConnection.start(); + + connection.receive({ + error: "Error!", + type: MessageType.Close, + }); + + expect(isClosed).toEqual(true); + expect(closeError!.message).toEqual("Server returned an error on close: Error!"); + } finally { + await hubConnection.stop(); + } + }); + }); }); diff --git a/src/SignalR/clients/ts/signalr/tests/HubConnection.test.ts b/src/SignalR/clients/ts/signalr/tests/HubConnection.test.ts index 2335e413e9..1cb682cabb 100644 --- a/src/SignalR/clients/ts/signalr/tests/HubConnection.test.ts +++ b/src/SignalR/clients/ts/signalr/tests/HubConnection.test.ts @@ -822,7 +822,9 @@ describe("HubConnection", () => { await hubConnection.start(); + // allowReconnect Should have no effect since auto reconnect is disabled by default. connection.receive({ + allowReconnect: true, error: "Error!", type: MessageType.Close, }); diff --git a/src/SignalR/common/Protocols.Json/src/Protocol/JsonHubProtocol.cs b/src/SignalR/common/Protocols.Json/src/Protocol/JsonHubProtocol.cs index 884e427b68..a5696467bf 100644 --- a/src/SignalR/common/Protocols.Json/src/Protocol/JsonHubProtocol.cs +++ b/src/SignalR/common/Protocols.Json/src/Protocol/JsonHubProtocol.cs @@ -31,6 +31,8 @@ namespace Microsoft.AspNetCore.SignalR.Protocol private static JsonEncodedText TypePropertyNameBytes = JsonEncodedText.Encode(TypePropertyName); private const string ErrorPropertyName = "error"; private static JsonEncodedText ErrorPropertyNameBytes = JsonEncodedText.Encode(ErrorPropertyName); + private const string AllowReconnectPropertyName = "allowReconnect"; + private static JsonEncodedText AllowReconnectPropertyNameBytes = JsonEncodedText.Encode(AllowReconnectPropertyName); private const string TargetPropertyName = "target"; private static JsonEncodedText TargetPropertyNameBytes = JsonEncodedText.Encode(TargetPropertyName); private const string ArgumentsPropertyName = "arguments"; @@ -132,6 +134,7 @@ namespace Microsoft.AspNetCore.SignalR.Protocol ExceptionDispatchInfo argumentBindingException = null; Dictionary headers = null; var completed = false; + var allowReconnect = false; var reader = new Utf8JsonReader(input, isFinalBlock: true, state: default); @@ -186,6 +189,10 @@ namespace Microsoft.AspNetCore.SignalR.Protocol { error = reader.ReadAsString(ErrorPropertyName); } + else if (reader.ValueTextEquals(AllowReconnectPropertyNameBytes.EncodedUtf8Bytes)) + { + allowReconnect = reader.ReadAsBoolean(AllowReconnectPropertyName); + } else if (reader.ValueTextEquals(ResultPropertyNameBytes.EncodedUtf8Bytes)) { hasResult = true; @@ -372,7 +379,7 @@ namespace Microsoft.AspNetCore.SignalR.Protocol case HubProtocolConstants.PingMessageType: return PingMessage.Instance; case HubProtocolConstants.CloseMessageType: - return BindCloseMessage(error); + return BindCloseMessage(error, allowReconnect); case null: throw new InvalidDataException($"Missing required property '{TypePropertyName}'."); default: @@ -544,6 +551,11 @@ namespace Microsoft.AspNetCore.SignalR.Protocol { writer.WriteString(ErrorPropertyNameBytes, message.Error); } + + if (message.AllowReconnect) + { + writer.WriteBoolean(AllowReconnectPropertyNameBytes, true); + } } private void WriteArguments(object[] arguments, Utf8JsonWriter writer) @@ -722,16 +734,15 @@ namespace Microsoft.AspNetCore.SignalR.Protocol return arguments ?? Array.Empty(); } - private CloseMessage BindCloseMessage(string error) + private CloseMessage BindCloseMessage(string error, bool allowReconnect) { // An empty string is still an error - if (error == null) + if (error == null && !allowReconnect) { return CloseMessage.Empty; } - var message = new CloseMessage(error); - return message; + return new CloseMessage(error, allowReconnect); } private HubMessage ApplyHeaders(HubMessage message, Dictionary headers) diff --git a/src/SignalR/common/Protocols.MessagePack/src/Protocol/MessagePackHubProtocol.cs b/src/SignalR/common/Protocols.MessagePack/src/Protocol/MessagePackHubProtocol.cs index 34dc7756fb..78631d3c7f 100644 --- a/src/SignalR/common/Protocols.MessagePack/src/Protocol/MessagePackHubProtocol.cs +++ b/src/SignalR/common/Protocols.MessagePack/src/Protocol/MessagePackHubProtocol.cs @@ -137,7 +137,7 @@ namespace Microsoft.AspNetCore.SignalR.Protocol case HubProtocolConstants.PingMessageType: return PingMessage.Instance; case HubProtocolConstants.CloseMessageType: - return CreateCloseMessage(input, ref startOffset); + return CreateCloseMessage(input, ref startOffset, itemCount); default: // Future protocol changes can add message types, old clients can ignore them return null; @@ -261,10 +261,23 @@ namespace Microsoft.AspNetCore.SignalR.Protocol return ApplyHeaders(headers, new CancelInvocationMessage(invocationId)); } - private static CloseMessage CreateCloseMessage(byte[] input, ref int offset) + private static CloseMessage CreateCloseMessage(byte[] input, ref int offset, int itemCount) { var error = ReadString(input, ref offset, "error"); - return new CloseMessage(error); + var allowReconnect = false; + + if (itemCount > 2) + { + allowReconnect = ReadBoolean(input, ref offset, "allowReconnect"); + } + + // An empty string is still an error + if (error == null && !allowReconnect) + { + return CloseMessage.Empty; + } + + return new CloseMessage(error, allowReconnect); } private static Dictionary ReadHeaders(byte[] input, ref int offset) @@ -533,7 +546,7 @@ namespace Microsoft.AspNetCore.SignalR.Protocol private void WriteCloseMessage(CloseMessage message, Stream packer) { - MessagePackBinary.WriteArrayHeader(packer, 2); + MessagePackBinary.WriteArrayHeader(packer, 3); MessagePackBinary.WriteInt16(packer, HubProtocolConstants.CloseMessageType); if (string.IsNullOrEmpty(message.Error)) { @@ -543,6 +556,8 @@ namespace Microsoft.AspNetCore.SignalR.Protocol { MessagePackBinary.WriteString(packer, message.Error); } + + MessagePackBinary.WriteBoolean(packer, message.AllowReconnect); } private void WritePingMessage(PingMessage pingMessage, Stream packer) @@ -576,6 +591,23 @@ namespace Microsoft.AspNetCore.SignalR.Protocol return ReadString(input, ref offset, "invocationId"); } + private static bool ReadBoolean(byte[] input, ref int offset, string field) + { + Exception msgPackException = null; + try + { + var readBool = MessagePackBinary.ReadBoolean(input, offset, out var readSize); + offset += readSize; + return readBool; + } + catch (Exception e) + { + msgPackException = e; + } + + throw new InvalidDataException($"Reading '{field}' as Boolean failed.", msgPackException); + } + private static int ReadInt32(byte[] input, ref int offset, string field) { Exception msgPackException = null; diff --git a/src/SignalR/common/Protocols.NewtonsoftJson/src/Protocol/NewtonsoftJsonHubProtocol.cs b/src/SignalR/common/Protocols.NewtonsoftJson/src/Protocol/NewtonsoftJsonHubProtocol.cs index 420d32d9b5..f700261a5e 100644 --- a/src/SignalR/common/Protocols.NewtonsoftJson/src/Protocol/NewtonsoftJsonHubProtocol.cs +++ b/src/SignalR/common/Protocols.NewtonsoftJson/src/Protocol/NewtonsoftJsonHubProtocol.cs @@ -30,6 +30,7 @@ namespace Microsoft.AspNetCore.SignalR.Protocol private const string TargetPropertyName = "target"; private const string ArgumentsPropertyName = "arguments"; private const string HeadersPropertyName = "headers"; + private const string AllowReconnectPropertyName = "allowReconnect"; private static readonly string ProtocolName = "json"; private static readonly int ProtocolVersion = 1; @@ -131,6 +132,7 @@ namespace Microsoft.AspNetCore.SignalR.Protocol ExceptionDispatchInfo argumentBindingException = null; Dictionary headers = null; var completed = false; + var allowReconnect = false; using (var reader = JsonUtils.CreateJsonTextReader(textReader)) { @@ -187,6 +189,9 @@ namespace Microsoft.AspNetCore.SignalR.Protocol case ErrorPropertyName: error = JsonUtils.ReadAsString(reader, ErrorPropertyName); break; + case AllowReconnectPropertyName: + allowReconnect = JsonUtils.ReadAsBoolean(reader, AllowReconnectPropertyName); + break; case ResultPropertyName: hasResult = true; @@ -373,7 +378,7 @@ namespace Microsoft.AspNetCore.SignalR.Protocol case HubProtocolConstants.PingMessageType: return PingMessage.Instance; case HubProtocolConstants.CloseMessageType: - return BindCloseMessage(error); + return BindCloseMessage(error, allowReconnect); case null: throw new InvalidDataException($"Missing required property '{TypePropertyName}'."); default: @@ -550,6 +555,12 @@ namespace Microsoft.AspNetCore.SignalR.Protocol writer.WritePropertyName(ErrorPropertyName); writer.WriteValue(message.Error); } + + if (message.AllowReconnect) + { + writer.WritePropertyName(AllowReconnectPropertyName); + writer.WriteValue(true); + } } private void WriteArguments(object[] arguments, JsonTextWriter writer) @@ -733,16 +744,15 @@ namespace Microsoft.AspNetCore.SignalR.Protocol throw new JsonReaderException("Unexpected end when reading JSON"); } - private CloseMessage BindCloseMessage(string error) + private CloseMessage BindCloseMessage(string error, bool allowReconnect) { // An empty string is still an error - if (error == null) + if (error == null && !allowReconnect) { return CloseMessage.Empty; } - var message = new CloseMessage(error); - return message; + return new CloseMessage(error, allowReconnect); } private object[] BindArguments(JArray args, IReadOnlyList paramTypes) diff --git a/src/SignalR/common/Shared/JsonUtils.cs b/src/SignalR/common/Shared/JsonUtils.cs index 4b09210210..22a3690470 100644 --- a/src/SignalR/common/Shared/JsonUtils.cs +++ b/src/SignalR/common/Shared/JsonUtils.cs @@ -114,6 +114,18 @@ namespace Microsoft.AspNetCore.Internal } } + public static bool ReadAsBoolean(JsonTextReader reader, string propertyName) + { + reader.Read(); + + if (reader.TokenType != JsonToken.Boolean || reader.Value == null) + { + throw new InvalidDataException($"Expected '{propertyName}' to be of type {JTokenType.Boolean}."); + } + + return Convert.ToBoolean(reader.Value, CultureInfo.InvariantCulture); + } + public static int? ReadAsInt32(JsonTextReader reader, string propertyName) { reader.Read(); diff --git a/src/SignalR/common/Shared/SystemTextJsonExtensions.cs b/src/SignalR/common/Shared/SystemTextJsonExtensions.cs index 766efadb18..f17d38a858 100644 --- a/src/SignalR/common/Shared/SystemTextJsonExtensions.cs +++ b/src/SignalR/common/Shared/SystemTextJsonExtensions.cs @@ -57,6 +57,18 @@ namespace Microsoft.AspNetCore.Internal } } + public static bool ReadAsBoolean(this ref Utf8JsonReader reader, string propertyName) + { + reader.Read(); + + return reader.TokenType switch + { + JsonTokenType.False => false, + JsonTokenType.True => true, + _ => throw new InvalidDataException($"Expected '{propertyName}' to be true or false."), + }; + } + public static string ReadAsString(this ref Utf8JsonReader reader, string propertyName) { reader.Read(); diff --git a/src/SignalR/common/SignalR.Common/ref/Microsoft.AspNetCore.SignalR.Common.netcoreapp.cs b/src/SignalR/common/SignalR.Common/ref/Microsoft.AspNetCore.SignalR.Common.netcoreapp.cs index 9e20659d98..7b8c7751c8 100644 --- a/src/SignalR/common/SignalR.Common/ref/Microsoft.AspNetCore.SignalR.Common.netcoreapp.cs +++ b/src/SignalR/common/SignalR.Common/ref/Microsoft.AspNetCore.SignalR.Common.netcoreapp.cs @@ -31,6 +31,8 @@ namespace Microsoft.AspNetCore.SignalR.Protocol { public static readonly Microsoft.AspNetCore.SignalR.Protocol.CloseMessage Empty; public CloseMessage(string error) { } + public CloseMessage(string error, bool allowReconnect) { } + public bool AllowReconnect { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } } public string Error { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } } } public partial class CompletionMessage : Microsoft.AspNetCore.SignalR.Protocol.HubInvocationMessage diff --git a/src/SignalR/common/SignalR.Common/ref/Microsoft.AspNetCore.SignalR.Common.netstandard2.0.cs b/src/SignalR/common/SignalR.Common/ref/Microsoft.AspNetCore.SignalR.Common.netstandard2.0.cs index 9e20659d98..7b8c7751c8 100644 --- a/src/SignalR/common/SignalR.Common/ref/Microsoft.AspNetCore.SignalR.Common.netstandard2.0.cs +++ b/src/SignalR/common/SignalR.Common/ref/Microsoft.AspNetCore.SignalR.Common.netstandard2.0.cs @@ -31,6 +31,8 @@ namespace Microsoft.AspNetCore.SignalR.Protocol { public static readonly Microsoft.AspNetCore.SignalR.Protocol.CloseMessage Empty; public CloseMessage(string error) { } + public CloseMessage(string error, bool allowReconnect) { } + public bool AllowReconnect { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } } public string Error { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } } } public partial class CompletionMessage : Microsoft.AspNetCore.SignalR.Protocol.HubInvocationMessage diff --git a/src/SignalR/common/SignalR.Common/src/Protocol/CloseMessage.cs b/src/SignalR/common/SignalR.Common/src/Protocol/CloseMessage.cs index 604eeb8299..4dfa28f63d 100644 --- a/src/SignalR/common/SignalR.Common/src/Protocol/CloseMessage.cs +++ b/src/SignalR/common/SignalR.Common/src/Protocol/CloseMessage.cs @@ -12,9 +12,9 @@ namespace Microsoft.AspNetCore.SignalR.Protocol public class CloseMessage : HubMessage { /// - /// An empty close message with no error. + /// An empty close message with no error and set to . /// - public static readonly CloseMessage Empty = new CloseMessage(null); + public static readonly CloseMessage Empty = new CloseMessage(error: null, allowReconnect: false); /// /// Gets the optional error message. @@ -22,12 +22,32 @@ namespace Microsoft.AspNetCore.SignalR.Protocol public string Error { get; } /// - /// Initializes a new instance of the class with an optional error message. + /// If , clients with automatic reconnects enabled should not attempt to automatically reconnect after receiving the . + /// + public bool AllowReconnect { get; } + + /// + /// Initializes a new instance of the class with an optional error message and set to . /// /// An optional error message. public CloseMessage(string error) + : this(error, allowReconnect: false) + { + } + + /// + /// Initializes a new instance of the class with an optional error message and a indicating whether or not a client with + /// automatic reconnects enabled should attempt to reconnect upon receiving the message. + /// + /// An optional error message. + /// + /// , if client with automatic reconnects enabled should attempt to reconnect after receiving the ; + /// , if the client should not try to reconnect whether or not automatic reconnects are enabled. + /// + public CloseMessage(string error, bool allowReconnect) { Error = error; + AllowReconnect = allowReconnect; } } } diff --git a/src/SignalR/common/SignalR.Common/test/Internal/Protocol/JsonHubProtocolTestsBase.cs b/src/SignalR/common/SignalR.Common/test/Internal/Protocol/JsonHubProtocolTestsBase.cs index d0ef4a6e7f..6134d51f16 100644 --- a/src/SignalR/common/SignalR.Common/test/Internal/Protocol/JsonHubProtocolTestsBase.cs +++ b/src/SignalR/common/SignalR.Common/test/Internal/Protocol/JsonHubProtocolTestsBase.cs @@ -67,6 +67,8 @@ namespace Microsoft.AspNetCore.SignalR.Common.Tests.Internal.Protocol new JsonProtocolTestData("CloseMessage_HasError", new CloseMessage("Error!"), false, true, "{\"type\":7,\"error\":\"Error!\"}"), new JsonProtocolTestData("CloseMessage_HasErrorEmptyString", new CloseMessage(""), false, true, "{\"type\":7,\"error\":\"\"}"), new JsonProtocolTestData("CloseMessage_HasErrorWithCamelCase", new CloseMessage("Error!"), true, true, "{\"type\":7,\"error\":\"Error!\"}"), + new JsonProtocolTestData("CloseMessage_HasAllowReconnect", new CloseMessage(error: null, allowReconnect: true), true, true, "{\"type\":7,\"allowReconnect\":true}"), + new JsonProtocolTestData("CloseMessage_HasErrorAndAllowReconnect", new CloseMessage("Error!", allowReconnect: true), true, true, "{\"type\":7,\"error\":\"Error!\",\"allowReconnect\":true}"), }.ToDictionary(t => t.Name); diff --git a/src/SignalR/common/SignalR.Common/test/Internal/Protocol/MessagePackHubProtocolTestBase.cs b/src/SignalR/common/SignalR.Common/test/Internal/Protocol/MessagePackHubProtocolTestBase.cs index f44e029ced..34d97e10f3 100644 --- a/src/SignalR/common/SignalR.Common/test/Internal/Protocol/MessagePackHubProtocolTestBase.cs +++ b/src/SignalR/common/SignalR.Common/test/Internal/Protocol/MessagePackHubProtocolTestBase.cs @@ -178,6 +178,24 @@ namespace Microsoft.AspNetCore.SignalR.Common.Tests.Internal.Protocol name: "Ping", message: PingMessage.Instance, binary: "kQY="), + + // Close Messages + new ProtocolTestData( + name: "CloseMessage", + message: CloseMessage.Empty, + binary: "kwfAwg=="), + new ProtocolTestData( + name: "CloseMessage_HasError", + message: new CloseMessage("Error!"), + binary: "kwemRXJyb3Ihwg=="), + new ProtocolTestData( + name: "CloseMessage_HasAllowReconnect", + message: new CloseMessage(error: null, allowReconnect: true), + binary: "kwfAww=="), + new ProtocolTestData( + name: "CloseMessage_HasErrorAndAllowReconnect", + message: new CloseMessage("Error!", allowReconnect: true), + binary: "kwemRXJyb3Ihww=="), }.ToDictionary(t => t.Name); [Theory] diff --git a/src/SignalR/docs/specs/HubProtocol.md b/src/SignalR/docs/specs/HubProtocol.md index 7056f3632a..50f38e9475 100644 --- a/src/SignalR/docs/specs/HubProtocol.md +++ b/src/SignalR/docs/specs/HubProtocol.md @@ -482,6 +482,7 @@ A `Close` message is a JSON object with the following properties * `type` - A `Number` with the literal value `7`, indicating that this message is a `Close`. * `error` - An optional `String` encoding the error message. +* `allowReconnect` - An optional `Boolean` indicating to clients with automatic reconnects enabled that they should attempt to reconnect after receiving the message. Example - A `Close` message without an error ```json @@ -498,6 +499,15 @@ Example - A `Close` message with an error } ``` +Example - A `Close` message with an error that allows automatic client reconnects. +```json +{ + "type": 7, + "error": "Connection closed because of an error!", + "allowReconnect": true +} +``` + ### JSON Header Encoding Message headers are encoded into a JSON object, with string values, that are stored in the `headers` property. For example: @@ -809,11 +819,12 @@ is decoded as follows: `Close` messages have the following structure ``` -[7, Error] +[7, Error, AllowReconnect?] ``` * `7` - Message Type - `7` indicates this is a `Close` message. * `Error` - Error - A `String` encoding the error for the message. +* `AllowReconnect` - An optional `Boolean` indicating to clients with automatic reconnects enabled that they should attempt to reconnect after receiving the message. Examples: @@ -833,6 +844,23 @@ is decoded as follows: * `0x79` - `y` * `0x7a` - `z` +#### Close message that allows automatic client reconnects + +The following payload: +``` +0x93 0x07 0xa3 0x78 0x79 0x7a 0xc3 +``` + +is decoded as follows: + +* `0x93` - 3-element array +* `0x07` - `7` (Message Type - `Close` message) +* `0xa3` - string of length 3 (Error) +* `0x78` - `x` +* `0x79` - `y` +* `0x7a` - `z` +* `0xc3` - `True` (AllowReconnect) + ### MessagePack Headers Encoding Headers are encoded in MessagePack messages as a Map that immediately follows the type value. The Map can be empty, in which case it is represented by the byte `0x80`. If there are items in the map, diff --git a/src/SignalR/server/Core/src/HubConnectionContext.cs b/src/SignalR/server/Core/src/HubConnectionContext.cs index 90db2563a0..8e9216d35d 100644 --- a/src/SignalR/server/Core/src/HubConnectionContext.cs +++ b/src/SignalR/server/Core/src/HubConnectionContext.cs @@ -42,6 +42,7 @@ namespace Microsoft.AspNetCore.SignalR private ReadOnlyMemory _cachedPingMessage; private bool _clientTimeoutActive; private bool _connectionAborted; + private volatile bool _allowReconnect = true; private int _streamBufferCapacity; private long? _maxMessageSize; @@ -106,6 +107,9 @@ namespace Microsoft.AspNetCore.SignalR /// public virtual IDictionary Items => _connectionContext.Items; + // Used by HubConnectionHandler to determine whether to set CloseMessage.AllowReconnect. + internal bool AllowReconnect => _allowReconnect; + // Used by HubConnectionHandler internal PipeReader Input => _connectionContext.Transport.Input; @@ -201,7 +205,7 @@ namespace Microsoft.AspNetCore.SignalR { Log.FailedWritingMessage(_logger, ex); - Abort(); + AbortAllowReconnect(); return new ValueTask(new FlushResult(isCanceled: false, isCompleted: true)); } @@ -220,7 +224,7 @@ namespace Microsoft.AspNetCore.SignalR { Log.FailedWritingMessage(_logger, ex); - Abort(); + AbortAllowReconnect(); return new ValueTask(new FlushResult(isCanceled: false, isCompleted: true)); } @@ -236,7 +240,7 @@ namespace Microsoft.AspNetCore.SignalR { Log.FailedWritingMessage(_logger, ex); - Abort(); + AbortAllowReconnect(); } finally { @@ -262,7 +266,7 @@ namespace Microsoft.AspNetCore.SignalR catch (Exception ex) { Log.FailedWritingMessage(_logger, ex); - Abort(); + AbortAllowReconnect(); } finally { @@ -287,7 +291,7 @@ namespace Microsoft.AspNetCore.SignalR catch (Exception ex) { Log.FailedWritingMessage(_logger, ex); - Abort(); + AbortAllowReconnect(); } finally { @@ -323,7 +327,7 @@ namespace Microsoft.AspNetCore.SignalR catch (Exception ex) { Log.FailedWritingMessage(_logger, ex); - Abort(); + AbortAllowReconnect(); } finally { @@ -358,6 +362,12 @@ namespace Microsoft.AspNetCore.SignalR /// Aborts the connection. /// public virtual void Abort() + { + _allowReconnect = false; + AbortAllowReconnect(); + } + + private void AbortAllowReconnect() { _connectionAborted = true; @@ -514,7 +524,7 @@ namespace Microsoft.AspNetCore.SignalR // Used by the HubConnectionHandler only internal Task AbortAsync() { - Abort(); + AbortAllowReconnect(); return _abortCompletedTcs.Task; } @@ -560,7 +570,7 @@ namespace Microsoft.AspNetCore.SignalR if (!_receivedMessageThisInterval) { Log.ClientTimeout(_logger, TimeSpan.FromTicks(_clientTimeoutInterval)); - Abort(); + AbortAllowReconnect(); } _receivedMessageThisInterval = false; diff --git a/src/SignalR/server/Core/src/HubConnectionHandler.cs b/src/SignalR/server/Core/src/HubConnectionHandler.cs index 270eb44c0c..bd8b434168 100644 --- a/src/SignalR/server/Core/src/HubConnectionHandler.cs +++ b/src/SignalR/server/Core/src/HubConnectionHandler.cs @@ -126,7 +126,8 @@ namespace Microsoft.AspNetCore.SignalR { Log.ErrorDispatchingHubEvent(_logger, "OnConnectedAsync", ex); - await SendCloseAsync(connection, ex); + // The client shouldn't try to reconnect given an error in OnConnected. + await SendCloseAsync(connection, ex, allowReconnect: false); // return instead of throw to let close message send successfully return; @@ -157,7 +158,7 @@ namespace Microsoft.AspNetCore.SignalR private async Task HubOnDisconnectedAsync(HubConnectionContext connection, Exception exception) { // send close message before aborting the connection - await SendCloseAsync(connection, exception); + await SendCloseAsync(connection, exception, connection.AllowReconnect); // We wait on abort to complete, this is so that we can guarantee that all callbacks have fired // before OnDisconnectedAsync @@ -176,14 +177,18 @@ namespace Microsoft.AspNetCore.SignalR } } - private async Task SendCloseAsync(HubConnectionContext connection, Exception exception) + private async Task SendCloseAsync(HubConnectionContext connection, Exception exception, bool allowReconnect) { var closeMessage = CloseMessage.Empty; if (exception != null) { var errorMessage = ErrorMessageHelper.BuildErrorMessage("Connection closed with an error.", exception, _enableDetailedErrors); - closeMessage = new CloseMessage(errorMessage); + closeMessage = new CloseMessage(errorMessage, allowReconnect); + } + else if (allowReconnect) + { + closeMessage = new CloseMessage(error: null, allowReconnect); } try From c298c94fe1113b64474a3d5fcdef487f02c74991 Mon Sep 17 00:00:00 2001 From: Pranav K Date: Fri, 18 Oct 2019 11:26:17 -0700 Subject: [PATCH 12/32] Validation fixes for Blazor (#14972) * Validation fixes for Blazor * Ensure validation result that are not associated with a member are recorded. Fixes https://github.com/aspnet/AspNetCore/issues/10643 * Add support for showing model-specific errors to ValidationSummary * Add support for nested validation and a more suitable CompareAttribute. Fixes https://github.com/aspnet/AspNetCore/issues/10526 --- eng/ProjectReferences.props | 1 + .../src/ComparePropertyAttribute.cs | 34 ++ ...e.Blazor.DataAnnotations.Validation.csproj | 18 + .../ObjectGraphDataAnnotationsValidator.cs | 125 ++++ .../src/ValidateComplexTypeAttribute.cs | 30 + ...or.DataAnnotations.Validation.Tests.csproj | 11 + ...ObjectGraphDataAnnotationsValidatorTest.cs | 540 ++++++++++++++++++ src/Components/Components.sln | 33 ++ src/Components/ComponentsNoDeps.slnf | 2 + .../EditContextDataAnnotationsExtensions.cs | 6 + .../BlazorServerApp/BlazorServerApp.csproj | 1 + .../Web.JS/dist/Release/blazor.server.js | 2 +- ...ft.AspNetCore.Components.Web.netcoreapp.cs | 2 + ...spNetCore.Components.Web.netstandard2.0.cs | 2 + .../Web/src/Forms/ValidationSummary.cs | 41 +- .../test/E2ETest/Tests/FormsTest.cs | 76 ++- .../FormsTestWithExperimentalValidator.cs | 90 +++ .../BasicTestApp/BasicTestApp.csproj | 1 + .../ExperimentalValidationComponent.razor | 185 ++++++ .../FormsTest/SimpleValidationComponent.razor | 11 +- ...tionComponentUsingExperimentalValidator.cs | 7 + .../TypicalValidationComponent.razor | 20 + ...tionComponentUsingExperimentalValidator.cs | 7 + .../test/testassets/BasicTestApp/Index.razor | 3 + .../BrowserAssertFailedException.cs | 31 +- src/Shared/E2ETesting/WaitAssert.cs | 4 +- 26 files changed, 1241 insertions(+), 42 deletions(-) create mode 100644 src/Components/Blazor/Validation/src/ComparePropertyAttribute.cs create mode 100644 src/Components/Blazor/Validation/src/Microsoft.AspNetCore.Blazor.DataAnnotations.Validation.csproj create mode 100644 src/Components/Blazor/Validation/src/ObjectGraphDataAnnotationsValidator.cs create mode 100644 src/Components/Blazor/Validation/src/ValidateComplexTypeAttribute.cs create mode 100644 src/Components/Blazor/Validation/test/Microsoft.AspNetCore.Blazor.DataAnnotations.Validation.Tests.csproj create mode 100644 src/Components/Blazor/Validation/test/ObjectGraphDataAnnotationsValidatorTest.cs create mode 100644 src/Components/test/E2ETest/Tests/FormsTestWithExperimentalValidator.cs create mode 100644 src/Components/test/testassets/BasicTestApp/FormsTest/ExperimentalValidationComponent.razor create mode 100644 src/Components/test/testassets/BasicTestApp/FormsTest/SimpleValidationComponentUsingExperimentalValidator.cs create mode 100644 src/Components/test/testassets/BasicTestApp/FormsTest/TypicalValidationComponentUsingExperimentalValidator.cs diff --git a/eng/ProjectReferences.props b/eng/ProjectReferences.props index 4210405c67..3ac3e8dbf6 100644 --- a/eng/ProjectReferences.props +++ b/eng/ProjectReferences.props @@ -15,6 +15,7 @@ + diff --git a/src/Components/Blazor/Validation/src/ComparePropertyAttribute.cs b/src/Components/Blazor/Validation/src/ComparePropertyAttribute.cs new file mode 100644 index 0000000000..3f74ce647f --- /dev/null +++ b/src/Components/Blazor/Validation/src/ComparePropertyAttribute.cs @@ -0,0 +1,34 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +namespace System.ComponentModel.DataAnnotations +{ + /// + /// A that compares two properties + /// + [AttributeUsage(AttributeTargets.Property, AllowMultiple = false)] + public sealed class ComparePropertyAttribute : CompareAttribute + { + /// + /// Initializes a new instance of . + /// + /// The property to compare with the current property. + public ComparePropertyAttribute(string otherProperty) + : base(otherProperty) + { + } + + /// + protected override ValidationResult IsValid(object value, ValidationContext validationContext) + { + var validationResult = base.IsValid(value, validationContext); + if (validationResult == ValidationResult.Success) + { + return validationResult; + } + + return new ValidationResult(validationResult.ErrorMessage, new[] { validationContext.MemberName }); + } + } +} + diff --git a/src/Components/Blazor/Validation/src/Microsoft.AspNetCore.Blazor.DataAnnotations.Validation.csproj b/src/Components/Blazor/Validation/src/Microsoft.AspNetCore.Blazor.DataAnnotations.Validation.csproj new file mode 100644 index 0000000000..a166d5f1f3 --- /dev/null +++ b/src/Components/Blazor/Validation/src/Microsoft.AspNetCore.Blazor.DataAnnotations.Validation.csproj @@ -0,0 +1,18 @@ + + + + netstandard2.0 + Provides experimental support for validation using DataAnnotations. + true + false + + + + + + + + + + + diff --git a/src/Components/Blazor/Validation/src/ObjectGraphDataAnnotationsValidator.cs b/src/Components/Blazor/Validation/src/ObjectGraphDataAnnotationsValidator.cs new file mode 100644 index 0000000000..df1971e0a2 --- /dev/null +++ b/src/Components/Blazor/Validation/src/ObjectGraphDataAnnotationsValidator.cs @@ -0,0 +1,125 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; +using System.Linq; + +namespace Microsoft.AspNetCore.Components.Forms +{ + public class ObjectGraphDataAnnotationsValidator : ComponentBase + { + private static readonly object ValidationContextValidatorKey = new object(); + private static readonly object ValidatedObjectsKey = new object(); + private ValidationMessageStore _validationMessageStore; + + [CascadingParameter] + internal EditContext EditContext { get; set; } + + protected override void OnInitialized() + { + _validationMessageStore = new ValidationMessageStore(EditContext); + + // Perform object-level validation (starting from the root model) on request + EditContext.OnValidationRequested += (sender, eventArgs) => + { + _validationMessageStore.Clear(); + ValidateObject(EditContext.Model, new HashSet()); + EditContext.NotifyValidationStateChanged(); + }; + + // Perform per-field validation on each field edit + EditContext.OnFieldChanged += (sender, eventArgs) => + ValidateField(EditContext, _validationMessageStore, eventArgs.FieldIdentifier); + } + + internal void ValidateObject(object value, HashSet visited) + { + if (value is null) + { + return; + } + + if (!visited.Add(value)) + { + // Already visited this object. + return; + } + + if (value is IEnumerable enumerable) + { + var index = 0; + foreach (var item in enumerable) + { + ValidateObject(item, visited); + index++; + } + + return; + } + + var validationResults = new List(); + ValidateObject(value, visited, validationResults); + + // Transfer results to the ValidationMessageStore + foreach (var validationResult in validationResults) + { + if (!validationResult.MemberNames.Any()) + { + _validationMessageStore.Add(new FieldIdentifier(value, string.Empty), validationResult.ErrorMessage); + continue; + } + + foreach (var memberName in validationResult.MemberNames) + { + var fieldIdentifier = new FieldIdentifier(value, memberName); + _validationMessageStore.Add(fieldIdentifier, validationResult.ErrorMessage); + } + } + } + + private void ValidateObject(object value, HashSet visited, List validationResults) + { + var validationContext = new ValidationContext(value); + validationContext.Items.Add(ValidationContextValidatorKey, this); + validationContext.Items.Add(ValidatedObjectsKey, visited); + Validator.TryValidateObject(value, validationContext, validationResults, validateAllProperties: true); + } + + internal static bool TryValidateRecursive(object value, ValidationContext validationContext) + { + if (validationContext.Items.TryGetValue(ValidationContextValidatorKey, out var result) && result is ObjectGraphDataAnnotationsValidator validator) + { + var visited = (HashSet)validationContext.Items[ValidatedObjectsKey]; + validator.ValidateObject(value, visited); + + return true; + } + + return false; + } + + private static void ValidateField(EditContext editContext, ValidationMessageStore messages, in FieldIdentifier fieldIdentifier) + { + // DataAnnotations only validates public properties, so that's all we'll look for + var propertyInfo = fieldIdentifier.Model.GetType().GetProperty(fieldIdentifier.FieldName); + if (propertyInfo != null) + { + var propertyValue = propertyInfo.GetValue(fieldIdentifier.Model); + var validationContext = new ValidationContext(fieldIdentifier.Model) + { + MemberName = propertyInfo.Name + }; + var results = new List(); + + Validator.TryValidateProperty(propertyValue, validationContext, results); + messages.Clear(fieldIdentifier); + messages.Add(fieldIdentifier, results.Select(result => result.ErrorMessage)); + + // We have to notify even if there were no messages before and are still no messages now, + // because the "state" that changed might be the completion of some async validation task + editContext.NotifyValidationStateChanged(); + } + } + } +} diff --git a/src/Components/Blazor/Validation/src/ValidateComplexTypeAttribute.cs b/src/Components/Blazor/Validation/src/ValidateComplexTypeAttribute.cs new file mode 100644 index 0000000000..4769d84767 --- /dev/null +++ b/src/Components/Blazor/Validation/src/ValidateComplexTypeAttribute.cs @@ -0,0 +1,30 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using Microsoft.AspNetCore.Components.Forms; + +namespace System.ComponentModel.DataAnnotations +{ + /// + /// A that indicates that the property is a complex or collection type that further needs to be validated. + /// + /// By default does not recurse in to complex property types during validation. + /// When used in conjunction with , this property allows the validation system to validate + /// complex or collection type properties. + /// + /// + [AttributeUsage(AttributeTargets.Property, AllowMultiple = false)] + public sealed class ValidateComplexTypeAttribute : ValidationAttribute + { + /// + protected override ValidationResult IsValid(object value, ValidationContext validationContext) + { + if (!ObjectGraphDataAnnotationsValidator.TryValidateRecursive(value, validationContext)) + { + throw new InvalidOperationException($"{nameof(ValidateComplexTypeAttribute)} can only used with {nameof(ObjectGraphDataAnnotationsValidator)}."); + } + + return ValidationResult.Success; + } + } +} diff --git a/src/Components/Blazor/Validation/test/Microsoft.AspNetCore.Blazor.DataAnnotations.Validation.Tests.csproj b/src/Components/Blazor/Validation/test/Microsoft.AspNetCore.Blazor.DataAnnotations.Validation.Tests.csproj new file mode 100644 index 0000000000..02e8561536 --- /dev/null +++ b/src/Components/Blazor/Validation/test/Microsoft.AspNetCore.Blazor.DataAnnotations.Validation.Tests.csproj @@ -0,0 +1,11 @@ + + + + $(DefaultNetCoreTargetFramework) + + + + + + + diff --git a/src/Components/Blazor/Validation/test/ObjectGraphDataAnnotationsValidatorTest.cs b/src/Components/Blazor/Validation/test/ObjectGraphDataAnnotationsValidatorTest.cs new file mode 100644 index 0000000000..6703eb35d5 --- /dev/null +++ b/src/Components/Blazor/Validation/test/ObjectGraphDataAnnotationsValidatorTest.cs @@ -0,0 +1,540 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; +using System.Linq; +using Microsoft.AspNetCore.Components.Forms; +using Xunit; + +namespace Microsoft.AspNetCore.Components +{ + public class ObjectGraphDataAnnotationsValidatorTest + { + public class SimpleModel + { + [Required] + public string Name { get; set; } + + [Range(1, 16)] + public int Age { get; set; } + } + + [Fact] + public void ValidateObject_SimpleObject() + { + var model = new SimpleModel + { + Age = 23, + }; + + var editContext = Validate(model); + var messages = editContext.GetValidationMessages(() => model.Name); + Assert.Single(messages); + + messages = editContext.GetValidationMessages(() => model.Age); + Assert.Single(messages); + + Assert.Equal(2, editContext.GetValidationMessages().Count()); + } + + [Fact] + public void ValidateObject_SimpleObject_AllValid() + { + var model = new SimpleModel { Name = "Test", Age = 5 }; + + var editContext = Validate(model); + var messages = editContext.GetValidationMessages(() => model.Name); + Assert.Empty(messages); + + messages = editContext.GetValidationMessages(() => model.Age); + Assert.Empty(messages); + + Assert.Empty(editContext.GetValidationMessages()); + } + + public class ModelWithComplexProperty + { + [Required] + public string Property1 { get; set; } + + [ValidateComplexType] + public SimpleModel SimpleModel { get; set; } + } + + [Fact] + public void ValidateObject_NullComplexProperty() + { + var model = new ModelWithComplexProperty(); + + var editContext = Validate(model); + var messages = editContext.GetValidationMessages(() => model.Property1); + Assert.Single(messages); + + Assert.Single(editContext.GetValidationMessages()); + } + + [Fact] + public void ValidateObject_ModelWithComplexProperties() + { + var model = new ModelWithComplexProperty { SimpleModel = new SimpleModel() }; + + var editContext = Validate(model); + var messages = editContext.GetValidationMessages(() => model.Property1); + Assert.Single(messages); + + messages = editContext.GetValidationMessages(() => model.SimpleModel); + Assert.Empty(messages); + + messages = editContext.GetValidationMessages(() => model.SimpleModel.Age); + Assert.Single(messages); + + messages = editContext.GetValidationMessages(() => model.SimpleModel.Name); + Assert.Single(messages); + + Assert.Equal(3, editContext.GetValidationMessages().Count()); + } + + [Fact] + public void ValidateObject_ModelWithComplexProperties_SomeValid() + { + var model = new ModelWithComplexProperty + { + Property1 = "Value", + SimpleModel = new SimpleModel { Name = "Some Value" }, + }; + + var editContext = Validate(model); + var messages = editContext.GetValidationMessages(() => model.Property1); + Assert.Empty(messages); + + messages = editContext.GetValidationMessages(() => model.SimpleModel); + Assert.Empty(messages); + + messages = editContext.GetValidationMessages(() => model.SimpleModel.Age); + Assert.Single(messages); + + messages = editContext.GetValidationMessages(() => model.SimpleModel.Name); + Assert.Empty(messages); + + Assert.Single(editContext.GetValidationMessages()); + } + + public class TestValidatableObject : IValidatableObject + { + [Required] + public string Name { get; set; } + + public IEnumerable Validate(ValidationContext validationContext) + { + yield return new ValidationResult("Custom validation error"); + } + } + + public class ModelWithValidatableComplexProperty + { + [Required] + public string Property1 { get; set; } + + [ValidateComplexType] + public TestValidatableObject Property2 { get; set; } = new TestValidatableObject(); + } + + [Fact] + public void ValidateObject_ValidatableComplexProperty() + { + var model = new ModelWithValidatableComplexProperty(); + + var editContext = Validate(model); + var messages = editContext.GetValidationMessages(() => model.Property1); + Assert.Single(messages); + + messages = editContext.GetValidationMessages(() => model.Property2); + Assert.Empty(messages); + + messages = editContext.GetValidationMessages(() => model.Property2.Name); + Assert.Single(messages); + + Assert.Equal(2, editContext.GetValidationMessages().Count()); + } + + [Fact] + public void ValidateObject_ValidatableComplexProperty_ValidatesIValidatableProperty() + { + var model = new ModelWithValidatableComplexProperty + { + Property2 = new TestValidatableObject { Name = "test" }, + }; + + var editContext = Validate(model); + var messages = editContext.GetValidationMessages(() => model.Property1); + Assert.Single(messages); + + messages = editContext.GetValidationMessages(new FieldIdentifier(model.Property2, string.Empty)); + Assert.Single(messages); + + messages = editContext.GetValidationMessages(() => model.Property2.Name); + Assert.Empty(messages); + + Assert.Equal(2, editContext.GetValidationMessages().Count()); + } + + [Fact] + public void ValidateObject_ModelIsIValidatable_PropertyHasError() + { + var model = new TestValidatableObject(); + + var editContext = Validate(model); + var messages = editContext.GetValidationMessages(new FieldIdentifier(model, string.Empty)); + Assert.Empty(messages); + + messages = editContext.GetValidationMessages(() => model.Name); + Assert.Single(messages); + + Assert.Single(editContext.GetValidationMessages()); + } + + [Fact] + public void ValidateObject_ModelIsIValidatable_ModelHasError() + { + var model = new TestValidatableObject { Name = "test" }; + + var editContext = Validate(model); + var messages = editContext.GetValidationMessages(new FieldIdentifier(model, string.Empty)); + Assert.Single(messages); + + messages = editContext.GetValidationMessages(() => model.Name); + Assert.Empty(messages); + + Assert.Single(editContext.GetValidationMessages()); + } + + [Fact] + public void ValidateObject_CollectionModel() + { + var model = new List + { + new SimpleModel(), + new SimpleModel { Name = "test", }, + }; + + var editContext = Validate(model); + + var item = model[0]; + var messages = editContext.GetValidationMessages(new FieldIdentifier(model, "0")); + Assert.Empty(messages); + + messages = editContext.GetValidationMessages(() => item.Name); + Assert.Single(messages); + + messages = editContext.GetValidationMessages(() => item.Age); + Assert.Single(messages); + + item = model[1]; + messages = editContext.GetValidationMessages(new FieldIdentifier(model, "1")); + Assert.Empty(messages); + + messages = editContext.GetValidationMessages(() => item.Name); + Assert.Empty(messages); + + messages = editContext.GetValidationMessages(() => item.Age); + Assert.Single(messages); + + Assert.Equal(3, editContext.GetValidationMessages().Count()); + } + + [Fact] + public void ValidateObject_CollectionValidatableModel() + { + var model = new List + { + new TestValidatableObject(), + new TestValidatableObject { Name = "test", }, + }; + + var editContext = Validate(model); + + var item = model[0]; + var messages = editContext.GetValidationMessages(() => item.Name); + Assert.Single(messages); + + item = model[1]; + Assert.Single(messages); + + messages = editContext.GetValidationMessages(() => item.Name); + Assert.Empty(messages); + + Assert.Equal(2, editContext.GetValidationMessages().Count()); + } + + private class Level1Validation + { + [ValidateComplexType] + public Level2Validation Level2 { get; set; } + } + + public class Level2Validation + { + [ValidateComplexType] + public SimpleModel Level3 { get; set; } + } + + [Fact] + public void ValidateObject_ManyLevels() + { + var model = new Level1Validation + { + Level2 = new Level2Validation + { + Level3 = new SimpleModel + { + Age = 47, + } + } + }; + + var editContext = Validate(model); + var level3 = model.Level2.Level3; + + var messages = editContext.GetValidationMessages(() => level3.Name); + Assert.Single(messages); + + messages = editContext.GetValidationMessages(() => level3.Age); + Assert.Single(messages); + + Assert.Equal(2, editContext.GetValidationMessages().Count()); + } + + private class Person + { + [Required] + public string Name { get; set; } + + [ValidateComplexType] + public Person Related { get; set; } + } + + [Fact] + public void ValidateObject_RecursiveRelation() + { + var model = new Person { Related = new Person() }; + model.Related.Related = model; + + var editContext = Validate(model); + + var messages = editContext.GetValidationMessages(() => model.Name); + Assert.Single(messages); + + messages = editContext.GetValidationMessages(() => model.Related.Name); + Assert.Single(messages); + + Assert.Equal(2, editContext.GetValidationMessages().Count()); + } + + [Fact] + public void ValidateObject_RecursiveRelation_OverManySteps() + { + var person1 = new Person(); + var person2 = new Person { Name = "Valid name" }; + var person3 = new Person(); + var person4 = new Person(); + + person1.Related = person2; + person2.Related = person3; + person3.Related = person4; + person4.Related = person1; + + var editContext = Validate(person1); + + var messages = editContext.GetValidationMessages(() => person1.Name); + Assert.Single(messages); + + messages = editContext.GetValidationMessages(() => person2.Name); + Assert.Empty(messages); + + messages = editContext.GetValidationMessages(() => person3.Name); + Assert.Single(messages); + + messages = editContext.GetValidationMessages(() => person4.Name); + Assert.Single(messages); + + Assert.Equal(3, editContext.GetValidationMessages().Count()); + } + + private class Node + { + [Required] + public string Id { get; set; } + + [ValidateComplexType] + public List Related { get; set; } = new List(); + } + + [Fact] + public void ValidateObject_RecursiveRelation_ViaCollection() + { + var node1 = new Node(); + var node2 = new Node { Id = "Valid Id" }; + var node3 = new Node(); + node1.Related.Add(node2); + node2.Related.Add(node3); + node3.Related.Add(node1); + + var editContext = Validate(node1); + + var messages = editContext.GetValidationMessages(() => node1.Id); + Assert.Single(messages); + + messages = editContext.GetValidationMessages(() => node2.Id); + Assert.Empty(messages); + + messages = editContext.GetValidationMessages(() => node3.Id); + Assert.Single(messages); + + Assert.Equal(2, editContext.GetValidationMessages().Count()); + } + + [Fact] + public void ValidateObject_RecursiveRelation_InCollection() + { + var person1 = new Person(); + var person2 = new Person { Name = "Valid name" }; + var person3 = new Person(); + var person4 = new Person(); + + person1.Related = person2; + person2.Related = person3; + person3.Related = person4; + person4.Related = person1; + + var editContext = Validate(person1); + + var messages = editContext.GetValidationMessages(() => person1.Name); + Assert.Single(messages); + + messages = editContext.GetValidationMessages(() => person2.Name); + Assert.Empty(messages); + + messages = editContext.GetValidationMessages(() => person3.Name); + Assert.Single(messages); + + messages = editContext.GetValidationMessages(() => person4.Name); + Assert.Single(messages); + + Assert.Equal(3, editContext.GetValidationMessages().Count()); + } + + [Fact] + public void ValidateField_PropertyValid() + { + var model = new SimpleModel { Age = 1 }; + var fieldIdentifier = FieldIdentifier.Create(() => model.Age); + + var editContext = ValidateField(model, fieldIdentifier); + var messages = editContext.GetValidationMessages(fieldIdentifier); + Assert.Empty(messages); + + Assert.Empty(editContext.GetValidationMessages()); + } + + [Fact] + public void ValidateField_PropertyInvalid() + { + var model = new SimpleModel { Age = 42 }; + var fieldIdentifier = FieldIdentifier.Create(() => model.Age); + + var editContext = ValidateField(model, fieldIdentifier); + var messages = editContext.GetValidationMessages(fieldIdentifier); + Assert.Single(messages); + + Assert.Single(editContext.GetValidationMessages()); + } + + [Fact] + public void ValidateField_AfterSubmitValidation() + { + var model = new SimpleModel { Age = 42 }; + var fieldIdentifier = FieldIdentifier.Create(() => model.Age); + + var editContext = Validate(model); + var messages = editContext.GetValidationMessages(fieldIdentifier); + Assert.Single(messages); + + Assert.Equal(2, editContext.GetValidationMessages().Count()); + + model.Age = 4; + + editContext.NotifyFieldChanged(fieldIdentifier); + messages = editContext.GetValidationMessages(fieldIdentifier); + Assert.Empty(messages); + + Assert.Single(editContext.GetValidationMessages()); + } + + [Fact] + public void ValidateField_ModelWithComplexProperty() + { + var model = new ModelWithComplexProperty + { + SimpleModel = new SimpleModel { Age = 1 }, + }; + var fieldIdentifier = FieldIdentifier.Create(() => model.SimpleModel.Name); + + var editContext = ValidateField(model, fieldIdentifier); + var messages = editContext.GetValidationMessages(fieldIdentifier); + Assert.Single(messages); + + Assert.Single(editContext.GetValidationMessages()); + } + + [Fact] + public void ValidateField_ModelWithComplexProperty_AfterSubmitValidation() + { + var model = new ModelWithComplexProperty + { + Property1 = "test", + SimpleModel = new SimpleModel { Age = 29, Name = "Test" }, + }; + var fieldIdentifier = FieldIdentifier.Create(() => model.SimpleModel.Age); + + var editContext = Validate(model); + var messages = editContext.GetValidationMessages(fieldIdentifier); + Assert.Single(messages); + + model.SimpleModel.Age = 9; + editContext.NotifyFieldChanged(fieldIdentifier); + + messages = editContext.GetValidationMessages(fieldIdentifier); + Assert.Empty(messages); + Assert.Empty(editContext.GetValidationMessages()); + } + + private static EditContext Validate(object model) + { + var editContext = new EditContext(model); + var validator = new TestObjectGraphDataAnnotationsValidator { EditContext = editContext, }; + validator.OnInitialized(); + + editContext.Validate(); + + return editContext; + } + + private static EditContext ValidateField(object model, in FieldIdentifier field) + { + var editContext = new EditContext(model); + var validator = new TestObjectGraphDataAnnotationsValidator { EditContext = editContext, }; + validator.OnInitialized(); + + editContext.NotifyFieldChanged(field); + + return editContext; + } + + private class TestObjectGraphDataAnnotationsValidator : ObjectGraphDataAnnotationsValidator + { + public new void OnInitialized() => base.OnInitialized(); + } + } +} diff --git a/src/Components/Components.sln b/src/Components/Components.sln index 046fc0b7ca..ba0b2476ff 100644 --- a/src/Components/Components.sln +++ b/src/Components/Components.sln @@ -240,6 +240,12 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Ignitor", "Ignitor\src\Igni EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Ignitor.Test", "Ignitor\test\Ignitor.Test.csproj", "{F31E8118-014E-4CCE-8A48-5282F7B9BB3E}" EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Validation", "Validation", "{FD9BD646-9D50-42ED-A3E1-90558BA0C6B2}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Blazor.DataAnnotations.Validation", "Blazor\Validation\src\Microsoft.AspNetCore.Blazor.DataAnnotations.Validation.csproj", "{B70F90C7-2696-4050-B24E-BF0308F4E059}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Blazor.DataAnnotations.Validation.Tests", "Blazor\Validation\test\Microsoft.AspNetCore.Blazor.DataAnnotations.Validation.Tests.csproj", "{A5617A9D-C71E-44DE-936C-27611EB40A02}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -1486,6 +1492,30 @@ Global {F31E8118-014E-4CCE-8A48-5282F7B9BB3E}.Release|x64.Build.0 = Release|Any CPU {F31E8118-014E-4CCE-8A48-5282F7B9BB3E}.Release|x86.ActiveCfg = Release|Any CPU {F31E8118-014E-4CCE-8A48-5282F7B9BB3E}.Release|x86.Build.0 = Release|Any CPU + {B70F90C7-2696-4050-B24E-BF0308F4E059}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {B70F90C7-2696-4050-B24E-BF0308F4E059}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B70F90C7-2696-4050-B24E-BF0308F4E059}.Debug|x64.ActiveCfg = Debug|Any CPU + {B70F90C7-2696-4050-B24E-BF0308F4E059}.Debug|x64.Build.0 = Debug|Any CPU + {B70F90C7-2696-4050-B24E-BF0308F4E059}.Debug|x86.ActiveCfg = Debug|Any CPU + {B70F90C7-2696-4050-B24E-BF0308F4E059}.Debug|x86.Build.0 = Debug|Any CPU + {B70F90C7-2696-4050-B24E-BF0308F4E059}.Release|Any CPU.ActiveCfg = Release|Any CPU + {B70F90C7-2696-4050-B24E-BF0308F4E059}.Release|Any CPU.Build.0 = Release|Any CPU + {B70F90C7-2696-4050-B24E-BF0308F4E059}.Release|x64.ActiveCfg = Release|Any CPU + {B70F90C7-2696-4050-B24E-BF0308F4E059}.Release|x64.Build.0 = Release|Any CPU + {B70F90C7-2696-4050-B24E-BF0308F4E059}.Release|x86.ActiveCfg = Release|Any CPU + {B70F90C7-2696-4050-B24E-BF0308F4E059}.Release|x86.Build.0 = Release|Any CPU + {A5617A9D-C71E-44DE-936C-27611EB40A02}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {A5617A9D-C71E-44DE-936C-27611EB40A02}.Debug|Any CPU.Build.0 = Debug|Any CPU + {A5617A9D-C71E-44DE-936C-27611EB40A02}.Debug|x64.ActiveCfg = Debug|Any CPU + {A5617A9D-C71E-44DE-936C-27611EB40A02}.Debug|x64.Build.0 = Debug|Any CPU + {A5617A9D-C71E-44DE-936C-27611EB40A02}.Debug|x86.ActiveCfg = Debug|Any CPU + {A5617A9D-C71E-44DE-936C-27611EB40A02}.Debug|x86.Build.0 = Debug|Any CPU + {A5617A9D-C71E-44DE-936C-27611EB40A02}.Release|Any CPU.ActiveCfg = Release|Any CPU + {A5617A9D-C71E-44DE-936C-27611EB40A02}.Release|Any CPU.Build.0 = Release|Any CPU + {A5617A9D-C71E-44DE-936C-27611EB40A02}.Release|x64.ActiveCfg = Release|Any CPU + {A5617A9D-C71E-44DE-936C-27611EB40A02}.Release|x64.Build.0 = Release|Any CPU + {A5617A9D-C71E-44DE-936C-27611EB40A02}.Release|x86.ActiveCfg = Release|Any CPU + {A5617A9D-C71E-44DE-936C-27611EB40A02}.Release|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -1596,6 +1626,9 @@ Global {BBF37AF9-8290-4B70-8BA8-0F6017B3B620} = {46E4300C-5726-4108-B9A2-18BB94EB26ED} {CD0EF85C-4187-4515-A355-E5A0D4485F40} = {BDE2397D-C53A-4783-8B3A-1F54F48A6926} {F31E8118-014E-4CCE-8A48-5282F7B9BB3E} = {BDE2397D-C53A-4783-8B3A-1F54F48A6926} + {FD9BD646-9D50-42ED-A3E1-90558BA0C6B2} = {7260DED9-22A9-4E9D-92F4-5E8A4404DEAF} + {B70F90C7-2696-4050-B24E-BF0308F4E059} = {7260DED9-22A9-4E9D-92F4-5E8A4404DEAF} + {A5617A9D-C71E-44DE-936C-27611EB40A02} = {7260DED9-22A9-4E9D-92F4-5E8A4404DEAF} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {CC3C47E1-AD1A-4619-9CD3-E08A0148E5CE} diff --git a/src/Components/ComponentsNoDeps.slnf b/src/Components/ComponentsNoDeps.slnf index ce01e6468f..09f6a0859f 100644 --- a/src/Components/ComponentsNoDeps.slnf +++ b/src/Components/ComponentsNoDeps.slnf @@ -15,6 +15,8 @@ "Blazor\\Http\\test\\Microsoft.AspNetCore.Blazor.HttpClient.Tests.csproj", "Blazor\\Server\\src\\Microsoft.AspNetCore.Blazor.Server.csproj", "Blazor\\Templates\\src\\Microsoft.AspNetCore.Blazor.Templates.csproj", + "Blazor\\Validation\\src\\Microsoft.AspNetCore.Blazor.DataAnnotations.Validation.csproj", + "Blazor\\Validation\\test\\Microsoft.AspNetCore.Blazor.DataAnnotations.Validation.Tests.csproj", "Blazor\\testassets\\HostedInAspNet.Client\\HostedInAspNet.Client.csproj", "Blazor\\testassets\\HostedInAspNet.Server\\HostedInAspNet.Server.csproj", "Blazor\\testassets\\Microsoft.AspNetCore.Blazor.E2EPerformance\\Microsoft.AspNetCore.Blazor.E2EPerformance.csproj", diff --git a/src/Components/Forms/src/EditContextDataAnnotationsExtensions.cs b/src/Components/Forms/src/EditContextDataAnnotationsExtensions.cs index 9fce473a41..e7f9d5f155 100644 --- a/src/Components/Forms/src/EditContextDataAnnotationsExtensions.cs +++ b/src/Components/Forms/src/EditContextDataAnnotationsExtensions.cs @@ -52,6 +52,12 @@ namespace Microsoft.AspNetCore.Components.Forms messages.Clear(); foreach (var validationResult in validationResults) { + if (!validationResult.MemberNames.Any()) + { + messages.Add(new FieldIdentifier(editContext.Model, fieldName: string.Empty), validationResult.ErrorMessage); + continue; + } + foreach (var memberName in validationResult.MemberNames) { messages.Add(editContext.Field(memberName), validationResult.ErrorMessage); diff --git a/src/Components/Samples/BlazorServerApp/BlazorServerApp.csproj b/src/Components/Samples/BlazorServerApp/BlazorServerApp.csproj index 101fe45c13..2a82b7453a 100644 --- a/src/Components/Samples/BlazorServerApp/BlazorServerApp.csproj +++ b/src/Components/Samples/BlazorServerApp/BlazorServerApp.csproj @@ -12,6 +12,7 @@ + diff --git a/src/Components/Web.JS/dist/Release/blazor.server.js b/src/Components/Web.JS/dist/Release/blazor.server.js index 3b085c3f0c..3a2abaced9 100644 --- a/src/Components/Web.JS/dist/Release/blazor.server.js +++ b/src/Components/Web.JS/dist/Release/blazor.server.js @@ -1,4 +1,4 @@ -!function(e){var t={};function n(r){if(t[r])return t[r].exports;var o=t[r]={i:r,l:!1,exports:{}};return e[r].call(o.exports,o,o.exports,n),o.l=!0,o.exports}n.m=e,n.c=t,n.d=function(e,t,r){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(n.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var o in e)n.d(r,o,function(t){return e[t]}.bind(null,o));return r},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="",n(n.s=50)}([function(e,t,n){"use strict";var r;n.d(t,"a",function(){return r}),function(e){e[e.Trace=0]="Trace",e[e.Debug=1]="Debug",e[e.Information=2]="Information",e[e.Warning=3]="Warning",e[e.Error=4]="Error",e[e.Critical=5]="Critical",e[e.None=6]="None"}(r||(r={}))},function(e,t,n){"use strict";n.d(t,"a",function(){return s}),n.d(t,"c",function(){return c}),n.d(t,"f",function(){return u}),n.d(t,"g",function(){return l}),n.d(t,"h",function(){return f}),n.d(t,"e",function(){return h}),n.d(t,"d",function(){return p}),n.d(t,"b",function(){return d});var r=n(0),o=n(7),i=function(e,t,n,r){return new(n||(n=Promise))(function(o,i){function a(e){try{c(r.next(e))}catch(e){i(e)}}function s(e){try{c(r.throw(e))}catch(e){i(e)}}function c(e){e.done?o(e.value):new n(function(t){t(e.value)}).then(a,s)}c((r=r.apply(e,t||[])).next())})},a=function(e,t){var n,r,o,i,a={label:0,sent:function(){if(1&o[0])throw o[1];return o[1]},trys:[],ops:[]};return i={next:s(0),throw:s(1),return:s(2)},"function"==typeof Symbol&&(i[Symbol.iterator]=function(){return this}),i;function s(i){return function(s){return function(i){if(n)throw new TypeError("Generator is already executing.");for(;a;)try{if(n=1,r&&(o=2&i[0]?r.return:i[0]?r.throw||((o=r.return)&&o.call(r),0):r.next)&&!(o=o.call(r,i[1])).done)return o;switch(r=0,o&&(i=[2&i[0],o.value]),i[0]){case 0:case 1:o=i;break;case 4:return a.label++,{value:i[1],done:!1};case 5:a.label++,r=i[1],i=[0];continue;case 7:i=a.ops.pop(),a.trys.pop();continue;default:if(!(o=(o=a.trys).length>0&&o[o.length-1])&&(6===i[0]||2===i[0])){a=0;continue}if(3===i[0]&&(!o||i[1]>o[0]&&i[1]-1&&this.subject.observers.splice(e,1),0===this.subject.observers.length&&this.subject.cancelCallback&&this.subject.cancelCallback().catch(function(e){})},e}(),d=function(){function e(e){this.minimumLogLevel=e,this.outputConsole=console}return e.prototype.log=function(e,t){if(e>=this.minimumLogLevel)switch(e){case r.a.Critical:case r.a.Error:this.outputConsole.error("["+(new Date).toISOString()+"] "+r.a[e]+": "+t);break;case r.a.Warning:this.outputConsole.warn("["+(new Date).toISOString()+"] "+r.a[e]+": "+t);break;case r.a.Information:this.outputConsole.info("["+(new Date).toISOString()+"] "+r.a[e]+": "+t);break;default:this.outputConsole.log("["+(new Date).toISOString()+"] "+r.a[e]+": "+t)}},e}()},function(e,t,n){"use strict";n.r(t);var r,o,i=n(3),a=n(4),s=n(44),c=n(0),u=(r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n])},function(e,t){function n(){this.constructor=e}r(e,t),e.prototype=null===t?Object.create(t):(n.prototype=t.prototype,new n)}),l=function(e){function t(t){var n=e.call(this)||this;return n.logger=t,n}return u(t,e),t.prototype.send=function(e){var t=this;return e.abortSignal&&e.abortSignal.aborted?Promise.reject(new i.a):e.method?e.url?new Promise(function(n,r){var o=new XMLHttpRequest;o.open(e.method,e.url,!0),o.withCredentials=!0,o.setRequestHeader("X-Requested-With","XMLHttpRequest"),o.setRequestHeader("Content-Type","text/plain;charset=UTF-8");var s=e.headers;s&&Object.keys(s).forEach(function(e){o.setRequestHeader(e,s[e])}),e.responseType&&(o.responseType=e.responseType),e.abortSignal&&(e.abortSignal.onabort=function(){o.abort(),r(new i.a)}),e.timeout&&(o.timeout=e.timeout),o.onload=function(){e.abortSignal&&(e.abortSignal.onabort=null),o.status>=200&&o.status<300?n(new a.b(o.status,o.statusText,o.response||o.responseText)):r(new i.b(o.statusText,o.status))},o.onerror=function(){t.logger.log(c.a.Warning,"Error from HTTP request. "+o.status+": "+o.statusText+"."),r(new i.b(o.statusText,o.status))},o.ontimeout=function(){t.logger.log(c.a.Warning,"Timeout from HTTP request."),r(new i.c)},o.send(e.content||"")}):Promise.reject(new Error("No url defined.")):Promise.reject(new Error("No method defined."))},t}(a.a),f=function(){var e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n])};return function(t,n){function r(){this.constructor=t}e(t,n),t.prototype=null===n?Object.create(n):(r.prototype=n.prototype,new r)}}(),h=function(e){function t(t){var n=e.call(this)||this;return"undefined"!=typeof XMLHttpRequest?n.httpClient=new l(t):n.httpClient=new s.a(t),n}return f(t,e),t.prototype.send=function(e){return e.abortSignal&&e.abortSignal.aborted?Promise.reject(new i.a):e.method?e.url?this.httpClient.send(e):Promise.reject(new Error("No url defined.")):Promise.reject(new Error("No method defined."))},t.prototype.getCookieString=function(e){return this.httpClient.getCookieString(e)},t}(a.a),p=n(45);!function(e){e[e.Invocation=1]="Invocation",e[e.StreamItem=2]="StreamItem",e[e.Completion=3]="Completion",e[e.StreamInvocation=4]="StreamInvocation",e[e.CancelInvocation=5]="CancelInvocation",e[e.Ping=6]="Ping",e[e.Close=7]="Close"}(o||(o={}));var d,g=n(1),y=function(){function e(){this.observers=[]}return e.prototype.next=function(e){for(var t=0,n=this.observers;t0&&o[o.length-1])&&(6===i[0]||2===i[0])){a=0;continue}if(3===i[0]&&(!o||i[1]>o[0]&&i[1]0&&o[o.length-1])&&(6===i[0]||2===i[0])){a=0;continue}if(3===i[0]&&(!o||i[1]>o[0]&&i[1]0&&o[o.length-1])&&(6===i[0]||2===i[0])){a=0;continue}if(3===i[0]&&(!o||i[1]>o[0]&&i[1]0&&o[o.length-1])&&(6===i[0]||2===i[0])){a=0;continue}if(3===i[0]&&(!o||i[1]>o[0]&&i[1]0&&o[o.length-1])&&(6===i[0]||2===i[0])){a=0;continue}if(3===i[0]&&(!o||i[1]>o[0]&&i[1]0?[2,Promise.reject(new Error("Unable to connect to the server with any of the available transports. "+i.join(" ")))]:[2,Promise.reject(new Error("None of the transports supported by the client are supported by the server."))]}})})},e.prototype.constructTransport=function(e){switch(e){case E.WebSockets:if(!this.options.WebSocket)throw new Error("'WebSocket' is not supported in your environment.");return new A(this.httpClient,this.accessTokenFactory,this.logger,this.options.logMessageContent||!1,this.options.WebSocket);case E.ServerSentEvents:if(!this.options.EventSource)throw new Error("'EventSource' is not supported in your environment.");return new O(this.httpClient,this.accessTokenFactory,this.logger,this.options.logMessageContent||!1,this.options.EventSource);case E.LongPolling:return new P(this.httpClient,this.accessTokenFactory,this.logger,this.options.logMessageContent||!1);default:throw new Error("Unknown transport: "+e+".")}},e.prototype.startTransport=function(e,t){var n=this;return this.transport.onreceive=this.onreceive,this.transport.onclose=function(e){return n.stopConnection(e)},this.transport.connect(e,t)},e.prototype.resolveTransportOrError=function(e,t,n){var r=E[e.transport];if(null==r)return this.logger.log(c.a.Debug,"Skipping transport '"+e.transport+"' because it is not supported by this client."),new Error("Skipping transport '"+e.transport+"' because it is not supported by this client.");if(!function(e,t){return!e||0!=(t&e)}(t,r))return this.logger.log(c.a.Debug,"Skipping transport '"+E[r]+"' because it was disabled by the client."),new Error("'"+E[r]+"' is disabled by the client.");if(!(e.transferFormats.map(function(e){return S[e]}).indexOf(n)>=0))return this.logger.log(c.a.Debug,"Skipping transport '"+E[r]+"' because it does not support the requested transfer format '"+S[n]+"'."),new Error("'"+E[r]+"' does not support "+S[n]+".");if(r===E.WebSockets&&!this.options.WebSocket||r===E.ServerSentEvents&&!this.options.EventSource)return this.logger.log(c.a.Debug,"Skipping transport '"+E[r]+"' because it is not supported in your environment.'"),new Error("'"+E[r]+"' is not supported in your environment.");this.logger.log(c.a.Debug,"Selecting transport '"+E[r]+"'.");try{return this.constructTransport(r)}catch(e){return e}},e.prototype.isITransport=function(e){return e&&"object"==typeof e&&"connect"in e},e.prototype.stopConnection=function(e){if(this.logger.log(c.a.Debug,"HttpConnection.stopConnection("+e+") called while in state "+this.connectionState+"."),this.transport=void 0,e=this.stopError||e,this.stopError=void 0,"Disconnected"!==this.connectionState)if("Connecting "!==this.connectionState){if("Disconnecting"===this.connectionState&&this.stopPromiseResolver(),e?this.logger.log(c.a.Error,"Connection disconnected with error '"+e+"'."):this.logger.log(c.a.Information,"Connection disconnected."),this.connectionId=void 0,this.connectionState="Disconnected",this.onclose&&this.connectionStarted){this.connectionStarted=!1;try{this.onclose(e)}catch(t){this.logger.log(c.a.Error,"HttpConnection.onclose("+e+") threw error '"+t+"'.")}}}else this.logger.log(c.a.Warning,"Call to HttpConnection.stopConnection("+e+") was ignored because the connection hasn't yet left the in the connecting state.");else this.logger.log(c.a.Debug,"Call to HttpConnection.stopConnection("+e+") was ignored because the connection is already in the disconnected state.")},e.prototype.resolveUrl=function(e){if(0===e.lastIndexOf("https://",0)||0===e.lastIndexOf("http://",0))return e;if(!g.c.isBrowser||!window.document)throw new Error("Cannot resolve '"+e+"'.");var t=window.document.createElement("a");return t.href=e,this.logger.log(c.a.Information,"Normalizing '"+e+"' to '"+t.href+"'."),t.href},e.prototype.resolveNegotiateUrl=function(e){var t=e.indexOf("?"),n=e.substring(0,-1===t?e.length:t);return"/"!==n[n.length-1]&&(n+="/"),n+="negotiate",-1===(n+=-1===t?"":e.substring(t)).indexOf("negotiateVersion")&&(n+=-1===t?"?":"&",n+="negotiateVersion="+this.negotiateVersion),n},e}();var q=function(){function e(e){this.transport=e,this.buffer=[],this.executing=!0,this.sendBufferedData=new W,this.transportResult=new W,this.sendLoopPromise=this.sendLoop()}return e.prototype.send=function(e){return this.bufferData(e),this.transportResult||(this.transportResult=new W),this.transportResult.promise},e.prototype.stop=function(){return this.executing=!1,this.sendBufferedData.resolve(),this.sendLoopPromise},e.prototype.bufferData=function(e){if(this.buffer.length&&typeof this.buffer[0]!=typeof e)throw new Error("Expected data to be of type "+typeof this.buffer+" but was of type "+typeof e);this.buffer.push(e),this.sendBufferedData.resolve()},e.prototype.sendLoop=function(){return B(this,void 0,void 0,function(){var t,n,r;return j(this,function(o){switch(o.label){case 0:return[4,this.sendBufferedData.promise];case 1:if(o.sent(),!this.executing)return this.transportResult&&this.transportResult.reject("Connection stopped."),[3,6];this.sendBufferedData=new W,t=this.transportResult,this.transportResult=void 0,n="string"==typeof this.buffer[0]?this.buffer.join(""):e.concatBuffers(this.buffer),this.buffer.length=0,o.label=2;case 2:return o.trys.push([2,4,,5]),[4,this.transport.send(n)];case 3:return o.sent(),t.resolve(),[3,5];case 4:return r=o.sent(),t.reject(r),[3,5];case 5:return[3,0];case 6:return[2]}})})},e.concatBuffers=function(e){for(var t=e.map(function(e){return e.byteLength}).reduce(function(e,t){return e+t}),n=new Uint8Array(t),r=0,o=0,i=e;o0&&o[o.length-1])&&(6===i[0]||2===i[0])){a=0;continue}if(3===i[0]&&(!o||i[1]>o[0]&&i[1]-1&&this.subject.observers.splice(e,1),0===this.subject.observers.length&&this.subject.cancelCallback&&this.subject.cancelCallback().catch(function(e){})},e}(),d=function(){function e(e){this.minimumLogLevel=e,this.outputConsole=console}return e.prototype.log=function(e,t){if(e>=this.minimumLogLevel)switch(e){case r.a.Critical:case r.a.Error:this.outputConsole.error("["+(new Date).toISOString()+"] "+r.a[e]+": "+t);break;case r.a.Warning:this.outputConsole.warn("["+(new Date).toISOString()+"] "+r.a[e]+": "+t);break;case r.a.Information:this.outputConsole.info("["+(new Date).toISOString()+"] "+r.a[e]+": "+t);break;default:this.outputConsole.log("["+(new Date).toISOString()+"] "+r.a[e]+": "+t)}},e}()},function(e,t,n){"use strict";n.r(t);var r,o,i=n(3),a=n(4),s=n(44),c=n(0),u=(r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n])},function(e,t){function n(){this.constructor=e}r(e,t),e.prototype=null===t?Object.create(t):(n.prototype=t.prototype,new n)}),l=function(e){function t(t){var n=e.call(this)||this;return n.logger=t,n}return u(t,e),t.prototype.send=function(e){var t=this;return e.abortSignal&&e.abortSignal.aborted?Promise.reject(new i.a):e.method?e.url?new Promise(function(n,r){var o=new XMLHttpRequest;o.open(e.method,e.url,!0),o.withCredentials=!0,o.setRequestHeader("X-Requested-With","XMLHttpRequest"),o.setRequestHeader("Content-Type","text/plain;charset=UTF-8");var s=e.headers;s&&Object.keys(s).forEach(function(e){o.setRequestHeader(e,s[e])}),e.responseType&&(o.responseType=e.responseType),e.abortSignal&&(e.abortSignal.onabort=function(){o.abort(),r(new i.a)}),e.timeout&&(o.timeout=e.timeout),o.onload=function(){e.abortSignal&&(e.abortSignal.onabort=null),o.status>=200&&o.status<300?n(new a.b(o.status,o.statusText,o.response||o.responseText)):r(new i.b(o.statusText,o.status))},o.onerror=function(){t.logger.log(c.a.Warning,"Error from HTTP request. "+o.status+": "+o.statusText+"."),r(new i.b(o.statusText,o.status))},o.ontimeout=function(){t.logger.log(c.a.Warning,"Timeout from HTTP request."),r(new i.c)},o.send(e.content||"")}):Promise.reject(new Error("No url defined.")):Promise.reject(new Error("No method defined."))},t}(a.a),f=function(){var e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n])};return function(t,n){function r(){this.constructor=t}e(t,n),t.prototype=null===n?Object.create(n):(r.prototype=n.prototype,new r)}}(),h=function(e){function t(t){var n=e.call(this)||this;return"undefined"!=typeof XMLHttpRequest?n.httpClient=new l(t):n.httpClient=new s.a(t),n}return f(t,e),t.prototype.send=function(e){return e.abortSignal&&e.abortSignal.aborted?Promise.reject(new i.a):e.method?e.url?this.httpClient.send(e):Promise.reject(new Error("No url defined.")):Promise.reject(new Error("No method defined."))},t.prototype.getCookieString=function(e){return this.httpClient.getCookieString(e)},t}(a.a),p=n(45);!function(e){e[e.Invocation=1]="Invocation",e[e.StreamItem=2]="StreamItem",e[e.Completion=3]="Completion",e[e.StreamInvocation=4]="StreamInvocation",e[e.CancelInvocation=5]="CancelInvocation",e[e.Ping=6]="Ping",e[e.Close=7]="Close"}(o||(o={}));var d,g=n(1),y=function(){function e(){this.observers=[]}return e.prototype.next=function(e){for(var t=0,n=this.observers;t0&&o[o.length-1])&&(6===i[0]||2===i[0])){a=0;continue}if(3===i[0]&&(!o||i[1]>o[0]&&i[1]0&&o[o.length-1])&&(6===i[0]||2===i[0])){a=0;continue}if(3===i[0]&&(!o||i[1]>o[0]&&i[1]0&&o[o.length-1])&&(6===i[0]||2===i[0])){a=0;continue}if(3===i[0]&&(!o||i[1]>o[0]&&i[1]0&&o[o.length-1])&&(6===i[0]||2===i[0])){a=0;continue}if(3===i[0]&&(!o||i[1]>o[0]&&i[1]0&&o[o.length-1])&&(6===i[0]||2===i[0])){a=0;continue}if(3===i[0]&&(!o||i[1]>o[0]&&i[1]0?[2,Promise.reject(new Error("Unable to connect to the server with any of the available transports. "+i.join(" ")))]:[2,Promise.reject(new Error("None of the transports supported by the client are supported by the server."))]}})})},e.prototype.constructTransport=function(e){switch(e){case E.WebSockets:if(!this.options.WebSocket)throw new Error("'WebSocket' is not supported in your environment.");return new A(this.httpClient,this.accessTokenFactory,this.logger,this.options.logMessageContent||!1,this.options.WebSocket);case E.ServerSentEvents:if(!this.options.EventSource)throw new Error("'EventSource' is not supported in your environment.");return new O(this.httpClient,this.accessTokenFactory,this.logger,this.options.logMessageContent||!1,this.options.EventSource);case E.LongPolling:return new P(this.httpClient,this.accessTokenFactory,this.logger,this.options.logMessageContent||!1);default:throw new Error("Unknown transport: "+e+".")}},e.prototype.startTransport=function(e,t){var n=this;return this.transport.onreceive=this.onreceive,this.transport.onclose=function(e){return n.stopConnection(e)},this.transport.connect(e,t)},e.prototype.resolveTransportOrError=function(e,t,n){var r=E[e.transport];if(null==r)return this.logger.log(c.a.Debug,"Skipping transport '"+e.transport+"' because it is not supported by this client."),new Error("Skipping transport '"+e.transport+"' because it is not supported by this client.");if(!function(e,t){return!e||0!=(t&e)}(t,r))return this.logger.log(c.a.Debug,"Skipping transport '"+E[r]+"' because it was disabled by the client."),new Error("'"+E[r]+"' is disabled by the client.");if(!(e.transferFormats.map(function(e){return S[e]}).indexOf(n)>=0))return this.logger.log(c.a.Debug,"Skipping transport '"+E[r]+"' because it does not support the requested transfer format '"+S[n]+"'."),new Error("'"+E[r]+"' does not support "+S[n]+".");if(r===E.WebSockets&&!this.options.WebSocket||r===E.ServerSentEvents&&!this.options.EventSource)return this.logger.log(c.a.Debug,"Skipping transport '"+E[r]+"' because it is not supported in your environment.'"),new Error("'"+E[r]+"' is not supported in your environment.");this.logger.log(c.a.Debug,"Selecting transport '"+E[r]+"'.");try{return this.constructTransport(r)}catch(e){return e}},e.prototype.isITransport=function(e){return e&&"object"==typeof e&&"connect"in e},e.prototype.stopConnection=function(e){if(this.logger.log(c.a.Debug,"HttpConnection.stopConnection("+e+") called while in state "+this.connectionState+"."),this.transport=void 0,e=this.stopError||e,this.stopError=void 0,"Disconnected"!==this.connectionState)if("Connecting "!==this.connectionState){if("Disconnecting"===this.connectionState&&this.stopPromiseResolver(),e?this.logger.log(c.a.Error,"Connection disconnected with error '"+e+"'."):this.logger.log(c.a.Information,"Connection disconnected."),this.connectionId=void 0,this.connectionState="Disconnected",this.onclose&&this.connectionStarted){this.connectionStarted=!1;try{this.onclose(e)}catch(t){this.logger.log(c.a.Error,"HttpConnection.onclose("+e+") threw error '"+t+"'.")}}}else this.logger.log(c.a.Warning,"Call to HttpConnection.stopConnection("+e+") was ignored because the connection hasn't yet left the in the connecting state.");else this.logger.log(c.a.Debug,"Call to HttpConnection.stopConnection("+e+") was ignored because the connection is already in the disconnected state.")},e.prototype.resolveUrl=function(e){if(0===e.lastIndexOf("https://",0)||0===e.lastIndexOf("http://",0))return e;if(!g.c.isBrowser||!window.document)throw new Error("Cannot resolve '"+e+"'.");var t=window.document.createElement("a");return t.href=e,this.logger.log(c.a.Information,"Normalizing '"+e+"' to '"+t.href+"'."),t.href},e.prototype.resolveNegotiateUrl=function(e){var t=e.indexOf("?"),n=e.substring(0,-1===t?e.length:t);return"/"!==n[n.length-1]&&(n+="/"),n+="negotiate",-1===(n+=-1===t?"":e.substring(t)).indexOf("negotiateVersion")&&(n+=-1===t?"?":"&",n+="negotiateVersion="+this.negotiateVersion),n},e}();var q=function(){function e(e){this.transport=e,this.buffer=[],this.executing=!0,this.sendBufferedData=new W,this.transportResult=new W,this.sendLoopPromise=this.sendLoop()}return e.prototype.send=function(e){return this.bufferData(e),this.transportResult||(this.transportResult=new W),this.transportResult.promise},e.prototype.stop=function(){return this.executing=!1,this.sendBufferedData.resolve(),this.sendLoopPromise},e.prototype.bufferData=function(e){if(this.buffer.length&&typeof this.buffer[0]!=typeof e)throw new Error("Expected data to be of type "+typeof this.buffer+" but was of type "+typeof e);this.buffer.push(e),this.sendBufferedData.resolve()},e.prototype.sendLoop=function(){return B(this,void 0,void 0,function(){var t,n,r;return j(this,function(o){switch(o.label){case 0:return[4,this.sendBufferedData.promise];case 1:if(o.sent(),!this.executing)return this.transportResult&&this.transportResult.reject("Connection stopped."),[3,6];this.sendBufferedData=new W,t=this.transportResult,this.transportResult=void 0,n="string"==typeof this.buffer[0]?this.buffer.join(""):e.concatBuffers(this.buffer),this.buffer.length=0,o.label=2;case 2:return o.trys.push([2,4,,5]),[4,this.transport.send(n)];case 3:return o.sent(),t.resolve(),[3,5];case 4:return r=o.sent(),t.reject(r),[3,5];case 5:return[3,0];case 6:return[2]}})})},e.concatBuffers=function(e){for(var t=e.map(function(e){return e.byteLength}).reduce(function(e,t){return e+t}),n=new Uint8Array(t),r=0,o=0,i=e;o AdditionalAttributes { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } [System.Runtime.CompilerServices.CompilerGeneratedAttribute]set { } } + [Microsoft.AspNetCore.Components.ParameterAttribute] + public object Model { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } [System.Runtime.CompilerServices.CompilerGeneratedAttribute]set { } } protected override void BuildRenderTree(Microsoft.AspNetCore.Components.Rendering.RenderTreeBuilder builder) { } protected virtual void Dispose(bool disposing) { } protected override void OnParametersSet() { } diff --git a/src/Components/Web/ref/Microsoft.AspNetCore.Components.Web.netstandard2.0.cs b/src/Components/Web/ref/Microsoft.AspNetCore.Components.Web.netstandard2.0.cs index cb686083cd..534580160f 100644 --- a/src/Components/Web/ref/Microsoft.AspNetCore.Components.Web.netstandard2.0.cs +++ b/src/Components/Web/ref/Microsoft.AspNetCore.Components.Web.netstandard2.0.cs @@ -125,6 +125,8 @@ namespace Microsoft.AspNetCore.Components.Forms public ValidationSummary() { } [Microsoft.AspNetCore.Components.ParameterAttribute(CaptureUnmatchedValues=true)] public System.Collections.Generic.IReadOnlyDictionary AdditionalAttributes { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } [System.Runtime.CompilerServices.CompilerGeneratedAttribute]set { } } + [Microsoft.AspNetCore.Components.ParameterAttribute] + public object Model { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } [System.Runtime.CompilerServices.CompilerGeneratedAttribute]set { } } protected override void BuildRenderTree(Microsoft.AspNetCore.Components.Rendering.RenderTreeBuilder builder) { } protected virtual void Dispose(bool disposing) { } protected override void OnParametersSet() { } diff --git a/src/Components/Web/src/Forms/ValidationSummary.cs b/src/Components/Web/src/Forms/ValidationSummary.cs index 8e151b1e63..270f787176 100644 --- a/src/Components/Web/src/Forms/ValidationSummary.cs +++ b/src/Components/Web/src/Forms/ValidationSummary.cs @@ -19,6 +19,12 @@ namespace Microsoft.AspNetCore.Components.Forms private EditContext _previousEditContext; private readonly EventHandler _validationStateChangedHandler; + /// + /// Gets or sets the model to produce the list of validation messages for. + /// When specified, this lists all errors that are associated with the model instance. + /// + [Parameter] public object Model { get; set; } + /// /// Gets or sets a collection of additional attributes that will be applied to the created ul element. /// @@ -57,22 +63,31 @@ namespace Microsoft.AspNetCore.Components.Forms { // As an optimization, only evaluate the messages enumerable once, and // only produce the enclosing
    if there's at least one message - var messagesEnumerator = CurrentEditContext.GetValidationMessages().GetEnumerator(); - if (messagesEnumerator.MoveNext()) + var validationMessages = Model is null ? + CurrentEditContext.GetValidationMessages() : + CurrentEditContext.GetValidationMessages(new FieldIdentifier(Model, string.Empty)); + + var first = true; + foreach (var error in validationMessages) { - builder.OpenElement(0, "ul"); - builder.AddMultipleAttributes(1, AdditionalAttributes); - builder.AddAttribute(2, "class", "validation-errors"); - - do + if (first) { - builder.OpenElement(3, "li"); - builder.AddAttribute(4, "class", "validation-message"); - builder.AddContent(5, messagesEnumerator.Current); - builder.CloseElement(); - } - while (messagesEnumerator.MoveNext()); + first = false; + builder.OpenElement(0, "ul"); + builder.AddMultipleAttributes(1, AdditionalAttributes); + builder.AddAttribute(2, "class", "validation-errors"); + } + + builder.OpenElement(3, "li"); + builder.AddAttribute(4, "class", "validation-message"); + builder.AddContent(5, error); + builder.CloseElement(); + } + + if (!first) + { + // We have at least one validation message. builder.CloseElement(); } } diff --git a/src/Components/test/E2ETest/Tests/FormsTest.cs b/src/Components/test/E2ETest/Tests/FormsTest.cs index 2d622ba864..edd7404f6f 100644 --- a/src/Components/test/E2ETest/Tests/FormsTest.cs +++ b/src/Components/test/E2ETest/Tests/FormsTest.cs @@ -1,18 +1,17 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. +using System; +using System.Linq; +using System.Text.Json; +using System.Threading.Tasks; using BasicTestApp; using BasicTestApp.FormsTest; using Microsoft.AspNetCore.Components.E2ETest.Infrastructure; using Microsoft.AspNetCore.Components.E2ETest.Infrastructure.ServerFixtures; using Microsoft.AspNetCore.E2ETesting; -using Microsoft.AspNetCore.Testing; using OpenQA.Selenium; using OpenQA.Selenium.Support.UI; -using System; -using System.Linq; -using System.Text.Json; -using System.Threading.Tasks; using Xunit; using Xunit.Abstractions; @@ -34,14 +33,20 @@ namespace Microsoft.AspNetCore.Components.E2ETest.Tests Navigate(ServerPathBase, noReload: _serverFixture.ExecutionMode == ExecutionMode.Client); } + protected virtual IWebElement MountSimpleValidationComponent() + => Browser.MountTestComponent(); + + protected virtual IWebElement MountTypicalValidationComponent() + => Browser.MountTestComponent(); + [Fact] public async Task EditFormWorksWithDataAnnotationsValidator() { - var appElement = Browser.MountTestComponent(); + var appElement = MountSimpleValidationComponent();; var form = appElement.FindElement(By.TagName("form")); var userNameInput = appElement.FindElement(By.ClassName("user-name")).FindElement(By.TagName("input")); var acceptsTermsInput = appElement.FindElement(By.ClassName("accepts-terms")).FindElement(By.TagName("input")); - var submitButton = appElement.FindElement(By.TagName("button")); + var submitButton = appElement.FindElement(By.CssSelector("button[type=submit]")); var messagesAccessor = CreateValidationMessagesAccessor(appElement); // The form emits unmatched attributes @@ -77,7 +82,7 @@ namespace Microsoft.AspNetCore.Components.E2ETest.Tests [Fact] public void InputTextInteractsWithEditContext() { - var appElement = Browser.MountTestComponent(); + var appElement = MountTypicalValidationComponent(); var nameInput = appElement.FindElement(By.ClassName("name")).FindElement(By.TagName("input")); var messagesAccessor = CreateValidationMessagesAccessor(appElement); @@ -104,7 +109,7 @@ namespace Microsoft.AspNetCore.Components.E2ETest.Tests [Fact] public void InputNumberInteractsWithEditContext_NonNullableInt() { - var appElement = Browser.MountTestComponent(); + var appElement = MountTypicalValidationComponent(); var ageInput = appElement.FindElement(By.ClassName("age")).FindElement(By.TagName("input")); var messagesAccessor = CreateValidationMessagesAccessor(appElement); @@ -136,7 +141,7 @@ namespace Microsoft.AspNetCore.Components.E2ETest.Tests [Fact] public void InputNumberInteractsWithEditContext_NullableFloat() { - var appElement = Browser.MountTestComponent(); + var appElement = MountTypicalValidationComponent(); var heightInput = appElement.FindElement(By.ClassName("height")).FindElement(By.TagName("input")); var messagesAccessor = CreateValidationMessagesAccessor(appElement); @@ -160,7 +165,7 @@ namespace Microsoft.AspNetCore.Components.E2ETest.Tests [Fact] public void InputTextAreaInteractsWithEditContext() { - var appElement = Browser.MountTestComponent(); + var appElement = MountTypicalValidationComponent(); var descriptionInput = appElement.FindElement(By.ClassName("description")).FindElement(By.TagName("textarea")); var messagesAccessor = CreateValidationMessagesAccessor(appElement); @@ -187,7 +192,7 @@ namespace Microsoft.AspNetCore.Components.E2ETest.Tests [Fact] public void InputDateInteractsWithEditContext_NonNullableDateTime() { - var appElement = Browser.MountTestComponent(); + var appElement = MountTypicalValidationComponent(); var renewalDateInput = appElement.FindElement(By.ClassName("renewal-date")).FindElement(By.TagName("input")); var messagesAccessor = CreateValidationMessagesAccessor(appElement); @@ -218,7 +223,7 @@ namespace Microsoft.AspNetCore.Components.E2ETest.Tests [Fact] public void InputDateInteractsWithEditContext_NullableDateTimeOffset() { - var appElement = Browser.MountTestComponent(); + var appElement = MountTypicalValidationComponent(); var expiryDateInput = appElement.FindElement(By.ClassName("expiry-date")).FindElement(By.TagName("input")); var messagesAccessor = CreateValidationMessagesAccessor(appElement); @@ -241,7 +246,7 @@ namespace Microsoft.AspNetCore.Components.E2ETest.Tests [Fact] public void InputSelectInteractsWithEditContext() { - var appElement = Browser.MountTestComponent(); + var appElement = MountTypicalValidationComponent(); var ticketClassInput = new SelectElement(appElement.FindElement(By.ClassName("ticket-class")).FindElement(By.TagName("select"))); var select = ticketClassInput.WrappedElement; var messagesAccessor = CreateValidationMessagesAccessor(appElement); @@ -263,7 +268,7 @@ namespace Microsoft.AspNetCore.Components.E2ETest.Tests [Fact] public void InputCheckboxInteractsWithEditContext() { - var appElement = Browser.MountTestComponent(); + var appElement = MountTypicalValidationComponent(); var acceptsTermsInput = appElement.FindElement(By.ClassName("accepts-terms")).FindElement(By.TagName("input")); var isEvilInput = appElement.FindElement(By.ClassName("is-evil")).FindElement(By.TagName("input")); var messagesAccessor = CreateValidationMessagesAccessor(appElement); @@ -297,7 +302,7 @@ namespace Microsoft.AspNetCore.Components.E2ETest.Tests var appElement = Browser.MountTestComponent(); var userNameInput = appElement.FindElement(By.ClassName("user-name")).FindElement(By.TagName("input")); var acceptsTermsInput = appElement.FindElement(By.ClassName("accepts-terms")).FindElement(By.TagName("input")); - var submitButton = appElement.FindElement(By.TagName("button")); + var submitButton = appElement.FindElement(By.CssSelector("button[type=submit]")); var messagesAccessor = CreateValidationMessagesAccessor(appElement); var submissionStatus = appElement.FindElement(By.Id("submission-status")); @@ -331,11 +336,11 @@ namespace Microsoft.AspNetCore.Components.E2ETest.Tests [Fact] public void ValidationMessageDisplaysMessagesForField() { - var appElement = Browser.MountTestComponent(); + var appElement = MountTypicalValidationComponent(); var emailContainer = appElement.FindElement(By.ClassName("email")); var emailInput = emailContainer.FindElement(By.TagName("input")); var emailMessagesAccessor = CreateValidationMessagesAccessor(emailContainer); - var submitButton = appElement.FindElement(By.TagName("button")); + var submitButton = appElement.FindElement(By.CssSelector("button[type=submit]")); // Doesn't show messages for other fields submitButton.Click(); @@ -355,10 +360,43 @@ namespace Microsoft.AspNetCore.Components.E2ETest.Tests Browser.Empty(emailMessagesAccessor); } + [Fact] + public void ErrorsFromCompareAttribute() + { + var appElement = MountTypicalValidationComponent(); + var emailContainer = appElement.FindElement(By.ClassName("email")); + var emailInput = emailContainer.FindElement(By.TagName("input")); + var confirmEmailContainer = appElement.FindElement(By.ClassName("confirm-email")); + var confirmInput = confirmEmailContainer.FindElement(By.TagName("input")); + var confirmEmailValidationMessage = CreateValidationMessagesAccessor(confirmEmailContainer); + var modelErrors = CreateValidationMessagesAccessor(appElement.FindElement(By.ClassName("model-errors"))); + CreateValidationMessagesAccessor(emailContainer); + var submitButton = appElement.FindElement(By.CssSelector("button[type=submit]")); + + // Updates on edit + emailInput.SendKeys("a@b.com\t"); + + submitButton.Click(); + Browser.Empty(confirmEmailValidationMessage); + Browser.Equal(new[] { "Email and confirm email do not match." }, modelErrors); + + confirmInput.SendKeys("not-test@example.com\t"); + Browser.Equal(new[] { "Email and confirm email do not match." }, confirmEmailValidationMessage); + + // Can become correct + confirmInput.Clear(); + confirmInput.SendKeys("a@b.com\t"); + + Browser.Empty(confirmEmailValidationMessage); + + submitButton.Click(); + Browser.Empty(modelErrors); + } + [Fact] public void InputComponentsCauseContainerToRerenderOnChange() { - var appElement = Browser.MountTestComponent(); + var appElement = MountTypicalValidationComponent(); var ticketClassInput = new SelectElement(appElement.FindElement(By.ClassName("ticket-class")).FindElement(By.TagName("select"))); var selectedTicketClassDisplay = appElement.FindElement(By.Id("selected-ticket-class")); var messagesAccessor = CreateValidationMessagesAccessor(appElement); diff --git a/src/Components/test/E2ETest/Tests/FormsTestWithExperimentalValidator.cs b/src/Components/test/E2ETest/Tests/FormsTestWithExperimentalValidator.cs new file mode 100644 index 0000000000..dc2fb06b33 --- /dev/null +++ b/src/Components/test/E2ETest/Tests/FormsTestWithExperimentalValidator.cs @@ -0,0 +1,90 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using BasicTestApp.FormsTest; +using Microsoft.AspNetCore.Components.E2ETest.Infrastructure.ServerFixtures; +using Microsoft.AspNetCore.E2ETesting; +using OpenQA.Selenium; +using OpenQA.Selenium.Support.UI; +using Xunit; +using Xunit.Abstractions; + +namespace Microsoft.AspNetCore.Components.E2ETest.Tests +{ + public class FormsTestWithExperimentalValidator : FormsTest + { + public FormsTestWithExperimentalValidator( + BrowserFixture browserFixture, + ToggleExecutionModeServerFixture serverFixture, + ITestOutputHelper output) : base(browserFixture, serverFixture, output) + { + } + + protected override IWebElement MountSimpleValidationComponent() + => Browser.MountTestComponent(); + + protected override IWebElement MountTypicalValidationComponent() + => Browser.MountTestComponent(); + + [Fact] + public void EditFormWorksWithNestedValidation() + { + var appElement = Browser.MountTestComponent(); + + var nameInput = appElement.FindElement(By.CssSelector(".name input")); + var emailInput = appElement.FindElement(By.CssSelector(".email input")); + var confirmEmailInput = appElement.FindElement(By.CssSelector(".confirm-email input")); + var streetInput = appElement.FindElement(By.CssSelector(".street input")); + var zipInput = appElement.FindElement(By.CssSelector(".zip input")); + var countryInput = new SelectElement(appElement.FindElement(By.CssSelector(".country select"))); + var descriptionInput = appElement.FindElement(By.CssSelector(".description input")); + var weightInput = appElement.FindElement(By.CssSelector(".weight input")); + + var submitButton = appElement.FindElement(By.CssSelector("button[type=submit]")); + + submitButton.Click(); + + Browser.Equal(4, () => appElement.FindElements(By.CssSelector(".all-errors .validation-message")).Count); + + Browser.Equal("Enter a name", () => appElement.FindElement(By.CssSelector(".name .validation-message")).Text); + Browser.Equal("Enter an email", () => appElement.FindElement(By.CssSelector(".email .validation-message")).Text); + Browser.Equal("A street address is required.", () => appElement.FindElement(By.CssSelector(".street .validation-message")).Text); + Browser.Equal("Description is required.", () => appElement.FindElement(By.CssSelector(".description .validation-message")).Text); + + // Verify class-level validation + nameInput.SendKeys("Some person"); + emailInput.SendKeys("test@example.com"); + countryInput.SelectByValue("Mordor"); + descriptionInput.SendKeys("Fragile staff"); + streetInput.SendKeys("Mount Doom\t"); + + submitButton.Click(); + + // Verify member validation from IValidatableObject on a model property, CustomValidationAttribute on a model attribute, and BlazorCompareAttribute. + Browser.Equal("A ZipCode is required", () => appElement.FindElement(By.CssSelector(".zip .validation-message")).Text); + Browser.Equal("'Confirm email address' and 'EmailAddress' do not match.", () => appElement.FindElement(By.CssSelector(".confirm-email .validation-message")).Text); + Browser.Equal("Fragile items must be placed in secure containers", () => appElement.FindElement(By.CssSelector(".item-error .validation-message")).Text); + Browser.Equal(3, () => appElement.FindElements(By.CssSelector(".all-errors .validation-message")).Count); + + zipInput.SendKeys("98052"); + confirmEmailInput.SendKeys("test@example.com"); + descriptionInput.Clear(); + weightInput.SendKeys("0"); + descriptionInput.SendKeys("The One Ring\t"); + + submitButton.Click(); + // Verify validation from IValidatableObject on the model. + Browser.Equal("Some items in your list cannot be delivered.", () => appElement.FindElement(By.CssSelector(".model-errors .validation-message")).Text); + + Browser.Single(() => appElement.FindElements(By.CssSelector(".all-errors .validation-message"))); + + // Let's make sure the form submits + descriptionInput.Clear(); + descriptionInput.SendKeys("A different ring\t"); + submitButton.Click(); + + Browser.Empty(() => appElement.FindElements(By.CssSelector(".all-errors .validation-message"))); + Browser.Equal("OnValidSubmit", () => appElement.FindElement(By.CssSelector(".submission-log")).Text); + } + } +} diff --git a/src/Components/test/testassets/BasicTestApp/BasicTestApp.csproj b/src/Components/test/testassets/BasicTestApp/BasicTestApp.csproj index ac0e530516..98357d0e88 100644 --- a/src/Components/test/testassets/BasicTestApp/BasicTestApp.csproj +++ b/src/Components/test/testassets/BasicTestApp/BasicTestApp.csproj @@ -17,6 +17,7 @@ + diff --git a/src/Components/test/testassets/BasicTestApp/FormsTest/ExperimentalValidationComponent.razor b/src/Components/test/testassets/BasicTestApp/FormsTest/ExperimentalValidationComponent.razor new file mode 100644 index 0000000000..fe3df5382e --- /dev/null +++ b/src/Components/test/testassets/BasicTestApp/FormsTest/ExperimentalValidationComponent.razor @@ -0,0 +1,185 @@ +@using System.ComponentModel.DataAnnotations +@using Microsoft.AspNetCore.Components.Forms + +

    + This component is used to verify the use of the experimental ObjectGraphDataAnnotationsValidator type with IValidatableObject and deep validation, as well + as the ComparePropertyAttribute. +

    + + + + +

    + Name: + +

    + + + + + +
    + Items to deliver +

    + +

    +
      + @foreach (var item in model.Items) + { +
    • +
      +
      + + +
      + +
      + + +
      +
      + +
      +
      +
    • + } +
    +
    + +
    + Shipping details +

    + Street Address: + +

    +

    + Zip Code: + +

    +

    + Country: + + + + + + + + +

    +

    + +

    +
    + +
    + +
    + + +
    + +
    + +
    + +
      + @foreach (var entry in submissionLog) + { +
    • @entry
    • + } +
    + +@code { + Delivery model = new Delivery(); + + public class Delivery : IValidatableObject + { + [Required(ErrorMessage = "Enter a name")] + public string Recipient { get; set; } + + [Required(ErrorMessage = "Enter an email")] + [EmailAddress(ErrorMessage = "Enter a valid email address")] + public string EmailAddress { get; set; } + + [CompareProperty(nameof(EmailAddress))] + [Display(Name = "Confirm email address")] + public string ConfirmEmailAddress { get; set; } + + [ValidateComplexType] + public Address Address { get; } = new Address(); + + [ValidateComplexType] + public List Items { get; } = new List + { + new Item(), + }; + + public IEnumerable Validate(ValidationContext context) + { + if (Address.Street == "Mount Doom" && Items.Any(i => i.Description == "The One Ring")) + { + yield return new ValidationResult("Some items in your list cannot be delivered."); + } + } + } + + public class Address : IValidatableObject + { + [Required(ErrorMessage = "A street address is required.")] + public string Street { get; set; } + + public string ZipCode { get; set; } + + [EnumDataType(typeof(Country))] + public Country Country { get; set; } + + public IEnumerable Validate(ValidationContext context) + { + if (Country == Country.Mordor && string.IsNullOrEmpty(ZipCode)) + { + yield return new ValidationResult("A ZipCode is required", new[] { nameof(ZipCode) }); + } + } + } + + [CustomValidation(typeof(Item), nameof(Item.CustomValidate))] + public class Item + { + [Required(ErrorMessage = "Description is required.")] + public string Description { get; set; } + + [Range(0.1, 50, ErrorMessage = "Items must weigh between 0.1 and 5")] + public double Weight { get; set; } = 1; + + public static ValidationResult CustomValidate(Item item, ValidationContext context) + { + if (item.Weight < 2.0 && item.Description.StartsWith("Fragile")) + { + return new ValidationResult("Fragile items must be placed in secure containers"); + } + + return ValidationResult.Success; + } + } + + public enum Country { Gondor, Mordor, Rohan, Shire } + + List submissionLog = new List(); + + void HandleValidSubmit() + { + submissionLog.Add("OnValidSubmit"); + } + + void AddItem() + { + model.Items.Add(new Item()); + } +} diff --git a/src/Components/test/testassets/BasicTestApp/FormsTest/SimpleValidationComponent.razor b/src/Components/test/testassets/BasicTestApp/FormsTest/SimpleValidationComponent.razor index aa8ccfbe54..2c9a4d2456 100644 --- a/src/Components/test/testassets/BasicTestApp/FormsTest/SimpleValidationComponent.razor +++ b/src/Components/test/testassets/BasicTestApp/FormsTest/SimpleValidationComponent.razor @@ -2,7 +2,14 @@ @using Microsoft.AspNetCore.Components.Forms - + @if (UseExperimentalValidator) + { + + } + else + { + + }

    User name: @@ -29,6 +36,8 @@ } @code { + protected virtual bool UseExperimentalValidator => false; + string lastCallback; [Required(ErrorMessage = "Please choose a username")] diff --git a/src/Components/test/testassets/BasicTestApp/FormsTest/SimpleValidationComponentUsingExperimentalValidator.cs b/src/Components/test/testassets/BasicTestApp/FormsTest/SimpleValidationComponentUsingExperimentalValidator.cs new file mode 100644 index 0000000000..90484aad05 --- /dev/null +++ b/src/Components/test/testassets/BasicTestApp/FormsTest/SimpleValidationComponentUsingExperimentalValidator.cs @@ -0,0 +1,7 @@ +namespace BasicTestApp.FormsTest +{ + public class TypicalValidationComponentUsingExperimentalValidator : TypicalValidationComponent + { + protected override bool UseExperimentalValidator => true; + } +} diff --git a/src/Components/test/testassets/BasicTestApp/FormsTest/TypicalValidationComponent.razor b/src/Components/test/testassets/BasicTestApp/FormsTest/TypicalValidationComponent.razor index 1bd3b748d1..90b2f6a26b 100644 --- a/src/Components/test/testassets/BasicTestApp/FormsTest/TypicalValidationComponent.razor +++ b/src/Components/test/testassets/BasicTestApp/FormsTest/TypicalValidationComponent.razor @@ -2,7 +2,14 @@ @using Microsoft.AspNetCore.Components.Forms + @if (UseExperimentalValidator) + { + + } + else + { + }

    Name: @@ -11,6 +18,10 @@ Email:

    +

    Age (years):

    @@ -49,12 +60,18 @@ +

    + +

    +
      @foreach (var entry in submissionLog) {
    • @entry
    • }
    @code { + protected virtual bool UseExperimentalValidator => false; + Person person = new Person(); EditContext editContext; ValidationMessageStore customValidationMessageStore; @@ -75,6 +92,9 @@ [StringLength(10, ErrorMessage = "We only accept very short email addresses (max 10 chars)")] public string Email { get; set; } + [Compare(nameof(Email), ErrorMessage = "Email and confirm email do not match.")] + public string ConfirmEmail { get; set; } + [Range(0, 200, ErrorMessage = "Nobody is that old")] public int AgeInYears { get; set; } diff --git a/src/Components/test/testassets/BasicTestApp/FormsTest/TypicalValidationComponentUsingExperimentalValidator.cs b/src/Components/test/testassets/BasicTestApp/FormsTest/TypicalValidationComponentUsingExperimentalValidator.cs new file mode 100644 index 0000000000..9ede005a8a --- /dev/null +++ b/src/Components/test/testassets/BasicTestApp/FormsTest/TypicalValidationComponentUsingExperimentalValidator.cs @@ -0,0 +1,7 @@ +namespace BasicTestApp.FormsTest +{ + public class SimpleValidationComponentUsingExperimentalValidator : SimpleValidationComponent + { + protected override bool UseExperimentalValidator => true; + } +} diff --git a/src/Components/test/testassets/BasicTestApp/Index.razor b/src/Components/test/testassets/BasicTestApp/Index.razor index fe94ad595e..f836fa6c39 100644 --- a/src/Components/test/testassets/BasicTestApp/Index.razor +++ b/src/Components/test/testassets/BasicTestApp/Index.razor @@ -29,7 +29,10 @@ + + + diff --git a/src/Shared/E2ETesting/BrowserAssertFailedException.cs b/src/Shared/E2ETesting/BrowserAssertFailedException.cs index 007db0ac79..08d04a912d 100644 --- a/src/Shared/E2ETesting/BrowserAssertFailedException.cs +++ b/src/Shared/E2ETesting/BrowserAssertFailedException.cs @@ -4,6 +4,7 @@ using System; using System.Collections.Generic; using System.IO; +using System.Text; using Xunit.Sdk; namespace OpenQA.Selenium @@ -13,15 +14,31 @@ namespace OpenQA.Selenium // case. public class BrowserAssertFailedException : XunitException { - public BrowserAssertFailedException(IReadOnlyList logs, Exception innerException, string screenShotPath) - : base(BuildMessage(innerException, logs, screenShotPath), innerException) + public BrowserAssertFailedException(IReadOnlyList logs, Exception innerException, string screenShotPath, string innerHTML) + : base(BuildMessage(innerException, logs, screenShotPath, innerHTML), innerException) { } - private static string BuildMessage(Exception innerException, IReadOnlyList logs, string screenShotPath) => - innerException.ToString() + Environment.NewLine + - (File.Exists(screenShotPath) ? $"Screen shot captured at '{screenShotPath}'" + Environment.NewLine : "") + - (logs.Count > 0 ? "Encountered browser logs" : "No browser logs found") + " while running the assertion." + Environment.NewLine + - string.Join(Environment.NewLine, logs); + private static string BuildMessage(Exception exception, IReadOnlyList logs, string screenShotPath, string innerHTML) + { + var builder = new StringBuilder(); + builder.AppendLine(exception.ToString()); + + if (File.Exists(screenShotPath)) + { + builder.AppendLine($"Screen shot captured at '{screenShotPath}'"); + } + + if (logs.Count > 0) + { + builder.AppendLine("Encountered browser errors") + .AppendJoin(Environment.NewLine, logs); + } + + builder.AppendLine("Page content:") + .AppendLine(innerHTML); + + return builder.ToString(); + } } } diff --git a/src/Shared/E2ETesting/WaitAssert.cs b/src/Shared/E2ETesting/WaitAssert.cs index 4ef1446191..8792d2692f 100644 --- a/src/Shared/E2ETesting/WaitAssert.cs +++ b/src/Shared/E2ETesting/WaitAssert.cs @@ -101,6 +101,8 @@ namespace Microsoft.AspNetCore.E2ETesting // tests running concurrently might use the DefaultTimeout in their current assertion, which is fine. TestRunFailed = true; + var innerHtml = driver.FindElement(By.CssSelector(":first-child")).GetAttribute("innerHTML"); + var fileId = $"{Guid.NewGuid():N}.png"; var screenShotPath = Path.Combine(Path.GetFullPath(E2ETestOptions.Instance.ScreenShotsPath), fileId); var errors = driver.GetBrowserLogs(LogLevel.All); @@ -109,7 +111,7 @@ namespace Microsoft.AspNetCore.E2ETesting var exceptionInfo = lastException != null ? ExceptionDispatchInfo.Capture(lastException) : CaptureException(() => assertion()); - throw new BrowserAssertFailedException(errors, exceptionInfo.SourceException, screenShotPath); + throw new BrowserAssertFailedException(errors, exceptionInfo.SourceException, screenShotPath, innerHtml); } return result; From 19718f6011b9d0124e805af61584fda934a6f982 Mon Sep 17 00:00:00 2001 From: Javier Calvarro Nelson Date: Fri, 18 Oct 2019 22:03:52 +0200 Subject: [PATCH 13/32] =?UTF-8?q?[Blazor][Fixes=20#15155]=20Clarifies=20th?= =?UTF-8?q?e=20message=20to=20turn=20on=20detailed=20erro=E2=80=A6=20(#151?= =?UTF-8?q?56)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fixes https://github.com/aspnet/AspNetCore/issues/15155 --- src/Components/Server/src/Circuits/CircuitHost.cs | 6 +++--- .../ComponentHubInvalidEventTest.cs | 6 +++--- .../ComponentHubReliabilityTest.cs | 4 ++-- .../appsettings.Development.json | 13 +++++++------ 4 files changed, 15 insertions(+), 14 deletions(-) diff --git a/src/Components/Server/src/Circuits/CircuitHost.cs b/src/Components/Server/src/Circuits/CircuitHost.cs index bfb4b0cdae..68c4a01d2d 100644 --- a/src/Components/Server/src/Circuits/CircuitHost.cs +++ b/src/Components/Server/src/Circuits/CircuitHost.cs @@ -225,7 +225,7 @@ namespace Microsoft.AspNetCore.Components.Server.Circuits Log.ConnectionUp(_logger, CircuitId, Client.ConnectionId); Renderer.Dispatcher.AssertAccess(); - + List exceptions = null; for (var i = 0; i < _circuitHandlers.Length; i++) @@ -254,7 +254,7 @@ namespace Microsoft.AspNetCore.Components.Server.Circuits Log.ConnectionDown(_logger, CircuitId, Client.ConnectionId); Renderer.Dispatcher.AssertAccess(); - + List exceptions = null; for (var i = 0; i < _circuitHandlers.Length; i++) @@ -545,7 +545,7 @@ namespace Microsoft.AspNetCore.Components.Server.Circuits else { return $"There was an unhandled exception on the current circuit, so this circuit will be terminated. For more details turn on " + - $"detailed exceptions in '{typeof(CircuitOptions).Name}.{nameof(CircuitOptions.DetailedErrors)}'. {additionalInformation}"; + $"detailed exceptions by setting 'DetailedErrors: true' in 'appSettings.Development.json' or set '{typeof(CircuitOptions).Name}.{nameof(CircuitOptions.DetailedErrors)}'. {additionalInformation}"; } } diff --git a/src/Components/test/E2ETest/ServerExecutionTests/ComponentHubInvalidEventTest.cs b/src/Components/test/E2ETest/ServerExecutionTests/ComponentHubInvalidEventTest.cs index 65b48594f0..26bce75205 100644 --- a/src/Components/test/E2ETest/ServerExecutionTests/ComponentHubInvalidEventTest.cs +++ b/src/Components/test/E2ETest/ServerExecutionTests/ComponentHubInvalidEventTest.cs @@ -38,7 +38,7 @@ namespace Microsoft.AspNetCore.Components.E2ETest.ServerExecutionTests { // Arrange var expectedError = $"There was an unhandled exception on the current circuit, so this circuit will be terminated. For more details turn on " + - $"detailed exceptions in 'CircuitOptions.DetailedErrors'. Bad input data."; + $"detailed exceptions by setting 'DetailedErrors: true' in 'appSettings.Development.json' or set 'CircuitOptions.DetailedErrors'. Bad input data."; var eventDescriptor = Serialize(new WebEventDescriptor() { @@ -65,7 +65,7 @@ namespace Microsoft.AspNetCore.Components.E2ETest.ServerExecutionTests { // Arrange var expectedError = $"There was an unhandled exception on the current circuit, so this circuit will be terminated. For more details turn on " + - $"detailed exceptions in 'CircuitOptions.DetailedErrors'. Failed to dispatch event."; + $"detailed exceptions by setting 'DetailedErrors: true' in 'appSettings.Development.json' or set 'CircuitOptions.DetailedErrors'. Failed to dispatch event."; var eventDescriptor = Serialize(new WebEventDescriptor() { @@ -105,7 +105,7 @@ namespace Microsoft.AspNetCore.Components.E2ETest.ServerExecutionTests { // Arrange var expectedError = $"There was an unhandled exception on the current circuit, so this circuit will be terminated. For more details turn on " + - $"detailed exceptions in 'CircuitOptions.DetailedErrors'. Failed to complete render batch '1846'."; + $"detailed exceptions by setting 'DetailedErrors: true' in 'appSettings.Development.json' or set 'CircuitOptions.DetailedErrors'. Failed to complete render batch '1846'."; Client.ConfirmRenderBatch = false; diff --git a/src/Components/test/E2ETest/ServerExecutionTests/ComponentHubReliabilityTest.cs b/src/Components/test/E2ETest/ServerExecutionTests/ComponentHubReliabilityTest.cs index 42eae05174..707aad52b9 100644 --- a/src/Components/test/E2ETest/ServerExecutionTests/ComponentHubReliabilityTest.cs +++ b/src/Components/test/E2ETest/ServerExecutionTests/ComponentHubReliabilityTest.cs @@ -216,7 +216,7 @@ namespace Microsoft.AspNetCore.Components.E2ETest.ServerExecutionTests { // Arrange var expectedError = "There was an unhandled exception on the current circuit, so this circuit will be terminated. " + - "For more details turn on detailed exceptions in 'CircuitOptions.DetailedErrors'. " + + "For more details turn on detailed exceptions by setting 'DetailedErrors: true' in 'appSettings.Development.json' or set 'CircuitOptions.DetailedErrors'. " + "Location change to 'http://example.com' failed."; var rootUri = ServerFixture.RootUri; @@ -245,7 +245,7 @@ namespace Microsoft.AspNetCore.Components.E2ETest.ServerExecutionTests { // Arrange var expectedError = "There was an unhandled exception on the current circuit, so this circuit will be terminated. " + - "For more details turn on detailed exceptions in 'CircuitOptions.DetailedErrors'. " + + "For more details turn on detailed exceptions by setting 'DetailedErrors: true' in 'appSettings.Development.json' or set 'CircuitOptions.DetailedErrors'. " + "Location change failed."; var rootUri = ServerFixture.RootUri; diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/BlazorServerWeb-CSharp/appsettings.Development.json b/src/ProjectTemplates/Web.ProjectTemplates/content/BlazorServerWeb-CSharp/appsettings.Development.json index dba68eb124..2defd04095 100644 --- a/src/ProjectTemplates/Web.ProjectTemplates/content/BlazorServerWeb-CSharp/appsettings.Development.json +++ b/src/ProjectTemplates/Web.ProjectTemplates/content/BlazorServerWeb-CSharp/appsettings.Development.json @@ -1,9 +1,10 @@ -{ - "Logging": { - "LogLevel": { +{ + "DetailedErrors": true, + "Logging": { + "LogLevel": { "Default": "Information", "Microsoft": "Warning", "Microsoft.Hosting.Lifetime": "Information" - } - } -} + } + } +} From 5f3037df3f82e9cf1a13dfa0e0cc5f14683f70f2 Mon Sep 17 00:00:00 2001 From: "N. Taylor Mullen" Date: Fri, 18 Oct 2019 10:29:39 -0700 Subject: [PATCH 14/32] Add support for `EnableStopPropagation` and `EnablePreventDefault`. - For our current world Blazor both of these properties are always `true`. However, for other non-web Blazor scenarios the `EventHandler` attributes at that layer will turn off these features because they're specific to web. #14517 --- ...rosoft.AspNetCore.Components.netcoreapp.cs | 3 + ...ft.AspNetCore.Components.netstandard2.0.cs | 3 + .../Components/src/EventHandlerAttribute.cs | 25 ++- ...ft.AspNetCore.Components.Web.netcoreapp.cs | 182 +++++++++--------- ...spNetCore.Components.Web.netstandard2.0.cs | 182 +++++++++--------- src/Components/Web/src/Web/EventHandlers.cs | 182 +++++++++--------- 6 files changed, 303 insertions(+), 274 deletions(-) diff --git a/src/Components/Components/ref/Microsoft.AspNetCore.Components.netcoreapp.cs b/src/Components/Components/ref/Microsoft.AspNetCore.Components.netcoreapp.cs index 72adf28aa7..c4a48435b4 100644 --- a/src/Components/Components/ref/Microsoft.AspNetCore.Components.netcoreapp.cs +++ b/src/Components/Components/ref/Microsoft.AspNetCore.Components.netcoreapp.cs @@ -207,7 +207,10 @@ namespace Microsoft.AspNetCore.Components public sealed partial class EventHandlerAttribute : System.Attribute { public EventHandlerAttribute(string attributeName, System.Type eventArgsType) { } + public EventHandlerAttribute(string attributeName, System.Type eventArgsType, bool enableStopPropagation, bool enablePreventDefault) { } public string AttributeName { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } } + public bool EnablePreventDefault { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } } + public bool EnableStopPropagation { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } } public System.Type EventArgsType { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } } } public partial interface IComponent diff --git a/src/Components/Components/ref/Microsoft.AspNetCore.Components.netstandard2.0.cs b/src/Components/Components/ref/Microsoft.AspNetCore.Components.netstandard2.0.cs index 72adf28aa7..c4a48435b4 100644 --- a/src/Components/Components/ref/Microsoft.AspNetCore.Components.netstandard2.0.cs +++ b/src/Components/Components/ref/Microsoft.AspNetCore.Components.netstandard2.0.cs @@ -207,7 +207,10 @@ namespace Microsoft.AspNetCore.Components public sealed partial class EventHandlerAttribute : System.Attribute { public EventHandlerAttribute(string attributeName, System.Type eventArgsType) { } + public EventHandlerAttribute(string attributeName, System.Type eventArgsType, bool enableStopPropagation, bool enablePreventDefault) { } public string AttributeName { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } } + public bool EnablePreventDefault { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } } + public bool EnableStopPropagation { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } } public System.Type EventArgsType { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } } } public partial interface IComponent diff --git a/src/Components/Components/src/EventHandlerAttribute.cs b/src/Components/Components/src/EventHandlerAttribute.cs index 767b3c5b2a..67307fb9ef 100644 --- a/src/Components/Components/src/EventHandlerAttribute.cs +++ b/src/Components/Components/src/EventHandlerAttribute.cs @@ -16,7 +16,18 @@ namespace Microsoft.AspNetCore.Components /// /// /// - public EventHandlerAttribute(string attributeName, Type eventArgsType) + public EventHandlerAttribute(string attributeName, Type eventArgsType) : this(attributeName, eventArgsType, false, false) + { + } + + /// + /// Constructs an instance of . + /// + /// + /// + /// + /// + public EventHandlerAttribute(string attributeName, Type eventArgsType, bool enableStopPropagation, bool enablePreventDefault) { if (attributeName == null) { @@ -30,6 +41,8 @@ namespace Microsoft.AspNetCore.Components AttributeName = attributeName; EventArgsType = eventArgsType; + EnableStopPropagation = enableStopPropagation; + EnablePreventDefault = enablePreventDefault; } /// @@ -41,5 +54,15 @@ namespace Microsoft.AspNetCore.Components /// Gets the event argument type. /// public Type EventArgsType { get; } + + /// + /// Gets the event's ability to stop propagation. + /// + public bool EnableStopPropagation { get; } + + /// + /// Gets the event's ability to prevent default event flow. + /// + public bool EnablePreventDefault { get; } } } diff --git a/src/Components/Web/ref/Microsoft.AspNetCore.Components.Web.netcoreapp.cs b/src/Components/Web/ref/Microsoft.AspNetCore.Components.Web.netcoreapp.cs index 534580160f..4928dc03fd 100644 --- a/src/Components/Web/ref/Microsoft.AspNetCore.Components.Web.netcoreapp.cs +++ b/src/Components/Web/ref/Microsoft.AspNetCore.Components.Web.netcoreapp.cs @@ -224,97 +224,97 @@ namespace Microsoft.AspNetCore.Components.Web public string Message { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } [System.Runtime.CompilerServices.CompilerGeneratedAttribute]set { } } public string Type { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } [System.Runtime.CompilerServices.CompilerGeneratedAttribute]set { } } } - [Microsoft.AspNetCore.Components.EventHandlerAttribute("onabort", typeof(Microsoft.AspNetCore.Components.Web.ProgressEventArgs))] - [Microsoft.AspNetCore.Components.EventHandlerAttribute("onactivate", typeof(System.EventArgs))] - [Microsoft.AspNetCore.Components.EventHandlerAttribute("onbeforeactivate", typeof(System.EventArgs))] - [Microsoft.AspNetCore.Components.EventHandlerAttribute("onbeforecopy", typeof(System.EventArgs))] - [Microsoft.AspNetCore.Components.EventHandlerAttribute("onbeforecut", typeof(System.EventArgs))] - [Microsoft.AspNetCore.Components.EventHandlerAttribute("onbeforedeactivate", typeof(System.EventArgs))] - [Microsoft.AspNetCore.Components.EventHandlerAttribute("onbeforepaste", typeof(System.EventArgs))] - [Microsoft.AspNetCore.Components.EventHandlerAttribute("onblur", typeof(Microsoft.AspNetCore.Components.Web.FocusEventArgs))] - [Microsoft.AspNetCore.Components.EventHandlerAttribute("oncanplay", typeof(System.EventArgs))] - [Microsoft.AspNetCore.Components.EventHandlerAttribute("oncanplaythrough", typeof(System.EventArgs))] - [Microsoft.AspNetCore.Components.EventHandlerAttribute("onchange", typeof(Microsoft.AspNetCore.Components.ChangeEventArgs))] - [Microsoft.AspNetCore.Components.EventHandlerAttribute("onclick", typeof(Microsoft.AspNetCore.Components.Web.MouseEventArgs))] - [Microsoft.AspNetCore.Components.EventHandlerAttribute("oncontextmenu", typeof(Microsoft.AspNetCore.Components.Web.MouseEventArgs))] - [Microsoft.AspNetCore.Components.EventHandlerAttribute("oncopy", typeof(Microsoft.AspNetCore.Components.Web.ClipboardEventArgs))] - [Microsoft.AspNetCore.Components.EventHandlerAttribute("oncuechange", typeof(System.EventArgs))] - [Microsoft.AspNetCore.Components.EventHandlerAttribute("oncut", typeof(Microsoft.AspNetCore.Components.Web.ClipboardEventArgs))] - [Microsoft.AspNetCore.Components.EventHandlerAttribute("ondblclick", typeof(Microsoft.AspNetCore.Components.Web.MouseEventArgs))] - [Microsoft.AspNetCore.Components.EventHandlerAttribute("ondeactivate", typeof(System.EventArgs))] - [Microsoft.AspNetCore.Components.EventHandlerAttribute("ondrag", typeof(Microsoft.AspNetCore.Components.Web.DragEventArgs))] - [Microsoft.AspNetCore.Components.EventHandlerAttribute("ondragend", typeof(Microsoft.AspNetCore.Components.Web.DragEventArgs))] - [Microsoft.AspNetCore.Components.EventHandlerAttribute("ondragenter", typeof(Microsoft.AspNetCore.Components.Web.DragEventArgs))] - [Microsoft.AspNetCore.Components.EventHandlerAttribute("ondragleave", typeof(Microsoft.AspNetCore.Components.Web.DragEventArgs))] - [Microsoft.AspNetCore.Components.EventHandlerAttribute("ondragover", typeof(Microsoft.AspNetCore.Components.Web.DragEventArgs))] - [Microsoft.AspNetCore.Components.EventHandlerAttribute("ondragstart", typeof(Microsoft.AspNetCore.Components.Web.DragEventArgs))] - [Microsoft.AspNetCore.Components.EventHandlerAttribute("ondrop", typeof(Microsoft.AspNetCore.Components.Web.DragEventArgs))] - [Microsoft.AspNetCore.Components.EventHandlerAttribute("ondurationchange", typeof(System.EventArgs))] - [Microsoft.AspNetCore.Components.EventHandlerAttribute("onemptied", typeof(System.EventArgs))] - [Microsoft.AspNetCore.Components.EventHandlerAttribute("onended", typeof(System.EventArgs))] - [Microsoft.AspNetCore.Components.EventHandlerAttribute("onerror", typeof(Microsoft.AspNetCore.Components.Web.ErrorEventArgs))] - [Microsoft.AspNetCore.Components.EventHandlerAttribute("onfocus", typeof(Microsoft.AspNetCore.Components.Web.FocusEventArgs))] - [Microsoft.AspNetCore.Components.EventHandlerAttribute("onfocusin", typeof(Microsoft.AspNetCore.Components.Web.FocusEventArgs))] - [Microsoft.AspNetCore.Components.EventHandlerAttribute("onfocusout", typeof(Microsoft.AspNetCore.Components.Web.FocusEventArgs))] - [Microsoft.AspNetCore.Components.EventHandlerAttribute("onfullscreenchange", typeof(System.EventArgs))] - [Microsoft.AspNetCore.Components.EventHandlerAttribute("onfullscreenerror", typeof(System.EventArgs))] - [Microsoft.AspNetCore.Components.EventHandlerAttribute("ongotpointercapture", typeof(Microsoft.AspNetCore.Components.Web.PointerEventArgs))] - [Microsoft.AspNetCore.Components.EventHandlerAttribute("oninput", typeof(Microsoft.AspNetCore.Components.ChangeEventArgs))] - [Microsoft.AspNetCore.Components.EventHandlerAttribute("oninvalid", typeof(System.EventArgs))] - [Microsoft.AspNetCore.Components.EventHandlerAttribute("onkeydown", typeof(Microsoft.AspNetCore.Components.Web.KeyboardEventArgs))] - [Microsoft.AspNetCore.Components.EventHandlerAttribute("onkeypress", typeof(Microsoft.AspNetCore.Components.Web.KeyboardEventArgs))] - [Microsoft.AspNetCore.Components.EventHandlerAttribute("onkeyup", typeof(Microsoft.AspNetCore.Components.Web.KeyboardEventArgs))] - [Microsoft.AspNetCore.Components.EventHandlerAttribute("onload", typeof(Microsoft.AspNetCore.Components.Web.ProgressEventArgs))] - [Microsoft.AspNetCore.Components.EventHandlerAttribute("onloadeddata", typeof(System.EventArgs))] - [Microsoft.AspNetCore.Components.EventHandlerAttribute("onloadedmetadata", typeof(System.EventArgs))] - [Microsoft.AspNetCore.Components.EventHandlerAttribute("onloadend", typeof(Microsoft.AspNetCore.Components.Web.ProgressEventArgs))] - [Microsoft.AspNetCore.Components.EventHandlerAttribute("onloadstart", typeof(Microsoft.AspNetCore.Components.Web.ProgressEventArgs))] - [Microsoft.AspNetCore.Components.EventHandlerAttribute("onlostpointercapture", typeof(Microsoft.AspNetCore.Components.Web.PointerEventArgs))] - [Microsoft.AspNetCore.Components.EventHandlerAttribute("onmousedown", typeof(Microsoft.AspNetCore.Components.Web.MouseEventArgs))] - [Microsoft.AspNetCore.Components.EventHandlerAttribute("onmousemove", typeof(Microsoft.AspNetCore.Components.Web.MouseEventArgs))] - [Microsoft.AspNetCore.Components.EventHandlerAttribute("onmouseout", typeof(Microsoft.AspNetCore.Components.Web.MouseEventArgs))] - [Microsoft.AspNetCore.Components.EventHandlerAttribute("onmouseover", typeof(Microsoft.AspNetCore.Components.Web.MouseEventArgs))] - [Microsoft.AspNetCore.Components.EventHandlerAttribute("onmouseup", typeof(Microsoft.AspNetCore.Components.Web.MouseEventArgs))] - [Microsoft.AspNetCore.Components.EventHandlerAttribute("onmousewheel", typeof(Microsoft.AspNetCore.Components.Web.WheelEventArgs))] - [Microsoft.AspNetCore.Components.EventHandlerAttribute("onpaste", typeof(Microsoft.AspNetCore.Components.Web.ClipboardEventArgs))] - [Microsoft.AspNetCore.Components.EventHandlerAttribute("onpause", typeof(System.EventArgs))] - [Microsoft.AspNetCore.Components.EventHandlerAttribute("onplay", typeof(System.EventArgs))] - [Microsoft.AspNetCore.Components.EventHandlerAttribute("onplaying", typeof(System.EventArgs))] - [Microsoft.AspNetCore.Components.EventHandlerAttribute("onpointercancel", typeof(Microsoft.AspNetCore.Components.Web.PointerEventArgs))] - [Microsoft.AspNetCore.Components.EventHandlerAttribute("onpointerdown", typeof(Microsoft.AspNetCore.Components.Web.PointerEventArgs))] - [Microsoft.AspNetCore.Components.EventHandlerAttribute("onpointerenter", typeof(Microsoft.AspNetCore.Components.Web.PointerEventArgs))] - [Microsoft.AspNetCore.Components.EventHandlerAttribute("onpointerleave", typeof(Microsoft.AspNetCore.Components.Web.PointerEventArgs))] - [Microsoft.AspNetCore.Components.EventHandlerAttribute("onpointerlockchange", typeof(System.EventArgs))] - [Microsoft.AspNetCore.Components.EventHandlerAttribute("onpointerlockerror", typeof(System.EventArgs))] - [Microsoft.AspNetCore.Components.EventHandlerAttribute("onpointermove", typeof(Microsoft.AspNetCore.Components.Web.PointerEventArgs))] - [Microsoft.AspNetCore.Components.EventHandlerAttribute("onpointerout", typeof(Microsoft.AspNetCore.Components.Web.PointerEventArgs))] - [Microsoft.AspNetCore.Components.EventHandlerAttribute("onpointerover", typeof(Microsoft.AspNetCore.Components.Web.PointerEventArgs))] - [Microsoft.AspNetCore.Components.EventHandlerAttribute("onpointerup", typeof(Microsoft.AspNetCore.Components.Web.PointerEventArgs))] - [Microsoft.AspNetCore.Components.EventHandlerAttribute("onprogress", typeof(Microsoft.AspNetCore.Components.Web.ProgressEventArgs))] - [Microsoft.AspNetCore.Components.EventHandlerAttribute("onratechange", typeof(System.EventArgs))] - [Microsoft.AspNetCore.Components.EventHandlerAttribute("onreadystatechange", typeof(System.EventArgs))] - [Microsoft.AspNetCore.Components.EventHandlerAttribute("onreset", typeof(System.EventArgs))] - [Microsoft.AspNetCore.Components.EventHandlerAttribute("onscroll", typeof(System.EventArgs))] - [Microsoft.AspNetCore.Components.EventHandlerAttribute("onseeked", typeof(System.EventArgs))] - [Microsoft.AspNetCore.Components.EventHandlerAttribute("onseeking", typeof(System.EventArgs))] - [Microsoft.AspNetCore.Components.EventHandlerAttribute("onselect", typeof(System.EventArgs))] - [Microsoft.AspNetCore.Components.EventHandlerAttribute("onselectionchange", typeof(System.EventArgs))] - [Microsoft.AspNetCore.Components.EventHandlerAttribute("onselectstart", typeof(System.EventArgs))] - [Microsoft.AspNetCore.Components.EventHandlerAttribute("onstalled", typeof(System.EventArgs))] - [Microsoft.AspNetCore.Components.EventHandlerAttribute("onstop", typeof(System.EventArgs))] - [Microsoft.AspNetCore.Components.EventHandlerAttribute("onsubmit", typeof(System.EventArgs))] - [Microsoft.AspNetCore.Components.EventHandlerAttribute("onsuspend", typeof(System.EventArgs))] - [Microsoft.AspNetCore.Components.EventHandlerAttribute("ontimeout", typeof(Microsoft.AspNetCore.Components.Web.ProgressEventArgs))] - [Microsoft.AspNetCore.Components.EventHandlerAttribute("ontimeupdate", typeof(System.EventArgs))] - [Microsoft.AspNetCore.Components.EventHandlerAttribute("ontouchcancel", typeof(Microsoft.AspNetCore.Components.Web.TouchEventArgs))] - [Microsoft.AspNetCore.Components.EventHandlerAttribute("ontouchend", typeof(Microsoft.AspNetCore.Components.Web.TouchEventArgs))] - [Microsoft.AspNetCore.Components.EventHandlerAttribute("ontouchenter", typeof(Microsoft.AspNetCore.Components.Web.TouchEventArgs))] - [Microsoft.AspNetCore.Components.EventHandlerAttribute("ontouchleave", typeof(Microsoft.AspNetCore.Components.Web.TouchEventArgs))] - [Microsoft.AspNetCore.Components.EventHandlerAttribute("ontouchmove", typeof(Microsoft.AspNetCore.Components.Web.TouchEventArgs))] - [Microsoft.AspNetCore.Components.EventHandlerAttribute("ontouchstart", typeof(Microsoft.AspNetCore.Components.Web.TouchEventArgs))] - [Microsoft.AspNetCore.Components.EventHandlerAttribute("onvolumechange", typeof(System.EventArgs))] - [Microsoft.AspNetCore.Components.EventHandlerAttribute("onwaiting", typeof(System.EventArgs))] - [Microsoft.AspNetCore.Components.EventHandlerAttribute("onwheel", typeof(Microsoft.AspNetCore.Components.Web.WheelEventArgs))] + [Microsoft.AspNetCore.Components.EventHandlerAttribute("onabort", typeof(Microsoft.AspNetCore.Components.Web.ProgressEventArgs), true, true)] + [Microsoft.AspNetCore.Components.EventHandlerAttribute("onactivate", typeof(System.EventArgs), true, true)] + [Microsoft.AspNetCore.Components.EventHandlerAttribute("onbeforeactivate", typeof(System.EventArgs), true, true)] + [Microsoft.AspNetCore.Components.EventHandlerAttribute("onbeforecopy", typeof(System.EventArgs), true, true)] + [Microsoft.AspNetCore.Components.EventHandlerAttribute("onbeforecut", typeof(System.EventArgs), true, true)] + [Microsoft.AspNetCore.Components.EventHandlerAttribute("onbeforedeactivate", typeof(System.EventArgs), true, true)] + [Microsoft.AspNetCore.Components.EventHandlerAttribute("onbeforepaste", typeof(System.EventArgs), true, true)] + [Microsoft.AspNetCore.Components.EventHandlerAttribute("onblur", typeof(Microsoft.AspNetCore.Components.Web.FocusEventArgs), true, true)] + [Microsoft.AspNetCore.Components.EventHandlerAttribute("oncanplay", typeof(System.EventArgs), true, true)] + [Microsoft.AspNetCore.Components.EventHandlerAttribute("oncanplaythrough", typeof(System.EventArgs), true, true)] + [Microsoft.AspNetCore.Components.EventHandlerAttribute("onchange", typeof(Microsoft.AspNetCore.Components.ChangeEventArgs), true, true)] + [Microsoft.AspNetCore.Components.EventHandlerAttribute("onclick", typeof(Microsoft.AspNetCore.Components.Web.MouseEventArgs), true, true)] + [Microsoft.AspNetCore.Components.EventHandlerAttribute("oncontextmenu", typeof(Microsoft.AspNetCore.Components.Web.MouseEventArgs), true, true)] + [Microsoft.AspNetCore.Components.EventHandlerAttribute("oncopy", typeof(Microsoft.AspNetCore.Components.Web.ClipboardEventArgs), true, true)] + [Microsoft.AspNetCore.Components.EventHandlerAttribute("oncuechange", typeof(System.EventArgs), true, true)] + [Microsoft.AspNetCore.Components.EventHandlerAttribute("oncut", typeof(Microsoft.AspNetCore.Components.Web.ClipboardEventArgs), true, true)] + [Microsoft.AspNetCore.Components.EventHandlerAttribute("ondblclick", typeof(Microsoft.AspNetCore.Components.Web.MouseEventArgs), true, true)] + [Microsoft.AspNetCore.Components.EventHandlerAttribute("ondeactivate", typeof(System.EventArgs), true, true)] + [Microsoft.AspNetCore.Components.EventHandlerAttribute("ondrag", typeof(Microsoft.AspNetCore.Components.Web.DragEventArgs), true, true)] + [Microsoft.AspNetCore.Components.EventHandlerAttribute("ondragend", typeof(Microsoft.AspNetCore.Components.Web.DragEventArgs), true, true)] + [Microsoft.AspNetCore.Components.EventHandlerAttribute("ondragenter", typeof(Microsoft.AspNetCore.Components.Web.DragEventArgs), true, true)] + [Microsoft.AspNetCore.Components.EventHandlerAttribute("ondragleave", typeof(Microsoft.AspNetCore.Components.Web.DragEventArgs), true, true)] + [Microsoft.AspNetCore.Components.EventHandlerAttribute("ondragover", typeof(Microsoft.AspNetCore.Components.Web.DragEventArgs), true, true)] + [Microsoft.AspNetCore.Components.EventHandlerAttribute("ondragstart", typeof(Microsoft.AspNetCore.Components.Web.DragEventArgs), true, true)] + [Microsoft.AspNetCore.Components.EventHandlerAttribute("ondrop", typeof(Microsoft.AspNetCore.Components.Web.DragEventArgs), true, true)] + [Microsoft.AspNetCore.Components.EventHandlerAttribute("ondurationchange", typeof(System.EventArgs), true, true)] + [Microsoft.AspNetCore.Components.EventHandlerAttribute("onemptied", typeof(System.EventArgs), true, true)] + [Microsoft.AspNetCore.Components.EventHandlerAttribute("onended", typeof(System.EventArgs), true, true)] + [Microsoft.AspNetCore.Components.EventHandlerAttribute("onerror", typeof(Microsoft.AspNetCore.Components.Web.ErrorEventArgs), true, true)] + [Microsoft.AspNetCore.Components.EventHandlerAttribute("onfocus", typeof(Microsoft.AspNetCore.Components.Web.FocusEventArgs), true, true)] + [Microsoft.AspNetCore.Components.EventHandlerAttribute("onfocusin", typeof(Microsoft.AspNetCore.Components.Web.FocusEventArgs), true, true)] + [Microsoft.AspNetCore.Components.EventHandlerAttribute("onfocusout", typeof(Microsoft.AspNetCore.Components.Web.FocusEventArgs), true, true)] + [Microsoft.AspNetCore.Components.EventHandlerAttribute("onfullscreenchange", typeof(System.EventArgs), true, true)] + [Microsoft.AspNetCore.Components.EventHandlerAttribute("onfullscreenerror", typeof(System.EventArgs), true, true)] + [Microsoft.AspNetCore.Components.EventHandlerAttribute("ongotpointercapture", typeof(Microsoft.AspNetCore.Components.Web.PointerEventArgs), true, true)] + [Microsoft.AspNetCore.Components.EventHandlerAttribute("oninput", typeof(Microsoft.AspNetCore.Components.ChangeEventArgs), true, true)] + [Microsoft.AspNetCore.Components.EventHandlerAttribute("oninvalid", typeof(System.EventArgs), true, true)] + [Microsoft.AspNetCore.Components.EventHandlerAttribute("onkeydown", typeof(Microsoft.AspNetCore.Components.Web.KeyboardEventArgs), true, true)] + [Microsoft.AspNetCore.Components.EventHandlerAttribute("onkeypress", typeof(Microsoft.AspNetCore.Components.Web.KeyboardEventArgs), true, true)] + [Microsoft.AspNetCore.Components.EventHandlerAttribute("onkeyup", typeof(Microsoft.AspNetCore.Components.Web.KeyboardEventArgs), true, true)] + [Microsoft.AspNetCore.Components.EventHandlerAttribute("onload", typeof(Microsoft.AspNetCore.Components.Web.ProgressEventArgs), true, true)] + [Microsoft.AspNetCore.Components.EventHandlerAttribute("onloadeddata", typeof(System.EventArgs), true, true)] + [Microsoft.AspNetCore.Components.EventHandlerAttribute("onloadedmetadata", typeof(System.EventArgs), true, true)] + [Microsoft.AspNetCore.Components.EventHandlerAttribute("onloadend", typeof(Microsoft.AspNetCore.Components.Web.ProgressEventArgs), true, true)] + [Microsoft.AspNetCore.Components.EventHandlerAttribute("onloadstart", typeof(Microsoft.AspNetCore.Components.Web.ProgressEventArgs), true, true)] + [Microsoft.AspNetCore.Components.EventHandlerAttribute("onlostpointercapture", typeof(Microsoft.AspNetCore.Components.Web.PointerEventArgs), true, true)] + [Microsoft.AspNetCore.Components.EventHandlerAttribute("onmousedown", typeof(Microsoft.AspNetCore.Components.Web.MouseEventArgs), true, true)] + [Microsoft.AspNetCore.Components.EventHandlerAttribute("onmousemove", typeof(Microsoft.AspNetCore.Components.Web.MouseEventArgs), true, true)] + [Microsoft.AspNetCore.Components.EventHandlerAttribute("onmouseout", typeof(Microsoft.AspNetCore.Components.Web.MouseEventArgs), true, true)] + [Microsoft.AspNetCore.Components.EventHandlerAttribute("onmouseover", typeof(Microsoft.AspNetCore.Components.Web.MouseEventArgs), true, true)] + [Microsoft.AspNetCore.Components.EventHandlerAttribute("onmouseup", typeof(Microsoft.AspNetCore.Components.Web.MouseEventArgs), true, true)] + [Microsoft.AspNetCore.Components.EventHandlerAttribute("onmousewheel", typeof(Microsoft.AspNetCore.Components.Web.WheelEventArgs), true, true)] + [Microsoft.AspNetCore.Components.EventHandlerAttribute("onpaste", typeof(Microsoft.AspNetCore.Components.Web.ClipboardEventArgs), true, true)] + [Microsoft.AspNetCore.Components.EventHandlerAttribute("onpause", typeof(System.EventArgs), true, true)] + [Microsoft.AspNetCore.Components.EventHandlerAttribute("onplay", typeof(System.EventArgs), true, true)] + [Microsoft.AspNetCore.Components.EventHandlerAttribute("onplaying", typeof(System.EventArgs), true, true)] + [Microsoft.AspNetCore.Components.EventHandlerAttribute("onpointercancel", typeof(Microsoft.AspNetCore.Components.Web.PointerEventArgs), true, true)] + [Microsoft.AspNetCore.Components.EventHandlerAttribute("onpointerdown", typeof(Microsoft.AspNetCore.Components.Web.PointerEventArgs), true, true)] + [Microsoft.AspNetCore.Components.EventHandlerAttribute("onpointerenter", typeof(Microsoft.AspNetCore.Components.Web.PointerEventArgs), true, true)] + [Microsoft.AspNetCore.Components.EventHandlerAttribute("onpointerleave", typeof(Microsoft.AspNetCore.Components.Web.PointerEventArgs), true, true)] + [Microsoft.AspNetCore.Components.EventHandlerAttribute("onpointerlockchange", typeof(System.EventArgs), true, true)] + [Microsoft.AspNetCore.Components.EventHandlerAttribute("onpointerlockerror", typeof(System.EventArgs), true, true)] + [Microsoft.AspNetCore.Components.EventHandlerAttribute("onpointermove", typeof(Microsoft.AspNetCore.Components.Web.PointerEventArgs), true, true)] + [Microsoft.AspNetCore.Components.EventHandlerAttribute("onpointerout", typeof(Microsoft.AspNetCore.Components.Web.PointerEventArgs), true, true)] + [Microsoft.AspNetCore.Components.EventHandlerAttribute("onpointerover", typeof(Microsoft.AspNetCore.Components.Web.PointerEventArgs), true, true)] + [Microsoft.AspNetCore.Components.EventHandlerAttribute("onpointerup", typeof(Microsoft.AspNetCore.Components.Web.PointerEventArgs), true, true)] + [Microsoft.AspNetCore.Components.EventHandlerAttribute("onprogress", typeof(Microsoft.AspNetCore.Components.Web.ProgressEventArgs), true, true)] + [Microsoft.AspNetCore.Components.EventHandlerAttribute("onratechange", typeof(System.EventArgs), true, true)] + [Microsoft.AspNetCore.Components.EventHandlerAttribute("onreadystatechange", typeof(System.EventArgs), true, true)] + [Microsoft.AspNetCore.Components.EventHandlerAttribute("onreset", typeof(System.EventArgs), true, true)] + [Microsoft.AspNetCore.Components.EventHandlerAttribute("onscroll", typeof(System.EventArgs), true, true)] + [Microsoft.AspNetCore.Components.EventHandlerAttribute("onseeked", typeof(System.EventArgs), true, true)] + [Microsoft.AspNetCore.Components.EventHandlerAttribute("onseeking", typeof(System.EventArgs), true, true)] + [Microsoft.AspNetCore.Components.EventHandlerAttribute("onselect", typeof(System.EventArgs), true, true)] + [Microsoft.AspNetCore.Components.EventHandlerAttribute("onselectionchange", typeof(System.EventArgs), true, true)] + [Microsoft.AspNetCore.Components.EventHandlerAttribute("onselectstart", typeof(System.EventArgs), true, true)] + [Microsoft.AspNetCore.Components.EventHandlerAttribute("onstalled", typeof(System.EventArgs), true, true)] + [Microsoft.AspNetCore.Components.EventHandlerAttribute("onstop", typeof(System.EventArgs), true, true)] + [Microsoft.AspNetCore.Components.EventHandlerAttribute("onsubmit", typeof(System.EventArgs), true, true)] + [Microsoft.AspNetCore.Components.EventHandlerAttribute("onsuspend", typeof(System.EventArgs), true, true)] + [Microsoft.AspNetCore.Components.EventHandlerAttribute("ontimeout", typeof(Microsoft.AspNetCore.Components.Web.ProgressEventArgs), true, true)] + [Microsoft.AspNetCore.Components.EventHandlerAttribute("ontimeupdate", typeof(System.EventArgs), true, true)] + [Microsoft.AspNetCore.Components.EventHandlerAttribute("ontouchcancel", typeof(Microsoft.AspNetCore.Components.Web.TouchEventArgs), true, true)] + [Microsoft.AspNetCore.Components.EventHandlerAttribute("ontouchend", typeof(Microsoft.AspNetCore.Components.Web.TouchEventArgs), true, true)] + [Microsoft.AspNetCore.Components.EventHandlerAttribute("ontouchenter", typeof(Microsoft.AspNetCore.Components.Web.TouchEventArgs), true, true)] + [Microsoft.AspNetCore.Components.EventHandlerAttribute("ontouchleave", typeof(Microsoft.AspNetCore.Components.Web.TouchEventArgs), true, true)] + [Microsoft.AspNetCore.Components.EventHandlerAttribute("ontouchmove", typeof(Microsoft.AspNetCore.Components.Web.TouchEventArgs), true, true)] + [Microsoft.AspNetCore.Components.EventHandlerAttribute("ontouchstart", typeof(Microsoft.AspNetCore.Components.Web.TouchEventArgs), true, true)] + [Microsoft.AspNetCore.Components.EventHandlerAttribute("onvolumechange", typeof(System.EventArgs), true, true)] + [Microsoft.AspNetCore.Components.EventHandlerAttribute("onwaiting", typeof(System.EventArgs), true, true)] + [Microsoft.AspNetCore.Components.EventHandlerAttribute("onwheel", typeof(Microsoft.AspNetCore.Components.Web.WheelEventArgs), true, true)] public static partial class EventHandlers { } diff --git a/src/Components/Web/ref/Microsoft.AspNetCore.Components.Web.netstandard2.0.cs b/src/Components/Web/ref/Microsoft.AspNetCore.Components.Web.netstandard2.0.cs index 534580160f..4928dc03fd 100644 --- a/src/Components/Web/ref/Microsoft.AspNetCore.Components.Web.netstandard2.0.cs +++ b/src/Components/Web/ref/Microsoft.AspNetCore.Components.Web.netstandard2.0.cs @@ -224,97 +224,97 @@ namespace Microsoft.AspNetCore.Components.Web public string Message { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } [System.Runtime.CompilerServices.CompilerGeneratedAttribute]set { } } public string Type { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } [System.Runtime.CompilerServices.CompilerGeneratedAttribute]set { } } } - [Microsoft.AspNetCore.Components.EventHandlerAttribute("onabort", typeof(Microsoft.AspNetCore.Components.Web.ProgressEventArgs))] - [Microsoft.AspNetCore.Components.EventHandlerAttribute("onactivate", typeof(System.EventArgs))] - [Microsoft.AspNetCore.Components.EventHandlerAttribute("onbeforeactivate", typeof(System.EventArgs))] - [Microsoft.AspNetCore.Components.EventHandlerAttribute("onbeforecopy", typeof(System.EventArgs))] - [Microsoft.AspNetCore.Components.EventHandlerAttribute("onbeforecut", typeof(System.EventArgs))] - [Microsoft.AspNetCore.Components.EventHandlerAttribute("onbeforedeactivate", typeof(System.EventArgs))] - [Microsoft.AspNetCore.Components.EventHandlerAttribute("onbeforepaste", typeof(System.EventArgs))] - [Microsoft.AspNetCore.Components.EventHandlerAttribute("onblur", typeof(Microsoft.AspNetCore.Components.Web.FocusEventArgs))] - [Microsoft.AspNetCore.Components.EventHandlerAttribute("oncanplay", typeof(System.EventArgs))] - [Microsoft.AspNetCore.Components.EventHandlerAttribute("oncanplaythrough", typeof(System.EventArgs))] - [Microsoft.AspNetCore.Components.EventHandlerAttribute("onchange", typeof(Microsoft.AspNetCore.Components.ChangeEventArgs))] - [Microsoft.AspNetCore.Components.EventHandlerAttribute("onclick", typeof(Microsoft.AspNetCore.Components.Web.MouseEventArgs))] - [Microsoft.AspNetCore.Components.EventHandlerAttribute("oncontextmenu", typeof(Microsoft.AspNetCore.Components.Web.MouseEventArgs))] - [Microsoft.AspNetCore.Components.EventHandlerAttribute("oncopy", typeof(Microsoft.AspNetCore.Components.Web.ClipboardEventArgs))] - [Microsoft.AspNetCore.Components.EventHandlerAttribute("oncuechange", typeof(System.EventArgs))] - [Microsoft.AspNetCore.Components.EventHandlerAttribute("oncut", typeof(Microsoft.AspNetCore.Components.Web.ClipboardEventArgs))] - [Microsoft.AspNetCore.Components.EventHandlerAttribute("ondblclick", typeof(Microsoft.AspNetCore.Components.Web.MouseEventArgs))] - [Microsoft.AspNetCore.Components.EventHandlerAttribute("ondeactivate", typeof(System.EventArgs))] - [Microsoft.AspNetCore.Components.EventHandlerAttribute("ondrag", typeof(Microsoft.AspNetCore.Components.Web.DragEventArgs))] - [Microsoft.AspNetCore.Components.EventHandlerAttribute("ondragend", typeof(Microsoft.AspNetCore.Components.Web.DragEventArgs))] - [Microsoft.AspNetCore.Components.EventHandlerAttribute("ondragenter", typeof(Microsoft.AspNetCore.Components.Web.DragEventArgs))] - [Microsoft.AspNetCore.Components.EventHandlerAttribute("ondragleave", typeof(Microsoft.AspNetCore.Components.Web.DragEventArgs))] - [Microsoft.AspNetCore.Components.EventHandlerAttribute("ondragover", typeof(Microsoft.AspNetCore.Components.Web.DragEventArgs))] - [Microsoft.AspNetCore.Components.EventHandlerAttribute("ondragstart", typeof(Microsoft.AspNetCore.Components.Web.DragEventArgs))] - [Microsoft.AspNetCore.Components.EventHandlerAttribute("ondrop", typeof(Microsoft.AspNetCore.Components.Web.DragEventArgs))] - [Microsoft.AspNetCore.Components.EventHandlerAttribute("ondurationchange", typeof(System.EventArgs))] - [Microsoft.AspNetCore.Components.EventHandlerAttribute("onemptied", typeof(System.EventArgs))] - [Microsoft.AspNetCore.Components.EventHandlerAttribute("onended", typeof(System.EventArgs))] - [Microsoft.AspNetCore.Components.EventHandlerAttribute("onerror", typeof(Microsoft.AspNetCore.Components.Web.ErrorEventArgs))] - [Microsoft.AspNetCore.Components.EventHandlerAttribute("onfocus", typeof(Microsoft.AspNetCore.Components.Web.FocusEventArgs))] - [Microsoft.AspNetCore.Components.EventHandlerAttribute("onfocusin", typeof(Microsoft.AspNetCore.Components.Web.FocusEventArgs))] - [Microsoft.AspNetCore.Components.EventHandlerAttribute("onfocusout", typeof(Microsoft.AspNetCore.Components.Web.FocusEventArgs))] - [Microsoft.AspNetCore.Components.EventHandlerAttribute("onfullscreenchange", typeof(System.EventArgs))] - [Microsoft.AspNetCore.Components.EventHandlerAttribute("onfullscreenerror", typeof(System.EventArgs))] - [Microsoft.AspNetCore.Components.EventHandlerAttribute("ongotpointercapture", typeof(Microsoft.AspNetCore.Components.Web.PointerEventArgs))] - [Microsoft.AspNetCore.Components.EventHandlerAttribute("oninput", typeof(Microsoft.AspNetCore.Components.ChangeEventArgs))] - [Microsoft.AspNetCore.Components.EventHandlerAttribute("oninvalid", typeof(System.EventArgs))] - [Microsoft.AspNetCore.Components.EventHandlerAttribute("onkeydown", typeof(Microsoft.AspNetCore.Components.Web.KeyboardEventArgs))] - [Microsoft.AspNetCore.Components.EventHandlerAttribute("onkeypress", typeof(Microsoft.AspNetCore.Components.Web.KeyboardEventArgs))] - [Microsoft.AspNetCore.Components.EventHandlerAttribute("onkeyup", typeof(Microsoft.AspNetCore.Components.Web.KeyboardEventArgs))] - [Microsoft.AspNetCore.Components.EventHandlerAttribute("onload", typeof(Microsoft.AspNetCore.Components.Web.ProgressEventArgs))] - [Microsoft.AspNetCore.Components.EventHandlerAttribute("onloadeddata", typeof(System.EventArgs))] - [Microsoft.AspNetCore.Components.EventHandlerAttribute("onloadedmetadata", typeof(System.EventArgs))] - [Microsoft.AspNetCore.Components.EventHandlerAttribute("onloadend", typeof(Microsoft.AspNetCore.Components.Web.ProgressEventArgs))] - [Microsoft.AspNetCore.Components.EventHandlerAttribute("onloadstart", typeof(Microsoft.AspNetCore.Components.Web.ProgressEventArgs))] - [Microsoft.AspNetCore.Components.EventHandlerAttribute("onlostpointercapture", typeof(Microsoft.AspNetCore.Components.Web.PointerEventArgs))] - [Microsoft.AspNetCore.Components.EventHandlerAttribute("onmousedown", typeof(Microsoft.AspNetCore.Components.Web.MouseEventArgs))] - [Microsoft.AspNetCore.Components.EventHandlerAttribute("onmousemove", typeof(Microsoft.AspNetCore.Components.Web.MouseEventArgs))] - [Microsoft.AspNetCore.Components.EventHandlerAttribute("onmouseout", typeof(Microsoft.AspNetCore.Components.Web.MouseEventArgs))] - [Microsoft.AspNetCore.Components.EventHandlerAttribute("onmouseover", typeof(Microsoft.AspNetCore.Components.Web.MouseEventArgs))] - [Microsoft.AspNetCore.Components.EventHandlerAttribute("onmouseup", typeof(Microsoft.AspNetCore.Components.Web.MouseEventArgs))] - [Microsoft.AspNetCore.Components.EventHandlerAttribute("onmousewheel", typeof(Microsoft.AspNetCore.Components.Web.WheelEventArgs))] - [Microsoft.AspNetCore.Components.EventHandlerAttribute("onpaste", typeof(Microsoft.AspNetCore.Components.Web.ClipboardEventArgs))] - [Microsoft.AspNetCore.Components.EventHandlerAttribute("onpause", typeof(System.EventArgs))] - [Microsoft.AspNetCore.Components.EventHandlerAttribute("onplay", typeof(System.EventArgs))] - [Microsoft.AspNetCore.Components.EventHandlerAttribute("onplaying", typeof(System.EventArgs))] - [Microsoft.AspNetCore.Components.EventHandlerAttribute("onpointercancel", typeof(Microsoft.AspNetCore.Components.Web.PointerEventArgs))] - [Microsoft.AspNetCore.Components.EventHandlerAttribute("onpointerdown", typeof(Microsoft.AspNetCore.Components.Web.PointerEventArgs))] - [Microsoft.AspNetCore.Components.EventHandlerAttribute("onpointerenter", typeof(Microsoft.AspNetCore.Components.Web.PointerEventArgs))] - [Microsoft.AspNetCore.Components.EventHandlerAttribute("onpointerleave", typeof(Microsoft.AspNetCore.Components.Web.PointerEventArgs))] - [Microsoft.AspNetCore.Components.EventHandlerAttribute("onpointerlockchange", typeof(System.EventArgs))] - [Microsoft.AspNetCore.Components.EventHandlerAttribute("onpointerlockerror", typeof(System.EventArgs))] - [Microsoft.AspNetCore.Components.EventHandlerAttribute("onpointermove", typeof(Microsoft.AspNetCore.Components.Web.PointerEventArgs))] - [Microsoft.AspNetCore.Components.EventHandlerAttribute("onpointerout", typeof(Microsoft.AspNetCore.Components.Web.PointerEventArgs))] - [Microsoft.AspNetCore.Components.EventHandlerAttribute("onpointerover", typeof(Microsoft.AspNetCore.Components.Web.PointerEventArgs))] - [Microsoft.AspNetCore.Components.EventHandlerAttribute("onpointerup", typeof(Microsoft.AspNetCore.Components.Web.PointerEventArgs))] - [Microsoft.AspNetCore.Components.EventHandlerAttribute("onprogress", typeof(Microsoft.AspNetCore.Components.Web.ProgressEventArgs))] - [Microsoft.AspNetCore.Components.EventHandlerAttribute("onratechange", typeof(System.EventArgs))] - [Microsoft.AspNetCore.Components.EventHandlerAttribute("onreadystatechange", typeof(System.EventArgs))] - [Microsoft.AspNetCore.Components.EventHandlerAttribute("onreset", typeof(System.EventArgs))] - [Microsoft.AspNetCore.Components.EventHandlerAttribute("onscroll", typeof(System.EventArgs))] - [Microsoft.AspNetCore.Components.EventHandlerAttribute("onseeked", typeof(System.EventArgs))] - [Microsoft.AspNetCore.Components.EventHandlerAttribute("onseeking", typeof(System.EventArgs))] - [Microsoft.AspNetCore.Components.EventHandlerAttribute("onselect", typeof(System.EventArgs))] - [Microsoft.AspNetCore.Components.EventHandlerAttribute("onselectionchange", typeof(System.EventArgs))] - [Microsoft.AspNetCore.Components.EventHandlerAttribute("onselectstart", typeof(System.EventArgs))] - [Microsoft.AspNetCore.Components.EventHandlerAttribute("onstalled", typeof(System.EventArgs))] - [Microsoft.AspNetCore.Components.EventHandlerAttribute("onstop", typeof(System.EventArgs))] - [Microsoft.AspNetCore.Components.EventHandlerAttribute("onsubmit", typeof(System.EventArgs))] - [Microsoft.AspNetCore.Components.EventHandlerAttribute("onsuspend", typeof(System.EventArgs))] - [Microsoft.AspNetCore.Components.EventHandlerAttribute("ontimeout", typeof(Microsoft.AspNetCore.Components.Web.ProgressEventArgs))] - [Microsoft.AspNetCore.Components.EventHandlerAttribute("ontimeupdate", typeof(System.EventArgs))] - [Microsoft.AspNetCore.Components.EventHandlerAttribute("ontouchcancel", typeof(Microsoft.AspNetCore.Components.Web.TouchEventArgs))] - [Microsoft.AspNetCore.Components.EventHandlerAttribute("ontouchend", typeof(Microsoft.AspNetCore.Components.Web.TouchEventArgs))] - [Microsoft.AspNetCore.Components.EventHandlerAttribute("ontouchenter", typeof(Microsoft.AspNetCore.Components.Web.TouchEventArgs))] - [Microsoft.AspNetCore.Components.EventHandlerAttribute("ontouchleave", typeof(Microsoft.AspNetCore.Components.Web.TouchEventArgs))] - [Microsoft.AspNetCore.Components.EventHandlerAttribute("ontouchmove", typeof(Microsoft.AspNetCore.Components.Web.TouchEventArgs))] - [Microsoft.AspNetCore.Components.EventHandlerAttribute("ontouchstart", typeof(Microsoft.AspNetCore.Components.Web.TouchEventArgs))] - [Microsoft.AspNetCore.Components.EventHandlerAttribute("onvolumechange", typeof(System.EventArgs))] - [Microsoft.AspNetCore.Components.EventHandlerAttribute("onwaiting", typeof(System.EventArgs))] - [Microsoft.AspNetCore.Components.EventHandlerAttribute("onwheel", typeof(Microsoft.AspNetCore.Components.Web.WheelEventArgs))] + [Microsoft.AspNetCore.Components.EventHandlerAttribute("onabort", typeof(Microsoft.AspNetCore.Components.Web.ProgressEventArgs), true, true)] + [Microsoft.AspNetCore.Components.EventHandlerAttribute("onactivate", typeof(System.EventArgs), true, true)] + [Microsoft.AspNetCore.Components.EventHandlerAttribute("onbeforeactivate", typeof(System.EventArgs), true, true)] + [Microsoft.AspNetCore.Components.EventHandlerAttribute("onbeforecopy", typeof(System.EventArgs), true, true)] + [Microsoft.AspNetCore.Components.EventHandlerAttribute("onbeforecut", typeof(System.EventArgs), true, true)] + [Microsoft.AspNetCore.Components.EventHandlerAttribute("onbeforedeactivate", typeof(System.EventArgs), true, true)] + [Microsoft.AspNetCore.Components.EventHandlerAttribute("onbeforepaste", typeof(System.EventArgs), true, true)] + [Microsoft.AspNetCore.Components.EventHandlerAttribute("onblur", typeof(Microsoft.AspNetCore.Components.Web.FocusEventArgs), true, true)] + [Microsoft.AspNetCore.Components.EventHandlerAttribute("oncanplay", typeof(System.EventArgs), true, true)] + [Microsoft.AspNetCore.Components.EventHandlerAttribute("oncanplaythrough", typeof(System.EventArgs), true, true)] + [Microsoft.AspNetCore.Components.EventHandlerAttribute("onchange", typeof(Microsoft.AspNetCore.Components.ChangeEventArgs), true, true)] + [Microsoft.AspNetCore.Components.EventHandlerAttribute("onclick", typeof(Microsoft.AspNetCore.Components.Web.MouseEventArgs), true, true)] + [Microsoft.AspNetCore.Components.EventHandlerAttribute("oncontextmenu", typeof(Microsoft.AspNetCore.Components.Web.MouseEventArgs), true, true)] + [Microsoft.AspNetCore.Components.EventHandlerAttribute("oncopy", typeof(Microsoft.AspNetCore.Components.Web.ClipboardEventArgs), true, true)] + [Microsoft.AspNetCore.Components.EventHandlerAttribute("oncuechange", typeof(System.EventArgs), true, true)] + [Microsoft.AspNetCore.Components.EventHandlerAttribute("oncut", typeof(Microsoft.AspNetCore.Components.Web.ClipboardEventArgs), true, true)] + [Microsoft.AspNetCore.Components.EventHandlerAttribute("ondblclick", typeof(Microsoft.AspNetCore.Components.Web.MouseEventArgs), true, true)] + [Microsoft.AspNetCore.Components.EventHandlerAttribute("ondeactivate", typeof(System.EventArgs), true, true)] + [Microsoft.AspNetCore.Components.EventHandlerAttribute("ondrag", typeof(Microsoft.AspNetCore.Components.Web.DragEventArgs), true, true)] + [Microsoft.AspNetCore.Components.EventHandlerAttribute("ondragend", typeof(Microsoft.AspNetCore.Components.Web.DragEventArgs), true, true)] + [Microsoft.AspNetCore.Components.EventHandlerAttribute("ondragenter", typeof(Microsoft.AspNetCore.Components.Web.DragEventArgs), true, true)] + [Microsoft.AspNetCore.Components.EventHandlerAttribute("ondragleave", typeof(Microsoft.AspNetCore.Components.Web.DragEventArgs), true, true)] + [Microsoft.AspNetCore.Components.EventHandlerAttribute("ondragover", typeof(Microsoft.AspNetCore.Components.Web.DragEventArgs), true, true)] + [Microsoft.AspNetCore.Components.EventHandlerAttribute("ondragstart", typeof(Microsoft.AspNetCore.Components.Web.DragEventArgs), true, true)] + [Microsoft.AspNetCore.Components.EventHandlerAttribute("ondrop", typeof(Microsoft.AspNetCore.Components.Web.DragEventArgs), true, true)] + [Microsoft.AspNetCore.Components.EventHandlerAttribute("ondurationchange", typeof(System.EventArgs), true, true)] + [Microsoft.AspNetCore.Components.EventHandlerAttribute("onemptied", typeof(System.EventArgs), true, true)] + [Microsoft.AspNetCore.Components.EventHandlerAttribute("onended", typeof(System.EventArgs), true, true)] + [Microsoft.AspNetCore.Components.EventHandlerAttribute("onerror", typeof(Microsoft.AspNetCore.Components.Web.ErrorEventArgs), true, true)] + [Microsoft.AspNetCore.Components.EventHandlerAttribute("onfocus", typeof(Microsoft.AspNetCore.Components.Web.FocusEventArgs), true, true)] + [Microsoft.AspNetCore.Components.EventHandlerAttribute("onfocusin", typeof(Microsoft.AspNetCore.Components.Web.FocusEventArgs), true, true)] + [Microsoft.AspNetCore.Components.EventHandlerAttribute("onfocusout", typeof(Microsoft.AspNetCore.Components.Web.FocusEventArgs), true, true)] + [Microsoft.AspNetCore.Components.EventHandlerAttribute("onfullscreenchange", typeof(System.EventArgs), true, true)] + [Microsoft.AspNetCore.Components.EventHandlerAttribute("onfullscreenerror", typeof(System.EventArgs), true, true)] + [Microsoft.AspNetCore.Components.EventHandlerAttribute("ongotpointercapture", typeof(Microsoft.AspNetCore.Components.Web.PointerEventArgs), true, true)] + [Microsoft.AspNetCore.Components.EventHandlerAttribute("oninput", typeof(Microsoft.AspNetCore.Components.ChangeEventArgs), true, true)] + [Microsoft.AspNetCore.Components.EventHandlerAttribute("oninvalid", typeof(System.EventArgs), true, true)] + [Microsoft.AspNetCore.Components.EventHandlerAttribute("onkeydown", typeof(Microsoft.AspNetCore.Components.Web.KeyboardEventArgs), true, true)] + [Microsoft.AspNetCore.Components.EventHandlerAttribute("onkeypress", typeof(Microsoft.AspNetCore.Components.Web.KeyboardEventArgs), true, true)] + [Microsoft.AspNetCore.Components.EventHandlerAttribute("onkeyup", typeof(Microsoft.AspNetCore.Components.Web.KeyboardEventArgs), true, true)] + [Microsoft.AspNetCore.Components.EventHandlerAttribute("onload", typeof(Microsoft.AspNetCore.Components.Web.ProgressEventArgs), true, true)] + [Microsoft.AspNetCore.Components.EventHandlerAttribute("onloadeddata", typeof(System.EventArgs), true, true)] + [Microsoft.AspNetCore.Components.EventHandlerAttribute("onloadedmetadata", typeof(System.EventArgs), true, true)] + [Microsoft.AspNetCore.Components.EventHandlerAttribute("onloadend", typeof(Microsoft.AspNetCore.Components.Web.ProgressEventArgs), true, true)] + [Microsoft.AspNetCore.Components.EventHandlerAttribute("onloadstart", typeof(Microsoft.AspNetCore.Components.Web.ProgressEventArgs), true, true)] + [Microsoft.AspNetCore.Components.EventHandlerAttribute("onlostpointercapture", typeof(Microsoft.AspNetCore.Components.Web.PointerEventArgs), true, true)] + [Microsoft.AspNetCore.Components.EventHandlerAttribute("onmousedown", typeof(Microsoft.AspNetCore.Components.Web.MouseEventArgs), true, true)] + [Microsoft.AspNetCore.Components.EventHandlerAttribute("onmousemove", typeof(Microsoft.AspNetCore.Components.Web.MouseEventArgs), true, true)] + [Microsoft.AspNetCore.Components.EventHandlerAttribute("onmouseout", typeof(Microsoft.AspNetCore.Components.Web.MouseEventArgs), true, true)] + [Microsoft.AspNetCore.Components.EventHandlerAttribute("onmouseover", typeof(Microsoft.AspNetCore.Components.Web.MouseEventArgs), true, true)] + [Microsoft.AspNetCore.Components.EventHandlerAttribute("onmouseup", typeof(Microsoft.AspNetCore.Components.Web.MouseEventArgs), true, true)] + [Microsoft.AspNetCore.Components.EventHandlerAttribute("onmousewheel", typeof(Microsoft.AspNetCore.Components.Web.WheelEventArgs), true, true)] + [Microsoft.AspNetCore.Components.EventHandlerAttribute("onpaste", typeof(Microsoft.AspNetCore.Components.Web.ClipboardEventArgs), true, true)] + [Microsoft.AspNetCore.Components.EventHandlerAttribute("onpause", typeof(System.EventArgs), true, true)] + [Microsoft.AspNetCore.Components.EventHandlerAttribute("onplay", typeof(System.EventArgs), true, true)] + [Microsoft.AspNetCore.Components.EventHandlerAttribute("onplaying", typeof(System.EventArgs), true, true)] + [Microsoft.AspNetCore.Components.EventHandlerAttribute("onpointercancel", typeof(Microsoft.AspNetCore.Components.Web.PointerEventArgs), true, true)] + [Microsoft.AspNetCore.Components.EventHandlerAttribute("onpointerdown", typeof(Microsoft.AspNetCore.Components.Web.PointerEventArgs), true, true)] + [Microsoft.AspNetCore.Components.EventHandlerAttribute("onpointerenter", typeof(Microsoft.AspNetCore.Components.Web.PointerEventArgs), true, true)] + [Microsoft.AspNetCore.Components.EventHandlerAttribute("onpointerleave", typeof(Microsoft.AspNetCore.Components.Web.PointerEventArgs), true, true)] + [Microsoft.AspNetCore.Components.EventHandlerAttribute("onpointerlockchange", typeof(System.EventArgs), true, true)] + [Microsoft.AspNetCore.Components.EventHandlerAttribute("onpointerlockerror", typeof(System.EventArgs), true, true)] + [Microsoft.AspNetCore.Components.EventHandlerAttribute("onpointermove", typeof(Microsoft.AspNetCore.Components.Web.PointerEventArgs), true, true)] + [Microsoft.AspNetCore.Components.EventHandlerAttribute("onpointerout", typeof(Microsoft.AspNetCore.Components.Web.PointerEventArgs), true, true)] + [Microsoft.AspNetCore.Components.EventHandlerAttribute("onpointerover", typeof(Microsoft.AspNetCore.Components.Web.PointerEventArgs), true, true)] + [Microsoft.AspNetCore.Components.EventHandlerAttribute("onpointerup", typeof(Microsoft.AspNetCore.Components.Web.PointerEventArgs), true, true)] + [Microsoft.AspNetCore.Components.EventHandlerAttribute("onprogress", typeof(Microsoft.AspNetCore.Components.Web.ProgressEventArgs), true, true)] + [Microsoft.AspNetCore.Components.EventHandlerAttribute("onratechange", typeof(System.EventArgs), true, true)] + [Microsoft.AspNetCore.Components.EventHandlerAttribute("onreadystatechange", typeof(System.EventArgs), true, true)] + [Microsoft.AspNetCore.Components.EventHandlerAttribute("onreset", typeof(System.EventArgs), true, true)] + [Microsoft.AspNetCore.Components.EventHandlerAttribute("onscroll", typeof(System.EventArgs), true, true)] + [Microsoft.AspNetCore.Components.EventHandlerAttribute("onseeked", typeof(System.EventArgs), true, true)] + [Microsoft.AspNetCore.Components.EventHandlerAttribute("onseeking", typeof(System.EventArgs), true, true)] + [Microsoft.AspNetCore.Components.EventHandlerAttribute("onselect", typeof(System.EventArgs), true, true)] + [Microsoft.AspNetCore.Components.EventHandlerAttribute("onselectionchange", typeof(System.EventArgs), true, true)] + [Microsoft.AspNetCore.Components.EventHandlerAttribute("onselectstart", typeof(System.EventArgs), true, true)] + [Microsoft.AspNetCore.Components.EventHandlerAttribute("onstalled", typeof(System.EventArgs), true, true)] + [Microsoft.AspNetCore.Components.EventHandlerAttribute("onstop", typeof(System.EventArgs), true, true)] + [Microsoft.AspNetCore.Components.EventHandlerAttribute("onsubmit", typeof(System.EventArgs), true, true)] + [Microsoft.AspNetCore.Components.EventHandlerAttribute("onsuspend", typeof(System.EventArgs), true, true)] + [Microsoft.AspNetCore.Components.EventHandlerAttribute("ontimeout", typeof(Microsoft.AspNetCore.Components.Web.ProgressEventArgs), true, true)] + [Microsoft.AspNetCore.Components.EventHandlerAttribute("ontimeupdate", typeof(System.EventArgs), true, true)] + [Microsoft.AspNetCore.Components.EventHandlerAttribute("ontouchcancel", typeof(Microsoft.AspNetCore.Components.Web.TouchEventArgs), true, true)] + [Microsoft.AspNetCore.Components.EventHandlerAttribute("ontouchend", typeof(Microsoft.AspNetCore.Components.Web.TouchEventArgs), true, true)] + [Microsoft.AspNetCore.Components.EventHandlerAttribute("ontouchenter", typeof(Microsoft.AspNetCore.Components.Web.TouchEventArgs), true, true)] + [Microsoft.AspNetCore.Components.EventHandlerAttribute("ontouchleave", typeof(Microsoft.AspNetCore.Components.Web.TouchEventArgs), true, true)] + [Microsoft.AspNetCore.Components.EventHandlerAttribute("ontouchmove", typeof(Microsoft.AspNetCore.Components.Web.TouchEventArgs), true, true)] + [Microsoft.AspNetCore.Components.EventHandlerAttribute("ontouchstart", typeof(Microsoft.AspNetCore.Components.Web.TouchEventArgs), true, true)] + [Microsoft.AspNetCore.Components.EventHandlerAttribute("onvolumechange", typeof(System.EventArgs), true, true)] + [Microsoft.AspNetCore.Components.EventHandlerAttribute("onwaiting", typeof(System.EventArgs), true, true)] + [Microsoft.AspNetCore.Components.EventHandlerAttribute("onwheel", typeof(Microsoft.AspNetCore.Components.Web.WheelEventArgs), true, true)] public static partial class EventHandlers { } diff --git a/src/Components/Web/src/Web/EventHandlers.cs b/src/Components/Web/src/Web/EventHandlers.cs index 46a6f8666c..5e4bb8e83f 100644 --- a/src/Components/Web/src/Web/EventHandlers.cs +++ b/src/Components/Web/src/Web/EventHandlers.cs @@ -11,117 +11,117 @@ namespace Microsoft.AspNetCore.Components.Web /// // Focus events - [EventHandler("onfocus", typeof(FocusEventArgs))] - [EventHandler("onblur", typeof(FocusEventArgs))] - [EventHandler("onfocusin", typeof(FocusEventArgs))] - [EventHandler("onfocusout", typeof(FocusEventArgs))] + [EventHandler("onfocus", typeof(FocusEventArgs), true, true)] + [EventHandler("onblur", typeof(FocusEventArgs), true, true)] + [EventHandler("onfocusin", typeof(FocusEventArgs), true, true)] + [EventHandler("onfocusout", typeof(FocusEventArgs), true, true)] // Mouse events - [EventHandler("onmouseover", typeof(MouseEventArgs))] - [EventHandler("onmouseout", typeof(MouseEventArgs))] - [EventHandler("onmousemove", typeof(MouseEventArgs))] - [EventHandler("onmousedown", typeof(MouseEventArgs))] - [EventHandler("onmouseup", typeof(MouseEventArgs))] - [EventHandler("onclick", typeof(MouseEventArgs))] - [EventHandler("ondblclick", typeof(MouseEventArgs))] - [EventHandler("onwheel", typeof(WheelEventArgs))] - [EventHandler("onmousewheel", typeof(WheelEventArgs))] - [EventHandler("oncontextmenu", typeof(MouseEventArgs))] + [EventHandler("onmouseover", typeof(MouseEventArgs), true, true)] + [EventHandler("onmouseout", typeof(MouseEventArgs), true, true)] + [EventHandler("onmousemove", typeof(MouseEventArgs), true, true)] + [EventHandler("onmousedown", typeof(MouseEventArgs), true, true)] + [EventHandler("onmouseup", typeof(MouseEventArgs), true, true)] + [EventHandler("onclick", typeof(MouseEventArgs), true, true)] + [EventHandler("ondblclick", typeof(MouseEventArgs), true, true)] + [EventHandler("onwheel", typeof(WheelEventArgs), true, true)] + [EventHandler("onmousewheel", typeof(WheelEventArgs), true, true)] + [EventHandler("oncontextmenu", typeof(MouseEventArgs), true, true)] // Drag events - [EventHandler("ondrag", typeof(DragEventArgs))] - [EventHandler("ondragend", typeof(DragEventArgs))] - [EventHandler("ondragenter", typeof(DragEventArgs))] - [EventHandler("ondragleave", typeof(DragEventArgs))] - [EventHandler("ondragover", typeof(DragEventArgs))] - [EventHandler("ondragstart", typeof(DragEventArgs))] - [EventHandler("ondrop", typeof(DragEventArgs))] + [EventHandler("ondrag", typeof(DragEventArgs), true, true)] + [EventHandler("ondragend", typeof(DragEventArgs), true, true)] + [EventHandler("ondragenter", typeof(DragEventArgs), true, true)] + [EventHandler("ondragleave", typeof(DragEventArgs), true, true)] + [EventHandler("ondragover", typeof(DragEventArgs), true, true)] + [EventHandler("ondragstart", typeof(DragEventArgs), true, true)] + [EventHandler("ondrop", typeof(DragEventArgs), true, true)] // Keyboard events - [EventHandler("onkeydown", typeof(KeyboardEventArgs))] - [EventHandler("onkeyup", typeof(KeyboardEventArgs))] - [EventHandler("onkeypress", typeof(KeyboardEventArgs))] + [EventHandler("onkeydown", typeof(KeyboardEventArgs), true, true)] + [EventHandler("onkeyup", typeof(KeyboardEventArgs), true, true)] + [EventHandler("onkeypress", typeof(KeyboardEventArgs), true, true)] // Input events - [EventHandler("onchange", typeof(ChangeEventArgs))] - [EventHandler("oninput", typeof(ChangeEventArgs))] - [EventHandler("oninvalid", typeof(EventArgs))] - [EventHandler("onreset", typeof(EventArgs))] - [EventHandler("onselect", typeof(EventArgs))] - [EventHandler("onselectstart", typeof(EventArgs))] - [EventHandler("onselectionchange", typeof(EventArgs))] - [EventHandler("onsubmit", typeof(EventArgs))] + [EventHandler("onchange", typeof(ChangeEventArgs), true, true)] + [EventHandler("oninput", typeof(ChangeEventArgs), true, true)] + [EventHandler("oninvalid", typeof(EventArgs), true, true)] + [EventHandler("onreset", typeof(EventArgs), true, true)] + [EventHandler("onselect", typeof(EventArgs), true, true)] + [EventHandler("onselectstart", typeof(EventArgs), true, true)] + [EventHandler("onselectionchange", typeof(EventArgs), true, true)] + [EventHandler("onsubmit", typeof(EventArgs), true, true)] // Clipboard events - [EventHandler("onbeforecopy", typeof(EventArgs))] - [EventHandler("onbeforecut", typeof(EventArgs))] - [EventHandler("onbeforepaste", typeof(EventArgs))] - [EventHandler("oncopy", typeof(ClipboardEventArgs))] - [EventHandler("oncut", typeof(ClipboardEventArgs))] - [EventHandler("onpaste", typeof(ClipboardEventArgs))] + [EventHandler("onbeforecopy", typeof(EventArgs), true, true)] + [EventHandler("onbeforecut", typeof(EventArgs), true, true)] + [EventHandler("onbeforepaste", typeof(EventArgs), true, true)] + [EventHandler("oncopy", typeof(ClipboardEventArgs), true, true)] + [EventHandler("oncut", typeof(ClipboardEventArgs), true, true)] + [EventHandler("onpaste", typeof(ClipboardEventArgs), true, true)] // Touch events - [EventHandler("ontouchcancel", typeof(TouchEventArgs))] - [EventHandler("ontouchend", typeof(TouchEventArgs))] - [EventHandler("ontouchmove", typeof(TouchEventArgs))] - [EventHandler("ontouchstart", typeof(TouchEventArgs))] - [EventHandler("ontouchenter", typeof(TouchEventArgs))] - [EventHandler("ontouchleave", typeof(TouchEventArgs))] + [EventHandler("ontouchcancel", typeof(TouchEventArgs), true, true)] + [EventHandler("ontouchend", typeof(TouchEventArgs), true, true)] + [EventHandler("ontouchmove", typeof(TouchEventArgs), true, true)] + [EventHandler("ontouchstart", typeof(TouchEventArgs), true, true)] + [EventHandler("ontouchenter", typeof(TouchEventArgs), true, true)] + [EventHandler("ontouchleave", typeof(TouchEventArgs), true, true)] // Pointer events - [EventHandler("ongotpointercapture", typeof(PointerEventArgs))] - [EventHandler("onlostpointercapture", typeof(PointerEventArgs))] - [EventHandler("onpointercancel", typeof(PointerEventArgs))] - [EventHandler("onpointerdown", typeof(PointerEventArgs))] - [EventHandler("onpointerenter", typeof(PointerEventArgs))] - [EventHandler("onpointerleave", typeof(PointerEventArgs))] - [EventHandler("onpointermove", typeof(PointerEventArgs))] - [EventHandler("onpointerout", typeof(PointerEventArgs))] - [EventHandler("onpointerover", typeof(PointerEventArgs))] - [EventHandler("onpointerup", typeof(PointerEventArgs))] + [EventHandler("ongotpointercapture", typeof(PointerEventArgs), true, true)] + [EventHandler("onlostpointercapture", typeof(PointerEventArgs), true, true)] + [EventHandler("onpointercancel", typeof(PointerEventArgs), true, true)] + [EventHandler("onpointerdown", typeof(PointerEventArgs), true, true)] + [EventHandler("onpointerenter", typeof(PointerEventArgs), true, true)] + [EventHandler("onpointerleave", typeof(PointerEventArgs), true, true)] + [EventHandler("onpointermove", typeof(PointerEventArgs), true, true)] + [EventHandler("onpointerout", typeof(PointerEventArgs), true, true)] + [EventHandler("onpointerover", typeof(PointerEventArgs), true, true)] + [EventHandler("onpointerup", typeof(PointerEventArgs), true, true)] // Media events - [EventHandler("oncanplay", typeof(EventArgs))] - [EventHandler("oncanplaythrough", typeof(EventArgs))] - [EventHandler("oncuechange", typeof(EventArgs))] - [EventHandler("ondurationchange", typeof(EventArgs))] - [EventHandler("onemptied", typeof(EventArgs))] - [EventHandler("onpause", typeof(EventArgs))] - [EventHandler("onplay", typeof(EventArgs))] - [EventHandler("onplaying", typeof(EventArgs))] - [EventHandler("onratechange", typeof(EventArgs))] - [EventHandler("onseeked", typeof(EventArgs))] - [EventHandler("onseeking", typeof(EventArgs))] - [EventHandler("onstalled", typeof(EventArgs))] - [EventHandler("onstop", typeof(EventArgs))] - [EventHandler("onsuspend", typeof(EventArgs))] - [EventHandler("ontimeupdate", typeof(EventArgs))] - [EventHandler("onvolumechange", typeof(EventArgs))] - [EventHandler("onwaiting", typeof(EventArgs))] + [EventHandler("oncanplay", typeof(EventArgs), true, true)] + [EventHandler("oncanplaythrough", typeof(EventArgs), true, true)] + [EventHandler("oncuechange", typeof(EventArgs), true, true)] + [EventHandler("ondurationchange", typeof(EventArgs), true, true)] + [EventHandler("onemptied", typeof(EventArgs), true, true)] + [EventHandler("onpause", typeof(EventArgs), true, true)] + [EventHandler("onplay", typeof(EventArgs), true, true)] + [EventHandler("onplaying", typeof(EventArgs), true, true)] + [EventHandler("onratechange", typeof(EventArgs), true, true)] + [EventHandler("onseeked", typeof(EventArgs), true, true)] + [EventHandler("onseeking", typeof(EventArgs), true, true)] + [EventHandler("onstalled", typeof(EventArgs), true, true)] + [EventHandler("onstop", typeof(EventArgs), true, true)] + [EventHandler("onsuspend", typeof(EventArgs), true, true)] + [EventHandler("ontimeupdate", typeof(EventArgs), true, true)] + [EventHandler("onvolumechange", typeof(EventArgs), true, true)] + [EventHandler("onwaiting", typeof(EventArgs), true, true)] // Progress events - [EventHandler("onloadstart", typeof(ProgressEventArgs))] - [EventHandler("ontimeout", typeof(ProgressEventArgs))] - [EventHandler("onabort", typeof(ProgressEventArgs))] - [EventHandler("onload", typeof(ProgressEventArgs))] - [EventHandler("onloadend", typeof(ProgressEventArgs))] - [EventHandler("onprogress", typeof(ProgressEventArgs))] - [EventHandler("onerror", typeof(ErrorEventArgs))] + [EventHandler("onloadstart", typeof(ProgressEventArgs), true, true)] + [EventHandler("ontimeout", typeof(ProgressEventArgs), true, true)] + [EventHandler("onabort", typeof(ProgressEventArgs), true, true)] + [EventHandler("onload", typeof(ProgressEventArgs), true, true)] + [EventHandler("onloadend", typeof(ProgressEventArgs), true, true)] + [EventHandler("onprogress", typeof(ProgressEventArgs), true, true)] + [EventHandler("onerror", typeof(ErrorEventArgs), true, true)] // General events - [EventHandler("onactivate", typeof(EventArgs))] - [EventHandler("onbeforeactivate", typeof(EventArgs))] - [EventHandler("onbeforedeactivate", typeof(EventArgs))] - [EventHandler("ondeactivate", typeof(EventArgs))] - [EventHandler("onended", typeof(EventArgs))] - [EventHandler("onfullscreenchange", typeof(EventArgs))] - [EventHandler("onfullscreenerror", typeof(EventArgs))] - [EventHandler("onloadeddata", typeof(EventArgs))] - [EventHandler("onloadedmetadata", typeof(EventArgs))] - [EventHandler("onpointerlockchange", typeof(EventArgs))] - [EventHandler("onpointerlockerror", typeof(EventArgs))] - [EventHandler("onreadystatechange", typeof(EventArgs))] - [EventHandler("onscroll", typeof(EventArgs))] + [EventHandler("onactivate", typeof(EventArgs), true, true)] + [EventHandler("onbeforeactivate", typeof(EventArgs), true, true)] + [EventHandler("onbeforedeactivate", typeof(EventArgs), true, true)] + [EventHandler("ondeactivate", typeof(EventArgs), true, true)] + [EventHandler("onended", typeof(EventArgs), true, true)] + [EventHandler("onfullscreenchange", typeof(EventArgs), true, true)] + [EventHandler("onfullscreenerror", typeof(EventArgs), true, true)] + [EventHandler("onloadeddata", typeof(EventArgs), true, true)] + [EventHandler("onloadedmetadata", typeof(EventArgs), true, true)] + [EventHandler("onpointerlockchange", typeof(EventArgs), true, true)] + [EventHandler("onpointerlockerror", typeof(EventArgs), true, true)] + [EventHandler("onreadystatechange", typeof(EventArgs), true, true)] + [EventHandler("onscroll", typeof(EventArgs), true, true)] public static class EventHandlers { } From 65585c13f17de7222763a0b6282b4e83c15eb188 Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Fri, 18 Oct 2019 14:57:50 -0700 Subject: [PATCH 15/32] Renable shutdown tests Internal/#2577 (#15131) --- src/Hosting/test/FunctionalTests/ShutdownTests.cs | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/Hosting/test/FunctionalTests/ShutdownTests.cs b/src/Hosting/test/FunctionalTests/ShutdownTests.cs index cd82b11782..246a9abbea 100644 --- a/src/Hosting/test/FunctionalTests/ShutdownTests.cs +++ b/src/Hosting/test/FunctionalTests/ShutdownTests.cs @@ -24,17 +24,15 @@ namespace Microsoft.AspNetCore.Hosting.FunctionalTests public ShutdownTests(ITestOutputHelper output) : base(output) { } - [ConditionalFact(Skip = "https://github.com/aspnet/AspNetCore-Internal/issues/2577")] + [ConditionalFact] [OSSkipCondition(OperatingSystems.Windows)] [OSSkipCondition(OperatingSystems.MacOSX)] - [Flaky("https://github.com/aspnet/AspNetCore-Internal/issues/2577", FlakyOn.All)] public async Task ShutdownTestRun() { await ExecuteShutdownTest(nameof(ShutdownTestRun), "Run"); } - [ConditionalFact(Skip = "https://github.com/aspnet/AspNetCore-Internal/issues/2577")] - [Flaky("https://github.com/aspnet/Hosting/issues/1214", FlakyOn.All)] + [ConditionalFact] [OSSkipCondition(OperatingSystems.Windows)] [OSSkipCondition(OperatingSystems.MacOSX)] public async Task ShutdownTestWaitForShutdown() From 3d3d5f699e0b7efb59b7133bde92eac1f1799318 Mon Sep 17 00:00:00 2001 From: Pranav K Date: Fri, 18 Oct 2019 18:59:41 -0700 Subject: [PATCH 16/32] Add MS Edge support for debugging (#15176) * Add MS Edge support for debugging Addresses #10163 --- ...lazorMonoDebugProxyAppBuilderExtensions.cs | 65 ++++++++++++++----- .../Web.JS/dist/Release/blazor.server.js | 4 +- .../Web.JS/dist/Release/blazor.webassembly.js | 2 +- .../Web.JS/src/Platform/Mono/MonoDebugger.ts | 2 +- 4 files changed, 52 insertions(+), 21 deletions(-) diff --git a/src/Components/Blazor/Server/src/MonoDebugProxy/BlazorMonoDebugProxyAppBuilderExtensions.cs b/src/Components/Blazor/Server/src/MonoDebugProxy/BlazorMonoDebugProxyAppBuilderExtensions.cs index 7a1edc2d8c..533cd99399 100644 --- a/src/Components/Blazor/Server/src/MonoDebugProxy/BlazorMonoDebugProxyAppBuilderExtensions.cs +++ b/src/Components/Blazor/Server/src/MonoDebugProxy/BlazorMonoDebugProxyAppBuilderExtensions.cs @@ -3,6 +3,8 @@ using System; using System.Collections.Generic; +using System.Diagnostics; +using System.IO; using System.Linq; using System.Net; using System.Net.Http; @@ -89,19 +91,26 @@ namespace Microsoft.AspNetCore.Builder } catch (Exception ex) { - await context.Response.WriteAsync($@" -

    Unable to find debuggable browser tab

    -

    - Could not get a list of browser tabs from {debuggerTabsListUrl}. - Ensure Chrome is running with debugging enabled. -

    -

    Resolution

    +

    Unable to find debuggable browser tab

    +

    + Could not get a list of browser tabs from {debuggerTabsListUrl}. + Ensure your browser is running with debugging enabled. +

    +

    Resolution

    +

    +

    If you are using Google Chrome for your development, follow these instructions:

    {GetLaunchChromeInstructions(appRootUrl)} -

    ... then use that new tab for debugging.

    -

    Underlying exception:

    -
    {ex}
    -"); +

    +

    +

    If you are using Microsoft Edge (Chromium) for your development, follow these instructions:

    + {GetLaunchEdgeInstructions(appRootUrl)} +

    +This should launch a new browser window with debugging enabled..

    +

    Underlying exception:

    +
    {ex}
    + "); + return; } @@ -144,20 +153,42 @@ namespace Microsoft.AspNetCore.Builder private static string GetLaunchChromeInstructions(string appRootUrl) { + var profilePath = Path.Combine(Path.GetTempPath(), "blazor-edge-debug"); + if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) { - return $@"

    Close all Chrome instances, then press Win+R and enter the following:

    -

    ""%programfiles(x86)%\Google\Chrome\Application\chrome.exe"" --remote-debugging-port=9222 {appRootUrl}

    "; + return $@"

    Press Win+R and enter the following:

    +

    chrome --remote-debugging-port=9222 --user-data-dir=""{profilePath}"" {appRootUrl}

    "; } else if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux)) { - return $@"

    Close all Chrome instances, then in a terminal window execute the following:

    -

    google-chrome --remote-debugging-port=9222 {appRootUrl}

    "; + return $@"

    In a terminal window execute the following:

    +

    google-chrome --remote-debugging-port=9222 --user-data-dir={profilePath} {appRootUrl}

    "; } else if (RuntimeInformation.IsOSPlatform(OSPlatform.OSX)) { - return $@"

    Close all Chrome instances, then in a terminal window execute the following:

    -

    open /Applications/Google\ Chrome.app --args --remote-debugging-port=9222 {appRootUrl}

    "; + return $@"

    Execute the following:

    +

    open /Applications/Google\ Chrome.app --args --remote-debugging-port=9222 --user-data-dir={profilePath} {appRootUrl}

    "; + } + else + { + throw new InvalidOperationException("Unknown OS platform"); + } + } + + private static string GetLaunchEdgeInstructions(string appRootUrl) + { + var profilePath = Path.Combine(Path.GetTempPath(), "blazor-chrome-debug"); + + if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) + { + return $@"

    Press Win+R and enter the following:

    +

    msedge --remote-debugging-port=9222 --user-data-dir=""{profilePath}"" {appRootUrl}

    "; + } + else if (RuntimeInformation.IsOSPlatform(OSPlatform.OSX)) + { + return $@"

    In a terminal window execute the following:

    +

    open /Applications/Microsoft\ Edge\ Dev.app --args --remote-debugging-port=9222 --user-data-dir={profilePath} {appRootUrl}

    "; } else { diff --git a/src/Components/Web.JS/dist/Release/blazor.server.js b/src/Components/Web.JS/dist/Release/blazor.server.js index 3a2abaced9..0b4f34c4ca 100644 --- a/src/Components/Web.JS/dist/Release/blazor.server.js +++ b/src/Components/Web.JS/dist/Release/blazor.server.js @@ -1,4 +1,4 @@ -!function(e){var t={};function n(r){if(t[r])return t[r].exports;var o=t[r]={i:r,l:!1,exports:{}};return e[r].call(o.exports,o,o.exports,n),o.l=!0,o.exports}n.m=e,n.c=t,n.d=function(e,t,r){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(n.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var o in e)n.d(r,o,function(t){return e[t]}.bind(null,o));return r},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="",n(n.s=50)}([function(e,t,n){"use strict";var r;n.d(t,"a",function(){return r}),function(e){e[e.Trace=0]="Trace",e[e.Debug=1]="Debug",e[e.Information=2]="Information",e[e.Warning=3]="Warning",e[e.Error=4]="Error",e[e.Critical=5]="Critical",e[e.None=6]="None"}(r||(r={}))},function(e,t,n){"use strict";n.d(t,"a",function(){return s}),n.d(t,"c",function(){return c}),n.d(t,"f",function(){return u}),n.d(t,"g",function(){return l}),n.d(t,"h",function(){return f}),n.d(t,"e",function(){return h}),n.d(t,"d",function(){return p}),n.d(t,"b",function(){return d});var r=n(0),o=n(7),i=function(e,t,n,r){return new(n||(n=Promise))(function(o,i){function a(e){try{c(r.next(e))}catch(e){i(e)}}function s(e){try{c(r.throw(e))}catch(e){i(e)}}function c(e){e.done?o(e.value):new n(function(t){t(e.value)}).then(a,s)}c((r=r.apply(e,t||[])).next())})},a=function(e,t){var n,r,o,i,a={label:0,sent:function(){if(1&o[0])throw o[1];return o[1]},trys:[],ops:[]};return i={next:s(0),throw:s(1),return:s(2)},"function"==typeof Symbol&&(i[Symbol.iterator]=function(){return this}),i;function s(i){return function(s){return function(i){if(n)throw new TypeError("Generator is already executing.");for(;a;)try{if(n=1,r&&(o=2&i[0]?r.return:i[0]?r.throw||((o=r.return)&&o.call(r),0):r.next)&&!(o=o.call(r,i[1])).done)return o;switch(r=0,o&&(i=[2&i[0],o.value]),i[0]){case 0:case 1:o=i;break;case 4:return a.label++,{value:i[1],done:!1};case 5:a.label++,r=i[1],i=[0];continue;case 7:i=a.ops.pop(),a.trys.pop();continue;default:if(!(o=(o=a.trys).length>0&&o[o.length-1])&&(6===i[0]||2===i[0])){a=0;continue}if(3===i[0]&&(!o||i[1]>o[0]&&i[1]-1&&this.subject.observers.splice(e,1),0===this.subject.observers.length&&this.subject.cancelCallback&&this.subject.cancelCallback().catch(function(e){})},e}(),d=function(){function e(e){this.minimumLogLevel=e,this.outputConsole=console}return e.prototype.log=function(e,t){if(e>=this.minimumLogLevel)switch(e){case r.a.Critical:case r.a.Error:this.outputConsole.error("["+(new Date).toISOString()+"] "+r.a[e]+": "+t);break;case r.a.Warning:this.outputConsole.warn("["+(new Date).toISOString()+"] "+r.a[e]+": "+t);break;case r.a.Information:this.outputConsole.info("["+(new Date).toISOString()+"] "+r.a[e]+": "+t);break;default:this.outputConsole.log("["+(new Date).toISOString()+"] "+r.a[e]+": "+t)}},e}()},function(e,t,n){"use strict";n.r(t);var r,o,i=n(3),a=n(4),s=n(44),c=n(0),u=(r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n])},function(e,t){function n(){this.constructor=e}r(e,t),e.prototype=null===t?Object.create(t):(n.prototype=t.prototype,new n)}),l=function(e){function t(t){var n=e.call(this)||this;return n.logger=t,n}return u(t,e),t.prototype.send=function(e){var t=this;return e.abortSignal&&e.abortSignal.aborted?Promise.reject(new i.a):e.method?e.url?new Promise(function(n,r){var o=new XMLHttpRequest;o.open(e.method,e.url,!0),o.withCredentials=!0,o.setRequestHeader("X-Requested-With","XMLHttpRequest"),o.setRequestHeader("Content-Type","text/plain;charset=UTF-8");var s=e.headers;s&&Object.keys(s).forEach(function(e){o.setRequestHeader(e,s[e])}),e.responseType&&(o.responseType=e.responseType),e.abortSignal&&(e.abortSignal.onabort=function(){o.abort(),r(new i.a)}),e.timeout&&(o.timeout=e.timeout),o.onload=function(){e.abortSignal&&(e.abortSignal.onabort=null),o.status>=200&&o.status<300?n(new a.b(o.status,o.statusText,o.response||o.responseText)):r(new i.b(o.statusText,o.status))},o.onerror=function(){t.logger.log(c.a.Warning,"Error from HTTP request. "+o.status+": "+o.statusText+"."),r(new i.b(o.statusText,o.status))},o.ontimeout=function(){t.logger.log(c.a.Warning,"Timeout from HTTP request."),r(new i.c)},o.send(e.content||"")}):Promise.reject(new Error("No url defined.")):Promise.reject(new Error("No method defined."))},t}(a.a),f=function(){var e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n])};return function(t,n){function r(){this.constructor=t}e(t,n),t.prototype=null===n?Object.create(n):(r.prototype=n.prototype,new r)}}(),h=function(e){function t(t){var n=e.call(this)||this;return"undefined"!=typeof XMLHttpRequest?n.httpClient=new l(t):n.httpClient=new s.a(t),n}return f(t,e),t.prototype.send=function(e){return e.abortSignal&&e.abortSignal.aborted?Promise.reject(new i.a):e.method?e.url?this.httpClient.send(e):Promise.reject(new Error("No url defined.")):Promise.reject(new Error("No method defined."))},t.prototype.getCookieString=function(e){return this.httpClient.getCookieString(e)},t}(a.a),p=n(45);!function(e){e[e.Invocation=1]="Invocation",e[e.StreamItem=2]="StreamItem",e[e.Completion=3]="Completion",e[e.StreamInvocation=4]="StreamInvocation",e[e.CancelInvocation=5]="CancelInvocation",e[e.Ping=6]="Ping",e[e.Close=7]="Close"}(o||(o={}));var d,g=n(1),y=function(){function e(){this.observers=[]}return e.prototype.next=function(e){for(var t=0,n=this.observers;t0&&o[o.length-1])&&(6===i[0]||2===i[0])){a=0;continue}if(3===i[0]&&(!o||i[1]>o[0]&&i[1]0&&o[o.length-1])&&(6===i[0]||2===i[0])){a=0;continue}if(3===i[0]&&(!o||i[1]>o[0]&&i[1]0&&o[o.length-1])&&(6===i[0]||2===i[0])){a=0;continue}if(3===i[0]&&(!o||i[1]>o[0]&&i[1]0&&o[o.length-1])&&(6===i[0]||2===i[0])){a=0;continue}if(3===i[0]&&(!o||i[1]>o[0]&&i[1]0&&o[o.length-1])&&(6===i[0]||2===i[0])){a=0;continue}if(3===i[0]&&(!o||i[1]>o[0]&&i[1]0?[2,Promise.reject(new Error("Unable to connect to the server with any of the available transports. "+i.join(" ")))]:[2,Promise.reject(new Error("None of the transports supported by the client are supported by the server."))]}})})},e.prototype.constructTransport=function(e){switch(e){case E.WebSockets:if(!this.options.WebSocket)throw new Error("'WebSocket' is not supported in your environment.");return new A(this.httpClient,this.accessTokenFactory,this.logger,this.options.logMessageContent||!1,this.options.WebSocket);case E.ServerSentEvents:if(!this.options.EventSource)throw new Error("'EventSource' is not supported in your environment.");return new O(this.httpClient,this.accessTokenFactory,this.logger,this.options.logMessageContent||!1,this.options.EventSource);case E.LongPolling:return new P(this.httpClient,this.accessTokenFactory,this.logger,this.options.logMessageContent||!1);default:throw new Error("Unknown transport: "+e+".")}},e.prototype.startTransport=function(e,t){var n=this;return this.transport.onreceive=this.onreceive,this.transport.onclose=function(e){return n.stopConnection(e)},this.transport.connect(e,t)},e.prototype.resolveTransportOrError=function(e,t,n){var r=E[e.transport];if(null==r)return this.logger.log(c.a.Debug,"Skipping transport '"+e.transport+"' because it is not supported by this client."),new Error("Skipping transport '"+e.transport+"' because it is not supported by this client.");if(!function(e,t){return!e||0!=(t&e)}(t,r))return this.logger.log(c.a.Debug,"Skipping transport '"+E[r]+"' because it was disabled by the client."),new Error("'"+E[r]+"' is disabled by the client.");if(!(e.transferFormats.map(function(e){return S[e]}).indexOf(n)>=0))return this.logger.log(c.a.Debug,"Skipping transport '"+E[r]+"' because it does not support the requested transfer format '"+S[n]+"'."),new Error("'"+E[r]+"' does not support "+S[n]+".");if(r===E.WebSockets&&!this.options.WebSocket||r===E.ServerSentEvents&&!this.options.EventSource)return this.logger.log(c.a.Debug,"Skipping transport '"+E[r]+"' because it is not supported in your environment.'"),new Error("'"+E[r]+"' is not supported in your environment.");this.logger.log(c.a.Debug,"Selecting transport '"+E[r]+"'.");try{return this.constructTransport(r)}catch(e){return e}},e.prototype.isITransport=function(e){return e&&"object"==typeof e&&"connect"in e},e.prototype.stopConnection=function(e){if(this.logger.log(c.a.Debug,"HttpConnection.stopConnection("+e+") called while in state "+this.connectionState+"."),this.transport=void 0,e=this.stopError||e,this.stopError=void 0,"Disconnected"!==this.connectionState)if("Connecting "!==this.connectionState){if("Disconnecting"===this.connectionState&&this.stopPromiseResolver(),e?this.logger.log(c.a.Error,"Connection disconnected with error '"+e+"'."):this.logger.log(c.a.Information,"Connection disconnected."),this.connectionId=void 0,this.connectionState="Disconnected",this.onclose&&this.connectionStarted){this.connectionStarted=!1;try{this.onclose(e)}catch(t){this.logger.log(c.a.Error,"HttpConnection.onclose("+e+") threw error '"+t+"'.")}}}else this.logger.log(c.a.Warning,"Call to HttpConnection.stopConnection("+e+") was ignored because the connection hasn't yet left the in the connecting state.");else this.logger.log(c.a.Debug,"Call to HttpConnection.stopConnection("+e+") was ignored because the connection is already in the disconnected state.")},e.prototype.resolveUrl=function(e){if(0===e.lastIndexOf("https://",0)||0===e.lastIndexOf("http://",0))return e;if(!g.c.isBrowser||!window.document)throw new Error("Cannot resolve '"+e+"'.");var t=window.document.createElement("a");return t.href=e,this.logger.log(c.a.Information,"Normalizing '"+e+"' to '"+t.href+"'."),t.href},e.prototype.resolveNegotiateUrl=function(e){var t=e.indexOf("?"),n=e.substring(0,-1===t?e.length:t);return"/"!==n[n.length-1]&&(n+="/"),n+="negotiate",-1===(n+=-1===t?"":e.substring(t)).indexOf("negotiateVersion")&&(n+=-1===t?"?":"&",n+="negotiateVersion="+this.negotiateVersion),n},e}();var q=function(){function e(e){this.transport=e,this.buffer=[],this.executing=!0,this.sendBufferedData=new W,this.transportResult=new W,this.sendLoopPromise=this.sendLoop()}return e.prototype.send=function(e){return this.bufferData(e),this.transportResult||(this.transportResult=new W),this.transportResult.promise},e.prototype.stop=function(){return this.executing=!1,this.sendBufferedData.resolve(),this.sendLoopPromise},e.prototype.bufferData=function(e){if(this.buffer.length&&typeof this.buffer[0]!=typeof e)throw new Error("Expected data to be of type "+typeof this.buffer+" but was of type "+typeof e);this.buffer.push(e),this.sendBufferedData.resolve()},e.prototype.sendLoop=function(){return B(this,void 0,void 0,function(){var t,n,r;return j(this,function(o){switch(o.label){case 0:return[4,this.sendBufferedData.promise];case 1:if(o.sent(),!this.executing)return this.transportResult&&this.transportResult.reject("Connection stopped."),[3,6];this.sendBufferedData=new W,t=this.transportResult,this.transportResult=void 0,n="string"==typeof this.buffer[0]?this.buffer.join(""):e.concatBuffers(this.buffer),this.buffer.length=0,o.label=2;case 2:return o.trys.push([2,4,,5]),[4,this.transport.send(n)];case 3:return o.sent(),t.resolve(),[3,5];case 4:return r=o.sent(),t.reject(r),[3,5];case 5:return[3,0];case 6:return[2]}})})},e.concatBuffers=function(e){for(var t=e.map(function(e){return e.byteLength}).reduce(function(e,t){return e+t}),n=new Uint8Array(t),r=0,o=0,i=e;o0&&o[o.length-1])&&(6===i[0]||2===i[0])){a=0;continue}if(3===i[0]&&(!o||i[1]>o[0]&&i[1]-1&&this.subject.observers.splice(e,1),0===this.subject.observers.length&&this.subject.cancelCallback&&this.subject.cancelCallback().catch(function(e){})},e}(),d=function(){function e(e){this.minimumLogLevel=e,this.outputConsole=console}return e.prototype.log=function(e,t){if(e>=this.minimumLogLevel)switch(e){case r.a.Critical:case r.a.Error:this.outputConsole.error("["+(new Date).toISOString()+"] "+r.a[e]+": "+t);break;case r.a.Warning:this.outputConsole.warn("["+(new Date).toISOString()+"] "+r.a[e]+": "+t);break;case r.a.Information:this.outputConsole.info("["+(new Date).toISOString()+"] "+r.a[e]+": "+t);break;default:this.outputConsole.log("["+(new Date).toISOString()+"] "+r.a[e]+": "+t)}},e}()},function(e,t,n){"use strict";n.r(t);var r,o,i=n(3),a=n(4),s=n(44),c=n(0),u=(r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n])},function(e,t){function n(){this.constructor=e}r(e,t),e.prototype=null===t?Object.create(t):(n.prototype=t.prototype,new n)}),l=function(e){function t(t){var n=e.call(this)||this;return n.logger=t,n}return u(t,e),t.prototype.send=function(e){var t=this;return e.abortSignal&&e.abortSignal.aborted?Promise.reject(new i.a):e.method?e.url?new Promise(function(n,r){var o=new XMLHttpRequest;o.open(e.method,e.url,!0),o.withCredentials=!0,o.setRequestHeader("X-Requested-With","XMLHttpRequest"),o.setRequestHeader("Content-Type","text/plain;charset=UTF-8");var s=e.headers;s&&Object.keys(s).forEach(function(e){o.setRequestHeader(e,s[e])}),e.responseType&&(o.responseType=e.responseType),e.abortSignal&&(e.abortSignal.onabort=function(){o.abort(),r(new i.a)}),e.timeout&&(o.timeout=e.timeout),o.onload=function(){e.abortSignal&&(e.abortSignal.onabort=null),o.status>=200&&o.status<300?n(new a.b(o.status,o.statusText,o.response||o.responseText)):r(new i.b(o.statusText,o.status))},o.onerror=function(){t.logger.log(c.a.Warning,"Error from HTTP request. "+o.status+": "+o.statusText+"."),r(new i.b(o.statusText,o.status))},o.ontimeout=function(){t.logger.log(c.a.Warning,"Timeout from HTTP request."),r(new i.c)},o.send(e.content||"")}):Promise.reject(new Error("No url defined.")):Promise.reject(new Error("No method defined."))},t}(a.a),f=function(){var e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n])};return function(t,n){function r(){this.constructor=t}e(t,n),t.prototype=null===n?Object.create(n):(r.prototype=n.prototype,new r)}}(),h=function(e){function t(t){var n=e.call(this)||this;return"undefined"!=typeof XMLHttpRequest?n.httpClient=new l(t):n.httpClient=new s.a(t),n}return f(t,e),t.prototype.send=function(e){return e.abortSignal&&e.abortSignal.aborted?Promise.reject(new i.a):e.method?e.url?this.httpClient.send(e):Promise.reject(new Error("No url defined.")):Promise.reject(new Error("No method defined."))},t.prototype.getCookieString=function(e){return this.httpClient.getCookieString(e)},t}(a.a),p=n(45);!function(e){e[e.Invocation=1]="Invocation",e[e.StreamItem=2]="StreamItem",e[e.Completion=3]="Completion",e[e.StreamInvocation=4]="StreamInvocation",e[e.CancelInvocation=5]="CancelInvocation",e[e.Ping=6]="Ping",e[e.Close=7]="Close"}(o||(o={}));var d,g=n(1),y=function(){function e(){this.observers=[]}return e.prototype.next=function(e){for(var t=0,n=this.observers;t0&&o[o.length-1])&&(6===i[0]||2===i[0])){a=0;continue}if(3===i[0]&&(!o||i[1]>o[0]&&i[1]0&&o[o.length-1])&&(6===i[0]||2===i[0])){a=0;continue}if(3===i[0]&&(!o||i[1]>o[0]&&i[1]0&&o[o.length-1])&&(6===i[0]||2===i[0])){a=0;continue}if(3===i[0]&&(!o||i[1]>o[0]&&i[1]0&&o[o.length-1])&&(6===i[0]||2===i[0])){a=0;continue}if(3===i[0]&&(!o||i[1]>o[0]&&i[1]0&&o[o.length-1])&&(6===i[0]||2===i[0])){a=0;continue}if(3===i[0]&&(!o||i[1]>o[0]&&i[1]0?[2,Promise.reject(new Error("Unable to connect to the server with any of the available transports. "+i.join(" ")))]:[2,Promise.reject(new Error("None of the transports supported by the client are supported by the server."))]}})})},e.prototype.constructTransport=function(e){switch(e){case E.WebSockets:if(!this.options.WebSocket)throw new Error("'WebSocket' is not supported in your environment.");return new A(this.httpClient,this.accessTokenFactory,this.logger,this.options.logMessageContent||!1,this.options.WebSocket);case E.ServerSentEvents:if(!this.options.EventSource)throw new Error("'EventSource' is not supported in your environment.");return new O(this.httpClient,this.accessTokenFactory,this.logger,this.options.logMessageContent||!1,this.options.EventSource);case E.LongPolling:return new P(this.httpClient,this.accessTokenFactory,this.logger,this.options.logMessageContent||!1);default:throw new Error("Unknown transport: "+e+".")}},e.prototype.startTransport=function(e,t){var n=this;return this.transport.onreceive=this.onreceive,this.transport.onclose=function(e){return n.stopConnection(e)},this.transport.connect(e,t)},e.prototype.resolveTransportOrError=function(e,t,n){var r=E[e.transport];if(null==r)return this.logger.log(c.a.Debug,"Skipping transport '"+e.transport+"' because it is not supported by this client."),new Error("Skipping transport '"+e.transport+"' because it is not supported by this client.");if(!function(e,t){return!e||0!=(t&e)}(t,r))return this.logger.log(c.a.Debug,"Skipping transport '"+E[r]+"' because it was disabled by the client."),new Error("'"+E[r]+"' is disabled by the client.");if(!(e.transferFormats.map(function(e){return S[e]}).indexOf(n)>=0))return this.logger.log(c.a.Debug,"Skipping transport '"+E[r]+"' because it does not support the requested transfer format '"+S[n]+"'."),new Error("'"+E[r]+"' does not support "+S[n]+".");if(r===E.WebSockets&&!this.options.WebSocket||r===E.ServerSentEvents&&!this.options.EventSource)return this.logger.log(c.a.Debug,"Skipping transport '"+E[r]+"' because it is not supported in your environment.'"),new Error("'"+E[r]+"' is not supported in your environment.");this.logger.log(c.a.Debug,"Selecting transport '"+E[r]+"'.");try{return this.constructTransport(r)}catch(e){return e}},e.prototype.isITransport=function(e){return e&&"object"==typeof e&&"connect"in e},e.prototype.stopConnection=function(e){if(this.logger.log(c.a.Debug,"HttpConnection.stopConnection("+e+") called while in state "+this.connectionState+"."),this.transport=void 0,e=this.stopError||e,this.stopError=void 0,"Disconnected"!==this.connectionState)if("Connecting "!==this.connectionState){if("Disconnecting"===this.connectionState&&this.stopPromiseResolver(),e?this.logger.log(c.a.Error,"Connection disconnected with error '"+e+"'."):this.logger.log(c.a.Information,"Connection disconnected."),this.connectionId=void 0,this.connectionState="Disconnected",this.onclose&&this.connectionStarted){this.connectionStarted=!1;try{this.onclose(e)}catch(t){this.logger.log(c.a.Error,"HttpConnection.onclose("+e+") threw error '"+t+"'.")}}}else this.logger.log(c.a.Warning,"Call to HttpConnection.stopConnection("+e+") was ignored because the connection hasn't yet left the in the connecting state.");else this.logger.log(c.a.Debug,"Call to HttpConnection.stopConnection("+e+") was ignored because the connection is already in the disconnected state.")},e.prototype.resolveUrl=function(e){if(0===e.lastIndexOf("https://",0)||0===e.lastIndexOf("http://",0))return e;if(!g.c.isBrowser||!window.document)throw new Error("Cannot resolve '"+e+"'.");var t=window.document.createElement("a");return t.href=e,this.logger.log(c.a.Information,"Normalizing '"+e+"' to '"+t.href+"'."),t.href},e.prototype.resolveNegotiateUrl=function(e){var t=e.indexOf("?"),n=e.substring(0,-1===t?e.length:t);return"/"!==n[n.length-1]&&(n+="/"),n+="negotiate",-1===(n+=-1===t?"":e.substring(t)).indexOf("negotiateVersion")&&(n+=-1===t?"?":"&",n+="negotiateVersion="+this.negotiateVersion),n},e}();var q=function(){function e(e){this.transport=e,this.buffer=[],this.executing=!0,this.sendBufferedData=new W,this.transportResult=new W,this.sendLoopPromise=this.sendLoop()}return e.prototype.send=function(e){return this.bufferData(e),this.transportResult||(this.transportResult=new W),this.transportResult.promise},e.prototype.stop=function(){return this.executing=!1,this.sendBufferedData.resolve(),this.sendLoopPromise},e.prototype.bufferData=function(e){if(this.buffer.length&&typeof this.buffer[0]!=typeof e)throw new Error("Expected data to be of type "+typeof this.buffer+" but was of type "+typeof e);this.buffer.push(e),this.sendBufferedData.resolve()},e.prototype.sendLoop=function(){return B(this,void 0,void 0,function(){var t,n,r;return j(this,function(o){switch(o.label){case 0:return[4,this.sendBufferedData.promise];case 1:if(o.sent(),!this.executing)return this.transportResult&&this.transportResult.reject("Connection stopped."),[3,6];this.sendBufferedData=new W,t=this.transportResult,this.transportResult=void 0,n="string"==typeof this.buffer[0]?this.buffer.join(""):e.concatBuffers(this.buffer),this.buffer.length=0,o.label=2;case 2:return o.trys.push([2,4,,5]),[4,this.transport.send(n)];case 3:return o.sent(),t.resolve(),[3,5];case 4:return r=o.sent(),t.reject(r),[3,5];case 5:return[3,0];case 6:return[2]}})})},e.concatBuffers=function(e){for(var t=e.map(function(e){return e.byteLength}).reduce(function(e,t){return e+t}),n=new Uint8Array(t),r=0,o=0,i=e;o * @license MIT */ -function r(e,t){if(e===t)return 0;for(var n=e.length,r=t.length,o=0,i=Math.min(n,r);o=0;u--)if(l[u]!==f[u])return!1;for(u=l.length-1;u>=0;u--)if(c=l[u],!b(e[c],t[c],n,r))return!1;return!0}(e,t,n,a))}return n?e===t:e==t}function m(e){return"[object Arguments]"==Object.prototype.toString.call(e)}function w(e,t){if(!e||!t)return!1;if("[object RegExp]"==Object.prototype.toString.call(t))return t.test(e);try{if(e instanceof t)return!0}catch(e){}return!Error.isPrototypeOf(t)&&!0===t.call({},e)}function E(e,t,n,r){var o;if("function"!=typeof t)throw new TypeError('"block" argument must be a function');"string"==typeof n&&(r=n,n=null),o=function(e){var t;try{e()}catch(e){t=e}return t}(t),r=(n&&n.name?" ("+n.name+").":".")+(r?" "+r:"."),e&&!o&&y(o,n,"Missing expected exception"+r);var a="string"==typeof r,s=!e&&o&&!n;if((!e&&i.isError(o)&&a&&w(o,n)||s)&&y(o,n,"Got unwanted exception"+r),e&&o&&n&&!w(o,n)||!e&&o)throw o}f.AssertionError=function(e){var t;this.name="AssertionError",this.actual=e.actual,this.expected=e.expected,this.operator=e.operator,e.message?(this.message=e.message,this.generatedMessage=!1):(this.message=d(g((t=this).actual),128)+" "+t.operator+" "+d(g(t.expected),128),this.generatedMessage=!0);var n=e.stackStartFunction||y;if(Error.captureStackTrace)Error.captureStackTrace(this,n);else{var r=new Error;if(r.stack){var o=r.stack,i=p(n),a=o.indexOf("\n"+i);if(a>=0){var s=o.indexOf("\n",a+1);o=o.substring(s+1)}this.stack=o}}},i.inherits(f.AssertionError,Error),f.fail=y,f.ok=v,f.equal=function(e,t,n){e!=t&&y(e,t,n,"==",f.equal)},f.notEqual=function(e,t,n){e==t&&y(e,t,n,"!=",f.notEqual)},f.deepEqual=function(e,t,n){b(e,t,!1)||y(e,t,n,"deepEqual",f.deepEqual)},f.deepStrictEqual=function(e,t,n){b(e,t,!0)||y(e,t,n,"deepStrictEqual",f.deepStrictEqual)},f.notDeepEqual=function(e,t,n){b(e,t,!1)&&y(e,t,n,"notDeepEqual",f.notDeepEqual)},f.notDeepStrictEqual=function e(t,n,r){b(t,n,!0)&&y(t,n,r,"notDeepStrictEqual",e)},f.strictEqual=function(e,t,n){e!==t&&y(e,t,n,"===",f.strictEqual)},f.notStrictEqual=function(e,t,n){e===t&&y(e,t,n,"!==",f.notStrictEqual)},f.throws=function(e,t,n){E(!0,e,t,n)},f.doesNotThrow=function(e,t,n){E(!1,e,t,n)},f.ifError=function(e){if(e)throw e};var S=Object.keys||function(e){var t=[];for(var n in e)a.call(e,n)&&t.push(n);return t}}).call(this,n(10))},function(e,t){e.exports=function(e){return e&&"object"==typeof e&&"function"==typeof e.copy&&"function"==typeof e.fill&&"function"==typeof e.readUInt8}},function(e,t){"function"==typeof Object.create?e.exports=function(e,t){e.super_=t,e.prototype=Object.create(t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}})}:e.exports=function(e,t){e.super_=t;var n=function(){};n.prototype=t.prototype,e.prototype=new n,e.prototype.constructor=e}},function(e,t,n){e.exports=n(11)},function(e,t){var n={}.toString;e.exports=Array.isArray||function(e){return"[object Array]"==n.call(e)}},function(e,t){},function(e,t,n){"use strict";var r=n(15).Buffer,o=n(61);e.exports=function(){function e(){!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,e),this.head=null,this.tail=null,this.length=0}return e.prototype.push=function(e){var t={data:e,next:null};this.length>0?this.tail.next=t:this.head=t,this.tail=t,++this.length},e.prototype.unshift=function(e){var t={data:e,next:this.head};0===this.length&&(this.tail=t),this.head=t,++this.length},e.prototype.shift=function(){if(0!==this.length){var e=this.head.data;return 1===this.length?this.head=this.tail=null:this.head=this.head.next,--this.length,e}},e.prototype.clear=function(){this.head=this.tail=null,this.length=0},e.prototype.join=function(e){if(0===this.length)return"";for(var t=this.head,n=""+t.data;t=t.next;)n+=e+t.data;return n},e.prototype.concat=function(e){if(0===this.length)return r.alloc(0);if(1===this.length)return this.head.data;for(var t,n,o,i=r.allocUnsafe(e>>>0),a=this.head,s=0;a;)t=a.data,n=i,o=s,t.copy(n,o),s+=a.data.length,a=a.next;return i},e}(),o&&o.inspect&&o.inspect.custom&&(e.exports.prototype[o.inspect.custom]=function(){var e=o.inspect({length:this.length});return this.constructor.name+" "+e})},function(e,t){},function(e,t,n){var r=n(6),o=r.Buffer;function i(e,t){for(var n in e)t[n]=e[n]}function a(e,t,n){return o(e,t,n)}o.from&&o.alloc&&o.allocUnsafe&&o.allocUnsafeSlow?e.exports=r:(i(r,t),t.Buffer=a),i(o,a),a.from=function(e,t,n){if("number"==typeof e)throw new TypeError("Argument must not be a number");return o(e,t,n)},a.alloc=function(e,t,n){if("number"!=typeof e)throw new TypeError("Argument must be a number");var r=o(e);return void 0!==t?"string"==typeof n?r.fill(t,n):r.fill(t):r.fill(0),r},a.allocUnsafe=function(e){if("number"!=typeof e)throw new TypeError("Argument must be a number");return o(e)},a.allocUnsafeSlow=function(e){if("number"!=typeof e)throw new TypeError("Argument must be a number");return r.SlowBuffer(e)}},function(e,t,n){(function(e){var r=void 0!==e&&e||"undefined"!=typeof self&&self||window,o=Function.prototype.apply;function i(e,t){this._id=e,this._clearFn=t}t.setTimeout=function(){return new i(o.call(setTimeout,r,arguments),clearTimeout)},t.setInterval=function(){return new i(o.call(setInterval,r,arguments),clearInterval)},t.clearTimeout=t.clearInterval=function(e){e&&e.close()},i.prototype.unref=i.prototype.ref=function(){},i.prototype.close=function(){this._clearFn.call(r,this._id)},t.enroll=function(e,t){clearTimeout(e._idleTimeoutId),e._idleTimeout=t},t.unenroll=function(e){clearTimeout(e._idleTimeoutId),e._idleTimeout=-1},t._unrefActive=t.active=function(e){clearTimeout(e._idleTimeoutId);var t=e._idleTimeout;t>=0&&(e._idleTimeoutId=setTimeout(function(){e._onTimeout&&e._onTimeout()},t))},n(64),t.setImmediate="undefined"!=typeof self&&self.setImmediate||void 0!==e&&e.setImmediate||this&&this.setImmediate,t.clearImmediate="undefined"!=typeof self&&self.clearImmediate||void 0!==e&&e.clearImmediate||this&&this.clearImmediate}).call(this,n(10))},function(e,t,n){(function(e,t){!function(e,n){"use strict";if(!e.setImmediate){var r,o,i,a,s,c=1,u={},l=!1,f=e.document,h=Object.getPrototypeOf&&Object.getPrototypeOf(e);h=h&&h.setTimeout?h:e,"[object process]"==={}.toString.call(e.process)?r=function(e){t.nextTick(function(){d(e)})}:!function(){if(e.postMessage&&!e.importScripts){var t=!0,n=e.onmessage;return e.onmessage=function(){t=!1},e.postMessage("","*"),e.onmessage=n,t}}()?e.MessageChannel?((i=new MessageChannel).port1.onmessage=function(e){d(e.data)},r=function(e){i.port2.postMessage(e)}):f&&"onreadystatechange"in f.createElement("script")?(o=f.documentElement,r=function(e){var t=f.createElement("script");t.onreadystatechange=function(){d(e),t.onreadystatechange=null,o.removeChild(t),t=null},o.appendChild(t)}):r=function(e){setTimeout(d,0,e)}:(a="setImmediate$"+Math.random()+"$",s=function(t){t.source===e&&"string"==typeof t.data&&0===t.data.indexOf(a)&&d(+t.data.slice(a.length))},e.addEventListener?e.addEventListener("message",s,!1):e.attachEvent("onmessage",s),r=function(t){e.postMessage(a+t,"*")}),h.setImmediate=function(e){"function"!=typeof e&&(e=new Function(""+e));for(var t=new Array(arguments.length-1),n=0;n0?this._transform(null,t,n):n()},e.exports.decoder=c,e.exports.encoder=s},function(e,t,n){(t=e.exports=n(37)).Stream=t,t.Readable=t,t.Writable=n(42),t.Duplex=n(11),t.Transform=n(43),t.PassThrough=n(68)},function(e,t,n){"use strict";e.exports=i;var r=n(43),o=n(21);function i(e){if(!(this instanceof i))return new i(e);r.call(this,e)}o.inherits=n(16),o.inherits(i,r),i.prototype._transform=function(e,t,n){n(null,e)}},function(e,t,n){var r=n(22);function o(e){Error.call(this),Error.captureStackTrace&&Error.captureStackTrace(this,this.constructor),this.name=this.constructor.name,this.message=e||"unable to decode"}n(36).inherits(o,Error),e.exports=function(e){return function(e){e instanceof r||(e=r().append(e));var t=i(e);if(t)return e.consume(t.bytesConsumed),t.value;throw new o};function t(e,t,n){return t>=n+e}function n(e,t){return{value:e,bytesConsumed:t}}function i(e,r){r=void 0===r?0:r;var o=e.length-r;if(o<=0)return null;var i,l,f,h=e.readUInt8(r),p=0;if(!function(e,t){var n=function(e){switch(e){case 196:return 2;case 197:return 3;case 198:return 5;case 199:return 3;case 200:return 4;case 201:return 6;case 202:return 5;case 203:return 9;case 204:return 2;case 205:return 3;case 206:return 5;case 207:return 9;case 208:return 2;case 209:return 3;case 210:return 5;case 211:return 9;case 212:return 3;case 213:return 4;case 214:return 6;case 215:return 10;case 216:return 18;case 217:return 2;case 218:return 3;case 219:return 5;case 222:return 3;default:return-1}}(e);return!(-1!==n&&t=0;f--)p+=e.readUInt8(r+f+1)*Math.pow(2,8*(7-f));return n(p,9);case 208:return n(p=e.readInt8(r+1),2);case 209:return n(p=e.readInt16BE(r+1),3);case 210:return n(p=e.readInt32BE(r+1),5);case 211:return n(p=function(e,t){var n=128==(128&e[t]);if(n)for(var r=1,o=t+7;o>=t;o--){var i=(255^e[o])+r;e[o]=255&i,r=i>>8}var a=e.readUInt32BE(t+0),s=e.readUInt32BE(t+4);return(4294967296*a+s)*(n?-1:1)}(e.slice(r+1,r+9),0),9);case 202:return n(p=e.readFloatBE(r+1),5);case 203:return n(p=e.readDoubleBE(r+1),9);case 217:return t(i=e.readUInt8(r+1),o,2)?n(p=e.toString("utf8",r+2,r+2+i),2+i):null;case 218:return t(i=e.readUInt16BE(r+1),o,3)?n(p=e.toString("utf8",r+3,r+3+i),3+i):null;case 219:return t(i=e.readUInt32BE(r+1),o,5)?n(p=e.toString("utf8",r+5,r+5+i),5+i):null;case 196:return t(i=e.readUInt8(r+1),o,2)?n(p=e.slice(r+2,r+2+i),2+i):null;case 197:return t(i=e.readUInt16BE(r+1),o,3)?n(p=e.slice(r+3,r+3+i),3+i):null;case 198:return t(i=e.readUInt32BE(r+1),o,5)?n(p=e.slice(r+5,r+5+i),5+i):null;case 220:return o<3?null:(i=e.readUInt16BE(r+1),a(e,r,i,3));case 221:return o<5?null:(i=e.readUInt32BE(r+1),a(e,r,i,5));case 222:return i=e.readUInt16BE(r+1),s(e,r,i,3);case 223:throw new Error("map too big to decode in JS");case 212:return c(e,r,1);case 213:return c(e,r,2);case 214:return c(e,r,4);case 215:return c(e,r,8);case 216:return c(e,r,16);case 199:return i=e.readUInt8(r+1),l=e.readUInt8(r+2),t(i,o,3)?u(e,r,l,i,3):null;case 200:return i=e.readUInt16BE(r+1),l=e.readUInt8(r+3),t(i,o,4)?u(e,r,l,i,4):null;case 201:return i=e.readUInt32BE(r+1),l=e.readUInt8(r+5),t(i,o,6)?u(e,r,l,i,6):null}if(144==(240&h))return a(e,r,i=15&h,1);if(128==(240&h))return s(e,r,i=15&h,1);if(160==(224&h))return t(i=31&h,o,1)?n(p=e.toString("utf8",r+1,r+i+1),i+1):null;if(h>=224)return n(p=h-256,1);if(h<128)return n(h,1);throw new Error("not implemented yet")}function a(e,t,r,o){var a,s=[],c=0;for(t+=o,a=0;ai)&&((n=r.allocUnsafe(9))[0]=203,n.writeDoubleBE(e,1)),n}e.exports=function(e,t,n,i){function s(c,u){var l,f,h;if(void 0===c)throw new Error("undefined is not encodable in msgpack!");if(null===c)(l=r.allocUnsafe(1))[0]=192;else if(!0===c)(l=r.allocUnsafe(1))[0]=195;else if(!1===c)(l=r.allocUnsafe(1))[0]=194;else if("string"==typeof c)(f=r.byteLength(c))<32?((l=r.allocUnsafe(1+f))[0]=160|f,f>0&&l.write(c,1)):f<=255&&!n?((l=r.allocUnsafe(2+f))[0]=217,l[1]=f,l.write(c,2)):f<=65535?((l=r.allocUnsafe(3+f))[0]=218,l.writeUInt16BE(f,1),l.write(c,3)):((l=r.allocUnsafe(5+f))[0]=219,l.writeUInt32BE(f,1),l.write(c,5));else if(c&&(c.readUInt32LE||c instanceof Uint8Array))c instanceof Uint8Array&&(c=r.from(c)),c.length<=255?((l=r.allocUnsafe(2))[0]=196,l[1]=c.length):c.length<=65535?((l=r.allocUnsafe(3))[0]=197,l.writeUInt16BE(c.length,1)):((l=r.allocUnsafe(5))[0]=198,l.writeUInt32BE(c.length,1)),l=o([l,c]);else if(Array.isArray(c))c.length<16?(l=r.allocUnsafe(1))[0]=144|c.length:c.length<65536?((l=r.allocUnsafe(3))[0]=220,l.writeUInt16BE(c.length,1)):((l=r.allocUnsafe(5))[0]=221,l.writeUInt32BE(c.length,1)),l=c.reduce(function(e,t){return e.append(s(t,!0)),e},o().append(l));else{if(!i&&"function"==typeof c.getDate)return function(e){var t,n=1*e,i=Math.floor(n/1e3),a=1e6*(n-1e3*i);if(a||i>4294967295){(t=new r(10))[0]=215,t[1]=-1;var s=4*a,c=i/Math.pow(2,32),u=s+c&4294967295,l=4294967295&i;t.writeInt32BE(u,2),t.writeInt32BE(l,6)}else(t=new r(6))[0]=214,t[1]=-1,t.writeUInt32BE(Math.floor(n/1e3),2);return o().append(t)}(c);if("object"==typeof c)l=function(t){var n,i,a=-1,s=[];for(n=0;n>8),s.push(255&a)):(s.push(201),s.push(a>>24),s.push(a>>16&255),s.push(a>>8&255),s.push(255&a));return o().append(r.from(s)).append(i)}(c)||function(e){var t,n,i=[],a=0;for(t in e)e.hasOwnProperty(t)&&void 0!==e[t]&&"function"!=typeof e[t]&&(++a,i.push(s(t,!0)),i.push(s(e[t],!0)));a<16?(n=r.allocUnsafe(1))[0]=128|a:((n=r.allocUnsafe(3))[0]=222,n.writeUInt16BE(a,1));return i.unshift(n),i.reduce(function(e,t){return e.append(t)},o())}(c);else if("number"==typeof c){if((h=c)!==Math.floor(h))return a(c,t);if(c>=0)if(c<128)(l=r.allocUnsafe(1))[0]=c;else if(c<256)(l=r.allocUnsafe(2))[0]=204,l[1]=c;else if(c<65536)(l=r.allocUnsafe(3))[0]=205,l.writeUInt16BE(c,1);else if(c<=4294967295)(l=r.allocUnsafe(5))[0]=206,l.writeUInt32BE(c,1);else{if(!(c<=9007199254740991))return a(c,!0);(l=r.allocUnsafe(9))[0]=207,function(e,t){for(var n=7;n>=0;n--)e[n+1]=255&t,t/=256}(l,c)}else if(c>=-32)(l=r.allocUnsafe(1))[0]=256+c;else if(c>=-128)(l=r.allocUnsafe(2))[0]=208,l.writeInt8(c,1);else if(c>=-32768)(l=r.allocUnsafe(3))[0]=209,l.writeInt16BE(c,1);else if(c>-214748365)(l=r.allocUnsafe(5))[0]=210,l.writeInt32BE(c,1);else{if(!(c>=-9007199254740991))return a(c,!0);(l=r.allocUnsafe(9))[0]=211,function(e,t,n){var r=n<0;r&&(n=Math.abs(n));var o=n%4294967296,i=n/4294967296;if(e.writeUInt32BE(Math.floor(i),t+0),e.writeUInt32BE(o,t+4),r)for(var a=1,s=t+7;s>=t;s--){var c=(255^e[s])+a;e[s]=255&c,a=c>>8}}(l,1,c)}}}if(!l)throw new Error("not implemented yet");return u?l:l.slice()}return s}},function(e,t,n){"use strict";var r=this&&this.__awaiter||function(e,t,n,r){return new(n||(n=Promise))(function(o,i){function a(e){try{c(r.next(e))}catch(e){i(e)}}function s(e){try{c(r.throw(e))}catch(e){i(e)}}function c(e){e.done?o(e.value):new n(function(t){t(e.value)}).then(a,s)}c((r=r.apply(e,t||[])).next())})},o=this&&this.__generator||function(e,t){var n,r,o,i,a={label:0,sent:function(){if(1&o[0])throw o[1];return o[1]},trys:[],ops:[]};return i={next:s(0),throw:s(1),return:s(2)},"function"==typeof Symbol&&(i[Symbol.iterator]=function(){return this}),i;function s(i){return function(s){return function(i){if(n)throw new TypeError("Generator is already executing.");for(;a;)try{if(n=1,r&&(o=2&i[0]?r.return:i[0]?r.throw||((o=r.return)&&o.call(r),0):r.next)&&!(o=o.call(r,i[1])).done)return o;switch(r=0,o&&(i=[2&i[0],o.value]),i[0]){case 0:case 1:o=i;break;case 4:return a.label++,{value:i[1],done:!1};case 5:a.label++,r=i[1],i=[0];continue;case 7:i=a.ops.pop(),a.trys.pop();continue;default:if(!(o=(o=a.trys).length>0&&o[o.length-1])&&(6===i[0]||2===i[0])){a=0;continue}if(3===i[0]&&(!o||i[1]>o[0]&&i[1]this.nextBatchId?this.fatalError?(this.logger.log(s.LogLevel.Debug,"Received a new batch "+e+" but errored out on a previous batch "+(this.nextBatchId-1)),[4,n.send("OnRenderCompleted",this.nextBatchId-1,this.fatalError.toString())]):[3,4]:[3,5];case 3:return o.sent(),[2];case 4:return this.logger.log(s.LogLevel.Debug,"Waiting for batch "+this.nextBatchId+". Batch "+e+" not processed."),[2];case 5:return o.trys.push([5,7,,8]),this.nextBatchId++,this.logger.log(s.LogLevel.Debug,"Applying batch "+e+"."),i.renderBatch(this.browserRendererId,new a.OutOfProcessRenderBatch(t)),[4,this.completeBatch(n,e)];case 6:return o.sent(),[3,8];case 7:throw r=o.sent(),this.fatalError=r.toString(),this.logger.log(s.LogLevel.Error,"There was an error applying batch "+e+"."),n.send("OnRenderCompleted",e,r.toString()),r;case 8:return[2]}})})},e.prototype.getLastBatchid=function(){return this.nextBatchId-1},e.prototype.completeBatch=function(e,t){return r(this,void 0,void 0,function(){return o(this,function(n){switch(n.label){case 0:return n.trys.push([0,2,,3]),[4,e.send("OnRenderCompleted",t,null)];case 1:return n.sent(),[3,3];case 2:return n.sent(),this.logger.log(s.LogLevel.Warning,"Failed to deliver completion notification for render '"+t+"'."),[3,3];case 3:return[2]}})})},e}();t.RenderQueue=c},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=n(73),o=Math.pow(2,32),i=Math.pow(2,21)-1,a=function(){function e(e){this.batchData=e;var t=new l(e);this.arrayRangeReader=new f(e),this.arrayBuilderSegmentReader=new h(e),this.diffReader=new s(e),this.editReader=new c(e,t),this.frameReader=new u(e,t)}return e.prototype.updatedComponents=function(){return p(this.batchData,this.batchData.length-20)},e.prototype.referenceFrames=function(){return p(this.batchData,this.batchData.length-16)},e.prototype.disposedComponentIds=function(){return p(this.batchData,this.batchData.length-12)},e.prototype.disposedEventHandlerIds=function(){return p(this.batchData,this.batchData.length-8)},e.prototype.updatedComponentsEntry=function(e,t){var n=e+4*t;return p(this.batchData,n)},e.prototype.referenceFramesEntry=function(e,t){return e+20*t},e.prototype.disposedComponentIdsEntry=function(e,t){var n=e+4*t;return p(this.batchData,n)},e.prototype.disposedEventHandlerIdsEntry=function(e,t){var n=e+8*t;return g(this.batchData,n)},e}();t.OutOfProcessRenderBatch=a;var s=function(){function e(e){this.batchDataUint8=e}return e.prototype.componentId=function(e){return p(this.batchDataUint8,e)},e.prototype.edits=function(e){return e+4},e.prototype.editsEntry=function(e,t){return e+16*t},e}(),c=function(){function e(e,t){this.batchDataUint8=e,this.stringReader=t}return e.prototype.editType=function(e){return p(this.batchDataUint8,e)},e.prototype.siblingIndex=function(e){return p(this.batchDataUint8,e+4)},e.prototype.newTreeIndex=function(e){return p(this.batchDataUint8,e+8)},e.prototype.moveToSiblingIndex=function(e){return p(this.batchDataUint8,e+8)},e.prototype.removedAttributeName=function(e){var t=p(this.batchDataUint8,e+12);return this.stringReader.readString(t)},e}(),u=function(){function e(e,t){this.batchDataUint8=e,this.stringReader=t}return e.prototype.frameType=function(e){return p(this.batchDataUint8,e)},e.prototype.subtreeLength=function(e){return p(this.batchDataUint8,e+4)},e.prototype.elementReferenceCaptureId=function(e){var t=p(this.batchDataUint8,e+4);return this.stringReader.readString(t)},e.prototype.componentId=function(e){return p(this.batchDataUint8,e+8)},e.prototype.elementName=function(e){var t=p(this.batchDataUint8,e+8);return this.stringReader.readString(t)},e.prototype.textContent=function(e){var t=p(this.batchDataUint8,e+4);return this.stringReader.readString(t)},e.prototype.markupContent=function(e){var t=p(this.batchDataUint8,e+4);return this.stringReader.readString(t)},e.prototype.attributeName=function(e){var t=p(this.batchDataUint8,e+4);return this.stringReader.readString(t)},e.prototype.attributeValue=function(e){var t=p(this.batchDataUint8,e+8);return this.stringReader.readString(t)},e.prototype.attributeEventHandlerId=function(e){return g(this.batchDataUint8,e+12)},e}(),l=function(){function e(e){this.batchDataUint8=e,this.stringTableStartIndex=p(e,e.length-4)}return e.prototype.readString=function(e){if(-1===e)return null;var t,n=p(this.batchDataUint8,this.stringTableStartIndex+4*e),o=function(e,t){for(var n=0,r=0,o=0;o<4;o++){var i=e[t+o];if(n|=(127&i)<>>0)}function g(e,t){var n=d(e,t+4);if(n>i)throw new Error("Cannot read uint64 with high order part "+n+", because the result would exceed Number.MAX_SAFE_INTEGER.");return n*o+d(e,t)}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r="function"==typeof TextDecoder?new TextDecoder("utf-8"):null;t.decodeUtf8=r?r.decode.bind(r):function(e){var t=0,n=e.length,r=[],o=[];for(;t65535&&(u-=65536,r.push(u>>>10&1023|55296),u=56320|1023&u),r.push(u)}r.length>1024&&(o.push(String.fromCharCode.apply(null,r)),r.length=0)}return o.push(String.fromCharCode.apply(null,r)),o.join("")}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=n(17),o=function(){function e(){}return e.prototype.log=function(e,t){},e.instance=new e,e}();t.NullLogger=o;var i=function(){function e(e){this.minimumLogLevel=e}return e.prototype.log=function(e,t){if(e>=this.minimumLogLevel)switch(e){case r.LogLevel.Critical:case r.LogLevel.Error:console.error("["+(new Date).toISOString()+"] "+r.LogLevel[e]+": "+t);break;case r.LogLevel.Warning:console.warn("["+(new Date).toISOString()+"] "+r.LogLevel[e]+": "+t);break;case r.LogLevel.Information:console.info("["+(new Date).toISOString()+"] "+r.LogLevel[e]+": "+t);break;default:console.log("["+(new Date).toISOString()+"] "+r.LogLevel[e]+": "+t)}},e}();t.ConsoleLogger=i},function(e,t,n){"use strict";var r=this&&this.__awaiter||function(e,t,n,r){return new(n||(n=Promise))(function(o,i){function a(e){try{c(r.next(e))}catch(e){i(e)}}function s(e){try{c(r.throw(e))}catch(e){i(e)}}function c(e){e.done?o(e.value):new n(function(t){t(e.value)}).then(a,s)}c((r=r.apply(e,t||[])).next())})},o=this&&this.__generator||function(e,t){var n,r,o,i,a={label:0,sent:function(){if(1&o[0])throw o[1];return o[1]},trys:[],ops:[]};return i={next:s(0),throw:s(1),return:s(2)},"function"==typeof Symbol&&(i[Symbol.iterator]=function(){return this}),i;function s(i){return function(s){return function(i){if(n)throw new TypeError("Generator is already executing.");for(;a;)try{if(n=1,r&&(o=2&i[0]?r.return:i[0]?r.throw||((o=r.return)&&o.call(r),0):r.next)&&!(o=o.call(r,i[1])).done)return o;switch(r=0,o&&(i=[2&i[0],o.value]),i[0]){case 0:case 1:o=i;break;case 4:return a.label++,{value:i[1],done:!1};case 5:a.label++,r=i[1],i=[0];continue;case 7:i=a.ops.pop(),a.trys.pop();continue;default:if(!(o=(o=a.trys).length>0&&o[o.length-1])&&(6===i[0]||2===i[0])){a=0;continue}if(3===i[0]&&(!o||i[1]>o[0]&&i[1]0&&o[o.length-1])&&(6===i[0]||2===i[0])){a=0;continue}if(3===i[0]&&(!o||i[1]>o[0]&&i[1]0&&o[o.length-1])&&(6===i[0]||2===i[0])){a=0;continue}if(3===i[0]&&(!o||i[1]>o[0]&&i[1]reloading the page if you're unable to reconnect.",this.message.querySelector("a").addEventListener("click",function(){return location.reload()})},e.prototype.rejected=function(){this.button.style.display="none",this.reloadParagraph.style.display="none",this.message.innerHTML="Could not reconnect to the server. Reload the page to restore functionality.",this.message.querySelector("a").addEventListener("click",function(){return location.reload()})},e}();t.DefaultReconnectDisplay=a},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=function(){function e(e){this.dialog=e}return e.prototype.show=function(){this.removeClasses(),this.dialog.classList.add(e.ShowClassName)},e.prototype.hide=function(){this.removeClasses(),this.dialog.classList.add(e.HideClassName)},e.prototype.failed=function(){this.removeClasses(),this.dialog.classList.add(e.FailedClassName)},e.prototype.rejected=function(){this.removeClasses(),this.dialog.classList.add(e.RejectedClassName)},e.prototype.removeClasses=function(){this.dialog.classList.remove(e.ShowClassName,e.HideClassName,e.FailedClassName,e.RejectedClassName)},e.ShowClassName="components-reconnect-show",e.HideClassName="components-reconnect-hide",e.FailedClassName="components-reconnect-failed",e.RejectedClassName="components-reconnect-rejected",e}();t.UserSpecifiedDisplay=r},function(e,t,n){"use strict";n.r(t);var r=n(6),o=n(12),i=n(2),a=function(){function e(){}return e.write=function(e){var t=e.byteLength||e.length,n=[];do{var r=127&t;(t>>=7)>0&&(r|=128),n.push(r)}while(t>0);t=e.byteLength||e.length;var o=new Uint8Array(n.length+t);return o.set(n,0),o.set(e,n.length),o.buffer},e.parse=function(e){for(var t=[],n=new Uint8Array(e),r=[0,7,14,21,28],o=0;o7)throw new Error("Messages bigger than 2GB are not supported.");if(!(n.byteLength>=o+i+a))throw new Error("Incomplete message.");t.push(n.slice?n.slice(o+i,o+i+a):n.subarray(o+i,o+i+a)),o=o+i+a}return t},e}();var s=new Uint8Array([145,i.MessageType.Ping]),c=function(){function e(){this.name="messagepack",this.version=1,this.transferFormat=i.TransferFormat.Binary,this.errorResult=1,this.voidResult=2,this.nonVoidResult=3}return e.prototype.parseMessages=function(e,t){if(!(e instanceof r.Buffer||(n=e,n&&"undefined"!=typeof ArrayBuffer&&(n instanceof ArrayBuffer||n.constructor&&"ArrayBuffer"===n.constructor.name))))throw new Error("Invalid input for MessagePack hub protocol. Expected an ArrayBuffer or Buffer.");var n;null===t&&(t=i.NullLogger.instance);for(var o=[],s=0,c=a.parse(e);s=0;u--)if(l[u]!==f[u])return!1;for(u=l.length-1;u>=0;u--)if(c=l[u],!b(e[c],t[c],n,r))return!1;return!0}(e,t,n,a))}return n?e===t:e==t}function m(e){return"[object Arguments]"==Object.prototype.toString.call(e)}function w(e,t){if(!e||!t)return!1;if("[object RegExp]"==Object.prototype.toString.call(t))return t.test(e);try{if(e instanceof t)return!0}catch(e){}return!Error.isPrototypeOf(t)&&!0===t.call({},e)}function E(e,t,n,r){var o;if("function"!=typeof t)throw new TypeError('"block" argument must be a function');"string"==typeof n&&(r=n,n=null),o=function(e){var t;try{e()}catch(e){t=e}return t}(t),r=(n&&n.name?" ("+n.name+").":".")+(r?" "+r:"."),e&&!o&&y(o,n,"Missing expected exception"+r);var a="string"==typeof r,s=!e&&o&&!n;if((!e&&i.isError(o)&&a&&w(o,n)||s)&&y(o,n,"Got unwanted exception"+r),e&&o&&n&&!w(o,n)||!e&&o)throw o}f.AssertionError=function(e){var t;this.name="AssertionError",this.actual=e.actual,this.expected=e.expected,this.operator=e.operator,e.message?(this.message=e.message,this.generatedMessage=!1):(this.message=d(g((t=this).actual),128)+" "+t.operator+" "+d(g(t.expected),128),this.generatedMessage=!0);var n=e.stackStartFunction||y;if(Error.captureStackTrace)Error.captureStackTrace(this,n);else{var r=new Error;if(r.stack){var o=r.stack,i=p(n),a=o.indexOf("\n"+i);if(a>=0){var s=o.indexOf("\n",a+1);o=o.substring(s+1)}this.stack=o}}},i.inherits(f.AssertionError,Error),f.fail=y,f.ok=v,f.equal=function(e,t,n){e!=t&&y(e,t,n,"==",f.equal)},f.notEqual=function(e,t,n){e==t&&y(e,t,n,"!=",f.notEqual)},f.deepEqual=function(e,t,n){b(e,t,!1)||y(e,t,n,"deepEqual",f.deepEqual)},f.deepStrictEqual=function(e,t,n){b(e,t,!0)||y(e,t,n,"deepStrictEqual",f.deepStrictEqual)},f.notDeepEqual=function(e,t,n){b(e,t,!1)&&y(e,t,n,"notDeepEqual",f.notDeepEqual)},f.notDeepStrictEqual=function e(t,n,r){b(t,n,!0)&&y(t,n,r,"notDeepStrictEqual",e)},f.strictEqual=function(e,t,n){e!==t&&y(e,t,n,"===",f.strictEqual)},f.notStrictEqual=function(e,t,n){e===t&&y(e,t,n,"!==",f.notStrictEqual)},f.throws=function(e,t,n){E(!0,e,t,n)},f.doesNotThrow=function(e,t,n){E(!1,e,t,n)},f.ifError=function(e){if(e)throw e};var S=Object.keys||function(e){var t=[];for(var n in e)a.call(e,n)&&t.push(n);return t}}).call(this,n(10))},function(e,t){e.exports=function(e){return e&&"object"==typeof e&&"function"==typeof e.copy&&"function"==typeof e.fill&&"function"==typeof e.readUInt8}},function(e,t){"function"==typeof Object.create?e.exports=function(e,t){e.super_=t,e.prototype=Object.create(t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}})}:e.exports=function(e,t){e.super_=t;var n=function(){};n.prototype=t.prototype,e.prototype=new n,e.prototype.constructor=e}},function(e,t,n){e.exports=n(11)},function(e,t){var n={}.toString;e.exports=Array.isArray||function(e){return"[object Array]"==n.call(e)}},function(e,t){},function(e,t,n){"use strict";var r=n(15).Buffer,o=n(61);e.exports=function(){function e(){!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,e),this.head=null,this.tail=null,this.length=0}return e.prototype.push=function(e){var t={data:e,next:null};this.length>0?this.tail.next=t:this.head=t,this.tail=t,++this.length},e.prototype.unshift=function(e){var t={data:e,next:this.head};0===this.length&&(this.tail=t),this.head=t,++this.length},e.prototype.shift=function(){if(0!==this.length){var e=this.head.data;return 1===this.length?this.head=this.tail=null:this.head=this.head.next,--this.length,e}},e.prototype.clear=function(){this.head=this.tail=null,this.length=0},e.prototype.join=function(e){if(0===this.length)return"";for(var t=this.head,n=""+t.data;t=t.next;)n+=e+t.data;return n},e.prototype.concat=function(e){if(0===this.length)return r.alloc(0);if(1===this.length)return this.head.data;for(var t,n,o,i=r.allocUnsafe(e>>>0),a=this.head,s=0;a;)t=a.data,n=i,o=s,t.copy(n,o),s+=a.data.length,a=a.next;return i},e}(),o&&o.inspect&&o.inspect.custom&&(e.exports.prototype[o.inspect.custom]=function(){var e=o.inspect({length:this.length});return this.constructor.name+" "+e})},function(e,t){},function(e,t,n){var r=n(6),o=r.Buffer;function i(e,t){for(var n in e)t[n]=e[n]}function a(e,t,n){return o(e,t,n)}o.from&&o.alloc&&o.allocUnsafe&&o.allocUnsafeSlow?e.exports=r:(i(r,t),t.Buffer=a),i(o,a),a.from=function(e,t,n){if("number"==typeof e)throw new TypeError("Argument must not be a number");return o(e,t,n)},a.alloc=function(e,t,n){if("number"!=typeof e)throw new TypeError("Argument must be a number");var r=o(e);return void 0!==t?"string"==typeof n?r.fill(t,n):r.fill(t):r.fill(0),r},a.allocUnsafe=function(e){if("number"!=typeof e)throw new TypeError("Argument must be a number");return o(e)},a.allocUnsafeSlow=function(e){if("number"!=typeof e)throw new TypeError("Argument must be a number");return r.SlowBuffer(e)}},function(e,t,n){(function(e){var r=void 0!==e&&e||"undefined"!=typeof self&&self||window,o=Function.prototype.apply;function i(e,t){this._id=e,this._clearFn=t}t.setTimeout=function(){return new i(o.call(setTimeout,r,arguments),clearTimeout)},t.setInterval=function(){return new i(o.call(setInterval,r,arguments),clearInterval)},t.clearTimeout=t.clearInterval=function(e){e&&e.close()},i.prototype.unref=i.prototype.ref=function(){},i.prototype.close=function(){this._clearFn.call(r,this._id)},t.enroll=function(e,t){clearTimeout(e._idleTimeoutId),e._idleTimeout=t},t.unenroll=function(e){clearTimeout(e._idleTimeoutId),e._idleTimeout=-1},t._unrefActive=t.active=function(e){clearTimeout(e._idleTimeoutId);var t=e._idleTimeout;t>=0&&(e._idleTimeoutId=setTimeout(function(){e._onTimeout&&e._onTimeout()},t))},n(64),t.setImmediate="undefined"!=typeof self&&self.setImmediate||void 0!==e&&e.setImmediate||this&&this.setImmediate,t.clearImmediate="undefined"!=typeof self&&self.clearImmediate||void 0!==e&&e.clearImmediate||this&&this.clearImmediate}).call(this,n(10))},function(e,t,n){(function(e,t){!function(e,n){"use strict";if(!e.setImmediate){var r,o,i,a,s,c=1,u={},l=!1,f=e.document,h=Object.getPrototypeOf&&Object.getPrototypeOf(e);h=h&&h.setTimeout?h:e,"[object process]"==={}.toString.call(e.process)?r=function(e){t.nextTick(function(){d(e)})}:!function(){if(e.postMessage&&!e.importScripts){var t=!0,n=e.onmessage;return e.onmessage=function(){t=!1},e.postMessage("","*"),e.onmessage=n,t}}()?e.MessageChannel?((i=new MessageChannel).port1.onmessage=function(e){d(e.data)},r=function(e){i.port2.postMessage(e)}):f&&"onreadystatechange"in f.createElement("script")?(o=f.documentElement,r=function(e){var t=f.createElement("script");t.onreadystatechange=function(){d(e),t.onreadystatechange=null,o.removeChild(t),t=null},o.appendChild(t)}):r=function(e){setTimeout(d,0,e)}:(a="setImmediate$"+Math.random()+"$",s=function(t){t.source===e&&"string"==typeof t.data&&0===t.data.indexOf(a)&&d(+t.data.slice(a.length))},e.addEventListener?e.addEventListener("message",s,!1):e.attachEvent("onmessage",s),r=function(t){e.postMessage(a+t,"*")}),h.setImmediate=function(e){"function"!=typeof e&&(e=new Function(""+e));for(var t=new Array(arguments.length-1),n=0;n0?this._transform(null,t,n):n()},e.exports.decoder=c,e.exports.encoder=s},function(e,t,n){(t=e.exports=n(37)).Stream=t,t.Readable=t,t.Writable=n(42),t.Duplex=n(11),t.Transform=n(43),t.PassThrough=n(68)},function(e,t,n){"use strict";e.exports=i;var r=n(43),o=n(21);function i(e){if(!(this instanceof i))return new i(e);r.call(this,e)}o.inherits=n(16),o.inherits(i,r),i.prototype._transform=function(e,t,n){n(null,e)}},function(e,t,n){var r=n(22);function o(e){Error.call(this),Error.captureStackTrace&&Error.captureStackTrace(this,this.constructor),this.name=this.constructor.name,this.message=e||"unable to decode"}n(36).inherits(o,Error),e.exports=function(e){return function(e){e instanceof r||(e=r().append(e));var t=i(e);if(t)return e.consume(t.bytesConsumed),t.value;throw new o};function t(e,t,n){return t>=n+e}function n(e,t){return{value:e,bytesConsumed:t}}function i(e,r){r=void 0===r?0:r;var o=e.length-r;if(o<=0)return null;var i,l,f,h=e.readUInt8(r),p=0;if(!function(e,t){var n=function(e){switch(e){case 196:return 2;case 197:return 3;case 198:return 5;case 199:return 3;case 200:return 4;case 201:return 6;case 202:return 5;case 203:return 9;case 204:return 2;case 205:return 3;case 206:return 5;case 207:return 9;case 208:return 2;case 209:return 3;case 210:return 5;case 211:return 9;case 212:return 3;case 213:return 4;case 214:return 6;case 215:return 10;case 216:return 18;case 217:return 2;case 218:return 3;case 219:return 5;case 222:return 3;default:return-1}}(e);return!(-1!==n&&t=0;f--)p+=e.readUInt8(r+f+1)*Math.pow(2,8*(7-f));return n(p,9);case 208:return n(p=e.readInt8(r+1),2);case 209:return n(p=e.readInt16BE(r+1),3);case 210:return n(p=e.readInt32BE(r+1),5);case 211:return n(p=function(e,t){var n=128==(128&e[t]);if(n)for(var r=1,o=t+7;o>=t;o--){var i=(255^e[o])+r;e[o]=255&i,r=i>>8}var a=e.readUInt32BE(t+0),s=e.readUInt32BE(t+4);return(4294967296*a+s)*(n?-1:1)}(e.slice(r+1,r+9),0),9);case 202:return n(p=e.readFloatBE(r+1),5);case 203:return n(p=e.readDoubleBE(r+1),9);case 217:return t(i=e.readUInt8(r+1),o,2)?n(p=e.toString("utf8",r+2,r+2+i),2+i):null;case 218:return t(i=e.readUInt16BE(r+1),o,3)?n(p=e.toString("utf8",r+3,r+3+i),3+i):null;case 219:return t(i=e.readUInt32BE(r+1),o,5)?n(p=e.toString("utf8",r+5,r+5+i),5+i):null;case 196:return t(i=e.readUInt8(r+1),o,2)?n(p=e.slice(r+2,r+2+i),2+i):null;case 197:return t(i=e.readUInt16BE(r+1),o,3)?n(p=e.slice(r+3,r+3+i),3+i):null;case 198:return t(i=e.readUInt32BE(r+1),o,5)?n(p=e.slice(r+5,r+5+i),5+i):null;case 220:return o<3?null:(i=e.readUInt16BE(r+1),a(e,r,i,3));case 221:return o<5?null:(i=e.readUInt32BE(r+1),a(e,r,i,5));case 222:return i=e.readUInt16BE(r+1),s(e,r,i,3);case 223:throw new Error("map too big to decode in JS");case 212:return c(e,r,1);case 213:return c(e,r,2);case 214:return c(e,r,4);case 215:return c(e,r,8);case 216:return c(e,r,16);case 199:return i=e.readUInt8(r+1),l=e.readUInt8(r+2),t(i,o,3)?u(e,r,l,i,3):null;case 200:return i=e.readUInt16BE(r+1),l=e.readUInt8(r+3),t(i,o,4)?u(e,r,l,i,4):null;case 201:return i=e.readUInt32BE(r+1),l=e.readUInt8(r+5),t(i,o,6)?u(e,r,l,i,6):null}if(144==(240&h))return a(e,r,i=15&h,1);if(128==(240&h))return s(e,r,i=15&h,1);if(160==(224&h))return t(i=31&h,o,1)?n(p=e.toString("utf8",r+1,r+i+1),i+1):null;if(h>=224)return n(p=h-256,1);if(h<128)return n(h,1);throw new Error("not implemented yet")}function a(e,t,r,o){var a,s=[],c=0;for(t+=o,a=0;ai)&&((n=r.allocUnsafe(9))[0]=203,n.writeDoubleBE(e,1)),n}e.exports=function(e,t,n,i){function s(c,u){var l,f,h;if(void 0===c)throw new Error("undefined is not encodable in msgpack!");if(null===c)(l=r.allocUnsafe(1))[0]=192;else if(!0===c)(l=r.allocUnsafe(1))[0]=195;else if(!1===c)(l=r.allocUnsafe(1))[0]=194;else if("string"==typeof c)(f=r.byteLength(c))<32?((l=r.allocUnsafe(1+f))[0]=160|f,f>0&&l.write(c,1)):f<=255&&!n?((l=r.allocUnsafe(2+f))[0]=217,l[1]=f,l.write(c,2)):f<=65535?((l=r.allocUnsafe(3+f))[0]=218,l.writeUInt16BE(f,1),l.write(c,3)):((l=r.allocUnsafe(5+f))[0]=219,l.writeUInt32BE(f,1),l.write(c,5));else if(c&&(c.readUInt32LE||c instanceof Uint8Array))c instanceof Uint8Array&&(c=r.from(c)),c.length<=255?((l=r.allocUnsafe(2))[0]=196,l[1]=c.length):c.length<=65535?((l=r.allocUnsafe(3))[0]=197,l.writeUInt16BE(c.length,1)):((l=r.allocUnsafe(5))[0]=198,l.writeUInt32BE(c.length,1)),l=o([l,c]);else if(Array.isArray(c))c.length<16?(l=r.allocUnsafe(1))[0]=144|c.length:c.length<65536?((l=r.allocUnsafe(3))[0]=220,l.writeUInt16BE(c.length,1)):((l=r.allocUnsafe(5))[0]=221,l.writeUInt32BE(c.length,1)),l=c.reduce(function(e,t){return e.append(s(t,!0)),e},o().append(l));else{if(!i&&"function"==typeof c.getDate)return function(e){var t,n=1*e,i=Math.floor(n/1e3),a=1e6*(n-1e3*i);if(a||i>4294967295){(t=new r(10))[0]=215,t[1]=-1;var s=4*a,c=i/Math.pow(2,32),u=s+c&4294967295,l=4294967295&i;t.writeInt32BE(u,2),t.writeInt32BE(l,6)}else(t=new r(6))[0]=214,t[1]=-1,t.writeUInt32BE(Math.floor(n/1e3),2);return o().append(t)}(c);if("object"==typeof c)l=function(t){var n,i,a=-1,s=[];for(n=0;n>8),s.push(255&a)):(s.push(201),s.push(a>>24),s.push(a>>16&255),s.push(a>>8&255),s.push(255&a));return o().append(r.from(s)).append(i)}(c)||function(e){var t,n,i=[],a=0;for(t in e)e.hasOwnProperty(t)&&void 0!==e[t]&&"function"!=typeof e[t]&&(++a,i.push(s(t,!0)),i.push(s(e[t],!0)));a<16?(n=r.allocUnsafe(1))[0]=128|a:((n=r.allocUnsafe(3))[0]=222,n.writeUInt16BE(a,1));return i.unshift(n),i.reduce(function(e,t){return e.append(t)},o())}(c);else if("number"==typeof c){if((h=c)!==Math.floor(h))return a(c,t);if(c>=0)if(c<128)(l=r.allocUnsafe(1))[0]=c;else if(c<256)(l=r.allocUnsafe(2))[0]=204,l[1]=c;else if(c<65536)(l=r.allocUnsafe(3))[0]=205,l.writeUInt16BE(c,1);else if(c<=4294967295)(l=r.allocUnsafe(5))[0]=206,l.writeUInt32BE(c,1);else{if(!(c<=9007199254740991))return a(c,!0);(l=r.allocUnsafe(9))[0]=207,function(e,t){for(var n=7;n>=0;n--)e[n+1]=255&t,t/=256}(l,c)}else if(c>=-32)(l=r.allocUnsafe(1))[0]=256+c;else if(c>=-128)(l=r.allocUnsafe(2))[0]=208,l.writeInt8(c,1);else if(c>=-32768)(l=r.allocUnsafe(3))[0]=209,l.writeInt16BE(c,1);else if(c>-214748365)(l=r.allocUnsafe(5))[0]=210,l.writeInt32BE(c,1);else{if(!(c>=-9007199254740991))return a(c,!0);(l=r.allocUnsafe(9))[0]=211,function(e,t,n){var r=n<0;r&&(n=Math.abs(n));var o=n%4294967296,i=n/4294967296;if(e.writeUInt32BE(Math.floor(i),t+0),e.writeUInt32BE(o,t+4),r)for(var a=1,s=t+7;s>=t;s--){var c=(255^e[s])+a;e[s]=255&c,a=c>>8}}(l,1,c)}}}if(!l)throw new Error("not implemented yet");return u?l:l.slice()}return s}},function(e,t,n){"use strict";var r=this&&this.__awaiter||function(e,t,n,r){return new(n||(n=Promise))(function(o,i){function a(e){try{c(r.next(e))}catch(e){i(e)}}function s(e){try{c(r.throw(e))}catch(e){i(e)}}function c(e){e.done?o(e.value):new n(function(t){t(e.value)}).then(a,s)}c((r=r.apply(e,t||[])).next())})},o=this&&this.__generator||function(e,t){var n,r,o,i,a={label:0,sent:function(){if(1&o[0])throw o[1];return o[1]},trys:[],ops:[]};return i={next:s(0),throw:s(1),return:s(2)},"function"==typeof Symbol&&(i[Symbol.iterator]=function(){return this}),i;function s(i){return function(s){return function(i){if(n)throw new TypeError("Generator is already executing.");for(;a;)try{if(n=1,r&&(o=2&i[0]?r.return:i[0]?r.throw||((o=r.return)&&o.call(r),0):r.next)&&!(o=o.call(r,i[1])).done)return o;switch(r=0,o&&(i=[2&i[0],o.value]),i[0]){case 0:case 1:o=i;break;case 4:return a.label++,{value:i[1],done:!1};case 5:a.label++,r=i[1],i=[0];continue;case 7:i=a.ops.pop(),a.trys.pop();continue;default:if(!(o=(o=a.trys).length>0&&o[o.length-1])&&(6===i[0]||2===i[0])){a=0;continue}if(3===i[0]&&(!o||i[1]>o[0]&&i[1]this.nextBatchId?this.fatalError?(this.logger.log(s.LogLevel.Debug,"Received a new batch "+e+" but errored out on a previous batch "+(this.nextBatchId-1)),[4,n.send("OnRenderCompleted",this.nextBatchId-1,this.fatalError.toString())]):[3,4]:[3,5];case 3:return o.sent(),[2];case 4:return this.logger.log(s.LogLevel.Debug,"Waiting for batch "+this.nextBatchId+". Batch "+e+" not processed."),[2];case 5:return o.trys.push([5,7,,8]),this.nextBatchId++,this.logger.log(s.LogLevel.Debug,"Applying batch "+e+"."),i.renderBatch(this.browserRendererId,new a.OutOfProcessRenderBatch(t)),[4,this.completeBatch(n,e)];case 6:return o.sent(),[3,8];case 7:throw r=o.sent(),this.fatalError=r.toString(),this.logger.log(s.LogLevel.Error,"There was an error applying batch "+e+"."),n.send("OnRenderCompleted",e,r.toString()),r;case 8:return[2]}})})},e.prototype.getLastBatchid=function(){return this.nextBatchId-1},e.prototype.completeBatch=function(e,t){return r(this,void 0,void 0,function(){return o(this,function(n){switch(n.label){case 0:return n.trys.push([0,2,,3]),[4,e.send("OnRenderCompleted",t,null)];case 1:return n.sent(),[3,3];case 2:return n.sent(),this.logger.log(s.LogLevel.Warning,"Failed to deliver completion notification for render '"+t+"'."),[3,3];case 3:return[2]}})})},e}();t.RenderQueue=c},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=n(73),o=Math.pow(2,32),i=Math.pow(2,21)-1,a=function(){function e(e){this.batchData=e;var t=new l(e);this.arrayRangeReader=new f(e),this.arrayBuilderSegmentReader=new h(e),this.diffReader=new s(e),this.editReader=new c(e,t),this.frameReader=new u(e,t)}return e.prototype.updatedComponents=function(){return p(this.batchData,this.batchData.length-20)},e.prototype.referenceFrames=function(){return p(this.batchData,this.batchData.length-16)},e.prototype.disposedComponentIds=function(){return p(this.batchData,this.batchData.length-12)},e.prototype.disposedEventHandlerIds=function(){return p(this.batchData,this.batchData.length-8)},e.prototype.updatedComponentsEntry=function(e,t){var n=e+4*t;return p(this.batchData,n)},e.prototype.referenceFramesEntry=function(e,t){return e+20*t},e.prototype.disposedComponentIdsEntry=function(e,t){var n=e+4*t;return p(this.batchData,n)},e.prototype.disposedEventHandlerIdsEntry=function(e,t){var n=e+8*t;return g(this.batchData,n)},e}();t.OutOfProcessRenderBatch=a;var s=function(){function e(e){this.batchDataUint8=e}return e.prototype.componentId=function(e){return p(this.batchDataUint8,e)},e.prototype.edits=function(e){return e+4},e.prototype.editsEntry=function(e,t){return e+16*t},e}(),c=function(){function e(e,t){this.batchDataUint8=e,this.stringReader=t}return e.prototype.editType=function(e){return p(this.batchDataUint8,e)},e.prototype.siblingIndex=function(e){return p(this.batchDataUint8,e+4)},e.prototype.newTreeIndex=function(e){return p(this.batchDataUint8,e+8)},e.prototype.moveToSiblingIndex=function(e){return p(this.batchDataUint8,e+8)},e.prototype.removedAttributeName=function(e){var t=p(this.batchDataUint8,e+12);return this.stringReader.readString(t)},e}(),u=function(){function e(e,t){this.batchDataUint8=e,this.stringReader=t}return e.prototype.frameType=function(e){return p(this.batchDataUint8,e)},e.prototype.subtreeLength=function(e){return p(this.batchDataUint8,e+4)},e.prototype.elementReferenceCaptureId=function(e){var t=p(this.batchDataUint8,e+4);return this.stringReader.readString(t)},e.prototype.componentId=function(e){return p(this.batchDataUint8,e+8)},e.prototype.elementName=function(e){var t=p(this.batchDataUint8,e+8);return this.stringReader.readString(t)},e.prototype.textContent=function(e){var t=p(this.batchDataUint8,e+4);return this.stringReader.readString(t)},e.prototype.markupContent=function(e){var t=p(this.batchDataUint8,e+4);return this.stringReader.readString(t)},e.prototype.attributeName=function(e){var t=p(this.batchDataUint8,e+4);return this.stringReader.readString(t)},e.prototype.attributeValue=function(e){var t=p(this.batchDataUint8,e+8);return this.stringReader.readString(t)},e.prototype.attributeEventHandlerId=function(e){return g(this.batchDataUint8,e+12)},e}(),l=function(){function e(e){this.batchDataUint8=e,this.stringTableStartIndex=p(e,e.length-4)}return e.prototype.readString=function(e){if(-1===e)return null;var t,n=p(this.batchDataUint8,this.stringTableStartIndex+4*e),o=function(e,t){for(var n=0,r=0,o=0;o<4;o++){var i=e[t+o];if(n|=(127&i)<>>0)}function g(e,t){var n=d(e,t+4);if(n>i)throw new Error("Cannot read uint64 with high order part "+n+", because the result would exceed Number.MAX_SAFE_INTEGER.");return n*o+d(e,t)}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r="function"==typeof TextDecoder?new TextDecoder("utf-8"):null;t.decodeUtf8=r?r.decode.bind(r):function(e){var t=0,n=e.length,r=[],o=[];for(;t65535&&(u-=65536,r.push(u>>>10&1023|55296),u=56320|1023&u),r.push(u)}r.length>1024&&(o.push(String.fromCharCode.apply(null,r)),r.length=0)}return o.push(String.fromCharCode.apply(null,r)),o.join("")}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=n(17),o=function(){function e(){}return e.prototype.log=function(e,t){},e.instance=new e,e}();t.NullLogger=o;var i=function(){function e(e){this.minimumLogLevel=e}return e.prototype.log=function(e,t){if(e>=this.minimumLogLevel)switch(e){case r.LogLevel.Critical:case r.LogLevel.Error:console.error("["+(new Date).toISOString()+"] "+r.LogLevel[e]+": "+t);break;case r.LogLevel.Warning:console.warn("["+(new Date).toISOString()+"] "+r.LogLevel[e]+": "+t);break;case r.LogLevel.Information:console.info("["+(new Date).toISOString()+"] "+r.LogLevel[e]+": "+t);break;default:console.log("["+(new Date).toISOString()+"] "+r.LogLevel[e]+": "+t)}},e}();t.ConsoleLogger=i},function(e,t,n){"use strict";var r=this&&this.__awaiter||function(e,t,n,r){return new(n||(n=Promise))(function(o,i){function a(e){try{c(r.next(e))}catch(e){i(e)}}function s(e){try{c(r.throw(e))}catch(e){i(e)}}function c(e){e.done?o(e.value):new n(function(t){t(e.value)}).then(a,s)}c((r=r.apply(e,t||[])).next())})},o=this&&this.__generator||function(e,t){var n,r,o,i,a={label:0,sent:function(){if(1&o[0])throw o[1];return o[1]},trys:[],ops:[]};return i={next:s(0),throw:s(1),return:s(2)},"function"==typeof Symbol&&(i[Symbol.iterator]=function(){return this}),i;function s(i){return function(s){return function(i){if(n)throw new TypeError("Generator is already executing.");for(;a;)try{if(n=1,r&&(o=2&i[0]?r.return:i[0]?r.throw||((o=r.return)&&o.call(r),0):r.next)&&!(o=o.call(r,i[1])).done)return o;switch(r=0,o&&(i=[2&i[0],o.value]),i[0]){case 0:case 1:o=i;break;case 4:return a.label++,{value:i[1],done:!1};case 5:a.label++,r=i[1],i=[0];continue;case 7:i=a.ops.pop(),a.trys.pop();continue;default:if(!(o=(o=a.trys).length>0&&o[o.length-1])&&(6===i[0]||2===i[0])){a=0;continue}if(3===i[0]&&(!o||i[1]>o[0]&&i[1]0&&o[o.length-1])&&(6===i[0]||2===i[0])){a=0;continue}if(3===i[0]&&(!o||i[1]>o[0]&&i[1]0&&o[o.length-1])&&(6===i[0]||2===i[0])){a=0;continue}if(3===i[0]&&(!o||i[1]>o[0]&&i[1]reloading the page if you're unable to reconnect.",this.message.querySelector("a").addEventListener("click",function(){return location.reload()})},e.prototype.rejected=function(){this.button.style.display="none",this.reloadParagraph.style.display="none",this.message.innerHTML="Could not reconnect to the server. Reload the page to restore functionality.",this.message.querySelector("a").addEventListener("click",function(){return location.reload()})},e}();t.DefaultReconnectDisplay=a},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=function(){function e(e){this.dialog=e}return e.prototype.show=function(){this.removeClasses(),this.dialog.classList.add(e.ShowClassName)},e.prototype.hide=function(){this.removeClasses(),this.dialog.classList.add(e.HideClassName)},e.prototype.failed=function(){this.removeClasses(),this.dialog.classList.add(e.FailedClassName)},e.prototype.rejected=function(){this.removeClasses(),this.dialog.classList.add(e.RejectedClassName)},e.prototype.removeClasses=function(){this.dialog.classList.remove(e.ShowClassName,e.HideClassName,e.FailedClassName,e.RejectedClassName)},e.ShowClassName="components-reconnect-show",e.HideClassName="components-reconnect-hide",e.FailedClassName="components-reconnect-failed",e.RejectedClassName="components-reconnect-rejected",e}();t.UserSpecifiedDisplay=r},function(e,t,n){"use strict";n.r(t);var r=n(6),o=n(12),i=n(2),a=function(){function e(){}return e.write=function(e){var t=e.byteLength||e.length,n=[];do{var r=127&t;(t>>=7)>0&&(r|=128),n.push(r)}while(t>0);t=e.byteLength||e.length;var o=new Uint8Array(n.length+t);return o.set(n,0),o.set(e,n.length),o.buffer},e.parse=function(e){for(var t=[],n=new Uint8Array(e),r=[0,7,14,21,28],o=0;o7)throw new Error("Messages bigger than 2GB are not supported.");if(!(n.byteLength>=o+i+a))throw new Error("Incomplete message.");t.push(n.slice?n.slice(o+i,o+i+a):n.subarray(o+i,o+i+a)),o=o+i+a}return t},e}();var s=new Uint8Array([145,i.MessageType.Ping]),c=function(){function e(){this.name="messagepack",this.version=1,this.transferFormat=i.TransferFormat.Binary,this.errorResult=1,this.voidResult=2,this.nonVoidResult=3}return e.prototype.parseMessages=function(e,t){if(!(e instanceof r.Buffer||(n=e,n&&"undefined"!=typeof ArrayBuffer&&(n instanceof ArrayBuffer||n.constructor&&"ArrayBuffer"===n.constructor.name))))throw new Error("Invalid input for MessagePack hub protocol. Expected an ArrayBuffer or Buffer.");var n;null===t&&(t=i.NullLogger.instance);for(var o=[],s=0,c=a.parse(e);s=3?e[2]:void 0,error:e[1],type:i.MessageType.Close}},e.prototype.createPingMessage=function(e){if(e.length<1)throw new Error("Invalid payload for Ping message.");return{type:i.MessageType.Ping}},e.prototype.createInvocationMessage=function(e,t){if(t.length<5)throw new Error("Invalid payload for Invocation message.");var n=t[2];return n?{arguments:t[4],headers:e,invocationId:n,streamIds:[],target:t[3],type:i.MessageType.Invocation}:{arguments:t[4],headers:e,streamIds:[],target:t[3],type:i.MessageType.Invocation}},e.prototype.createStreamItemMessage=function(e,t){if(t.length<4)throw new Error("Invalid payload for StreamItem message.");return{headers:e,invocationId:t[2],item:t[3],type:i.MessageType.StreamItem}},e.prototype.createCompletionMessage=function(e,t){if(t.length<4)throw new Error("Invalid payload for Completion message.");var n,r,o=t[3];if(o!==this.voidResult&&t.length<5)throw new Error("Invalid payload for Completion message.");switch(o){case this.errorResult:n=t[4];break;case this.nonVoidResult:r=t[4]}return{error:n,headers:e,invocationId:t[2],result:r,type:i.MessageType.Completion}},e.prototype.writeInvocation=function(e){var t=o().encode([i.MessageType.Invocation,e.headers||{},e.invocationId||null,e.target,e.arguments,e.streamIds]);return a.write(t.slice())},e.prototype.writeStreamInvocation=function(e){var t=o().encode([i.MessageType.StreamInvocation,e.headers||{},e.invocationId,e.target,e.arguments,e.streamIds]);return a.write(t.slice())},e.prototype.writeStreamItem=function(e){var t=o().encode([i.MessageType.StreamItem,e.headers||{},e.invocationId,e.item]);return a.write(t.slice())},e.prototype.writeCompletion=function(e){var t,n=o(),r=e.error?this.errorResult:e.result?this.nonVoidResult:this.voidResult;switch(r){case this.errorResult:t=n.encode([i.MessageType.Completion,e.headers||{},e.invocationId,r,e.error]);break;case this.voidResult:t=n.encode([i.MessageType.Completion,e.headers||{},e.invocationId,r]);break;case this.nonVoidResult:t=n.encode([i.MessageType.Completion,e.headers||{},e.invocationId,r,e.result])}return a.write(t.slice())},e.prototype.writeCancelInvocation=function(e){var t=o().encode([i.MessageType.CancelInvocation,e.headers||{},e.invocationId]);return a.write(t.slice())},e.prototype.readHeaders=function(e){var t=e[1];if("object"!=typeof t)throw new Error("Invalid headers.");return t},e}();n.d(t,"VERSION",function(){return u}),n.d(t,"MessagePackHubProtocol",function(){return c});var u="3.1.0-dev"}]); \ No newline at end of file diff --git a/src/Components/Web.JS/dist/Release/blazor.webassembly.js b/src/Components/Web.JS/dist/Release/blazor.webassembly.js index d808b04f12..5b0852a50c 100644 --- a/src/Components/Web.JS/dist/Release/blazor.webassembly.js +++ b/src/Components/Web.JS/dist/Release/blazor.webassembly.js @@ -1 +1 @@ -!function(e){var t={};function n(r){if(t[r])return t[r].exports;var o=t[r]={i:r,l:!1,exports:{}};return e[r].call(o.exports,o,o.exports,n),o.l=!0,o.exports}n.m=e,n.c=t,n.d=function(e,t,r){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(n.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var o in e)n.d(r,o,function(t){return e[t]}.bind(null,o));return r},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="",n(n.s=46)}([,,,,,function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),n(25),n(9);var r=n(26),o=n(14),a={},i=!1;function l(e,t,n){var o=a[e];o||(o=a[e]=new r.BrowserRenderer(e)),o.attachRootComponentToLogicalElement(n,t)}t.attachRootComponentToLogicalElement=l,t.attachRootComponentToElement=function(e,t,n){var r=document.querySelector(e);if(!r)throw new Error("Could not find any element matching selector '"+e+"'.");l(n||0,o.toLogicalElement(r,!0),t)},t.renderBatch=function(e,t){var n=a[e];if(!n)throw new Error("There is no browser renderer with ID "+e+".");for(var r=t.arrayRangeReader,o=t.updatedComponents(),l=r.values(o),u=r.count(o),s=t.referenceFrames(),c=r.values(s),f=t.diffReader,d=0;d0&&o[o.length-1])&&(6===a[0]||2===a[0])){i=0;continue}if(3===a[0]&&(!o||a[1]>o[0]&&a[1]0&&!t)throw new Error("New logical elements must start empty, or allowExistingContents must be true");return e[r]=[],e}function l(e,t,n){var a=e;if(e instanceof Comment&&(s(a)&&s(a).length>0))throw new Error("Not implemented: inserting non-empty logical container");if(u(a))throw new Error("Not implemented: moving existing logical children");var i=s(t);if(n0;)e(r,0);var a=r;a.parentNode.removeChild(a)},t.getLogicalParent=u,t.getLogicalSiblingEnd=function(e){return e[a]||null},t.getLogicalChild=function(e,t){return s(e)[t]},t.isSvgElement=function(e){return"http://www.w3.org/2000/svg"===c(e).namespaceURI},t.getLogicalChildrenArray=s,t.permuteLogicalChildren=function(e,t){var n=s(e);t.forEach(function(e){e.moveRangeStart=n[e.fromSiblingIndex],e.moveRangeEnd=function e(t){if(t instanceof Element)return t;var n=f(t);if(n)return n.previousSibling;var r=u(t);return r instanceof Element?r.lastChild:e(r)}(e.moveRangeStart)}),t.forEach(function(t){var r=t.moveToBeforeMarker=document.createComment("marker"),o=n[t.toSiblingIndex+1];o?o.parentNode.insertBefore(r,o):d(r,e)}),t.forEach(function(e){for(var t=e.moveToBeforeMarker,n=t.parentNode,r=e.moveRangeStart,o=e.moveRangeEnd,a=r;a;){var i=a.nextSibling;if(n.insertBefore(a,t),a===o)break;a=i}n.removeChild(t)}),t.forEach(function(e){n[e.toSiblingIndex]=e.moveRangeStart})},t.getClosestDomElement=c},,,,function(e,t,n){"use strict";var r;!function(e){window.DotNet=e;var t=[],n={},r={},o=1,a=null;function i(e){t.push(e)}function l(e,t,n,r){var o=s();if(o.invokeDotNetFromJS){var a=JSON.stringify(r,h),i=o.invokeDotNetFromJS(e,t,n,a);return i?f(i):null}throw new Error("The current dispatcher does not support synchronous calls from JS to .NET. Use invokeMethodAsync instead.")}function u(e,t,r,a){if(e&&r)throw new Error("For instance method calls, assemblyName should be null. Received '"+e+"'.");var i=o++,l=new Promise(function(e,t){n[i]={resolve:e,reject:t}});try{var u=JSON.stringify(a,h);s().beginInvokeDotNetFromJS(i,e,t,r,u)}catch(e){c(i,!1,e)}return l}function s(){if(null!==a)return a;throw new Error("No .NET call dispatcher has been set.")}function c(e,t,r){if(!n.hasOwnProperty(e))throw new Error("There is no pending async call with ID "+e+".");var o=n[e];delete n[e],t?o.resolve(r):o.reject(r)}function f(e){return e?JSON.parse(e,function(e,n){return t.reduce(function(t,n){return n(e,t)},n)}):null}function d(e){return e instanceof Error?e.message+"\n"+e.stack:e?e.toString():"null"}function p(e){if(r.hasOwnProperty(e))return r[e];var t,n=window,o="window";if(e.split(".").forEach(function(e){if(!(e in n))throw new Error("Could not find '"+e+"' in '"+o+"'.");t=n,n=n[e],o+="."+e}),n instanceof Function)return n=n.bind(t),r[e]=n,n;throw new Error("The value '"+o+"' is not a function.")}e.attachDispatcher=function(e){a=e},e.attachReviver=i,e.invokeMethod=function(e,t){for(var n=[],r=2;r0&&o[o.length-1])&&(6===a[0]||2===a[0])){i=0;continue}if(3===a[0]&&(!o||a[1]>o[0]&&a[1]0&&o[o.length-1])&&(6===a[0]||2===a[0])){i=0;continue}if(3===a[0]&&(!o||a[1]>o[0]&&a[1]0&&o[o.length-1])&&(6===a[0]||2===a[0])){i=0;continue}if(3===a[0]&&(!o||a[1]>o[0]&&a[1]0&&o[o.length-1])&&(6===a[0]||2===a[0])){i=0;continue}if(3===a[0]&&(!o||a[1]>o[0]&&a[1]-1?a.substring(0,l):"",s=l>-1?a.substring(l+1):a,c=t.monoPlatform.findMethod(e,u,s,i);t.monoPlatform.callMethod(c,null,r)},callMethod:function(e,n,r){if(r.length>4)throw new Error("Currently, MonoPlatform supports passing a maximum of 4 arguments from JS to .NET. You tried to pass "+r.length+".");var o=Module.stackSave();try{for(var a=Module.stackAlloc(r.length),l=Module.stackAlloc(4),u=0;u>2,r=Module.HEAPU32[n+1];if(r>y)throw new Error("Cannot read uint64 with high order part "+r+", because the result would exceed Number.MAX_SAFE_INTEGER.");return r*v+Module.HEAPU32[n]},readFloatField:function(e,t){return Module.getValue(e+(t||0),"float")},readObjectField:function(e,t){return Module.getValue(e+(t||0),"i32")},readStringField:function(e,n){var r=Module.getValue(e+(n||0),"i32");return 0===r?null:t.monoPlatform.toJavaScriptString(r)},readStructField:function(e,t){return e+(t||0)}};var w=document.createElement("a");function E(e){return e+12}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=n(33),o=window.chrome&&navigator.userAgent.indexOf("Edge")<0,a=!1;function i(){return a&&o}t.hasDebuggingEnabled=i,t.attachDebuggerHotkey=function(e){a=e.some(function(e){return/\.pdb$/.test(r.getFileNameFromUrl(e))});var t=navigator.platform.match(/^Mac/i)?"Cmd":"Alt";i()&&console.info("Debugging hotkey: Shift+"+t+"+D (when application has focus)"),document.addEventListener("keydown",function(e){var t;e.shiftKey&&(e.metaKey||e.altKey)&&"KeyD"===e.code&&(a?o?((t=document.createElement("a")).href="_framework/debug?url="+encodeURIComponent(location.href),t.target="_blank",t.rel="noopener noreferrer",t.click()):console.error("Currently, only Chrome is supported for debugging."):console.error("Cannot start debugging, because the application was not compiled with debugging enabled."))})}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=n(9),o=function(){function e(e){this.batchAddress=e,this.arrayRangeReader=a,this.arrayBuilderSegmentReader=i,this.diffReader=l,this.editReader=u,this.frameReader=s}return e.prototype.updatedComponents=function(){return r.platform.readStructField(this.batchAddress,0)},e.prototype.referenceFrames=function(){return r.platform.readStructField(this.batchAddress,a.structLength)},e.prototype.disposedComponentIds=function(){return r.platform.readStructField(this.batchAddress,2*a.structLength)},e.prototype.disposedEventHandlerIds=function(){return r.platform.readStructField(this.batchAddress,3*a.structLength)},e.prototype.updatedComponentsEntry=function(e,t){return c(e,t,l.structLength)},e.prototype.referenceFramesEntry=function(e,t){return c(e,t,s.structLength)},e.prototype.disposedComponentIdsEntry=function(e,t){var n=c(e,t,4);return r.platform.readInt32Field(n)},e.prototype.disposedEventHandlerIdsEntry=function(e,t){var n=c(e,t,8);return r.platform.readUint64Field(n)},e}();t.SharedMemoryRenderBatch=o;var a={structLength:8,values:function(e){return r.platform.readObjectField(e,0)},count:function(e){return r.platform.readInt32Field(e,4)}},i={structLength:12,values:function(e){var t=r.platform.readObjectField(e,0),n=r.platform.getObjectFieldsBaseAddress(t);return r.platform.readObjectField(n,0)},offset:function(e){return r.platform.readInt32Field(e,4)},count:function(e){return r.platform.readInt32Field(e,8)}},l={structLength:4+i.structLength,componentId:function(e){return r.platform.readInt32Field(e,0)},edits:function(e){return r.platform.readStructField(e,4)},editsEntry:function(e,t){return c(e,t,u.structLength)}},u={structLength:20,editType:function(e){return r.platform.readInt32Field(e,0)},siblingIndex:function(e){return r.platform.readInt32Field(e,4)},newTreeIndex:function(e){return r.platform.readInt32Field(e,8)},moveToSiblingIndex:function(e){return r.platform.readInt32Field(e,8)},removedAttributeName:function(e){return r.platform.readStringField(e,16)}},s={structLength:36,frameType:function(e){return r.platform.readInt16Field(e,4)},subtreeLength:function(e){return r.platform.readInt32Field(e,8)},elementReferenceCaptureId:function(e){return r.platform.readStringField(e,16)},componentId:function(e){return r.platform.readInt32Field(e,12)},elementName:function(e){return r.platform.readStringField(e,16)},textContent:function(e){return r.platform.readStringField(e,16)},markupContent:function(e){return r.platform.readStringField(e,16)},attributeName:function(e){return r.platform.readStringField(e,16)},attributeValue:function(e){return r.platform.readStringField(e,24)},attributeEventHandlerId:function(e){return r.platform.readUint64Field(e,8)}};function c(e,t,n){return r.platform.getArrayEntryPtr(e,t,n)}}]); \ No newline at end of file +!function(e){var t={};function n(r){if(t[r])return t[r].exports;var o=t[r]={i:r,l:!1,exports:{}};return e[r].call(o.exports,o,o.exports,n),o.l=!0,o.exports}n.m=e,n.c=t,n.d=function(e,t,r){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(n.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var o in e)n.d(r,o,function(t){return e[t]}.bind(null,o));return r},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="",n(n.s=46)}([,,,,,function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),n(25),n(9);var r=n(26),o=n(14),a={},i=!1;function l(e,t,n){var o=a[e];o||(o=a[e]=new r.BrowserRenderer(e)),o.attachRootComponentToLogicalElement(n,t)}t.attachRootComponentToLogicalElement=l,t.attachRootComponentToElement=function(e,t,n){var r=document.querySelector(e);if(!r)throw new Error("Could not find any element matching selector '"+e+"'.");l(n||0,o.toLogicalElement(r,!0),t)},t.renderBatch=function(e,t){var n=a[e];if(!n)throw new Error("There is no browser renderer with ID "+e+".");for(var r=t.arrayRangeReader,o=t.updatedComponents(),l=r.values(o),u=r.count(o),s=t.referenceFrames(),c=r.values(s),f=t.diffReader,d=0;d0&&o[o.length-1])&&(6===a[0]||2===a[0])){i=0;continue}if(3===a[0]&&(!o||a[1]>o[0]&&a[1]0&&!t)throw new Error("New logical elements must start empty, or allowExistingContents must be true");return e[r]=[],e}function l(e,t,n){var a=e;if(e instanceof Comment&&(s(a)&&s(a).length>0))throw new Error("Not implemented: inserting non-empty logical container");if(u(a))throw new Error("Not implemented: moving existing logical children");var i=s(t);if(n0;)e(r,0);var a=r;a.parentNode.removeChild(a)},t.getLogicalParent=u,t.getLogicalSiblingEnd=function(e){return e[a]||null},t.getLogicalChild=function(e,t){return s(e)[t]},t.isSvgElement=function(e){return"http://www.w3.org/2000/svg"===c(e).namespaceURI},t.getLogicalChildrenArray=s,t.permuteLogicalChildren=function(e,t){var n=s(e);t.forEach(function(e){e.moveRangeStart=n[e.fromSiblingIndex],e.moveRangeEnd=function e(t){if(t instanceof Element)return t;var n=f(t);if(n)return n.previousSibling;var r=u(t);return r instanceof Element?r.lastChild:e(r)}(e.moveRangeStart)}),t.forEach(function(t){var r=t.moveToBeforeMarker=document.createComment("marker"),o=n[t.toSiblingIndex+1];o?o.parentNode.insertBefore(r,o):d(r,e)}),t.forEach(function(e){for(var t=e.moveToBeforeMarker,n=t.parentNode,r=e.moveRangeStart,o=e.moveRangeEnd,a=r;a;){var i=a.nextSibling;if(n.insertBefore(a,t),a===o)break;a=i}n.removeChild(t)}),t.forEach(function(e){n[e.toSiblingIndex]=e.moveRangeStart})},t.getClosestDomElement=c},,,,function(e,t,n){"use strict";var r;!function(e){window.DotNet=e;var t=[],n={},r={},o=1,a=null;function i(e){t.push(e)}function l(e,t,n,r){var o=s();if(o.invokeDotNetFromJS){var a=JSON.stringify(r,h),i=o.invokeDotNetFromJS(e,t,n,a);return i?f(i):null}throw new Error("The current dispatcher does not support synchronous calls from JS to .NET. Use invokeMethodAsync instead.")}function u(e,t,r,a){if(e&&r)throw new Error("For instance method calls, assemblyName should be null. Received '"+e+"'.");var i=o++,l=new Promise(function(e,t){n[i]={resolve:e,reject:t}});try{var u=JSON.stringify(a,h);s().beginInvokeDotNetFromJS(i,e,t,r,u)}catch(e){c(i,!1,e)}return l}function s(){if(null!==a)return a;throw new Error("No .NET call dispatcher has been set.")}function c(e,t,r){if(!n.hasOwnProperty(e))throw new Error("There is no pending async call with ID "+e+".");var o=n[e];delete n[e],t?o.resolve(r):o.reject(r)}function f(e){return e?JSON.parse(e,function(e,n){return t.reduce(function(t,n){return n(e,t)},n)}):null}function d(e){return e instanceof Error?e.message+"\n"+e.stack:e?e.toString():"null"}function p(e){if(r.hasOwnProperty(e))return r[e];var t,n=window,o="window";if(e.split(".").forEach(function(e){if(!(e in n))throw new Error("Could not find '"+e+"' in '"+o+"'.");t=n,n=n[e],o+="."+e}),n instanceof Function)return n=n.bind(t),r[e]=n,n;throw new Error("The value '"+o+"' is not a function.")}e.attachDispatcher=function(e){a=e},e.attachReviver=i,e.invokeMethod=function(e,t){for(var n=[],r=2;r0&&o[o.length-1])&&(6===a[0]||2===a[0])){i=0;continue}if(3===a[0]&&(!o||a[1]>o[0]&&a[1]0&&o[o.length-1])&&(6===a[0]||2===a[0])){i=0;continue}if(3===a[0]&&(!o||a[1]>o[0]&&a[1]0&&o[o.length-1])&&(6===a[0]||2===a[0])){i=0;continue}if(3===a[0]&&(!o||a[1]>o[0]&&a[1]0&&o[o.length-1])&&(6===a[0]||2===a[0])){i=0;continue}if(3===a[0]&&(!o||a[1]>o[0]&&a[1]-1?a.substring(0,l):"",s=l>-1?a.substring(l+1):a,c=t.monoPlatform.findMethod(e,u,s,i);t.monoPlatform.callMethod(c,null,r)},callMethod:function(e,n,r){if(r.length>4)throw new Error("Currently, MonoPlatform supports passing a maximum of 4 arguments from JS to .NET. You tried to pass "+r.length+".");var o=Module.stackSave();try{for(var a=Module.stackAlloc(r.length),l=Module.stackAlloc(4),u=0;u>2,r=Module.HEAPU32[n+1];if(r>y)throw new Error("Cannot read uint64 with high order part "+r+", because the result would exceed Number.MAX_SAFE_INTEGER.");return r*v+Module.HEAPU32[n]},readFloatField:function(e,t){return Module.getValue(e+(t||0),"float")},readObjectField:function(e,t){return Module.getValue(e+(t||0),"i32")},readStringField:function(e,n){var r=Module.getValue(e+(n||0),"i32");return 0===r?null:t.monoPlatform.toJavaScriptString(r)},readStructField:function(e,t){return e+(t||0)}};var w=document.createElement("a");function E(e){return e+12}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=n(33),o=window.chrome&&navigator.userAgent.indexOf("Edge")<0,a=!1;function i(){return a&&o}t.hasDebuggingEnabled=i,t.attachDebuggerHotkey=function(e){a=e.some(function(e){return/\.pdb$/.test(r.getFileNameFromUrl(e))});var t=navigator.platform.match(/^Mac/i)?"Cmd":"Alt";i()&&console.info("Debugging hotkey: Shift+"+t+"+D (when application has focus)"),document.addEventListener("keydown",function(e){var t;e.shiftKey&&(e.metaKey||e.altKey)&&"KeyD"===e.code&&(a?o?((t=document.createElement("a")).href="_framework/debug?url="+encodeURIComponent(location.href),t.target="_blank",t.rel="noopener noreferrer",t.click()):console.error("Currently, only Edge(Chromium) or Chrome is supported for debugging."):console.error("Cannot start debugging, because the application was not compiled with debugging enabled."))})}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=n(9),o=function(){function e(e){this.batchAddress=e,this.arrayRangeReader=a,this.arrayBuilderSegmentReader=i,this.diffReader=l,this.editReader=u,this.frameReader=s}return e.prototype.updatedComponents=function(){return r.platform.readStructField(this.batchAddress,0)},e.prototype.referenceFrames=function(){return r.platform.readStructField(this.batchAddress,a.structLength)},e.prototype.disposedComponentIds=function(){return r.platform.readStructField(this.batchAddress,2*a.structLength)},e.prototype.disposedEventHandlerIds=function(){return r.platform.readStructField(this.batchAddress,3*a.structLength)},e.prototype.updatedComponentsEntry=function(e,t){return c(e,t,l.structLength)},e.prototype.referenceFramesEntry=function(e,t){return c(e,t,s.structLength)},e.prototype.disposedComponentIdsEntry=function(e,t){var n=c(e,t,4);return r.platform.readInt32Field(n)},e.prototype.disposedEventHandlerIdsEntry=function(e,t){var n=c(e,t,8);return r.platform.readUint64Field(n)},e}();t.SharedMemoryRenderBatch=o;var a={structLength:8,values:function(e){return r.platform.readObjectField(e,0)},count:function(e){return r.platform.readInt32Field(e,4)}},i={structLength:12,values:function(e){var t=r.platform.readObjectField(e,0),n=r.platform.getObjectFieldsBaseAddress(t);return r.platform.readObjectField(n,0)},offset:function(e){return r.platform.readInt32Field(e,4)},count:function(e){return r.platform.readInt32Field(e,8)}},l={structLength:4+i.structLength,componentId:function(e){return r.platform.readInt32Field(e,0)},edits:function(e){return r.platform.readStructField(e,4)},editsEntry:function(e,t){return c(e,t,u.structLength)}},u={structLength:20,editType:function(e){return r.platform.readInt32Field(e,0)},siblingIndex:function(e){return r.platform.readInt32Field(e,4)},newTreeIndex:function(e){return r.platform.readInt32Field(e,8)},moveToSiblingIndex:function(e){return r.platform.readInt32Field(e,8)},removedAttributeName:function(e){return r.platform.readStringField(e,16)}},s={structLength:36,frameType:function(e){return r.platform.readInt16Field(e,4)},subtreeLength:function(e){return r.platform.readInt32Field(e,8)},elementReferenceCaptureId:function(e){return r.platform.readStringField(e,16)},componentId:function(e){return r.platform.readInt32Field(e,12)},elementName:function(e){return r.platform.readStringField(e,16)},textContent:function(e){return r.platform.readStringField(e,16)},markupContent:function(e){return r.platform.readStringField(e,16)},attributeName:function(e){return r.platform.readStringField(e,16)},attributeValue:function(e){return r.platform.readStringField(e,24)},attributeEventHandlerId:function(e){return r.platform.readUint64Field(e,8)}};function c(e,t,n){return r.platform.getArrayEntryPtr(e,t,n)}}]); \ No newline at end of file diff --git a/src/Components/Web.JS/src/Platform/Mono/MonoDebugger.ts b/src/Components/Web.JS/src/Platform/Mono/MonoDebugger.ts index a0838ac125..e16ec7e195 100644 --- a/src/Components/Web.JS/src/Platform/Mono/MonoDebugger.ts +++ b/src/Components/Web.JS/src/Platform/Mono/MonoDebugger.ts @@ -26,7 +26,7 @@ export function attachDebuggerHotkey(loadAssemblyUrls: string[]) { if (!hasReferencedPdbs) { console.error('Cannot start debugging, because the application was not compiled with debugging enabled.'); } else if (!currentBrowserIsChrome) { - console.error('Currently, only Chrome is supported for debugging.'); + console.error('Currently, only Edge(Chromium) or Chrome is supported for debugging.'); } else { launchDebugger(); } From 3c9b8f7aa8aacdc52e3386557ab0081cec95485d Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Sat, 19 Oct 2019 04:02:33 +0000 Subject: [PATCH 17/32] [release/3.1] Update dependencies from 2 repositories (#15135) * Update dependencies from https://github.com/aspnet/EntityFrameworkCore build 20191017.12 - Microsoft.EntityFrameworkCore.Tools - 3.1.0-preview2.19517.12 - Microsoft.EntityFrameworkCore.SqlServer - 3.1.0-preview2.19517.12 - dotnet-ef - 3.1.0-preview2.19517.12 - Microsoft.EntityFrameworkCore - 3.1.0-preview2.19517.12 - Microsoft.EntityFrameworkCore.InMemory - 3.1.0-preview2.19517.12 - Microsoft.EntityFrameworkCore.Relational - 3.1.0-preview2.19517.12 - Microsoft.EntityFrameworkCore.Sqlite - 3.1.0-preview2.19517.12 Dependency coherency updates - Microsoft.AspNetCore.Analyzer.Testing - 3.1.0-preview2.19501.2 (parent: Microsoft.EntityFrameworkCore) - Microsoft.AspNetCore.BenchmarkRunner.Sources - 3.1.0-preview2.19501.2 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.ActivatorUtilities.Sources - 3.1.0-preview2.19501.2 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.Caching.Abstractions - 3.1.0-preview2.19501.2 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.Caching.Memory - 3.1.0-preview2.19501.2 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.Caching.SqlServer - 3.1.0-preview2.19501.2 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.Caching.StackExchangeRedis - 3.1.0-preview2.19501.2 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.CommandLineUtils.Sources - 3.1.0-preview2.19501.2 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.Configuration.Abstractions - 3.1.0-preview2.19501.2 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.Configuration.AzureKeyVault - 3.1.0-preview2.19501.2 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.Configuration.Binder - 3.1.0-preview2.19501.2 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.Configuration.CommandLine - 3.1.0-preview2.19501.2 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.Configuration.EnvironmentVariables - 3.1.0-preview2.19501.2 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.Configuration.FileExtensions - 3.1.0-preview2.19501.2 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.Configuration.Ini - 3.1.0-preview2.19501.2 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.Configuration.Json - 3.1.0-preview2.19501.2 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.Configuration.KeyPerFile - 3.1.0-preview2.19501.2 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.Configuration.UserSecrets - 3.1.0-preview2.19501.2 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.Configuration.Xml - 3.1.0-preview2.19501.2 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.Configuration - 3.1.0-preview2.19501.2 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.DependencyInjection.Abstractions - 3.1.0-preview2.19501.2 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.DependencyInjection - 3.1.0-preview2.19501.2 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.DiagnosticAdapter - 3.1.0-preview2.19501.2 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions - 3.1.0-preview2.19501.2 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.Diagnostics.HealthChecks - 3.1.0-preview2.19501.2 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.FileProviders.Abstractions - 3.1.0-preview2.19501.2 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.FileProviders.Composite - 3.1.0-preview2.19501.2 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.FileProviders.Embedded - 3.1.0-preview2.19501.2 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.FileProviders.Physical - 3.1.0-preview2.19501.2 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.FileSystemGlobbing - 3.1.0-preview2.19501.2 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.HashCodeCombiner.Sources - 3.1.0-preview2.19501.2 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.Hosting.Abstractions - 3.1.0-preview2.19501.2 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.Hosting - 3.1.0-preview2.19501.2 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.HostFactoryResolver.Sources - 3.1.0-preview2.19501.2 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.Http - 3.1.0-preview2.19501.2 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.Localization.Abstractions - 3.1.0-preview2.19501.2 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.Localization - 3.1.0-preview2.19501.2 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.Logging.Abstractions - 3.1.0-preview2.19501.2 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.Logging.AzureAppServices - 3.1.0-preview2.19501.2 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.Logging.Configuration - 3.1.0-preview2.19501.2 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.Logging.Console - 3.1.0-preview2.19501.2 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.Logging.Debug - 3.1.0-preview2.19501.2 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.Logging.EventSource - 3.1.0-preview2.19501.2 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.Logging.EventLog - 3.1.0-preview2.19501.2 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.Logging.TraceSource - 3.1.0-preview2.19501.2 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.Logging.Testing - 3.1.0-preview2.19501.2 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.ObjectPool - 3.1.0-preview2.19501.2 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.Options.ConfigurationExtensions - 3.1.0-preview2.19501.2 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.Options.DataAnnotations - 3.1.0-preview2.19501.2 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.Options - 3.1.0-preview2.19501.2 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.ParameterDefaultValue.Sources - 3.1.0-preview2.19501.2 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.Primitives - 3.1.0-preview2.19501.2 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.TypeNameHelper.Sources - 3.1.0-preview2.19501.2 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.ValueStopwatch.Sources - 3.1.0-preview2.19501.2 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.WebEncoders - 3.1.0-preview2.19501.2 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Internal.Extensions.Refs - 3.1.0-preview2.19501.2 (parent: Microsoft.EntityFrameworkCore) - Microsoft.JSInterop - 3.1.0-preview2.19501.2 (parent: Microsoft.EntityFrameworkCore) - Mono.WebAssembly.Interop - 3.1.0-preview2.19501.2 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Bcl.AsyncInterfaces - 1.1.0-preview1.19470.8 (parent: Microsoft.NETCore.App.Runtime.win-x64) - Microsoft.NETCore.App.Runtime.win-x64 - 3.1.0-preview1.19480.27 (parent: Microsoft.Extensions.Logging) - Microsoft.Extensions.Logging - 3.1.0-preview2.19501.2 (parent: Microsoft.EntityFrameworkCore) - Microsoft.CSharp - 4.7.0-preview1.19470.8 (parent: Microsoft.NETCore.App.Runtime.win-x64) - Microsoft.Win32.Registry - 4.7.0-preview1.19470.8 (parent: Microsoft.NETCore.App.Runtime.win-x64) - Microsoft.Win32.SystemEvents - 4.7.0-preview1.19470.8 (parent: Microsoft.NETCore.App.Runtime.win-x64) - System.ComponentModel.Annotations - 4.7.0-preview1.19470.8 (parent: Microsoft.NETCore.App.Runtime.win-x64) - System.Diagnostics.EventLog - 4.7.0-preview1.19470.8 (parent: Microsoft.NETCore.App.Runtime.win-x64) - System.Drawing.Common - 4.7.0-preview1.19470.8 (parent: Microsoft.NETCore.App.Runtime.win-x64) - System.IO.Pipelines - 4.7.0-preview1.19470.8 (parent: Microsoft.NETCore.App.Runtime.win-x64) - System.Net.Http.WinHttpHandler - 4.7.0-preview1.19470.8 (parent: Microsoft.NETCore.App.Runtime.win-x64) - System.Net.WebSockets.WebSocketProtocol - 4.7.0-preview1.19470.8 (parent: Microsoft.NETCore.App.Runtime.win-x64) - System.Reflection.Metadata - 1.8.0-preview1.19470.8 (parent: Microsoft.NETCore.App.Runtime.win-x64) - System.Runtime.CompilerServices.Unsafe - 4.7.0-preview1.19470.8 (parent: Microsoft.NETCore.App.Runtime.win-x64) - System.Security.Cryptography.Cng - 4.7.0-preview1.19470.8 (parent: Microsoft.NETCore.App.Runtime.win-x64) - System.Security.Cryptography.Pkcs - 4.7.0-preview1.19470.8 (parent: Microsoft.NETCore.App.Runtime.win-x64) - System.Security.Cryptography.Xml - 4.7.0-preview1.19470.8 (parent: Microsoft.NETCore.App.Runtime.win-x64) - System.Security.Permissions - 4.7.0-preview1.19470.8 (parent: Microsoft.NETCore.App.Runtime.win-x64) - System.Security.Principal.Windows - 4.7.0-preview1.19470.8 (parent: Microsoft.NETCore.App.Runtime.win-x64) - System.ServiceProcess.ServiceController - 4.7.0-preview1.19470.8 (parent: Microsoft.NETCore.App.Runtime.win-x64) - System.Text.Encodings.Web - 4.7.0-preview1.19470.8 (parent: Microsoft.NETCore.App.Runtime.win-x64) - System.Text.Json - 4.7.0-preview1.19470.8 (parent: Microsoft.NETCore.App.Runtime.win-x64) - System.Threading.Channels - 4.7.0-preview1.19470.8 (parent: Microsoft.NETCore.App.Runtime.win-x64) - System.Windows.Extensions - 4.7.0-preview1.19470.8 (parent: Microsoft.NETCore.App.Runtime.win-x64) - Microsoft.Extensions.DependencyModel - 3.1.0-preview1.19480.27 (parent: Microsoft.Extensions.Logging) - Microsoft.NETCore.App.Ref - 3.1.0-preview1.19480.27 (parent: Microsoft.Extensions.Logging) - NETStandard.Library.Ref - 2.1.0-preview1.19480.27 (parent: Microsoft.Extensions.Logging) - Microsoft.NETCore.Platforms - 3.1.0-preview1.19480.14 (parent: Microsoft.NETCore.App.Runtime.win-x64) - Internal.AspNetCore.Analyzers - 3.1.0-preview2.19501.2 (parent: Microsoft.EntityFrameworkCore) - Microsoft.AspNetCore.Testing - 3.1.0-preview2.19501.2 (parent: Microsoft.EntityFrameworkCore) * Update dependencies from https://github.com/aspnet/AspNetCore-Tooling build 20191017.11 - Microsoft.AspNetCore.Mvc.Razor.Extensions - 3.1.0-preview2.19517.11 - Microsoft.AspNetCore.Razor.Language - 3.1.0-preview2.19517.11 - Microsoft.CodeAnalysis.Razor - 3.1.0-preview2.19517.11 - Microsoft.NET.Sdk.Razor - 3.1.0-preview2.19517.11 * Update dependencies from https://github.com/aspnet/EntityFrameworkCore build 20191017.13 - Microsoft.EntityFrameworkCore.Tools - 3.1.0-preview2.19517.13 - Microsoft.EntityFrameworkCore.SqlServer - 3.1.0-preview2.19517.13 - dotnet-ef - 3.1.0-preview2.19517.13 - Microsoft.EntityFrameworkCore - 3.1.0-preview2.19517.13 - Microsoft.EntityFrameworkCore.InMemory - 3.1.0-preview2.19517.13 - Microsoft.EntityFrameworkCore.Relational - 3.1.0-preview2.19517.13 - Microsoft.EntityFrameworkCore.Sqlite - 3.1.0-preview2.19517.13 Dependency coherency updates - Microsoft.AspNetCore.Analyzer.Testing - 3.1.0-preview2.19517.6 (parent: Microsoft.EntityFrameworkCore) - Microsoft.AspNetCore.BenchmarkRunner.Sources - 3.1.0-preview2.19517.6 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.ActivatorUtilities.Sources - 3.1.0-preview2.19517.6 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.Caching.Abstractions - 3.1.0-preview2.19517.6 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.Caching.Memory - 3.1.0-preview2.19517.6 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.Caching.SqlServer - 3.1.0-preview2.19517.6 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.Caching.StackExchangeRedis - 3.1.0-preview2.19517.6 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.CommandLineUtils.Sources - 3.1.0-preview2.19517.6 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.Configuration.Abstractions - 3.1.0-preview2.19517.6 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.Configuration.AzureKeyVault - 3.1.0-preview2.19517.6 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.Configuration.Binder - 3.1.0-preview2.19517.6 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.Configuration.CommandLine - 3.1.0-preview2.19517.6 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.Configuration.EnvironmentVariables - 3.1.0-preview2.19517.6 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.Configuration.FileExtensions - 3.1.0-preview2.19517.6 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.Configuration.Ini - 3.1.0-preview2.19517.6 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.Configuration.Json - 3.1.0-preview2.19517.6 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.Configuration.KeyPerFile - 3.1.0-preview2.19517.6 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.Configuration.UserSecrets - 3.1.0-preview2.19517.6 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.Configuration.Xml - 3.1.0-preview2.19517.6 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.Configuration - 3.1.0-preview2.19517.6 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.DependencyInjection.Abstractions - 3.1.0-preview2.19517.6 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.DependencyInjection - 3.1.0-preview2.19517.6 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.DiagnosticAdapter - 3.1.0-preview2.19517.6 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions - 3.1.0-preview2.19517.6 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.Diagnostics.HealthChecks - 3.1.0-preview2.19517.6 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.FileProviders.Abstractions - 3.1.0-preview2.19517.6 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.FileProviders.Composite - 3.1.0-preview2.19517.6 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.FileProviders.Embedded - 3.1.0-preview2.19517.6 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.FileProviders.Physical - 3.1.0-preview2.19517.6 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.FileSystemGlobbing - 3.1.0-preview2.19517.6 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.HashCodeCombiner.Sources - 3.1.0-preview2.19517.6 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.Hosting.Abstractions - 3.1.0-preview2.19517.6 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.Hosting - 3.1.0-preview2.19517.6 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.HostFactoryResolver.Sources - 3.1.0-preview2.19517.6 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.Http - 3.1.0-preview2.19517.6 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.Localization.Abstractions - 3.1.0-preview2.19517.6 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.Localization - 3.1.0-preview2.19517.6 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.Logging.Abstractions - 3.1.0-preview2.19517.6 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.Logging.AzureAppServices - 3.1.0-preview2.19517.6 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.Logging.Configuration - 3.1.0-preview2.19517.6 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.Logging.Console - 3.1.0-preview2.19517.6 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.Logging.Debug - 3.1.0-preview2.19517.6 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.Logging.EventSource - 3.1.0-preview2.19517.6 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.Logging.EventLog - 3.1.0-preview2.19517.6 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.Logging.TraceSource - 3.1.0-preview2.19517.6 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.Logging.Testing - 3.1.0-preview2.19517.6 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.ObjectPool - 3.1.0-preview2.19517.6 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.Options.ConfigurationExtensions - 3.1.0-preview2.19517.6 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.Options.DataAnnotations - 3.1.0-preview2.19517.6 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.Options - 3.1.0-preview2.19517.6 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.ParameterDefaultValue.Sources - 3.1.0-preview2.19517.6 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.Primitives - 3.1.0-preview2.19517.6 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.TypeNameHelper.Sources - 3.1.0-preview2.19517.6 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.ValueStopwatch.Sources - 3.1.0-preview2.19517.6 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.WebEncoders - 3.1.0-preview2.19517.6 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Internal.Extensions.Refs - 3.1.0-preview2.19517.6 (parent: Microsoft.EntityFrameworkCore) - Microsoft.JSInterop - 3.1.0-preview2.19517.6 (parent: Microsoft.EntityFrameworkCore) - Mono.WebAssembly.Interop - 3.1.0-preview2.19517.6 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Bcl.AsyncInterfaces - 1.1.0-preview2.19516.15 (parent: Microsoft.NETCore.App.Runtime.win-x64) - Microsoft.NETCore.App.Runtime.win-x64 - 3.1.0-preview2.19517.5 (parent: Microsoft.Extensions.Logging) - Microsoft.Extensions.Logging - 3.1.0-preview2.19517.6 (parent: Microsoft.EntityFrameworkCore) - Microsoft.CSharp - 4.7.0-preview2.19516.15 (parent: Microsoft.NETCore.App.Runtime.win-x64) - Microsoft.Win32.Registry - 4.7.0-preview2.19516.15 (parent: Microsoft.NETCore.App.Runtime.win-x64) - Microsoft.Win32.SystemEvents - 4.7.0-preview2.19516.15 (parent: Microsoft.NETCore.App.Runtime.win-x64) - System.ComponentModel.Annotations - 4.7.0-preview2.19516.15 (parent: Microsoft.NETCore.App.Runtime.win-x64) - System.Diagnostics.EventLog - 4.7.0-preview2.19516.15 (parent: Microsoft.NETCore.App.Runtime.win-x64) - System.Drawing.Common - 4.7.0-preview2.19516.15 (parent: Microsoft.NETCore.App.Runtime.win-x64) - System.IO.Pipelines - 4.7.0-preview2.19516.15 (parent: Microsoft.NETCore.App.Runtime.win-x64) - System.Net.Http.WinHttpHandler - 4.7.0-preview2.19516.15 (parent: Microsoft.NETCore.App.Runtime.win-x64) - System.Net.WebSockets.WebSocketProtocol - 4.7.0-preview2.19516.15 (parent: Microsoft.NETCore.App.Runtime.win-x64) - System.Reflection.Metadata - 1.8.0-preview2.19516.15 (parent: Microsoft.NETCore.App.Runtime.win-x64) - System.Runtime.CompilerServices.Unsafe - 4.7.0-preview2.19516.15 (parent: Microsoft.NETCore.App.Runtime.win-x64) - System.Security.Cryptography.Cng - 4.7.0-preview2.19516.15 (parent: Microsoft.NETCore.App.Runtime.win-x64) - System.Security.Cryptography.Pkcs - 4.7.0-preview2.19516.15 (parent: Microsoft.NETCore.App.Runtime.win-x64) - System.Security.Cryptography.Xml - 4.7.0-preview2.19516.15 (parent: Microsoft.NETCore.App.Runtime.win-x64) - System.Security.Permissions - 4.7.0-preview2.19516.15 (parent: Microsoft.NETCore.App.Runtime.win-x64) - System.Security.Principal.Windows - 4.7.0-preview2.19516.15 (parent: Microsoft.NETCore.App.Runtime.win-x64) - System.ServiceProcess.ServiceController - 4.7.0-preview2.19516.15 (parent: Microsoft.NETCore.App.Runtime.win-x64) - System.Text.Encodings.Web - 4.7.0-preview2.19516.15 (parent: Microsoft.NETCore.App.Runtime.win-x64) - System.Text.Json - 4.7.0-preview2.19516.15 (parent: Microsoft.NETCore.App.Runtime.win-x64) - System.Threading.Channels - 4.7.0-preview2.19516.15 (parent: Microsoft.NETCore.App.Runtime.win-x64) - System.Windows.Extensions - 4.7.0-preview2.19516.15 (parent: Microsoft.NETCore.App.Runtime.win-x64) - Microsoft.Extensions.DependencyModel - 3.1.0-preview2.19517.5 (parent: Microsoft.Extensions.Logging) - Microsoft.NETCore.App.Ref - 3.1.0-preview2.19517.5 (parent: Microsoft.Extensions.Logging) - NETStandard.Library.Ref - 2.1.0-preview2.19517.5 (parent: Microsoft.Extensions.Logging) - Microsoft.NETCore.Platforms - 3.1.0-preview2.19516.15 (parent: Microsoft.NETCore.App.Runtime.win-x64) - Internal.AspNetCore.Analyzers - 3.1.0-preview2.19517.6 (parent: Microsoft.EntityFrameworkCore) - Microsoft.AspNetCore.Testing - 3.1.0-preview2.19517.6 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Net.Compilers.Toolset - 3.4.0-beta3-19517-02 (parent: Microsoft.Extensions.Logging) * Update dependencies from https://github.com/aspnet/EntityFrameworkCore build 20191017.15 - Microsoft.EntityFrameworkCore.Tools - 3.1.0-preview2.19517.15 - Microsoft.EntityFrameworkCore.SqlServer - 3.1.0-preview2.19517.15 - dotnet-ef - 3.1.0-preview2.19517.15 - Microsoft.EntityFrameworkCore - 3.1.0-preview2.19517.15 - Microsoft.EntityFrameworkCore.InMemory - 3.1.0-preview2.19517.15 - Microsoft.EntityFrameworkCore.Relational - 3.1.0-preview2.19517.15 - Microsoft.EntityFrameworkCore.Sqlite - 3.1.0-preview2.19517.15 Dependency coherency updates - Microsoft.AspNetCore.Analyzer.Testing - 3.1.0-preview2.19517.6 (parent: Microsoft.EntityFrameworkCore) - Microsoft.AspNetCore.BenchmarkRunner.Sources - 3.1.0-preview2.19517.6 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.ActivatorUtilities.Sources - 3.1.0-preview2.19517.6 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.Caching.Abstractions - 3.1.0-preview2.19517.6 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.Caching.Memory - 3.1.0-preview2.19517.6 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.Caching.SqlServer - 3.1.0-preview2.19517.6 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.Caching.StackExchangeRedis - 3.1.0-preview2.19517.6 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.CommandLineUtils.Sources - 3.1.0-preview2.19517.6 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.Configuration.Abstractions - 3.1.0-preview2.19517.6 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.Configuration.AzureKeyVault - 3.1.0-preview2.19517.6 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.Configuration.Binder - 3.1.0-preview2.19517.6 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.Configuration.CommandLine - 3.1.0-preview2.19517.6 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.Configuration.EnvironmentVariables - 3.1.0-preview2.19517.6 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.Configuration.FileExtensions - 3.1.0-preview2.19517.6 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.Configuration.Ini - 3.1.0-preview2.19517.6 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.Configuration.Json - 3.1.0-preview2.19517.6 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.Configuration.KeyPerFile - 3.1.0-preview2.19517.6 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.Configuration.UserSecrets - 3.1.0-preview2.19517.6 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.Configuration.Xml - 3.1.0-preview2.19517.6 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.Configuration - 3.1.0-preview2.19517.6 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.DependencyInjection.Abstractions - 3.1.0-preview2.19517.6 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.DependencyInjection - 3.1.0-preview2.19517.6 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.DiagnosticAdapter - 3.1.0-preview2.19517.6 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions - 3.1.0-preview2.19517.6 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.Diagnostics.HealthChecks - 3.1.0-preview2.19517.6 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.FileProviders.Abstractions - 3.1.0-preview2.19517.6 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.FileProviders.Composite - 3.1.0-preview2.19517.6 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.FileProviders.Embedded - 3.1.0-preview2.19517.6 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.FileProviders.Physical - 3.1.0-preview2.19517.6 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.FileSystemGlobbing - 3.1.0-preview2.19517.6 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.HashCodeCombiner.Sources - 3.1.0-preview2.19517.6 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.Hosting.Abstractions - 3.1.0-preview2.19517.6 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.Hosting - 3.1.0-preview2.19517.6 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.HostFactoryResolver.Sources - 3.1.0-preview2.19517.6 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.Http - 3.1.0-preview2.19517.6 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.Localization.Abstractions - 3.1.0-preview2.19517.6 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.Localization - 3.1.0-preview2.19517.6 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.Logging.Abstractions - 3.1.0-preview2.19517.6 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.Logging.AzureAppServices - 3.1.0-preview2.19517.6 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.Logging.Configuration - 3.1.0-preview2.19517.6 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.Logging.Console - 3.1.0-preview2.19517.6 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.Logging.Debug - 3.1.0-preview2.19517.6 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.Logging.EventSource - 3.1.0-preview2.19517.6 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.Logging.EventLog - 3.1.0-preview2.19517.6 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.Logging.TraceSource - 3.1.0-preview2.19517.6 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.Logging.Testing - 3.1.0-preview2.19517.6 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.ObjectPool - 3.1.0-preview2.19517.6 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.Options.ConfigurationExtensions - 3.1.0-preview2.19517.6 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.Options.DataAnnotations - 3.1.0-preview2.19517.6 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.Options - 3.1.0-preview2.19517.6 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.ParameterDefaultValue.Sources - 3.1.0-preview2.19517.6 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.Primitives - 3.1.0-preview2.19517.6 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.TypeNameHelper.Sources - 3.1.0-preview2.19517.6 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.ValueStopwatch.Sources - 3.1.0-preview2.19517.6 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.WebEncoders - 3.1.0-preview2.19517.6 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Internal.Extensions.Refs - 3.1.0-preview2.19517.6 (parent: Microsoft.EntityFrameworkCore) - Microsoft.JSInterop - 3.1.0-preview2.19517.6 (parent: Microsoft.EntityFrameworkCore) - Mono.WebAssembly.Interop - 3.1.0-preview2.19517.6 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Bcl.AsyncInterfaces - 1.1.0-preview2.19516.15 (parent: Microsoft.NETCore.App.Runtime.win-x64) - Microsoft.NETCore.App.Runtime.win-x64 - 3.1.0-preview2.19517.5 (parent: Microsoft.Extensions.Logging) - Microsoft.Extensions.Logging - 3.1.0-preview2.19517.6 (parent: Microsoft.EntityFrameworkCore) - Microsoft.CSharp - 4.7.0-preview2.19516.15 (parent: Microsoft.NETCore.App.Runtime.win-x64) - Microsoft.Win32.Registry - 4.7.0-preview2.19516.15 (parent: Microsoft.NETCore.App.Runtime.win-x64) - Microsoft.Win32.SystemEvents - 4.7.0-preview2.19516.15 (parent: Microsoft.NETCore.App.Runtime.win-x64) - System.ComponentModel.Annotations - 4.7.0-preview2.19516.15 (parent: Microsoft.NETCore.App.Runtime.win-x64) - System.Diagnostics.EventLog - 4.7.0-preview2.19516.15 (parent: Microsoft.NETCore.App.Runtime.win-x64) - System.Drawing.Common - 4.7.0-preview2.19516.15 (parent: Microsoft.NETCore.App.Runtime.win-x64) - System.IO.Pipelines - 4.7.0-preview2.19516.15 (parent: Microsoft.NETCore.App.Runtime.win-x64) - System.Net.Http.WinHttpHandler - 4.7.0-preview2.19516.15 (parent: Microsoft.NETCore.App.Runtime.win-x64) - System.Net.WebSockets.WebSocketProtocol - 4.7.0-preview2.19516.15 (parent: Microsoft.NETCore.App.Runtime.win-x64) - System.Reflection.Metadata - 1.8.0-preview2.19516.15 (parent: Microsoft.NETCore.App.Runtime.win-x64) - System.Runtime.CompilerServices.Unsafe - 4.7.0-preview2.19516.15 (parent: Microsoft.NETCore.App.Runtime.win-x64) - System.Security.Cryptography.Cng - 4.7.0-preview2.19516.15 (parent: Microsoft.NETCore.App.Runtime.win-x64) - System.Security.Cryptography.Pkcs - 4.7.0-preview2.19516.15 (parent: Microsoft.NETCore.App.Runtime.win-x64) - System.Security.Cryptography.Xml - 4.7.0-preview2.19516.15 (parent: Microsoft.NETCore.App.Runtime.win-x64) - System.Security.Permissions - 4.7.0-preview2.19516.15 (parent: Microsoft.NETCore.App.Runtime.win-x64) - System.Security.Principal.Windows - 4.7.0-preview2.19516.15 (parent: Microsoft.NETCore.App.Runtime.win-x64) - System.ServiceProcess.ServiceController - 4.7.0-preview2.19516.15 (parent: Microsoft.NETCore.App.Runtime.win-x64) - System.Text.Encodings.Web - 4.7.0-preview2.19516.15 (parent: Microsoft.NETCore.App.Runtime.win-x64) - System.Text.Json - 4.7.0-preview2.19516.15 (parent: Microsoft.NETCore.App.Runtime.win-x64) - System.Threading.Channels - 4.7.0-preview2.19516.15 (parent: Microsoft.NETCore.App.Runtime.win-x64) - System.Windows.Extensions - 4.7.0-preview2.19516.15 (parent: Microsoft.NETCore.App.Runtime.win-x64) - Microsoft.Extensions.DependencyModel - 3.1.0-preview2.19517.5 (parent: Microsoft.Extensions.Logging) - Microsoft.NETCore.App.Ref - 3.1.0-preview2.19517.5 (parent: Microsoft.Extensions.Logging) - NETStandard.Library.Ref - 2.1.0-preview2.19517.5 (parent: Microsoft.Extensions.Logging) - Microsoft.NETCore.Platforms - 3.1.0-preview2.19516.15 (parent: Microsoft.NETCore.App.Runtime.win-x64) - Internal.AspNetCore.Analyzers - 3.1.0-preview2.19517.6 (parent: Microsoft.EntityFrameworkCore) - Microsoft.AspNetCore.Testing - 3.1.0-preview2.19517.6 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Net.Compilers.Toolset - 3.4.0-beta3-19517-02 (parent: Microsoft.Extensions.Logging) * Update dependencies from https://github.com/aspnet/EntityFrameworkCore build 20191018.2 - Microsoft.EntityFrameworkCore.Tools - 3.1.0-preview2.19518.2 - Microsoft.EntityFrameworkCore.SqlServer - 3.1.0-preview2.19518.2 - dotnet-ef - 3.1.0-preview2.19518.2 - Microsoft.EntityFrameworkCore - 3.1.0-preview2.19518.2 - Microsoft.EntityFrameworkCore.InMemory - 3.1.0-preview2.19518.2 - Microsoft.EntityFrameworkCore.Relational - 3.1.0-preview2.19518.2 - Microsoft.EntityFrameworkCore.Sqlite - 3.1.0-preview2.19518.2 Dependency coherency updates - Microsoft.AspNetCore.Analyzer.Testing - 3.1.0-preview2.19517.6 (parent: Microsoft.EntityFrameworkCore) - Microsoft.AspNetCore.BenchmarkRunner.Sources - 3.1.0-preview2.19517.6 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.ActivatorUtilities.Sources - 3.1.0-preview2.19517.6 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.Caching.Abstractions - 3.1.0-preview2.19517.6 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.Caching.Memory - 3.1.0-preview2.19517.6 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.Caching.SqlServer - 3.1.0-preview2.19517.6 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.Caching.StackExchangeRedis - 3.1.0-preview2.19517.6 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.CommandLineUtils.Sources - 3.1.0-preview2.19517.6 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.Configuration.Abstractions - 3.1.0-preview2.19517.6 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.Configuration.AzureKeyVault - 3.1.0-preview2.19517.6 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.Configuration.Binder - 3.1.0-preview2.19517.6 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.Configuration.CommandLine - 3.1.0-preview2.19517.6 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.Configuration.EnvironmentVariables - 3.1.0-preview2.19517.6 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.Configuration.FileExtensions - 3.1.0-preview2.19517.6 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.Configuration.Ini - 3.1.0-preview2.19517.6 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.Configuration.Json - 3.1.0-preview2.19517.6 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.Configuration.KeyPerFile - 3.1.0-preview2.19517.6 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.Configuration.UserSecrets - 3.1.0-preview2.19517.6 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.Configuration.Xml - 3.1.0-preview2.19517.6 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.Configuration - 3.1.0-preview2.19517.6 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.DependencyInjection.Abstractions - 3.1.0-preview2.19517.6 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.DependencyInjection - 3.1.0-preview2.19517.6 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.DiagnosticAdapter - 3.1.0-preview2.19517.6 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions - 3.1.0-preview2.19517.6 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.Diagnostics.HealthChecks - 3.1.0-preview2.19517.6 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.FileProviders.Abstractions - 3.1.0-preview2.19517.6 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.FileProviders.Composite - 3.1.0-preview2.19517.6 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.FileProviders.Embedded - 3.1.0-preview2.19517.6 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.FileProviders.Physical - 3.1.0-preview2.19517.6 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.FileSystemGlobbing - 3.1.0-preview2.19517.6 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.HashCodeCombiner.Sources - 3.1.0-preview2.19517.6 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.Hosting.Abstractions - 3.1.0-preview2.19517.6 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.Hosting - 3.1.0-preview2.19517.6 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.HostFactoryResolver.Sources - 3.1.0-preview2.19517.6 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.Http - 3.1.0-preview2.19517.6 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.Localization.Abstractions - 3.1.0-preview2.19517.6 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.Localization - 3.1.0-preview2.19517.6 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.Logging.Abstractions - 3.1.0-preview2.19517.6 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.Logging.AzureAppServices - 3.1.0-preview2.19517.6 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.Logging.Configuration - 3.1.0-preview2.19517.6 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.Logging.Console - 3.1.0-preview2.19517.6 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.Logging.Debug - 3.1.0-preview2.19517.6 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.Logging.EventSource - 3.1.0-preview2.19517.6 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.Logging.EventLog - 3.1.0-preview2.19517.6 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.Logging.TraceSource - 3.1.0-preview2.19517.6 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.Logging.Testing - 3.1.0-preview2.19517.6 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.ObjectPool - 3.1.0-preview2.19517.6 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.Options.ConfigurationExtensions - 3.1.0-preview2.19517.6 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.Options.DataAnnotations - 3.1.0-preview2.19517.6 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.Options - 3.1.0-preview2.19517.6 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.ParameterDefaultValue.Sources - 3.1.0-preview2.19517.6 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.Primitives - 3.1.0-preview2.19517.6 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.TypeNameHelper.Sources - 3.1.0-preview2.19517.6 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.ValueStopwatch.Sources - 3.1.0-preview2.19517.6 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.WebEncoders - 3.1.0-preview2.19517.6 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Internal.Extensions.Refs - 3.1.0-preview2.19517.6 (parent: Microsoft.EntityFrameworkCore) - Microsoft.JSInterop - 3.1.0-preview2.19517.6 (parent: Microsoft.EntityFrameworkCore) - Mono.WebAssembly.Interop - 3.1.0-preview2.19517.6 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Bcl.AsyncInterfaces - 1.1.0-preview2.19516.15 (parent: Microsoft.NETCore.App.Runtime.win-x64) - Microsoft.NETCore.App.Runtime.win-x64 - 3.1.0-preview2.19517.5 (parent: Microsoft.Extensions.Logging) - Microsoft.Extensions.Logging - 3.1.0-preview2.19517.6 (parent: Microsoft.EntityFrameworkCore) - Microsoft.CSharp - 4.7.0-preview2.19516.15 (parent: Microsoft.NETCore.App.Runtime.win-x64) - Microsoft.Win32.Registry - 4.7.0-preview2.19516.15 (parent: Microsoft.NETCore.App.Runtime.win-x64) - Microsoft.Win32.SystemEvents - 4.7.0-preview2.19516.15 (parent: Microsoft.NETCore.App.Runtime.win-x64) - System.ComponentModel.Annotations - 4.7.0-preview2.19516.15 (parent: Microsoft.NETCore.App.Runtime.win-x64) - System.Diagnostics.EventLog - 4.7.0-preview2.19516.15 (parent: Microsoft.NETCore.App.Runtime.win-x64) - System.Drawing.Common - 4.7.0-preview2.19516.15 (parent: Microsoft.NETCore.App.Runtime.win-x64) - System.IO.Pipelines - 4.7.0-preview2.19516.15 (parent: Microsoft.NETCore.App.Runtime.win-x64) - System.Net.Http.WinHttpHandler - 4.7.0-preview2.19516.15 (parent: Microsoft.NETCore.App.Runtime.win-x64) - System.Net.WebSockets.WebSocketProtocol - 4.7.0-preview2.19516.15 (parent: Microsoft.NETCore.App.Runtime.win-x64) - System.Reflection.Metadata - 1.8.0-preview2.19516.15 (parent: Microsoft.NETCore.App.Runtime.win-x64) - System.Runtime.CompilerServices.Unsafe - 4.7.0-preview2.19516.15 (parent: Microsoft.NETCore.App.Runtime.win-x64) - System.Security.Cryptography.Cng - 4.7.0-preview2.19516.15 (parent: Microsoft.NETCore.App.Runtime.win-x64) - System.Security.Cryptography.Pkcs - 4.7.0-preview2.19516.15 (parent: Microsoft.NETCore.App.Runtime.win-x64) - System.Security.Cryptography.Xml - 4.7.0-preview2.19516.15 (parent: Microsoft.NETCore.App.Runtime.win-x64) - System.Security.Permissions - 4.7.0-preview2.19516.15 (parent: Microsoft.NETCore.App.Runtime.win-x64) - System.Security.Principal.Windows - 4.7.0-preview2.19516.15 (parent: Microsoft.NETCore.App.Runtime.win-x64) - System.ServiceProcess.ServiceController - 4.7.0-preview2.19516.15 (parent: Microsoft.NETCore.App.Runtime.win-x64) - System.Text.Encodings.Web - 4.7.0-preview2.19516.15 (parent: Microsoft.NETCore.App.Runtime.win-x64) - System.Text.Json - 4.7.0-preview2.19516.15 (parent: Microsoft.NETCore.App.Runtime.win-x64) - System.Threading.Channels - 4.7.0-preview2.19516.15 (parent: Microsoft.NETCore.App.Runtime.win-x64) - System.Windows.Extensions - 4.7.0-preview2.19516.15 (parent: Microsoft.NETCore.App.Runtime.win-x64) - Microsoft.Extensions.DependencyModel - 3.1.0-preview2.19517.5 (parent: Microsoft.Extensions.Logging) - Microsoft.NETCore.App.Ref - 3.1.0-preview2.19517.5 (parent: Microsoft.Extensions.Logging) - NETStandard.Library.Ref - 2.1.0-preview2.19517.5 (parent: Microsoft.Extensions.Logging) - Microsoft.NETCore.Platforms - 3.1.0-preview2.19516.15 (parent: Microsoft.NETCore.App.Runtime.win-x64) - Internal.AspNetCore.Analyzers - 3.1.0-preview2.19517.6 (parent: Microsoft.EntityFrameworkCore) - Microsoft.AspNetCore.Testing - 3.1.0-preview2.19517.6 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Net.Compilers.Toolset - 3.4.0-beta3-19517-02 (parent: Microsoft.Extensions.Logging) * Update dependencies from https://github.com/aspnet/EntityFrameworkCore build 20191018.3 - Microsoft.EntityFrameworkCore.Tools - 3.1.0-preview2.19518.3 - Microsoft.EntityFrameworkCore.SqlServer - 3.1.0-preview2.19518.3 - dotnet-ef - 3.1.0-preview2.19518.3 - Microsoft.EntityFrameworkCore - 3.1.0-preview2.19518.3 - Microsoft.EntityFrameworkCore.InMemory - 3.1.0-preview2.19518.3 - Microsoft.EntityFrameworkCore.Relational - 3.1.0-preview2.19518.3 - Microsoft.EntityFrameworkCore.Sqlite - 3.1.0-preview2.19518.3 * Update dependencies from https://github.com/aspnet/AspNetCore-Tooling build 20191018.2 - Microsoft.AspNetCore.Mvc.Razor.Extensions - 3.1.0-preview2.19518.2 - Microsoft.AspNetCore.Razor.Language - 3.1.0-preview2.19518.2 - Microsoft.CodeAnalysis.Razor - 3.1.0-preview2.19518.2 - Microsoft.NET.Sdk.Razor - 3.1.0-preview2.19518.2 * Dependency coherency updates - Microsoft.AspNetCore.Analyzer.Testing - 3.1.0-preview2.19518.1 (parent: Microsoft.EntityFrameworkCore) - Microsoft.AspNetCore.BenchmarkRunner.Sources - 3.1.0-preview2.19518.1 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.ActivatorUtilities.Sources - 3.1.0-preview2.19518.1 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.Caching.Abstractions - 3.1.0-preview2.19518.1 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.Caching.Memory - 3.1.0-preview2.19518.1 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.Caching.SqlServer - 3.1.0-preview2.19518.1 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.Caching.StackExchangeRedis - 3.1.0-preview2.19518.1 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.CommandLineUtils.Sources - 3.1.0-preview2.19518.1 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.Configuration.Abstractions - 3.1.0-preview2.19518.1 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.Configuration.AzureKeyVault - 3.1.0-preview2.19518.1 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.Configuration.Binder - 3.1.0-preview2.19518.1 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.Configuration.CommandLine - 3.1.0-preview2.19518.1 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.Configuration.EnvironmentVariables - 3.1.0-preview2.19518.1 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.Configuration.FileExtensions - 3.1.0-preview2.19518.1 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.Configuration.Ini - 3.1.0-preview2.19518.1 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.Configuration.Json - 3.1.0-preview2.19518.1 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.Configuration.KeyPerFile - 3.1.0-preview2.19518.1 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.Configuration.UserSecrets - 3.1.0-preview2.19518.1 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.Configuration.Xml - 3.1.0-preview2.19518.1 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.Configuration - 3.1.0-preview2.19518.1 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.DependencyInjection.Abstractions - 3.1.0-preview2.19518.1 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.DependencyInjection - 3.1.0-preview2.19518.1 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.DiagnosticAdapter - 3.1.0-preview2.19518.1 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions - 3.1.0-preview2.19518.1 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.Diagnostics.HealthChecks - 3.1.0-preview2.19518.1 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.FileProviders.Abstractions - 3.1.0-preview2.19518.1 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.FileProviders.Composite - 3.1.0-preview2.19518.1 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.FileProviders.Embedded - 3.1.0-preview2.19518.1 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.FileProviders.Physical - 3.1.0-preview2.19518.1 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.FileSystemGlobbing - 3.1.0-preview2.19518.1 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.HashCodeCombiner.Sources - 3.1.0-preview2.19518.1 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.Hosting.Abstractions - 3.1.0-preview2.19518.1 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.Hosting - 3.1.0-preview2.19518.1 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.HostFactoryResolver.Sources - 3.1.0-preview2.19518.1 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.Http - 3.1.0-preview2.19518.1 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.Localization.Abstractions - 3.1.0-preview2.19518.1 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.Localization - 3.1.0-preview2.19518.1 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.Logging.Abstractions - 3.1.0-preview2.19518.1 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.Logging.AzureAppServices - 3.1.0-preview2.19518.1 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.Logging.Configuration - 3.1.0-preview2.19518.1 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.Logging.Console - 3.1.0-preview2.19518.1 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.Logging.Debug - 3.1.0-preview2.19518.1 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.Logging.EventSource - 3.1.0-preview2.19518.1 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.Logging.EventLog - 3.1.0-preview2.19518.1 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.Logging.TraceSource - 3.1.0-preview2.19518.1 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.Logging.Testing - 3.1.0-preview2.19518.1 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.ObjectPool - 3.1.0-preview2.19518.1 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.Options.ConfigurationExtensions - 3.1.0-preview2.19518.1 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.Options.DataAnnotations - 3.1.0-preview2.19518.1 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.Options - 3.1.0-preview2.19518.1 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.ParameterDefaultValue.Sources - 3.1.0-preview2.19518.1 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.Primitives - 3.1.0-preview2.19518.1 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.TypeNameHelper.Sources - 3.1.0-preview2.19518.1 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.ValueStopwatch.Sources - 3.1.0-preview2.19518.1 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.WebEncoders - 3.1.0-preview2.19518.1 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Internal.Extensions.Refs - 3.1.0-preview2.19518.1 (parent: Microsoft.EntityFrameworkCore) - Microsoft.JSInterop - 3.1.0-preview2.19518.1 (parent: Microsoft.EntityFrameworkCore) - Mono.WebAssembly.Interop - 3.1.0-preview2.19518.1 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Bcl.AsyncInterfaces - 1.1.0-preview2.19516.15 (parent: Microsoft.NETCore.App.Runtime.win-x64) - Microsoft.NETCore.App.Runtime.win-x64 - 3.1.0-preview2.19517.10 (parent: Microsoft.Extensions.Logging) - Microsoft.Extensions.Logging - 3.1.0-preview2.19518.1 (parent: Microsoft.EntityFrameworkCore) - Microsoft.CSharp - 4.7.0-preview2.19516.15 (parent: Microsoft.NETCore.App.Runtime.win-x64) - Microsoft.Win32.Registry - 4.7.0-preview2.19516.15 (parent: Microsoft.NETCore.App.Runtime.win-x64) - Microsoft.Win32.SystemEvents - 4.7.0-preview2.19516.15 (parent: Microsoft.NETCore.App.Runtime.win-x64) - System.ComponentModel.Annotations - 4.7.0-preview2.19516.15 (parent: Microsoft.NETCore.App.Runtime.win-x64) - System.Diagnostics.EventLog - 4.7.0-preview2.19516.15 (parent: Microsoft.NETCore.App.Runtime.win-x64) - System.Drawing.Common - 4.7.0-preview2.19516.15 (parent: Microsoft.NETCore.App.Runtime.win-x64) - System.IO.Pipelines - 4.7.0-preview2.19516.15 (parent: Microsoft.NETCore.App.Runtime.win-x64) - System.Net.Http.WinHttpHandler - 4.7.0-preview2.19516.15 (parent: Microsoft.NETCore.App.Runtime.win-x64) - System.Net.WebSockets.WebSocketProtocol - 4.7.0-preview2.19516.15 (parent: Microsoft.NETCore.App.Runtime.win-x64) - System.Reflection.Metadata - 1.8.0-preview2.19516.15 (parent: Microsoft.NETCore.App.Runtime.win-x64) - System.Runtime.CompilerServices.Unsafe - 4.7.0-preview2.19516.15 (parent: Microsoft.NETCore.App.Runtime.win-x64) - System.Security.Cryptography.Cng - 4.7.0-preview2.19516.15 (parent: Microsoft.NETCore.App.Runtime.win-x64) - System.Security.Cryptography.Pkcs - 4.7.0-preview2.19516.15 (parent: Microsoft.NETCore.App.Runtime.win-x64) - System.Security.Cryptography.Xml - 4.7.0-preview2.19516.15 (parent: Microsoft.NETCore.App.Runtime.win-x64) - System.Security.Permissions - 4.7.0-preview2.19516.15 (parent: Microsoft.NETCore.App.Runtime.win-x64) - System.Security.Principal.Windows - 4.7.0-preview2.19516.15 (parent: Microsoft.NETCore.App.Runtime.win-x64) - System.ServiceProcess.ServiceController - 4.7.0-preview2.19516.15 (parent: Microsoft.NETCore.App.Runtime.win-x64) - System.Text.Encodings.Web - 4.7.0-preview2.19516.15 (parent: Microsoft.NETCore.App.Runtime.win-x64) - System.Text.Json - 4.7.0-preview2.19516.15 (parent: Microsoft.NETCore.App.Runtime.win-x64) - System.Threading.Channels - 4.7.0-preview2.19516.15 (parent: Microsoft.NETCore.App.Runtime.win-x64) - System.Windows.Extensions - 4.7.0-preview2.19516.15 (parent: Microsoft.NETCore.App.Runtime.win-x64) - Microsoft.Extensions.DependencyModel - 3.1.0-preview2.19517.10 (parent: Microsoft.Extensions.Logging) - Microsoft.NETCore.App.Ref - 3.1.0-preview2.19517.10 (parent: Microsoft.Extensions.Logging) - NETStandard.Library.Ref - 2.1.0-preview2.19517.10 (parent: Microsoft.Extensions.Logging) - Microsoft.NETCore.Platforms - 3.1.0-preview2.19516.15 (parent: Microsoft.NETCore.App.Runtime.win-x64) - Internal.AspNetCore.Analyzers - 3.1.0-preview2.19518.1 (parent: Microsoft.EntityFrameworkCore) - Microsoft.AspNetCore.Testing - 3.1.0-preview2.19518.1 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Net.Compilers.Toolset - 3.4.0-beta3-19518-02 (parent: Microsoft.Extensions.Logging) * Update dependencies from https://github.com/aspnet/EntityFrameworkCore build 20191018.4 - Microsoft.EntityFrameworkCore.Tools - 3.1.0-preview2.19518.4 - Microsoft.EntityFrameworkCore.SqlServer - 3.1.0-preview2.19518.4 - dotnet-ef - 3.1.0-preview2.19518.4 - Microsoft.EntityFrameworkCore - 3.1.0-preview2.19518.4 - Microsoft.EntityFrameworkCore.InMemory - 3.1.0-preview2.19518.4 - Microsoft.EntityFrameworkCore.Relational - 3.1.0-preview2.19518.4 - Microsoft.EntityFrameworkCore.Sqlite - 3.1.0-preview2.19518.4 Dependency coherency updates - Microsoft.AspNetCore.Analyzer.Testing - 3.1.0-preview2.19518.1 (parent: Microsoft.EntityFrameworkCore) - Microsoft.AspNetCore.BenchmarkRunner.Sources - 3.1.0-preview2.19518.1 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.ActivatorUtilities.Sources - 3.1.0-preview2.19518.1 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.Caching.Abstractions - 3.1.0-preview2.19518.1 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.Caching.Memory - 3.1.0-preview2.19518.1 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.Caching.SqlServer - 3.1.0-preview2.19518.1 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.Caching.StackExchangeRedis - 3.1.0-preview2.19518.1 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.CommandLineUtils.Sources - 3.1.0-preview2.19518.1 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.Configuration.Abstractions - 3.1.0-preview2.19518.1 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.Configuration.AzureKeyVault - 3.1.0-preview2.19518.1 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.Configuration.Binder - 3.1.0-preview2.19518.1 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.Configuration.CommandLine - 3.1.0-preview2.19518.1 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.Configuration.EnvironmentVariables - 3.1.0-preview2.19518.1 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.Configuration.FileExtensions - 3.1.0-preview2.19518.1 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.Configuration.Ini - 3.1.0-preview2.19518.1 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.Configuration.Json - 3.1.0-preview2.19518.1 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.Configuration.KeyPerFile - 3.1.0-preview2.19518.1 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.Configuration.UserSecrets - 3.1.0-preview2.19518.1 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.Configuration.Xml - 3.1.0-preview2.19518.1 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.Configuration - 3.1.0-preview2.19518.1 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.DependencyInjection.Abstractions - 3.1.0-preview2.19518.1 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.DependencyInjection - 3.1.0-preview2.19518.1 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.DiagnosticAdapter - 3.1.0-preview2.19518.1 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions - 3.1.0-preview2.19518.1 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.Diagnostics.HealthChecks - 3.1.0-preview2.19518.1 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.FileProviders.Abstractions - 3.1.0-preview2.19518.1 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.FileProviders.Composite - 3.1.0-preview2.19518.1 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.FileProviders.Embedded - 3.1.0-preview2.19518.1 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.FileProviders.Physical - 3.1.0-preview2.19518.1 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.FileSystemGlobbing - 3.1.0-preview2.19518.1 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.HashCodeCombiner.Sources - 3.1.0-preview2.19518.1 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.Hosting.Abstractions - 3.1.0-preview2.19518.1 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.Hosting - 3.1.0-preview2.19518.1 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.HostFactoryResolver.Sources - 3.1.0-preview2.19518.1 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.Http - 3.1.0-preview2.19518.1 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.Localization.Abstractions - 3.1.0-preview2.19518.1 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.Localization - 3.1.0-preview2.19518.1 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.Logging.Abstractions - 3.1.0-preview2.19518.1 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.Logging.AzureAppServices - 3.1.0-preview2.19518.1 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.Logging.Configuration - 3.1.0-preview2.19518.1 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.Logging.Console - 3.1.0-preview2.19518.1 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.Logging.Debug - 3.1.0-preview2.19518.1 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.Logging.EventSource - 3.1.0-preview2.19518.1 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.Logging.EventLog - 3.1.0-preview2.19518.1 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.Logging.TraceSource - 3.1.0-preview2.19518.1 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.Logging.Testing - 3.1.0-preview2.19518.1 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.ObjectPool - 3.1.0-preview2.19518.1 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.Options.ConfigurationExtensions - 3.1.0-preview2.19518.1 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.Options.DataAnnotations - 3.1.0-preview2.19518.1 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.Options - 3.1.0-preview2.19518.1 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.ParameterDefaultValue.Sources - 3.1.0-preview2.19518.1 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.Primitives - 3.1.0-preview2.19518.1 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.TypeNameHelper.Sources - 3.1.0-preview2.19518.1 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.ValueStopwatch.Sources - 3.1.0-preview2.19518.1 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.WebEncoders - 3.1.0-preview2.19518.1 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Internal.Extensions.Refs - 3.1.0-preview2.19518.1 (parent: Microsoft.EntityFrameworkCore) - Microsoft.JSInterop - 3.1.0-preview2.19518.1 (parent: Microsoft.EntityFrameworkCore) - Mono.WebAssembly.Interop - 3.1.0-preview2.19518.1 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Bcl.AsyncInterfaces - 1.1.0-preview2.19516.15 (parent: Microsoft.NETCore.App.Runtime.win-x64) - Microsoft.NETCore.App.Runtime.win-x64 - 3.1.0-preview2.19517.10 (parent: Microsoft.Extensions.Logging) - Microsoft.Extensions.Logging - 3.1.0-preview2.19518.1 (parent: Microsoft.EntityFrameworkCore) - Microsoft.CSharp - 4.7.0-preview2.19516.15 (parent: Microsoft.NETCore.App.Runtime.win-x64) - Microsoft.Win32.Registry - 4.7.0-preview2.19516.15 (parent: Microsoft.NETCore.App.Runtime.win-x64) - Microsoft.Win32.SystemEvents - 4.7.0-preview2.19516.15 (parent: Microsoft.NETCore.App.Runtime.win-x64) - System.ComponentModel.Annotations - 4.7.0-preview2.19516.15 (parent: Microsoft.NETCore.App.Runtime.win-x64) - System.Diagnostics.EventLog - 4.7.0-preview2.19516.15 (parent: Microsoft.NETCore.App.Runtime.win-x64) - System.Drawing.Common - 4.7.0-preview2.19516.15 (parent: Microsoft.NETCore.App.Runtime.win-x64) - System.IO.Pipelines - 4.7.0-preview2.19516.15 (parent: Microsoft.NETCore.App.Runtime.win-x64) - System.Net.Http.WinHttpHandler - 4.7.0-preview2.19516.15 (parent: Microsoft.NETCore.App.Runtime.win-x64) - System.Net.WebSockets.WebSocketProtocol - 4.7.0-preview2.19516.15 (parent: Microsoft.NETCore.App.Runtime.win-x64) - System.Reflection.Metadata - 1.8.0-preview2.19516.15 (parent: Microsoft.NETCore.App.Runtime.win-x64) - System.Runtime.CompilerServices.Unsafe - 4.7.0-preview2.19516.15 (parent: Microsoft.NETCore.App.Runtime.win-x64) - System.Security.Cryptography.Cng - 4.7.0-preview2.19516.15 (parent: Microsoft.NETCore.App.Runtime.win-x64) - System.Security.Cryptography.Pkcs - 4.7.0-preview2.19516.15 (parent: Microsoft.NETCore.App.Runtime.win-x64) - System.Security.Cryptography.Xml - 4.7.0-preview2.19516.15 (parent: Microsoft.NETCore.App.Runtime.win-x64) - System.Security.Permissions - 4.7.0-preview2.19516.15 (parent: Microsoft.NETCore.App.Runtime.win-x64) - System.Security.Principal.Windows - 4.7.0-preview2.19516.15 (parent: Microsoft.NETCore.App.Runtime.win-x64) - System.ServiceProcess.ServiceController - 4.7.0-preview2.19516.15 (parent: Microsoft.NETCore.App.Runtime.win-x64) - System.Text.Encodings.Web - 4.7.0-preview2.19516.15 (parent: Microsoft.NETCore.App.Runtime.win-x64) - System.Text.Json - 4.7.0-preview2.19516.15 (parent: Microsoft.NETCore.App.Runtime.win-x64) - System.Threading.Channels - 4.7.0-preview2.19516.15 (parent: Microsoft.NETCore.App.Runtime.win-x64) - System.Windows.Extensions - 4.7.0-preview2.19516.15 (parent: Microsoft.NETCore.App.Runtime.win-x64) - Microsoft.Extensions.DependencyModel - 3.1.0-preview2.19517.10 (parent: Microsoft.Extensions.Logging) - Microsoft.NETCore.App.Ref - 3.1.0-preview2.19517.10 (parent: Microsoft.Extensions.Logging) - NETStandard.Library.Ref - 2.1.0-preview2.19517.10 (parent: Microsoft.Extensions.Logging) - Microsoft.NETCore.Platforms - 3.1.0-preview2.19516.15 (parent: Microsoft.NETCore.App.Runtime.win-x64) - Internal.AspNetCore.Analyzers - 3.1.0-preview2.19518.1 (parent: Microsoft.EntityFrameworkCore) - Microsoft.AspNetCore.Testing - 3.1.0-preview2.19518.1 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Net.Compilers.Toolset - 3.4.0-beta3-19518-02 (parent: Microsoft.Extensions.Logging) * Update dependencies from https://github.com/aspnet/EntityFrameworkCore build 20191018.7 - Microsoft.EntityFrameworkCore.Tools - 3.1.0-preview2.19518.7 - Microsoft.EntityFrameworkCore.SqlServer - 3.1.0-preview2.19518.7 - dotnet-ef - 3.1.0-preview2.19518.7 - Microsoft.EntityFrameworkCore - 3.1.0-preview2.19518.7 - Microsoft.EntityFrameworkCore.InMemory - 3.1.0-preview2.19518.7 - Microsoft.EntityFrameworkCore.Relational - 3.1.0-preview2.19518.7 - Microsoft.EntityFrameworkCore.Sqlite - 3.1.0-preview2.19518.7 Dependency coherency updates - Microsoft.AspNetCore.Analyzer.Testing - 3.1.0-preview2.19518.1 (parent: Microsoft.EntityFrameworkCore) - Microsoft.AspNetCore.BenchmarkRunner.Sources - 3.1.0-preview2.19518.1 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.ActivatorUtilities.Sources - 3.1.0-preview2.19518.1 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.Caching.Abstractions - 3.1.0-preview2.19518.1 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.Caching.Memory - 3.1.0-preview2.19518.1 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.Caching.SqlServer - 3.1.0-preview2.19518.1 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.Caching.StackExchangeRedis - 3.1.0-preview2.19518.1 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.CommandLineUtils.Sources - 3.1.0-preview2.19518.1 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.Configuration.Abstractions - 3.1.0-preview2.19518.1 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.Configuration.AzureKeyVault - 3.1.0-preview2.19518.1 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.Configuration.Binder - 3.1.0-preview2.19518.1 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.Configuration.CommandLine - 3.1.0-preview2.19518.1 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.Configuration.EnvironmentVariables - 3.1.0-preview2.19518.1 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.Configuration.FileExtensions - 3.1.0-preview2.19518.1 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.Configuration.Ini - 3.1.0-preview2.19518.1 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.Configuration.Json - 3.1.0-preview2.19518.1 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.Configuration.KeyPerFile - 3.1.0-preview2.19518.1 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.Configuration.UserSecrets - 3.1.0-preview2.19518.1 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.Configuration.Xml - 3.1.0-preview2.19518.1 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.Configuration - 3.1.0-preview2.19518.1 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.DependencyInjection.Abstractions - 3.1.0-preview2.19518.1 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.DependencyInjection - 3.1.0-preview2.19518.1 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.DiagnosticAdapter - 3.1.0-preview2.19518.1 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions - 3.1.0-preview2.19518.1 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.Diagnostics.HealthChecks - 3.1.0-preview2.19518.1 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.FileProviders.Abstractions - 3.1.0-preview2.19518.1 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.FileProviders.Composite - 3.1.0-preview2.19518.1 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.FileProviders.Embedded - 3.1.0-preview2.19518.1 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.FileProviders.Physical - 3.1.0-preview2.19518.1 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.FileSystemGlobbing - 3.1.0-preview2.19518.1 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.HashCodeCombiner.Sources - 3.1.0-preview2.19518.1 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.Hosting.Abstractions - 3.1.0-preview2.19518.1 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.Hosting - 3.1.0-preview2.19518.1 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.HostFactoryResolver.Sources - 3.1.0-preview2.19518.1 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.Http - 3.1.0-preview2.19518.1 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.Localization.Abstractions - 3.1.0-preview2.19518.1 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.Localization - 3.1.0-preview2.19518.1 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.Logging.Abstractions - 3.1.0-preview2.19518.1 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.Logging.AzureAppServices - 3.1.0-preview2.19518.1 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.Logging.Configuration - 3.1.0-preview2.19518.1 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.Logging.Console - 3.1.0-preview2.19518.1 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.Logging.Debug - 3.1.0-preview2.19518.1 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.Logging.EventSource - 3.1.0-preview2.19518.1 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.Logging.EventLog - 3.1.0-preview2.19518.1 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.Logging.TraceSource - 3.1.0-preview2.19518.1 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.Logging.Testing - 3.1.0-preview2.19518.1 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.ObjectPool - 3.1.0-preview2.19518.1 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.Options.ConfigurationExtensions - 3.1.0-preview2.19518.1 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.Options.DataAnnotations - 3.1.0-preview2.19518.1 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.Options - 3.1.0-preview2.19518.1 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.ParameterDefaultValue.Sources - 3.1.0-preview2.19518.1 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.Primitives - 3.1.0-preview2.19518.1 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.TypeNameHelper.Sources - 3.1.0-preview2.19518.1 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.ValueStopwatch.Sources - 3.1.0-preview2.19518.1 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Extensions.WebEncoders - 3.1.0-preview2.19518.1 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Internal.Extensions.Refs - 3.1.0-preview2.19518.1 (parent: Microsoft.EntityFrameworkCore) - Microsoft.JSInterop - 3.1.0-preview2.19518.1 (parent: Microsoft.EntityFrameworkCore) - Mono.WebAssembly.Interop - 3.1.0-preview2.19518.1 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Bcl.AsyncInterfaces - 1.1.0-preview2.19516.15 (parent: Microsoft.NETCore.App.Runtime.win-x64) - Microsoft.NETCore.App.Runtime.win-x64 - 3.1.0-preview2.19517.10 (parent: Microsoft.Extensions.Logging) - Microsoft.Extensions.Logging - 3.1.0-preview2.19518.1 (parent: Microsoft.EntityFrameworkCore) - Microsoft.CSharp - 4.7.0-preview2.19516.15 (parent: Microsoft.NETCore.App.Runtime.win-x64) - Microsoft.Win32.Registry - 4.7.0-preview2.19516.15 (parent: Microsoft.NETCore.App.Runtime.win-x64) - Microsoft.Win32.SystemEvents - 4.7.0-preview2.19516.15 (parent: Microsoft.NETCore.App.Runtime.win-x64) - System.ComponentModel.Annotations - 4.7.0-preview2.19516.15 (parent: Microsoft.NETCore.App.Runtime.win-x64) - System.Diagnostics.EventLog - 4.7.0-preview2.19516.15 (parent: Microsoft.NETCore.App.Runtime.win-x64) - System.Drawing.Common - 4.7.0-preview2.19516.15 (parent: Microsoft.NETCore.App.Runtime.win-x64) - System.IO.Pipelines - 4.7.0-preview2.19516.15 (parent: Microsoft.NETCore.App.Runtime.win-x64) - System.Net.Http.WinHttpHandler - 4.7.0-preview2.19516.15 (parent: Microsoft.NETCore.App.Runtime.win-x64) - System.Net.WebSockets.WebSocketProtocol - 4.7.0-preview2.19516.15 (parent: Microsoft.NETCore.App.Runtime.win-x64) - System.Reflection.Metadata - 1.8.0-preview2.19516.15 (parent: Microsoft.NETCore.App.Runtime.win-x64) - System.Runtime.CompilerServices.Unsafe - 4.7.0-preview2.19516.15 (parent: Microsoft.NETCore.App.Runtime.win-x64) - System.Security.Cryptography.Cng - 4.7.0-preview2.19516.15 (parent: Microsoft.NETCore.App.Runtime.win-x64) - System.Security.Cryptography.Pkcs - 4.7.0-preview2.19516.15 (parent: Microsoft.NETCore.App.Runtime.win-x64) - System.Security.Cryptography.Xml - 4.7.0-preview2.19516.15 (parent: Microsoft.NETCore.App.Runtime.win-x64) - System.Security.Permissions - 4.7.0-preview2.19516.15 (parent: Microsoft.NETCore.App.Runtime.win-x64) - System.Security.Principal.Windows - 4.7.0-preview2.19516.15 (parent: Microsoft.NETCore.App.Runtime.win-x64) - System.ServiceProcess.ServiceController - 4.7.0-preview2.19516.15 (parent: Microsoft.NETCore.App.Runtime.win-x64) - System.Text.Encodings.Web - 4.7.0-preview2.19516.15 (parent: Microsoft.NETCore.App.Runtime.win-x64) - System.Text.Json - 4.7.0-preview2.19516.15 (parent: Microsoft.NETCore.App.Runtime.win-x64) - System.Threading.Channels - 4.7.0-preview2.19516.15 (parent: Microsoft.NETCore.App.Runtime.win-x64) - System.Windows.Extensions - 4.7.0-preview2.19516.15 (parent: Microsoft.NETCore.App.Runtime.win-x64) - Microsoft.Extensions.DependencyModel - 3.1.0-preview2.19517.10 (parent: Microsoft.Extensions.Logging) - Microsoft.NETCore.App.Ref - 3.1.0-preview2.19517.10 (parent: Microsoft.Extensions.Logging) - NETStandard.Library.Ref - 2.1.0-preview2.19517.10 (parent: Microsoft.Extensions.Logging) - Microsoft.NETCore.Platforms - 3.1.0-preview2.19516.15 (parent: Microsoft.NETCore.App.Runtime.win-x64) - Internal.AspNetCore.Analyzers - 3.1.0-preview2.19518.1 (parent: Microsoft.EntityFrameworkCore) - Microsoft.AspNetCore.Testing - 3.1.0-preview2.19518.1 (parent: Microsoft.EntityFrameworkCore) - Microsoft.Net.Compilers.Toolset - 3.4.0-beta3-19518-02 (parent: Microsoft.Extensions.Logging) * Update dependencies from https://github.com/aspnet/AspNetCore-Tooling build 20191018.6 - Microsoft.AspNetCore.Mvc.Razor.Extensions - 3.1.0-preview2.19518.6 - Microsoft.AspNetCore.Razor.Language - 3.1.0-preview2.19518.6 - Microsoft.CodeAnalysis.Razor - 3.1.0-preview2.19518.6 - Microsoft.NET.Sdk.Razor - 3.1.0-preview2.19518.6 * Update System.Text.Json expectations --- eng/Version.Details.xml | 400 +++++++++--------- eng/Versions.props | 200 ++++----- .../SystemTextJsonInputFormatterTest.cs | 2 +- 3 files changed, 301 insertions(+), 301 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index 619c1dd333..bdd41d7637 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -13,404 +13,404 @@ https://github.com/aspnet/Blazor bf49a4e1a5401c0e952147f1c7452261a058813d - + https://github.com/aspnet/AspNetCore-Tooling - ce09369eb4162fe4bccf1a91bfdc5229f11afdbe + 010ce2d40df92547c6402978c4ac669be709326b - + https://github.com/aspnet/AspNetCore-Tooling - ce09369eb4162fe4bccf1a91bfdc5229f11afdbe + 010ce2d40df92547c6402978c4ac669be709326b - + https://github.com/aspnet/AspNetCore-Tooling - ce09369eb4162fe4bccf1a91bfdc5229f11afdbe + 010ce2d40df92547c6402978c4ac669be709326b - + https://github.com/aspnet/AspNetCore-Tooling - ce09369eb4162fe4bccf1a91bfdc5229f11afdbe + 010ce2d40df92547c6402978c4ac669be709326b - + https://github.com/aspnet/EntityFrameworkCore - 2c63d0efeda8ccfbc651736403e2ccbd2e589589 + 860061455969d87b0dbaa5de467bedb63b923784 - + https://github.com/aspnet/EntityFrameworkCore - 2c63d0efeda8ccfbc651736403e2ccbd2e589589 + 860061455969d87b0dbaa5de467bedb63b923784 - + https://github.com/aspnet/EntityFrameworkCore - 2c63d0efeda8ccfbc651736403e2ccbd2e589589 + 860061455969d87b0dbaa5de467bedb63b923784 - + https://github.com/aspnet/EntityFrameworkCore - 2c63d0efeda8ccfbc651736403e2ccbd2e589589 + 860061455969d87b0dbaa5de467bedb63b923784 - + https://github.com/aspnet/EntityFrameworkCore - 2c63d0efeda8ccfbc651736403e2ccbd2e589589 + 860061455969d87b0dbaa5de467bedb63b923784 - + https://github.com/aspnet/EntityFrameworkCore - 2c63d0efeda8ccfbc651736403e2ccbd2e589589 + 860061455969d87b0dbaa5de467bedb63b923784 - + https://github.com/aspnet/EntityFrameworkCore - 2c63d0efeda8ccfbc651736403e2ccbd2e589589 + 860061455969d87b0dbaa5de467bedb63b923784 - + https://github.com/aspnet/Extensions - dd3db48e9509475fff5907fc0318209988a5b657 + f47ae22c9cee5a169e1a33c8f4b2067aa326f0a6 - + https://github.com/aspnet/Extensions - dd3db48e9509475fff5907fc0318209988a5b657 + f47ae22c9cee5a169e1a33c8f4b2067aa326f0a6 - + https://github.com/aspnet/Extensions - dd3db48e9509475fff5907fc0318209988a5b657 + f47ae22c9cee5a169e1a33c8f4b2067aa326f0a6 - + https://github.com/aspnet/Extensions - dd3db48e9509475fff5907fc0318209988a5b657 + f47ae22c9cee5a169e1a33c8f4b2067aa326f0a6 - + https://github.com/aspnet/Extensions - dd3db48e9509475fff5907fc0318209988a5b657 + f47ae22c9cee5a169e1a33c8f4b2067aa326f0a6 - + https://github.com/aspnet/Extensions - dd3db48e9509475fff5907fc0318209988a5b657 + f47ae22c9cee5a169e1a33c8f4b2067aa326f0a6 - + https://github.com/aspnet/Extensions - dd3db48e9509475fff5907fc0318209988a5b657 + f47ae22c9cee5a169e1a33c8f4b2067aa326f0a6 - + https://github.com/aspnet/Extensions - dd3db48e9509475fff5907fc0318209988a5b657 + f47ae22c9cee5a169e1a33c8f4b2067aa326f0a6 - + https://github.com/aspnet/Extensions - dd3db48e9509475fff5907fc0318209988a5b657 + f47ae22c9cee5a169e1a33c8f4b2067aa326f0a6 - + https://github.com/aspnet/Extensions - dd3db48e9509475fff5907fc0318209988a5b657 + f47ae22c9cee5a169e1a33c8f4b2067aa326f0a6 - + https://github.com/aspnet/Extensions - dd3db48e9509475fff5907fc0318209988a5b657 + f47ae22c9cee5a169e1a33c8f4b2067aa326f0a6 - + https://github.com/aspnet/Extensions - dd3db48e9509475fff5907fc0318209988a5b657 + f47ae22c9cee5a169e1a33c8f4b2067aa326f0a6 - + https://github.com/aspnet/Extensions - dd3db48e9509475fff5907fc0318209988a5b657 + f47ae22c9cee5a169e1a33c8f4b2067aa326f0a6 - + https://github.com/aspnet/Extensions - dd3db48e9509475fff5907fc0318209988a5b657 + f47ae22c9cee5a169e1a33c8f4b2067aa326f0a6 - + https://github.com/aspnet/Extensions - dd3db48e9509475fff5907fc0318209988a5b657 + f47ae22c9cee5a169e1a33c8f4b2067aa326f0a6 - + https://github.com/aspnet/Extensions - dd3db48e9509475fff5907fc0318209988a5b657 + f47ae22c9cee5a169e1a33c8f4b2067aa326f0a6 - + https://github.com/aspnet/Extensions - dd3db48e9509475fff5907fc0318209988a5b657 + f47ae22c9cee5a169e1a33c8f4b2067aa326f0a6 - + https://github.com/aspnet/Extensions - dd3db48e9509475fff5907fc0318209988a5b657 + f47ae22c9cee5a169e1a33c8f4b2067aa326f0a6 - + https://github.com/aspnet/Extensions - dd3db48e9509475fff5907fc0318209988a5b657 + f47ae22c9cee5a169e1a33c8f4b2067aa326f0a6 - + https://github.com/aspnet/Extensions - dd3db48e9509475fff5907fc0318209988a5b657 + f47ae22c9cee5a169e1a33c8f4b2067aa326f0a6 - + https://github.com/aspnet/Extensions - dd3db48e9509475fff5907fc0318209988a5b657 + f47ae22c9cee5a169e1a33c8f4b2067aa326f0a6 - + https://github.com/aspnet/Extensions - dd3db48e9509475fff5907fc0318209988a5b657 + f47ae22c9cee5a169e1a33c8f4b2067aa326f0a6 - + https://github.com/aspnet/Extensions - dd3db48e9509475fff5907fc0318209988a5b657 + f47ae22c9cee5a169e1a33c8f4b2067aa326f0a6 - + https://github.com/aspnet/Extensions - dd3db48e9509475fff5907fc0318209988a5b657 + f47ae22c9cee5a169e1a33c8f4b2067aa326f0a6 - + https://github.com/aspnet/Extensions - dd3db48e9509475fff5907fc0318209988a5b657 + f47ae22c9cee5a169e1a33c8f4b2067aa326f0a6 - + https://github.com/aspnet/Extensions - dd3db48e9509475fff5907fc0318209988a5b657 + f47ae22c9cee5a169e1a33c8f4b2067aa326f0a6 - + https://github.com/aspnet/Extensions - dd3db48e9509475fff5907fc0318209988a5b657 + f47ae22c9cee5a169e1a33c8f4b2067aa326f0a6 - + https://github.com/aspnet/Extensions - dd3db48e9509475fff5907fc0318209988a5b657 + f47ae22c9cee5a169e1a33c8f4b2067aa326f0a6 - + https://github.com/aspnet/Extensions - dd3db48e9509475fff5907fc0318209988a5b657 + f47ae22c9cee5a169e1a33c8f4b2067aa326f0a6 - + https://github.com/aspnet/Extensions - dd3db48e9509475fff5907fc0318209988a5b657 + f47ae22c9cee5a169e1a33c8f4b2067aa326f0a6 - + https://github.com/aspnet/Extensions - dd3db48e9509475fff5907fc0318209988a5b657 + f47ae22c9cee5a169e1a33c8f4b2067aa326f0a6 - + https://github.com/aspnet/Extensions - dd3db48e9509475fff5907fc0318209988a5b657 + f47ae22c9cee5a169e1a33c8f4b2067aa326f0a6 - + https://github.com/aspnet/Extensions - dd3db48e9509475fff5907fc0318209988a5b657 + f47ae22c9cee5a169e1a33c8f4b2067aa326f0a6 - + https://github.com/aspnet/Extensions - dd3db48e9509475fff5907fc0318209988a5b657 + f47ae22c9cee5a169e1a33c8f4b2067aa326f0a6 - + https://github.com/aspnet/Extensions - dd3db48e9509475fff5907fc0318209988a5b657 + f47ae22c9cee5a169e1a33c8f4b2067aa326f0a6 - + https://github.com/aspnet/Extensions - dd3db48e9509475fff5907fc0318209988a5b657 + f47ae22c9cee5a169e1a33c8f4b2067aa326f0a6 - + https://github.com/aspnet/Extensions - dd3db48e9509475fff5907fc0318209988a5b657 + f47ae22c9cee5a169e1a33c8f4b2067aa326f0a6 - + https://github.com/aspnet/Extensions - dd3db48e9509475fff5907fc0318209988a5b657 + f47ae22c9cee5a169e1a33c8f4b2067aa326f0a6 - + https://github.com/aspnet/Extensions - dd3db48e9509475fff5907fc0318209988a5b657 + f47ae22c9cee5a169e1a33c8f4b2067aa326f0a6 - + https://github.com/aspnet/Extensions - dd3db48e9509475fff5907fc0318209988a5b657 + f47ae22c9cee5a169e1a33c8f4b2067aa326f0a6 - + https://github.com/aspnet/Extensions - dd3db48e9509475fff5907fc0318209988a5b657 + f47ae22c9cee5a169e1a33c8f4b2067aa326f0a6 - + https://github.com/aspnet/Extensions - dd3db48e9509475fff5907fc0318209988a5b657 + f47ae22c9cee5a169e1a33c8f4b2067aa326f0a6 - + https://github.com/aspnet/Extensions - dd3db48e9509475fff5907fc0318209988a5b657 + f47ae22c9cee5a169e1a33c8f4b2067aa326f0a6 - + https://github.com/aspnet/Extensions - dd3db48e9509475fff5907fc0318209988a5b657 + f47ae22c9cee5a169e1a33c8f4b2067aa326f0a6 - + https://github.com/aspnet/Extensions - dd3db48e9509475fff5907fc0318209988a5b657 + f47ae22c9cee5a169e1a33c8f4b2067aa326f0a6 - + https://github.com/aspnet/Extensions - dd3db48e9509475fff5907fc0318209988a5b657 + f47ae22c9cee5a169e1a33c8f4b2067aa326f0a6 - + https://github.com/aspnet/Extensions - dd3db48e9509475fff5907fc0318209988a5b657 + f47ae22c9cee5a169e1a33c8f4b2067aa326f0a6 - + https://github.com/aspnet/Extensions - dd3db48e9509475fff5907fc0318209988a5b657 + f47ae22c9cee5a169e1a33c8f4b2067aa326f0a6 - + https://github.com/aspnet/Extensions - dd3db48e9509475fff5907fc0318209988a5b657 + f47ae22c9cee5a169e1a33c8f4b2067aa326f0a6 - + https://github.com/aspnet/Extensions - dd3db48e9509475fff5907fc0318209988a5b657 + f47ae22c9cee5a169e1a33c8f4b2067aa326f0a6 - + https://github.com/aspnet/Extensions - dd3db48e9509475fff5907fc0318209988a5b657 + f47ae22c9cee5a169e1a33c8f4b2067aa326f0a6 - + https://github.com/aspnet/Extensions - dd3db48e9509475fff5907fc0318209988a5b657 + f47ae22c9cee5a169e1a33c8f4b2067aa326f0a6 - + https://github.com/aspnet/Extensions - dd3db48e9509475fff5907fc0318209988a5b657 + f47ae22c9cee5a169e1a33c8f4b2067aa326f0a6 - + https://github.com/aspnet/Extensions - dd3db48e9509475fff5907fc0318209988a5b657 + f47ae22c9cee5a169e1a33c8f4b2067aa326f0a6 - + https://github.com/aspnet/Extensions - dd3db48e9509475fff5907fc0318209988a5b657 + f47ae22c9cee5a169e1a33c8f4b2067aa326f0a6 - + https://github.com/aspnet/Extensions - dd3db48e9509475fff5907fc0318209988a5b657 + f47ae22c9cee5a169e1a33c8f4b2067aa326f0a6 - + https://github.com/aspnet/Extensions - dd3db48e9509475fff5907fc0318209988a5b657 + f47ae22c9cee5a169e1a33c8f4b2067aa326f0a6 - + https://github.com/aspnet/Extensions - dd3db48e9509475fff5907fc0318209988a5b657 + f47ae22c9cee5a169e1a33c8f4b2067aa326f0a6 - + https://github.com/aspnet/Extensions - dd3db48e9509475fff5907fc0318209988a5b657 + f47ae22c9cee5a169e1a33c8f4b2067aa326f0a6 - + https://github.com/dotnet/corefx - 0498dfedf8dbbd088c74399f45bc0b0c861c831a + c4d092f0430a104fa633f1503a1c207b4518f05d - + https://github.com/dotnet/corefx - 0498dfedf8dbbd088c74399f45bc0b0c861c831a + c4d092f0430a104fa633f1503a1c207b4518f05d - + https://github.com/dotnet/corefx - 0498dfedf8dbbd088c74399f45bc0b0c861c831a + c4d092f0430a104fa633f1503a1c207b4518f05d - + https://github.com/dotnet/corefx - 0498dfedf8dbbd088c74399f45bc0b0c861c831a + c4d092f0430a104fa633f1503a1c207b4518f05d - + https://github.com/dotnet/corefx - 0498dfedf8dbbd088c74399f45bc0b0c861c831a + c4d092f0430a104fa633f1503a1c207b4518f05d - + https://github.com/dotnet/corefx - 0498dfedf8dbbd088c74399f45bc0b0c861c831a + c4d092f0430a104fa633f1503a1c207b4518f05d - + https://github.com/dotnet/corefx - 0498dfedf8dbbd088c74399f45bc0b0c861c831a + c4d092f0430a104fa633f1503a1c207b4518f05d - + https://github.com/dotnet/corefx - 0498dfedf8dbbd088c74399f45bc0b0c861c831a + c4d092f0430a104fa633f1503a1c207b4518f05d - + https://github.com/dotnet/corefx - 0498dfedf8dbbd088c74399f45bc0b0c861c831a + c4d092f0430a104fa633f1503a1c207b4518f05d - + https://github.com/dotnet/corefx - 0498dfedf8dbbd088c74399f45bc0b0c861c831a + c4d092f0430a104fa633f1503a1c207b4518f05d - + https://github.com/dotnet/corefx - 0498dfedf8dbbd088c74399f45bc0b0c861c831a + c4d092f0430a104fa633f1503a1c207b4518f05d - + https://github.com/dotnet/corefx - 0498dfedf8dbbd088c74399f45bc0b0c861c831a + c4d092f0430a104fa633f1503a1c207b4518f05d - + https://github.com/dotnet/corefx - 0498dfedf8dbbd088c74399f45bc0b0c861c831a + c4d092f0430a104fa633f1503a1c207b4518f05d - + https://github.com/dotnet/corefx - 0498dfedf8dbbd088c74399f45bc0b0c861c831a + c4d092f0430a104fa633f1503a1c207b4518f05d - + https://github.com/dotnet/corefx - 0498dfedf8dbbd088c74399f45bc0b0c861c831a + c4d092f0430a104fa633f1503a1c207b4518f05d - + https://github.com/dotnet/corefx - 0498dfedf8dbbd088c74399f45bc0b0c861c831a + c4d092f0430a104fa633f1503a1c207b4518f05d - + https://github.com/dotnet/corefx - 0498dfedf8dbbd088c74399f45bc0b0c861c831a + c4d092f0430a104fa633f1503a1c207b4518f05d - + https://github.com/dotnet/corefx - 0498dfedf8dbbd088c74399f45bc0b0c861c831a + c4d092f0430a104fa633f1503a1c207b4518f05d - + https://github.com/dotnet/corefx - 0498dfedf8dbbd088c74399f45bc0b0c861c831a + c4d092f0430a104fa633f1503a1c207b4518f05d - + https://github.com/dotnet/corefx - 0498dfedf8dbbd088c74399f45bc0b0c861c831a + c4d092f0430a104fa633f1503a1c207b4518f05d - + https://github.com/dotnet/corefx - 0498dfedf8dbbd088c74399f45bc0b0c861c831a + c4d092f0430a104fa633f1503a1c207b4518f05d - + https://github.com/dotnet/corefx - 0498dfedf8dbbd088c74399f45bc0b0c861c831a + c4d092f0430a104fa633f1503a1c207b4518f05d - + https://github.com/dotnet/core-setup - bbf5542781136f9f3a1f30b010cb782e775d54c7 + 3daa0867abd7693bc654d9b02cdfe957428b36f1 - + https://github.com/dotnet/core-setup - bbf5542781136f9f3a1f30b010cb782e775d54c7 + 3daa0867abd7693bc654d9b02cdfe957428b36f1 - + https://github.com/dotnet/core-setup - bbf5542781136f9f3a1f30b010cb782e775d54c7 + 3daa0867abd7693bc654d9b02cdfe957428b36f1 - + https://github.com/dotnet/core-setup - bbf5542781136f9f3a1f30b010cb782e775d54c7 + 3daa0867abd7693bc654d9b02cdfe957428b36f1 - + https://github.com/dotnet/corefx - 0498dfedf8dbbd088c74399f45bc0b0c861c831a + c4d092f0430a104fa633f1503a1c207b4518f05d - + https://github.com/aspnet/Extensions - dd3db48e9509475fff5907fc0318209988a5b657 + f47ae22c9cee5a169e1a33c8f4b2067aa326f0a6 https://github.com/dotnet/arcade @@ -424,13 +424,13 @@ https://github.com/dotnet/arcade f70d1fca3d5d4045be75694006f1bee0e0aec572 - + https://github.com/aspnet/Extensions - dd3db48e9509475fff5907fc0318209988a5b657 + f47ae22c9cee5a169e1a33c8f4b2067aa326f0a6 - + https://github.com/dotnet/roslyn - cac1be1463d3b277184ed38115ae35b0cb236688 + 7c7708ed32437b99ab18a21d056d7ae0949e8d5c diff --git a/eng/Versions.props b/eng/Versions.props index 7003715561..eb6dd340b6 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -64,114 +64,114 @@ 1.0.0-beta.19510.3 - 3.4.0-beta2-19462-08 + 3.4.0-beta3-19518-02 - 3.1.0-preview1.19506.1 - 3.1.0-preview1.19506.1 - 3.1.0-preview1.19506.1 - 2.1.0-preview1.19506.1 + 3.1.0-preview2.19517.10 + 3.1.0-preview2.19517.10 + 3.1.0-preview2.19517.10 + 2.1.0-preview2.19517.10 - 1.1.0-preview1.19504.10 - 4.7.0-preview1.19504.10 - 4.7.0-preview1.19504.10 - 4.7.0-preview1.19504.10 - 4.7.0-preview1.19504.10 - 4.7.0-preview1.19504.10 - 4.7.0-preview1.19504.10 - 4.7.0-preview1.19504.10 - 4.7.0-preview1.19504.10 - 4.7.0-preview1.19504.10 - 1.8.0-preview1.19504.10 - 4.7.0-preview1.19504.10 - 4.7.0-preview1.19504.10 - 4.7.0-preview1.19504.10 - 4.7.0-preview1.19504.10 - 4.7.0-preview1.19504.10 - 4.7.0-preview1.19504.10 - 4.7.0-preview1.19504.10 - 4.7.0-preview1.19504.10 - 4.7.0-preview1.19504.10 - 4.7.0-preview1.19504.10 - 4.7.0-preview1.19504.10 + 1.1.0-preview2.19516.15 + 4.7.0-preview2.19516.15 + 4.7.0-preview2.19516.15 + 4.7.0-preview2.19516.15 + 4.7.0-preview2.19516.15 + 4.7.0-preview2.19516.15 + 4.7.0-preview2.19516.15 + 4.7.0-preview2.19516.15 + 4.7.0-preview2.19516.15 + 4.7.0-preview2.19516.15 + 1.8.0-preview2.19516.15 + 4.7.0-preview2.19516.15 + 4.7.0-preview2.19516.15 + 4.7.0-preview2.19516.15 + 4.7.0-preview2.19516.15 + 4.7.0-preview2.19516.15 + 4.7.0-preview2.19516.15 + 4.7.0-preview2.19516.15 + 4.7.0-preview2.19516.15 + 4.7.0-preview2.19516.15 + 4.7.0-preview2.19516.15 + 4.7.0-preview2.19516.15 - 3.1.0-preview1.19504.10 + 3.1.0-preview2.19516.15 3.1.0-preview1.19503.1 - 3.1.0-preview1.19506.1 - 3.1.0-preview1.19506.1 - 3.1.0-preview1.19506.1 - 3.1.0-preview1.19506.1 - 3.1.0-preview1.19506.1 - 3.1.0-preview1.19506.1 - 3.1.0-preview1.19506.1 - 3.1.0-preview1.19506.1 - 3.1.0-preview1.19506.1 - 3.1.0-preview1.19506.1 - 3.1.0-preview1.19506.1 - 3.1.0-preview1.19506.1 - 3.1.0-preview1.19506.1 - 3.1.0-preview1.19506.1 - 3.1.0-preview1.19506.1 - 3.1.0-preview1.19506.1 - 3.1.0-preview1.19506.1 - 3.1.0-preview1.19506.1 - 3.1.0-preview1.19506.1 - 3.1.0-preview1.19506.1 - 3.1.0-preview1.19506.1 - 3.1.0-preview1.19506.1 - 3.1.0-preview1.19506.1 - 3.1.0-preview1.19506.1 - 3.1.0-preview1.19506.1 - 3.1.0-preview1.19506.1 - 3.1.0-preview1.19506.1 - 3.1.0-preview1.19506.1 - 3.1.0-preview1.19506.1 - 3.1.0-preview1.19506.1 - 3.1.0-preview1.19506.1 - 3.1.0-preview1.19506.1 - 3.1.0-preview1.19506.1 - 3.1.0-preview1.19506.1 - 3.1.0-preview1.19506.1 - 3.1.0-preview1.19506.1 - 3.1.0-preview1.19506.1 - 3.1.0-preview1.19506.1 - 3.1.0-preview1.19506.1 - 3.1.0-preview1.19506.1 - 3.1.0-preview1.19506.1 - 3.1.0-preview1.19506.1 - 3.1.0-preview1.19506.1 - 3.1.0-preview1.19506.1 - 3.1.0-preview1.19506.1 - 3.1.0-preview1.19506.1 - 3.1.0-preview1.19506.1 - 3.1.0-preview1.19506.1 - 3.1.0-preview1.19506.1 - 3.1.0-preview1.19506.1 - 3.1.0-preview1.19506.1 - 3.1.0-preview1.19506.1 - 3.1.0-preview1.19506.1 - 3.1.0-preview1.19506.1 - 3.1.0-preview1.19506.1 - 3.1.0-preview1.19506.1 - 3.1.0-preview1.19506.1 - 3.1.0-preview1.19506.1 - 3.1.0-preview1.19506.1 - 3.1.0-preview1.19506.1 - 3.1.0-preview1.19506.1 + 3.1.0-preview2.19518.1 + 3.1.0-preview2.19518.1 + 3.1.0-preview2.19518.1 + 3.1.0-preview2.19518.1 + 3.1.0-preview2.19518.1 + 3.1.0-preview2.19518.1 + 3.1.0-preview2.19518.1 + 3.1.0-preview2.19518.1 + 3.1.0-preview2.19518.1 + 3.1.0-preview2.19518.1 + 3.1.0-preview2.19518.1 + 3.1.0-preview2.19518.1 + 3.1.0-preview2.19518.1 + 3.1.0-preview2.19518.1 + 3.1.0-preview2.19518.1 + 3.1.0-preview2.19518.1 + 3.1.0-preview2.19518.1 + 3.1.0-preview2.19518.1 + 3.1.0-preview2.19518.1 + 3.1.0-preview2.19518.1 + 3.1.0-preview2.19518.1 + 3.1.0-preview2.19518.1 + 3.1.0-preview2.19518.1 + 3.1.0-preview2.19518.1 + 3.1.0-preview2.19518.1 + 3.1.0-preview2.19518.1 + 3.1.0-preview2.19518.1 + 3.1.0-preview2.19518.1 + 3.1.0-preview2.19518.1 + 3.1.0-preview2.19518.1 + 3.1.0-preview2.19518.1 + 3.1.0-preview2.19518.1 + 3.1.0-preview2.19518.1 + 3.1.0-preview2.19518.1 + 3.1.0-preview2.19518.1 + 3.1.0-preview2.19518.1 + 3.1.0-preview2.19518.1 + 3.1.0-preview2.19518.1 + 3.1.0-preview2.19518.1 + 3.1.0-preview2.19518.1 + 3.1.0-preview2.19518.1 + 3.1.0-preview2.19518.1 + 3.1.0-preview2.19518.1 + 3.1.0-preview2.19518.1 + 3.1.0-preview2.19518.1 + 3.1.0-preview2.19518.1 + 3.1.0-preview2.19518.1 + 3.1.0-preview2.19518.1 + 3.1.0-preview2.19518.1 + 3.1.0-preview2.19518.1 + 3.1.0-preview2.19518.1 + 3.1.0-preview2.19518.1 + 3.1.0-preview2.19518.1 + 3.1.0-preview2.19518.1 + 3.1.0-preview2.19518.1 + 3.1.0-preview2.19518.1 + 3.1.0-preview2.19518.1 + 3.1.0-preview2.19518.1 + 3.1.0-preview2.19518.1 + 3.1.0-preview2.19518.1 + 3.1.0-preview2.19518.1 - 3.1.0-preview1.19506.2 - 3.1.0-preview1.19506.2 - 3.1.0-preview1.19506.2 - 3.1.0-preview1.19506.2 - 3.1.0-preview1.19506.2 - 3.1.0-preview1.19506.2 - 3.1.0-preview1.19506.2 + 3.1.0-preview2.19518.7 + 3.1.0-preview2.19518.7 + 3.1.0-preview2.19518.7 + 3.1.0-preview2.19518.7 + 3.1.0-preview2.19518.7 + 3.1.0-preview2.19518.7 + 3.1.0-preview2.19518.7 - 3.1.0-preview1.19508.6 - 3.1.0-preview1.19508.6 - 3.1.0-preview1.19508.6 - 3.1.0-preview1.19508.6 + 3.1.0-preview2.19518.6 + 3.1.0-preview2.19518.6 + 3.1.0-preview2.19518.6 + 3.1.0-preview2.19518.6 - + https://github.com/dotnet/core-setup - 3daa0867abd7693bc654d9b02cdfe957428b36f1 + 3a78795f4d10a6a23af378116cabf429efefea88 - + https://github.com/dotnet/core-setup - 3daa0867abd7693bc654d9b02cdfe957428b36f1 + 3a78795f4d10a6a23af378116cabf429efefea88 - + https://github.com/dotnet/corefx - c4d092f0430a104fa633f1503a1c207b4518f05d + 58dbf71fd0d9593c4bf8a1ecb2d5d4ff6882e782 - + https://github.com/aspnet/Extensions - f47ae22c9cee5a169e1a33c8f4b2067aa326f0a6 + 2f68d18ef7139b6c7577038342464479c7d26c11 https://github.com/dotnet/arcade @@ -424,9 +424,9 @@ https://github.com/dotnet/arcade f70d1fca3d5d4045be75694006f1bee0e0aec572 - + https://github.com/aspnet/Extensions - f47ae22c9cee5a169e1a33c8f4b2067aa326f0a6 + 2f68d18ef7139b6c7577038342464479c7d26c11 https://github.com/dotnet/roslyn diff --git a/eng/Versions.props b/eng/Versions.props index eb6dd340b6..8b32f17a1b 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -66,112 +66,112 @@ 3.4.0-beta3-19518-02 - 3.1.0-preview2.19517.10 - 3.1.0-preview2.19517.10 - 3.1.0-preview2.19517.10 - 2.1.0-preview2.19517.10 + 3.1.0-preview2.19518.8 + 3.1.0-preview2.19518.8 + 3.1.0-preview2.19518.8 + 2.1.0-preview2.19518.8 - 1.1.0-preview2.19516.15 - 4.7.0-preview2.19516.15 - 4.7.0-preview2.19516.15 - 4.7.0-preview2.19516.15 - 4.7.0-preview2.19516.15 - 4.7.0-preview2.19516.15 - 4.7.0-preview2.19516.15 - 4.7.0-preview2.19516.15 - 4.7.0-preview2.19516.15 - 4.7.0-preview2.19516.15 - 1.8.0-preview2.19516.15 - 4.7.0-preview2.19516.15 - 4.7.0-preview2.19516.15 - 4.7.0-preview2.19516.15 - 4.7.0-preview2.19516.15 - 4.7.0-preview2.19516.15 - 4.7.0-preview2.19516.15 - 4.7.0-preview2.19516.15 - 4.7.0-preview2.19516.15 - 4.7.0-preview2.19516.15 - 4.7.0-preview2.19516.15 - 4.7.0-preview2.19516.15 + 1.1.0-preview2.19518.6 + 4.7.0-preview2.19518.6 + 4.7.0-preview2.19518.6 + 4.7.0-preview2.19518.6 + 4.7.0-preview2.19518.6 + 4.7.0-preview2.19518.6 + 4.7.0-preview2.19518.6 + 4.7.0-preview2.19518.6 + 4.7.0-preview2.19518.6 + 4.7.0-preview2.19518.6 + 1.8.0-preview2.19518.6 + 4.7.0-preview2.19518.6 + 4.7.0-preview2.19518.6 + 4.7.0-preview2.19518.6 + 4.7.0-preview2.19518.6 + 4.7.0-preview2.19518.6 + 4.7.0-preview2.19518.6 + 4.7.0-preview2.19518.6 + 4.7.0-preview2.19518.6 + 4.7.0-preview2.19518.6 + 4.7.0-preview2.19518.6 + 4.7.0-preview2.19518.6 - 3.1.0-preview2.19516.15 + 3.1.0-preview2.19518.6 3.1.0-preview1.19503.1 - 3.1.0-preview2.19518.1 - 3.1.0-preview2.19518.1 - 3.1.0-preview2.19518.1 - 3.1.0-preview2.19518.1 - 3.1.0-preview2.19518.1 - 3.1.0-preview2.19518.1 - 3.1.0-preview2.19518.1 - 3.1.0-preview2.19518.1 - 3.1.0-preview2.19518.1 - 3.1.0-preview2.19518.1 - 3.1.0-preview2.19518.1 - 3.1.0-preview2.19518.1 - 3.1.0-preview2.19518.1 - 3.1.0-preview2.19518.1 - 3.1.0-preview2.19518.1 - 3.1.0-preview2.19518.1 - 3.1.0-preview2.19518.1 - 3.1.0-preview2.19518.1 - 3.1.0-preview2.19518.1 - 3.1.0-preview2.19518.1 - 3.1.0-preview2.19518.1 - 3.1.0-preview2.19518.1 - 3.1.0-preview2.19518.1 - 3.1.0-preview2.19518.1 - 3.1.0-preview2.19518.1 - 3.1.0-preview2.19518.1 - 3.1.0-preview2.19518.1 - 3.1.0-preview2.19518.1 - 3.1.0-preview2.19518.1 - 3.1.0-preview2.19518.1 - 3.1.0-preview2.19518.1 - 3.1.0-preview2.19518.1 - 3.1.0-preview2.19518.1 - 3.1.0-preview2.19518.1 - 3.1.0-preview2.19518.1 - 3.1.0-preview2.19518.1 - 3.1.0-preview2.19518.1 - 3.1.0-preview2.19518.1 - 3.1.0-preview2.19518.1 - 3.1.0-preview2.19518.1 - 3.1.0-preview2.19518.1 - 3.1.0-preview2.19518.1 - 3.1.0-preview2.19518.1 - 3.1.0-preview2.19518.1 - 3.1.0-preview2.19518.1 - 3.1.0-preview2.19518.1 - 3.1.0-preview2.19518.1 - 3.1.0-preview2.19518.1 - 3.1.0-preview2.19518.1 - 3.1.0-preview2.19518.1 - 3.1.0-preview2.19518.1 - 3.1.0-preview2.19518.1 - 3.1.0-preview2.19518.1 - 3.1.0-preview2.19518.1 - 3.1.0-preview2.19518.1 - 3.1.0-preview2.19518.1 - 3.1.0-preview2.19518.1 - 3.1.0-preview2.19518.1 - 3.1.0-preview2.19518.1 - 3.1.0-preview2.19518.1 - 3.1.0-preview2.19518.1 + 3.1.0-preview2.19518.29 + 3.1.0-preview2.19518.29 + 3.1.0-preview2.19518.29 + 3.1.0-preview2.19518.29 + 3.1.0-preview2.19518.29 + 3.1.0-preview2.19518.29 + 3.1.0-preview2.19518.29 + 3.1.0-preview2.19518.29 + 3.1.0-preview2.19518.29 + 3.1.0-preview2.19518.29 + 3.1.0-preview2.19518.29 + 3.1.0-preview2.19518.29 + 3.1.0-preview2.19518.29 + 3.1.0-preview2.19518.29 + 3.1.0-preview2.19518.29 + 3.1.0-preview2.19518.29 + 3.1.0-preview2.19518.29 + 3.1.0-preview2.19518.29 + 3.1.0-preview2.19518.29 + 3.1.0-preview2.19518.29 + 3.1.0-preview2.19518.29 + 3.1.0-preview2.19518.29 + 3.1.0-preview2.19518.29 + 3.1.0-preview2.19518.29 + 3.1.0-preview2.19518.29 + 3.1.0-preview2.19518.29 + 3.1.0-preview2.19518.29 + 3.1.0-preview2.19518.29 + 3.1.0-preview2.19518.29 + 3.1.0-preview2.19518.29 + 3.1.0-preview2.19518.29 + 3.1.0-preview2.19518.29 + 3.1.0-preview2.19518.29 + 3.1.0-preview2.19518.29 + 3.1.0-preview2.19518.29 + 3.1.0-preview2.19518.29 + 3.1.0-preview2.19518.29 + 3.1.0-preview2.19518.29 + 3.1.0-preview2.19518.29 + 3.1.0-preview2.19518.29 + 3.1.0-preview2.19518.29 + 3.1.0-preview2.19518.29 + 3.1.0-preview2.19518.29 + 3.1.0-preview2.19518.29 + 3.1.0-preview2.19518.29 + 3.1.0-preview2.19518.29 + 3.1.0-preview2.19518.29 + 3.1.0-preview2.19518.29 + 3.1.0-preview2.19518.29 + 3.1.0-preview2.19518.29 + 3.1.0-preview2.19518.29 + 3.1.0-preview2.19518.29 + 3.1.0-preview2.19518.29 + 3.1.0-preview2.19518.29 + 3.1.0-preview2.19518.29 + 3.1.0-preview2.19518.29 + 3.1.0-preview2.19518.29 + 3.1.0-preview2.19518.29 + 3.1.0-preview2.19518.29 + 3.1.0-preview2.19518.29 + 3.1.0-preview2.19518.29 - 3.1.0-preview2.19518.7 - 3.1.0-preview2.19518.7 - 3.1.0-preview2.19518.7 - 3.1.0-preview2.19518.7 - 3.1.0-preview2.19518.7 - 3.1.0-preview2.19518.7 - 3.1.0-preview2.19518.7 + 3.1.0-preview2.19518.9 + 3.1.0-preview2.19518.9 + 3.1.0-preview2.19518.9 + 3.1.0-preview2.19518.9 + 3.1.0-preview2.19518.9 + 3.1.0-preview2.19518.9 + 3.1.0-preview2.19518.9 - 3.1.0-preview2.19518.6 - 3.1.0-preview2.19518.6 - 3.1.0-preview2.19518.6 - 3.1.0-preview2.19518.6 + 3.1.0-preview2.19518.7 + 3.1.0-preview2.19518.7 + 3.1.0-preview2.19518.7 + 3.1.0-preview2.19518.7 System.InvalidOperationException: There is no currently active test. + // For that reason, we capture the exception here and silence it, as the message is captured inside the Logs + // variable anyway. + Output.WriteLine(log.ToString()); + } + catch (Exception) + { + } } [DebuggerDisplay("{LogLevel.ToString(),nq} - {Message ?? \"null\",nq} - {Exception?.Message,nq}")] From f90c9ac20cbcef4b9a95eda7433cdfd69e6f9b54 Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Mon, 21 Oct 2019 12:45:27 -0700 Subject: [PATCH 24/32] Use MinimumOSVersion in Kestrel (#15228) --- src/Servers/Kestrel/Core/test/AddressBinderTests.cs | 2 +- .../Kestrel/test/KestrelConfigurationBuilderTests.cs | 8 ++++---- .../Kestrel/test/FunctionalTests/Http2/HandshakeTests.cs | 2 +- .../Kestrel/test/FunctionalTests/Http2/ShutdownTests.cs | 2 +- .../test/FunctionalTests/UnixDomainSocketsTests.cs | 2 +- 5 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/Servers/Kestrel/Core/test/AddressBinderTests.cs b/src/Servers/Kestrel/Core/test/AddressBinderTests.cs index 79366d276e..b5305f5c1d 100644 --- a/src/Servers/Kestrel/Core/test/AddressBinderTests.cs +++ b/src/Servers/Kestrel/Core/test/AddressBinderTests.cs @@ -76,8 +76,8 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Tests Assert.False(https); } - [OSSkipCondition(OperatingSystems.Windows, WindowsVersions.Win7, WindowsVersions.Win8, WindowsVersions.Win81, WindowsVersions.Win2008R2, SkipReason = "UnixDomainSocketEndPoint is not supported on older versions of Windows")] [ConditionalFact] + [MinimumOSVersion(OperatingSystems.Windows, WindowsVersions.Win10_RS4)] public void ParseAddressUnixPipe() { var listenOptions = AddressBinder.ParseAddress("http://unix:/tmp/kestrel-test.sock", out var https); diff --git a/src/Servers/Kestrel/Kestrel/test/KestrelConfigurationBuilderTests.cs b/src/Servers/Kestrel/Kestrel/test/KestrelConfigurationBuilderTests.cs index 95fac16c7b..5a47957cdf 100644 --- a/src/Servers/Kestrel/Kestrel/test/KestrelConfigurationBuilderTests.cs +++ b/src/Servers/Kestrel/Kestrel/test/KestrelConfigurationBuilderTests.cs @@ -320,7 +320,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Tests // [InlineData("http2", HttpProtocols.Http2)] // Not supported due to missing ALPN support. https://github.com/dotnet/corefx/issues/33016 [InlineData("http1AndHttp2", HttpProtocols.Http1AndHttp2)] // Gracefully falls back to HTTP/1 [OSSkipCondition(OperatingSystems.Linux)] - [OSSkipCondition(OperatingSystems.Windows, WindowsVersions.Win10, WindowsVersions.Win8, WindowsVersions.Win81)] + [OSSkipCondition(OperatingSystems.Windows, WindowsVersions.Win10, WindowsVersions.Win81)] public void DefaultConfigSectionCanSetProtocols_MacAndWin7(string input, HttpProtocols expected) => DefaultConfigSectionCanSetProtocols(input, expected); @@ -329,7 +329,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Tests [InlineData("http2", HttpProtocols.Http2)] [InlineData("http1AndHttp2", HttpProtocols.Http1AndHttp2)] [OSSkipCondition(OperatingSystems.MacOSX)] - [OSSkipCondition(OperatingSystems.Windows, WindowsVersions.Win7)] + [MinimumOSVersion(OperatingSystems.Windows, WindowsVersions.Win81)] public void DefaultConfigSectionCanSetProtocols_NonMacAndWin7(string input, HttpProtocols expected) => DefaultConfigSectionCanSetProtocols(input, expected); @@ -389,7 +389,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Tests // [InlineData("http2", HttpProtocols.Http2)] // Not supported due to missing ALPN support. https://github.com/dotnet/corefx/issues/33016 [InlineData("http1AndHttp2", HttpProtocols.Http1AndHttp2)] // Gracefully falls back to HTTP/1 [OSSkipCondition(OperatingSystems.Linux)] - [OSSkipCondition(OperatingSystems.Windows, WindowsVersions.Win10, WindowsVersions.Win8, WindowsVersions.Win81)] + [OSSkipCondition(OperatingSystems.Windows, WindowsVersions.Win10, WindowsVersions.Win81)] public void EndpointConfigSectionCanSetProtocols_MacAndWin7(string input, HttpProtocols expected) => EndpointConfigSectionCanSetProtocols(input, expected); @@ -398,7 +398,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Tests [InlineData("http2", HttpProtocols.Http2)] [InlineData("http1AndHttp2", HttpProtocols.Http1AndHttp2)] [OSSkipCondition(OperatingSystems.MacOSX)] - [OSSkipCondition(OperatingSystems.Windows, WindowsVersions.Win7)] + [MinimumOSVersion(OperatingSystems.Windows, WindowsVersions.Win81)] public void EndpointConfigSectionCanSetProtocols_NonMacAndWin7(string input, HttpProtocols expected) => EndpointConfigSectionCanSetProtocols(input, expected); diff --git a/src/Servers/Kestrel/test/FunctionalTests/Http2/HandshakeTests.cs b/src/Servers/Kestrel/test/FunctionalTests/Http2/HandshakeTests.cs index 52e9d0f0c9..aaf101cced 100644 --- a/src/Servers/Kestrel/test/FunctionalTests/Http2/HandshakeTests.cs +++ b/src/Servers/Kestrel/test/FunctionalTests/Http2/HandshakeTests.cs @@ -58,7 +58,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.FunctionalTests.Http2 [ConditionalFact] [OSSkipCondition(OperatingSystems.Linux | OperatingSystems.MacOSX)] - [OSSkipCondition(OperatingSystems.Windows, WindowsVersions.Win10, WindowsVersions.Win8, WindowsVersions.Win81)] + [OSSkipCondition(OperatingSystems.Windows, WindowsVersions.Win10, WindowsVersions.Win81)] // Win7 SslStream is missing ALPN support. public void TlsAndHttp2NotSupportedOnWin7() { diff --git a/src/Servers/Kestrel/test/FunctionalTests/Http2/ShutdownTests.cs b/src/Servers/Kestrel/test/FunctionalTests/Http2/ShutdownTests.cs index 7ddb4deb26..af2b768fd1 100644 --- a/src/Servers/Kestrel/test/FunctionalTests/Http2/ShutdownTests.cs +++ b/src/Servers/Kestrel/test/FunctionalTests/Http2/ShutdownTests.cs @@ -44,7 +44,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.FunctionalTests.Http2 [CollectDump] [ConditionalFact] - [SkipOnHelix("https://github.com/aspnet/AspNetCore/issues/9985", Queues = "Fedora.28.Amd64.Open")] // https://github.com/aspnet/AspNetCore/issues/9985 + [SkipOnHelix("https://github.com/aspnet/AspNetCore/issues/9985", Queues = "Fedora.28.Amd64.Open")] [Flaky("https://github.com/aspnet/AspNetCore/issues/9985", FlakyOn.All)] public async Task GracefulShutdownWaitsForRequestsToFinish() { diff --git a/src/Servers/Kestrel/test/FunctionalTests/UnixDomainSocketsTests.cs b/src/Servers/Kestrel/test/FunctionalTests/UnixDomainSocketsTests.cs index d34ced5292..12fe59d9e8 100644 --- a/src/Servers/Kestrel/test/FunctionalTests/UnixDomainSocketsTests.cs +++ b/src/Servers/Kestrel/test/FunctionalTests/UnixDomainSocketsTests.cs @@ -24,7 +24,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.FunctionalTests #if LIBUV [OSSkipCondition(OperatingSystems.Windows, SkipReason = "Libuv does not support unix domain sockets on Windows.")] #else - [OSSkipCondition(OperatingSystems.Windows, WindowsVersions.Win7, WindowsVersions.Win8, WindowsVersions.Win81, WindowsVersions.Win2008R2, SkipReason = "UnixDomainSocketEndPoint is not supported on older versions of Windows")] + [MinimumOSVersion(OperatingSystems.Windows, WindowsVersions.Win10_RS4)] #endif [ConditionalFact] [CollectDump] From c1389d79af44fa1f05d9ef8345173db93b821fdb Mon Sep 17 00:00:00 2001 From: Ryan Brandenburg Date: Mon, 21 Oct 2019 15:34:55 -0700 Subject: [PATCH 25/32] Identity UI footer fix (#15042) Identity UI footer fix --- src/Identity/UI/src/Areas/Identity/Pages/V4/_Layout.cshtml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/Identity/UI/src/Areas/Identity/Pages/V4/_Layout.cshtml b/src/Identity/UI/src/Areas/Identity/Pages/V4/_Layout.cshtml index 21f5ba6ee3..c19e8e2029 100644 --- a/src/Identity/UI/src/Areas/Identity/Pages/V4/_Layout.cshtml +++ b/src/Identity/UI/src/Areas/Identity/Pages/V4/_Layout.cshtml @@ -56,12 +56,13 @@