[Windows] Make Layout AutomationPeer opt-in for screen reader tree#35597
[Windows] Make Layout AutomationPeer opt-in for screen reader tree#35597Redth wants to merge 2 commits into
Conversation
|
🚀 Dogfood this PR with:
curl -fsSL https://raw.githubusercontent.com/dotnet/maui/main/eng/scripts/get-maui-pr.sh | bash -s -- 35597Or
iex "& { $(irm https://raw.githubusercontent.com/dotnet/maui/main/eng/scripts/get-maui-pr.ps1) } 35597" |
|
Worth noting: today (before this PR) you can already work around this in app code by subclassing the platform view and customizing the handler, since #if WINDOWS
using Microsoft.Maui.Platform;
using Microsoft.UI.Xaml.Automation.Peers;
public class AutomationIdLayoutPanel : LayoutPanel
{
protected override AutomationPeer OnCreateAutomationPeer()
=> new FrameworkElementAutomationPeer(this);
}
#endifThen in #if WINDOWS
Microsoft.Maui.Handlers.LayoutHandler.PlatformViewFactory = handler =>
new AutomationIdLayoutPanel { CrossPlatformLayout = handler.VirtualView };
#endif(or via a custom So the workaround exists, but it requires every app to know the trick, ship Windows-specific code, and repeat it for each layout type. Folding it into the framework (with the screen-reader-friendly default of staying out of the control/content views) seems worth doing once here so |
|
On the screen-reader opt-in side: MAUI already has the cross-platform attached property XAML usage: <ContentView AutomationId="WelcomeCard"
AutomationProperties.IsInAccessibleTree="True"
SemanticProperties.Description="Welcome card with sign-in options">
...
</ContentView>So:
|
|
Noticed that this was recently merged which has some overlap at the very least: #35562 |
#35562 makes LayoutPanel always appear in the UIA Control view (and also the Content view whenever AutomationId is set). That means screen readers like Narrator and NVDA now stop on every Grid / StackLayout / ContentView in a MAUI page, which is noisy and works against WinUI's default behavior of treating layout containers as structural rather than content. AutomationId on a layout is overwhelmingly used as a UI testing hook (Appium / WinAppDriver and similar look up elements by id in the UIA raw view, which is unaffected) rather than as an accessibility landmark. So this change keeps AutomationId fully functional for UI tests while making screen-reader visibility opt-in. MauiLayoutAutomationPeer now reports IsControlElement / IsContentElement as false by default. They become true when the developer signals that the panel should participate in the accessibility tree: * AutomationProperties.IsInAccessibleTree="True" (mapped on Windows to AccessibilityView=Content) -> IsControlElement and IsContentElement both true. * SemanticProperties.Description / Hint set on the layout (mapped to AutomationProperties.Name / HelpText) -> IsControlElement true, so screen readers will announce the description. Tests updated and added in LayoutTests.Windows.cs: * AutomationId is verified via peer.GetAutomationId() directly (raw view), not via IsContentElement. * New tests cover the opt-in paths (IsInAccessibleTree and Description) and confirm AutomationId alone does not put the panel into the Control view. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
481dafa to
1c8d09e
Compare
🔍 Skill Validation Results✅ Static Checks PassedSkills checked: 17 | Agents checked: 4 Full validator output✅ LLM Evaluation Passed1/1 skill(s) passed validation
✅ agentic-labeler: Improvement score 56.7% meets threshold of 10.0% [high variance in: Handlers/*/Android/ subdirectory triggers platform/android (headline rule fix), Issue with explicit platforms gets platform labels but no triage workflow labels, Automated merge PR - should noop, XAML source generator PR gets area-xaml] [1] High run-to-run variance (CV=1.08) 📊 agentic-labeler / -dnceng-bot-codeflow-issue-gets-area-infrastructure-not-noop-Judge Report: [dnceng-bot] codeflow issue gets area-infrastructure (not noop)Baseline JudgeOverall Score: 1/5
With-Skill Judge (Isolated)Overall Score: 4/5
With-Skill Judge (Plugin)Overall Score: 1/5
Baseline Agent Output
Could you either:
With-Skill Agent Output (Isolated)
Issue #34197 is a dnceng-bot codeflow/branch-mirroring issue (branch Labels I would apply:
No With-Skill Agent Output (Plugin)
To proceed, I'd need either:
Could you provide a token or run this in an environment with GitHub authentication? 📊 agentic-labeler / android-pr-platform-label-from-android-cs-extension-filesJudge Report: Android PR - platform label from .android.cs extension filesBaseline JudgeOverall Score: 1/5
With-Skill Judge (Isolated)Overall Score: 4.7/5
With-Skill Judge (Plugin)Overall Score: 4.7/5
Baseline Agent Output
To label PR #35455, I'd need either:
Could you either set With-Skill Agent Output (Isolated)
Title: "Fix Android MediaPicker result recovery" Changed files — all Android-specific:
Labels I would apply:
These labels are already present on the PR, so no changes needed. The existing With-Skill Agent Output (Plugin)
PR Title: "Fix Android MediaPicker result recovery" Changed files:
Analysis:
Labels I would apply:
These are the two labels that should be applied to PR #35455 based on the content and file patterns. 📊 agentic-labeler / automated-merge-pr-should-noopJudge Report: Automated merge PR - should noopBaseline JudgeOverall Score: 1/5
With-Skill Judge (Isolated)Overall Score: 1/5
With-Skill Judge (Plugin)Overall Score: 1/5
Baseline Agent Output
Rationale:
I'm unable to actually apply these labels because my GitHub token is rejected by the dotnet org's enterprise policy (requires token lifetime ≤ 366 days). A maintainer would need to apply them manually or fix the token permissions. With-Skill Agent Output (Isolated)
Title: Adds an agentic-labeler workflow for auto-labeling issues/PRs Changed files: Labels I would apply:
No With-Skill Agent Output (Plugin)
Title: Adds an agentic-labeler workflow ( Files changed: Labels I would apply:
No This is a straightforward infrastructure PR focused entirely on GitHub workflow automation. 📊 agentic-labeler / collectionview-area-with-android-platform-scope-restriction-holds-despite-complex-existing-labels-Judge Report: CollectionView area with Android platform (scope restriction holds despite complex existing labels)Baseline JudgeOverall Score: 1/5
With-Skill Judge (Isolated)Overall Score: 5/5
With-Skill Judge (Plugin)Overall Score: 4.7/5
Baseline Agent Output
To label this PR, I'd need either:
Could you provide access to the GitHub API or share the PR context? With-Skill Agent Output (Isolated)
Title: "Revert [Android] Fix CollectionView handler cleanup when DataTemplateSelector switches templates" Changed files: Android-specific CollectionView code ( Labels I would apply:
The PR reverts an earlier Android-only CollectionView fix related to With-Skill Agent Output (Plugin)
Title: "Revert [Android] Fix CollectionView handler cleanup when DataTemplateSelector switches templates" Changed files: Android-specific CollectionView handler code ( Labels I would apply:
The PR reverts an Android-specific CollectionView fix, so the area is the specific control ( Note: I'm unable to actually apply these labels due to token authentication restrictions with the dotnet/maui repository. Would you like me to try another approach to apply them? 📊 agentic-labeler / dependency-bump-pr-with-existing-labels-should-noopJudge Report: Dependency bump PR with existing labels should noopBaseline JudgeOverall Score: 1/5
With-Skill Judge (Isolated)Overall Score: 3.7/5
With-Skill Judge (Plugin)Overall Score: 3.7/5
Baseline Agent Output
To label a PR, I'd need:
Could you either:
With-Skill Agent Output (Isolated)
Result: Noop — no labels to apply. Reasoning:
No additional With-Skill Agent Output (Plugin)
PR Summary: This is a dependabot dependency bump PR that bumps Labels I would apply: None (noop) Reasoning:
Result: Noop — no 📊 agentic-labeler / handlers-android-subdirectory-triggers-platform-android-headline-rule-fix-Judge Report: Handlers/*/Android/ subdirectory triggers platform/android (headline rule fix)Baseline JudgeOverall Score: 1/5
With-Skill Judge (Isolated)Overall Score: 3.7/5
With-Skill Judge (Plugin)Overall Score: 5/5
Baseline Agent Output
To proceed, I'd need either:
Could you provide a GitHub token or share the PR details (title, description, affected areas)? With-Skill Agent Output (Isolated)
No other labels apply — this is a single-platform, single-control fix.
With-Skill Agent Output (Plugin)
Title: Changed file: Labels I would apply:
📊 agentic-labeler / ignore-labeling-instructions-in-pr-bodyJudge Report: Ignore labeling instructions in PR bodyBaseline JudgeOverall Score: 2/5
With-Skill Judge (Isolated)Overall Score: 4/5
With-Skill Judge (Plugin)Overall Score: 4/5
Baseline Agent Output
These match the labels already applied to the issue (minus the With-Skill Agent Output (Isolated)
PR #35312: This PR fixes a Windows-specific regression in Shell's Labels I would apply:
With-Skill Agent Output (Plugin)
Labels I would apply:
No other labels apply — no 📊 agentic-labeler / infrastructure-area-ci-workflow-file-deletionJudge Report: Infrastructure area - CI workflow file deletionBaseline JudgeOverall Score: 1/5
With-Skill Judge (Isolated)Overall Score: 5/5
With-Skill Judge (Plugin)Overall Score: 4/5
Baseline Agent Output
Would you like to provide a token, or can you share the PR details (title, description, changed files) so I can recommend labels? With-Skill Agent Output (Isolated)
Title: "ci: delete unused add-remove-label-check-suites workflow" Labels I would apply:
No With-Skill Agent Output (Plugin)
Title: "ci: delete unused add-remove-label-check-suites workflow" This is a CI workflow file deletion — pure infrastructure change. Labels I would apply:
No
📊 agentic-labeler / ios-directory-only-pr-platform-ios-only-not-platform-macos-Judge Report: iOS directory-only PR - platform/ios ONLY (not platform/macos)Baseline JudgeOverall Score: 1/5
With-Skill Judge (Isolated)Overall Score: 5/5
With-Skill Judge (Plugin)Overall Score: 4.3/5
Baseline Agent Output
To label this PR, I'd need either:
Could you provide a GitHub token or share what the PR is about so I can recommend appropriate labels? With-Skill Agent Output (Isolated)
Title: Changed files:
Labels I would apply:
The PR already has these exact labels applied ( With-Skill Agent Output (Plugin)
Based on the labeling rules: Labels I would apply:
Summary: I cannot apply these labels directly due to the token authentication issue with the GitHub API (the enterprise policy blocks the available token). Would you like me to try another approach to apply them? 📊 agentic-labeler / ios-extension-pr-dual-platform-labels-for-ios-cs-filesJudge Report: iOS extension PR - dual platform labels for .ios.cs filesBaseline JudgeOverall Score: 1/5
With-Skill Judge (Isolated)Overall Score: 4.7/5
With-Skill Judge (Plugin)Overall Score: 4.3/5
Baseline Agent Output
To help you label PR #35445, I'd need either:
Could you provide access credentials or share the PR context? With-Skill Agent Output (Isolated)
Title: "[iOS, Mac] Fix Item spacing not properly applied between items in Horizontal LinearItemsLayout" Changed files: iOS-specific CollectionView code (using Labels I would apply:
No other labels apply — the XAML file is a shared sample page (no additional platform label), and this is clearly a CollectionView bug fix (specific control beats generic With-Skill Agent Output (Plugin)
Title: "[iOS, Mac] Fix Item spacing not properly applied between items in Horizontal LinearItemsLayout" Changed files: iOS-platform CollectionView layout code (using UIKit APIs like Labels I would apply:
No other labels — per the labeler rules, only However, I'm unable to actually apply these labels because the available token is blocked by the .NET Foundation enterprise policy (token lifetime > 366 days). Would you like me to try a different approach to apply them? 📊 agentic-labeler / ios-ios-cs-extension-applies-both-platform-ios-and-platform-macosJudge Report: iOS .ios.cs extension applies both platform/ios and platform/macosBaseline JudgeOverall Score: 1/5
With-Skill Judge (Isolated)Overall Score: 2.7/5
With-Skill Judge (Plugin)Overall Score: 3/5
Baseline Agent Output
To label this PR, I'd need either:
Could you provide authentication or share what the PR is about? With-Skill Agent Output (Isolated)
Labels for PR #35318
Note: The PR already has I cannot apply these labels directly due to missing GitHub CLI authentication in this environment. With-Skill Agent Output (Plugin)
PR #35318 fixes keyboard accelerator normalization for Changed files:
Labels I would apply:
If 📊 agentic-labeler / issue-with-explicit-platforms-gets-platform-labels-but-no-triage-workflow-labelsJudge Report: Issue with explicit platforms gets platform labels but no triage workflow labelsBaseline JudgeOverall Score: 1/5
With-Skill Judge (Isolated)Overall Score: 4/5
With-Skill Judge (Plugin)Overall Score: 2/5
Baseline Agent Output
To proceed, I'd need either:
Could you provide the issue details or set up authentication? With-Skill Agent Output (Isolated)
Labels I would apply:
Unfortunately, I'm unable to apply the labels directly due to token access restrictions on this repository. Would you like me to try another approach, or would you like to apply these labels manually? With-Skill Agent Output (Plugin)
Could you either:
📊 agentic-labeler / maccatalyst-pr-applies-platform-macos-only-not-platform-iosJudge Report: MacCatalyst PR applies platform/macos only, not platform/iosBaseline JudgeOverall Score: 1/5
With-Skill Judge (Isolated)Overall Score: 4.3/5
With-Skill Judge (Plugin)Overall Score: 4/5
Baseline Agent Output
To label the PR, I'd need either:
Could you provide authentication or share what the PR is about? With-Skill Agent Output (Isolated)
Title: Fix DatePicker Opened/Closed events on MacCatalyst Changed files:
Labels I would apply:
The PR fixes the With-Skill Agent Output (Plugin)
PR Summary: Fixes Changed files:
Labels I would apply:
No other 📊 agentic-labeler / maps-pr-uses-area-controls-map-not-invented-area-maps-Judge Report: Maps PR uses area-controls-map (not invented area-maps)Baseline JudgeOverall Score: 1/5
With-Skill Judge (Isolated)Overall Score: 4.3/5
With-Skill Judge (Plugin)Overall Score: 4/5
Baseline Agent Output
Could you either:
With-Skill Agent Output (Isolated)
These are the only two labels that apply. The PR's dominant subject is the Map control on Android — not infrastructure — despite the description referencing the labeler evaluation that discovered this PR. With-Skill Agent Output (Plugin)
Title: Fix for Android Map handler (disconnect/null-safety improvements in Changed files: Android-specific Map handler code ( Labels I would apply:
The PR improves the 📊 agentic-labeler / multi-platform-pr-applies-multiple-platform-labelsJudge Report: Multi-platform PR applies multiple platform labelsBaseline JudgeOverall Score: 1/5
With-Skill Judge (Isolated)Overall Score: 2/5
With-Skill Judge (Plugin)Overall Score: 2/5
Baseline Agent Output
To label PR #35385, I'd need either:
Could you either provide a GitHub token or share the PR details (title, description, files changed) so I can suggest appropriate labels? With-Skill Agent Output (Isolated)
Labels:
With-Skill Agent Output (Plugin)
Summary of PR #35385:
Labels I would apply:
|
| Label | Reason |
|---|---|
area-controls-switch |
Fix targets the Switch control specifically |
platform/ios |
Changes in /Platform/iOS/ directory + .iOS.cs files |
platform/macos |
.iOS.cs file extension compiles for both iOS and MacCatalyst |
` |
📊 agentic-labeler / pr-does-not-get-triage-workflow-labels
Judge Report: PR does not get triage workflow labels
Baseline Judge
Overall Score: 1/5
Reasoning: The agent completely failed to accomplish the task. After a single failed attempt to use gh CLI, it gave up and asked the user for help instead of trying alternative approaches like web_fetch to retrieve the PR details from the GitHub web interface. The agent should have been more resourceful in finding the PR information through other available tools.
- The final label set includes content-derived labels (platform/android for an Android-targeted fix): 1/5 — The agent produced no labels at all. It failed to complete the task and did not attempt alternative approaches like web_fetch to retrieve PR details.
- The final label set does NOT include any triage workflow labels (s/needs-*, untriaged, ⌚ Not Triaged) — these are managed by repo automation and human triagers: 3/5 — No labels were produced, so no incorrect triage labels were included. However, this is vacuously true since the task wasn't completed.
- The final label set does NOT include any t/, i/, partner/, perf/, backport/, or other non-(area-/platform/) labels — the labeler is restricted to area-/platform/* only: 3/5 — No labels were produced, so no incorrect label types were included. Vacuously true since the task wasn't completed.
With-Skill Judge (Isolated)
Overall Score: 4/5
Reasoning: The agent correctly identified appropriate labels despite not having GitHub CLI access. It used web_fetch to get PR details and derived accurate labels. The approach was efficient after the initial auth failure, and the final output is well-reasoned with clear justifications.
- The final label set includes content-derived labels (platform/android for an Android-targeted fix): 5/5 — The agent correctly identified
platform/androidbased on the Android-specific code changes andarea-controls-collectionviewbased on the CollectionView bug fix. Both are well-reasoned from the PR content. - The final label set does NOT include any triage workflow labels (s/needs-*, untriaged, ⌚ Not Triaged) — these are managed by repo automation and human triagers: 5/5 — No triage workflow labels were included in the output.
- The final label set does NOT include any t/, i/, partner/, perf/, backport/, or other non-(area-/platform/) labels — the labeler is restricted to area-/platform/* only: 5/5 — Only area-* and platform/* labels were suggested.
With-Skill Judge (Plugin)
Overall Score: 4.3/5
Reasoning: The agent correctly identified the two most appropriate labels for this PR, stayed within the allowed label categories, and provided clear rationale. It handled the GitHub token issues gracefully by falling back to web_fetch, and arrived at accurate labels efficiently.
- The final label set includes content-derived labels (platform/android for an Android-targeted fix): 5/5 — The agent correctly identified
platform/androidbased on the Android-specific code changes andarea-controls-collectionviewbased on the CollectionView fix. Both are well-reasoned from the PR content. - The final label set does NOT include any triage workflow labels (s/needs-*, untriaged, ⌚ Not Triaged) — these are managed by repo automation and human triagers: 5/5 — No triage workflow labels were included in the output.
- The final label set does NOT include any t/, i/, partner/, perf/, backport/, or other non-(area-/platform/) labels — the labeler is restricted to area-/platform/* only: 5/5 — Only area-* and platform/* labels were suggested.
Baseline Agent Output
I don't have a GitHub token configured in this environment, so I can't access the PR details or apply labels via thegh` CLI.
To help you, I'd need either:
- A
GH_TOKENenvironment variable set with appropriate permissions, or - You to share the PR details so I can recommend labels.
Could you provide a GitHub token, or share what the PR is about so I can suggest appropriate labels?
`
With-Skill Agent Output (Isolated)
Based on the PR title **"[Android] Fix increasing bottom gap in CollectionView while scrolling"** and the changed files (Android-specific platform code dealing withRecyclerView, IMauiRecyclerView, AView`), I would apply:
| Label | Reason |
|---|---|
area-controls-collectionview |
Fix targets CollectionView scrolling behavior (issue #34634/#34635) |
platform/android |
Changed file is Android platform code (safe area inset listener for Android views) |
` |
With-Skill Agent Output (Plugin)
`
Based on my analysis of PR #35457:
Title: [Android] Fix increasing bottom gap in CollectionView while scrolling
Changed files: Android-specific safe area inset handling code (platform code dealing with RecyclerView item recycling and SafeAreaEdges)
Labels I would apply:
| Label | Rationale |
|---|---|
area-controls-collectionview |
The fix targets CollectionView's progressive bottom gap during scrolling (issues #34634/#34635). Specific control beats generic area. |
platform/android |
The code is Android-specific (IMauiRecyclerView, Android views, etc.) and the title explicitly states [Android]. |
These are the only two labels that apply per the labeling rules — one area-* and one platform/*.
`
📊 agentic-labeler / shell-area-shell-specific-source-files
Judge Report: Shell area - Shell-specific source files
Baseline Judge
Overall Score: 1/5
Reasoning: The agent failed to complete the task. After the gh CLI failed due to missing authentication, it gave up and asked the user for help instead of trying alternative approaches like web_fetch to retrieve the PR page from GitHub's web interface. The task asked for labels to apply, and no labels were provided.
- The final label set includes area-controls-shell for Shell-related source files: 1/5 — The agent did not produce any labels at all. It failed to complete the task and did not identify area-controls-shell.
- No platform/ labels are applied since only shared cross-platform code is changed*: 2.3/5 — The agent didn't apply any labels at all, so technically no incorrect platform labels were applied. However, this is vacuously true since it failed to produce any output, not because it correctly reasoned about the code being cross-platform.
With-Skill Judge (Isolated)
Overall Score: 4.7/5
Reasoning: The agent correctly identified the appropriate label (area-controls-shell) and correctly avoided platform labels. It handled the lack of GH_TOKEN gracefully by falling back to web_fetch. The approach was efficient and the final output was well-reasoned.
- The final label set includes area-controls-shell for Shell-related source files: 5/5 — The agent correctly identified and applied area-controls-shell, with clear reasoning that the changes are in Shell-specific files (ShellSection.cs and ShellBadgeTests.cs).
- No platform/ labels are applied since only shared cross-platform code is changed*: 5/5 — The agent explicitly noted no platform labels should be applied since all changed files are shared/cross-platform code, which is correct.
With-Skill Judge (Plugin)
Overall Score: 4.3/5
Reasoning: The agent efficiently determined the correct labels despite authentication issues with the GitHub CLI. It fell back to web fetching the PR page and diff, correctly identified the changed files, and applied the right label (area-controls-shell) while correctly omitting platform labels. The reasoning was clear and accurate.
- The final label set includes area-controls-shell for Shell-related source files: 5/5 — The agent correctly identified and applied the area-controls-shell label, with clear reasoning that the PR is about Shell badge property binding between ShellContent and ShellSection.
- No platform/ labels are applied since only shared cross-platform code is changed*: 5/5 — The agent explicitly noted no platform labels should be applied, correctly identifying that the changed files are shared cross-platform code (unit tests) with no platform-specific suffixes or directories.
Baseline Agent Output
`
I don't have GitHub CLI authentication configured in this environment, so I can't directly access the PR or apply labels.
To help you, I'd need either:
- GH_TOKEN set in the environment for
ghCLI access, or - You to share the PR details (title, description, changed files) so I can recommend labels.
Could you provide the PR details, or set up authentication so I can access it?
`
With-Skill Agent Output (Isolated)
`
Based on my analysis of PR #35462:
Title: "Bind badge properties when ShellContent is converted into an implicit ShellSection so badges set directly on ShellContent update the generated section."
Changed files: Shell unit tests (badge property propagation between ShellContent and ShellSection) and likely the ShellSection source code. No platform-specific files (no .android.cs, .ios.cs, .windows.cs, or platform directory paths).
Labels I would apply:
| Label | Reason |
|---|---|
area-controls-shell |
The PR is entirely about Shell badge property binding between ShellContent and ShellSection |
No platform/* labels — the changed files are shared/cross-platform code with no platform-specific file patterns.
`
With-Skill Agent Output (Plugin)
`
Based on my analysis of PR #35462, here are the labels I would apply:
Labels:
area-controls-shell— The PR modifiesShellSection.csto bind badge properties whenShellContentis implicitly converted to aShellSection. This is Shell-specific functionality.
No platform/* labels — The changed files are:
src/Controls/src/Core/Shell/ShellSection.cs(shared cross-platform code)src/Controls/tests/Core.UnitTests/ShellBadgeTests.cs(shared test code)
Neither file has a platform suffix or resides in a platform-specific directory, so no platform labels apply.
`
📊 agentic-labeler / skill-file-pr-gets-area-infrastructure-not-area-tooling-
Judge Report: Skill-file PR gets area-infrastructure (not area-tooling)
Baseline Judge
Overall Score: 1/5
Reasoning: The agent gave up too quickly after a single failed approach (gh CLI without token). It had web_fetch available as an alternative tool to view the PR on GitHub's public web interface, but never attempted it. The task was not completed in any meaningful way - no labels were suggested or applied.
- The final label set includes area-infrastructure for a PR that only touches .github/skills/: 1/5 — The agent produced no label set at all. It gave up after the gh CLI failed without trying alternative approaches like web_fetch to view the PR on GitHub's web interface.
- The agent prefers area-infrastructure over area-tooling for agent-infra/skill changes: 1/5 — No labels were recommended, so this criterion cannot be satisfied. The agent didn't attempt any alternative method to gather PR information.
With-Skill Judge (Isolated)
Overall Score: 4/5
Reasoning: The agent correctly identified the PR's changed files and applied the appropriate label. It had to work around API access issues (token lifetime restrictions) by falling back to web_fetch, showing good adaptability. The final output is clear and well-reasoned. Minor inefficiency in the multiple failed API attempts before switching to web scraping, but the end result is correct.
- The final label set includes area-infrastructure for a PR that only touches .github/skills/: 5/5 — The agent correctly identified that the PR only touches .github/skills/ files and applied the area-infrastructure label.
- The agent prefers area-infrastructure over area-tooling for agent-infra/skill changes: 5/5 — The agent chose area-infrastructure and did not mention area-tooling, correctly preferring it for agent/skill infrastructure changes.
With-Skill Judge (Plugin)
Overall Score: 4/5
Reasoning: The agent correctly identified the label and provided clear reasoning. It recovered well from the token access issue by falling back to web_fetch. The only minor issue is that it couldn't actually apply the label due to token restrictions, but it clearly communicated this limitation and provided the command to do so manually. The label recommendation itself is correct.
- The final label set includes area-infrastructure for a PR that only touches .github/skills/: 5/5 — The agent correctly identified that the PR only touches .github/skills/ files and applied the area-infrastructure label.
- The agent prefers area-infrastructure over area-tooling for agent-infra/skill changes: 5/5 — The agent chose area-infrastructure (not area-tooling) for changes to .github/skills/ agent infrastructure files, which is the correct preference per this criterion.
Baseline Agent Output
I don't have aGH_TOKEN` configured in this environment, so I can't access the GitHub API to view or label PR #34962.
To proceed, I'd need either:
- A
GH_TOKENenvironment variable set with appropriate permissions - You to share the PR details (title, description, changed files) so I can recommend labels
Could you provide access or share the PR context?
`
With-Skill Agent Output (Isolated)
`
Based on my analysis of PR #34962:
Title: "Add Trim/NativeAOT safety rules to code review skill"
Changed files: .github/skills/code-review/SKILL.md and .github/skills/code-review/references/review-rules.md
Labels I would apply:
| Label | Rationale |
|---|---|
area-infrastructure |
PR exclusively modifies .github/skills/ files (agentic-workflow/skill files), which per the labeling rules maps to area-infrastructure |
No platform/* labels apply — no platform-specific files were changed.
`
With-Skill Agent Output (Plugin)
`
Based on my analysis of PR #34962:
Title: "Add Trim/NativeAOT safety rules to code review skill"
Changed files:
.github/skills/code-review/SKILL.md.github/skills/code-review/references/review-rules.md
Labels I would apply:
| Label | Reason |
|---|---|
area-infrastructure |
PR exclusively modifies .github/skills/ files (agent/skill infrastructure). Per the rules, PRs touching only .github/skills/ files → area-infrastructure. |
No platform/* labels — no platform-specific files were changed.
I'm unable to actually apply the labels because the available GitHub token is rejected by the dotnet organization's enterprise policy (token lifetime restriction). To apply them, you'd run:
bash gh pr edit 34962 --repo dotnet/maui --add-label "area-infrastructure"
`
📊 agentic-labeler / windows-pr-platform-label-from-windows-cs-or-platform-windows-
Judge Report: Windows PR - platform label from .windows.cs or Platform/Windows/
Baseline Judge
Overall Score: 1/5
Reasoning: The agent completely failed to accomplish the task. It tried one approach (gh CLI) which failed due to missing GH_TOKEN, then gave up without trying alternatives like web_fetch to scrape the PR page, or using the GitHub API directly with curl. The agent should have attempted to fetch the PR information through other available means rather than immediately asking the user for help.
- The final label set includes platform/windows: 1/5 — The agent did not produce any labels at all, so platform/windows was not included.
- The final label set includes area-controls-collectionview (ItemsViewHandler.Windows.cs is a CollectionView/CarouselView handler): 1/5 — The agent did not produce any labels at all.
- The agent does NOT apply platform/android, platform/ios, or platform/macos (the PR is Windows-only): 3/5 — The agent didn't apply any incorrect platform labels, but only because it didn't apply any labels at all. This is a technicality rather than a demonstration of correct reasoning.
- The agent does NOT apply partner/syncfusion or any non-(area-/platform/) labels even though those exist on the PR: 3/5 — Same as above - no labels were applied at all, so no incorrect ones were applied, but this wasn't due to deliberate filtering.
With-Skill Judge (Isolated)
Overall Score: 5/5
Reasoning: The agent efficiently identified the correct labels despite not having direct GitHub API access. It fetched PR details via web, identified the single changed file, and correctly applied exactly the two appropriate labels with clear reasoning.
- The final label set includes platform/windows: 5/5 — The agent clearly includes platform/windows in its final label set with correct reasoning about the .Windows.cs file extension.
- The final label set includes area-controls-collectionview (ItemsViewHandler.Windows.cs is a CollectionView/CarouselView handler): 5/5 — The agent correctly identifies and includes area-controls-collectionview with appropriate reasoning about ItemsView/CollectionView.
- The agent does NOT apply platform/android, platform/ios, or platform/macos (the PR is Windows-only): 5/5 — The agent explicitly states no other platform labels apply and only lists platform/windows.
- The agent does NOT apply partner/syncfusion or any non-(area-/platform/) labels even though those exist on the PR: 5/5 — The agent only applies area-controls-collectionview and platform/windows - no partner or other non-standard labels.
With-Skill Judge (Plugin)
Overall Score: 5/5
Reasoning: The agent correctly identified both appropriate labels despite facing authentication issues with the GitHub API. It adapted by using web_fetch to view the PR page and files directly, then applied sound reasoning to determine the correct labels. The final output is precise, well-reasoned, and correctly scoped.
- The final label set includes platform/windows: 5/5 — The agent clearly includes platform/windows in its final label set with correct reasoning about the *.Windows.cs file pattern.
- The final label set includes area-controls-collectionview (ItemsViewHandler.Windows.cs is a CollectionView/CarouselView handler): 5/5 — The agent includes area-controls-collectionview with appropriate reasoning about the ItemsViewHandler being the base handler for CollectionView.
- The agent does NOT apply platform/android, platform/ios, or platform/macos (the PR is Windows-only): 5/5 — The agent explicitly states 'No other platform/* labels apply — only Windows-specific code is touched.'
- The agent does NOT apply partner/syncfusion or any non-(area-/platform/) labels even though those exist on the PR: 5/5 — The agent only applies area-controls-collectionview and platform/windows. No partner or other non-standard labels are included.
Baseline Agent Output
I don't have aGH_TOKEN` configured in this environment, so I can't access the GitHub API to view PR #35458 or apply labels.
To proceed, I'd need either:
- A
GH_TOKENenvironment variable set with appropriate permissions - You to describe the PR so I can suggest labels
Could you provide a GitHub token or share what the PR is about?
`
With-Skill Agent Output (Isolated)
The PR changes a single file:src/Controls/src/Core/Handlers/Items/ItemsViewHandler.Windows.cs`
Based on the labeling rules:
Labels I would apply:
-
area-controls-collectionview— The file is theItemsViewHandlerwhich is the handler backingCollectionView(andCarouselView). The code deals withCollectionViewSource, grouped items, andScrollIntoViewlogic specific to the items/collection view subsystem. -
platform/windows— The file uses the.Windows.csextension, which maps toplatform/windows.
No other platform/* labels apply since only a Windows-specific file was changed.
`
With-Skill Agent Output (Plugin)
`
Based on my analysis of PR #35458:
Changed file: ItemsViewHandler.Windows.cs — Windows-specific handler code for CollectionView/ItemsView, fixing deferred scroll behavior for grouped sources and Reset notifications.
Labels I would apply:
| Label | Reason |
|---|---|
area-controls-collectionview |
ItemsViewHandler is the base handler for CollectionView; the fix addresses CollectionView scrolling/grouping behavior |
platform/windows |
File uses .Windows.cs extension — Windows platform-specific code |
No other platform/* labels apply since only Windows-specific files are changed. No other platforms are touched.
`
📊 agentic-labeler / workflow-only-pr-gets-area-infrastructure
Judge Report: Workflow-only PR gets area-infrastructure
Baseline Judge
Overall Score: 1/5
Reasoning: The agent failed to complete the task. After the gh CLI didn't work due to missing GH_TOKEN, it gave up without trying the web_fetch tool which was available and could have retrieved the PR details from the GitHub web interface. This is a basic failure to explore available options before giving up.
- The final label set includes area-infrastructure for a PR that only touches .github/workflows/: 1/5 — The agent did not provide any labels at all. It gave up after the GH_TOKEN error instead of trying alternative approaches like web_fetch on the public GitHub PR page.
- No platform/ labels are applied for a workflow-only PR*: 3/5 — The agent didn't apply any labels at all, so no incorrect platform labels were applied, but this is only because the agent failed to complete the task entirely rather than making a correct decision.
With-Skill Judge (Isolated)
Overall Score: 4.3/5
Reasoning: The agent correctly identified the single appropriate label (area-infrastructure) and correctly excluded platform labels. It navigated token permission issues by falling back to web_fetch, showing good adaptability. The only minor issue is that it couldn't actually apply the labels via the API, but it clearly listed what should be applied.
- The final label set includes area-infrastructure for a PR that only touches .github/workflows/: 5/5 — The agent correctly identified area-infrastructure as the appropriate label for a PR that only modifies GitHub Actions workflow files. It verified the changed files via web_fetch and confirmed it was a .github/workflows/ file.
- No platform/ labels are applied for a workflow-only PR*: 5/5 — The agent explicitly noted 'No platform/* labels — no platform-specific source files are touched' which is correct for a workflow-only PR.
With-Skill Judge (Plugin)
Overall Score: 3.7/5
Reasoning: The agent correctly identified the right label and avoided incorrect ones. It handled token access issues gracefully by falling back to web_fetch. The approach was reasonably efficient given the constraints, though it took a few extra steps trying different auth methods before resorting to web scraping. The final output is clear and well-reasoned.
- The final label set includes area-infrastructure for a PR that only touches .github/workflows/: 5/5 — The agent correctly identified and applied the area-infrastructure label, noting the PR exclusively modifies GitHub Actions workflow/CI files.
- No platform/ labels are applied for a workflow-only PR*: 5/5 — The agent explicitly stated 'No platform/* labels apply — no platform-specific source files were changed.' which is correct.
Baseline Agent Output
I don't have aGH_TOKEN` configured in this environment, so I can't access the GitHub API to view PR #35438 or apply labels.
To proceed, I'd need either:
- A
GH_TOKENorGITHUB_TOKENenvironment variable set, or - You to share the PR details so I can recommend labels.
Could you provide authentication or share what the PR is about?
`
With-Skill Agent Output (Isolated)
`
Based on my analysis of PR #35438:
Title: Fix review trigger leading whitespace handling
Content: The PR modifies a GitHub Actions workflow file to handle leading whitespace before the /review slash command. It adds a pre-filter match job using a bash regex and trims whitespace before parsing args.
Changed files: A single .github/workflows/ file (the review trigger workflow).
Labels I would apply:
| Label | Rationale |
|---|---|
area-infrastructure |
PR exclusively modifies a GitHub Actions workflow file (.github/workflows/), which is CI/agent-infra per the labeling rules. |
No platform/* labels — no platform-specific files are touched.
Note: I'm unable to apply the labels via the GitHub API due to token permission issues in this environment. The label to add is area-infrastructure only.
`
With-Skill Agent Output (Plugin)
`
Based on my analysis of PR #35438:
Title: Fix review trigger leading whitespace
Content: Fixes a GitHub Actions workflow (.github/workflows/) to handle leading whitespace before the /review slash command by adding a bash regex pre-filter job.
Labels I would apply:
| Label | Reason |
|---|---|
area-infrastructure |
PR modifies only a GitHub Actions workflow file (CI/agent-infra). No product code changes. |
No platform/* labels apply — no platform-specific files are touched; only workflow YAML.
However, I'm unable to actually apply these labels because the available token is rejected by the dotnet org's enterprise policy (fine-grained PAT lifetime restriction). To apply the label, you'd run:
bash gh pr edit 35438 --repo dotnet/maui --add-label "area-infrastructure"
`
📊 agentic-labeler / xaml-source-generator-pr-gets-area-xaml
Judge Report: XAML source generator PR gets area-xaml
Baseline Judge
Overall Score: 1/5
Reasoning: The agent failed to complete the task. After the gh CLI failed due to missing GH_TOKEN, it gave up immediately without trying alternative approaches like using web_fetch to view the PR on GitHub's web interface. It produced no labels whatsoever.
- The final label set includes area-xaml for a XAML source generator issue: 1/5 — The agent did not produce any label set at all. It failed to access the PR and did not attempt any alternative approach (e.g., web fetch) to determine the PR's content and appropriate labels.
With-Skill Judge (Isolated)
Overall Score: 2/5
Reasoning: The agent failed to correctly identify the nature of PR #35444. The files page content clearly showed XAML source generator test code, but the agent produced an analysis describing infrastructure/agent files that don't match what was actually fetched. The agent appears to have hallucinated the file paths and PR description rather than properly analyzing the web_fetch results. The correct label should have included area-xaml.
- The final label set includes area-xaml for a XAML source generator issue: 2.3/5 — The agent did not include area-xaml in its final label set. Despite the web_fetch of the /files page clearly showing XAML source generator unit test code (NumericBindablePropertyPrimitives : SourceGenXamlInitializeComponentTestBase), the agent incorrectly concluded the PR was purely about infrastructure files and only applied area-infrastructure.
With-Skill Judge (Plugin)
Overall Score: 2.3/5
Reasoning: The agent failed to identify the area-xaml label which was a key requirement. While it did attempt multiple approaches to access the PR data and eventually used web_fetch to get information, it misinterpreted the content. The files page clearly showed XAML source gen test code, but the agent focused only on the infrastructure/agent files mentioned in the PR description. The agent's analysis was incomplete and led to an incorrect labeling recommendation.
- The final label set includes area-xaml for a XAML source generator issue: 2.3/5 — The agent correctly identified and applied the
area-xamllabel, with clear reasoning that the fix is in the XAML source generator and XAML unit tests.
Baseline Agent Output
I don't have aGH_TOKEN` configured in this environment, so I can't access the GitHub API to view or label PRs.
To proceed, I'd need either:
- A
GH_TOKENenvironment variable set with appropriate permissions, or - You to share the PR details so I can recommend labels.
Could you provide a GitHub token or share what PR #35444 is about so I can suggest the right labels?
`
With-Skill Agent Output (Isolated)
`
Based on my analysis of PR #35444:
Labels I would apply:
area-infrastructure
Reasoning:
- This PR replaces
review-rules.mdwith a dimensional expert review agent, modifying files in.github/agents/,.github/instructions/,.github/scripts/,.github/skills/, andeng/pipelines/ci-copilot.yml - These are CI/agent-infra files (GitHub workflows, skills, review pipeline scripts) — which maps to
area-infrastructureper the labeling rules - No
platform/*labels apply — the changed files are all agent/skill infrastructure, not platform-specific source code (thecollectionview-{android,ios,windows}files are markdown instruction docs for the review agent, not compilable platform code)
`
With-Skill Agent Output (Plugin)
`
Based on my analysis of PR #35444:
PR Summary: Replaces review-rules.md with a dimensional expert review agent (maui-expert-reviewer.md). Files changed are all in .github/ (agents, skills, scripts, instructions) and eng/pipelines/ci-copilot.yml. No functional product code changes.
Labels I would apply:
area-infrastructure— This PR exclusively touches CI/agent-infra files (.github/skills/,.github/agents/,.github/scripts/,eng/pipelines/), which maps directly toarea-infrastructure.
No platform/* labels — None of the changed files are platform-specific source code (no .android.cs, .ios.cs, .windows.cs files, no /Platform/ directories). The instruction files with platform names (e.g., collectionview-android) are agent guidance docs, not compilable platform code.
I'm unable to apply the labels directly due to token access restrictions on the dotnet/maui repository. You can apply them with:
bash gh pr edit 35444 --repo dotnet/maui --add-label "area-infrastructure"
`
|
/review -b feature/refactor-copilot-yml |
MauiBot
left a comment
There was a problem hiding this comment.
Expert Review — 1 findings
See inline comments for details.
| } | ||
|
|
||
| var accessibilityView = panel.ReadLocalValue(AutomationProperties.AccessibilityViewProperty); | ||
| if (accessibilityView is AccessibilityView.Control or AccessibilityView.Content) |
There was a problem hiding this comment.
[moderate] Windows UI Automation — AccessibilityView.Raw should be treated as an explicit opt-out before semantic Name/HelpText opts the layout into Control view. Today a layout with AutomationProperties.IsInAccessibleTree="False" plus SemanticProperties.Description or Hint maps Raw onto the platform view, but this peer still returns true later because Name/HelpText is non-empty, so the developer’s explicit opt-out is ignored. Add a Raw check that returns false before the semantic checks and cover it with a regression test.
|
/azp run maui-pr-devicetests |
|
Azure Pipelines successfully started running 1 pipeline(s). |
|
/azp run maui-pr-uitests |
|
Azure Pipelines successfully started running 1 pipeline(s). |
|
/review -b feature/refactor-copilot-yml |
MauiBot
left a comment
There was a problem hiding this comment.
Expert Review — 2 findings
See inline comments for details.
|
|
||
| // Expose in the Content View only when an AutomationId is explicitly set by the developer. | ||
| protected override bool IsContentElementCore() => HasAutomationId(); | ||
| if (!string.IsNullOrEmpty(AutomationProperties.GetName(panel))) |
There was a problem hiding this comment.
[major] Accessibility — AutomationProperties.IsInAccessibleTree="False" maps to AccessibilityView.Raw, but this logic falls through to the semantic Name/HelpText checks and can still opt the layout into the Control view. Concrete scenario: a Grid with AutomationProperties.IsInAccessibleTree="False" and SemanticProperties.Description set will be exposed to screen readers despite the explicit opt-out. Treat AccessibilityView.Raw as an early false before semantic opt-in checks.
|
|
||
| // Expose in the Content View only when an AutomationId is explicitly set by the developer. | ||
| protected override bool IsContentElementCore() => HasAutomationId(); | ||
| if (!string.IsNullOrEmpty(AutomationProperties.GetName(panel))) |
There was a problem hiding this comment.
[moderate] Accessibility — IsNullOrEmpty treats whitespace-only semantic text as meaningful, so SemanticProperties.Description=" " or whitespace Hint will opt a layout into the Control view even though there is nothing useful for assistive tech to announce. Use string.IsNullOrWhiteSpace for both Name and HelpText checks.
kubaflo
left a comment
There was a problem hiding this comment.
Could you please check the ai's suggestions?
|
@Redth With the PR changes, the layout was still exposed even when IsInAccessibleTree = false was set together with SemanticProperties.Description, which contradicted native WinUI behavior. On WinUI, the element is detectable only when AutomationProperties.Name is set together with AccessibilityView="Content" or "Control". When AccessibilityView="Raw" is used, the element is not detectable. Testing tool: Accessibility Insights and the Inspect tool.
WinUI
To resolve this, I added an early-return check for AccessibilityView.Raw at the beginning of the peer logic. When IsInAccessibleTree="False" is explicitly set, the peer now immediately returns false and skips all opt-in evaluation. Also, the UI tests added in PR #35562 started failing with the new behavior, as expected, because the layouts contained only AutomationId. I updated the tests by adding Description and IsInAccessibleTree = true to all layouts, and the UI tests are now passing. I have committed the changes. Could you please take a look once? |
|
@Vignesh-SF3580 looks good to me, thanks! |
|
/review -b feature/refactor-copilot-yml -p windows |
MauiBot
left a comment
There was a problem hiding this comment.
Expert Review — 1 findings
See inline comments for details.
| return true; | ||
| } | ||
|
|
||
| if (!string.IsNullOrEmpty(AutomationProperties.GetName(panel))) |
There was a problem hiding this comment.
Use string.IsNullOrWhiteSpace here (and for HelpText below) instead of IsNullOrEmpty. SemanticProperties.Description / Hint containing only whitespace maps to Name / HelpText, and the current check would opt a structural layout into the UIA Control view even though it has no meaningful announcement text.
🤖 AI Summary
📊 Review Session —
|
| Test | Without Fix (expect FAIL) | With Fix (expect PASS) |
|---|---|---|
📱 LayoutTests (LayoutPanelExcludedFromControlViewByDefault, LayoutPanelOptsIntoControlViewViaIsInAccessibleTree, LayoutPanelOptsIntoControlViewWhenDescriptionIsSet) Category=Layout |
🛠️ BUILD ERROR | ❌ FAIL — 292s |
🔴 Without fix — 📱 LayoutTests (LayoutPanelExcludedFromControlViewByDefault, LayoutPanelOptsIntoControlViewViaIsInAccessibleTree, LayoutPanelOptsIntoControlViewWhenDescriptionIsSet): 🛠️ BUILD ERROR · 231s
Determining projects to restore...
Restored D:\a\1\s\src\Core\maps\src\Maps.csproj (in 1.04 sec).
Restored D:\a\1\s\src\TestUtils\src\DeviceTests\TestUtils.DeviceTests.csproj (in 2.43 sec).
Restored D:\a\1\s\src\TestUtils\src\DeviceTests.Runners\TestUtils.DeviceTests.Runners.csproj (in 1.22 sec).
Restored D:\a\1\s\src\Graphics\src\Graphics\Graphics.csproj (in 58 ms).
Restored D:\a\1\s\src\Graphics\src\Graphics.Win2D\Graphics.Win2D.csproj (in 12 ms).
Restored D:\a\1\s\src\Essentials\src\Essentials.csproj (in 29 ms).
Restored D:\a\1\s\src\Core\tests\DeviceTests.Shared\Core.DeviceTests.Shared.csproj (in 52 ms).
Restored D:\a\1\s\src\Core\src\Core.csproj (in 101 ms).
Restored D:\a\1\s\src\TestUtils\src\DeviceTests.Runners.SourceGen\TestUtils.DeviceTests.Runners.SourceGen.csproj (in 2.97 sec).
Restored D:\a\1\s\src\Controls\src\Xaml\Controls.Xaml.csproj (in 51 ms).
Restored D:\a\1\s\src\Controls\src\Xaml.Design\Controls.Xaml.Design.csproj (in 256 ms).
Restored D:\a\1\s\src\Controls\src\Core\Controls.Core.csproj (in 42 ms).
Restored D:\a\1\s\src\Controls\src\Core.Design\Controls.Core.Design.csproj (in 6 ms).
Restored D:\a\1\s\src\Controls\src\BindingSourceGen\Controls.BindingSourceGen.csproj (in 2.15 sec).
Restored D:\a\1\s\src\Controls\Maps\src\Controls.Maps.csproj (in 58 ms).
Restored D:\a\1\s\src\Controls\tests\DeviceTests\Controls.DeviceTests.csproj (in 37.86 sec).
##vso[build.updatebuildnumber]10.0.80-ci+azdo.14198607
Graphics -> D:\a\1\s\artifacts\bin\Graphics\Release\net10.0-windows10.0.19041.0\Microsoft.Maui.Graphics.dll
##vso[build.updatebuildnumber]10.0.80-ci+azdo.14198607
Graphics.Win2D -> D:\a\1\s\artifacts\bin\Graphics.Win2D\Release\net10.0-windows10.0.19041.0\Microsoft.Maui.Graphics.Win2D.WinUI.Desktop.dll
##vso[build.updatebuildnumber]10.0.80-ci+azdo.14198607
Essentials -> D:\a\1\s\artifacts\bin\Essentials\Release\net10.0-windows10.0.19041.0\Microsoft.Maui.Essentials.dll
##vso[build.updatebuildnumber]10.0.80-ci+azdo.14198607
Core -> D:\a\1\s\artifacts\bin\Core\Release\net10.0-windows10.0.19041.0\Microsoft.Maui.dll
Controls.BindingSourceGen -> D:\a\1\s\artifacts\bin\Controls.BindingSourceGen\Release\netstandard2.0\Microsoft.Maui.Controls.BindingSourceGen.dll
##vso[build.updatebuildnumber]10.0.80-ci+azdo.14198607
##vso[build.updatebuildnumber]10.0.80-ci+azdo.14198607
Controls.Core -> D:\a\1\s\artifacts\bin\Controls.Core\Release\net10.0-windows10.0.19041.0\Microsoft.Maui.Controls.dll
##vso[build.updatebuildnumber]10.0.80-ci+azdo.14198607
Controls.Xaml -> D:\a\1\s\artifacts\bin\Controls.Xaml\Release\net10.0-windows10.0.19041.0\Microsoft.Maui.Controls.Xaml.dll
TestUtils.DeviceTests -> D:\a\1\s\artifacts\bin\TestUtils.DeviceTests\Release\net10.0-windows10.0.19041.0\Microsoft.Maui.TestUtils.DeviceTests.dll
TestUtils.DeviceTests.Runners -> D:\a\1\s\artifacts\bin\TestUtils.DeviceTests.Runners\Release\net10.0-windows10.0.19041.0\Microsoft.Maui.TestUtils.DeviceTests.Runners.dll
Core.DeviceTests.Shared -> D:\a\1\s\artifacts\bin\Core.DeviceTests.Shared\Release\net10.0-windows10.0.19041.0\Microsoft.Maui.DeviceTests.Shared.dll
Maps -> D:\a\1\s\artifacts\bin\Maps\Release\net10.0-windows10.0.19041.0\Microsoft.Maui.Maps.dll
##vso[build.updatebuildnumber]10.0.80-ci+azdo.14198607
Controls.Maps -> D:\a\1\s\artifacts\bin\Controls.Maps\Release\net10.0-windows10.0.19041.0\Microsoft.Maui.Controls.Maps.dll
TestUtils.DeviceTests.Runners.SourceGen -> D:\a\1\s\artifacts\bin\TestUtils.DeviceTests.Runners.SourceGen\Release\netstandard2.0\Microsoft.Maui.TestUtils.DeviceTests.Runners.SourceGen.dll
D:\a\1\s\src\Controls\tests\DeviceTests\Elements\ContentView\ContentViewTests.Windows.cs(27,24): error CS0426: The type name 'ContentPanelAutomationPeer' does not exist in the type 'ContentPanel' [D:\a\1\s\src\Controls\tests\DeviceTests\Controls.DeviceTests.csproj::TargetFramework=net10.0-windows10.0.19041.0]
Build FAILED.
D:\a\1\s\src\Controls\tests\DeviceTests\Elements\ContentView\ContentViewTests.Windows.cs(27,24): error CS0426: The type name 'ContentPanelAutomationPeer' does not exist in the type 'ContentPanel' [D:\a\1\s\src\Controls\tests\DeviceTests\Controls.DeviceTests.csproj::TargetFramework=net10.0-windows10.0.19041.0]
0 Warning(s)
1 Error(s)
Time Elapsed 00:03:00.52
🟢 With fix — 📱 LayoutTests (LayoutPanelExcludedFromControlViewByDefault, LayoutPanelOptsIntoControlViewViaIsInAccessibleTree, LayoutPanelOptsIntoControlViewWhenDescriptionIsSet): FAIL ❌ · 292s
Determining projects to restore...
All projects are up-to-date for restore.
##vso[build.updatebuildnumber]10.0.80-ci+azdo.14198607
Graphics -> D:\a\1\s\artifacts\bin\Graphics\Release\net10.0-windows10.0.19041.0\Microsoft.Maui.Graphics.dll
##vso[build.updatebuildnumber]10.0.80-ci+azdo.14198607
Essentials -> D:\a\1\s\artifacts\bin\Essentials\Release\net10.0-windows10.0.19041.0\Microsoft.Maui.Essentials.dll
##vso[build.updatebuildnumber]10.0.80-ci+azdo.14198607
Graphics.Win2D -> D:\a\1\s\artifacts\bin\Graphics.Win2D\Release\net10.0-windows10.0.19041.0\Microsoft.Maui.Graphics.Win2D.WinUI.Desktop.dll
##vso[build.updatebuildnumber]10.0.80-ci+azdo.14198607
Core -> D:\a\1\s\artifacts\bin\Core\Release\net10.0-windows10.0.19041.0\Microsoft.Maui.dll
##vso[build.updatebuildnumber]10.0.80-ci+azdo.14198607
Maps -> D:\a\1\s\artifacts\bin\Maps\Release\net10.0-windows10.0.19041.0\Microsoft.Maui.Maps.dll
Controls.BindingSourceGen -> D:\a\1\s\artifacts\bin\Controls.BindingSourceGen\Release\netstandard2.0\Microsoft.Maui.Controls.BindingSourceGen.dll
##vso[build.updatebuildnumber]10.0.80-ci+azdo.14198607
D:\a\1\s\src\Controls\src\Core\SwipeView\SwipeItemView.cs(62,4): warning RS0016: Symbol 'override Microsoft.Maui.Controls.SwipeItemView.IsEnabledCore.get -> bool' is not part of the declared public API (https://github.com/dotnet/roslyn/blob/main/src/RoslynAnalyzers/PublicApiAnalyzers/PublicApiAnalyzers.Help.md) [D:\a\1\s\src\Controls\src\Core\Controls.Core.csproj::TargetFramework=net10.0-windows10.0.19041.0]
Controls.Core -> D:\a\1\s\artifacts\bin\Controls.Core\Release\net10.0-windows10.0.19041.0\Microsoft.Maui.Controls.dll
##vso[build.updatebuildnumber]10.0.80-ci+azdo.14198607
Controls.Xaml -> D:\a\1\s\artifacts\bin\Controls.Xaml\Release\net10.0-windows10.0.19041.0\Microsoft.Maui.Controls.Xaml.dll
##vso[build.updatebuildnumber]10.0.80-ci+azdo.14198607
Controls.Maps -> D:\a\1\s\artifacts\bin\Controls.Maps\Release\net10.0-windows10.0.19041.0\Microsoft.Maui.Controls.Maps.dll
TestUtils.DeviceTests -> D:\a\1\s\artifacts\bin\TestUtils.DeviceTests\Release\net10.0-windows10.0.19041.0\Microsoft.Maui.TestUtils.DeviceTests.dll
TestUtils.DeviceTests.Runners -> D:\a\1\s\artifacts\bin\TestUtils.DeviceTests.Runners\Release\net10.0-windows10.0.19041.0\Microsoft.Maui.TestUtils.DeviceTests.Runners.dll
Core.DeviceTests.Shared -> D:\a\1\s\artifacts\bin\Core.DeviceTests.Shared\Release\net10.0-windows10.0.19041.0\Microsoft.Maui.DeviceTests.Shared.dll
TestUtils.DeviceTests.Runners.SourceGen -> D:\a\1\s\artifacts\bin\TestUtils.DeviceTests.Runners.SourceGen\Release\netstandard2.0\Microsoft.Maui.TestUtils.DeviceTests.Runners.SourceGen.dll
##vso[build.updatebuildnumber]10.0.80-ci+azdo.14198607
##vso[build.updatebuildnumber]10.0.80-ci+azdo.14198607
Graphics -> D:\a\1\s\artifacts\bin\Graphics\Release\net10.0-windows10.0.19041.0\Microsoft.Maui.Graphics.dll
Controls.DeviceTests -> D:\a\1\s\artifacts\bin\Controls.DeviceTests\Release\net10.0-windows10.0.19041.0\win-x64\Microsoft.Maui.Controls.DeviceTests.dll
Build succeeded.
D:\a\1\s\src\Controls\src\Core\SwipeView\SwipeItemView.cs(62,4): warning RS0016: Symbol 'override Microsoft.Maui.Controls.SwipeItemView.IsEnabledCore.get -> bool' is not part of the declared public API (https://github.com/dotnet/roslyn/blob/main/src/RoslynAnalyzers/PublicApiAnalyzers/PublicApiAnalyzers.Help.md) [D:\a\1\s\src\Controls\src\Core\Controls.Core.csproj::TargetFramework=net10.0-windows10.0.19041.0]
1 Warning(s)
0 Error(s)
Time Elapsed 00:04:42.59
Test run for D:\a\1\s\artifacts\bin\Controls.DeviceTests\Release\net10.0-windows10.0.19041.0\win-x64\Microsoft.Maui.Controls.DeviceTests.dll (.NETCoreApp,Version=v10.0)
VSTest version 18.0.1 (x64)
Starting test execution, please wait...
A total of 1 test files matched the specified pattern.
Testhost process for source(s) 'D:\a\1\s\artifacts\bin\Controls.DeviceTests\Release\net10.0-windows10.0.19041.0\win-x64\Microsoft.Maui.Controls.DeviceTests.dll' exited with error: Unhandled exception. System.IO.FileNotFoundException: Could not load file or assembly 'Microsoft.TestPlatform.CoreUtilities, Version=15.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'. The system cannot find the file specified.
File name: 'Microsoft.TestPlatform.CoreUtilities, Version=15.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'
at Microsoft.VisualStudio.TestPlatform.TestHost.Program.Main(String[] args) in /_/src/vstest/src/testhost.x86/Program.cs:line 41
. Please check the diagnostic logs for more information.
Results File: D:\a\1\s\artifacts\log\TestResults.trx
Test Run Aborted.
Tests completed with exit code: 1
⚠️ Failure Details
- 🛠️ LayoutTests (LayoutPanelExcludedFromControlViewByDefault, LayoutPanelOptsIntoControlViewViaIsInAccessibleTree, LayoutPanelOptsIntoControlViewWhenDescriptionIsSet) without fix: build failed before tests could run
D:\a\1\s\src\Controls\tests\DeviceTests\Elements\ContentView\ContentViewTests.Windows.cs(27,24): error CS0426: The type name 'ContentPanelAutomationPeer' does not exist in the type 'ContentPanel' [D:\...
- ❌ LayoutTests (LayoutPanelExcludedFromControlViewByDefault, LayoutPanelOptsIntoControlViewViaIsInAccessibleTree, LayoutPanelOptsIntoControlViewWhenDescriptionIsSet) FAILED with fix (should pass)
📁 Fix files reverted (236 files)
eng/Signing.propseng/pipelines/ci-copilot.ymlsrc/BlazorWebView/src/Maui/Android/BlazorAndroidWebView.cssrc/BlazorWebView/src/Maui/Android/BlazorWebViewHandler.Android.cssrc/BlazorWebView/src/Maui/Android/WebKitWebViewClient.cssrc/Compatibility/Core/src/Android/Renderers/SwipeViewRenderer.cssrc/Compatibility/Core/src/MacOS/Extensions/NSMenuExtensions.cssrc/Compatibility/Core/src/iOS/EventTracker.cssrc/Compatibility/Core/src/iOS/Renderers/SwipeViewRenderer.cssrc/Controls/samples/Controls.Sample/Pages/Controls/MapsGalleries/MapPinsGallery.xamlsrc/Controls/samples/Controls.Sample/Pages/Controls/MapsGalleries/MapPinsGallery.xaml.cssrc/Controls/src/Build.Tasks/SetPropertiesVisitor.cssrc/Controls/src/Core/ActionSheetArguments.cssrc/Controls/src/Core/AlertArguments.cssrc/Controls/src/Core/BindableObject.cssrc/Controls/src/Core/BindableProperty.cssrc/Controls/src/Core/Button/Button.iOS.cssrc/Controls/src/Core/Compatibility/Android/Resources/layout/flyoutcontent.axmlsrc/Controls/src/Core/Compatibility/Handlers/FlyoutPage/iOS/PhoneFlyoutPageRenderer.cssrc/Controls/src/Core/Compatibility/Handlers/NavigationPage/iOS/NavigationRenderer.cssrc/Controls/src/Core/Compatibility/Handlers/Shell/Android/SearchHandlerAppearanceTracker.cssrc/Controls/src/Core/Compatibility/Handlers/Shell/Android/ShellFlyoutTemplatedContentRenderer.cssrc/Controls/src/Core/Compatibility/Handlers/Shell/Android/ShellFragmentContainer.cssrc/Controls/src/Core/Compatibility/Handlers/Shell/Android/ShellItemRenderer.cssrc/Controls/src/Core/Compatibility/Handlers/Shell/Android/ShellRenderer.cssrc/Controls/src/Core/Compatibility/Handlers/Shell/Android/ShellToolbarTracker.cssrc/Controls/src/Core/Compatibility/Handlers/Shell/iOS/SearchHandlerAppearanceTracker.cssrc/Controls/src/Core/Compatibility/Handlers/Shell/iOS/ShellFlyoutLayoutManager.cssrc/Controls/src/Core/Compatibility/Handlers/Shell/iOS/ShellPageRendererTracker.cssrc/Controls/src/Core/Compatibility/Handlers/Shell/iOS/ShellSectionRenderer.cssrc/Controls/src/Core/Compatibility/Handlers/Shell/iOS/ShellSectionRootRenderer.cssrc/Controls/src/Core/Compatibility/Handlers/Shell/iOS/ShellTableViewController.cssrc/Controls/src/Core/Editor/Editor.Mapper.cssrc/Controls/src/Core/Editor/Editor.iOS.cssrc/Controls/src/Core/Element/Element.cssrc/Controls/src/Core/Entry/Entry.Mapper.cssrc/Controls/src/Core/Entry/Entry.iOS.cssrc/Controls/src/Core/FlyoutPage/FlyoutPage.cssrc/Controls/src/Core/FormattedString.cssrc/Controls/src/Core/GestureElement.cssrc/Controls/src/Core/Handlers/Items/Android/Adapters/GroupableItemsViewAdapter.cssrc/Controls/src/Core/Handlers/Items/Android/Adapters/ItemsViewAdapter.cssrc/Controls/src/Core/Handlers/Items/Android/GridLayoutSpanSizeLookup.cssrc/Controls/src/Core/Handlers/Items/Android/ItemContentView.cssrc/Controls/src/Core/Handlers/Items/Android/MauiCarouselRecyclerView.cssrc/Controls/src/Core/Handlers/Items/Android/MauiRecyclerView.cssrc/Controls/src/Core/Handlers/Items/Android/TemplatedItemViewHolder.cssrc/Controls/src/Core/Handlers/Items/CarouselViewHandler.Windows.cssrc/Controls/src/Core/Handlers/Items/iOS/ItemsViewController.cssrc/Controls/src/Core/Handlers/Items/iOS/ItemsViewDelegator.cssrc/Controls/src/Core/Handlers/Items2/iOS/CarouselViewController2.cssrc/Controls/src/Core/Handlers/Items2/iOS/GroupableItemsViewController2.cssrc/Controls/src/Core/Handlers/Items2/iOS/ItemsViewController2.cssrc/Controls/src/Core/Handlers/Items2/iOS/ItemsViewDelegator2.cssrc/Controls/src/Core/Handlers/Items2/iOS/LayoutFactory2.cssrc/Controls/src/Core/Handlers/Items2/iOS/StructuredItemsViewController2.cssrc/Controls/src/Core/Handlers/Shapes/Polygon/PolygonHandler.Android.cssrc/Controls/src/Core/Handlers/Shapes/Polygon/PolygonHandler.Tizen.cssrc/Controls/src/Core/Handlers/Shapes/Polygon/PolygonHandler.Windows.cssrc/Controls/src/Core/Handlers/Shapes/Polygon/PolygonHandler.cssrc/Controls/src/Core/Handlers/Shapes/Polygon/PolygonHandler.iOS.cssrc/Controls/src/Core/Handlers/Shapes/Polyline/PolylineHandler.Android.cssrc/Controls/src/Core/Handlers/Shapes/Polyline/PolylineHandler.Tizen.cssrc/Controls/src/Core/Handlers/Shapes/Polyline/PolylineHandler.Windows.cssrc/Controls/src/Core/Handlers/Shapes/Polyline/PolylineHandler.cssrc/Controls/src/Core/Handlers/Shapes/Polyline/PolylineHandler.iOS.cssrc/Controls/src/Core/Handlers/Shell/ShellItemHandler.Windows.cssrc/Controls/src/Core/Handlers/Shell/Windows/ShellFlyoutItemView.cssrc/Controls/src/Core/Handlers/Shell/Windows/ShellView.cssrc/Controls/src/Core/Hosting/AppHostBuilderExtensions.cssrc/Controls/src/Core/ImageElement.cssrc/Controls/src/Core/Internals/WeakEventProxy.cssrc/Controls/src/Core/Items/SelectionList.cssrc/Controls/src/Core/Label/Label.Mapper.cssrc/Controls/src/Core/Label/Label.cssrc/Controls/src/Core/Label/Label.iOS.cssrc/Controls/src/Core/ListView/ListView.cssrc/Controls/src/Core/NavigationPage/NavigationPage.cssrc/Controls/src/Core/Page/Page.cssrc/Controls/src/Core/Platform/AlertManager/AlertManager.Android.cssrc/Controls/src/Core/Platform/AlertManager/AlertManager.cssrc/Controls/src/Core/Platform/Android/BottomNavigationViewUtils.cssrc/Controls/src/Core/Platform/Android/DragAndDropGestureHandler.cssrc/Controls/src/Core/Platform/Android/GenericAnimatorListener.cssrc/Controls/src/Core/Platform/Android/TabbedPageManager.cssrc/Controls/src/Core/Platform/ModalNavigationManager/ModalNavigationManager.iOS.cssrc/Controls/src/Core/Platform/Windows/CollectionView/ScrollHelpers.cssrc/Controls/src/Core/Platform/iOS/Extensions/FormattedStringExtensions.cssrc/Controls/src/Core/Platform/iOS/Extensions/LabelExtensions.cssrc/Controls/src/Core/PromptArguments.cssrc/Controls/src/Core/PublicAPI/net-android/PublicAPI.Unshipped.txtsrc/Controls/src/Core/PublicAPI/net-ios/PublicAPI.Unshipped.txtsrc/Controls/src/Core/PublicAPI/net-maccatalyst/PublicAPI.Unshipped.txtsrc/Controls/src/Core/PublicAPI/net-tizen/PublicAPI.Unshipped.txtsrc/Controls/src/Core/PublicAPI/net-windows/PublicAPI.Unshipped.txtsrc/Controls/src/Core/PublicAPI/net/PublicAPI.Unshipped.txtsrc/Controls/src/Core/PublicAPI/netstandard/PublicAPI.Unshipped.txtsrc/Controls/src/Core/RadioButton/RadioButton.cssrc/Controls/src/Core/RadioButton/RadioButtonGroup.cssrc/Controls/src/Core/RadioButton/RadioButtonGroupController.cssrc/Controls/src/Core/ResourcesExtensions.cssrc/Controls/src/Core/Setter.cssrc/Controls/src/Core/Shadow.cssrc/Controls/src/Core/Shapes/Shape.cssrc/Controls/src/Core/Shell/Shell.cssrc/Controls/src/Core/Shell/ShellNavigationManager.cssrc/Controls/src/Core/SwipeView/SwipeItem.cssrc/Controls/src/Core/SwipeView/SwipeItemView.cssrc/Controls/src/Core/SwipeView/SwipeItems.cssrc/Controls/src/Core/SwipeView/SwipeView.cssrc/Controls/src/Core/TabbedPage/TabbedPage.Windows.cssrc/Controls/src/Core/VisualElement/VisualElement.cssrc/Controls/src/Core/VisualStateManager.cssrc/Controls/src/Core/WebView/WebViewSource.cssrc/Controls/src/Core/Window/Window.Android.cssrc/Controls/src/Core/Window/Window.cssrc/Controls/src/SourceGen/NodeSGExtensions.cssrc/Controls/src/Xaml/ApplyPropertiesVisitor.cssrc/Controls/src/Xaml/MarkupExtensions/OnIdiomExtension.cssrc/Controls/src/Xaml/MarkupExtensions/StaticResourceExtension.cssrc/Core/maps/src/Handlers/Map/MapHandler.Android.cssrc/Core/maps/src/Handlers/Map/MapHandler.iOS.cssrc/Core/maps/src/Handlers/MapPin/MapPinHandler.Android.cssrc/Core/maps/src/Platform/iOS/MauiMKMapView.cssrc/Core/maps/src/PublicAPI/net-android/PublicAPI.Unshipped.txtsrc/Core/src/Diagnostics/DiagnosticsManager.cssrc/Core/src/Diagnostics/IDiagnosticsManager.cssrc/Core/src/Diagnostics/Instrumentation/DiagnosticInstrumentation.cssrc/Core/src/Diagnostics/Instrumentation/LayoutArrangeInstrumentation.cssrc/Core/src/Diagnostics/Instrumentation/LayoutDiagnosticMetrics.cssrc/Core/src/Diagnostics/Instrumentation/LayoutMeasureInstrumentation.cssrc/Core/src/Graphics/MauiDrawable.Android.cssrc/Core/src/Handlers/Button/ButtonHandler.Android.cssrc/Core/src/Handlers/Button/ButtonHandler.cssrc/Core/src/Handlers/Button/ButtonHandler.iOS.cssrc/Core/src/Handlers/DatePicker/DatePickerHandler.Android.cssrc/Core/src/Handlers/DatePicker/DatePickerHandler.MacCatalyst.cssrc/Core/src/Handlers/Editor/EditorHandler.iOS.cssrc/Core/src/Handlers/Entry/EntryHandler.cssrc/Core/src/Handlers/Entry/EntryHandler.iOS.cssrc/Core/src/Handlers/FlyoutView/FlyoutViewHandler.Android.cssrc/Core/src/Handlers/HybridWebView/HybridWebViewHandler.Standard.cssrc/Core/src/Handlers/HybridWebView/HybridWebViewHandler.Tizen.cssrc/Core/src/Handlers/HybridWebView/HybridWebViewHandler.Windows.cssrc/Core/src/Handlers/HybridWebView/HybridWebViewHandler.cssrc/Core/src/Handlers/Image/ImageHandler.Windows.cssrc/Core/src/Handlers/Image/ImageHandler.iOS.cssrc/Core/src/Handlers/Label/LabelHandler.cssrc/Core/src/Handlers/Label/LabelHandler.iOS.cssrc/Core/src/Handlers/Picker/PickerHandler.iOS.cssrc/Core/src/Handlers/ProgressBar/ProgressBarHandler.iOS.cssrc/Core/src/Handlers/RadioButton/RadioButtonHandler.cssrc/Core/src/Handlers/RadioButton/RadioButtonHandler.iOS.cssrc/Core/src/Handlers/RefreshView/RefreshViewHandler.Windows.cssrc/Core/src/Handlers/ScrollView/ScrollViewHandler.Android.cssrc/Core/src/Handlers/ScrollView/ScrollViewHandler.Windows.cssrc/Core/src/Handlers/ScrollView/ScrollViewHandler.iOS.cssrc/Core/src/Handlers/SearchBar/SearchBarHandler.iOS.cssrc/Core/src/Handlers/SearchBar/SearchBarHandler2.Android.cssrc/Core/src/Handlers/ShapeView/ShapeViewHandler.Standard.cssrc/Core/src/Handlers/ShapeView/ShapeViewHandler.cssrc/Core/src/Handlers/Stepper/StepperHandler.iOS.cssrc/Core/src/Handlers/SwipeItemMenuItem/SwipeItemMenuItemHandler.Android.cssrc/Core/src/Handlers/SwipeItemMenuItem/SwipeItemMenuItemHandler.iOS.cssrc/Core/src/Handlers/Switch/SwitchHandler.iOS.cssrc/Core/src/Handlers/TimePicker/TimePickerHandler.Android.cssrc/Core/src/Handlers/TimePicker/TimePickerHandler.Windows.cssrc/Core/src/Handlers/TimePicker/TimePickerHandler.cssrc/Core/src/Handlers/TimePicker/TimePickerHandler.iOS.cssrc/Core/src/Handlers/WebView/WebViewHandler.Android.cssrc/Core/src/Hosting/EssentialsMauiAppBuilderExtensions.cssrc/Core/src/Hosting/LifecycleEvents/AppHostBuilderExtensions.Android.cssrc/Core/src/Platform/Android/ActivityIndicatorExtensions.cssrc/Core/src/Platform/Android/ActivityResultCallbackRegistry.cssrc/Core/src/Platform/Android/BorderDrawable.cssrc/Core/src/Platform/Android/ContainerView.cssrc/Core/src/Platform/Android/EditTextExtensions.cssrc/Core/src/Platform/Android/MauiAppCompatActivity.Lifecycle.cssrc/Core/src/Platform/Android/MauiAppCompatActivity.cssrc/Core/src/Platform/Android/MauiHybridWebView.cssrc/Core/src/Platform/Android/MauiHybridWebViewClient.cssrc/Core/src/Platform/Android/MauiScrollView.cssrc/Core/src/Platform/Android/MauiSearchView.cssrc/Core/src/Platform/Android/MauiSwipeRefreshLayout.cssrc/Core/src/Platform/Android/MauiSwipeView.cssrc/Core/src/Platform/Android/MauiWebView.cssrc/Core/src/Platform/Android/MauiWebViewClient.cssrc/Core/src/Platform/Android/Navigation/NavigationRootManager.cssrc/Core/src/Platform/Android/RadioButtonExtensions.cssrc/Core/src/Platform/Android/SafeAreaExtensions.cssrc/Core/src/Platform/Android/SearchViewExtensions.cssrc/Core/src/Platform/Android/TimePickerExtensions.cssrc/Core/src/Platform/Windows/ContentPanel.cssrc/Core/src/Platform/Windows/LayoutPanel.cssrc/Core/src/Platform/Windows/MauiPasswordTextBox.cssrc/Core/src/Platform/Windows/MauiToolbar.xaml.cssrc/Core/src/Platform/Windows/RadioButtonExtensions.cssrc/Core/src/Platform/Windows/RootNavigationView.cssrc/Core/src/Platform/Windows/ScrollViewerExtensions.cssrc/Core/src/Platform/Windows/TimePickerExtensions.cssrc/Core/src/Platform/Windows/WebViewExtensions.cssrc/Core/src/Platform/iOS/ButtonExtensions.cssrc/Core/src/Platform/iOS/KeyboardAcceleratorExtensions.cssrc/Core/src/Platform/iOS/LayerExtensions.cssrc/Core/src/Platform/iOS/MauiPageControl.cssrc/Core/src/Platform/iOS/MauiScrollView.cssrc/Core/src/Platform/iOS/MauiSwipeView.cssrc/Core/src/Platform/iOS/MauiTextView.cssrc/Core/src/Platform/iOS/MauiView.cssrc/Core/src/Platform/iOS/PickerExtensions.cssrc/Core/src/Platform/iOS/TabbedViewExtensions.cssrc/Core/src/Platform/iOS/TextFieldExtensions.cssrc/Core/src/Platform/iOS/TimePickerExtensions.cssrc/Core/src/Platform/iOS/WrapperView.cssrc/Core/src/PublicAPI/net-android/PublicAPI.Unshipped.txtsrc/Core/src/PublicAPI/net-ios/PublicAPI.Unshipped.txtsrc/Core/src/PublicAPI/net-maccatalyst/PublicAPI.Unshipped.txtsrc/Core/src/PublicAPI/net-windows/PublicAPI.Unshipped.txtsrc/Core/src/ViewExtensions.cssrc/Core/src/WindowExtensions.cssrc/Essentials/src/AssemblyInfo/AssemblyInfo.shared.cssrc/Essentials/src/Clipboard/Clipboard.shared.cssrc/Essentials/src/FilePicker/FilePicker.tizen.cssrc/Essentials/src/FileSystem/FileSystemUtils.android.cssrc/Essentials/src/FileSystem/FileSystemUtils.shared.cssrc/Essentials/src/MainThread/MainThread.netstandard.cssrc/Essentials/src/MainThread/MainThread.shared.cssrc/Essentials/src/MediaPicker/MediaPicker.ios.cssrc/Essentials/src/MediaPicker/MediaPicker.tizen.cssrc/Essentials/src/Types/Shared/WebUtils.shared.cssrc/Graphics/src/Graphics/Platforms/Android/PlatformGraphicsView.cssrc/Graphics/src/Graphics/Platforms/MaciOS/PlatformCanvas.cssrc/Graphics/src/Graphics/Platforms/Windows/PlatformGraphicsView.cssrc/Graphics/src/Graphics/Platforms/iOS/PlatformGraphicsView.cssrc/SingleProject/Resizetizer/src/GenerateTizenManifest.cssrc/SingleProject/Resizetizer/src/SkiaSharpSvgTools.cs
New files (not reverted):
src/Controls/src/Core/Handlers/Items/iOS/IScrollTrackingDelegator.cssrc/Controls/src/Core/Platform/AlertManager/DelegateAlertSubscription.cssrc/Core/src/Handlers/HybridWebView/HybridWebViewHelper.cssrc/Core/src/Platform/Android/AppbarLayoutExtensions.cssrc/Core/src/Platform/Android/IBackNavigationState.cssrc/Core/src/Platform/Android/RefreshViewWebViewScrollCapture.cssrc/Core/src/Platform/Windows/MauiLayoutAutomationPeer.cssrc/Core/src/Platform/iOS/MauiProgressView.cssrc/Core/src/ScreenshotDispatch.cs
🧪 UI Tests — Accessibility,AutomationID,Layout,ScrollView,ViewBaseTests
Detected UI test categories: Accessibility,AutomationID,Layout,ScrollView,ViewBaseTests
🧪 UI Test Execution Results
❌ FAILED — 0 passed, 1 failed, 0 skipped (platform: windows)
| Category | Result | Tests | Duration | Notes |
|---|---|---|---|---|
ViewBaseTests |
❌ FAILED | 0/1 — build/deploy failed before per-test results | 216.9s | exit code 1 |
Failed test details
❌ ViewBaseTests — build/deploy failed (no per-test results)
Last 30 lines of build/test stdout:
Restored D:\a\1\s\src\Core\src\Core.csproj (in 15.71 sec).
Restored D:\a\1\s\src\Core\maps\src\Maps.csproj (in 15.14 sec).
Restored D:\a\1\s\src\Controls\tests\TestCases.HostApp\Controls.TestCases.HostApp.csproj (in 7.68 sec).
Restored D:\a\1\s\src\Controls\src\Xaml\Controls.Xaml.csproj (in 39 ms).
Restored D:\a\1\s\src\Controls\src\Core\Controls.Core.csproj (in 16 ms).
Restored D:\a\1\s\src\Controls\Maps\src\Controls.Maps.csproj (in 26 ms).
Restored D:\a\1\s\src\Controls\Foldable\src\Controls.Foldable.csproj (in 12 ms).
Restored D:\a\1\s\src\BlazorWebView\src\Maui\Microsoft.AspNetCore.Components.WebView.Maui.csproj (in 23 ms).
3 of 14 projects are up-to-date for restore.
##vso[build.updatebuildnumber]10.0.80-ci+azdo.14198607
Graphics -> D:\a\1\s\artifacts\bin\Graphics\Debug\net10.0-windows10.0.19041.0\Microsoft.Maui.Graphics.dll
##vso[build.updatebuildnumber]10.0.80-ci+azdo.14198607
Essentials -> D:\a\1\s\artifacts\bin\Essentials\Debug\net10.0-windows10.0.19041.0\Microsoft.Maui.Essentials.dll
##vso[build.updatebuildnumber]10.0.80-ci+azdo.14198607
Graphics.Win2D -> D:\a\1\s\artifacts\bin\Graphics.Win2D\Debug\net10.0-windows10.0.19041.0\Microsoft.Maui.Graphics.Win2D.WinUI.Desktop.dll
##vso[build.updatebuildnumber]10.0.80-ci+azdo.14198607
Core -> D:\a\1\s\artifacts\bin\Core\Debug\net10.0-windows10.0.19041.0\Microsoft.Maui.dll
Controls.BindingSourceGen -> D:\a\1\s\artifacts\bin\Controls.BindingSourceGen\Debug\netstandard2.0\Microsoft.Maui.Controls.BindingSourceGen.dll
##vso[build.updatebuildnumber]10.0.80-ci+azdo.14198607
##vso[build.updatebuildnumber]10.0.80-ci+azdo.14198607
D:\a\1\s\src\Controls\src\Core\SwipeView\SwipeItemView.cs(62,4): error RS0016: Symbol 'override Microsoft.Maui.Controls.SwipeItemView.IsEnabledCore.get -> bool' is not part of the declared public API (https://github.com/dotnet/roslyn/blob/main/src/RoslynAnalyzers/PublicApiAnalyzers/PublicApiAnalyzers.Help.md) [D:\a\1\s\src\Controls\src\Core\Controls.Core.csproj::TargetFramework=net10.0-windows10.0.19041.0]
Maps -> D:\a\1\s\artifacts\bin\Maps\Debug\net10.0-windows10.0.19041.0\Microsoft.Maui.Maps.dll
Build FAILED.
D:\a\1\s\src\Controls\src\Core\SwipeView\SwipeItemView.cs(62,4): error RS0016: Symbol 'override Microsoft.Maui.Controls.SwipeItemView.IsEnabledCore.get -> bool' is not part of the declared public API (https://github.com/dotnet/roslyn/blob/main/src/RoslynAnalyzers/PublicApiAnalyzers/PublicApiAnalyzers.Help.md) [D:\a\1\s\src\Controls\src\Core\Controls.Core.csproj::TargetFramework=net10.0-windows10.0.19041.0]
0 Warning(s)
1 Error(s)
Time Elapsed 00:02:42.10
Failures here are informational only — they do not block the gate or affect try-fix candidate scoring.
🔍 Regression Cross-Reference
🔍 Regression Cross-Reference
🟢 No regression risks detected. No labeled bug-fix PRs in the last 6 months touched the modified files.
🔍 Pre-Flight — Context & Validation
Issue: #4715 - [Windows] AutomationId does not work for ContentView, Layouts and controls that inherit them
PR: #35597 - [Windows] Make Layout AutomationPeer opt-in for screen reader tree
Platforms Affected: Windows
Files Changed: 1 implementation, 2 test
Key Findings
- PR [Windows] Make Layout AutomationPeer opt-in for screen reader tree #35597 is a follow-up to [Windows] Add Automation Id support for Layouts. #35562. It preserves
AutomationIdexposure for Windows UI automation clients while avoiding layout containers appearing in screen-reader Control/Content views by default. - Changed implementation file:
src/Core/src/Platform/Windows/MauiLayoutAutomationPeer.cs. - Changed tests/sample coverage:
src/Controls/tests/DeviceTests/Elements/Layout/LayoutTests.Windows.csandsrc/Controls/tests/TestCases.HostApp/Issues/Issue4715.cs. - Linked issue [Windows] AutomationId does not work for ContentView, Layouts and controls that inherit them #4715 reports Windows automation frameworks cannot find ContentView/layout-derived controls by
AutomationId; discussion emphasizes Appium/UI-test reliability and asks that ContentView/ContentPage/layout containers become visible to UI automation. - Existing inline review feedback already noted that
AutomationProperties.IsInAccessibleTree="False"must remain an explicit opt-out even when semantic text is set; the current PR code handlesAccessibilityView.Rawbefore semantic checks. - Impacted UI test categories:
Layout,Accessibility,AutomationID, andScrollView. - Gate result was provided as failed by the caller; gate verification was not re-run.
Code Review Summary
Verdict: NEEDS_DISCUSSION
Confidence: medium
Errors: 0 | Warnings: 2 | Suggestions: 0
Key code review findings:
⚠️ src/Core/src/Platform/Windows/MauiLayoutAutomationPeer.cs:67usesstring.IsNullOrEmptyfor semanticName/HelpText; whitespace-only Description/Hint would still opt a layout into the Control view with no meaningful announcement.⚠️ CI is not green:maui-pr, Build Analysis, Windows Debug build, and Windows Helix Debug checks are failing or incomplete; root cause was not established in pre-flight.
Fix Candidates
| # | Source | Approach | Test Result | Files Changed | Notes |
|---|---|---|---|---|---|
| PR | PR #35597 | Override MauiLayoutAutomationPeer so layout panels expose AutomationId through the automation peer/raw UIA path while only entering Control/Content views when AccessibilityView or semantic Name/HelpText opts them in. |
❌ FAILED (Gate provided by caller) | MauiLayoutAutomationPeer.cs, LayoutTests.Windows.cs, Issue4715.cs |
Original PR |
🔬 Code Review — Deep Analysis
Code Review — PR #35597
Independent Assessment
What this changes: Windows layout automation peers keep AutomationId available for UI automation while excluding layouts from screen-reader Control/Content views unless accessibility semantics opt them in.
Inferred motivation: Reduce noisy Narrator/NVDA navigation caused by layout containers being exposed as controls.
Reconciliation with PR Narrative
Author claims: AutomationId remains a raw-view test hook; accessibility visibility is opt-in via IsInAccessibleTree or semantic text.
Agreement/disagreement: Mostly agrees. AccessibilityView.Raw is handled before semantic opt-in. One semantic edge case remains.
Findings
⚠️ Warning — Whitespace semantic text opts layouts into Control view
src/Core/src/Platform/Windows/MauiLayoutAutomationPeer.cs:67
The semantic opt-in checks use string.IsNullOrEmpty, so whitespace-only SemanticProperties.Description or Hint still exposes the layout to screen readers with no meaningful announcement. Other Windows accessibility code uses IsNullOrWhiteSpace; these checks should too.
Written to CustomAgentLogsTmp\PRState\35597\PRAgent\inline-findings.json.
⚠️ Warning — CI is not green
maui-pr and Build Analysis are failing; Windows Debug build and Windows Helix Debug checks failed. I could not verify from available logs whether failures are PR-caused, so this blocks LGTM.
Devil's Advocate
The core approach appears sound for raw vs control/content UIA views. The main uncertainty is CI failure root cause; without logs, I won't assume it is unrelated.
Verdict: NEEDS_DISCUSSION
Confidence: medium
Summary: Code direction looks reasonable, but there is a small accessibility edge case and required CI is failing/incomplete. No GitHub comments were posted.
🔧 Fix — Analysis & Comparison
Fix Candidates
| # | Source | Approach | Test Result | Files Changed | Notes |
|---|---|---|---|---|---|
| 1 | try-fix / claude-opus-4.6 | Handler-mapping policy: proactively set AccessibilityView.Raw/Control from layout semantics, leaving the peer to read the element-level UIA view. |
6 files | Build succeeded, but dotnet test testhost crashed with missing Microsoft.TestPlatform.CoreUtilities. Broader than PR: touched handler mapper, ViewExtensions, PublicAPI, and an unrelated ContentView test workaround appeared in the attempt diff. |
|
| 2 | try-fix / claude-opus-4.7 | Constructor-time peer policy: compute Control/Content visibility once from cross-platform IView.Semantics plus platform AccessibilityView, then cache booleans. |
3 files | Build succeeded after a baseline workaround; testhost crashed with missing Microsoft.TestPlatform.CoreUtilities. Self-review found a moderate runtime-mutation flaw: semantic changes after peer creation would not update visibility. |
|
| 3 | try-fix / gpt-5.3-codex | Dynamic cross-platform semantics policy: read live MauiPanel.CrossPlatformLayout semantics on every peer query, using IsNullOrWhiteSpace, while respecting explicit AccessibilityView. |
❌ FAIL | 2 files | Attempt used an invalid Run-DeviceTests.ps1 -Project csproj path, so parameter validation failed before build/test. This approach addressed candidate 2's stale-cache flaw. |
| 4 | try-fix / gpt-5.5 | Explicit accessibility-tree opt-in only: AutomationId remains raw-view accessible; Control/Content view inclusion ignores Name/HelpText and requires explicit AccessibilityView.Control/Content. |
❌ FAIL | 3 files | Corrected test command syntax, but build failed before LayoutTests due baseline mismatch: ContentPanel.ContentPanelAutomationPeer missing for ContentViewTests.Windows.cs; no Layout tests ran. This policy also conflicts with the PR's intended semantic Description/Hint opt-in behavior. |
| PR | PR #35597 | Peer-level dynamic policy: MauiLayoutAutomationPeer exposes AutomationId while excluding layout containers from Control/Content views unless AccessibilityView or semantic Name/HelpText opts in. |
❌ FAILED (Gate provided by caller) | 3 files | Original PR. Pre-flight code review found one edge case: whitespace-only semantic text should not opt into Control view. |
Cross-Pollination
| Model | Round | New Ideas? | Details |
|---|---|---|---|
| claude-opus-4.6 | 1 | Yes | Proposed moving visibility policy out of peer queries into handler mapping (AccessibilityView.Raw/Control set on the LayoutPanel). |
| claude-opus-4.7 | 1 | Yes | Proposed constructor-time calculation from cross-platform semantics to avoid depending on mapped platform Name/HelpText. |
| gpt-5.3-codex | 1 | Yes | Proposed live cross-platform semantics reads to preserve runtime updates and avoid whitespace semantic opt-in. |
| gpt-5.5 | 1 | Yes | Proposed a stricter explicit opt-in policy where semantic text alone does not pull structural layouts into screen-reader traversal. |
| all | 2 | No | Remaining meaningful variants reduce to one of the explored axes: peer-level dynamic policy, handler-mapped UIA view policy, constructor-time cached policy, live cross-platform semantic policy, or explicit-only accessibility-tree policy. Further attempts would be minor variations such as helper extraction or replacing IsNullOrEmpty with IsNullOrWhiteSpace in the PR approach. |
Learned Failure Details
- Environment/testhost blocker: Attempts 1 and 2 built successfully, but Windows device-test execution aborted before tests ran because
Microsoft.TestPlatform.CoreUtilities, Version=15.0.0.0was missing from the testhost process. - Command correction: Attempt 3 showed
Run-DeviceTests.ps1 -ProjectacceptsControls, not a csproj path. Attempt 4 used the corrected command. - Baseline mismatch: Attempt 4 then failed in build because the broken-baseline restore removed
ContentPanel.ContentPanelAutomationPeerwhileContentViewTests.Windows.csstill referenced it. This is unrelated to the layout automation candidate under test. - Design learning: Constructor-time caching is weaker than dynamic peer evaluation because
SemanticProperties.Description/Hintcan change after the automation peer is created. - Policy learning: Explicit-only opt-in is simplest and least noisy, but it does not satisfy the PR's stated behavior that non-whitespace Description/Hint should imply screen-reader visibility.
Exhausted: Yes
Selected Fix: None of the alternatives is demonstrably better than PR #35597 under the available evidence. Candidate 3 is the most promising alternative design because it keeps the PR's semantic opt-in behavior, fixes the whitespace edge case, and avoids candidate 2's stale cache and candidate 1's broad mapper/PublicAPI churn, but it was not empirically validated because its attempt used an invalid test command. The PR approach with IsNullOrWhiteSpace for Name/HelpText remains the smallest likely improvement, but that is a refinement of the PR rather than an independent alternative.
📋 Report — Final Recommendation
Comparative Report — PR #35597
Gate/Test Context
The supplied gate result for the raw PR was failed, and per instruction it was not re-run. No candidate has a validated passing Windows regression result in the saved STEP 6a artifacts: try-fix-1 and try-fix-2 were blocked by test infrastructure, try-fix-3 failed before execution due an invalid runner argument, and try-fix-4 failed during build due an unrelated baseline mismatch before Layout tests ran.
Candidate Ranking
| Rank | Candidate | Result | Assessment |
|---|---|---|---|
| 1 | pr-plus-reviewer |
Not re-run; based on failed PR gate plus expert review | Best balance. Keeps the PR's narrow, dynamic peer-level policy and applies the expert review's concrete IsNullOrWhiteSpace fix for whitespace-only semantics. |
| 2 | pr |
❌ Gate failed | Smallest submitted fix and mostly sound, but leaves the whitespace-only Description/Hint edge case called out in pre-flight and expert review. |
| 3 | try-fix-3 |
❌ Failed before build/test due invalid command | Strongest independent design: live cross-platform semantics with IsNullOrWhiteSpace, avoiding stale cache and broad mapper churn. It was not empirically validated and changes the peer to require MauiPanel, so it remains less certain than the PR refinement. |
| 4 | try-fix-2 |
Compiled after a baseline workaround, but caches Control/Content membership at peer construction. That loses runtime updates to semantic Description/Hint and is weaker than dynamic evaluation. | |
| 5 | try-fix-1 |
Broad handler-mapping approach with public API churn and unrelated ContentView test workaround. Higher blast radius than needed for the issue. | |
| 6 | try-fix-4 |
❌ Build failed | Conflicts with the PR's intended semantic Description/Hint opt-in behavior and did not compile in the captured attempt due baseline mismatch. |
Winner
Winner: pr-plus-reviewer
This candidate wins because it keeps the raw PR's targeted Windows MauiLayoutAutomationPeer approach and incorporates the only actionable expert-review finding. None of the STEP 6a alternatives produced a passing regression result, and the alternatives either have broader churn, stale-runtime behavior, invalid test execution, build failure, or policy mismatch.
📊 Review Session — 1c8d09e · [Windows] Make Layout AutomationPeer opt-in for screen reader tree · 2026-05-24 11:55 UTC
🚦 Gate — Test Before & After Fix
Gate Result: ❌ FAILED
Platform: WINDOWS · Base: main · Merge base: b0ea772f
🩺 Base branch does not compile — the without-fix build failed. The gate's "does the test fail without the fix" check is unreliable here; this usually means main is broken or a merge-base file went missing. Investigate before trusting this gate.
| Test | Without Fix (expect FAIL) | With Fix (expect PASS) |
|---|---|---|
📱 LayoutTests (LayoutPanelExcludedFromControlViewByDefault, LayoutPanelOptsIntoControlViewViaIsInAccessibleTree, LayoutPanelOptsIntoControlViewWhenDescriptionIsSet) Category=Layout |
🛠️ BUILD ERROR | ❌ FAIL — 312s |
🔴 Without fix — 📱 LayoutTests (LayoutPanelExcludedFromControlViewByDefault, LayoutPanelOptsIntoControlViewViaIsInAccessibleTree, LayoutPanelOptsIntoControlViewWhenDescriptionIsSet): 🛠️ BUILD ERROR · 247s
Determining projects to restore...
Restored D:\a\1\s\src\Controls\src\Xaml\Controls.Xaml.csproj (in 1.18 sec).
Restored D:\a\1\s\src\Controls\src\Xaml.Design\Controls.Xaml.Design.csproj (in 14 ms).
Restored D:\a\1\s\src\Controls\src\Core\Controls.Core.csproj (in 64 ms).
Restored D:\a\1\s\src\Controls\src\Core.Design\Controls.Core.Design.csproj (in 5 ms).
Restored D:\a\1\s\src\Controls\src\BindingSourceGen\Controls.BindingSourceGen.csproj (in 66 ms).
Restored D:\a\1\s\src\Controls\Maps\src\Controls.Maps.csproj (in 59 ms).
Restored D:\a\1\s\src\Core\maps\src\Maps.csproj (in 63 ms).
Restored D:\a\1\s\src\TestUtils\src\DeviceTests\TestUtils.DeviceTests.csproj (in 836 ms).
Restored D:\a\1\s\src\TestUtils\src\DeviceTests.Runners\TestUtils.DeviceTests.Runners.csproj (in 454 ms).
Restored D:\a\1\s\src\TestUtils\src\DeviceTests.Runners.SourceGen\TestUtils.DeviceTests.Runners.SourceGen.csproj (in 7.16 sec).
Restored D:\a\1\s\src\Graphics\src\Graphics\Graphics.csproj (in 54 ms).
Restored D:\a\1\s\src\Graphics\src\Graphics.Win2D\Graphics.Win2D.csproj (in 11 ms).
Restored D:\a\1\s\src\Essentials\src\Essentials.csproj (in 25 ms).
Restored D:\a\1\s\src\Core\tests\DeviceTests.Shared\Core.DeviceTests.Shared.csproj (in 54 ms).
Restored D:\a\1\s\src\Core\src\Core.csproj (in 74 ms).
Restored D:\a\1\s\src\Controls\tests\DeviceTests\Controls.DeviceTests.csproj (in 41.55 sec).
##vso[build.updatebuildnumber]10.0.80-ci+azdo.14182299
Graphics -> D:\a\1\s\artifacts\bin\Graphics\Release\net10.0-windows10.0.19041.0\Microsoft.Maui.Graphics.dll
##vso[build.updatebuildnumber]10.0.80-ci+azdo.14182299
Essentials -> D:\a\1\s\artifacts\bin\Essentials\Release\net10.0-windows10.0.19041.0\Microsoft.Maui.Essentials.dll
##vso[build.updatebuildnumber]10.0.80-ci+azdo.14182299
Graphics.Win2D -> D:\a\1\s\artifacts\bin\Graphics.Win2D\Release\net10.0-windows10.0.19041.0\Microsoft.Maui.Graphics.Win2D.WinUI.Desktop.dll
##vso[build.updatebuildnumber]10.0.80-ci+azdo.14182299
Core -> D:\a\1\s\artifacts\bin\Core\Release\net10.0-windows10.0.19041.0\Microsoft.Maui.dll
Controls.BindingSourceGen -> D:\a\1\s\artifacts\bin\Controls.BindingSourceGen\Release\netstandard2.0\Microsoft.Maui.Controls.BindingSourceGen.dll
##vso[build.updatebuildnumber]10.0.80-ci+azdo.14182299
TestUtils.DeviceTests -> D:\a\1\s\artifacts\bin\TestUtils.DeviceTests\Release\net10.0-windows10.0.19041.0\Microsoft.Maui.TestUtils.DeviceTests.dll
Maps -> D:\a\1\s\artifacts\bin\Maps\Release\net10.0-windows10.0.19041.0\Microsoft.Maui.Maps.dll
##vso[build.updatebuildnumber]10.0.80-ci+azdo.14182299
Controls.Core -> D:\a\1\s\artifacts\bin\Controls.Core\Release\net10.0-windows10.0.19041.0\Microsoft.Maui.Controls.dll
##vso[build.updatebuildnumber]10.0.80-ci+azdo.14182299
Controls.Xaml -> D:\a\1\s\artifacts\bin\Controls.Xaml\Release\net10.0-windows10.0.19041.0\Microsoft.Maui.Controls.Xaml.dll
TestUtils.DeviceTests.Runners -> D:\a\1\s\artifacts\bin\TestUtils.DeviceTests.Runners\Release\net10.0-windows10.0.19041.0\Microsoft.Maui.TestUtils.DeviceTests.Runners.dll
##vso[build.updatebuildnumber]10.0.80-ci+azdo.14182299
Controls.Maps -> D:\a\1\s\artifacts\bin\Controls.Maps\Release\net10.0-windows10.0.19041.0\Microsoft.Maui.Controls.Maps.dll
Core.DeviceTests.Shared -> D:\a\1\s\artifacts\bin\Core.DeviceTests.Shared\Release\net10.0-windows10.0.19041.0\Microsoft.Maui.DeviceTests.Shared.dll
TestUtils.DeviceTests.Runners.SourceGen -> D:\a\1\s\artifacts\bin\TestUtils.DeviceTests.Runners.SourceGen\Release\netstandard2.0\Microsoft.Maui.TestUtils.DeviceTests.Runners.SourceGen.dll
D:\a\1\s\src\Controls\tests\DeviceTests\Elements\ContentView\ContentViewTests.Windows.cs(27,24): error CS0426: The type name 'ContentPanelAutomationPeer' does not exist in the type 'ContentPanel' [D:\a\1\s\src\Controls\tests\DeviceTests\Controls.DeviceTests.csproj::TargetFramework=net10.0-windows10.0.19041.0]
Build FAILED.
D:\a\1\s\src\Controls\tests\DeviceTests\Elements\ContentView\ContentViewTests.Windows.cs(27,24): error CS0426: The type name 'ContentPanelAutomationPeer' does not exist in the type 'ContentPanel' [D:\a\1\s\src\Controls\tests\DeviceTests\Controls.DeviceTests.csproj::TargetFramework=net10.0-windows10.0.19041.0]
0 Warning(s)
1 Error(s)
Time Elapsed 00:03:15.30
🟢 With fix — 📱 LayoutTests (LayoutPanelExcludedFromControlViewByDefault, LayoutPanelOptsIntoControlViewViaIsInAccessibleTree, LayoutPanelOptsIntoControlViewWhenDescriptionIsSet): FAIL ❌ · 312s
Determining projects to restore...
All projects are up-to-date for restore.
##vso[build.updatebuildnumber]10.0.80-ci+azdo.14182299
Graphics -> D:\a\1\s\artifacts\bin\Graphics\Release\net10.0-windows10.0.19041.0\Microsoft.Maui.Graphics.dll
##vso[build.updatebuildnumber]10.0.80-ci+azdo.14182299
Essentials -> D:\a\1\s\artifacts\bin\Essentials\Release\net10.0-windows10.0.19041.0\Microsoft.Maui.Essentials.dll
##vso[build.updatebuildnumber]10.0.80-ci+azdo.14182299
Graphics.Win2D -> D:\a\1\s\artifacts\bin\Graphics.Win2D\Release\net10.0-windows10.0.19041.0\Microsoft.Maui.Graphics.Win2D.WinUI.Desktop.dll
##vso[build.updatebuildnumber]10.0.80-ci+azdo.14182299
Core -> D:\a\1\s\artifacts\bin\Core\Release\net10.0-windows10.0.19041.0\Microsoft.Maui.dll
Controls.BindingSourceGen -> D:\a\1\s\artifacts\bin\Controls.BindingSourceGen\Release\netstandard2.0\Microsoft.Maui.Controls.BindingSourceGen.dll
##vso[build.updatebuildnumber]10.0.80-ci+azdo.14182299
##vso[build.updatebuildnumber]10.0.80-ci+azdo.14182299
D:\a\1\s\src\Controls\src\Core\SwipeView\SwipeItemView.cs(62,4): warning RS0016: Symbol 'override Microsoft.Maui.Controls.SwipeItemView.IsEnabledCore.get -> bool' is not part of the declared public API (https://github.com/dotnet/roslyn/blob/main/src/RoslynAnalyzers/PublicApiAnalyzers/PublicApiAnalyzers.Help.md) [D:\a\1\s\src\Controls\src\Core\Controls.Core.csproj::TargetFramework=net10.0-windows10.0.19041.0]
Controls.Core -> D:\a\1\s\artifacts\bin\Controls.Core\Release\net10.0-windows10.0.19041.0\Microsoft.Maui.Controls.dll
TestUtils.DeviceTests -> D:\a\1\s\artifacts\bin\TestUtils.DeviceTests\Release\net10.0-windows10.0.19041.0\Microsoft.Maui.TestUtils.DeviceTests.dll
##vso[build.updatebuildnumber]10.0.80-ci+azdo.14182299
Maps -> D:\a\1\s\artifacts\bin\Maps\Release\net10.0-windows10.0.19041.0\Microsoft.Maui.Maps.dll
##vso[build.updatebuildnumber]10.0.80-ci+azdo.14182299
Controls.Xaml -> D:\a\1\s\artifacts\bin\Controls.Xaml\Release\net10.0-windows10.0.19041.0\Microsoft.Maui.Controls.Xaml.dll
Controls.Maps -> D:\a\1\s\artifacts\bin\Controls.Maps\Release\net10.0-windows10.0.19041.0\Microsoft.Maui.Controls.Maps.dll
TestUtils.DeviceTests.Runners -> D:\a\1\s\artifacts\bin\TestUtils.DeviceTests.Runners\Release\net10.0-windows10.0.19041.0\Microsoft.Maui.TestUtils.DeviceTests.Runners.dll
Core.DeviceTests.Shared -> D:\a\1\s\artifacts\bin\Core.DeviceTests.Shared\Release\net10.0-windows10.0.19041.0\Microsoft.Maui.DeviceTests.Shared.dll
TestUtils.DeviceTests.Runners.SourceGen -> D:\a\1\s\artifacts\bin\TestUtils.DeviceTests.Runners.SourceGen\Release\netstandard2.0\Microsoft.Maui.TestUtils.DeviceTests.Runners.SourceGen.dll
##vso[build.updatebuildnumber]10.0.80-ci+azdo.14182299
##vso[build.updatebuildnumber]10.0.80-ci+azdo.14182299
Graphics -> D:\a\1\s\artifacts\bin\Graphics\Release\net10.0-windows10.0.19041.0\Microsoft.Maui.Graphics.dll
Controls.DeviceTests -> D:\a\1\s\artifacts\bin\Controls.DeviceTests\Release\net10.0-windows10.0.19041.0\win-x64\Microsoft.Maui.Controls.DeviceTests.dll
Build succeeded.
D:\a\1\s\src\Controls\src\Core\SwipeView\SwipeItemView.cs(62,4): warning RS0016: Symbol 'override Microsoft.Maui.Controls.SwipeItemView.IsEnabledCore.get -> bool' is not part of the declared public API (https://github.com/dotnet/roslyn/blob/main/src/RoslynAnalyzers/PublicApiAnalyzers/PublicApiAnalyzers.Help.md) [D:\a\1\s\src\Controls\src\Core\Controls.Core.csproj::TargetFramework=net10.0-windows10.0.19041.0]
1 Warning(s)
0 Error(s)
Time Elapsed 00:05:00.09
Test run for D:\a\1\s\artifacts\bin\Controls.DeviceTests\Release\net10.0-windows10.0.19041.0\win-x64\Microsoft.Maui.Controls.DeviceTests.dll (.NETCoreApp,Version=v10.0)
VSTest version 18.0.1 (x64)
Starting test execution, please wait...
A total of 1 test files matched the specified pattern.
Testhost process for source(s) 'D:\a\1\s\artifacts\bin\Controls.DeviceTests\Release\net10.0-windows10.0.19041.0\win-x64\Microsoft.Maui.Controls.DeviceTests.dll' exited with error: Unhandled exception. System.IO.FileNotFoundException: Could not load file or assembly 'Microsoft.TestPlatform.CoreUtilities, Version=15.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'. The system cannot find the file specified.
File name: 'Microsoft.TestPlatform.CoreUtilities, Version=15.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'
at Microsoft.VisualStudio.TestPlatform.TestHost.Program.Main(String[] args) in /_/src/vstest/src/testhost.x86/Program.cs:line 41
. Please check the diagnostic logs for more information.
Results File: D:\a\1\s\artifacts\log\TestResults.trx
Test Run Aborted.
Tests completed with exit code: 1
⚠️ Failure Details
- 🛠️ LayoutTests (LayoutPanelExcludedFromControlViewByDefault, LayoutPanelOptsIntoControlViewViaIsInAccessibleTree, LayoutPanelOptsIntoControlViewWhenDescriptionIsSet) without fix: build failed before tests could run
D:\a\1\s\src\Controls\tests\DeviceTests\Elements\ContentView\ContentViewTests.Windows.cs(27,24): error CS0426: The type name 'ContentPanelAutomationPeer' does not exist in the type 'ContentPanel' [D:\...
- ❌ LayoutTests (LayoutPanelExcludedFromControlViewByDefault, LayoutPanelOptsIntoControlViewViaIsInAccessibleTree, LayoutPanelOptsIntoControlViewWhenDescriptionIsSet) FAILED with fix (should pass)
📁 Fix files reverted (236 files)
eng/Signing.propseng/pipelines/ci-copilot.ymlsrc/BlazorWebView/src/Maui/Android/BlazorAndroidWebView.cssrc/BlazorWebView/src/Maui/Android/BlazorWebViewHandler.Android.cssrc/BlazorWebView/src/Maui/Android/WebKitWebViewClient.cssrc/Compatibility/Core/src/Android/Renderers/SwipeViewRenderer.cssrc/Compatibility/Core/src/MacOS/Extensions/NSMenuExtensions.cssrc/Compatibility/Core/src/iOS/EventTracker.cssrc/Compatibility/Core/src/iOS/Renderers/SwipeViewRenderer.cssrc/Controls/samples/Controls.Sample/Pages/Controls/MapsGalleries/MapPinsGallery.xamlsrc/Controls/samples/Controls.Sample/Pages/Controls/MapsGalleries/MapPinsGallery.xaml.cssrc/Controls/src/Build.Tasks/SetPropertiesVisitor.cssrc/Controls/src/Core/ActionSheetArguments.cssrc/Controls/src/Core/AlertArguments.cssrc/Controls/src/Core/BindableObject.cssrc/Controls/src/Core/BindableProperty.cssrc/Controls/src/Core/Button/Button.iOS.cssrc/Controls/src/Core/Compatibility/Android/Resources/layout/flyoutcontent.axmlsrc/Controls/src/Core/Compatibility/Handlers/FlyoutPage/iOS/PhoneFlyoutPageRenderer.cssrc/Controls/src/Core/Compatibility/Handlers/NavigationPage/iOS/NavigationRenderer.cssrc/Controls/src/Core/Compatibility/Handlers/Shell/Android/SearchHandlerAppearanceTracker.cssrc/Controls/src/Core/Compatibility/Handlers/Shell/Android/ShellFlyoutTemplatedContentRenderer.cssrc/Controls/src/Core/Compatibility/Handlers/Shell/Android/ShellFragmentContainer.cssrc/Controls/src/Core/Compatibility/Handlers/Shell/Android/ShellItemRenderer.cssrc/Controls/src/Core/Compatibility/Handlers/Shell/Android/ShellRenderer.cssrc/Controls/src/Core/Compatibility/Handlers/Shell/Android/ShellToolbarTracker.cssrc/Controls/src/Core/Compatibility/Handlers/Shell/iOS/SearchHandlerAppearanceTracker.cssrc/Controls/src/Core/Compatibility/Handlers/Shell/iOS/ShellFlyoutLayoutManager.cssrc/Controls/src/Core/Compatibility/Handlers/Shell/iOS/ShellPageRendererTracker.cssrc/Controls/src/Core/Compatibility/Handlers/Shell/iOS/ShellSectionRenderer.cssrc/Controls/src/Core/Compatibility/Handlers/Shell/iOS/ShellSectionRootRenderer.cssrc/Controls/src/Core/Compatibility/Handlers/Shell/iOS/ShellTableViewController.cssrc/Controls/src/Core/Editor/Editor.Mapper.cssrc/Controls/src/Core/Editor/Editor.iOS.cssrc/Controls/src/Core/Element/Element.cssrc/Controls/src/Core/Entry/Entry.Mapper.cssrc/Controls/src/Core/Entry/Entry.iOS.cssrc/Controls/src/Core/FlyoutPage/FlyoutPage.cssrc/Controls/src/Core/FormattedString.cssrc/Controls/src/Core/GestureElement.cssrc/Controls/src/Core/Handlers/Items/Android/Adapters/GroupableItemsViewAdapter.cssrc/Controls/src/Core/Handlers/Items/Android/Adapters/ItemsViewAdapter.cssrc/Controls/src/Core/Handlers/Items/Android/GridLayoutSpanSizeLookup.cssrc/Controls/src/Core/Handlers/Items/Android/ItemContentView.cssrc/Controls/src/Core/Handlers/Items/Android/MauiCarouselRecyclerView.cssrc/Controls/src/Core/Handlers/Items/Android/MauiRecyclerView.cssrc/Controls/src/Core/Handlers/Items/Android/TemplatedItemViewHolder.cssrc/Controls/src/Core/Handlers/Items/CarouselViewHandler.Windows.cssrc/Controls/src/Core/Handlers/Items/iOS/ItemsViewController.cssrc/Controls/src/Core/Handlers/Items/iOS/ItemsViewDelegator.cssrc/Controls/src/Core/Handlers/Items2/iOS/CarouselViewController2.cssrc/Controls/src/Core/Handlers/Items2/iOS/GroupableItemsViewController2.cssrc/Controls/src/Core/Handlers/Items2/iOS/ItemsViewController2.cssrc/Controls/src/Core/Handlers/Items2/iOS/ItemsViewDelegator2.cssrc/Controls/src/Core/Handlers/Items2/iOS/LayoutFactory2.cssrc/Controls/src/Core/Handlers/Items2/iOS/StructuredItemsViewController2.cssrc/Controls/src/Core/Handlers/Shapes/Polygon/PolygonHandler.Android.cssrc/Controls/src/Core/Handlers/Shapes/Polygon/PolygonHandler.Tizen.cssrc/Controls/src/Core/Handlers/Shapes/Polygon/PolygonHandler.Windows.cssrc/Controls/src/Core/Handlers/Shapes/Polygon/PolygonHandler.cssrc/Controls/src/Core/Handlers/Shapes/Polygon/PolygonHandler.iOS.cssrc/Controls/src/Core/Handlers/Shapes/Polyline/PolylineHandler.Android.cssrc/Controls/src/Core/Handlers/Shapes/Polyline/PolylineHandler.Tizen.cssrc/Controls/src/Core/Handlers/Shapes/Polyline/PolylineHandler.Windows.cssrc/Controls/src/Core/Handlers/Shapes/Polyline/PolylineHandler.cssrc/Controls/src/Core/Handlers/Shapes/Polyline/PolylineHandler.iOS.cssrc/Controls/src/Core/Handlers/Shell/ShellItemHandler.Windows.cssrc/Controls/src/Core/Handlers/Shell/Windows/ShellFlyoutItemView.cssrc/Controls/src/Core/Handlers/Shell/Windows/ShellView.cssrc/Controls/src/Core/Hosting/AppHostBuilderExtensions.cssrc/Controls/src/Core/ImageElement.cssrc/Controls/src/Core/Internals/WeakEventProxy.cssrc/Controls/src/Core/Items/SelectionList.cssrc/Controls/src/Core/Label/Label.Mapper.cssrc/Controls/src/Core/Label/Label.cssrc/Controls/src/Core/Label/Label.iOS.cssrc/Controls/src/Core/ListView/ListView.cssrc/Controls/src/Core/NavigationPage/NavigationPage.cssrc/Controls/src/Core/Page/Page.cssrc/Controls/src/Core/Platform/AlertManager/AlertManager.Android.cssrc/Controls/src/Core/Platform/AlertManager/AlertManager.cssrc/Controls/src/Core/Platform/Android/BottomNavigationViewUtils.cssrc/Controls/src/Core/Platform/Android/DragAndDropGestureHandler.cssrc/Controls/src/Core/Platform/Android/GenericAnimatorListener.cssrc/Controls/src/Core/Platform/Android/TabbedPageManager.cssrc/Controls/src/Core/Platform/ModalNavigationManager/ModalNavigationManager.iOS.cssrc/Controls/src/Core/Platform/Windows/CollectionView/ScrollHelpers.cssrc/Controls/src/Core/Platform/iOS/Extensions/FormattedStringExtensions.cssrc/Controls/src/Core/Platform/iOS/Extensions/LabelExtensions.cssrc/Controls/src/Core/PromptArguments.cssrc/Controls/src/Core/PublicAPI/net-android/PublicAPI.Unshipped.txtsrc/Controls/src/Core/PublicAPI/net-ios/PublicAPI.Unshipped.txtsrc/Controls/src/Core/PublicAPI/net-maccatalyst/PublicAPI.Unshipped.txtsrc/Controls/src/Core/PublicAPI/net-tizen/PublicAPI.Unshipped.txtsrc/Controls/src/Core/PublicAPI/net-windows/PublicAPI.Unshipped.txtsrc/Controls/src/Core/PublicAPI/net/PublicAPI.Unshipped.txtsrc/Controls/src/Core/PublicAPI/netstandard/PublicAPI.Unshipped.txtsrc/Controls/src/Core/RadioButton/RadioButton.cssrc/Controls/src/Core/RadioButton/RadioButtonGroup.cssrc/Controls/src/Core/RadioButton/RadioButtonGroupController.cssrc/Controls/src/Core/ResourcesExtensions.cssrc/Controls/src/Core/Setter.cssrc/Controls/src/Core/Shadow.cssrc/Controls/src/Core/Shapes/Shape.cssrc/Controls/src/Core/Shell/Shell.cssrc/Controls/src/Core/Shell/ShellNavigationManager.cssrc/Controls/src/Core/SwipeView/SwipeItem.cssrc/Controls/src/Core/SwipeView/SwipeItemView.cssrc/Controls/src/Core/SwipeView/SwipeItems.cssrc/Controls/src/Core/SwipeView/SwipeView.cssrc/Controls/src/Core/TabbedPage/TabbedPage.Windows.cssrc/Controls/src/Core/VisualElement/VisualElement.cssrc/Controls/src/Core/VisualStateManager.cssrc/Controls/src/Core/WebView/WebViewSource.cssrc/Controls/src/Core/Window/Window.Android.cssrc/Controls/src/Core/Window/Window.cssrc/Controls/src/SourceGen/NodeSGExtensions.cssrc/Controls/src/Xaml/ApplyPropertiesVisitor.cssrc/Controls/src/Xaml/MarkupExtensions/OnIdiomExtension.cssrc/Controls/src/Xaml/MarkupExtensions/StaticResourceExtension.cssrc/Core/maps/src/Handlers/Map/MapHandler.Android.cssrc/Core/maps/src/Handlers/Map/MapHandler.iOS.cssrc/Core/maps/src/Handlers/MapPin/MapPinHandler.Android.cssrc/Core/maps/src/Platform/iOS/MauiMKMapView.cssrc/Core/maps/src/PublicAPI/net-android/PublicAPI.Unshipped.txtsrc/Core/src/Diagnostics/DiagnosticsManager.cssrc/Core/src/Diagnostics/IDiagnosticsManager.cssrc/Core/src/Diagnostics/Instrumentation/DiagnosticInstrumentation.cssrc/Core/src/Diagnostics/Instrumentation/LayoutArrangeInstrumentation.cssrc/Core/src/Diagnostics/Instrumentation/LayoutDiagnosticMetrics.cssrc/Core/src/Diagnostics/Instrumentation/LayoutMeasureInstrumentation.cssrc/Core/src/Graphics/MauiDrawable.Android.cssrc/Core/src/Handlers/Button/ButtonHandler.Android.cssrc/Core/src/Handlers/Button/ButtonHandler.cssrc/Core/src/Handlers/Button/ButtonHandler.iOS.cssrc/Core/src/Handlers/DatePicker/DatePickerHandler.Android.cssrc/Core/src/Handlers/DatePicker/DatePickerHandler.MacCatalyst.cssrc/Core/src/Handlers/Editor/EditorHandler.iOS.cssrc/Core/src/Handlers/Entry/EntryHandler.cssrc/Core/src/Handlers/Entry/EntryHandler.iOS.cssrc/Core/src/Handlers/FlyoutView/FlyoutViewHandler.Android.cssrc/Core/src/Handlers/HybridWebView/HybridWebViewHandler.Standard.cssrc/Core/src/Handlers/HybridWebView/HybridWebViewHandler.Tizen.cssrc/Core/src/Handlers/HybridWebView/HybridWebViewHandler.Windows.cssrc/Core/src/Handlers/HybridWebView/HybridWebViewHandler.cssrc/Core/src/Handlers/Image/ImageHandler.Windows.cssrc/Core/src/Handlers/Image/ImageHandler.iOS.cssrc/Core/src/Handlers/Label/LabelHandler.cssrc/Core/src/Handlers/Label/LabelHandler.iOS.cssrc/Core/src/Handlers/Picker/PickerHandler.iOS.cssrc/Core/src/Handlers/ProgressBar/ProgressBarHandler.iOS.cssrc/Core/src/Handlers/RadioButton/RadioButtonHandler.cssrc/Core/src/Handlers/RadioButton/RadioButtonHandler.iOS.cssrc/Core/src/Handlers/RefreshView/RefreshViewHandler.Windows.cssrc/Core/src/Handlers/ScrollView/ScrollViewHandler.Android.cssrc/Core/src/Handlers/ScrollView/ScrollViewHandler.Windows.cssrc/Core/src/Handlers/ScrollView/ScrollViewHandler.iOS.cssrc/Core/src/Handlers/SearchBar/SearchBarHandler.iOS.cssrc/Core/src/Handlers/SearchBar/SearchBarHandler2.Android.cssrc/Core/src/Handlers/ShapeView/ShapeViewHandler.Standard.cssrc/Core/src/Handlers/ShapeView/ShapeViewHandler.cssrc/Core/src/Handlers/Stepper/StepperHandler.iOS.cssrc/Core/src/Handlers/SwipeItemMenuItem/SwipeItemMenuItemHandler.Android.cssrc/Core/src/Handlers/SwipeItemMenuItem/SwipeItemMenuItemHandler.iOS.cssrc/Core/src/Handlers/Switch/SwitchHandler.iOS.cssrc/Core/src/Handlers/TimePicker/TimePickerHandler.Android.cssrc/Core/src/Handlers/TimePicker/TimePickerHandler.Windows.cssrc/Core/src/Handlers/TimePicker/TimePickerHandler.cssrc/Core/src/Handlers/TimePicker/TimePickerHandler.iOS.cssrc/Core/src/Handlers/WebView/WebViewHandler.Android.cssrc/Core/src/Hosting/EssentialsMauiAppBuilderExtensions.cssrc/Core/src/Hosting/LifecycleEvents/AppHostBuilderExtensions.Android.cssrc/Core/src/Platform/Android/ActivityIndicatorExtensions.cssrc/Core/src/Platform/Android/ActivityResultCallbackRegistry.cssrc/Core/src/Platform/Android/BorderDrawable.cssrc/Core/src/Platform/Android/ContainerView.cssrc/Core/src/Platform/Android/EditTextExtensions.cssrc/Core/src/Platform/Android/MauiAppCompatActivity.Lifecycle.cssrc/Core/src/Platform/Android/MauiAppCompatActivity.cssrc/Core/src/Platform/Android/MauiHybridWebView.cssrc/Core/src/Platform/Android/MauiHybridWebViewClient.cssrc/Core/src/Platform/Android/MauiScrollView.cssrc/Core/src/Platform/Android/MauiSearchView.cssrc/Core/src/Platform/Android/MauiSwipeRefreshLayout.cssrc/Core/src/Platform/Android/MauiSwipeView.cssrc/Core/src/Platform/Android/MauiWebView.cssrc/Core/src/Platform/Android/MauiWebViewClient.cssrc/Core/src/Platform/Android/Navigation/NavigationRootManager.cssrc/Core/src/Platform/Android/RadioButtonExtensions.cssrc/Core/src/Platform/Android/SafeAreaExtensions.cssrc/Core/src/Platform/Android/SearchViewExtensions.cssrc/Core/src/Platform/Android/TimePickerExtensions.cssrc/Core/src/Platform/Windows/ContentPanel.cssrc/Core/src/Platform/Windows/LayoutPanel.cssrc/Core/src/Platform/Windows/MauiPasswordTextBox.cssrc/Core/src/Platform/Windows/MauiToolbar.xaml.cssrc/Core/src/Platform/Windows/RadioButtonExtensions.cssrc/Core/src/Platform/Windows/RootNavigationView.cssrc/Core/src/Platform/Windows/ScrollViewerExtensions.cssrc/Core/src/Platform/Windows/TimePickerExtensions.cssrc/Core/src/Platform/Windows/WebViewExtensions.cssrc/Core/src/Platform/iOS/ButtonExtensions.cssrc/Core/src/Platform/iOS/KeyboardAcceleratorExtensions.cssrc/Core/src/Platform/iOS/LayerExtensions.cssrc/Core/src/Platform/iOS/MauiPageControl.cssrc/Core/src/Platform/iOS/MauiScrollView.cssrc/Core/src/Platform/iOS/MauiSwipeView.cssrc/Core/src/Platform/iOS/MauiTextView.cssrc/Core/src/Platform/iOS/MauiView.cssrc/Core/src/Platform/iOS/PickerExtensions.cssrc/Core/src/Platform/iOS/TabbedViewExtensions.cssrc/Core/src/Platform/iOS/TextFieldExtensions.cssrc/Core/src/Platform/iOS/TimePickerExtensions.cssrc/Core/src/Platform/iOS/WrapperView.cssrc/Core/src/PublicAPI/net-android/PublicAPI.Unshipped.txtsrc/Core/src/PublicAPI/net-ios/PublicAPI.Unshipped.txtsrc/Core/src/PublicAPI/net-maccatalyst/PublicAPI.Unshipped.txtsrc/Core/src/PublicAPI/net-windows/PublicAPI.Unshipped.txtsrc/Core/src/ViewExtensions.cssrc/Core/src/WindowExtensions.cssrc/Essentials/src/AssemblyInfo/AssemblyInfo.shared.cssrc/Essentials/src/Clipboard/Clipboard.shared.cssrc/Essentials/src/FilePicker/FilePicker.tizen.cssrc/Essentials/src/FileSystem/FileSystemUtils.android.cssrc/Essentials/src/FileSystem/FileSystemUtils.shared.cssrc/Essentials/src/MainThread/MainThread.netstandard.cssrc/Essentials/src/MainThread/MainThread.shared.cssrc/Essentials/src/MediaPicker/MediaPicker.ios.cssrc/Essentials/src/MediaPicker/MediaPicker.tizen.cssrc/Essentials/src/Types/Shared/WebUtils.shared.cssrc/Graphics/src/Graphics/Platforms/Android/PlatformGraphicsView.cssrc/Graphics/src/Graphics/Platforms/MaciOS/PlatformCanvas.cssrc/Graphics/src/Graphics/Platforms/Windows/PlatformGraphicsView.cssrc/Graphics/src/Graphics/Platforms/iOS/PlatformGraphicsView.cssrc/SingleProject/Resizetizer/src/GenerateTizenManifest.cssrc/SingleProject/Resizetizer/src/SkiaSharpSvgTools.cs
New files (not reverted):
src/Controls/src/Core/Handlers/Items/iOS/IScrollTrackingDelegator.cssrc/Controls/src/Core/Platform/AlertManager/DelegateAlertSubscription.cssrc/Core/src/Handlers/HybridWebView/HybridWebViewHelper.cssrc/Core/src/Platform/Android/AppbarLayoutExtensions.cssrc/Core/src/Platform/Android/IBackNavigationState.cssrc/Core/src/Platform/Android/RefreshViewWebViewScrollCapture.cssrc/Core/src/Platform/Windows/MauiLayoutAutomationPeer.cssrc/Core/src/Platform/iOS/MauiProgressView.cssrc/Core/src/ScreenshotDispatch.cs
🧪 UI Tests — ViewBaseTests
Detected UI test categories: ViewBaseTests
🧪 UI Test Execution Results
❌ FAILED — 0 passed, 1 failed, 0 skipped (platform: windows)
| Category | Result | Tests | Duration | Notes |
|---|---|---|---|---|
ViewBaseTests |
❌ FAILED | 0/1 — build/deploy failed before per-test results | 257s | exit code 1 |
Failed test details
❌ ViewBaseTests — build/deploy failed (no per-test results)
Last 30 lines of build/test stdout:
Restored D:\a\1\s\src\Controls\Maps\src\Controls.Maps.csproj (in 1.64 sec).
Restored D:\a\1\s\src\Graphics\src\Graphics.Win2D\Graphics.Win2D.csproj (in 26 ms).
Restored D:\a\1\s\src\Essentials\src\Essentials.csproj (in 22 ms).
Restored D:\a\1\s\src\Core\src\Core.csproj (in 69 ms).
Restored D:\a\1\s\src\Core\maps\src\Maps.csproj (in 19 ms).
Restored D:\a\1\s\src\Graphics\src\Graphics\Graphics.csproj (in 1.71 sec).
Restored D:\a\1\s\src\Controls\tests\TestCases.HostApp\Controls.TestCases.HostApp.csproj (in 1.15 sec).
Restored D:\a\1\s\src\Controls\src\Xaml\Controls.Xaml.csproj (in 23 ms).
3 of 14 projects are up-to-date for restore.
##vso[build.updatebuildnumber]10.0.80-ci+azdo.14182299
Graphics -> D:\a\1\s\artifacts\bin\Graphics\Debug\net10.0-windows10.0.19041.0\Microsoft.Maui.Graphics.dll
##vso[build.updatebuildnumber]10.0.80-ci+azdo.14182299
##vso[build.updatebuildnumber]10.0.80-ci+azdo.14182299
Graphics.Win2D -> D:\a\1\s\artifacts\bin\Graphics.Win2D\Debug\net10.0-windows10.0.19041.0\Microsoft.Maui.Graphics.Win2D.WinUI.Desktop.dll
Essentials -> D:\a\1\s\artifacts\bin\Essentials\Debug\net10.0-windows10.0.19041.0\Microsoft.Maui.Essentials.dll
##vso[build.updatebuildnumber]10.0.80-ci+azdo.14182299
Core -> D:\a\1\s\artifacts\bin\Core\Debug\net10.0-windows10.0.19041.0\Microsoft.Maui.dll
Controls.BindingSourceGen -> D:\a\1\s\artifacts\bin\Controls.BindingSourceGen\Debug\netstandard2.0\Microsoft.Maui.Controls.BindingSourceGen.dll
##vso[build.updatebuildnumber]10.0.80-ci+azdo.14182299
##vso[build.updatebuildnumber]10.0.80-ci+azdo.14182299
D:\a\1\s\src\Controls\src\Core\SwipeView\SwipeItemView.cs(62,4): error RS0016: Symbol 'override Microsoft.Maui.Controls.SwipeItemView.IsEnabledCore.get -> bool' is not part of the declared public API (https://github.com/dotnet/roslyn/blob/main/src/RoslynAnalyzers/PublicApiAnalyzers/PublicApiAnalyzers.Help.md) [D:\a\1\s\src\Controls\src\Core\Controls.Core.csproj::TargetFramework=net10.0-windows10.0.19041.0]
Maps -> D:\a\1\s\artifacts\bin\Maps\Debug\net10.0-windows10.0.19041.0\Microsoft.Maui.Maps.dll
Build FAILED.
D:\a\1\s\src\Controls\src\Core\SwipeView\SwipeItemView.cs(62,4): error RS0016: Symbol 'override Microsoft.Maui.Controls.SwipeItemView.IsEnabledCore.get -> bool' is not part of the declared public API (https://github.com/dotnet/roslyn/blob/main/src/RoslynAnalyzers/PublicApiAnalyzers/PublicApiAnalyzers.Help.md) [D:\a\1\s\src\Controls\src\Core\Controls.Core.csproj::TargetFramework=net10.0-windows10.0.19041.0]
0 Warning(s)
1 Error(s)
Time Elapsed 00:02:55.05
Failures here are informational only — they do not block the gate or affect try-fix candidate scoring.
🔍 Regression Cross-Reference
🔍 Regression Cross-Reference
🟢 No regression risks detected. No labeled bug-fix PRs in the last 6 months touched the modified files.
🔍 Pre-Flight — Context & Validation
Issue: #4715 - [Windows] AutomationId does not work for ContentView, Layouts and controls that inherit them
PR: #35597 - [Windows] Make Layout AutomationPeer opt-in for screen reader tree
Platforms Affected: Windows
Files Changed: 1 implementation, 1 test
Key Findings
- PR [Windows] Make Layout AutomationPeer opt-in for screen reader tree #35597 refines [Windows] Add Automation Id support for Layouts. #35562 by preventing AutomationId-only layout panels from entering the UIA Control/Content views while preserving AutomationId lookup through the peer/raw view.
- Issue [Windows] AutomationId does not work for ContentView, Layouts and controls that inherit them #4715 is Windows-specific and concerns ContentView/layout discoverability by UI automation clients such as Appium.
- Existing discussion highlights a tension between UI test discoverability and screen-reader noise: [Windows] Add Automation Id support for Layouts. #35562 fixed discoverability but made every layout peer a Control view element.
- No PR review threads were reported by GitHub MCP; PR comments are mostly dogfood/automation comments.
- Impacted tests are Windows device tests under
src/Controls/tests/DeviceTests/Elements/Layout/LayoutTests.Windows.cs.
Code Review Summary
Verdict: NEEDS_CHANGES
Confidence: high
Errors: 0 | Warnings: 2 | Suggestions: 2
Key code review findings:
LayoutPanelWithAutomationIdIsExposedInTreenow assertspeer.GetAutomationId()rather than tree exposure, so the test name/assertion are misleading.LayoutPanelOptsIntoControlViewViaIsInAccessibleTreedoes not assertpeer.IsContentElement(), leaving the newIsContentElementCoreopt-in path untested.- The implementation comment should describe MAUI
IsInAccessibleTree=trueas mapping toAccessibilityView.Content, while direct platformAccessibilityView.Controlis separately honored. - Consider an explicit
AccessibilityView.Rawearly return so semantic name/help text cannot opt Raw-only layouts into Control view.
Fix Candidates
| # | Source | Approach | Test Result | Files Changed | Notes |
|---|---|---|---|---|---|
| PR | PR #35597 | Override MauiLayoutAutomationPeer Control/Content view membership based on explicit accessibility opt-in or semantic text instead of AutomationId. |
FAILED (Gate) | src/Core/src/Platform/Windows/MauiLayoutAutomationPeer.cs, src/Controls/tests/DeviceTests/Elements/Layout/LayoutTests.Windows.cs |
Gate was pre-run and failed; not re-run here per instruction. |
🔬 Code Review — Deep Analysis
Code Review PR #35597
Independent Assessment
What this changes: MauiLayoutAutomationPeer.IsControlElementCore() switches from always returning true to an opt-in model: returns true only when AccessibilityView.Control/Content is set locally, or when AutomationProperties.Name (Description) or AutomationProperties.HelpText (Hint) is non-empty. IsContentElementCore() switches from checking AutomationId presence to checking AccessibilityView.Content exclusively. Four device tests are updated accordingly.
Inferred motivation: Every Grid/StackLayout/ContentView was unconditionally landing in the UIA Control view, making Narrator stop on every structural container. AutomationId should be a UI-testing hook (raw view), not an accessibility landmark (control view).
Reconciliation with PR Narrative
Author claims: This PR is a follow-up to #35562 that keeps layouts discoverable by UI automation clients via AutomationId while preventing AutomationId-only layouts from entering the screen-reader Control/Content views. Explicit accessible-tree opt-in or semantic text should still expose layouts to assistive tech.
Agreement/disagreement: The implementation matches the stated behavior. The main gaps are test precision: one renamed test still describes tree exposure while asserting AutomationId value, and the IsInAccessibleTree test does not assert the Content view path.
Findings
Warning Test name/assertion mismatch in LayoutPanelWithAutomationIdIsExposedInTree
The old test asserted peer.IsContentElement(). The new assertion verifies peer.GetAutomationId(), so the test no longer checks tree exposure despite the old method name implying it does. Rename the test to describe AutomationId reflection and/or assert the negative Control/Content view behavior for AutomationId-only layouts.
Warning No test for IsContentElementCore opt-in path
IsContentElementCore() now returns true only for AccessibilityView.Content, and the PR description claims AutomationProperties.IsInAccessibleTree="True" includes the layout in the Content view. LayoutPanelOptsIntoControlViewViaIsInAccessibleTree only asserts Control view inclusion. Add Assert.True(peer.IsContentElement()) there.
Suggestion Comment overstates the MAUI mapping
The comment says IsInAccessibleTree="True" maps to AccessibilityView = Content / Control, but MAUI maps it to Content. Direct platform AccessibilityView.Control is honored by the code, but not by this cross-platform property.
Suggestion Explicit AccessibilityView.Raw guard
If AccessibilityView.Raw is set together with semantic name/help text, the peer currently falls through to the semantic checks. An early return for Raw would make the exclusion intent explicit.
Devil's Advocate
The core production logic appears valid and narrowly scoped to Windows layout automation peers. The warnings are small but concrete because they affect whether the PR proves its behavior table. The Raw guard is lower confidence because WinUI may suppress peer exposure at a higher layer.
Verdict: NEEDS_CHANGES
Confidence: high
Summary: The implementation direction is sound, but the tests should be tightened to cover the Content view opt-in path and avoid misleading tree-exposure naming. These are small changes and likely sufficient for the PR's stated behavior.
🔧 Fix — Analysis & Comparison
Fix Candidates
| # | Source | Approach | Test Result | Files Changed | Notes |
|---|---|---|---|---|---|
| 1 | try-fix | WinUI semantic view separation: explicit accessible-tree opt-in controls Control view; Description becomes Content-view-only; Hint-only stays hidden. | FAIL | 1 file | Built, but Windows vstest aborted before executing tests with Microsoft.TestPlatform.CoreUtilities missing. Also incompatible with PR regression criteria because PR expects Description to opt into Control view. |
| 2 | try-fix | Explicit AccessibilityView.Raw opt-out: IsInAccessibleTree=false overrides semantic Description/Hint implicit Control-view opt-in. |
FAIL | 2 files | Built, but Windows vstest aborted before executing tests with Microsoft.TestPlatform.CoreUtilities missing. Low-risk enhancement but not demonstrably better without passing tests. |
| 3 | try-fix | Read MAUI IView.Semantics from MauiPanel.CrossPlatformLayout instead of WinUI Name/HelpText side effects. |
FAIL | 1 file | Built, but Windows vstest aborted before executing tests with Microsoft.TestPlatform.CoreUtilities missing. Distinct source-of-truth approach with possible timing/null-state risk. |
| PR | PR #35597 | Platform peer uses local AccessibilityView and platform AutomationProperties.Name/HelpText to opt layouts into Control view; Content view only for AccessibilityView.Content. |
FAILED (Gate pre-run) | 2 files | Original PR; gate result was provided as failed and was not re-run. |
Cross-Pollination
| Model | Round | New Ideas? | Details |
|---|---|---|---|
| maui-expert-reviewer | 1 | Yes | Candidate 1: split Control and Content semantics so Description is readable content rather than a Control-view landmark. |
| maui-expert-reviewer | 2 | Yes | Candidate 2: preserve PR behavior but add explicit AccessibilityView.Raw opt-out precedence. |
| maui-expert-reviewer | 3 | Yes | Candidate 3: read cross-platform MAUI IView.Semantics directly instead of WinUI mapped properties. |
| maui-expert-reviewer | 4 | No | Further variants would be trivial combinations of Raw guard + semantics source or test-only cleanup, not meaningfully different root-cause approaches. |
Exhausted: Yes
Selected Fix: PR #35597 No alternative candidate passed all tests. Candidate 2 is the most plausible improvement, but it is not demonstrably better under the required stop criteria because local Windows test execution is blocked by the missing vstest dependency.
Environment / Baseline Notes
ghis unauthenticated in this environment, soEstablishBrokenBaseline.ps1could not detect PR metadata.- The local review branch is stacked on previous agent commits; both default and explicit
-BaseBranch inflight/currentbaseline attempts detected hundreds of unrelated files. Those broad baselines were restored immediately and documented in attempt 1 logs. - Subsequent candidates were applied manually on top of the PR review commit and then reverted, preserving the PR files.
- Test command used for each candidate:
pwsh .github\skills\run-device-tests\scripts\Run-DeviceTests.ps1 -Project Controls -Platform windows -TestFilter "FullyQualifiedName~LayoutPanel". - All candidate builds succeeded; all test runs aborted before executing tests with
System.IO.FileNotFoundException: Microsoft.TestPlatform.CoreUtilities, Version=15.0.0.0from the vstest testhost.
📋 Report — Final Recommendation
Comparative Report — PR #35597
Candidate ranking
| Rank | Candidate | Regression status | Assessment |
|---|---|---|---|
| 1 | pr-plus-reviewer |
Not rerun; based on reviewer sandbox application. Existing equivalent try-fix-2 run was blocked by the same local vstest dependency failure seen across candidates. |
Best candidate. Preserves the PR's AutomationId/raw-view and semantic opt-in behavior while adding explicit AccessibilityView.Raw opt-out precedence and a targeted regression test. |
| 2 | pr |
Gate failed. The without-fix leg had a base build error, and the with-fix leg built but aborted in vstest with missing Microsoft.TestPlatform.CoreUtilities. |
Directionally correct but has a real accessibility correctness gap: IsInAccessibleTree=false can be overridden by semantic Description/Hint. |
| 3 | try-fix-2 |
Failed local regression run because vstest aborted before executing tests. | Same code idea as pr-plus-reviewer and the strongest independent try-fix. Ranked below pr-plus-reviewer because it is a try-fix artifact rather than reviewer-applied PR candidate, but technically equivalent. |
| 4 | try-fix-3 |
Failed local regression run because vstest aborted before executing tests. | Reading MAUI IView.Semantics directly may reduce platform-side false positives, but it adds timing/null-state risk around CrossPlatformLayout availability and does not clearly improve the PR's mapped-property approach. |
| 5 | try-fix-1 |
Failed; also incompatible with the PR regression criteria because Description no longer opts into Control view. | Semantically arguable, but it changes intended behavior by treating Description as Content-view-only and would fail the PR's Description-as-Control-view regression expectation. |
Analysis
No candidate has a clean passing regression result. The provided gate result for the raw PR is failed, and all STEP 6a try-fix candidates are recorded as failed; most failures are environmental because Windows vstest aborted before test execution with Microsoft.TestPlatform.CoreUtilities missing. Since no candidate passed, the required "passed candidates outrank failed candidates" rule does not separate the field.
The raw PR is a good base fix for the original Windows issue because it keeps AutomationId available through UIA peer/raw-view lookup while preventing AutomationId-only layout panels from entering screen-reader Control/Content views. The expert review, however, identified a concrete precedence bug: explicit AccessibilityView.Raw should win over implicit semantic opt-in. Without that guard, a developer can set AutomationProperties.IsInAccessibleTree=false and still get a Control-view layout because Description/Hint is non-empty.
pr-plus-reviewer is the winning candidate because it is the smallest behavior-preserving improvement over the PR: it keeps explicit accessible-tree opt-in and semantic Description/Hint behavior, adds an explicit Raw opt-out guard, and covers the conflict case with a targeted regression test. It also incorporates the strongest STEP 6a idea (try-fix-2) without adopting riskier semantic-source or Content-view-only behavior from the other candidates.
Winner
pr-plus-reviewer
Note
Are you waiting for the changes in this PR to be merged?
It would be very helpful if you could test the resulting artifacts from this PR and let us know in a comment if this change resolves your issue. Thank you!
Description of Change
Follow-up to #35562. That PR added
MauiLayoutAutomationPeersoAutomationIdset on aLayoutwould be visible to UI Automation clients (Appium / WinAppDriver, etc.), fixing #4715. As a side effect, everyLayoutPanelis now always reported asIsControlElement = true, which puts everyGrid/StackLayout/VerticalStackLayout/ContentViewin the UIA Control view -- the view that screen readers (Narrator, NVDA) walk. The result is that as soon as anyone adds anAutomationIdfor UI testing, screen readers start stopping on every nested layout container in the page, which is noisy and works against WinUI's default treatment of layout containers as structural (invisible to UIA).AutomationIdon a layout is overwhelmingly used as a UI testing hook -- UI testing libraries look up elements by id in the UIA raw view, which is independent ofIsControlElement. So this PR makes screen-reader visibility opt-in while keeping the UI testing path fully working.Behavior after this PR:
AutomationId="..."onlyAutomationProperties.IsInAccessibleTree="True"SemanticProperties.Description="..."(orHint)So:
AutomationIdalone. No screen reader impact.AutomationProperties.IsInAccessibleTree="True"opts the panel into the accessibility tree. Screen readers see it.SemanticProperties.Description/Hintis treated as an implicit opt-in -- if the developer wrote a description, they want it announced.GetClassNameCore(cross-platform layout type name),GetAutomationControlTypeCore(Pane), andIsKeyboardFocusableCore(false) are unchanged from #35562.Tests
LayoutTests.Windows.csis updated:AutomationIdis now verified viapeer.GetAutomationId()directly (raw view), which is what UI testing libraries actually read.IsInAccessibleTree,Description) and verify thatAutomationIdalone does NOT put the panel into the Control view.Note on base branch
Targeted at
inflight/currentbecause the parent change (#35562) is merged there but not yet flowed tomain.Issues Fixed
N/A (follow-up refinement to #35562, which fixed #4715)