|
3 | 3 | using System.ComponentModel; |
4 | 4 | using System.Diagnostics; |
5 | 5 | using System.IO; |
| 6 | +using System.Linq; |
6 | 7 | using System.Xml; |
7 | 8 | using Microsoft.Build.Framework; |
8 | 9 | using Microsoft.Build.Utilities; |
@@ -40,9 +41,24 @@ public bool Execute() |
40 | 41 |
|
41 | 42 | public abstract bool Execute(out IList<Exception> thrownExceptions); |
42 | 43 |
|
43 | | - internal static ILRootNode ParseXaml(Stream stream, TypeReference typeReference) |
| 44 | + internal static ILRootNode ParseXaml(Stream stream, ModuleDefinition module, TypeReference typeReference) |
44 | 45 | { |
45 | | - using (var reader = XmlReader.Create(stream)) |
| 46 | + var allowImplicitXmlns = module.Assembly.CustomAttributes.Any(a => |
| 47 | + a.AttributeType.FullName == typeof(Microsoft.Maui.Controls.Xaml.Internals.AllowImplicitXmlnsDeclarationAttribute).FullName |
| 48 | + && (a.ConstructorArguments.Count == 0 || a.ConstructorArguments[0].Value is bool b && b)); |
| 49 | + |
| 50 | + var nsmgr = new XmlNamespaceManager(new NameTable()); |
| 51 | + nsmgr.AddNamespace("__f__", XamlParser.MauiUri); |
| 52 | + if (allowImplicitXmlns) |
| 53 | + { |
| 54 | + nsmgr.AddNamespace("", XamlParser.DefaultImplicitUri); |
| 55 | + foreach (var xmlnsPrefix in XmlTypeExtensions.GetXmlnsPrefixAttributes(module)) |
| 56 | + nsmgr.AddNamespace(xmlnsPrefix.Prefix, xmlnsPrefix.XmlNamespace); |
| 57 | + } |
| 58 | + |
| 59 | + using (var reader = XmlReader.Create(stream, |
| 60 | + new XmlReaderSettings { ConformanceLevel = allowImplicitXmlns ? ConformanceLevel.Fragment : ConformanceLevel.Document }, |
| 61 | + new XmlParserContext(nsmgr.NameTable, nsmgr, null, XmlSpace.None))) |
46 | 62 | { |
47 | 63 | while (reader.Read()) |
48 | 64 | { |
@@ -73,8 +89,22 @@ public static bool IsXaml(this EmbeddedResource resource, XamlCache cache, Modul |
73 | 89 | if (!resource.Name.EndsWith(".xaml", StringComparison.InvariantCulture)) |
74 | 90 | return false; |
75 | 91 |
|
| 92 | + var allowImplicitXmlns = module.Assembly.CustomAttributes.Any(a => |
| 93 | + a.AttributeType.FullName == typeof(Microsoft.Maui.Controls.Xaml.Internals.AllowImplicitXmlnsDeclarationAttribute).FullName |
| 94 | + && (a.ConstructorArguments.Count == 0 || a.ConstructorArguments[0].Value is bool b && b)); |
| 95 | + |
| 96 | + var nsmgr = new XmlNamespaceManager(new NameTable()); |
| 97 | + nsmgr.AddNamespace("__f__", XamlParser.MauiUri); |
| 98 | + if (allowImplicitXmlns) |
| 99 | + { |
| 100 | + nsmgr.AddNamespace("", XamlParser.DefaultImplicitUri); |
| 101 | + foreach (var xmlnsPrefix in XmlTypeExtensions.GetXmlnsPrefixAttributes(module)) |
| 102 | + nsmgr.AddNamespace(xmlnsPrefix.Prefix, xmlnsPrefix.XmlNamespace); |
| 103 | + } |
76 | 104 | using (var resourceStream = resource.GetResourceStream()) |
77 | | - using (var reader = XmlReader.Create(resourceStream)) |
| 105 | + using (var reader = XmlReader.Create(resourceStream, |
| 106 | + new XmlReaderSettings { ConformanceLevel = allowImplicitXmlns ? ConformanceLevel.Fragment : ConformanceLevel.Document }, |
| 107 | + new XmlParserContext(nsmgr.NameTable, nsmgr, null, XmlSpace.None))) |
78 | 108 | { |
79 | 109 | // Read to the first Element |
80 | 110 | while (reader.Read() && reader.NodeType != XmlNodeType.Element) |
|
0 commit comments