From 24c5519e7199f9b7631c25d7b75876ee69669aec Mon Sep 17 00:00:00 2001 From: Dariusz Komosinski Date: Sat, 7 Dec 2019 18:31:19 +0100 Subject: [PATCH 1/8] Use CondtionalWeakTable to avoid FocusManager becoming a GC root for all focus scopes. --- src/Avalonia.Input/FocusManager.cs | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/src/Avalonia.Input/FocusManager.cs b/src/Avalonia.Input/FocusManager.cs index 77902a7390..a9ce8ee494 100644 --- a/src/Avalonia.Input/FocusManager.cs +++ b/src/Avalonia.Input/FocusManager.cs @@ -4,6 +4,7 @@ using System; using System.Collections.Generic; using System.Linq; +using System.Runtime.CompilerServices; using Avalonia.Interactivity; using Avalonia.VisualTree; @@ -17,8 +18,8 @@ namespace Avalonia.Input /// /// The focus scopes in which the focus is currently defined. /// - private readonly Dictionary _focusScopes = - new Dictionary(); + private readonly ConditionalWeakTable _focusScopes = + new ConditionalWeakTable(); /// /// Initializes a new instance of the class. @@ -110,7 +111,18 @@ namespace Avalonia.Input { Contract.Requires(scope != null); - _focusScopes[scope] = element; + if (_focusScopes.TryGetValue(scope, out IInputElement existingElement)) + { + if (element != existingElement) + { + _focusScopes.Remove(scope); + _focusScopes.Add(scope, element); + } + } + else + { + _focusScopes.Add(scope, element); + } if (Scope == scope) { From a04d0b7bbb8b69416e566069c7f908f3c71dc3fb Mon Sep 17 00:00:00 2001 From: Andrey Kunchev Date: Sun, 8 Dec 2019 00:09:22 +0200 Subject: [PATCH 2/8] add failing test for ControlTemplate don't respect TargetType --- .../Xaml/BasicTests.cs | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/tests/Avalonia.Markup.Xaml.UnitTests/Xaml/BasicTests.cs b/tests/Avalonia.Markup.Xaml.UnitTests/Xaml/BasicTests.cs index f4d4a9dd2a..e6032b7c79 100644 --- a/tests/Avalonia.Markup.Xaml.UnitTests/Xaml/BasicTests.cs +++ b/tests/Avalonia.Markup.Xaml.UnitTests/Xaml/BasicTests.cs @@ -307,6 +307,23 @@ namespace Avalonia.Markup.Xaml.UnitTests.Xaml Assert.Equal("child", child.Name); } + [Fact] + public void ControlTemplate_With_TargetType_Is_Operational() + { + var xaml = @" + + + +"; + var template = AvaloniaXamlLoader.Parse(xaml); + + Assert.Equal(typeof(ContentControl), template.TargetType); + + Assert.IsType(typeof(ContentPresenter), template.Build(new ContentControl()).Control); + } + [Fact] public void ControlTemplate_With_Panel_Children_Are_Added() { From 97f57c7beceefc4449a15566d351d7b3654758d1 Mon Sep 17 00:00:00 2001 From: Andrey Kunchev Date: Sun, 8 Dec 2019 00:11:59 +0200 Subject: [PATCH 3/8] add test for style resources --- .../Xaml/StyleTests.cs | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/tests/Avalonia.Markup.Xaml.UnitTests/Xaml/StyleTests.cs b/tests/Avalonia.Markup.Xaml.UnitTests/Xaml/StyleTests.cs index b76022852c..9c6fa6d10d 100644 --- a/tests/Avalonia.Markup.Xaml.UnitTests/Xaml/StyleTests.cs +++ b/tests/Avalonia.Markup.Xaml.UnitTests/Xaml/StyleTests.cs @@ -5,6 +5,7 @@ using System.Xml; using Avalonia.Controls; using Avalonia.Markup.Data; using Avalonia.Markup.Xaml.Styling; +using Avalonia.Markup.Xaml.Templates; using Avalonia.Media; using Avalonia.Styling; using Avalonia.UnitTests; @@ -38,6 +39,30 @@ namespace Avalonia.Markup.Xaml.UnitTests.Xaml } } + [Fact] + public void DataTemplate_Can_Be_Added_To_Style_Resources() + { + using (UnitTestApplication.Start(TestServices.MockPlatformWrapper)) + { + var xaml = @" + + + + +"; + var loader = new AvaloniaXamlLoader(); + var userControl = (UserControl)loader.Load(xaml); + var dataTemplate = (DataTemplate)((Style)userControl.Styles[0]).Resources["dataTemplate"]; + + Assert.NotNull(dataTemplate); + } + } + [Fact] public void SolidColorBrush_Can_Be_Added_To_Style_Resources() { From 73be933bd017f77e2e4846a771c8c5d4d09c8425 Mon Sep 17 00:00:00 2001 From: Andrey Kunchev Date: Sun, 8 Dec 2019 00:13:46 +0200 Subject: [PATCH 4/8] add failing test for ControlTemplate can't be added to resources #3145 --- .../Xaml/StyleTests.cs | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/tests/Avalonia.Markup.Xaml.UnitTests/Xaml/StyleTests.cs b/tests/Avalonia.Markup.Xaml.UnitTests/Xaml/StyleTests.cs index 9c6fa6d10d..f7629e5b9e 100644 --- a/tests/Avalonia.Markup.Xaml.UnitTests/Xaml/StyleTests.cs +++ b/tests/Avalonia.Markup.Xaml.UnitTests/Xaml/StyleTests.cs @@ -63,6 +63,33 @@ namespace Avalonia.Markup.Xaml.UnitTests.Xaml } } + [Fact] + public void ControlTemplate_Can_Be_Added_To_Style_Resources() + { + using (UnitTestApplication.Start(TestServices.MockPlatformWrapper)) + { + var xaml = @" + + + + +"; + var loader = new AvaloniaXamlLoader(); + var userControl = (UserControl)loader.Load(xaml); + var controlTemplate = (ControlTemplate)((Style)userControl.Styles[0]).Resources["controlTemplate"]; + + Assert.NotNull(controlTemplate); + Assert.Equal(typeof(Button), controlTemplate.TargetType); + } + } + [Fact] public void SolidColorBrush_Can_Be_Added_To_Style_Resources() { From b1cc2a1d9cc2307885dadc8f15f7d1a91d25eaa2 Mon Sep 17 00:00:00 2001 From: Andrey Kunchev Date: Sun, 8 Dec 2019 00:17:56 +0200 Subject: [PATCH 5/8] enable valid xamlil test (disabled before because of portable.xaml) --- tests/Avalonia.Markup.Xaml.UnitTests/Xaml/BasicTests.cs | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/tests/Avalonia.Markup.Xaml.UnitTests/Xaml/BasicTests.cs b/tests/Avalonia.Markup.Xaml.UnitTests/Xaml/BasicTests.cs index e6032b7c79..eaf9f22406 100644 --- a/tests/Avalonia.Markup.Xaml.UnitTests/Xaml/BasicTests.cs +++ b/tests/Avalonia.Markup.Xaml.UnitTests/Xaml/BasicTests.cs @@ -721,11 +721,7 @@ namespace Avalonia.Markup.Xaml.UnitTests.Xaml } } - - [Fact(Skip = -@"Doesn't work with Portable.xaml, it's working in different creation order - -Handled in test 'Control_Is_Added_To_Parent_Before_Final_EndInit' -do we need it?")] + [Fact] public void Control_Is_Added_To_Parent_Before_Properties_Are_Set() { using (UnitTestApplication.Start(TestServices.StyledWindow)) From 64d8b4ef5b006fffc10be46bafc7d18b1415f0e3 Mon Sep 17 00:00:00 2001 From: Andrey Kunchev Date: Sun, 8 Dec 2019 00:22:30 +0200 Subject: [PATCH 6/8] respect TargetType in controltemplate --- ...valoniaXamlIlControlTemplateTargetTypeMetadataTransformer.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Markup/Avalonia.Markup.Xaml/XamlIl/CompilerExtensions/Transformers/AvaloniaXamlIlControlTemplateTargetTypeMetadataTransformer.cs b/src/Markup/Avalonia.Markup.Xaml/XamlIl/CompilerExtensions/Transformers/AvaloniaXamlIlControlTemplateTargetTypeMetadataTransformer.cs index aab43bbd6f..40386924c3 100644 --- a/src/Markup/Avalonia.Markup.Xaml/XamlIl/CompilerExtensions/Transformers/AvaloniaXamlIlControlTemplateTargetTypeMetadataTransformer.cs +++ b/src/Markup/Avalonia.Markup.Xaml/XamlIl/CompilerExtensions/Transformers/AvaloniaXamlIlControlTemplateTargetTypeMetadataTransformer.cs @@ -25,7 +25,7 @@ namespace Avalonia.Markup.Xaml.XamlIl.CompilerExtensions.Transformers if ((tt?.Values.FirstOrDefault() is XamlIlTypeExtensionNode tn)) { - targetType = tn.Type; + targetType = tn.Value; } else { From 88ca29cdf2d750aecf6a96b9e3e5b2f49ca48f21 Mon Sep 17 00:00:00 2001 From: Andrey Kunchev Date: Sun, 8 Dec 2019 00:38:51 +0200 Subject: [PATCH 7/8] fixed issue #3145 in xamlil --- src/Markup/Avalonia.Markup.Xaml/XamlIl/xamlil.github | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Markup/Avalonia.Markup.Xaml/XamlIl/xamlil.github b/src/Markup/Avalonia.Markup.Xaml/XamlIl/xamlil.github index ad9915e193..dadd6e1358 160000 --- a/src/Markup/Avalonia.Markup.Xaml/XamlIl/xamlil.github +++ b/src/Markup/Avalonia.Markup.Xaml/XamlIl/xamlil.github @@ -1 +1 @@ -Subproject commit ad9915e19398a49c5a11b66000c361659ca692b3 +Subproject commit dadd6e13581eff304ccda6bbc9f7685338c580c6 From 59c46572f6fb4921f064fc21d12bacba750c41cc Mon Sep 17 00:00:00 2001 From: Andrey Kunchev Date: Sun, 8 Dec 2019 10:48:33 +0200 Subject: [PATCH 8/8] update submodule back to main xamlil repo --- src/Markup/Avalonia.Markup.Xaml/XamlIl/xamlil.github | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Markup/Avalonia.Markup.Xaml/XamlIl/xamlil.github b/src/Markup/Avalonia.Markup.Xaml/XamlIl/xamlil.github index dadd6e1358..4c4b6cf8ff 160000 --- a/src/Markup/Avalonia.Markup.Xaml/XamlIl/xamlil.github +++ b/src/Markup/Avalonia.Markup.Xaml/XamlIl/xamlil.github @@ -1 +1 @@ -Subproject commit dadd6e13581eff304ccda6bbc9f7685338c580c6 +Subproject commit 4c4b6cf8ff0894c925d87b27d4fc7a064440c218