diff --git a/.github/copilot-instructions.md b/.github/copilot-instructions.md index 6545e1234b7d..f1ab235a3456 100644 --- a/.github/copilot-instructions.md +++ b/.github/copilot-instructions.md @@ -153,6 +153,9 @@ public class IssueXXXXX : _IssuesUITest - Compile both the HostApp project and TestCases.Shared.Tests project to ensure no build errors - Verify AutomationId references match between XAML and test code - Ensure tests follow the established naming and inheritance patterns +- There should be only one `[Category]` attribute per test, pick the most appropriate one + +IMPORTANT NOTE: When a new UI test category is added to `UITestCategories.cs`, we need to also update the `ui-tests.yml` to include this new category. Make sure to detect this in your reviews. ### Code Formatting diff --git a/Microsoft.Maui-dev.sln b/Microsoft.Maui-dev.sln index 50107d813ac8..a66f4363aff9 100644 --- a/Microsoft.Maui-dev.sln +++ b/Microsoft.Maui-dev.sln @@ -130,7 +130,7 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Controls.Foldable", "src\Co EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "tests", "tests", "{A9C514B9-1EE2-4A12-8E8A-CE16D87545C3}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MauiBlazorWebView.DeviceTests", "src\BlazorWebView\tests\MauiDeviceTests\MauiBlazorWebView.DeviceTests.csproj", "{5FEA7500-0ACE-4C26-9A7B-2EB3958CBBC6}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MauiBlazorWebView.DeviceTests", "src\BlazorWebView\tests\DeviceTests\MauiBlazorWebView.DeviceTests.csproj", "{5FEA7500-0ACE-4C26-9A7B-2EB3958CBBC6}" EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "SharedSource", "SharedSource", "{4F2926C8-43AB-4328-A735-D9EAD699F81D}" ProjectSection(SolutionItems) = preProject diff --git a/Microsoft.Maui-mac.slnf b/Microsoft.Maui-mac.slnf index 928aae767e7e..eab1a15d3e6d 100644 --- a/Microsoft.Maui-mac.slnf +++ b/Microsoft.Maui-mac.slnf @@ -5,7 +5,7 @@ "src\\BlazorWebView\\samples\\MauiRazorClassLibrarySample\\MauiRazorClassLibrarySample.csproj", "src\\BlazorWebView\\samples\\WebViewAppShared\\WebViewAppShared.csproj", "src\\BlazorWebView\\src\\Maui\\Microsoft.AspNetCore.Components.WebView.Maui.csproj", - "src\\BlazorWebView\\tests\\MauiDeviceTests\\MauiBlazorWebView.DeviceTests.csproj", + "src\\BlazorWebView\\tests\\DeviceTests\\MauiBlazorWebView.DeviceTests.csproj", "src\\Controls\\Foldable\\src\\Controls.Foldable.csproj", "src\\Controls\\Maps\\src\\Controls.Maps.csproj", "src\\Controls\\samples\\Controls.Sample.Profiling\\Maui.Controls.Sample.Profiling.csproj", diff --git a/Microsoft.Maui-vscode.sln b/Microsoft.Maui-vscode.sln index d61f2e1e3fd5..612fb2fe5b46 100644 --- a/Microsoft.Maui-vscode.sln +++ b/Microsoft.Maui-vscode.sln @@ -123,7 +123,7 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Controls.Foldable", "src\Co EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "tests", "tests", "{A9C514B9-1EE2-4A12-8E8A-CE16D87545C3}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MauiBlazorWebView.DeviceTests", "src\BlazorWebView\tests\MauiDeviceTests\MauiBlazorWebView.DeviceTests.csproj", "{5FEA7500-0ACE-4C26-9A7B-2EB3958CBBC6}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MauiBlazorWebView.DeviceTests", "src\BlazorWebView\tests\DeviceTests\MauiBlazorWebView.DeviceTests.csproj", "{5FEA7500-0ACE-4C26-9A7B-2EB3958CBBC6}" EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "SharedSource", "SharedSource", "{4F2926C8-43AB-4328-A735-D9EAD699F81D}" ProjectSection(SolutionItems) = preProject diff --git a/Microsoft.Maui-windows.slnf b/Microsoft.Maui-windows.slnf index ce7648da24a5..0fc4bc16c1bb 100644 --- a/Microsoft.Maui-windows.slnf +++ b/Microsoft.Maui-windows.slnf @@ -9,7 +9,7 @@ "src\\BlazorWebView\\src\\Maui\\Microsoft.AspNetCore.Components.WebView.Maui.csproj", "src\\BlazorWebView\\src\\WindowsForms\\Microsoft.AspNetCore.Components.WebView.WindowsForms.csproj", "src\\BlazorWebView\\src\\Wpf\\Microsoft.AspNetCore.Components.WebView.Wpf.csproj", - "src\\BlazorWebView\\tests\\MauiDeviceTests\\MauiBlazorWebView.DeviceTests.csproj", + "src\\BlazorWebView\\tests\\DeviceTests\\MauiBlazorWebView.DeviceTests.csproj", "src\\Controls\\Foldable\\src\\Controls.Foldable.csproj", "src\\Controls\\Maps\\src\\Controls.Maps.csproj", "src\\Controls\\samples\\Controls.Sample.Profiling\\Maui.Controls.Sample.Profiling.csproj", diff --git a/Microsoft.Maui.LegacyControlGallery.sln b/Microsoft.Maui.LegacyControlGallery.sln index 570c40a5f558..e555b8990ce5 100644 --- a/Microsoft.Maui.LegacyControlGallery.sln +++ b/Microsoft.Maui.LegacyControlGallery.sln @@ -130,7 +130,7 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Controls.Foldable", "src\Co EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "tests", "tests", "{A9C514B9-1EE2-4A12-8E8A-CE16D87545C3}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MauiBlazorWebView.DeviceTests", "src\BlazorWebView\tests\MauiDeviceTests\MauiBlazorWebView.DeviceTests.csproj", "{5FEA7500-0ACE-4C26-9A7B-2EB3958CBBC6}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MauiBlazorWebView.DeviceTests", "src\BlazorWebView\tests\DeviceTests\MauiBlazorWebView.DeviceTests.csproj", "{5FEA7500-0ACE-4C26-9A7B-2EB3958CBBC6}" EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "SharedSource", "SharedSource", "{4F2926C8-43AB-4328-A735-D9EAD699F81D}" ProjectSection(SolutionItems) = preProject diff --git a/Microsoft.Maui.sln b/Microsoft.Maui.sln index a3ae37181947..a98f1760e924 100644 --- a/Microsoft.Maui.sln +++ b/Microsoft.Maui.sln @@ -138,7 +138,7 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Controls.Foldable", "src\Co EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "tests", "tests", "{A9C514B9-1EE2-4A12-8E8A-CE16D87545C3}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MauiBlazorWebView.DeviceTests", "src\BlazorWebView\tests\MauiDeviceTests\MauiBlazorWebView.DeviceTests.csproj", "{5FEA7500-0ACE-4C26-9A7B-2EB3958CBBC6}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MauiBlazorWebView.DeviceTests", "src\BlazorWebView\tests\DeviceTests\MauiBlazorWebView.DeviceTests.csproj", "{5FEA7500-0ACE-4C26-9A7B-2EB3958CBBC6}" EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "SharedSource", "SharedSource", "{4F2926C8-43AB-4328-A735-D9EAD699F81D}" ProjectSection(SolutionItems) = preProject diff --git a/docs/DevelopmentTips.md b/docs/DevelopmentTips.md index 87bc30033a65..3287fac2cd63 100644 --- a/docs/DevelopmentTips.md +++ b/docs/DevelopmentTips.md @@ -188,3 +188,116 @@ These tests can be run using the Test Explorer in VS, or from the command line w ```bash dotnet test src/TestUtils/src/Microsoft.Maui.IntegrationTests --logger "console;verbosity=diagnostic" --filter "Name=Build\(%22maui%22,%22net7.0%22,%22Debug%22,False\)" ``` + +## Running Device Tests on Helix + +.NET MAUI now supports running device tests on [.NET Engineering Services Helix](https://helix.dot.net) using XHarness. Helix provides cloud-based device testing infrastructure that enables running tests across multiple platforms and devices in parallel. + +### Overview + +Device tests can be run on the following platforms via Helix: + + +The device test projects include: +- `Controls.DeviceTests` - UI control tests +- `Core.DeviceTests` - Core framework tests +- `Graphics.DeviceTests` - Graphics and drawing tests +- `Essentials.DeviceTests` - Platform API tests +- `MauiBlazorWebView.DeviceTests` - Blazor WebView tests + + +### Available Helix Queues + +Check available queues at [helix.dot.net](https://helix.dot.net). The current configuration uses: + +- **iOS**: `osx.15.arm64.Open` +- **Mac Catalyst**: `osx.15.arm64.Open` +- **Android**: `ubuntu.2204.amd64.android.33.open` + +### Running Device Tests Locally + +#### Step 1: Build Build Tasks +First, restore tools and build the required MSBuild tasks: + +```bash +# Restore dotnet tools +dotnet tool restore + +# Build the Build tasks (required) +./build.sh -restore -build -configuration Release -projects './Microsoft.Maui.BuildTasks.slnf' /bl:BuildBuildTasks.binlog -warnAsError false +``` + +#### Step 2: Build Device Tests +Build the device test projects: + +```bash +# Build device tests for all platforms +./build.sh -restore -build -configuration Release /p:BuildDeviceTests=true /bl:BuildDeviceTests.binlog -warnAsError false +``` + +#### Step 3: Send to Helix +Submit the tests to Helix for execution: + +```bash +# Send to Helix for Android +./eng/common/msbuild.sh ./eng/helix_xharness.proj /restore /p:TreatWarningsAsErrors=false /t:Test /p:TargetOS=android /bl:sendhelix.binlog -verbosity:diag + +# Send to Helix for iOS +./eng/common/msbuild.sh ./eng/helix_xharness.proj /restore /p:TreatWarningsAsErrors=false /t:Test /p:TargetOS=ios /bl:sendhelix.binlog -verbosity:diag + +# Send to Helix for Mac Catalyst +./eng/common/msbuild.sh ./eng/helix_xharness.proj /restore /p:TreatWarningsAsErrors=false /t:Test /p:TargetOS=maccatalyst /bl:sendhelix.binlog -verbosity:diag +``` + +### Windows Commands + +For Windows development, use the corresponding `.cmd` files: + +```cmd +REM Build Build tasks +.\build.cmd -restore -build -configuration Release -projects ".\Microsoft.Maui.BuildTasks.slnf" /bl:BuildBuildTasks.binlog -warnAsError false + +REM Build device tests +.\build.cmd -restore -build -configuration Release /p:BuildDeviceTests=true /bl:BuildDeviceTests.binlog -warnAsError false + +REM Send to Helix (Android example) +.\eng\common\msbuild.cmd .\eng\helix_xharness.proj /restore /p:TreatWarningsAsErrors=false /t:Test /p:TargetOS=android /bl:sendhelix.binlog -verbosity:diag +``` + +### Configuration Details + +The Helix configuration is defined in `eng/helix_xharness.proj` and includes: + +- **Timeouts**: 2-hour work item timeout, 1-hour test timeout +- **Test Discovery**: Automatically discovers test bundles for each scenario +- **Platform Targeting**: Specific target frameworks per platform +- **Queue Selection**: Platform-appropriate Helix queues +- **XHarness Integration**: Uses XHarness for device orchestration + +### Troubleshooting + +#### Common Issues + +1. **Build failures**: Ensure you've built the BuildTasks first +2. **Missing devices**: Check queue availability at [helix.dot.net](https://helix.dot.net) +3. **Authentication**: For CI scenarios, ensure proper Azure DevOps access tokens +4. **Timeouts**: Tests have generous timeouts but may need adjustment for complex scenarios + +#### Logging and Diagnostics + +- Use `/bl:filename.binlog` for detailed MSBuild logs +- Add `-verbosity:diag` for maximum diagnostic output +- Check Helix job results at the provided URL after submission + +### CI Integration + +The device tests are integrated into the CI pipeline via: +- `eng/pipelines/common/stage-device-tests.yml` - Pipeline template +- `eng/test-configuration.json` - Test retry configuration +- Automatic execution on PR builds for qualifying changes + +### Additional Resources + +- [XHarness on Helix Documentation](https://github.com/dotnet/arcade/blob/main/src/Microsoft.DotNet.Helix/Sdk/tools/xharness-runner/Readme.md#android-apk-payloads) +- [Helix Documentation](https://github.com/dotnet/arcade/tree/main/src/Microsoft.DotNet.Helix) +- [Example Helix Run](https://dev.azure.com/dnceng-public/public/_build/results?buildId=1115383&view=results) diff --git a/docs/README.md b/docs/README.md index 22fc15184845..5abf72ea0224 100644 --- a/docs/README.md +++ b/docs/README.md @@ -12,6 +12,7 @@ The table below outlines the different docs in this folder and what they are hel |----------------------|---------------------|---------------------| | [CG Manifest](CgManifest.md) | Guide to Component Governance manifest generation and management | Contributors who need to manage third-party dependencies or include CG manifest in packages | | [Code Documentation Guidelines](CodeDocumentationGuidelines.md) | Overview of the guidelines for the inline code documentation | Community members and collaborators looking to understand how to add good inline code comments that fuel our IntelliSense and online API docs | +| [Development Tips](DevelopmentTips.md) | Development tips including debugging, building, and device testing on Helix | Contributors who need guidance on development workflows, including running device tests on cloud infrastructure | | [Issue management](IssueManagementPolicies.md) | Overview of policies in place to manage issues| Community members and collaborators looking to understand how we handle closed issues, issues that need author feedback, etc. | | [Release Schedule](ReleaseSchedule.md) | Overview of .NET MAUI version releases | Anyone who is interested in .NET MAUI versions and release dates | | [Triage process](TriageProcess.md)| Overview of the issue triage process used in the repo | Anyone looking to understand the triage process on the repo | diff --git a/eng/Build.props b/eng/Build.props index 9a58ebc2ba11..3caad25a1c42 100644 --- a/eng/Build.props +++ b/eng/Build.props @@ -1,7 +1,14 @@ - - - + + + + + + + + CodesignRequireProvisioningProfile=false + + \ No newline at end of file diff --git a/eng/Versions.props b/eng/Versions.props index 003ed4381cb2..2a6040fd9fea 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -68,7 +68,7 @@ 8.0.148 - 1.7.250606001 + 1.7.250909003 10.0.22621.756 1.3.2 1.0.3179.45 diff --git a/eng/devices/devices-shared.cake b/eng/devices/devices-shared.cake index 561965ecbb87..f6e7f357bfaf 100644 --- a/eng/devices/devices-shared.cake +++ b/eng/devices/devices-shared.cake @@ -214,19 +214,19 @@ void HandleTestResults(string resultsDir, bool testsFailed, bool needsNameFix, s if (FileExists(resultsFile)) { Information($"Test results found on {resultsDir}"); - MoveFile(resultsFile, resultsFile.GetDirectory().CombineWithFilePath($"TestResults{suffix}.xml")); + MoveFile(resultsFile, resultsFile.GetDirectory().CombineWithFilePath($"testResults{suffix}.xml")); var logFiles = GetFiles($"{resultsDir}/*.log"); foreach (var logFile in logFiles) { - if (logFile.GetFilename().ToString().StartsWith("TestResults")) + if (logFile.GetFilename().ToString().StartsWith("testResults")) { // These are log files that have already been renamed continue; } Information($"Log file found: {logFile.GetFilename().ToString()}"); - MoveFile(logFile, resultsFile.GetDirectory().CombineWithFilePath($"TestResults{suffix}-{logFile.GetFilename()}")); + MoveFile(logFile, resultsFile.GetDirectory().CombineWithFilePath($"testResults{suffix}-{logFile.GetFilename()}")); } } } @@ -249,9 +249,9 @@ void HandleTestResults(string resultsDir, bool testsFailed, bool needsNameFix, s CopyFiles($"{resultsDir}/{searchQuery}", failurePath); // We don't want these to upload - MoveFile($"{failurePath}/TestResults{suffix}.xml", $"{failurePath}/Results{suffix}.xml"); + MoveFile($"{failurePath}/testResults{suffix}.xml", $"{failurePath}/Results{suffix}.xml"); } - FailRunOnOnlyInconclusiveTests($"{resultsDir}/TestResults{suffix}.xml"); + FailRunOnOnlyInconclusiveTests($"{resultsDir}/testResults{suffix}.xml"); } DirectoryPath DetermineBinlogDirectory(string projectPath, string binlogArg) diff --git a/eng/devices/windows.cake b/eng/devices/windows.cake index 9916e780d87f..807ce907e536 100644 --- a/eng/devices/windows.cake +++ b/eng/devices/windows.cake @@ -5,6 +5,13 @@ using System.Security.Cryptography.X509Certificates; const string defaultVersion = "10.0.19041.0"; +// Test category filtering: +// Use --test-filter to run only specific categories. Examples: +// --test-filter="Button" # Run only Button category +// --test-filter="Button,Label" # Run Button and Label categories +// --test-filter="Button,Layout" # Run any category containing "Button" or "Layout" +// Categories are matched case-insensitively using substring matching + // required string DEFAULT_WINDOWS_PROJECT = "../../src/Controls/tests/TestCases.WinUI.Tests/Controls.TestCases.WinUI.Tests.csproj"; FilePath PROJECT = Argument("project", EnvironmentVariable("WINDOWS_TEST_PROJECT") ?? DEFAULT_WINDOWS_PROJECT); @@ -182,20 +189,80 @@ Task("buildOnly") DotNetPublish(PROJECT.FullPath, s); }); +// Helper function to wait for a specific test result file with timeout +Func WaitForCategoryTestResult = (string expectedFile, string categoryName) => { + var timeoutInSeconds = 480; // 8 minutes per category + var waited = 0; + + Information($"Waiting for test results file: {expectedFile}"); + + while (!FileExists(expectedFile) && waited < timeoutInSeconds) { + System.Threading.Thread.Sleep(1000); + waited++; + + if (waited % 10 == 0) { // Log every 10 seconds + Information($"Still waiting for {categoryName} test results... ({waited}s)"); + } + } + + if (FileExists(expectedFile)) { + Information($"✓ Found test results for {categoryName} after {waited} seconds"); + return true; + } else { + Warning($"✗ Timeout waiting for {categoryName} test results after {waited} seconds"); + return false; + } +}; + +// Helper function to filter categories based on testFilter parameter +Func FilterCategories = (string[] allCategories) => { + if (string.IsNullOrWhiteSpace(testFilter)) { + Information("No test filter specified, running all categories"); + return allCategories; + } + + var filters = testFilter.Split(',', StringSplitOptions.RemoveEmptyEntries) + .Select(f => f.Trim()) + .ToArray(); + + var filteredCategories = allCategories.Where(category => + filters.Any(filter => + category.IndexOf(filter, StringComparison.OrdinalIgnoreCase) >= 0 + ) + ).ToArray(); + + Information($"Test filter '{testFilter}' applied:"); + Information($" - Total categories available: {allCategories.Length}"); + Information($" - Filtered categories to run: {filteredCategories.Length}"); + + if (filteredCategories.Length > 0) { + Information(" - Categories that will run:"); + foreach (var category in filteredCategories) { + Information($" * {category}"); + } + } else { + Warning($"No categories matched the filter '{testFilter}'. Available categories:"); + foreach (var category in allCategories) { + Information($" * {category}"); + } + } + + return filteredCategories; +}; + Task("testOnly") .IsDependentOn("SetupTestPaths") .Does(() => { - var waitForResultTimeoutInSeconds = 240; - CleanDirectories(TEST_RESULTS); - Information("Cleaned directories"); var testResultsPath = MakeAbsolute((DirectoryPath)TEST_RESULTS).FullPath.Replace("/", "\\"); var testResultsFile = testResultsPath + $"\\TestResults-{PACKAGEID.Replace(".", "_")}"; - if (!string.IsNullOrWhiteSpace(testFilter)) + // For Controls project tests, each category gets its own result file, so don't append testFilter here + // For non-Controls tests, append testFilter to the single result file + if (!isControlsProjectTestRun && !string.IsNullOrWhiteSpace(testFilter)) { testResultsFile += SanitizeTestResultsFilename($"-{testFilter}"); } @@ -217,6 +284,10 @@ Task("testOnly") DeleteFile(testsToRunFile); } + // Track completed and failed test categories + var completedCategories = new List(); + var failedCategories = new List(); + if (isPackagedTestRun) { Information("isPackagedTestRuns"); @@ -287,22 +358,46 @@ Task("testOnly") var startArgsInitial = "Start-Process shell:AppsFolder\\$((Get-AppxPackage -Name \"" + PACKAGEID + "\").PackageFamilyName)!App -ArgumentList \"" + testResultsFile + "\", \"-1\""; StartProcess("powershell", startArgsInitial); - Information($"Waiting 10 seconds for process to finish..."); + Information($"Waiting 10 seconds for category discovery to finish..."); System.Threading.Thread.Sleep(10000); - var testCategoriesToRun = System.IO.File.ReadAllLines(testsToRunFile).Length; + if (!FileExists(testsToRunFile)) { + throw new Exception("Test categories file was not created during discovery phase"); + } + + var expectedCategories = System.IO.File.ReadAllLines(testsToRunFile); + var filteredCategories = FilterCategories(expectedCategories); + + if (filteredCategories.Length == 0) { + Information("No categories to run after applying filter. Skipping test execution."); + return; + } + + Information($"Will run {filteredCategories.Length} filtered categories out of {expectedCategories.Length} total"); - for (int i = 0; i <= testCategoriesToRun; i++) + for (int i = 0; i < filteredCategories.Length; i++) { - var startArgs = "Start-Process shell:AppsFolder\\$((Get-AppxPackage -Name \"" + PACKAGEID + "\").PackageFamilyName)!App -ArgumentList \"" + testResultsFile + "\", \"" + i + "\""; - + var categoryName = filteredCategories[i]; + // Find the original index of this category in the expected categories + var originalIndex = Array.IndexOf(expectedCategories, categoryName); + var expectedResultFile = testResultsPath + $"\\TestResults-{PACKAGEID.Replace(".", "_")}_{categoryName}.xml"; + + Information($"Running category {originalIndex}: {categoryName} (filtered {i + 1}/{filteredCategories.Length})"); + + var startArgs = "Start-Process shell:AppsFolder\\$((Get-AppxPackage -Name \"" + PACKAGEID + "\").PackageFamilyName)!App -ArgumentList \"" + testResultsFile + "\", \"" + originalIndex + "\""; Information(startArgs); // Start the DeviceTests app for packaged StartProcess("powershell", startArgs); - Information($"Waiting 10 seconds for the next..."); - System.Threading.Thread.Sleep(10000); + // Wait for this specific category's results + if (WaitForCategoryTestResult(expectedResultFile, categoryName)) { + completedCategories.Add(categoryName); + Information($"✓ Category {categoryName} completed successfully"); + } else { + failedCategories.Add(categoryName); + Error($"✗ Category {categoryName} failed or timed out"); + } } } else @@ -313,99 +408,122 @@ Task("testOnly") // Start the DeviceTests app for packaged StartProcess("powershell", startArgs); + + // Wait for the single test result file + if (WaitForCategoryTestResult(testResultsFile, "All Tests")) { + completedCategories.Add("All Tests"); + } else { + failedCategories.Add("All Tests"); + } } } else { - // Unpackaged process blocks the thread, so we can wait shorter for the results - waitForResultTimeoutInSeconds = 30; - if (isControlsProjectTestRun) { // Start the app once, this will trigger the discovery of the test categories StartProcess(TEST_APP, testResultsFile + " -1"); + + Information($"Waiting 10 seconds for category discovery to finish..."); + System.Threading.Thread.Sleep(10000); + + if (!FileExists(testsToRunFile)) { + throw new Exception("Test categories file was not created during discovery phase"); + } + + var expectedCategories = System.IO.File.ReadAllLines(testsToRunFile); + var filteredCategories = FilterCategories(expectedCategories); + + if (filteredCategories.Length == 0) { + Information("No categories to run after applying filter. Skipping test execution."); + return; + } - var testCategoriesToRun = System.IO.File.ReadAllLines(testsToRunFile).Length; + Information($"Will run {filteredCategories.Length} filtered categories out of {expectedCategories.Length} total"); - for (int i = 0; i <= testCategoriesToRun; i++) + for (int i = 0; i < filteredCategories.Length; i++) { + var categoryName = filteredCategories[i]; + // Find the original index of this category in the expected categories + var originalIndex = Array.IndexOf(expectedCategories, categoryName); + var expectedResultFile = testResultsPath + $"\\TestResults-{PACKAGEID.Replace(".", "_")}_{categoryName}.xml"; + + Information($"Running category {originalIndex}: {categoryName} (filtered {i + 1}/{filteredCategories.Length})"); + // Start the DeviceTests app for unpackaged - StartProcess(TEST_APP, testResultsFile + " " + i); + StartProcess(TEST_APP, testResultsFile + " " + originalIndex); + + // Wait for this specific category's results + if (WaitForCategoryTestResult(expectedResultFile, categoryName)) { + completedCategories.Add(categoryName); + Information($"✓ Category {categoryName} completed successfully"); + } else { + failedCategories.Add(categoryName); + Error($"✗ Category {categoryName} failed or timed out"); + } } } else { StartProcess(TEST_APP, testResultsFile); + + // Wait for the single test result file + if (WaitForCategoryTestResult(testResultsFile, "All Tests")) { + completedCategories.Add("All Tests"); + } else { + failedCategories.Add("All Tests"); + } } } - var waited = 0; - while (System.IO.Directory.GetFiles(testResultsPath, "TestResults-*.xml").Length == 0) { - System.Threading.Thread.Sleep(1000); - waited++; + // Final validation and reporting + Information($"=== Test Execution Summary ==="); + Information($"Completed categories: {completedCategories.Count}"); + Information($"Failed categories: {failedCategories.Count}"); - Information($"Waiting {waited} second(s) for tests to finish..."); - if (waited >= waitForResultTimeoutInSeconds) - break; + if (completedCategories.Any()) { + Information("✓ Successfully completed categories:"); + foreach (var category in completedCategories) { + Information($" - {category}"); + } } - // If we're running the Controls project, double-check if we have all test result files - // and if the categories we expected to run match the test result files - if (isControlsProjectTestRun) - { - var expectedCategories = System.IO.File.ReadAllLines(testsToRunFile); - var expectedCategoriesRanCount = expectedCategories.Length; - var actualResultFileCount = System.IO.Directory.GetFiles(testResultsPath, "TestResults-*.xml").Length; - - while (actualResultFileCount < expectedCategoriesRanCount) { - actualResultFileCount = System.IO.Directory.GetFiles(testResultsPath, "TestResults-*.xml").Length; - System.Threading.Thread.Sleep(1000); - waited++; - - Information($"Waiting {waited} additional second(s) for tests to finish..."); - if (waited >= 30) - break; + if (failedCategories.Any()) { + Error("✗ Failed or timed out categories:"); + foreach (var category in failedCategories) { + Error($" - {category}"); } - - if (FileExists(testsToRunFile)) - { - DeleteFile(testsToRunFile); - } - - // While the count should match exactly, if we get more files somehow we'll allow it - // If it's less, throw an exception to fail the pipeline. - if (actualResultFileCount < expectedCategoriesRanCount) - { - // Grab the category name from the file name - // Ex: "TestResults-com_microsoft_maui_controls_devicetests_Frame.xml" -> "Frame" - var actualFiles = System.IO.Directory.GetFiles(testResultsPath, "TestResults-*.xml"); - var actualCategories = actualFiles.Select(x => x.Substring(0, x.Length - 4) // Remove ".xml" - .Split('_').Last()).ToList(); + } - foreach (var category in expectedCategories) - { - if (!actualCategories.Contains(category)) - { - Error($"Error: missing test file result for {category}"); - } - } + // Clean up the test categories file + if (FileExists(testsToRunFile)) + { + DeleteFile(testsToRunFile); + } - throw new Exception($"Expected test result files: {expectedCategoriesRanCount}, actual files: {actualResultFileCount}, some process(es) might have crashed."); - } + // Check if we have any test result files at all + var actualResultFiles = System.IO.Directory.GetFiles(testResultsPath, "TestResults-*.xml"); + if (actualResultFiles.Length == 0) + { + throw new Exception($"No test result files found. All test processes may have crashed or failed to start."); } - if(System.IO.Directory.GetFiles(testResultsPath, "TestResults-*.xml").Length == 0) + // If we're running Controls tests, validate we have results for expected categories + if (isControlsProjectTestRun && failedCategories.Any()) { - throw new Exception($"Test result file(s) not found after {waited} seconds, process might have crashed or not completed yet."); + throw new Exception($"Some test categories failed to complete: {string.Join(", ", failedCategories)}. Expected {completedCategories.Count + failedCategories.Count} categories, but {failedCategories.Count} failed."); } - foreach(var file in System.IO.Directory.GetFiles(testResultsPath, "TestResults-*.xml")) + // Check for test failures in the result files + foreach(var file in actualResultFiles) { var failed = XmlPeek(file, "/assemblies/assembly[@failed > 0 or @errors > 0]/@failed"); if (!string.IsNullOrEmpty(failed)) { - throw new Exception($"At least {failed} test(s) failed."); + throw new Exception($"At least {failed} test(s) failed in {System.IO.Path.GetFileName(file)}."); } } + + Information($"✓ All test executions completed successfully with {actualResultFiles.Length} result file(s)"); }); Task("build") diff --git a/eng/helix.proj b/eng/helix.proj index e588f10bbfa1..5c3d8bd40280 100644 --- a/eng/helix.proj +++ b/eng/helix.proj @@ -2,18 +2,17 @@ test/product/ $(BUILD_BUILDNUMBER) + default Windows.10.Amd64.Open;OSX.15.ARM64.Open maui - true sdk - true true + - Windows.10.Amd64.Open;OSX.1200.Amd64.Open;OSX.1200.ARM64.Open;Ubuntu.2204.Amd64.Open@mcr.microsoft.com/dotnet-buildtools/prereqs:ubuntu-20.04-helix-sqlserver-amd64 false @@ -22,10 +21,10 @@ - - - - + + + + diff --git a/eng/helix_xharness.proj b/eng/helix_xharness.proj new file mode 100644 index 000000000000..d7408f0b512d --- /dev/null +++ b/eng/helix_xharness.proj @@ -0,0 +1,127 @@ + + + test/devices/ + $(BUILD_BUILDNUMBER) + default + osx.15.arm64.Open + osx.15.arm64.Open + ubuntu.2204.amd64.android.33.open + maui + true + sdk + true + true + $(_MauiDotNetTfm) + + + + + $(RepoRoot)artifacts/bin/ + + Windows.10.Amd64.Open;OSX.1200.Amd64.Open;OSX.1200.ARM64.Open;Ubuntu.2204.Amd64.Open@mcr.microsoft.com/dotnet-buildtools/prereqs:ubuntu-20.04-helix-sqlserver-amd64 + false + maui/localbuild/ + t001 + + + + $(BUILD_SOURCESDIRECTORY)/artifacts/bin/ + true + + + + true + + + + + + + + + + + + + Controls.DeviceTests + $(ScenariosDir)Controls.DeviceTests + Microsoft.Maui.Controls.DeviceTests + com.microsoft.maui.controls.devicetests + + + + Core.DeviceTests + $(ScenariosDir)Core.DeviceTests + Microsoft.Maui.Core.DeviceTests + com.microsoft.maui.core.devicetests + + + + Graphics.DeviceTests + $(ScenariosDir)Graphics.DeviceTests + Microsoft.Maui.Graphics.DeviceTests + com.microsoft.maui.graphics.devicetests + + + + Essentials.DeviceTests + $(ScenariosDir)Essentials.DeviceTests + Microsoft.Maui.Essentials.DeviceTests + com.microsoft.maui.essentials.devicetests + + + + MauiBlazorWebView.DeviceTests + $(ScenariosDir)MauiBlazorWebView.DeviceTests + Microsoft.Maui.MauiBlazorWebView.DeviceTests + com.microsoft.maui.mauiblazorwebview.devicetests + + + + + + + + + + + <_MAUIScenarioSearch Include="@(MAUIScenario)" /> + + + + + + ios-simulator-64 + 02:00:00 + 01:00:00 + %(_MAUIScenarioSearch.ScenarioDirectoryName) + + + + + + maccatalyst + 02:00:00 + 01:00:00 + %(_MAUIScenarioSearch.ScenarioDirectoryName) + + + + + <_apks Include="%(_MAUIScenarioSearch.PayloadDirectory)/Release/$(TargetFrameworkToTest)-android/**/*Signed.apk" /> + + 02:00:00 + 01:00:00 + %(Filename) + + + + + $([System.String]::Copy('%(AndroidPackageName)').Replace('-Signed','')) + + + + + + \ No newline at end of file diff --git a/eng/pipelines/arcade/stage-device-tests.yml b/eng/pipelines/arcade/stage-device-tests.yml new file mode 100644 index 000000000000..bc439ce3c98b --- /dev/null +++ b/eng/pipelines/arcade/stage-device-tests.yml @@ -0,0 +1,196 @@ +# Template for devicetests on dnceng +parameters: +- name: prepareSteps + type: stepList + default: [] +- name: postSteps + type: stepList + default: [] +- name: pool + type: object +- name: enableSourceBuild + type: boolean + default: false +- name: enableSourceIndex + type: boolean + default: false +- name: sourceIndexParams + type: object + default: [] +- name: runAsPublic + type: boolean + default: true +- name: helixProject + type: string + default: 'eng/helix_xharness.proj' +- name: extraHelixArguments + type: string + default: '' +- name: BuildConfiguration + type: string + default: 'Release' +- name: TargetFrameworkVersion + type: string + default: 'net9.0' +- name: appArtifactName + type: string + default: 'device_tests_app' +- name: checkoutDirectory + type: string + default: $(System.DefaultWorkingDirectory) + +stages: +- stage: deviceTests_ios_android + displayName: ${{ parameters.TargetFrameworkVersion }} ios/catalyst/android Helix Tests + dependsOn: [] + jobs: + - template: ${{ iif(eq(parameters.runAsPublic, 'true'), '/eng/common/templates/jobs/jobs.yml', '/eng/common/templates-official/jobs/jobs.yml@self') }} + parameters: + helixRepo: dotnet/maui + pool: ${{ parameters.pool }} + enableMicrobuild: true + enablePublishUsingPipelines: true + enablePublishBuildAssets: true + enableTelemetry: true + enableSourceBuild: ${{ parameters.enableSourceBuild }} + enableSourceIndex: ${{ parameters.enableSourceIndex }} + sourceIndexParams: ${{ parameters.sourceIndexParams }} + publishAssetsImmediately: true + enablePublishBuildArtifacts: true + enablePublishTestResults: true + workspace: + clean: all + jobs: + - job: builddevice_tests + displayName: Build Device Tests + timeoutInMinutes: 240 + variables: + - name: _BuildConfig + value: ${{ parameters.BuildConfiguration }} + preSteps: + - checkout: self + fetchDepth: 1 + clean: true + + steps: + - ${{ each step in parameters.prepareSteps }}: + - ${{ each pair in step }}: + ${{ pair.key }}: ${{ pair.value }} + + # Run on public pipeline + - script: $(_buildScriptMacOS) -restore -build -configuration $(_BuildConfig) -projects '$(Build.SourcesDirectory)/Microsoft.Maui.BuildTasks.slnf' /bl:BuildBuildTasks.binlog $(_OfficialBuildIdArgs) + displayName: Build BuildTasks + + - script: $(_buildScriptMacOS) -restore -build -configuration $(_BuildConfig) /p:BuildDeviceTests=true /bl:BuildDeviceTests.binlog + displayName: Build DeviceTests + + - publish: ${{ parameters.checkoutDirectory }}/artifacts/bin + displayName: Publish Succeeded Artifacts Directory + condition: succeeded() + artifact: ${{ parameters.appArtifactName }} + + - publish: ${{ parameters.checkoutDirectory }}/artifacts/bin + displayName: Publish Failed Artifacts Directory + condition: not(succeeded()) + artifact: ${{ parameters.appArtifactName }}_failed_$(System.JobAttempt) + + - template: ${{ iif(eq(parameters.runAsPublic, 'true'), '/eng/common/templates/jobs/jobs.yml', '/eng/common/templates-official/jobs/jobs.yml@self') }} + parameters: + helixRepo: dotnet/maui + pool: ${{ parameters.pool }} + enableMicrobuild: false + enablePublishUsingPipelines: true + enablePublishBuildAssets: true + enableTelemetry: true + enableSourceBuild: ${{ parameters.enableSourceBuild }} + enableSourceIndex: ${{ parameters.enableSourceIndex }} + sourceIndexParams: ${{ parameters.sourceIndexParams }} + publishAssetsImmediately: true + enablePublishBuildArtifacts: true + enablePublishTestResults: false + workspace: + clean: all + jobs: + - job: device_tests_ios + dependsOn: + - builddevice_tests + displayName: Run DeviceTests iOS + timeoutInMinutes: 240 + variables: + - name: _BuildConfig + value: ${{ parameters.BuildConfiguration }} + preSteps: + - checkout: self + fetchDepth: 1 + clean: true + + - task: DownloadPipelineArtifact@2 + displayName: 'Download Build' + condition: succeeded() + inputs: + artifactName: ${{ parameters.appArtifactName }} + targetPath: ${{ parameters.checkoutDirectory }}/artifacts/bin + + - template: /eng/common/templates-official/steps/send-to-helix.yml + parameters: + HelixProjectPath: ${{ parameters.helixProject }} + HelixProjectArguments: /p:TargetOS=ios /p:TestRunNameSuffix="_$(_BuildConfig)" /p:TestRunNamePrefix="DeviceTestsIOS_" + HelixConfiguration: $(_BuildConfig) + IncludeDotNetCli: true + DisplayNamePrefix: DeviceTestsIOS + + - job: device_tests_maccatalyst + dependsOn: + - builddevice_tests + displayName: Run DeviceTests MacCatalyst + timeoutInMinutes: 240 + variables: + - name: _BuildConfig + value: ${{ parameters.BuildConfiguration }} + preSteps: + - checkout: self + fetchDepth: 1 + clean: true + + - task: DownloadPipelineArtifact@2 + displayName: 'Download Build' + condition: succeeded() + inputs: + artifactName: ${{ parameters.appArtifactName }} + targetPath: ${{ parameters.checkoutDirectory }}/artifacts/bin + + - template: /eng/common/templates-official/steps/send-to-helix.yml + parameters: + HelixProjectPath: ${{ parameters.helixProject }} + HelixProjectArguments: /p:TargetOS=maccatalyst /p:TestRunNameSuffix="_$(_BuildConfig)" /p:TestRunNamePrefix="DeviceTestsMacCatalyst_" + HelixConfiguration: $(_BuildConfig) + IncludeDotNetCli: true + DisplayNamePrefix: DeviceTestsMacCatalyst + + - job: device_tests_android + dependsOn: + - builddevice_tests + displayName: Run DeviceTests Android + timeoutInMinutes: 240 + variables: + - name: _BuildConfig + value: ${{ parameters.BuildConfiguration }} + preSteps: + - checkout: self + fetchDepth: 1 + clean: true + + - task: DownloadPipelineArtifact@2 + displayName: 'Download Build' + condition: succeeded() + inputs: + artifactName: ${{ parameters.appArtifactName }} + targetPath: ${{ parameters.checkoutDirectory }}/artifacts/bin + + - template: /eng/common/templates-official/steps/send-to-helix.yml + parameters: + HelixProjectPath: ${{ parameters.helixProject }} + HelixProjectArguments: /p:TargetOS=android /p:TestRunNameSuffix="_$(_BuildConfig)" /p:TestRunNamePrefix="DeviceTestsAndroid_" + HelixConfiguration: $(_BuildConfig) + IncludeDotNetCli: true + DisplayNamePrefix: DeviceTestsAndroid diff --git a/eng/pipelines/arcade/variables.yml b/eng/pipelines/arcade/variables.yml index a9e968312f69..ebcc51444080 100644 --- a/eng/pipelines/arcade/variables.yml +++ b/eng/pipelines/arcade/variables.yml @@ -11,7 +11,7 @@ variables: - name: _buildScript value: $(Build.SourcesDirectory)\build.cmd -ci - name: _buildScriptMacOS - value: $(Build.SourcesDirectory)/build.sh -ci -warnAsError 0 + value: $(Build.SourcesDirectory)/build.sh -ci -warnAsError false - name: _helixScriptMacOS value: $(Build.SourcesDirectory)/helix.sh - name: _helixScript diff --git a/eng/pipelines/common/device-tests-steps.yml b/eng/pipelines/common/device-tests-steps.yml index 60139e6a682a..8e39c9f17bb6 100644 --- a/eng/pipelines/common/device-tests-steps.yml +++ b/eng/pipelines/common/device-tests-steps.yml @@ -171,7 +171,7 @@ steps: condition: always() inputs: testResultsFormat: xUnit - testResultsFiles: '$(TestResultsDirectory)/**/TestResults*(-*).xml' + testResultsFiles: '$(TestResultsDirectory)/**/*Results*(-*).xml' testRunTitle: '$(Agent.JobName) (attempt $(System.JobAttempt))' # Publish the job artifacts diff --git a/eng/pipelines/common/variables.yml b/eng/pipelines/common/variables.yml index 49df54215ff3..292ba731b8b8 100644 --- a/eng/pipelines/common/variables.yml +++ b/eng/pipelines/common/variables.yml @@ -51,7 +51,7 @@ variables: value: '' # Variable groups required for all builds -- ${{ if and(ne(variables['Build.DefinitionName'], 'maui-pr'), ne(variables['Build.DefinitionName'], 'dotnet-maui')) }}: +- ${{ if and(ne(variables['Build.DefinitionName'], 'maui-pr'), ne(variables['Build.DefinitionName'], 'dotnet-maui'), ne(variables['Build.DefinitionName'], 'maui-pr-devicetests')) }}: - group: maui-provisionator # This is just needed for the provisionator - group: MAUI # This is the main MAUI variable group that contains secret for the apple certificate diff --git a/eng/pipelines/device-tests.yml b/eng/pipelines/device-tests.yml index 3f71ddbafdee..763b36d4592c 100644 --- a/eng/pipelines/device-tests.yml +++ b/eng/pipelines/device-tests.yml @@ -44,7 +44,9 @@ pr: - THIRD-PARTY-NOTICES.TXT variables: +- template: /eng/common/templates/variables/pool-providers.yml@self - template: /eng/pipelines/common/variables.yml@self +- template: /eng/pipelines/arcade/variables.yml@self parameters: @@ -83,8 +85,14 @@ parameters: - name: windowsPool type: object default: - name: $(windowsTestsVmPool) - vmImage: $(windowsTestsVmImage) + name: Azure Pipelines + vmImage: windows-2022 + +- name: macOSPool + type: object + default: + name: Azure Pipelines + vmImage: macOS-15 - name: targetFrameworkVersions @@ -94,81 +102,139 @@ parameters: stages: - ${{ each targetFrameworkVersion in parameters.targetFrameworkVersions }}: - - template: common/device-tests.yml - parameters: - androidPool: ${{ parameters.androidPool }} - iosPool: ${{ parameters.iosPool }} - catalystPool: ${{ parameters.catalystPool }} - windowsPool: ${{ parameters.windowsPool }} - # agentPoolAccessToken: $(AgentPoolAccessToken) - targetFrameworkVersion: ${{ targetFrameworkVersion }} - ${{ if or(parameters.BuildEverything, and(ne(variables['Build.Reason'], 'PullRequest'), eq(variables['System.TeamProject'], 'devdiv'))) }}: - androidApiLevels: [ 33, 30, 29, 27, 26, 25, 24, 23 ] - iosVersions: [ 'simulator-18.4' ] - catalystVersions: [ 'latest' ] - windowsVersions: [ 'packaged', 'unpackaged' ] - provisionatorChannel: ${{ parameters.provisionatorChannel }} - skipProvisioning: ${{ or(not(parameters.UseProvisionator), false) }} - ${{ else }}: - androidApiLevels: [ 33, 23 ] - iosVersions: [ 'simulator-18.4' ] - catalystVersions: [ 'latest' ] + + # Run on dnceng-public (Helix) + - ${{ if eq(variables['Build.DefinitionName'], 'maui-pr-devicetests') }}: + + # Use Helix for iOS / Android and MacCatalyst Device Tests + - template: /eng/pipelines/arcade/stage-device-tests.yml@self + parameters: + pool: ${{ parameters.macOSPool }} + runAsPublic: true + prepareSteps: + - template: /eng/pipelines/common/provision.yml@self + parameters: + checkoutDirectory: '$(System.DefaultWorkingDirectory)' + skipJdk: false + skipAndroidCommonSdks: false + skipAndroidPlatformApis: false + onlyAndroidPlatformDefaultApis: true + skipAndroidEmulatorImages: true + skipAndroidCreateAvds: true + skipProvisioning: true + skipXcode: true + + # Just use the old way for Windows Device Tests + - template: common/device-tests.yml + parameters: + windowsPool: ${{ parameters.windowsPool }} + targetFrameworkVersion: ${{ targetFrameworkVersion }} windowsVersions: [ 'packaged', 'unpackaged' ] - provisionatorChannel: ${{ parameters.provisionatorChannel }} - skipProvisioning: ${{ not(parameters.UseProvisionator) }} - projects: - - name: essentials - desc: Essentials - androidApiLevelsExclude: [ 25, 27 ] # Ignore for now API25 since the runs's are not stable - androidConfiguration: 'Release' - iOSConfiguration: 'Debug' - windowsConfiguration: 'Debug' - windowsPackageId: 'com.microsoft.maui.essentials.devicetests' - android: $(System.DefaultWorkingDirectory)/src/Essentials/test/DeviceTests/Essentials.DeviceTests.csproj - ios: $(System.DefaultWorkingDirectory)/src/Essentials/test/DeviceTests/Essentials.DeviceTests.csproj - catalyst: $(System.DefaultWorkingDirectory)/src/Essentials/test/DeviceTests/Essentials.DeviceTests.csproj - windows: $(System.DefaultWorkingDirectory)/src/Essentials/test/DeviceTests/Essentials.DeviceTests.csproj - - name: graphics - desc: Graphics - androidApiLevelsExclude: [ 25, 28 ] # Ignore for now API25 and API28 since the runs's are not stable - androidConfiguration: 'Release' - iOSConfiguration: 'Debug' - windowsConfiguration: 'Debug' - windowsPackageId: 'com.microsoft.maui.graphics.devicetests' - android: $(System.DefaultWorkingDirectory)/src/Graphics/tests/DeviceTests/Graphics.DeviceTests.csproj - ios: $(System.DefaultWorkingDirectory)/src/Graphics/tests/DeviceTests/Graphics.DeviceTests.csproj - catalyst: $(System.DefaultWorkingDirectory)/src/Graphics/tests/DeviceTests/Graphics.DeviceTests.csproj - windows: $(System.DefaultWorkingDirectory)/src/Graphics/tests/DeviceTests/Graphics.DeviceTests.csproj - - name: core - desc: Core - androidApiLevelsExclude: [ 25 ] # Ignore for now API25 since the runs's are not stable - androidConfiguration: 'Release' - iOSConfiguration: 'Debug' - windowsConfiguration: 'Debug' - windowsPackageId: 'com.microsoft.maui.core.devicetests' - android: $(System.DefaultWorkingDirectory)/src/Core/tests/DeviceTests/Core.DeviceTests.csproj - ios: $(System.DefaultWorkingDirectory)/src/Core/tests/DeviceTests/Core.DeviceTests.csproj - catalyst: $(System.DefaultWorkingDirectory)/src/Core/tests/DeviceTests/Core.DeviceTests.csproj - windows: $(System.DefaultWorkingDirectory)/src/Core/tests/DeviceTests/Core.DeviceTests.csproj - - name: controls - desc: Controls - androidApiLevelsExclude: [ 27, 25 ] # Ignore for now API25 since the runs's are not stable - androidConfiguration: 'Debug' - iOSConfiguration: 'Debug' - windowsConfiguration: 'Debug' - windowsPackageId: 'com.microsoft.maui.controls.devicetests' - android: $(System.DefaultWorkingDirectory)/src/Controls/tests/DeviceTests/Controls.DeviceTests.csproj - ios: $(System.DefaultWorkingDirectory)/src/Controls/tests/DeviceTests/Controls.DeviceTests.csproj - catalyst: $(System.DefaultWorkingDirectory)/src/Controls/tests/DeviceTests/Controls.DeviceTests.csproj - windows: $(System.DefaultWorkingDirectory)/src/Controls/tests/DeviceTests/Controls.DeviceTests.csproj - - name: blazorwebview - desc: BlazorWebView - androidApiLevelsExclude: [ 30, 29, 28, 27, 26, 25, 24, 23, 22, 21 ] # BlazorWebView requires a recent version of Chrome - androidConfiguration: 'Release' - iOSConfiguration: 'Debug' - windowsConfiguration: 'Debug' - windowsPackageId: 'Microsoft.Maui.MauiBlazorWebView.DeviceTests' - android: $(System.DefaultWorkingDirectory)/src/BlazorWebView/tests/MauiDeviceTests/MauiBlazorWebView.DeviceTests.csproj - ios: $(System.DefaultWorkingDirectory)/src/BlazorWebView/tests/MauiDeviceTests/MauiBlazorWebView.DeviceTests.csproj - catalyst: $(System.DefaultWorkingDirectory)/src/BlazorWebView/tests/MauiDeviceTests/MauiBlazorWebView.DeviceTests.csproj - windows: $(System.DefaultWorkingDirectory)/src/BlazorWebView/tests/MauiDeviceTests/MauiBlazorWebView.DeviceTests.csproj + skipProvisioning: true + projects: + - name: essentials + desc: Essentials + windowsConfiguration: 'Debug' + windowsPackageId: 'com.microsoft.maui.essentials.devicetests' + windows: $(System.DefaultWorkingDirectory)/src/Essentials/test/DeviceTests/Essentials.DeviceTests.csproj + - name: graphics + desc: Graphics + windowsConfiguration: 'Debug' + windowsPackageId: 'com.microsoft.maui.graphics.devicetests' + windows: $(System.DefaultWorkingDirectory)/src/Graphics/tests/DeviceTests/Graphics.DeviceTests.csproj + - name: core + desc: Core + windowsConfiguration: 'Debug' + windowsPackageId: 'com.microsoft.maui.core.devicetests' + windows: $(System.DefaultWorkingDirectory)/src/Core/tests/DeviceTests/Core.DeviceTests.csproj + - name: controls + desc: Controls + windowsConfiguration: 'Debug' + windowsPackageId: 'com.microsoft.maui.controls.devicetests' + windows: $(System.DefaultWorkingDirectory)/src/Controls/tests/DeviceTests/Controls.DeviceTests.csproj + - name: blazorwebview + desc: BlazorWebView + windowsConfiguration: 'Debug' + windowsPackageId: 'Microsoft.Maui.MauiBlazorWebView.DeviceTests' + windows: $(System.DefaultWorkingDirectory)/src/BlazorWebView/tests/DeviceTests/MauiBlazorWebView.DeviceTests.csproj + platforms: + - windows + + # Run on xamarin public instance + - ${{ else }}: + + - template: common/device-tests.yml + parameters: + androidPool: ${{ parameters.androidPool }} + iosPool: ${{ parameters.iosPool }} + catalystPool: ${{ parameters.catalystPool }} + windowsPool: ${{ parameters.windowsPool }} + targetFrameworkVersion: ${{ targetFrameworkVersion }} + ${{ if or(parameters.BuildEverything, and(ne(variables['Build.Reason'], 'PullRequest'), eq(variables['System.TeamProject'], 'devdiv'))) }}: + androidApiLevels: [ 33, 30, 29, 27, 26, 25, 24, 23 ] + iosVersions: [ 'simulator-18.4' ] + catalystVersions: [ 'latest' ] + windowsVersions: [ 'packaged', 'unpackaged' ] + skipProvisioning: ${{ or(not(parameters.UseProvisionator), false) }} + ${{ else }}: + androidApiLevels: [ 33, 23 ] + iosVersions: [ 'simulator-18.4' ] + catalystVersions: [ 'latest' ] + windowsVersions: [ 'packaged', 'unpackaged' ] + skipProvisioning: ${{ not(parameters.UseProvisionator) }} + projects: + - name: essentials + desc: Essentials + androidApiLevelsExclude: [ 25, 27 ] # Ignore for now API25 since the runs's are not stable + androidConfiguration: 'Release' + iOSConfiguration: 'Debug' + windowsConfiguration: 'Debug' + windowsPackageId: 'com.microsoft.maui.essentials.devicetests' + android: $(System.DefaultWorkingDirectory)/src/Essentials/test/DeviceTests/Essentials.DeviceTests.csproj + ios: $(System.DefaultWorkingDirectory)/src/Essentials/test/DeviceTests/Essentials.DeviceTests.csproj + catalyst: $(System.DefaultWorkingDirectory)/src/Essentials/test/DeviceTests/Essentials.DeviceTests.csproj + windows: $(System.DefaultWorkingDirectory)/src/Essentials/test/DeviceTests/Essentials.DeviceTests.csproj + - name: graphics + desc: Graphics + androidApiLevelsExclude: [ 25, 28 ] # Ignore for now API25 since the runs's are not stable + androidConfiguration: 'Release' + iOSConfiguration: 'Debug' + windowsConfiguration: 'Debug' + windowsPackageId: 'com.microsoft.maui.graphics.devicetests' + android: $(System.DefaultWorkingDirectory)/src/Graphics/tests/DeviceTests/Graphics.DeviceTests.csproj + ios: $(System.DefaultWorkingDirectory)/src/Graphics/tests/DeviceTests/Graphics.DeviceTests.csproj + catalyst: $(System.DefaultWorkingDirectory)/src/Graphics/tests/DeviceTests/Graphics.DeviceTests.csproj + windows: $(System.DefaultWorkingDirectory)/src/Graphics/tests/DeviceTests/Graphics.DeviceTests.csproj + - name: core + desc: Core + androidApiLevelsExclude: [ 25 ] # Ignore for now API25 since the runs's are not stable + androidConfiguration: 'Release' + iOSConfiguration: 'Debug' + windowsConfiguration: 'Debug' + windowsPackageId: 'com.microsoft.maui.core.devicetests' + android: $(System.DefaultWorkingDirectory)/src/Core/tests/DeviceTests/Core.DeviceTests.csproj + ios: $(System.DefaultWorkingDirectory)/src/Core/tests/DeviceTests/Core.DeviceTests.csproj + catalyst: $(System.DefaultWorkingDirectory)/src/Core/tests/DeviceTests/Core.DeviceTests.csproj + windows: $(System.DefaultWorkingDirectory)/src/Core/tests/DeviceTests/Core.DeviceTests.csproj + - name: controls + desc: Controls + androidApiLevelsExclude: [ 27, 25 ] # Ignore for now API25 since the runs's are not stable + androidConfiguration: 'Debug' + iOSConfiguration: 'Debug' + windowsConfiguration: 'Debug' + windowsPackageId: 'com.microsoft.maui.controls.devicetests' + android: $(System.DefaultWorkingDirectory)/src/Controls/tests/DeviceTests/Controls.DeviceTests.csproj + ios: $(System.DefaultWorkingDirectory)/src/Controls/tests/DeviceTests/Controls.DeviceTests.csproj + catalyst: $(System.DefaultWorkingDirectory)/src/Controls/tests/DeviceTests/Controls.DeviceTests.csproj + windows: $(System.DefaultWorkingDirectory)/src/Controls/tests/DeviceTests/Controls.DeviceTests.csproj + - name: blazorwebview + desc: BlazorWebView + androidApiLevelsExclude: [ 30, 29, 28, 27, 26, 25, 24, 23, 22, 21 ] # BlazorWebView requires a recent version of Chrome + androidConfiguration: 'Release' + iOSConfiguration: 'Debug' + windowsConfiguration: 'Debug' + windowsPackageId: 'Microsoft.Maui.MauiBlazorWebView.DeviceTests' + android: $(System.DefaultWorkingDirectory)/src/BlazorWebView/tests/DeviceTests/MauiBlazorWebView.DeviceTests.csproj + ios: $(System.DefaultWorkingDirectory)/src/BlazorWebView/tests/DeviceTests/MauiBlazorWebView.DeviceTests.csproj + catalyst: $(System.DefaultWorkingDirectory)/src/BlazorWebView/tests/DeviceTests/MauiBlazorWebView.DeviceTests.csproj + windows: $(System.DefaultWorkingDirectory)/src/BlazorWebView/tests/DeviceTests/MauiBlazorWebView.DeviceTests.csproj \ No newline at end of file diff --git a/eng/test-configuration.json b/eng/test-configuration.json new file mode 100644 index 000000000000..4ef6d9cf4a76 --- /dev/null +++ b/eng/test-configuration.json @@ -0,0 +1,12 @@ +{ + "version" : 1, + "defaultOnFailure": "fail", + "localRerunCount" : 2, + "retryOnRules": [ + {"testAssembly": {"wildcard": "Microsoft.Maui.Controls.*" }} + ], + "failOnRules": [ + ], + "quarantineRules": [ + ] +} \ No newline at end of file diff --git a/es-metadata.yml b/es-metadata.yml new file mode 100644 index 000000000000..46d81d275952 --- /dev/null +++ b/es-metadata.yml @@ -0,0 +1,8 @@ +schemaVersion: 0.0.1 +isProduction: true +accountableOwners: + service: 9d770e15-6208-4284-b347-b2762803623b +routing: + defaultAreaPath: + org: devdiv + path: DevDiv\.NET MAUI diff --git a/src/BlazorWebView/src/Maui/BlazorWebViewHandler.cs b/src/BlazorWebView/src/Maui/BlazorWebViewHandler.cs index d8d4f11f78da..052a96f5586f 100644 --- a/src/BlazorWebView/src/Maui/BlazorWebViewHandler.cs +++ b/src/BlazorWebView/src/Maui/BlazorWebViewHandler.cs @@ -25,6 +25,10 @@ public partial class BlazorWebViewHandler { [nameof(IBlazorWebView.HostPage)] = MapHostPage, [nameof(IBlazorWebView.RootComponents)] = MapRootComponents, +#if WINDOWS + [nameof(IView.FlowDirection)] = MapFlowDirection, +#endif + }; /// diff --git a/src/BlazorWebView/src/Maui/Windows/BlazorWebViewHandler.Windows.cs b/src/BlazorWebView/src/Maui/Windows/BlazorWebViewHandler.Windows.cs index 17839d87cf49..0ed8171e6d02 100644 --- a/src/BlazorWebView/src/Maui/Windows/BlazorWebViewHandler.Windows.cs +++ b/src/BlazorWebView/src/Maui/Windows/BlazorWebViewHandler.Windows.cs @@ -114,6 +114,12 @@ private void StartWebViewCoreIfPossible() _webviewManager.Navigate(VirtualView.StartPath); } + internal static void MapFlowDirection(BlazorWebViewHandler handler, IView view) + { + // Explicitly do nothing here to override the base ViewHandler.MapFlowDirection behavior + // This prevents the WebView2.FlowDirection from being set, avoiding content mirroring + } + internal IFileProvider CreateFileProvider(string contentRootDir) { // On WinUI we override HandleWebResourceRequest in WinUIWebViewManager so that loading static assets is done entirely there in an async manner. diff --git a/src/BlazorWebView/tests/MauiDeviceTests/Components/NoOpComponent.razor b/src/BlazorWebView/tests/DeviceTests/Components/NoOpComponent.razor similarity index 100% rename from src/BlazorWebView/tests/MauiDeviceTests/Components/NoOpComponent.razor rename to src/BlazorWebView/tests/DeviceTests/Components/NoOpComponent.razor diff --git a/src/BlazorWebView/tests/MauiDeviceTests/Components/TestComponent1.razor b/src/BlazorWebView/tests/DeviceTests/Components/TestComponent1.razor similarity index 100% rename from src/BlazorWebView/tests/MauiDeviceTests/Components/TestComponent1.razor rename to src/BlazorWebView/tests/DeviceTests/Components/TestComponent1.razor diff --git a/src/BlazorWebView/tests/MauiDeviceTests/Components/TestComponent1.razor.css b/src/BlazorWebView/tests/DeviceTests/Components/TestComponent1.razor.css similarity index 100% rename from src/BlazorWebView/tests/MauiDeviceTests/Components/TestComponent1.razor.css rename to src/BlazorWebView/tests/DeviceTests/Components/TestComponent1.razor.css diff --git a/src/BlazorWebView/tests/MauiDeviceTests/Components/_Imports.razor b/src/BlazorWebView/tests/DeviceTests/Components/_Imports.razor similarity index 100% rename from src/BlazorWebView/tests/MauiDeviceTests/Components/_Imports.razor rename to src/BlazorWebView/tests/DeviceTests/Components/_Imports.razor diff --git a/src/BlazorWebView/tests/MauiDeviceTests/ControlsDeviceTestExtensions.cs b/src/BlazorWebView/tests/DeviceTests/ControlsDeviceTestExtensions.cs similarity index 100% rename from src/BlazorWebView/tests/MauiDeviceTests/ControlsDeviceTestExtensions.cs rename to src/BlazorWebView/tests/DeviceTests/ControlsDeviceTestExtensions.cs diff --git a/src/BlazorWebView/tests/MauiDeviceTests/ControlsHandlerTestBase.cs b/src/BlazorWebView/tests/DeviceTests/ControlsHandlerTestBase.cs similarity index 100% rename from src/BlazorWebView/tests/MauiDeviceTests/ControlsHandlerTestBase.cs rename to src/BlazorWebView/tests/DeviceTests/ControlsHandlerTestBase.cs diff --git a/src/BlazorWebView/tests/MauiDeviceTests/Directory.Build.targets b/src/BlazorWebView/tests/DeviceTests/Directory.Build.targets similarity index 100% rename from src/BlazorWebView/tests/MauiDeviceTests/Directory.Build.targets rename to src/BlazorWebView/tests/DeviceTests/Directory.Build.targets diff --git a/src/BlazorWebView/tests/MauiDeviceTests/Elements/BlazorWebViewTests.Behaviors.cs b/src/BlazorWebView/tests/DeviceTests/Elements/BlazorWebViewTests.Behaviors.cs similarity index 100% rename from src/BlazorWebView/tests/MauiDeviceTests/Elements/BlazorWebViewTests.Behaviors.cs rename to src/BlazorWebView/tests/DeviceTests/Elements/BlazorWebViewTests.Behaviors.cs diff --git a/src/BlazorWebView/tests/MauiDeviceTests/Elements/BlazorWebViewTests.Components.cs b/src/BlazorWebView/tests/DeviceTests/Elements/BlazorWebViewTests.Components.cs similarity index 100% rename from src/BlazorWebView/tests/MauiDeviceTests/Elements/BlazorWebViewTests.Components.cs rename to src/BlazorWebView/tests/DeviceTests/Elements/BlazorWebViewTests.Components.cs diff --git a/src/BlazorWebView/tests/MauiDeviceTests/Elements/BlazorWebViewTests.Logging.cs b/src/BlazorWebView/tests/DeviceTests/Elements/BlazorWebViewTests.Logging.cs similarity index 100% rename from src/BlazorWebView/tests/MauiDeviceTests/Elements/BlazorWebViewTests.Logging.cs rename to src/BlazorWebView/tests/DeviceTests/Elements/BlazorWebViewTests.Logging.cs diff --git a/src/BlazorWebView/tests/MauiDeviceTests/Elements/BlazorWebViewTests.Navigation.cs b/src/BlazorWebView/tests/DeviceTests/Elements/BlazorWebViewTests.Navigation.cs similarity index 100% rename from src/BlazorWebView/tests/MauiDeviceTests/Elements/BlazorWebViewTests.Navigation.cs rename to src/BlazorWebView/tests/DeviceTests/Elements/BlazorWebViewTests.Navigation.cs diff --git a/src/BlazorWebView/tests/MauiDeviceTests/Elements/BlazorWebViewTests.RequestInterception.cs b/src/BlazorWebView/tests/DeviceTests/Elements/BlazorWebViewTests.RequestInterception.cs similarity index 100% rename from src/BlazorWebView/tests/MauiDeviceTests/Elements/BlazorWebViewTests.RequestInterception.cs rename to src/BlazorWebView/tests/DeviceTests/Elements/BlazorWebViewTests.RequestInterception.cs diff --git a/src/BlazorWebView/tests/MauiDeviceTests/Elements/BlazorWebViewTests.Services.cs b/src/BlazorWebView/tests/DeviceTests/Elements/BlazorWebViewTests.Services.cs similarity index 100% rename from src/BlazorWebView/tests/MauiDeviceTests/Elements/BlazorWebViewTests.Services.cs rename to src/BlazorWebView/tests/DeviceTests/Elements/BlazorWebViewTests.Services.cs diff --git a/src/BlazorWebView/tests/MauiDeviceTests/Elements/BlazorWebViewTests.cs b/src/BlazorWebView/tests/DeviceTests/Elements/BlazorWebViewTests.cs similarity index 100% rename from src/BlazorWebView/tests/MauiDeviceTests/Elements/BlazorWebViewTests.cs rename to src/BlazorWebView/tests/DeviceTests/Elements/BlazorWebViewTests.cs diff --git a/src/BlazorWebView/tests/MauiDeviceTests/MauiAppNewWindowStub.Windows.cs b/src/BlazorWebView/tests/DeviceTests/MauiAppNewWindowStub.Windows.cs similarity index 100% rename from src/BlazorWebView/tests/MauiDeviceTests/MauiAppNewWindowStub.Windows.cs rename to src/BlazorWebView/tests/DeviceTests/MauiAppNewWindowStub.Windows.cs diff --git a/src/BlazorWebView/tests/MauiDeviceTests/MauiBlazorWebView.DeviceTests.csproj b/src/BlazorWebView/tests/DeviceTests/MauiBlazorWebView.DeviceTests.csproj similarity index 100% rename from src/BlazorWebView/tests/MauiDeviceTests/MauiBlazorWebView.DeviceTests.csproj rename to src/BlazorWebView/tests/DeviceTests/MauiBlazorWebView.DeviceTests.csproj diff --git a/src/BlazorWebView/tests/MauiDeviceTests/MauiProgram.cs b/src/BlazorWebView/tests/DeviceTests/MauiProgram.cs similarity index 100% rename from src/BlazorWebView/tests/MauiDeviceTests/MauiProgram.cs rename to src/BlazorWebView/tests/DeviceTests/MauiProgram.cs diff --git a/src/BlazorWebView/tests/MauiDeviceTests/Platforms/Android/AndroidManifest.xml b/src/BlazorWebView/tests/DeviceTests/Platforms/Android/AndroidManifest.xml similarity index 100% rename from src/BlazorWebView/tests/MauiDeviceTests/Platforms/Android/AndroidManifest.xml rename to src/BlazorWebView/tests/DeviceTests/Platforms/Android/AndroidManifest.xml diff --git a/src/BlazorWebView/tests/MauiDeviceTests/Platforms/MacCatalyst/Info.plist b/src/BlazorWebView/tests/DeviceTests/Platforms/MacCatalyst/Info.plist similarity index 100% rename from src/BlazorWebView/tests/MauiDeviceTests/Platforms/MacCatalyst/Info.plist rename to src/BlazorWebView/tests/DeviceTests/Platforms/MacCatalyst/Info.plist diff --git a/src/BlazorWebView/tests/MauiDeviceTests/Platforms/Windows/App.xaml b/src/BlazorWebView/tests/DeviceTests/Platforms/Windows/App.xaml similarity index 100% rename from src/BlazorWebView/tests/MauiDeviceTests/Platforms/Windows/App.xaml rename to src/BlazorWebView/tests/DeviceTests/Platforms/Windows/App.xaml diff --git a/src/BlazorWebView/tests/MauiDeviceTests/Platforms/Windows/App.xaml.cs b/src/BlazorWebView/tests/DeviceTests/Platforms/Windows/App.xaml.cs similarity index 100% rename from src/BlazorWebView/tests/MauiDeviceTests/Platforms/Windows/App.xaml.cs rename to src/BlazorWebView/tests/DeviceTests/Platforms/Windows/App.xaml.cs diff --git a/src/BlazorWebView/tests/MauiDeviceTests/Platforms/Windows/Package.appxmanifest b/src/BlazorWebView/tests/DeviceTests/Platforms/Windows/Package.appxmanifest similarity index 100% rename from src/BlazorWebView/tests/MauiDeviceTests/Platforms/Windows/Package.appxmanifest rename to src/BlazorWebView/tests/DeviceTests/Platforms/Windows/Package.appxmanifest diff --git a/src/BlazorWebView/tests/MauiDeviceTests/Platforms/Windows/app.manifest b/src/BlazorWebView/tests/DeviceTests/Platforms/Windows/app.manifest similarity index 100% rename from src/BlazorWebView/tests/MauiDeviceTests/Platforms/Windows/app.manifest rename to src/BlazorWebView/tests/DeviceTests/Platforms/Windows/app.manifest diff --git a/src/BlazorWebView/tests/MauiDeviceTests/Platforms/iOS/Info.plist b/src/BlazorWebView/tests/DeviceTests/Platforms/iOS/Info.plist similarity index 100% rename from src/BlazorWebView/tests/MauiDeviceTests/Platforms/iOS/Info.plist rename to src/BlazorWebView/tests/DeviceTests/Platforms/iOS/Info.plist diff --git a/src/BlazorWebView/tests/MauiDeviceTests/Properties/launchSettings.json b/src/BlazorWebView/tests/DeviceTests/Properties/launchSettings.json similarity index 100% rename from src/BlazorWebView/tests/MauiDeviceTests/Properties/launchSettings.json rename to src/BlazorWebView/tests/DeviceTests/Properties/launchSettings.json diff --git a/src/BlazorWebView/tests/MauiDeviceTests/Resources/Images/black.png b/src/BlazorWebView/tests/DeviceTests/Resources/Images/black.png similarity index 100% rename from src/BlazorWebView/tests/MauiDeviceTests/Resources/Images/black.png rename to src/BlazorWebView/tests/DeviceTests/Resources/Images/black.png diff --git a/src/BlazorWebView/tests/MauiDeviceTests/Resources/Images/blue.png b/src/BlazorWebView/tests/DeviceTests/Resources/Images/blue.png similarity index 100% rename from src/BlazorWebView/tests/MauiDeviceTests/Resources/Images/blue.png rename to src/BlazorWebView/tests/DeviceTests/Resources/Images/blue.png diff --git a/src/BlazorWebView/tests/MauiDeviceTests/Resources/Images/green.png b/src/BlazorWebView/tests/DeviceTests/Resources/Images/green.png similarity index 100% rename from src/BlazorWebView/tests/MauiDeviceTests/Resources/Images/green.png rename to src/BlazorWebView/tests/DeviceTests/Resources/Images/green.png diff --git a/src/BlazorWebView/tests/MauiDeviceTests/Resources/Images/red.png b/src/BlazorWebView/tests/DeviceTests/Resources/Images/red.png similarity index 100% rename from src/BlazorWebView/tests/MauiDeviceTests/Resources/Images/red.png rename to src/BlazorWebView/tests/DeviceTests/Resources/Images/red.png diff --git a/src/BlazorWebView/tests/MauiDeviceTests/Resources/Images/white.png b/src/BlazorWebView/tests/DeviceTests/Resources/Images/white.png similarity index 100% rename from src/BlazorWebView/tests/MauiDeviceTests/Resources/Images/white.png rename to src/BlazorWebView/tests/DeviceTests/Resources/Images/white.png diff --git a/src/BlazorWebView/tests/MauiDeviceTests/Resources/appicon.svg b/src/BlazorWebView/tests/DeviceTests/Resources/appicon.svg similarity index 100% rename from src/BlazorWebView/tests/MauiDeviceTests/Resources/appicon.svg rename to src/BlazorWebView/tests/DeviceTests/Resources/appicon.svg diff --git a/src/BlazorWebView/tests/MauiDeviceTests/Resources/appiconfg.svg b/src/BlazorWebView/tests/DeviceTests/Resources/appiconfg.svg similarity index 100% rename from src/BlazorWebView/tests/MauiDeviceTests/Resources/appiconfg.svg rename to src/BlazorWebView/tests/DeviceTests/Resources/appiconfg.svg diff --git a/src/BlazorWebView/tests/MauiDeviceTests/TestCategory.cs b/src/BlazorWebView/tests/DeviceTests/TestCategory.cs similarity index 100% rename from src/BlazorWebView/tests/MauiDeviceTests/TestCategory.cs rename to src/BlazorWebView/tests/DeviceTests/TestCategory.cs diff --git a/src/BlazorWebView/tests/MauiDeviceTests/TestLogger.cs b/src/BlazorWebView/tests/DeviceTests/TestLogger.cs similarity index 100% rename from src/BlazorWebView/tests/MauiDeviceTests/TestLogger.cs rename to src/BlazorWebView/tests/DeviceTests/TestLogger.cs diff --git a/src/BlazorWebView/tests/MauiDeviceTests/WebViewHelpers.Android.cs b/src/BlazorWebView/tests/DeviceTests/WebViewHelpers.Android.cs similarity index 100% rename from src/BlazorWebView/tests/MauiDeviceTests/WebViewHelpers.Android.cs rename to src/BlazorWebView/tests/DeviceTests/WebViewHelpers.Android.cs diff --git a/src/BlazorWebView/tests/MauiDeviceTests/WebViewHelpers.NetStandard.cs b/src/BlazorWebView/tests/DeviceTests/WebViewHelpers.NetStandard.cs similarity index 100% rename from src/BlazorWebView/tests/MauiDeviceTests/WebViewHelpers.NetStandard.cs rename to src/BlazorWebView/tests/DeviceTests/WebViewHelpers.NetStandard.cs diff --git a/src/BlazorWebView/tests/MauiDeviceTests/WebViewHelpers.Shared.cs b/src/BlazorWebView/tests/DeviceTests/WebViewHelpers.Shared.cs similarity index 100% rename from src/BlazorWebView/tests/MauiDeviceTests/WebViewHelpers.Shared.cs rename to src/BlazorWebView/tests/DeviceTests/WebViewHelpers.Shared.cs diff --git a/src/BlazorWebView/tests/MauiDeviceTests/WebViewHelpers.Windows.cs b/src/BlazorWebView/tests/DeviceTests/WebViewHelpers.Windows.cs similarity index 100% rename from src/BlazorWebView/tests/MauiDeviceTests/WebViewHelpers.Windows.cs rename to src/BlazorWebView/tests/DeviceTests/WebViewHelpers.Windows.cs diff --git a/src/BlazorWebView/tests/MauiDeviceTests/WebViewHelpers.iOS.cs b/src/BlazorWebView/tests/DeviceTests/WebViewHelpers.iOS.cs similarity index 100% rename from src/BlazorWebView/tests/MauiDeviceTests/WebViewHelpers.iOS.cs rename to src/BlazorWebView/tests/DeviceTests/WebViewHelpers.iOS.cs diff --git a/src/Controls/docs/Microsoft.Maui.Controls/BindingBase.xml b/src/Controls/docs/Microsoft.Maui.Controls/BindingBase.xml deleted file mode 100644 index b409e7826204..000000000000 --- a/src/Controls/docs/Microsoft.Maui.Controls/BindingBase.xml +++ /dev/null @@ -1,230 +0,0 @@ - - - - - - - Microsoft.Maui.Controls.Core - 0.0.0.0 - 1.0.0.0 - 1.1.0.0 - 1.2.0.0 - 1.3.0.0 - 1.4.0.0 - 1.5.0.0 - 2.0.0.0 - - - System.Object - - - - An abstract class that provides a and a formatting option. - - - - - - - - Method - - 0.0.0.0 - 1.0.0.0 - 1.1.0.0 - 1.2.0.0 - 1.3.0.0 - 1.4.0.0 - 1.5.0.0 - 2.0.0.0 - Microsoft.Maui.Controls.Core - - - System.Void - - - - - - The collection on which to stop synchronization. - Stops synchronization on the . - See for more information on enabling and disabling synchronization of collections in multithreaded environments. - - - - - - - - Method - - 0.0.0.0 - 1.0.0.0 - 1.1.0.0 - 1.2.0.0 - 1.3.0.0 - 1.4.0.0 - 1.5.0.0 - 2.0.0.0 - Microsoft.Maui.Controls.Core - - - System.Void - - - - - - - - The collection that will be read or updated. - The context or lock object that will be passed to . May be . - The synchronization callback. - Starts synchronization on the by using and . - - Application developers implement and pass it to the method to enable correct multithreaded access to . After synchronization is enabled, the Microsoft.Maui.Controls framework passes an access method, , and a that indicates whether write access is needed, to the application developer's implementation of each time that the framework needs to modify the collection in a multithreaded environment. The application developer's implementation should decide, based on the object (which may be merely a locking object or the object on which the collection lives) and the value of the parameter, whether or not to lock while calling . - Because Microsoft.Maui.Controls maintains a weak reference to , application developers do not need to call to aid in garbage collection. - - - - - - - - - Property - - Microsoft.Maui.Controls.Core - 0.0.0.0 - 2.0.0.0 - - - System.Object - - - Gets or sets the value to use instead of the default value for the property, if no specified value exists. - The value to use instead of the default value for the property, if no specified value exists - - - - - - - - Property - - 0.0.0.0 - 1.0.0.0 - 1.1.0.0 - 1.2.0.0 - 1.3.0.0 - 1.4.0.0 - 1.5.0.0 - 2.0.0.0 - Microsoft.Maui.Controls.Core - - - Microsoft.Maui.Controls.BindingMode - - - Gets or sets the mode for this binding. - - - - - - - - Property - - 0.0.0.0 - 1.0.0.0 - 1.1.0.0 - 1.2.0.0 - 1.3.0.0 - 1.4.0.0 - 1.5.0.0 - 2.0.0.0 - Microsoft.Maui.Controls.Core - - - System.String - - - Gets or sets the string format for this binding. - - A string specifying the format for the value of this binding. - - - - Used for providing a display format for the binding value or compositing the value with other - text. Implementors of decide how the string format is utilized, but - all support standard conventions. - - - allows for one argument for its singular value. - - - - A simple example showing compositing text and determining the display format for the value with a - - - - - - - - - - - - - Property - - Microsoft.Maui.Controls.Core - 0.0.0.0 - 2.0.0.0 - - - System.Object - - - Gets or sets the value to supply for a bound property when the target of the binding is . - The value to supply for a bound property when the target of the binding is . - - - - - - - - Method - - 0.0.0.0 - 1.0.0.0 - 1.1.0.0 - 1.2.0.0 - 1.3.0.0 - 1.4.0.0 - 1.5.0.0 - 2.0.0.0 - Microsoft.Maui.Controls.Core - - - System.Void - - - - Throws an if the binding has been applied. - - Use this method in property setters as bindings cannot be changed once applied. - - - - - diff --git a/src/Controls/docs/Microsoft.Maui.Controls/Grid.xml b/src/Controls/docs/Microsoft.Maui.Controls/Grid.xml deleted file mode 100644 index 39789ea2ebee..000000000000 --- a/src/Controls/docs/Microsoft.Maui.Controls/Grid.xml +++ /dev/null @@ -1,986 +0,0 @@ - - - - - - - Microsoft.Maui.Controls.Core - 0.0.0.0 - 1.0.0.0 - 1.1.0.0 - 1.2.0.0 - 1.3.0.0 - 1.4.0.0 - 1.5.0.0 - 2.0.0.0 - - - Microsoft.Maui.Controls.Layout<Microsoft.Maui.Controls.View> - - Microsoft.Maui.Controls.View - - - - - Microsoft.Maui.Controls.IElementConfiguration<Microsoft.Maui.Controls.Grid> - - - Microsoft.Maui.Controls.IGridController - - - - A layout that arranges views in rows and columns. - - - - - - - Constructor - - 0.0.0.0 - 1.0.0.0 - 1.1.0.0 - 1.2.0.0 - 1.3.0.0 - 1.4.0.0 - 1.5.0.0 - 2.0.0.0 - Microsoft.Maui.Controls.Core - - - - Initializes a new instance of the Grid class. - - - - - - - - - - Property - - 0.0.0.0 - 1.0.0.0 - 1.1.0.0 - 1.2.0.0 - 1.3.0.0 - 1.4.0.0 - 1.5.0.0 - 2.0.0.0 - Microsoft.Maui.Controls.Core - - - Microsoft.Maui.Controls.Grid+IGridList<Microsoft.Maui.Controls.View> - - - Gets the collection of child elements of the Grid. - The collection of child elements. - - Application developers can use implicit collection syntax in XAML to add items to this collection, because this property is the ContentPropertyAttribute for the Grid class. - - - - - - - - - Property - - 0.0.0.0 - 1.0.0.0 - 1.1.0.0 - 1.2.0.0 - 1.3.0.0 - 1.4.0.0 - 1.5.0.0 - 2.0.0.0 - Microsoft.Maui.Controls.Core - - - - System.ComponentModel.TypeConverter(typeof(Microsoft.Maui.Controls.ColumnDefinitionCollectionTypeConverter)) - - - - Microsoft.Maui.Controls.ColumnDefinitionCollection - - - Provides the interface for the bound property that gets or sets the ordered collection of objects that control the layout of columns in the . - A ColumnDefinitionCollection for the Grid instance. - - ColumnDefinitions is an ordered set of ColumnDefinition objects that determine the width of each column. Each successive ColumnDefintion controls the width of each successive column. If ColumnDefinitions is empty, or if there are more columns than definitions, then columns for which there is no definition are rendered as if they were controlled by a ColumnDefinition object that has its property set to . - The property has XAML syntax support. The syntax for this operation is shown below. - - - - - - - - - Field - - 0.0.0.0 - 1.0.0.0 - 1.1.0.0 - 1.2.0.0 - 1.3.0.0 - 1.4.0.0 - 1.5.0.0 - 2.0.0.0 - Microsoft.Maui.Controls.Core - - - Microsoft.Maui.Controls.BindableProperty - - - Implements the property, and allows the class to bind it to properties on other objects at run time. - - - - - - - - - - Field - - 0.0.0.0 - 1.0.0.0 - 1.1.0.0 - 1.2.0.0 - 1.3.0.0 - 1.4.0.0 - 1.5.0.0 - 2.0.0.0 - Microsoft.Maui.Controls.Core - - - Microsoft.Maui.Controls.BindableProperty - - - Implements the attached property that represents the zero-based column index of a child element. See Remarks. - - The interface for this property is defined by the and methods. - - - - - - - - - Property - - 0.0.0.0 - 1.0.0.0 - 1.1.0.0 - 1.2.0.0 - 1.3.0.0 - 1.4.0.0 - 1.5.0.0 - 2.0.0.0 - Microsoft.Maui.Controls.Core - - - System.Double - - - Gets or sets the amount of space between columns in the Grid. This is a bindable property. - The space between columns in this layout. The default is 0. - - - - - - - - Field - - 0.0.0.0 - 1.0.0.0 - 1.1.0.0 - 1.2.0.0 - 1.3.0.0 - 1.4.0.0 - 1.5.0.0 - 2.0.0.0 - Microsoft.Maui.Controls.Core - - - Microsoft.Maui.Controls.BindableProperty - - - Implements the property, and allows the class to bind it to properties on other objects at run time. - - - - - - - - - - Field - - 0.0.0.0 - 1.0.0.0 - 1.1.0.0 - 1.2.0.0 - 1.3.0.0 - 1.4.0.0 - 1.5.0.0 - 2.0.0.0 - Microsoft.Maui.Controls.Core - - - Microsoft.Maui.Controls.BindableProperty - - - Implements the attached property that represents the number of columns that a child element spans. See Remarks. - - The interface for this property is defined by the and methods. - - - - - - - - - Method - - 0.0.0.0 - 1.0.0.0 - 1.1.0.0 - 1.2.0.0 - 1.3.0.0 - 1.4.0.0 - 1.5.0.0 - 2.0.0.0 - Microsoft.Maui.Controls.Core - - - System.Int32 - - - - - - An element that belongs to the Grid layout. - Gets the column of the child element. - The column that the child element is in. - - The method corresponds to the value that is set by the following XAML attached property. - - - Attached Property - Value - - - Column - - An integer that represents the Column in which the item will appear. - - - - The remarks for the method contain syntax for and information about the Column attached property. - - - - - - - - - Method - - 0.0.0.0 - 1.0.0.0 - 1.1.0.0 - 1.2.0.0 - 1.3.0.0 - 1.4.0.0 - 1.5.0.0 - 2.0.0.0 - Microsoft.Maui.Controls.Core - - - System.Int32 - - - - - - An element that belongs to the Grid layout. - Gets the column span of the child element. - The column that the child element is in. - - The method corresponds to the value that is set by the following XAML attached property. - - - Attached Property - Value - - - ColumnSpan - - An integer that represents the number of Columns that the item will span. - - - - The remarks for the method contain syntax for and information about the ColumnSpan attached property. - - - - - - - - - Method - - 0.0.0.0 - 1.0.0.0 - 1.1.0.0 - 1.2.0.0 - 1.3.0.0 - 1.4.0.0 - 1.5.0.0 - 2.0.0.0 - Microsoft.Maui.Controls.Core - - - System.Int32 - - - - - - An element that belongs to the Grid layout. - Gets the row of the child element. - The row that the child element is in. - - The method corresponds to the following XAML attached property: - - - Attached Property - Value - - - Row - - An integer that represents the row in which the item will appear. - - - - The remarks for the method contain syntax for and information about the Row attached property. - - - - - - - - - Method - - 0.0.0.0 - 1.0.0.0 - 1.1.0.0 - 1.2.0.0 - 1.3.0.0 - 1.4.0.0 - 1.5.0.0 - 2.0.0.0 - Microsoft.Maui.Controls.Core - - - System.Int32 - - - - - - An element that belongs to the Grid layout. - Gets the row span of the child element. - The row that the child element is in. - - The method corresponds to the following XAML attached properties: - - - Attached Property - Value - - - RowSpan - An integer that represents the number of rows that the item will span. - - - The remarks for the method contain syntax for and information about the RowSpan attached property. - - - - - - - - - Method - - M:Microsoft.Maui.Controls.IGridController.InvalidateMeasureInernalNonVirtual(Microsoft.Maui.Controls.Internals.InvalidationTrigger) - - - 0.0.0.0 - 2.0.0.0 - Microsoft.Maui.Controls.Core - - - - System.ComponentModel.EditorBrowsable(System.ComponentModel.EditorBrowsableState.Never) - - - - System.Void - - - - - - For internal use by the Microsoft.Maui.Controls platform. - For internal use by the Microsoft.Maui.Controls platform. - - - - - - - - Method - - 0.0.0.0 - 1.0.0.0 - 1.1.0.0 - 1.2.0.0 - 1.3.0.0 - 1.4.0.0 - 1.5.0.0 - 2.0.0.0 - Microsoft.Maui.Controls.Core - - - System.Void - - - - - - - - - X-coordinate of the top left corner of the bounding rectangle. - Y-coordinate of the top left corner of the bounding rectangle. - Width of the bounding rectangle. - Height of the bounding rectangle. - - Lays out the child elements when the layout is invalidated. - - - - - - - - - Method - - M:Microsoft.Maui.Controls.IElementConfiguration`1.On``1 - - - 0.0.0.0 - 2.0.0.0 - Microsoft.Maui.Controls.Core - - - Microsoft.Maui.Controls.IPlatformElementConfiguration<T,Microsoft.Maui.Controls.Grid> - - - - - Microsoft.Maui.Controls.IConfigPlatform - - - - - - The platform configuration that selects the platform specific to use. - Returns the configuration object that the developer can use to call platform-specific methods for the grid control. - - - - - - - - Method - - 0.0.0.0 - 1.0.0.0 - 1.1.0.0 - 1.2.0.0 - 1.3.0.0 - 1.4.0.0 - 1.5.0.0 - 2.0.0.0 - Microsoft.Maui.Controls.Core - - - System.Void - - - - - - The element that was added. - Method that is called when a child is added to this element. - - - - - - - - - - Method - - 0.0.0.0 - 1.4.0.0 - 1.5.0.0 - 2.0.0.0 - Microsoft.Maui.Controls.Core - - - System.Void - - - - Application developers override this to respond when the binding context changes. - - - - - - - - Method - - 0.0.0.0 - 1.0.0.0 - 1.1.0.0 - 1.2.0.0 - 1.3.0.0 - 1.4.0.0 - 1.5.0.0 - 2.0.0.0 - Microsoft.Maui.Controls.Core - - - System.Void - - - - - - The element that was removed. - Method that is called when a child is removed from this element. - - - - - - - - Method - - 0.0.0.0 - 1.0.0.0 - 1.1.0.0 - 1.2.0.0 - 1.3.0.0 - 1.4.0.0 - 1.5.0.0 - 2.0.0.0 - Microsoft.Maui.Controls.Core - - - - System.ComponentModel.EditorBrowsable(System.ComponentModel.EditorBrowsableState.Never) - - - System.Obsolete("OnSizeRequest is obsolete as of version 2.2.0. Please use OnMeasure instead.") - - - - Microsoft.Maui.SizeRequest - - - - - - - The requested width. - The requested height. - Method that is called when an attempt is made to resize this element. - - The new requested size. - - - - - - - - - Property - - 0.0.0.0 - 1.0.0.0 - 1.1.0.0 - 1.2.0.0 - 1.3.0.0 - 1.4.0.0 - 1.5.0.0 - 2.0.0.0 - Microsoft.Maui.Controls.Core - - - - System.ComponentModel.TypeConverter(typeof(Microsoft.Maui.Controls.RowDefinitionCollectionTypeConverter)) - - - - Microsoft.Maui.Controls.RowDefinitionCollection - - - Provides the interface for the bound property that gets or sets the collection of RowDefinition objects that control the heights of each row. - A RowDefinitionCollection for the Grid instance. - - RowDefinitions is an ordered set of objects that determine the height of each row. Each successive RowDefintion controls the width of each successive row. If RowDefinitions is empty, or if there are more rows than definitions, then rows for which there is no definition are rendered as if they were controlled by a RowDefinition object that has its property set to . - - - - - - - - - Field - - 0.0.0.0 - 1.0.0.0 - 1.1.0.0 - 1.2.0.0 - 1.3.0.0 - 1.4.0.0 - 1.5.0.0 - 2.0.0.0 - Microsoft.Maui.Controls.Core - - - Microsoft.Maui.Controls.BindableProperty - - - Implements the property, and allows the class to bind it to properties on other objects at run time. - - - - - - - - Field - - 0.0.0.0 - 1.0.0.0 - 1.1.0.0 - 1.2.0.0 - 1.3.0.0 - 1.4.0.0 - 1.5.0.0 - 2.0.0.0 - Microsoft.Maui.Controls.Core - - - Microsoft.Maui.Controls.BindableProperty - - - Implements the attached property that represents the zero-based row index of a child element. See Remarks. - - The interface for this property is defined by the and methods. - - - - - - - - - Property - - 0.0.0.0 - 1.0.0.0 - 1.1.0.0 - 1.2.0.0 - 1.3.0.0 - 1.4.0.0 - 1.5.0.0 - 2.0.0.0 - Microsoft.Maui.Controls.Core - - - System.Double - - - Gets or sets the amount of space between rows in the Grid. This is a bindable property. - The space between rows in this layout. The default is 0. - - - - - - - - Field - - 0.0.0.0 - 1.0.0.0 - 1.1.0.0 - 1.2.0.0 - 1.3.0.0 - 1.4.0.0 - 1.5.0.0 - 2.0.0.0 - Microsoft.Maui.Controls.Core - - - Microsoft.Maui.Controls.BindableProperty - - - Implements the property, and allows the class to bind it to properties on other objects at run time. - - - - - - - - - - Field - - 0.0.0.0 - 1.0.0.0 - 1.1.0.0 - 1.2.0.0 - 1.3.0.0 - 1.4.0.0 - 1.5.0.0 - 2.0.0.0 - Microsoft.Maui.Controls.Core - - - Microsoft.Maui.Controls.BindableProperty - - - Implements the attached property that represents the number of rows that a child element spans, and allows the class to bind it to properties on other objects at run time. - - The interface for this property is defined by the and methods. - - - - - - - - - Method - - 0.0.0.0 - 1.0.0.0 - 1.1.0.0 - 1.2.0.0 - 1.3.0.0 - 1.4.0.0 - 1.5.0.0 - 2.0.0.0 - Microsoft.Maui.Controls.Core - - - System.Void - - - - - - - A child element of this Grid to move to a different column. - The column in which to place the child element. - Changes the column in which a child element will be placed. - - The method corresponds to the value that is set by the following XAML attached property. - - - Attached Property - Value - - - ColumnSpan - - An integer that represents the Column in which the item will appear. - - - - - - - - - - - - Method - - 0.0.0.0 - 1.0.0.0 - 1.1.0.0 - 1.2.0.0 - 1.3.0.0 - 1.4.0.0 - 1.5.0.0 - 2.0.0.0 - Microsoft.Maui.Controls.Core - - - System.Void - - - - - - - A child element of this Grid on which to assign a new column span. - The new column span. - Changes the column span of the specified child element. - - The method corresponds to the value that is set by the following XAML attached property. - - - Attached Property - Value - - - Column - - An integer that represents the number of Columns that the item will span. - - - - - - - - - - - - Method - - 0.0.0.0 - 1.0.0.0 - 1.1.0.0 - 1.2.0.0 - 1.3.0.0 - 1.4.0.0 - 1.5.0.0 - 2.0.0.0 - Microsoft.Maui.Controls.Core - - - System.Void - - - - - - - A child element of this Grid to move to a different row. - The row in which to place the child element. - Changes the row in which a child element will be placed. - - The method corresponds to the following XAML attached property: - - - Attached Property - Value - - - Row - - An integer that represents the row in which the item will appear. - - - - - - - - - - - - Method - - 0.0.0.0 - 1.0.0.0 - 1.1.0.0 - 1.2.0.0 - 1.3.0.0 - 1.4.0.0 - 1.5.0.0 - 2.0.0.0 - Microsoft.Maui.Controls.Core - - - System.Void - - - - - - - A child element of this Grid on which to assign a new row span. - The new row span. - Changes the row span of the specified child element. - - The method corresponds to the following XAML attached property: - - - Attached Property - Value - - - RowSpan - An integer that represents the number of rows that the item will span. - - - - - - - diff --git a/src/Controls/docs/Microsoft.Maui.Controls/MultiTrigger.xml b/src/Controls/docs/Microsoft.Maui.Controls/MultiTrigger.xml deleted file mode 100644 index d70f68814f35..000000000000 --- a/src/Controls/docs/Microsoft.Maui.Controls/MultiTrigger.xml +++ /dev/null @@ -1,139 +0,0 @@ - - - - - - - Microsoft.Maui.Controls.Core - 0.0.0.0 - 1.3.0.0 - 1.4.0.0 - 1.5.0.0 - 2.0.0.0 - - - Microsoft.Maui.Controls.TriggerBase - - - - - Microsoft.Maui.Controls.ContentProperty("Setters") - - - - Class that represents a list of property and binding conditions, and a list of setters that are applied when all of the conditions in the list are met. - - Developers can use a to compare against property values on the control that contains it by using objects, or on any bound property (including those on the enclosing control) by using objects. These can be mixed in the same list. - - The XML example below, when added to a Microsoft.Maui.Controls app with the correct project namespace, creates a UI that suggests that the user type in a secret and toggle a switch to check if the secret is correct. If the user enters "The text color is green", and toggles the to its On position, then the text that the user typed into the turns green. If either the text is altered to something other than the secret or the Switch is toggled to its Off position, the text returns to the default color - - - - -]]> - - - - - - - - - - - - Constructor - - 0.0.0.0 - 1.3.0.0 - 1.4.0.0 - 1.5.0.0 - 2.0.0.0 - Microsoft.Maui.Controls.Core - - - - - - System.ComponentModel.TypeConverter(typeof(Microsoft.Maui.Controls.TypeTypeConverter)) - - - - - - The type of the trigger target. - Initializes a new instance. - - - - - - - - Property - - 0.0.0.0 - 1.3.0.0 - 1.4.0.0 - 1.5.0.0 - 2.0.0.0 - Microsoft.Maui.Controls.Core - - - System.Collections.Generic.IList<Microsoft.Maui.Controls.Condition> - - - Gets the list of conditions that must be satisfied in ordeer for the setters in the list to be invoked. - - - - - - - - Property - - 0.0.0.0 - 1.3.0.0 - 1.4.0.0 - 1.5.0.0 - 2.0.0.0 - Microsoft.Maui.Controls.Core - - - System.Collections.Generic.IList<Microsoft.Maui.Controls.Setter> - - - Gets the list of objects that will be applied when the list of conditions in the property are all met. - - - - diff --git a/src/Controls/docs/Microsoft.Maui.Controls/WebView.xml b/src/Controls/docs/Microsoft.Maui.Controls/WebView.xml deleted file mode 100644 index e292f31d6202..000000000000 --- a/src/Controls/docs/Microsoft.Maui.Controls/WebView.xml +++ /dev/null @@ -1,842 +0,0 @@ - - - - - - - Microsoft.Maui.Controls.Core - 0.0.0.0 - 1.0.0.0 - 1.1.0.0 - 1.2.0.0 - 1.3.0.0 - 1.4.0.0 - 1.5.0.0 - 2.0.0.0 - - - Microsoft.Maui.Controls.View - - - - Microsoft.Maui.Controls.IElementConfiguration<Microsoft.Maui.Controls.WebView> - - - Microsoft.Maui.Controls.IElementController - - - Microsoft.Maui.Controls.IViewController - - - Microsoft.Maui.Controls.IVisualElementController - - - Microsoft.Maui.Controls.IWebViewController - - - - - Microsoft.Maui.Controls.RenderWith(typeof(Microsoft.Maui.Controls.Platform._WebViewRenderer)) - - - - A that presents HTML content. - - The following example shows a basic use. - - - - - - - - - - - - - - Constructor - - 0.0.0.0 - 1.0.0.0 - 1.1.0.0 - 1.2.0.0 - 1.3.0.0 - 1.4.0.0 - 1.5.0.0 - 2.0.0.0 - Microsoft.Maui.Controls.Core - - - - Creates a new element with default values. - - - - - - - - Property - - 0.0.0.0 - 1.3.0.0 - 1.4.0.0 - 1.5.0.0 - 2.0.0.0 - Microsoft.Maui.Controls.Core - - - System.Boolean - - - Gets a value that indicates whether the user can navigate to previous pages. - - - - - - - - Field - - 0.0.0.0 - 1.3.0.0 - 1.4.0.0 - 1.5.0.0 - 2.0.0.0 - Microsoft.Maui.Controls.Core - - - Microsoft.Maui.Controls.BindableProperty - - - Backing store for the property. - - - - - - - - Property - - 0.0.0.0 - 1.3.0.0 - 1.4.0.0 - 1.5.0.0 - 2.0.0.0 - Microsoft.Maui.Controls.Core - - - System.Boolean - - - Gets a value that indicates whether the user can navigate forward. - - - - - - - - Field - - 0.0.0.0 - 1.3.0.0 - 1.4.0.0 - 1.5.0.0 - 2.0.0.0 - Microsoft.Maui.Controls.Core - - - Microsoft.Maui.Controls.BindableProperty - - - Backing store for the property. - - - - - - - - Property - - Microsoft.Maui.Controls.Core - 2.0.0.0 - - - System.Net.CookieContainer - - - When set this will act as a sync for cookies. - - - - - - - - Field - - Microsoft.Maui.Controls.Core - 2.0.0.0 - - - Microsoft.Maui.Controls.BindableProperty - - - - - - - - - - Method - - 0.0.0.0 - 1.3.0.0 - 1.4.0.0 - 1.5.0.0 - 2.0.0.0 - Microsoft.Maui.Controls.Core - - - System.Void - - - - - - A script to evaluate. - Evaluates the script that is specified by . - - - - - - - - Event - - E:Microsoft.Maui.Controls.IWebViewController.EvalRequested - - - 0.0.0.0 - 2.0.0.0 - Microsoft.Maui.Controls.Core - - - - System.ComponentModel.EditorBrowsable(System.ComponentModel.EditorBrowsableState.Never) - - - - System.EventHandler<Microsoft.Maui.Controls.Internals.EvalRequested> - - - For internal use by the Microsoft.Maui.Controls platform. - - - - - - - - Method - - Microsoft.Maui.Controls.Core - 0.0.0.0 - 2.0.0.0 - - - System.Threading.Tasks.Task<System.String> - - - - - - The script to evaluate. - On platforms that support JavaScript evaluation, evaluates . - A task that contains the result of the evaluation as a string. - Native JavaScript evaluation is supported neither on Tizen nor GTK (Linux). - - - - - - - - Event - - E:Microsoft.Maui.Controls.IWebViewController.EvaluateJavaScriptRequested - - - Microsoft.Maui.Controls.Core - 0.0.0.0 - 2.0.0.0 - - - - System.ComponentModel.EditorBrowsable(System.ComponentModel.EditorBrowsableState.Never) - - - - Microsoft.Maui.Controls.Internals.EvaluateJavaScriptDelegate - - - For internal use by the Microsoft.Maui.Controls platform. - - - - - - - - Method - - 0.0.0.0 - 1.3.0.0 - 1.4.0.0 - 1.5.0.0 - 2.0.0.0 - Microsoft.Maui.Controls.Core - - - System.Void - - - - Navigates to the previous page. - - - - - - - - Event - - E:Microsoft.Maui.Controls.IWebViewController.GoBackRequested - - - 0.0.0.0 - 2.0.0.0 - Microsoft.Maui.Controls.Core - - - - System.ComponentModel.EditorBrowsable(System.ComponentModel.EditorBrowsableState.Never) - - - - System.EventHandler - - - For internal use by the Microsoft.Maui.Controls platform. - - - - - - - - Method - - 0.0.0.0 - 1.3.0.0 - 1.4.0.0 - 1.5.0.0 - 2.0.0.0 - Microsoft.Maui.Controls.Core - - - System.Void - - - - Navigates to the next page in the list of visited pages. - - - - - - - - Event - - E:Microsoft.Maui.Controls.IWebViewController.GoForwardRequested - - - 0.0.0.0 - 2.0.0.0 - Microsoft.Maui.Controls.Core - - - - System.ComponentModel.EditorBrowsable(System.ComponentModel.EditorBrowsableState.Never) - - - - System.EventHandler - - - For internal use by the Microsoft.Maui.Controls platform. - - - - - - - - Event - - 0.0.0.0 - 1.3.0.0 - 1.4.0.0 - 1.5.0.0 - 2.0.0.0 - Microsoft.Maui.Controls.Core - - - System.EventHandler<Microsoft.Maui.Controls.WebNavigatedEventArgs> - - - Event that is raised after navigation completes. - - - - - - - - Event - - 0.0.0.0 - 1.3.0.0 - 1.4.0.0 - 1.5.0.0 - 2.0.0.0 - Microsoft.Maui.Controls.Core - - - System.EventHandler<Microsoft.Maui.Controls.WebNavigatingEventArgs> - - - Event that is raised when navigation starts. - - - - - - - - Method - - M:Microsoft.Maui.Controls.IElementConfiguration`1.On``1 - - - 0.0.0.0 - 2.0.0.0 - Microsoft.Maui.Controls.Core - - - Microsoft.Maui.Controls.IPlatformElementConfiguration<T,Microsoft.Maui.Controls.WebView> - - - - - Microsoft.Maui.Controls.IConfigPlatform - - - - - - To be added. - Returns the platform-specific instance of this , on which a platform-specific method may be called. - - - - - - - - Method - - 0.0.0.0 - 2.0.0.0 - Microsoft.Maui.Controls.Core - - - System.Void - - - - Method that is called when the binding context is changed. - - - - - - - - Method - - 0.0.0.0 - 1.0.0.0 - 1.1.0.0 - 1.2.0.0 - 1.3.0.0 - 1.4.0.0 - 1.5.0.0 - 2.0.0.0 - Microsoft.Maui.Controls.Core - - - System.Void - - - - - - The name of the property that was changed. - Method that is called when is changed. - - - - - - - - Method - - 0.0.0.0 - 1.0.0.0 - 1.1.0.0 - 1.2.0.0 - 1.3.0.0 - 1.4.0.0 - 1.5.0.0 - 2.0.0.0 - Microsoft.Maui.Controls.Core - - - System.Void - - - - - - - The object that raised the event. - The event arguments. - Method that is called when the view source that is specified by the parameter is changed. - - - - - - - - Method - - Microsoft.Maui.Controls.Core - 2.0.0.0 - - - System.Void - - - - - - - - - - - Event - - E:Microsoft.Maui.Controls.IWebViewController.ReloadRequested - - - Microsoft.Maui.Controls.Core - 2.0.0.0 - - - - System.ComponentModel.EditorBrowsable(System.ComponentModel.EditorBrowsableState.Never) - - - - System.EventHandler - - - - - - - - - - Method - - M:Microsoft.Maui.Controls.IWebViewController.SendNavigated(Microsoft.Maui.Controls.WebNavigatedEventArgs) - - - 0.0.0.0 - 2.0.0.0 - Microsoft.Maui.Controls.Core - - - - System.ComponentModel.EditorBrowsable(System.ComponentModel.EditorBrowsableState.Never) - - - - System.Void - - - - - - For internal use by the Microsoft.Maui.Controls platform. - For internal use by the Microsoft.Maui.Controls platform. - - - - - - - - Method - - M:Microsoft.Maui.Controls.IWebViewController.SendNavigating(Microsoft.Maui.Controls.WebNavigatingEventArgs) - - - 0.0.0.0 - 2.0.0.0 - Microsoft.Maui.Controls.Core - - - - System.ComponentModel.EditorBrowsable(System.ComponentModel.EditorBrowsableState.Never) - - - - System.Void - - - - - - For internal use by the Microsoft.Maui.Controls platform. - For internal use by the Microsoft.Maui.Controls platform. - - - - - - - - Property - - 0.0.0.0 - 1.0.0.0 - 1.1.0.0 - 1.2.0.0 - 1.3.0.0 - 1.4.0.0 - 1.5.0.0 - 2.0.0.0 - Microsoft.Maui.Controls.Core - - - - System.ComponentModel.TypeConverter(typeof(Microsoft.Maui.Controls.WebViewSourceTypeConverter)) - - - - Microsoft.Maui.Controls.WebViewSource - - - Gets or sets the object that represents the location that this object displays. - - - - - - - - Field - - 0.0.0.0 - 1.0.0.0 - 1.1.0.0 - 1.2.0.0 - 1.3.0.0 - 1.4.0.0 - 1.5.0.0 - 2.0.0.0 - Microsoft.Maui.Controls.Core - - - Microsoft.Maui.Controls.BindableProperty - - - Backing store for the property. - - - - - - - - Property - - 2.0.0.0 - Microsoft.Maui.Controls.Core - - - System.String - - - Gets or sets the user agent string that this object uses. - - The default value is the default User Agent of the underlying platform browser, or if it cannot be determined. - If the parameter is the User Agent will not be updated and the current User Agent will remain. - - - - - - - - - Field - - 2.0.0.0 - Microsoft.Maui.Controls.Core - - - Microsoft.Maui.Controls.BindableProperty - - - Backing store for the property. - - - - - - - - Property - - P:Microsoft.Maui.Controls.IWebViewController.CanGoBack - - - 0.0.0.0 - 2.0.0.0 - Microsoft.Maui.Controls.Core - - - - System.ComponentModel.EditorBrowsable(System.ComponentModel.EditorBrowsableState.Never) - - - - System.Boolean - - - For internal use by the Microsoft.Maui.Controls platform. - - - - - - - - Property - - P:Microsoft.Maui.Controls.IWebViewController.CanGoForward - - - 0.0.0.0 - 2.0.0.0 - Microsoft.Maui.Controls.Core - - - - System.ComponentModel.EditorBrowsable(System.ComponentModel.EditorBrowsableState.Never) - - - - System.Boolean - - - For internal use by the Microsoft.Maui.Controls platform. - - - - - - - - Event - - E:Microsoft.Maui.Controls.IWebViewController.EvalRequested - - - Microsoft.Maui.Controls.Core - 2.0.0.0 - - - System.EventHandler<Microsoft.Maui.Controls.Internals.EvalRequested> - - - - - - diff --git a/src/Controls/docs/Microsoft.Maui.Controls/_images/WebView.TripleScreenShot.png b/src/Controls/docs/Microsoft.Maui.Controls/_images/WebView.TripleScreenShot.png deleted file mode 100644 index 5e7b6a4be8c8..000000000000 Binary files a/src/Controls/docs/Microsoft.Maui.Controls/_images/WebView.TripleScreenShot.png and /dev/null differ diff --git a/src/Controls/samples/Controls.Sample/Pages/Controls/RadioButtonGalleries/RadioButtonGroupBindingGallery.xaml b/src/Controls/samples/Controls.Sample/Pages/Controls/RadioButtonGalleries/RadioButtonGroupBindingGallery.xaml index c74740669952..c86668d9ac4b 100644 --- a/src/Controls/samples/Controls.Sample/Pages/Controls/RadioButtonGalleries/RadioButtonGroupBindingGallery.xaml +++ b/src/Controls/samples/Controls.Sample/Pages/Controls/RadioButtonGalleries/RadioButtonGroupBindingGallery.xaml @@ -18,6 +18,7 @@ + @@ -28,15 +29,16 @@