From c4ffb9967e4e4f7d67f5925208e3e0a885e903c5 Mon Sep 17 00:00:00 2001 From: Bob Arnson Date: Mon, 21 Nov 2022 16:57:23 -0500 Subject: Better solution to the UI custom action "problem." Add platform-specific fragments that are referenced by the compiler extension. That makes it easier to customize: Just copy the dialog set authoring and rename, like in v3. --- .../test/WixToolsetTest.UI/UIExtensionFixture.cs | 80 ++++++++++++++++------ src/ext/UI/wixext/UICompiler.cs | 40 +---------- src/ext/UI/wixlib/AdvancedWelcomeEulaDlg.wxs | 6 +- src/ext/UI/wixlib/Common_Platform.wxi | 16 +++-- src/ext/UI/wixlib/LicenseAgreementDlg.wxs | 6 +- src/ext/UI/wixlib/WelcomeEulaDlg.wxs | 6 +- src/ext/UI/wixlib/WixUI_Advanced.wxs | 14 +++- src/ext/UI/wixlib/WixUI_FeatureTree.wxs | 10 ++- src/ext/UI/wixlib/WixUI_InstallDir.wxs | 14 +++- src/ext/UI/wixlib/WixUI_Minimal.wxs | 10 ++- src/ext/UI/wixlib/WixUI_Mondo.wxs | 12 +++- src/ext/UI/wixlib/ui.wixproj | 16 ++--- 12 files changed, 133 insertions(+), 97 deletions(-) (limited to 'src') diff --git a/src/ext/UI/test/WixToolsetTest.UI/UIExtensionFixture.cs b/src/ext/UI/test/WixToolsetTest.UI/UIExtensionFixture.cs index 4fd203c5..c637b5dd 100644 --- a/src/ext/UI/test/WixToolsetTest.UI/UIExtensionFixture.cs +++ b/src/ext/UI/test/WixToolsetTest.UI/UIExtensionFixture.cs @@ -20,7 +20,7 @@ namespace WixToolsetTest.UI var bindFolder = TestData.Get(@"TestData\data"); var build = new Builder(folder, typeof(UIExtensionFactory), new[] { bindFolder }); - var results = build.BuildAndQuery(Build, "Binary", "Dialog", "CustomAction"); + var results = build.BuildAndQuery(Build, "Binary", "Dialog", "CustomAction", "ControlEvent"); Assert.Single(results, result => result.StartsWith("Dialog:AdvancedWelcomeEulaDlg\t")); WixAssert.CompareLineByLine(new[] { @@ -38,9 +38,15 @@ namespace WixToolsetTest.UI "CustomAction:WixSetDefaultPerUserFolder\t51\tWixPerUserFolder\t[LocalAppDataFolder]Apps\\[ApplicationFolderName]\t", "CustomAction:WixSetPerMachineFolder\t51\tAPPLICATIONFOLDER\t[WixPerMachineFolder]\t", "CustomAction:WixSetPerUserFolder\t51\tAPPLICATIONFOLDER\t[WixPerUserFolder]\t", - "CustomAction:WixUIPrintEula\t65\tWixUiCa_X86\tPrintEula\t", - "CustomAction:WixUIValidatePath\t65\tWixUiCa_X86\tValidatePath\t", + "CustomAction:WixUIPrintEula_X86\t65\tWixUiCa_X86\tPrintEula\t", + "CustomAction:WixUIValidatePath_X86\t65\tWixUiCa_X86\tValidatePath\t", }, results.Where(r => r.StartsWith("CustomAction:")).ToArray()); + WixAssert.CompareLineByLine(new[] + { + "ControlEvent:AdvancedWelcomeEulaDlg\tPrint\tDoAction\tWixUIPrintEula_X86\t1\t1", + "ControlEvent:BrowseDlg\tOK\tDoAction\tWixUIValidatePath_X86\tNOT WIXUI_DONTVALIDATEPATH\t1", + "ControlEvent:InstallDirDlg\tNext\tDoAction\tWixUIValidatePath_X86\tNOT WIXUI_DONTVALIDATEPATH\t2", + }, results.Where(result => result.StartsWith("ControlEvent:") && result.Contains("DoAction")).ToArray()); } [Fact] @@ -50,7 +56,7 @@ namespace WixToolsetTest.UI var bindFolder = TestData.Get(@"TestData\data"); var build = new Builder(folder, typeof(UIExtensionFactory), new[] { bindFolder }); - var results = build.BuildAndQuery(BuildX64, "Binary", "Dialog", "CustomAction"); + var results = build.BuildAndQuery(BuildX64, "Binary", "Dialog", "CustomAction", "ControlEvent"); Assert.Single(results, result => result.StartsWith("Dialog:AdvancedWelcomeEulaDlg\t")); WixAssert.CompareLineByLine(new[] { @@ -68,9 +74,15 @@ namespace WixToolsetTest.UI "CustomAction:WixSetDefaultPerUserFolder\t51\tWixPerUserFolder\t[LocalAppDataFolder]Apps\\[ApplicationFolderName]\t", "CustomAction:WixSetPerMachineFolder\t51\tAPPLICATIONFOLDER\t[WixPerMachineFolder]\t", "CustomAction:WixSetPerUserFolder\t51\tAPPLICATIONFOLDER\t[WixPerUserFolder]\t", - "CustomAction:WixUIPrintEula\t65\tWixUiCa_X64\tPrintEula\t", - "CustomAction:WixUIValidatePath\t65\tWixUiCa_X64\tValidatePath\t", + "CustomAction:WixUIPrintEula_X64\t65\tWixUiCa_X64\tPrintEula\t", + "CustomAction:WixUIValidatePath_X64\t65\tWixUiCa_X64\tValidatePath\t", }, results.Where(r => r.StartsWith("CustomAction:")).ToArray()); + WixAssert.CompareLineByLine(new[] + { + "ControlEvent:AdvancedWelcomeEulaDlg\tPrint\tDoAction\tWixUIPrintEula_X64\t1\t1", + "ControlEvent:BrowseDlg\tOK\tDoAction\tWixUIValidatePath_X64\tNOT WIXUI_DONTVALIDATEPATH\t1", + "ControlEvent:InstallDirDlg\tNext\tDoAction\tWixUIValidatePath_X64\tNOT WIXUI_DONTVALIDATEPATH\t2", + }, results.Where(result => result.StartsWith("ControlEvent:") && result.Contains("DoAction")).ToArray()); } [Fact] @@ -80,7 +92,7 @@ namespace WixToolsetTest.UI var bindFolder = TestData.Get(@"TestData\data"); var build = new Builder(folder, typeof(UIExtensionFactory), new[] { bindFolder }); - var results = build.BuildAndQuery(BuildARM64, "Binary", "Dialog", "CustomAction"); + var results = build.BuildAndQuery(BuildARM64, "Binary", "Dialog", "CustomAction", "ControlEvent"); Assert.Single(results, result => result.StartsWith("Dialog:AdvancedWelcomeEulaDlg\t")); WixAssert.CompareLineByLine(new[] { @@ -98,9 +110,15 @@ namespace WixToolsetTest.UI "CustomAction:WixSetDefaultPerUserFolder\t51\tWixPerUserFolder\t[LocalAppDataFolder]Apps\\[ApplicationFolderName]\t", "CustomAction:WixSetPerMachineFolder\t51\tAPPLICATIONFOLDER\t[WixPerMachineFolder]\t", "CustomAction:WixSetPerUserFolder\t51\tAPPLICATIONFOLDER\t[WixPerUserFolder]\t", - "CustomAction:WixUIPrintEula\t65\tWixUiCa_A64\tPrintEula\t", - "CustomAction:WixUIValidatePath\t65\tWixUiCa_A64\tValidatePath\t", + "CustomAction:WixUIPrintEula_A64\t65\tWixUiCa_A64\tPrintEula\t", + "CustomAction:WixUIValidatePath_A64\t65\tWixUiCa_A64\tValidatePath\t", }, results.Where(r => r.StartsWith("CustomAction:")).ToArray()); + WixAssert.CompareLineByLine(new[] + { + "ControlEvent:AdvancedWelcomeEulaDlg\tPrint\tDoAction\tWixUIPrintEula_A64\t1\t1", + "ControlEvent:BrowseDlg\tOK\tDoAction\tWixUIValidatePath_A64\tNOT WIXUI_DONTVALIDATEPATH\t1", + "ControlEvent:InstallDirDlg\tNext\tDoAction\tWixUIValidatePath_A64\tNOT WIXUI_DONTVALIDATEPATH\t2", + }, results.Where(result => result.StartsWith("ControlEvent:") && result.Contains("DoAction")).ToArray()); } [Fact] @@ -110,7 +128,7 @@ namespace WixToolsetTest.UI var bindFolder = TestData.Get(@"TestData\data"); var build = new Builder(folder, typeof(UIExtensionFactory), new[] { bindFolder }); - var results = build.BuildAndQuery(Build, "Binary", "Dialog", "CustomAction"); + var results = build.BuildAndQuery(BuildX64, "Binary", "Dialog", "CustomAction", "ControlEvent"); Assert.Single(results, result => result.StartsWith("Dialog:WelcomeDlg\t")); Assert.Single(results, result => result.StartsWith("Dialog:CustomizeDlg\t")); Assert.Empty(results.Where(result => result.StartsWith("Dialog:SetupTypeDlg\t"))); @@ -122,13 +140,16 @@ namespace WixToolsetTest.UI "Binary:WixUI_Bmp_Up\t[Binary data]", "Binary:WixUI_Ico_Exclam\t[Binary data]", "Binary:WixUI_Ico_Info\t[Binary data]", - "Binary:WixUiCa_X86\t[Binary data]", + "Binary:WixUiCa_X64\t[Binary data]", }, results.Where(r => r.StartsWith("Binary:")).ToArray()); WixAssert.CompareLineByLine(new[] { - "CustomAction:WixUIPrintEula\t65\tWixUiCa_X86\tPrintEula\t", - "CustomAction:WixUIValidatePath\t65\tWixUiCa_X86\tValidatePath\t", + "CustomAction:WixUIPrintEula_X64\t65\tWixUiCa_X64\tPrintEula\t", }, results.Where(r => r.StartsWith("CustomAction:")).ToArray()); + WixAssert.CompareLineByLine(new[] + { + "ControlEvent:LicenseAgreementDlg\tPrint\tDoAction\tWixUIPrintEula_X64\t1\t1", + }, results.Where(result => result.StartsWith("ControlEvent:") && result.Contains("DoAction")).ToArray()); } [Fact] @@ -138,7 +159,7 @@ namespace WixToolsetTest.UI var bindFolder = TestData.Get(@"TestData\data"); var build = new Builder(folder, typeof(UIExtensionFactory), new[] { bindFolder }); - var results = build.BuildAndQuery(Build, "Binary", "Dialog", "CustomAction", "Property"); + var results = build.BuildAndQuery(Build, "Binary", "Dialog", "CustomAction", "Property", "ControlEvent"); Assert.Single(results, result => result.StartsWith("Dialog:InstallDirDlg\t")); WixAssert.CompareLineByLine(new[] { @@ -152,13 +173,19 @@ namespace WixToolsetTest.UI }, results.Where(r => r.StartsWith("Binary:")).ToArray()); WixAssert.CompareLineByLine(new[] { - "CustomAction:WixUIPrintEula\t65\tWixUiCa_X86\tPrintEula\t", - "CustomAction:WixUIValidatePath\t65\tWixUiCa_X86\tValidatePath\t", + "CustomAction:WixUIPrintEula_X86\t65\tWixUiCa_X86\tPrintEula\t", + "CustomAction:WixUIValidatePath_X86\t65\tWixUiCa_X86\tValidatePath\t", }, results.Where(r => r.StartsWith("CustomAction:")).ToArray()); WixAssert.CompareLineByLine(new[] { "Property:WIXUI_INSTALLDIR\tINSTALLFOLDER", }, results.Where(r => r.StartsWith("Property:WIXUI")).ToArray()); + WixAssert.CompareLineByLine(new[] + { + "ControlEvent:BrowseDlg\tOK\tDoAction\tWixUIValidatePath_X86\tNOT WIXUI_DONTVALIDATEPATH\t3", + "ControlEvent:InstallDirDlg\tNext\tDoAction\tWixUIValidatePath_X86\tNOT WIXUI_DONTVALIDATEPATH\t2", + "ControlEvent:LicenseAgreementDlg\tPrint\tDoAction\tWixUIPrintEula_X86\t1\t1", + }, results.Where(result => result.StartsWith("ControlEvent:") && result.Contains("DoAction")).OrderBy(s => s).ToArray()); } [Fact] @@ -168,7 +195,7 @@ namespace WixToolsetTest.UI var bindFolder = TestData.Get(@"TestData\data"); var build = new Builder(folder, typeof(UIExtensionFactory), new[] { bindFolder }); - var results = build.BuildAndQuery(Build, "Binary", "Dialog", "CustomAction"); + var results = build.BuildAndQuery(Build, "Binary", "Dialog", "CustomAction", "ControlEvent"); Assert.Single(results, result => result.StartsWith("Dialog:WelcomeEulaDlg\t")); WixAssert.CompareLineByLine(new[] { @@ -182,9 +209,12 @@ namespace WixToolsetTest.UI }, results.Where(r => r.StartsWith("Binary:")).ToArray()); WixAssert.CompareLineByLine(new[] { - "CustomAction:WixUIPrintEula\t65\tWixUiCa_X86\tPrintEula\t", - "CustomAction:WixUIValidatePath\t65\tWixUiCa_X86\tValidatePath\t", + "CustomAction:WixUIPrintEula_X86\t65\tWixUiCa_X86\tPrintEula\t", }, results.Where(r => r.StartsWith("CustomAction:")).ToArray()); + WixAssert.CompareLineByLine(new[] + { + "ControlEvent:WelcomeEulaDlg\tPrint\tDoAction\tWixUIPrintEula_X86\t1\t1", + }, results.Where(result => result.StartsWith("ControlEvent:") && result.Contains("DoAction")).OrderBy(s => s).ToArray()); } [Fact] @@ -232,7 +262,7 @@ namespace WixToolsetTest.UI var bindFolder = TestData.Get(@"TestData\data"); var build = new Builder(folder, typeof(UIExtensionFactory), new[] { bindFolder }); - var results = build.BuildAndQuery(Build, "Binary", "Dialog", "CustomAction"); + var results = build.BuildAndQuery(Build, "Binary", "Dialog", "CustomAction", "ControlEvent"); Assert.Single(results, result => result.StartsWith("Dialog:WelcomeDlg\t")); Assert.Single(results, result => result.StartsWith("Dialog:CustomizeDlg\t")); Assert.Single(results, result => result.StartsWith("Dialog:SetupTypeDlg\t")); @@ -248,9 +278,15 @@ namespace WixToolsetTest.UI }, results.Where(r => r.StartsWith("Binary:")).ToArray()); WixAssert.CompareLineByLine(new[] { - "CustomAction:WixUIPrintEula\t65\tWixUiCa_X86\tPrintEula\t", - "CustomAction:WixUIValidatePath\t65\tWixUiCa_X86\tValidatePath\t", + "CustomAction:WixUIPrintEula_X86\t65\tWixUiCa_X86\tPrintEula\t", + "CustomAction:WixUIValidatePath_X86\t65\tWixUiCa_X86\tValidatePath\t", }, results.Where(r => r.StartsWith("CustomAction:")).ToArray()); + WixAssert.CompareLineByLine(new[] + { + "ControlEvent:BrowseDlg\tOK\tDoAction\tWixUIValidatePath_X86\tNOT WIXUI_DONTVALIDATEPATH\t3", + "ControlEvent:InstallDirDlg\tNext\tDoAction\tWixUIValidatePath_X86\tNOT WIXUI_DONTVALIDATEPATH\t2", + "ControlEvent:LicenseAgreementDlg\tPrint\tDoAction\tWixUIPrintEula_X86\t1\t1", + }, results.Where(result => result.StartsWith("ControlEvent:") && result.Contains("DoAction")).ToArray()); } [Fact] diff --git a/src/ext/UI/wixext/UICompiler.cs b/src/ext/UI/wixext/UICompiler.cs index 6fdb5bd9..8b527454 100644 --- a/src/ext/UI/wixext/UICompiler.cs +++ b/src/ext/UI/wixext/UICompiler.cs @@ -16,11 +16,6 @@ namespace WixToolset.UI { public override XNamespace Namespace => "http://wixtoolset.org/schemas/v4/wxs/ui"; - /// - /// Flag to prevent custom action symbols duplication. - /// - private bool customActionsAdded = false; - /// /// Processes an element for the Compiler. /// @@ -91,40 +86,9 @@ namespace WixToolset.UI } else { + var platform = this.Context.Platform == Platform.ARM64 ? "A64" : this.Context.Platform.ToString(); this.ParseHelper.CreateSimpleReference(section, sourceLineNumbers, SymbolDefinitions.WixUI, id); - - if (!customActionsAdded) - { - // Because these custom actions are "scheduled" via `DoAction` control events, we have to create the - // custom action definitions here, so the `DoAction` references are static and the targets are - // dynamically created to properly reflect the platform-specific DLL and avoid having duplicate ids - // in the UI .wixlib. - var platform = this.Context.Platform == Platform.ARM64 ? "A64" : this.Context.Platform.ToString(); - var source = $"WixUiCa_{platform}"; - this.ParseHelper.CreateSimpleReference(section, sourceLineNumbers, SymbolDefinitions.Binary, source); - - section.AddSymbol(new CustomActionSymbol(sourceLineNumbers, new Identifier(AccessModifier.Global, "WixUIPrintEula")) - { - TargetType = CustomActionTargetType.Dll, - Target = "PrintEula", - SourceType = CustomActionSourceType.Binary, - Source = source, - IgnoreResult = true, - ExecutionType = CustomActionExecutionType.Immediate, - }); - - section.AddSymbol(new CustomActionSymbol(sourceLineNumbers, new Identifier(AccessModifier.Global, "WixUIValidatePath")) - { - TargetType = CustomActionTargetType.Dll, - Target = "ValidatePath", - SourceType = CustomActionSourceType.Binary, - Source = source, - IgnoreResult = true, - ExecutionType = CustomActionExecutionType.Immediate, - }); - - customActionsAdded = true; - } + this.ParseHelper.CreateSimpleReference(section, sourceLineNumbers, SymbolDefinitions.WixUI, $"{id}_{platform}"); if (installDirectory != null) { diff --git a/src/ext/UI/wixlib/AdvancedWelcomeEulaDlg.wxs b/src/ext/UI/wixlib/AdvancedWelcomeEulaDlg.wxs index 96b22f1e..8b950ec1 100644 --- a/src/ext/UI/wixlib/AdvancedWelcomeEulaDlg.wxs +++ b/src/ext/UI/wixlib/AdvancedWelcomeEulaDlg.wxs @@ -1,4 +1,4 @@ - + @@ -11,9 +11,7 @@ diff --git a/src/ext/UI/wixlib/WixUI_Minimal.wxs b/src/ext/UI/wixlib/WixUI_Minimal.wxs index 8ac9751f..6d1709c5 100644 --- a/src/ext/UI/wixlib/WixUI_Minimal.wxs +++ b/src/ext/UI/wixlib/WixUI_Minimal.wxs @@ -1,4 +1,4 @@ - + @@ -59,4 +59,12 @@ Patch dialog sequence: + + + + + + + + diff --git a/src/ext/UI/wixlib/WixUI_Mondo.wxs b/src/ext/UI/wixlib/WixUI_Mondo.wxs index 6a4b15b1..92890572 100644 --- a/src/ext/UI/wixlib/WixUI_Mondo.wxs +++ b/src/ext/UI/wixlib/WixUI_Mondo.wxs @@ -1,4 +1,4 @@ - + @@ -74,4 +74,14 @@ Patch dialog sequence: + + + + + + + + + + diff --git a/src/ext/UI/wixlib/ui.wixproj b/src/ext/UI/wixlib/ui.wixproj index d7c6e638..ebac0c79 100644 --- a/src/ext/UI/wixlib/ui.wixproj +++ b/src/ext/UI/wixlib/ui.wixproj @@ -1,12 +1,10 @@ - Library true en-us - $(DefineConstants); @@ -19,20 +17,20 @@ upIco=$(MSBuildProjectDirectory)\Bitmaps\up.ico; - - - - + + + + + + - - - + \ No newline at end of file -- cgit v1.2.3-55-g6feb