@joebigelow / wix-1 / commits / 0b338100

Centralize disallow inner text handling in ParseHalper

Fixes wixtoolset/issues#6237

Rob Mensching committed Mar 16, 2021 at 14:48 UTC 0b3381007cb201d5ee28aa80990cd14a1c376f18
6 files changed +48 -45
src/WixToolset.Core/Compiler.cs
+1 -5
@@ -3399,8 +3399,6 @@ namespace WixToolset.Core
3399 win64 = true;
3400 }
3401
3402 - this.Core.VerifyNoInnerText(sourceLineNumbers, node);
3403 -
3402 // if we have an in-lined Script CustomAction ensure no source or target attributes were provided
3403 if (inlineScript)
3404 {
@@ -4125,7 +4123,7 @@ namespace WixToolset.Core
4123 }
4124 }
4125
4128 - this.Core.VerifyNoInnerText(sourceLineNumbers, node);
4126 + this.Core.InnerTextDisallowed(node);
4127
4128 if (null == columnName)
4129 {
@@ -5365,8 +5363,6 @@ namespace WixToolset.Core
5363 }
5364 }
5365
5368 - this.Core.VerifyNoInnerText(sourceLineNumbers, node);
5369 -
5366 if (CompilerConstants.IntegerNotSet == id)
5367 {
5368 this.Core.Write(ErrorMessages.ExpectedAttribute(sourceLineNumbers, node.Name.LocalName, "Id"));
src/WixToolset.Core/CompilerCore.cs
+5 -9
@@ -206,6 +206,11 @@ namespace WixToolset.Core
206 return false;
207 }
208
209 + internal void InnerTextDisallowed(XElement element)
210 + {
211 + this.parseHelper.InnerTextDisallowed(element);
212 + }
213 +
214 /// <summary>
215 /// Verifies that a filename is ambiguous.
216 /// </summary>
@@ -1103,15 +1108,6 @@ namespace WixToolset.Core
1108 return this.parseHelper.ScheduleActionSymbol(this.ActiveSection, sourceLineNumbers, access, sequence, actionName, condition, beforeAction, afterAction, overridable);
1109 }
1110
1106 - internal void VerifyNoInnerText(SourceLineNumber sourceLineNumbers, XElement element)
1107 - {
1108 - var innerText = Common.GetInnerText(element);
1109 - if (!String.IsNullOrWhiteSpace(innerText))
1110 - {
1111 - this.messaging.Write(ErrorMessages.IllegalInnerText(sourceLineNumbers, element.Name.LocalName, innerText));
1112 - }
1113 - }
1114 -
1111 private static string CreateValueList(ValueListKind kind, IEnumerable<string> values)
1112 {
1113 // Ideally, we could denote the list kind (and the list itself) directly in the
src/WixToolset.Core/Compiler_EmbeddedUI.cs
+2 -2
@@ -80,8 +80,6 @@ namespace WixToolset.Core
80 }
81 }
82
83 - this.Core.VerifyNoInnerText(sourceLineNumbers, node);
84 -
83 if (null == id)
84 {
85 id = this.Core.CreateIdentifier("mec", source, type.ToString());
@@ -92,6 +90,8 @@ namespace WixToolset.Core
90 this.Core.Write(ErrorMessages.ExpectedAttributes(sourceLineNumbers, node.Name.LocalName, "BinarySource", "FileSource", "PropertySource"));
91 }
92
93 + this.Core.ParseForExtensionElements(node);
94 +
95 if (!this.Core.EncounteredError)
96 {
97 this.Core.AddSymbol(new MsiEmbeddedChainerSymbol(sourceLineNumbers, id)
src/WixToolset.Core/Compiler_Package.cs
+4 -18
@@ -1157,8 +1157,6 @@ namespace WixToolset.Core
1157 }
1158 }
1159
1160 - this.Core.VerifyNoInnerText(sourceLineNumbers, node);
1161 -
1160 if (null == sddl)
1161 {
1162 this.Core.Write(ErrorMessages.ExpectedAttribute(sourceLineNumbers, node.Name.LocalName, "Sddl"));
@@ -1447,8 +1445,6 @@ namespace WixToolset.Core
1445 this.Core.Write(ErrorMessages.CannotAuthorSpecialProperties(sourceLineNumbers, id.Id));
1446 }
1447
1450 - this.Core.VerifyNoInnerText(sourceLineNumbers, node);
1451 -
1448 if ("ErrorDialog" == id.Id)
1449 {
1450 this.Core.CreateSimpleReference(sourceLineNumbers, SymbolDefinitions.Dialog, value);
@@ -1473,6 +1469,8 @@ namespace WixToolset.Core
1469 }
1470 }
1471
1472 + this.Core.InnerTextDisallowed(node);
1473 +
1474 // see if this property is used for appSearch
1475 var signatures = this.ParseSearchSignatures(node);
1476
@@ -1986,8 +1984,6 @@ namespace WixToolset.Core
1984 }
1985 }
1986
1989 - this.Core.VerifyNoInnerText(sourceLineNumbers, node);
1990 -
1987 this.Core.ParseForExtensionElements(node);
1988
1989 return null == value ? multiStringValue ?? "[~]" : String.Concat(value, "[~]", multiStringValue);
@@ -2547,8 +2543,6 @@ namespace WixToolset.Core
2543 }
2544 }
2545
2550 - this.Core.VerifyNoInnerText(childSourceLineNumbers, node);
2551 -
2546 if (customAction && "Custom" == actionName)
2547 {
2548 this.Core.Write(ErrorMessages.ExpectedAttribute(childSourceLineNumbers, child.Name.LocalName, "Action"));
@@ -2637,6 +2631,8 @@ namespace WixToolset.Core
2631 }
2632 }
2633 }
2634 +
2635 + this.Core.InnerTextDisallowed(node);
2636 }
2637
2638
@@ -3012,8 +3008,6 @@ namespace WixToolset.Core
3008 }
3009 }
3010
3015 - this.Core.VerifyNoInnerText(sourceLineNumbers, node);
3016 -
3011 if (privilege == null)
3012 {
3013 this.Core.Write(ErrorMessages.ExpectedAttribute(sourceLineNumbers, node.Name.LocalName, "Name"));
@@ -3375,8 +3369,6 @@ namespace WixToolset.Core
3369 }
3370 }
3371
3378 - this.Core.VerifyNoInnerText(sourceLineNumbers, node);
3379 -
3372 if (argument == null)
3373 {
3374 this.Core.Write(ErrorMessages.ExpectedAttribute(sourceLineNumbers, node.Name.LocalName, "Value"));
@@ -3715,8 +3707,6 @@ namespace WixToolset.Core
3707 }
3708 }
3709
3718 - this.Core.VerifyNoInnerText(sourceLineNumbers, node);
3719 -
3710 if (null == id)
3711 {
3712 this.Core.Write(ErrorMessages.ExpectedAttribute(sourceLineNumbers, node.Name.LocalName, "Id"));
@@ -3824,8 +3814,6 @@ namespace WixToolset.Core
3814 }
3815 }
3816
3827 - this.Core.VerifyNoInnerText(sourceLineNumbers, node);
3828 -
3817 if (null == id)
3818 {
3819 this.Core.Write(ErrorMessages.ExpectedAttribute(sourceLineNumbers, node.Name.LocalName, "Id"));
@@ -4304,8 +4292,6 @@ namespace WixToolset.Core
4292 }
4293 }
4294
4307 - this.Core.VerifyNoInnerText(sourceLineNumbers, node);
4308 -
4295 if (String.IsNullOrEmpty(key))
4296 {
4297 this.Core.Write(ErrorMessages.ExpectedAttribute(sourceLineNumbers, node.Name.LocalName, "Key"));
src/WixToolset.Core/Compiler_UI.cs
+3 -7
@@ -700,8 +700,6 @@ namespace WixToolset.Core
700 this.Core.Write(ErrorMessages.ExpectedAttribute(sourceLineNumbers, node.Name.LocalName, "Action"));
701 }
702
703 - this.Core.VerifyNoInnerText(sourceLineNumbers, node);
704 -
703 this.Core.ParseForExtensionElements(node);
704
705 if (!this.Core.EncounteredError)
@@ -748,8 +746,6 @@ namespace WixToolset.Core
746 }
747 }
748
751 - this.Core.VerifyNoInnerText(sourceLineNumbers, node);
752 -
749 if (null == id)
750 {
751 id = this.Core.CreateIdentifier("txt", text);
@@ -1425,7 +1421,7 @@ namespace WixToolset.Core
1421 }
1422 }
1423
1428 - this.Core.VerifyNoInnerText(sourceLineNumbers, node);
1424 + this.Core.InnerTextDisallowed(child);
1425
1426 if (!String.IsNullOrEmpty(text) && null != sourceFile)
1427 {
@@ -1443,6 +1439,8 @@ namespace WixToolset.Core
1439 }
1440 }
1441
1442 + this.Core.InnerTextDisallowed(node);
1443 +
1444 // If the radio buttons have icons, then we need to add the icon attribute.
1445 switch (radioButtonsType)
1446 {
@@ -1694,8 +1692,6 @@ namespace WixToolset.Core
1692 }
1693 }
1694
1697 - this.Core.VerifyNoInnerText(sourceLineNumbers, node);
1698 -
1695 if (null == control)
1696 {
1697 this.Core.Write(ErrorMessages.ExpectedAttribute(sourceLineNumbers, node.Name.LocalName, "Control"));
src/WixToolset.Core/ExtensibilityServices/ParseHelper.cs
+33 -4
@@ -6,6 +6,8 @@ namespace WixToolset.Core.ExtensibilityServices
6 using System.Collections.Generic;
7 using System.Diagnostics;
8 using System.Globalization;
9 + using System.Linq;
10 + using System.Xml;
11 using System.Xml.Linq;
12 using WixToolset.Data;
13 using WixToolset.Data.Symbols;
@@ -642,6 +644,19 @@ namespace WixToolset.Core.ExtensibilityServices
644 return value?.Trim();
645 }
646
647 + public void InnerTextDisallowed(XElement element)
648 + {
649 + if (element.Nodes().Any(n => XmlNodeType.Text == n.NodeType || XmlNodeType.CDATA == n.NodeType))
650 + {
651 + var innerText = Common.GetInnerText(element);
652 + if (!String.IsNullOrWhiteSpace(innerText))
653 + {
654 + var sourceLineNumbers = this.GetSourceLineNumbers(element);
655 + this.Messaging.Write(ErrorMessages.IllegalInnerText(sourceLineNumbers, element.Name.LocalName, innerText));
656 + }
657 + }
658 + }
659 +
660 public bool IsValidIdentifier(string value)
661 {
662 return Common.IsIdentifier(value);
@@ -714,17 +729,31 @@ namespace WixToolset.Core.ExtensibilityServices
729
730 public void ParseForExtensionElements(IEnumerable<ICompilerExtension> extensions, Intermediate intermediate, IntermediateSection section, XElement element)
731 {
717 - foreach (var child in element.Elements())
732 + var checkInnerText = false;
733 +
734 + foreach (var child in element.Nodes())
735 {
719 - if (element.Name.Namespace == child.Name.Namespace)
736 + if (child is XElement childElement)
737 {
721 - this.UnexpectedElement(element, child);
738 + if (element.Name.Namespace == childElement.Name.Namespace)
739 + {
740 + this.UnexpectedElement(element, childElement);
741 + }
742 + else
743 + {
744 + this.ParseExtensionElement(extensions, intermediate, section, element, childElement);
745 + }
746 }
747 else
748 {
725 - this.ParseExtensionElement(extensions, intermediate, section, element, child);
749 + checkInnerText = true;
750 }
751 }
752 +
753 + if (checkInnerText)
754 + {
755 + this.InnerTextDisallowed(element);
756 + }
757 }
758
759 public WixActionSymbol ScheduleActionSymbol(IntermediateSection section, SourceLineNumber sourceLineNumbers, AccessModifier access, SequenceTable sequence, string actionName, string condition, string beforeAction, string afterAction, bool overridable = false)