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)