Skip to content

Conversation

@PureWeen
Copy link
Member

@PureWeen PureWeen commented Dec 3, 2025

No description provided.

mattleibow and others added 30 commits December 3, 2025 10:23
The TS compiler automatically includes the JS files as content, but we want it as embedded files.

Fixes #32683

Update src/TestUtils/src/Microsoft.Maui.IntegrationTests/WindowsTemplateTest.cs

Co-authored-by: Copilot <[email protected]>
…nt crash (#31866)

Add null check in ControlsModalWrapper.ViewDidLayoutSubviews to prevent crash

Co-authored-by: jfversluis <[email protected]>

Add explanatory comment for defensive null check in ViewDidLayoutSubviews

Co-authored-by: jsuarezruiz <[email protected]>
Fixes unsigned underflow in AsBaseStyle() causing VSM setters from base
styles to be incorrectly converted to ImplicitVSM (lower priority).

Changes:
- Check if style <= StyleBasedOn before subtracting to prevent underflow
- Clamp result to StyleBasedOn minimum to maintain proper priority
- Add StyleBasedOn constant (0x0C0) between implicit and local styles
- Preserve specificity during VisualStateGroupList cloning

Fixes #27202
…2828)

Add accessibility identifier to MauiDoneAccessoryView Done button

Co-authored-by: jfversluis <[email protected]>

Address code review feedback - extract constant and improve comment

Co-authored-by: jfversluis <[email protected]>

Update src/Controls/tests/TestCases.HostApp/Issues/MauiDoneAccessoryButton.cs

Co-authored-by: Copilot <[email protected]>
Added a device test

Fixes

Fixed a memory leak

Don't interfere with other gestures
# Conflicts:
#	src/Controls/tests/TestCases.HostApp/Issues/Issue15810.cs
#	src/Controls/tests/TestCases.Shared.Tests/Tests/Issues/Issue15810.cs
#	src/Core/src/Handlers/ContentView/ContentViewHandler.Windows.cs

Updated test
Removed conditional compilation for Android tests related to color assertions.
Introduces the UpdateLargeTitles method to manage large title display modes for navigation bars in ShellItemRenderer. This ensures that the large title preference is updated when the displayed page changes or when the view lays out subviews, aligning with iOS-specific platform configurations.

Added a UITest

Fix large title display mode handling on iOS Shell

Corrects the logic for setting PrefersLargeTitles to only enable large titles when LargeTitleDisplayMode is Always. Updates Issue12156 test to set LargeTitleDisplay on ContentPage instead of Shell. Adds snapshot images for large title display verification on Mac and iOS.
…r scrolling when deploying ManualMaui Demo project on iOS 26.1 (#32822)

Fix optimized

Update src/Controls/src/Core/Handlers/Items2/iOS/TemplatedCell2.cs

Co-authored-by: Copilot <[email protected]>
#30167)

Included the test sample and test case for the fix

Updated the changes
Renamed the method name

Implemented UI test case

Test case modified.

Modified the test cases

Comments added

removed white spaces
Adds logic to update the TitleView frame during orientation changes for iOS 26+ and Mac Catalyst 26+, ensuring the TitleView expands to fill the navigation bar after rotation. Includes new test case and UI test to verify TitleView resizing behavior.
Fixes #28711

When using x:Name on a SolidColorBrush in ContentPage.Resources, a
NullReferenceException was thrown because GetHashCode was called
(during NameScope registration) before Color was set.

The fix uses base.GetHashCode() (identity-based) instead of hashing
the mutable Color/ImageSource properties. This is correct because:
1. These are mutable reference types - their hash shouldn't change
2. The original implementation was incorrect anyway (hash based on
   mutable state breaks dictionary/hashset semantics)

Changes:
- SolidColorBrush.GetHashCode(): Use base.GetHashCode()
- GradientStop.GetHashCode(): Use base.GetHashCode()
- ImageBrush.GetHashCode(): Use base.GetHashCode()
- Add XAML unit test for x:Name on resources

Close #28805
Enhanced the Issue29086 test case to support multiple NumberItems and unique AutomationIds for SwipeView elements and buttons. Updated the UI and test logic to handle left and right swipe actions, and removed outdated snapshot images for Android, iOS, and Mac.
…gesture (#30652)

Added test.

Updated Issue15778.cs

Updated Issue15778.cs

Updated MauiSwipeView.cs
Fix iOS WebView target blank navigation event handling

Co-authored-by: jfversluis <[email protected]>

Address review feedback: fix test implementation and formatting

- Fixed XAML text to properly display target="_blank" attribute
- Changed test approach to programmatically trigger target="_blank" link click using JavaScript
- Replaced Thread.Sleep with polling-based waiting mechanism
- Test now automatically triggers the click after page load for more reliable testing

Co-authored-by: jfversluis <[email protected]>

Fix CA1307 build error: add StringComparison parameter to Contains calls

Added StringComparison.Ordinal parameter to both Contains() calls in WebView_Navigated method to satisfy code analyzer requirement CA1307.

Co-authored-by: jfversluis <[email protected]>

Fix CS8602 null reference and CA1307 compilation errors in test

- Added null-conditional operators to GetText() calls to fix CS8602
- Added StringComparison.Ordinal parameter to Contains() call to fix CA1307
- Added null check before Contains() to ensure safe string comparison

Co-authored-by: jsuarezruiz <[email protected]>

Fix test by using JavaScript onload to auto-trigger link click

- Moved link click trigger from C# Navigated event to HTML JavaScript onload
- Added window.onload handler with setTimeout to automatically click the target="_blank" link
- Removed WebView_Navigated event handler as it's no longer needed
- This ensures the link click happens reliably after the page loads, properly triggering the Navigating event

Co-authored-by: jfversluis <[email protected]>

Make test iOS-only since fix is iOS-specific

The fix for target="_blank" links is specifically for iOS. The test was
failing on Android because the JavaScript-triggered click behavior differs
between platforms. Making the test iOS-only ensures it only runs where the
fix applies and where it can be reliably tested.

Co-authored-by: jfversluis <[email protected]>

Redesign test to use button-triggered approach for all platforms

- Remove iOS-only restriction (#if IOS)
- Add a button that triggers the target="_blank" link click via JavaScript
- Remove auto-click JavaScript from HTML that was unreliable across platforms
- Test now: waits for button → taps button → waits for result
- This approach is more reliable and works consistently across platforms

Co-authored-by: jfversluis <[email protected]>

Add x:Name attributes to Labels and use direct references

- Added x:Name attributes to NavigatingLabel, UrlLabel, and CancelLabel in XAML
- Updated code-behind to use direct references instead of FindByName calls
- Simplified the code by removing null checks since named elements are always available

Co-authored-by: jfversluis <[email protected]>

Simplify test to only assert Navigating event was triggered

Remove URL and cancel assertions as requested, keeping only the core assertion that the Navigating event was triggered.

Co-authored-by: jfversluis <[email protected]>
Updated test cases

Update Fix on carousel view controller

Added Snapshots for iOS and android
…onView selection (#32669)

added testcase.

Update Issue32348.cs

Update Issue32348.cs

added android snap.

added ios snap

Added windows and mac snapshots.
* Fix TabBar visibility on macOS 26 by excluding Mac from TabSidebar mode

Fixes #32900

The TabSidebar mode introduced for iOS/Catalyst 18+ was causing tabs
to be hidden on macOS. This change excludes macOS from using TabSidebar
mode by checking UIDevice.CurrentDevice.UserInterfaceIdiom != UIUserInterfaceIdiom.Mac.

Changes:
- Modified DisableiOS18ToolbarTabs to skip TabSidebar mode on macOS
- Added UI test case Issue32900 to verify tabs are visible on macOS

* Improve on agent's solution
…30165)

* fix-17010-Made changes to iOS gesture manager to sync SwipeGestureRecognizer direction updates with native recognizer at runtime.

* fix-17010-Testcase added.

* fix-17010-Modified the Testcase and added iOS and Android snapshots.

* fix-17010-Modified the testcase based on Assert check and removed the snapshots.

* fix-17010-Restricted test for Mac.

* fix-17010-Testcase updated.
* Added a UI Test

* Added snapshots

* Handle SearchBar editing stopped event on iOS

Added support for the OnEditingStopped event on the SearchBar in ShellPageRendererTracker for iOS. This ensures the search controller is deactivated when editing stops and properly unsubscribes from the event during disposal to prevent memory leaks.
…ion when called from MainPage constructor (#30264)

* Added fix

* Modified fix

* Space added

* Updated the fix
* Initial plan

* Fix MediaPicker.PickPhotosAsync returning null on iOS

Co-authored-by: jfversluis <[email protected]>

* Complete fix for MediaPicker null return issue

Co-authored-by: jfversluis <[email protected]>

* Address PR review comments: update comment and remove trailing newline

Co-authored-by: jfversluis <[email protected]>

* Fix FilePicker.PickMultipleAsync to return empty collection instead of null on cancellation

Co-authored-by: jfversluis <[email protected]>

* Revert FileSystem.ios.cs change - keep original null return behavior

Co-authored-by: jfversluis <[email protected]>

---------

Co-authored-by: copilot-swe-agent[bot] <[email protected]>
Co-authored-by: jfversluis <[email protected]>
…in Entry, TimePicker, and SearchBar. (#32888)

* Add Appium capabilities to speed up tests

* By current queries, cannot compresses the Android layout hierarchy

* Added headless capability to Android and iOS

* Fix the build

* More changes

* More fixes

* More changes

* More changes based on feedback

* More changes

* More changes

* Fix mistake

* Fix race condition in RemoveInnerPage unit test

The RemoveInnerPage test was failing randomly on CI due to a race condition:
- The test removed a page but didn't wait for navigation to complete
- TestNavigationHandler simulates async navigation with a 10ms delay
- If the test completed before navigation finished, Appearing/Disappearing
  events could fire after test completion, throwing uncaught exceptions

Fixed by:
1. Changed nav declaration from NavigationPage to var (TestNavigationPage)
2. Added await nav.NavigatingTask after RemovePage call

This matches the pattern used in the RemoveLastPage test and ensures
the test waits for async navigation to complete before finishing.

* Add XAML unit testing guidelines

* Add version 10.0.11 to bug report template (#32844)

* [XSG] Fix OnPlatform to generate default values for missing platforms (#32778)

* Initial plan

* Fix OnPlatform SourceGen to use default value instead of removing property

Co-authored-by: simonrozsival <[email protected]>

* Add runtime test to verify OnPlatform default value behavior

Co-authored-by: simonrozsival <[email protected]>

* Address PR review feedback - move runtime test to shared inflator test

Co-authored-by: simonrozsival <[email protected]>

* Improve assertion

* Simplify test setup

* Fix test

* Apply suggestions from code review

Co-authored-by: Copilot <[email protected]>

* Remove custom constructors in test

---------

Co-authored-by: copilot-swe-agent[bot] <[email protected]>
Co-authored-by: simonrozsival <[email protected]>
Co-authored-by: Šimon Rozsíval <[email protected]>
Co-authored-by: Copilot <[email protected]>

* [XSG] Fix incorrect TargetNullValue flag check causing NPE with nullable bindings (#32580)

* Initial plan

* Fix TargetNullValue bug and enable compilation validation in tests

Co-authored-by: simonrozsival <[email protected]>

* Clean up debug code and finalize tests

Co-authored-by: simonrozsival <[email protected]>

* Simplify test infrastructure per code review feedback

Co-authored-by: simonrozsival <[email protected]>

* Improve asserting no compilation errors in generated code

* Fix SourceGen.UnitTests compilation error

The RunGenerator method expects an array of AdditionalFile as the second parameter, not individual file parameters. Updated the call to pass an array containing both expanderFile and bugFile.

* Fix XStaticUnresolvedType tests by disabling compilation validation

The PR introduced compilation validation for generated code by default.
Three tests in XStaticUnresolvedType intentionally reference unresolved
types (MyApp.Routes.Route, ExternalLib.Constants.AppConstants, and
MyApp.Config.Settings) to verify the generator handles them correctly.

Added assertNoCompilationErrors: false parameter to these three tests
to skip compilation validation, similar to the fix in UnresolvedType.cs.

* Fix XStaticUnresolvedType tests to validate compilation with stub types

Co-authored-by: simonrozsival <[email protected]>

* Simplify XStaticUnresolvedType tests by including stub types in code string

Co-authored-by: simonrozsival <[email protected]>

---------

Co-authored-by: copilot-swe-agent[bot] <[email protected]>
Co-authored-by: simonrozsival <[email protected]>
Co-authored-by: Simon Rozsival <[email protected]>
Co-authored-by: Stephane Delcroix <[email protected]>

* [XSG] Reduce dead code for Setters with compiled converters (#32474)

* Initial plan

* Add test demonstrating XSG dead code issue with compiled converters

Co-authored-by: simonrozsival <[email protected]>

* Fix XSG dead code for Setter with compiled converters

This change optimizes the XAML Source Generator to avoid generating dead code when Setters use compiled type converters (like BindablePropertyConverter).

Problem:
When a Setter had properties like Property="FontSize" Value="16", the XSG would:
1. Create a setter object
2. Set properties via assignments (generating service providers with XamlTypeResolver, etc.)
3. Create a NEW inline setter with correct values
4. Add the NEW setter to the collection (the old one was dead code)

This resulted in ~29 lines of dead code including XamlServiceProvider, SimpleValueTargetProvider, XmlNamespaceResolver, and XamlTypeResolver that are not AOT-compatible.

Solution:
When creating value objects in CreateValuesVisitor, check if the type is a known value provider (like Setter). If so, mark simple ValueNode properties to be skipped during property setting. This prevents the dead code from being generated while still allowing complex properties (markup extensions, element content) to be processed.

Result:
- Setter objects are still created (needed for child element service providers)
- Simple value properties are NOT set (no dead code with service providers)
- The inline setter with correct values is created and used
- Complex properties with markup extensions are still processed correctly

Note: There's a known edge case with OnPlatform markup extensions in setter values that needs additional work, but the core optimization is working for simple values which is the main use case.

Co-authored-by: simonrozsival <[email protected]>

* Move test to SourceGen.UnitTests with snapshot testing

Per review feedback:
- Removed the runtime test that was redundant with existing tests
- Moved the source gen test to SourceGen.UnitTests project
- Changed to snapshot test showing the full expected output
- Removed the [Values] parameter since test only needs to run once for SourceGen

Co-authored-by: simonrozsival <[email protected]>

* Add explicit assertion for XamlTypeResolver absence

Added explicit assertion to verify that XamlTypeResolver is not present anywhere in the generated code. This is critical because XamlTypeResolver is not AOT-compatible and was part of the dead code being eliminated by this fix.

Co-authored-by: simonrozsival <[email protected]>

* Simplify test by removing Label with StaticResource

Removed the Label element from the test XAML to focus on the Setter optimization without the noise from StaticResourceExtension. The test now only includes a Style with Setters in the Resources, making the generated code simpler and more focused on demonstrating the dead code elimination for compiled converters.

Co-authored-by: simonrozsival <[email protected]>

* Eliminate dead Setter instantiation for simple value cases

Implemented Option 1: Check for complex property values or collection items before deciding whether to create the Setter variable.

When a Setter has only simple value properties (ValueNodes), we now skip creating the empty setter instantiation entirely. A placeholder variable entry is registered for TryProvideValue to replace with the inline setter.

When a Setter has complex properties (ElementNode, MarkupNode, ListNode) or element collection items, the variable is still created and complex values are set via assignment, but simple value properties are skipped.

Result:
- Empty setter instantiations (e.g., `var setter = new Setter();`) are eliminated for simple cases
- Setters with complex values like VisualStateGroups or OnPlatform elements still work correctly
- 1697 XAML unit tests pass
- 16 tests fail (markup extension edge cases - separate issue to address)

This completes the dead code elimination for the common case of Setters with compiled converters.

Co-authored-by: simonrozsival <[email protected]>

* Revert to conservative approach - skip property assignments only

After extensive investigation, reverted to the safer approach that only skips property assignments for simple values, not variable creation. This eliminates the 25+ lines of service provider dead code (XamlServiceProvider, SimpleValueTargetProvider, XmlNamespaceResolver, XamlTypeResolver) while maintaining compatibility with all edge cases.

The 16 pre-existing test failures are unrelated to this change (confirmed by testing baseline code).

Result: Successfully eliminates AOT-incompatible dead code for the common case of Setters with compiled converters, without introducing any new test failures.

Co-authored-by: simonrozsival <[email protected]>

* Implement IKnownMarkupValueProvider to fix markup extension handling

Fixed the issue where markup extensions (OnPlatform, AppThemeBinding, etc.) in Setter values weren't working correctly. The problem was that Property was being skipped unconditionally, preventing extensions from determining the target type via IProvideValueTarget.

Solution:
- Created IKnownMarkupValueProvider interface with CanProvideValue and TryProvideValue methods
- CanProvideValue checks if element can be fully inlined (all properties are simple ValueNodes)
- TryProvideValue actually generates the inline code
- Only skip properties when CanProvideValue returns true

Result:
- Simple Setters with compiled converters: Fully inlined, no dead code
- Setters with markup extensions: Property is set normally, extension can determine target type
- All 1713 XAML unit tests now pass (was 16 failures before)
- Added test for OnPlatform scenario to ensure it works correctly

This completes the optimization while maintaining full compatibility.

Co-authored-by: simonrozsival <[email protected]>

* Move ProvideValueForSetter to SetterValueProvider and share code

Per review feedback:
- Moved ProvideValueForSetter method from KnownMarkups.cs to SetterValueProvider.cs
- Created shared GetValueNode helper method used by both CanProvideValue and TryProvideValue
- Removed ProvideValueForSetter from KnownMarkups.cs to consolidate Setter-related logic
- All Setter value provider logic is now in one place (SetterValueProvider.cs)

This improves code organization and makes it easier to maintain the Setter optimization logic.

Co-authored-by: simonrozsival <[email protected]>

* Fix SimplifyOnPlatform test and CanProvideValue logic

Fixed two issues:
1. SetterValueProvider.CanProvideValue was incorrectly checking `valueNode is not ValueNode` instead of checking for MarkupNode or ElementNode. This caused it to treat all IValueNode types (including MarkupNode) as simple values.

2. Updated SimplifyOnPlatform test expectation to reflect the new optimized behavior. After SimplifyOnPlatformVisitor simplifies OnPlatform expressions, they become simple ValueNodes, so SetterValueProvider correctly inlines them without generating property assignment dead code.

The test now verifies that both setters are fully inlined without the 25+ lines of service provider infrastructure (XamlServiceProvider, SimpleValueTargetProvider, XmlNamespaceResolver, XamlTypeResolver), which was the core issue this PR addresses.

All 53 SourceGen unit tests pass.

Co-authored-by: simonrozsival <[email protected]>

* Skip variable creation for Setters that can be fully inlined

When a Setter has only simple value properties (no markup extensions), skip creating the empty variable instantiation. Instead, register a placeholder that will be replaced by TryProvideValue with the inline setter.

This eliminates dead code like:
```
var setter = new global::Microsoft.Maui.Controls.Setter();
global::Microsoft.Maui.VisualDiagnostics.RegisterSourceInfo(setter!, ...);
```

When these are never used because the actual setter is created inline later.

Updated test expectations to reflect the optimized output.

Co-authored-by: simonrozsival <[email protected]>

* Fix tests

* Rename knownSGValueProvidersV2 to knownSGValueProviders

Per review feedback, removed the V2 suffix as it doesn't add value.

Co-authored-by: simonrozsival <[email protected]>

* Fix merge conflict: use IKnownMarkupValueProvider instead of ProvideValueDelegate

After merging with base branch, the code was still trying to use the old ProvideValueDelegate type at line 544 of NodeSGExtensions.cs. Fixed by changing the variable declaration to IKnownMarkupValueProvider and calling TryProvideValue instead of Invoke.

Resolves build error: CS1503: Argument 2: cannot convert from 'out ProvideValueDelegate' to 'out IKnownMarkupValueProvider'

Co-authored-by: simonrozsival <[email protected]>

---------

Co-authored-by: copilot-swe-agent[bot] <[email protected]>
Co-authored-by: simonrozsival <[email protected]>
Co-authored-by: Simon Rozsival <[email protected]>

* Fix XC0022 and XC0023 warnings by adding x:DataType for compiled bindings (#32444)

* Initial plan

* Initial analysis: identified 12 XAML files with XC0022 warnings

Co-authored-by: simonrozsival <[email protected]>

* Fix XC0022 warnings - add x:DataType to XAML files for compiled bindings

Co-authored-by: simonrozsival <[email protected]>

* Fix Issue23868: Add x:DataType to ContentPage root element

Co-authored-by: simonrozsival <[email protected]>

* Address review feedback: use x:DataType in Binding markup, revert to original Monkey class, simplify bindings

Co-authored-by: simonrozsival <[email protected]>

* Keep x:DataType="{x:Null}" for Issue23868 Grid with ItemsSource.Count binding

Co-authored-by: simonrozsival <[email protected]>

* Move x:DataType to ContentPage root for Issues8845, simplify Issue23868 binding to use Items.Count

Co-authored-by: simonrozsival <[email protected]>

* Remove XC0023 from NoWarn list (no XC0023 warnings found in codebase)

Co-authored-by: simonrozsival <[email protected]>

* Fix Picker x:DataType

* Revert changes to problems-report.html

---------

Co-authored-by: copilot-swe-agent[bot] <[email protected]>
Co-authored-by: simonrozsival <[email protected]>
Co-authored-by: Simon Rozsival <[email protected]>

* Initial plan

* Add VisualTestUtils source to replace deprecated NuGet package

Co-authored-by: PureWeen <[email protected]>

* Fix documentation typos

Co-authored-by: PureWeen <[email protected]>

* Agents scripts (#32819)

* - move everything to scripts

# Conflicts:
#	.github/agents/issue-resolver.md
#	.github/instructions/issue-resolver-agent/reproduction.md

* - continue refining scripts

* Refactor agent scripts: consolidate build/deploy workflows into PowerShell scripts (#32820)

* Initial plan

* Update agent instructions to use BuildAndRun scripts

- Replace manual command sequences with BuildAndRunSandbox.ps1 and BuildAndRunHostApp.ps1 script references
- Update pr-reviewer-agent instructions (quick-ref, quick-start, testing-guidelines, error-handling)
- Update appium-control.instructions.md to recommend script usage
- Update instrumentation.instructions.md with script option
- Add note to platform-workflows.md directing to scripts first
- Simplify complexity by referencing centralized scripts instead of duplicating manual commands

Co-authored-by: PureWeen <[email protected]>

* Simplify appium-control.instructions.md by removing redundant build/deploy steps

Remove manual build/deploy instructions that are now handled by BuildAndRunSandbox.ps1:
- Removed 106 lines of redundant iOS/Android build/deploy commands
- Removed manual cleanup instructions (script handles this)
- Removed manual Appium startup instructions (script handles this)
- Kept Appium scripting guidance (template, platform differences, operations)
- File now focuses on Appium C# scripting patterns, not build workflows

The file now properly delegates build/deploy to the script while maintaining its core purpose: teaching how to write Appium control scripts for manual debugging.

Co-authored-by: PureWeen <[email protected]>

---------

Co-authored-by: copilot-swe-agent[bot] <[email protected]>
Co-authored-by: PureWeen <[email protected]>

* - simplify with script even more

* - additional error logging

* - instruction fixes

* - instructions updates

* - additional instruction and script updates

* - split out the instructions and agents more

* - branch fixes

* - simplify script

* - fix up sandbox script a bit more

* - fix up sandbox pr tester

* Improve Sandbox PR testing agent instructions and template

Critical improvements for future agent success:

1. Added prominent section about noReset requirement for Android
   - Explains Fast Deployment crash scenario
   - Emphasizes this must NEVER be removed
   - Documents exact error message to look for

2. Strengthened 'never run manual commands' guidance
   - Explicit list of prohibited commands (adb, xcrun, dotnet)
   - Clear explanation that BuildAndRunSandbox.ps1 handles everything
   - Emphasized reading captured logs instead of capturing new ones

3. Added Fast Deployment troubleshooting section
   - How to identify the error in logs
   - Step-by-step fix instructions
   - Clarifies this is infrastructure issue, not PR bug

4. Updated RunWithAppiumTest.template.cs with strong warnings
   - Header comment warns about Android requirement
   - Inline comment at noReset capability with emojis for visibility
   - Explains crash scenario if removed

These changes address the issues encountered during PR #32479 testing
where initial tests failed due to missing noReset capability.

* Clarify noReset is Android-only and add element not found troubleshooting

Key improvements:

1. Clarified noReset is ANDROID ONLY requirement
   - Added explicit warning not to use for iOS
   - Explained iOS deployment works differently
   - Updated code examples to show platform check

2. Added critical 'Element Not Found' troubleshooting section
   - DO NOT assume app is working if element not found
   - Must check logs immediately for crashes/exceptions
   - Specific commands to verify app actually launched
   - Common root causes and debugging steps
   - Prevents agents from waiting/guessing when app has crashed

3. Enhanced validation checklist
   - Added requirement to verify app running before proceeding
   - Clear stop condition if element not found
   - Reference to troubleshooting section

These changes address issues discovered during iOS testing where:
- App crashed with XAML parse error (missing event handler)
- Initial assumption was 'app loading slowly' rather than 'app crashed'
- Proper log investigation revealed actual problem immediately

* - update template script

* - simplify and reorganize even more

* - fix all the links and references

* - update readme

* - agent updates

* - issue resolver fixes

* - revert sandbox changes

* - cleanup and clarify

* - fixes

* - fix

* - add and update some custom prompts

* - make prompt files more easily discoverable

* - fix prompt file links

---------

Co-authored-by: Copilot <[email protected]>
Co-authored-by: PureWeen <[email protected]>

* [XSG] Fix #32836: SourceGen handles typed resources in StaticResource correctly (#32843)

* Fix #32836: SourceGen handles typed resources in StaticResource correctly

When Color (or other non-string typed) resources are used with StaticResource
inside markup extensions, they were incorrectly treated as strings causing
CS0030 compilation errors.

The fix recognizes when a resource variable is already properly typed (not
string) and returns it directly without attempting string conversion.

Example that now works:
<Color x:Key="MyColor">#00FF00</Color>
<Label TextColor="{local:MyExtension Source={StaticResource MyColor}}" />

Added comprehensive unit test with full expected code validation.

Fixes #32836

* Add unit tests for issue #32837

- Issue #32837: SourceGen doesn't pass values properly to Converters when using StaticResource
- Added Xaml.UnitTest that validates all three inflators (Runtime, XamlC, SourceGen)
- Added SourceGen.UnitTest for code generation validation
- Tests confirm that the fix for #32836 also resolves #32837
- Both issues had the same root cause: SourceGen not handling typed resources in StaticResource correctly

* Remove unnecessary SourceGen.UnitTest for Maui32837

The Xaml.UnitTest is sufficient to validate the fix across all inflators

* Remove slnx file and use existing sln files from main branch

Co-authored-by: jfversluis <[email protected]>

* Enable XAML SourceGen by default in templates and add per-file default support (#32733)

* Enable XAML SourceGen by default in templates and add per-file default support

- Add MauiXamlInflator=SourceGen to all template projects
- Add support for Inflator="Default" to revert individual files to config-based defaults
- Add build warning (MAUI1001) when Runtime or XamlC is explicitly set
- Add informational message when SourceGen is enabled
- Include inline documentation in templates explaining usage

Fixes #32732
Fixes #32644

* Update src/Controls/src/Build.Tasks/nuget/buildTransitive/netstandard2.0/Microsoft.Maui.Controls.targets

Co-authored-by: Copilot <[email protected]>

* Update src/Controls/src/Build.Tasks/nuget/buildTransitive/netstandard2.0/Microsoft.Maui.Controls.targets

Co-authored-by: Copilot <[email protected]>

* Improve warning message clarity per review feedback

- Clarify that 'Runtime' and 'XamlC' are the inflator names
- Fix 'build performance' to 'runtime performance' for Runtime
- Specify that Runtime is only recommended for Debug builds
- Make the message less confusing when XamlC is set

Co-authored-by: Simon Rozsival <[email protected]>

* nullability

---------

Co-authored-by: Copilot <[email protected]>
Co-authored-by: Simon Rozsival <[email protected]>

* Add Git workflow rules for Copilot CLI to repository instructions

* Re-enable ConnectivityChanged test after resolving previous issues

* Improve XAML SourceGenerator performance with C# hot reload support (#32870)

- Refactor XamlGenerator to reduce allocations
- Simplify InitializeComponentCodeWriter
- Remove unused tracking name
- Add XTypeMultiFileHotReloadTests for multi-file hot reload scenarios

Performance: ~3% improvement in XamlGenerator build time (1232ms → 1196ms mean)

* Fixed the Text Color issue when setting to null

* Updated the pending snapshots

---------

Co-authored-by: Javier Suárez <[email protected]>
Co-authored-by: Stephane Delcroix <[email protected]>
Co-authored-by: Shane Neuville <[email protected]>
Co-authored-by: Copilot <[email protected]>
Co-authored-by: simonrozsival <[email protected]>
Co-authored-by: Šimon Rozsíval <[email protected]>
Co-authored-by: Copilot <[email protected]>
Co-authored-by: Gerald Versluis <[email protected]>
Co-authored-by: PureWeen <[email protected]>
Co-authored-by: jfversluis <[email protected]>
Co-authored-by: Simon Rozsival <[email protected]>
…etween TabBar Items (#32882)

* Fix race condition in RemoveInnerPage unit test

The RemoveInnerPage test was failing randomly on CI due to a race condition:
- The test removed a page but didn't wait for navigation to complete
- TestNavigationHandler simulates async navigation with a 10ms delay
- If the test completed before navigation finished, Appearing/Disappearing
  events could fire after test completion, throwing uncaught exceptions

Fixed by:
1. Changed nav declaration from NavigationPage to var (TestNavigationPage)
2. Added await nav.NavigatingTask after RemovePage call

This matches the pattern used in the RemoveLastPage test and ensures
the test waits for async navigation to complete before finishing.

* Add XAML unit testing guidelines

* Add version 10.0.11 to bug report template (#32844)

* [XSG] Fix OnPlatform to generate default values for missing platforms (#32778)

* Initial plan

* Fix OnPlatform SourceGen to use default value instead of removing property

Co-authored-by: simonrozsival <[email protected]>

* Add runtime test to verify OnPlatform default value behavior

Co-authored-by: simonrozsival <[email protected]>

* Address PR review feedback - move runtime test to shared inflator test

Co-authored-by: simonrozsival <[email protected]>

* Improve assertion

* Simplify test setup

* Fix test

* Apply suggestions from code review

Co-authored-by: Copilot <[email protected]>

* Remove custom constructors in test

---------

Co-authored-by: copilot-swe-agent[bot] <[email protected]>
Co-authored-by: simonrozsival <[email protected]>
Co-authored-by: Šimon Rozsíval <[email protected]>
Co-authored-by: Copilot <[email protected]>

* [XSG] Fix incorrect TargetNullValue flag check causing NPE with nullable bindings (#32580)

* Initial plan

* Fix TargetNullValue bug and enable compilation validation in tests

Co-authored-by: simonrozsival <[email protected]>

* Clean up debug code and finalize tests

Co-authored-by: simonrozsival <[email protected]>

* Simplify test infrastructure per code review feedback

Co-authored-by: simonrozsival <[email protected]>

* Improve asserting no compilation errors in generated code

* Fix SourceGen.UnitTests compilation error

The RunGenerator method expects an array of AdditionalFile as the second parameter, not individual file parameters. Updated the call to pass an array containing both expanderFile and bugFile.

* Fix XStaticUnresolvedType tests by disabling compilation validation

The PR introduced compilation validation for generated code by default.
Three tests in XStaticUnresolvedType intentionally reference unresolved
types (MyApp.Routes.Route, ExternalLib.Constants.AppConstants, and
MyApp.Config.Settings) to verify the generator handles them correctly.

Added assertNoCompilationErrors: false parameter to these three tests
to skip compilation validation, similar to the fix in UnresolvedType.cs.

* Fix XStaticUnresolvedType tests to validate compilation with stub types

Co-authored-by: simonrozsival <[email protected]>

* Simplify XStaticUnresolvedType tests by including stub types in code string

Co-authored-by: simonrozsival <[email protected]>

---------

Co-authored-by: copilot-swe-agent[bot] <[email protected]>
Co-authored-by: simonrozsival <[email protected]>
Co-authored-by: Simon Rozsival <[email protected]>
Co-authored-by: Stephane Delcroix <[email protected]>

* [XSG] Reduce dead code for Setters with compiled converters (#32474)

* Initial plan

* Add test demonstrating XSG dead code issue with compiled converters

Co-authored-by: simonrozsival <[email protected]>

* Fix XSG dead code for Setter with compiled converters

This change optimizes the XAML Source Generator to avoid generating dead code when Setters use compiled type converters (like BindablePropertyConverter).

Problem:
When a Setter had properties like Property="FontSize" Value="16", the XSG would:
1. Create a setter object
2. Set properties via assignments (generating service providers with XamlTypeResolver, etc.)
3. Create a NEW inline setter with correct values
4. Add the NEW setter to the collection (the old one was dead code)

This resulted in ~29 lines of dead code including XamlServiceProvider, SimpleValueTargetProvider, XmlNamespaceResolver, and XamlTypeResolver that are not AOT-compatible.

Solution:
When creating value objects in CreateValuesVisitor, check if the type is a known value provider (like Setter). If so, mark simple ValueNode properties to be skipped during property setting. This prevents the dead code from being generated while still allowing complex properties (markup extensions, element content) to be processed.

Result:
- Setter objects are still created (needed for child element service providers)
- Simple value properties are NOT set (no dead code with service providers)
- The inline setter with correct values is created and used
- Complex properties with markup extensions are still processed correctly

Note: There's a known edge case with OnPlatform markup extensions in setter values that needs additional work, but the core optimization is working for simple values which is the main use case.

Co-authored-by: simonrozsival <[email protected]>

* Move test to SourceGen.UnitTests with snapshot testing

Per review feedback:
- Removed the runtime test that was redundant with existing tests
- Moved the source gen test to SourceGen.UnitTests project
- Changed to snapshot test showing the full expected output
- Removed the [Values] parameter since test only needs to run once for SourceGen

Co-authored-by: simonrozsival <[email protected]>

* Add explicit assertion for XamlTypeResolver absence

Added explicit assertion to verify that XamlTypeResolver is not present anywhere in the generated code. This is critical because XamlTypeResolver is not AOT-compatible and was part of the dead code being eliminated by this fix.

Co-authored-by: simonrozsival <[email protected]>

* Simplify test by removing Label with StaticResource

Removed the Label element from the test XAML to focus on the Setter optimization without the noise from StaticResourceExtension. The test now only includes a Style with Setters in the Resources, making the generated code simpler and more focused on demonstrating the dead code elimination for compiled converters.

Co-authored-by: simonrozsival <[email protected]>

* Eliminate dead Setter instantiation for simple value cases

Implemented Option 1: Check for complex property values or collection items before deciding whether to create the Setter variable.

When a Setter has only simple value properties (ValueNodes), we now skip creating the empty setter instantiation entirely. A placeholder variable entry is registered for TryProvideValue to replace with the inline setter.

When a Setter has complex properties (ElementNode, MarkupNode, ListNode) or element collection items, the variable is still created and complex values are set via assignment, but simple value properties are skipped.

Result:
- Empty setter instantiations (e.g., `var setter = new Setter();`) are eliminated for simple cases
- Setters with complex values like VisualStateGroups or OnPlatform elements still work correctly
- 1697 XAML unit tests pass
- 16 tests fail (markup extension edge cases - separate issue to address)

This completes the dead code elimination for the common case of Setters with compiled converters.

Co-authored-by: simonrozsival <[email protected]>

* Revert to conservative approach - skip property assignments only

After extensive investigation, reverted to the safer approach that only skips property assignments for simple values, not variable creation. This eliminates the 25+ lines of service provider dead code (XamlServiceProvider, SimpleValueTargetProvider, XmlNamespaceResolver, XamlTypeResolver) while maintaining compatibility with all edge cases.

The 16 pre-existing test failures are unrelated to this change (confirmed by testing baseline code).

Result: Successfully eliminates AOT-incompatible dead code for the common case of Setters with compiled converters, without introducing any new test failures.

Co-authored-by: simonrozsival <[email protected]>

* Implement IKnownMarkupValueProvider to fix markup extension handling

Fixed the issue where markup extensions (OnPlatform, AppThemeBinding, etc.) in Setter values weren't working correctly. The problem was that Property was being skipped unconditionally, preventing extensions from determining the target type via IProvideValueTarget.

Solution:
- Created IKnownMarkupValueProvider interface with CanProvideValue and TryProvideValue methods
- CanProvideValue checks if element can be fully inlined (all properties are simple ValueNodes)
- TryProvideValue actually generates the inline code
- Only skip properties when CanProvideValue returns true

Result:
- Simple Setters with compiled converters: Fully inlined, no dead code
- Setters with markup extensions: Property is set normally, extension can determine target type
- All 1713 XAML unit tests now pass (was 16 failures before)
- Added test for OnPlatform scenario to ensure it works correctly

This completes the optimization while maintaining full compatibility.

Co-authored-by: simonrozsival <[email protected]>

* Move ProvideValueForSetter to SetterValueProvider and share code

Per review feedback:
- Moved ProvideValueForSetter method from KnownMarkups.cs to SetterValueProvider.cs
- Created shared GetValueNode helper method used by both CanProvideValue and TryProvideValue
- Removed ProvideValueForSetter from KnownMarkups.cs to consolidate Setter-related logic
- All Setter value provider logic is now in one place (SetterValueProvider.cs)

This improves code organization and makes it easier to maintain the Setter optimization logic.

Co-authored-by: simonrozsival <[email protected]>

* Fix SimplifyOnPlatform test and CanProvideValue logic

Fixed two issues:
1. SetterValueProvider.CanProvideValue was incorrectly checking `valueNode is not ValueNode` instead of checking for MarkupNode or ElementNode. This caused it to treat all IValueNode types (including MarkupNode) as simple values.

2. Updated SimplifyOnPlatform test expectation to reflect the new optimized behavior. After SimplifyOnPlatformVisitor simplifies OnPlatform expressions, they become simple ValueNodes, so SetterValueProvider correctly inlines them without generating property assignment dead code.

The test now verifies that both setters are fully inlined without the 25+ lines of service provider infrastructure (XamlServiceProvider, SimpleValueTargetProvider, XmlNamespaceResolver, XamlTypeResolver), which was the core issue this PR addresses.

All 53 SourceGen unit tests pass.

Co-authored-by: simonrozsival <[email protected]>

* Skip variable creation for Setters that can be fully inlined

When a Setter has only simple value properties (no markup extensions), skip creating the empty variable instantiation. Instead, register a placeholder that will be replaced by TryProvideValue with the inline setter.

This eliminates dead code like:
```
var setter = new global::Microsoft.Maui.Controls.Setter();
global::Microsoft.Maui.VisualDiagnostics.RegisterSourceInfo(setter!, ...);
```

When these are never used because the actual setter is created inline later.

Updated test expectations to reflect the optimized output.

Co-authored-by: simonrozsival <[email protected]>

* Fix tests

* Rename knownSGValueProvidersV2 to knownSGValueProviders

Per review feedback, removed the V2 suffix as it doesn't add value.

Co-authored-by: simonrozsival <[email protected]>

* Fix merge conflict: use IKnownMarkupValueProvider instead of ProvideValueDelegate

After merging with base branch, the code was still trying to use the old ProvideValueDelegate type at line 544 of NodeSGExtensions.cs. Fixed by changing the variable declaration to IKnownMarkupValueProvider and calling TryProvideValue instead of Invoke.

Resolves build error: CS1503: Argument 2: cannot convert from 'out ProvideValueDelegate' to 'out IKnownMarkupValueProvider'

Co-authored-by: simonrozsival <[email protected]>

---------

Co-authored-by: copilot-swe-agent[bot] <[email protected]>
Co-authored-by: simonrozsival <[email protected]>
Co-authored-by: Simon Rozsival <[email protected]>

* Fix XC0022 and XC0023 warnings by adding x:DataType for compiled bindings (#32444)

* Initial plan

* Initial analysis: identified 12 XAML files with XC0022 warnings

Co-authored-by: simonrozsival <[email protected]>

* Fix XC0022 warnings - add x:DataType to XAML files for compiled bindings

Co-authored-by: simonrozsival <[email protected]>

* Fix Issue23868: Add x:DataType to ContentPage root element

Co-authored-by: simonrozsival <[email protected]>

* Address review feedback: use x:DataType in Binding markup, revert to original Monkey class, simplify bindings

Co-authored-by: simonrozsival <[email protected]>

* Keep x:DataType="{x:Null}" for Issue23868 Grid with ItemsSource.Count binding

Co-authored-by: simonrozsival <[email protected]>

* Move x:DataType to ContentPage root for Issues8845, simplify Issue23868 binding to use Items.Count

Co-authored-by: simonrozsival <[email protected]>

* Remove XC0023 from NoWarn list (no XC0023 warnings found in codebase)

Co-authored-by: simonrozsival <[email protected]>

* Fix Picker x:DataType

* Revert changes to problems-report.html

---------

Co-authored-by: copilot-swe-agent[bot] <[email protected]>
Co-authored-by: simonrozsival <[email protected]>
Co-authored-by: Simon Rozsival <[email protected]>

* Agents scripts (#32819)

* - move everything to scripts

# Conflicts:
#	.github/agents/issue-resolver.md
#	.github/instructions/issue-resolver-agent/reproduction.md

* - continue refining scripts

* Refactor agent scripts: consolidate build/deploy workflows into PowerShell scripts (#32820)

* Initial plan

* Update agent instructions to use BuildAndRun scripts

- Replace manual command sequences with BuildAndRunSandbox.ps1 and BuildAndRunHostApp.ps1 script references
- Update pr-reviewer-agent instructions (quick-ref, quick-start, testing-guidelines, error-handling)
- Update appium-control.instructions.md to recommend script usage
- Update instrumentation.instructions.md with script option
- Add note to platform-workflows.md directing to scripts first
- Simplify complexity by referencing centralized scripts instead of duplicating manual commands

Co-authored-by: PureWeen <[email protected]>

* Simplify appium-control.instructions.md by removing redundant build/deploy steps

Remove manual build/deploy instructions that are now handled by BuildAndRunSandbox.ps1:
- Removed 106 lines of redundant iOS/Android build/deploy commands
- Removed manual cleanup instructions (script handles this)
- Removed manual Appium startup instructions (script handles this)
- Kept Appium scripting guidance (template, platform differences, operations)
- File now focuses on Appium C# scripting patterns, not build workflows

The file now properly delegates build/deploy to the script while maintaining its core purpose: teaching how to write Appium control scripts for manual debugging.

Co-authored-by: PureWeen <[email protected]>

---------

Co-authored-by: copilot-swe-agent[bot] <[email protected]>
Co-authored-by: PureWeen <[email protected]>

* - simplify with script even more

* - additional error logging

* - instruction fixes

* - instructions updates

* - additional instruction and script updates

* - split out the instructions and agents more

* - branch fixes

* - simplify script

* - fix up sandbox script a bit more

* - fix up sandbox pr tester

* Improve Sandbox PR testing agent instructions and template

Critical improvements for future agent success:

1. Added prominent section about noReset requirement for Android
   - Explains Fast Deployment crash scenario
   - Emphasizes this must NEVER be removed
   - Documents exact error message to look for

2. Strengthened 'never run manual commands' guidance
   - Explicit list of prohibited commands (adb, xcrun, dotnet)
   - Clear explanation that BuildAndRunSandbox.ps1 handles everything
   - Emphasized reading captured logs instead of capturing new ones

3. Added Fast Deployment troubleshooting section
   - How to identify the error in logs
   - Step-by-step fix instructions
   - Clarifies this is infrastructure issue, not PR bug

4. Updated RunWithAppiumTest.template.cs with strong warnings
   - Header comment warns about Android requirement
   - Inline comment at noReset capability with emojis for visibility
   - Explains crash scenario if removed

These changes address the issues encountered during PR #32479 testing
where initial tests failed due to missing noReset capability.

* Clarify noReset is Android-only and add element not found troubleshooting

Key improvements:

1. Clarified noReset is ANDROID ONLY requirement
   - Added explicit warning not to use for iOS
   - Explained iOS deployment works differently
   - Updated code examples to show platform check

2. Added critical 'Element Not Found' troubleshooting section
   - DO NOT assume app is working if element not found
   - Must check logs immediately for crashes/exceptions
   - Specific commands to verify app actually launched
   - Common root causes and debugging steps
   - Prevents agents from waiting/guessing when app has crashed

3. Enhanced validation checklist
   - Added requirement to verify app running before proceeding
   - Clear stop condition if element not found
   - Reference to troubleshooting section

These changes address issues discovered during iOS testing where:
- App crashed with XAML parse error (missing event handler)
- Initial assumption was 'app loading slowly' rather than 'app crashed'
- Proper log investigation revealed actual problem immediately

* - update template script

* - simplify and reorganize even more

* - fix all the links and references

* - update readme

* - agent updates

* - issue resolver fixes

* - revert sandbox changes

* - cleanup and clarify

* - fixes

* - fix

* - add and update some custom prompts

* - make prompt files more easily discoverable

* - fix prompt file links

---------

Co-authored-by: Copilot <[email protected]>
Co-authored-by: PureWeen <[email protected]>

* [XSG] Fix #32836: SourceGen handles typed resources in StaticResource correctly (#32843)

* Fix #32836: SourceGen handles typed resources in StaticResource correctly

When Color (or other non-string typed) resources are used with StaticResource
inside markup extensions, they were incorrectly treated as strings causing
CS0030 compilation errors.

The fix recognizes when a resource variable is already properly typed (not
string) and returns it directly without attempting string conversion.

Example that now works:
<Color x:Key="MyColor">#00FF00</Color>
<Label TextColor="{local:MyExtension Source={StaticResource MyColor}}" />

Added comprehensive unit test with full expected code validation.

Fixes #32836

* Add unit tests for issue #32837

- Issue #32837: SourceGen doesn't pass values properly to Converters when using StaticResource
- Added Xaml.UnitTest that validates all three inflators (Runtime, XamlC, SourceGen)
- Added SourceGen.UnitTest for code generation validation
- Tests confirm that the fix for #32836 also resolves #32837
- Both issues had the same root cause: SourceGen not handling typed resources in StaticResource correctly

* Remove unnecessary SourceGen.UnitTest for Maui32837

The Xaml.UnitTest is sufficient to validate the fix across all inflators

* Added fix and test case

* Updated the test case.

* Added the iOS and android output images

* Updated the test case

* Added the windows output images

---------

Co-authored-by: Stephane Delcroix <[email protected]>
Co-authored-by: Shane Neuville <[email protected]>
Co-authored-by: Copilot <[email protected]>
Co-authored-by: simonrozsival <[email protected]>
Co-authored-by: Šimon Rozsíval <[email protected]>
Co-authored-by: Copilot <[email protected]>
Co-authored-by: Gerald Versluis <[email protected]>
Co-authored-by: PureWeen <[email protected]>
…32790)

* fix-32332-Made the code changes to skip the child removal to preserve SwipeItems.

* fix-32332-Made the changes to preserve the SwipeItems in logical tree during content changes and updated the testcase.
…oid with empty ItemsSource (#32741)

* Fix the header and footer remove issue

* Add a condition for header and footer template

* Modified the fix

* Added test case

* committed the ios images

* committed the android images

* Modified the test case

* Committed the pending snapshots
* updated scrollview resize coverage

* updated test string

* updated scrollview resize coverage

* added base image for windows platform

* remove the snapshot

* removed images for mac and android

* added snapshot from CI
SuthiYuvaraj and others added 8 commits December 3, 2025 11:49
…ls to Apply Correct Sizing (#29496)

* Fix for ItemSizing issue

* Update ItemsViewController2.cs

* Update TemplatedCell2.cs

* Update TemplatedCell2.cs

* Update TemplatedCell2.cs

* commit for itemsize

* unwanted changes

* commit for testcases

* Update Issue29130.cs

* ItemSizingStatergy changes

* Update ItemsViewController2.cs

* Update TemplatedCell2.cs

* Changes for review

* Update TemplatedCell2.cs

* Update src/Controls/src/Core/Handlers/Items2/iOS/TemplatedCell2.cs

Co-authored-by: Copilot <[email protected]>

* Update src/Controls/tests/TestCases.Shared.Tests/Tests/Issues/Issue29130.cs

Co-authored-by: Copilot <[email protected]>

* Update TemplatedCell2.cs

* Update TemplatedCell2.cs

* Update Issue29130.cs

* commit for template testcases

* Handler changes

* Update ItemsViewHandler2.iOS.cs

* Changes on ReloadData

---------

Co-authored-by: Copilot <[email protected]>
* Update ContentViewHandler.iOS.cs

* condition for null

* Update ContentViewHandler.iOS.cs

* Update ContentViewHandler.iOS.cs

* Update ContentViewHandler.iOS.cs
)

* Fixed HorizontalStackLayout Crashes Debugger on Negative Spacing

* Reverted changes in CrossPlatformMeasure

* Revert "Reverted changes in CrossPlatformMeasure"

This reverts commit 4d53baf.

* Reverted changes in ArrangeOverride

---------

Co-authored-by: Dhivya-SF4094 <[email protected]>
* Fixed the selected item changed

* fix for adding items

* Added the test cases

* Modified the logics

* Modified the test case

* Corrected the code

* Modified the logics

* Modified the changes

* Add unit tests for Picker selection preservation

- Add PickerPreservesSelectedItemAfterRemovingItemBeforeSelection test
- Add PickerPreservesSelectedItemAfterInsertingItemBeforeSelection test
- Update existing tests to verify the new correct behavior

* Remove UI test, keep only unit test

Unit tests are sufficient to validate this fix.

---------

Co-authored-by: Stephane Delcroix <[email protected]>
* Fixed Button rendering overflow when padding is set in StackLayout

* Added test case

* Modified the fix, returned bounds.Width and bounds.height

* Added snapshots

* Re-added Snapshot for WinUI and macOS

* Resaved HorizontalScrollBarShouldHideOnNever
… Slider and Stepper Value (#28219)

* Fixed the OneWayBinding issue with MultiBindingConverter on Slider and Stepper Value

* Change file namespace scope
…#25166)

* Fix commit for 18092

* Update Shape.cs

* Commit for Maccatalyst

* Update Shape.cs

* Update Shape.cs

* Commit for RoundRectangle change

* commit name changes

* Update Issue18092.xaml

* Update Issue18092.xaml

* Update Issue18092.xaml

* Commit for method name
Copilot AI review requested due to automatic review settings December 3, 2025 18:01
Copy link
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This is a December 8th candidate release PR that includes bug fixes, test coverage improvements, and feature enhancements across multiple areas of the .NET MAUI framework. The changes primarily focus on iOS platform improvements, visual state management, collection view enhancements, and various UI control fixes.

Key changes:

  • Fixed iOS-specific issues including SwipeGesture direction updates, NavigationPage TitleView orientation handling, and Slider.UpdateOnTap functionality
  • Improved VisualStateManager specificity handling for inherited styles (issue #27202)
  • Enhanced Picker item selection preservation during collection modifications
  • Added comprehensive test coverage for multiple issues and feature matrices
  • Fixed CollectionView visual state management for Background/BackgroundColor properties

Reviewed changes

Copilot reviewed 106 out of 330 changed files in this pull request and generated 6 comments.

Show a summary per file
File Description
src/Controls/src/Core/VisualStateManager.cs Added debug output and preserved VSM specificity during cloning for inherited styles
src/Controls/src/Core/SetterSpecificity.cs Modified style specificity calculation to preserve VSM behavior for BasedOn styles
src/Controls/src/Core/Picker/Picker.cs Fixed SelectedItem preservation when collection items are inserted/removed
src/Controls/src/Core/Platform/GestureManager/GesturePlatformManager.iOS.cs Added runtime SwipeGesture direction update support for iOS
src/Controls/src/Core/Compatibility/Handlers/NavigationPage/iOS/NavigationRenderer.cs Fixed TitleView frame updates during orientation changes on iOS 26+
src/Controls/src/Core/Slider/Slider.iOS.cs Added iOS-specific Slider.UpdateOnTap mapping
src/Controls/src/Core/Handlers/Items2/iOS/CarouselViewController2.cs Fixed CarouselView position preservation during device rotation
src/Controls/tests/TestCases.Shared.Tests/Tests/Issues/*.cs Added 20+ new test cases for various bug fixes
src/Controls/tests/TestCases.HostApp/Issues/*.cs Added corresponding host app test implementations
src/Controls/tests/Core.UnitTests/PickerTests.cs Enhanced Picker tests for collection change scenarios
src/Controls/tests/Core.UnitTests/SwipeViewTests.cs Added test for SwipeItems logical tree preservation
src/Controls/src/Core/Handlers/Items/iOS/TemplatedCell.cs Fixed VSM selection color detection to include Background property
src/Controls/src/Core/Handlers/Items/Android/MauiRecyclerView.cs Fixed header/footer update handling when empty view is displayed
src/Controls/src/Core/TemplateUtilities.cs Preserved SwipeItems in logical tree during content changes
src/Controls/src/Core/Shapes/Shape.cs Fixed RoundRectangle measurement to use inner path
src/Controls/src/Core/GradientStop.cs Simplified GetHashCode to use base implementation
src/Controls/src/Core/SolidColorBrush.cs Simplified GetHashCode to use base implementation
src/Controls/src/Core/ImageBrush.cs Simplified GetHashCode to use base implementation
Directory.Build.props Added TypeScript compilation configuration
Directory.Build.targets Added TypeScript build target exclusions
Comments suppressed due to low confidence (1)

src/Controls/tests/Core.UnitTests/PickerTests.cs:1

  • Duplicate condition: TEST_FAILS_ON_ANDROID is checked twice in the conditional compilation directive. This appears to be a copy-paste error.
using System;

Comment on lines +85 to 88
// Debug output for issue #27202
System.Diagnostics.Debug.WriteLine($"[VSM] GoToState({name}) - VSG specificity: {vsgSpecificity.StyleInfo}");
System.Diagnostics.Debug.WriteLine($"[VSM] VSM setter specificity will be used");

Copy link

Copilot AI Dec 3, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Debug output statements should be removed before merging to production. These appear to be temporary debugging code for issue #27202 that should not remain in the final release.

Suggested change
// Debug output for issue #27202
System.Diagnostics.Debug.WriteLine($"[VSM] GoToState({name}) - VSG specificity: {vsgSpecificity.StyleInfo}");
System.Diagnostics.Debug.WriteLine($"[VSM] VSM setter specificity will be used");

Copilot uses AI. Check for mistakes.
}
else
{
pathBounds = this.GetPath().GetBoundsByFlattening(1);
Copy link

Copilot AI Dec 3, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Inconsistent indentation: this line uses spaces instead of tabs, while the file appears to use tabs elsewhere. Should use consistent indentation throughout.

Suggested change
pathBounds = this.GetPath().GetBoundsByFlattening(1);
pathBounds = this.GetPath().GetBoundsByFlattening(1);

Copilot uses AI. Check for mistakes.
Comment on lines +44 to +45
App.WaitForElement("ScrollViewWithLayoutOptionsButton");
App.Tap("ScrollViewWithLayoutOptionsButton");
Copy link

Copilot AI Dec 3, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

These navigation steps are added to the existing test but appear to be missing from the original test setup. This suggests the test may have been incomplete or the navigation flow changed. Verify that this doesn't break existing test execution.

Copilot uses AI. Check for mistakes.
Comment on lines +71 to +72
// Verify SwipeView maintains Content and all four SwipeItems as logical children
Assert.Equal(5, logicalChildrenCount);
Copy link

Copilot AI Dec 3, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The comment states 'Content and all four SwipeItems' which would be 5 children, but the assertion checks for 5. However, the test setup only adds RightItems and LeftItems (2 SwipeItems), not all four directions. This assertion value appears to be incorrect based on the test setup.

Suggested change
// Verify SwipeView maintains Content and all four SwipeItems as logical children
Assert.Equal(5, logicalChildrenCount);
// Verify SwipeView maintains Content and LeftItems as logical children
Assert.Equal(2, logicalChildrenCount);

Copilot uses AI. Check for mistakes.
Comment on lines +1613 to +1616
/// iOS 26+ requires autoresizing masks (UIViewAutoresizing.FlexibleWidth) During orientation changes, the autoresizing mask
/// automatically adjusts the width, but we need to explicitly update the frame to ensure the
/// title view uses the full available width from the navigation bar. Without this update,
/// the title view may not properly expand to fill the navigation bar after rotation.
Copy link

Copilot AI Dec 3, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The XML documentation comment is malformed - it's missing proper line breaks and the sentence structure is unclear. Should be formatted as proper documentation with clear sentence boundaries.

Suggested change
/// iOS 26+ requires autoresizing masks (UIViewAutoresizing.FlexibleWidth) During orientation changes, the autoresizing mask
/// automatically adjusts the width, but we need to explicitly update the frame to ensure the
/// title view uses the full available width from the navigation bar. Without this update,
/// the title view may not properly expand to fill the navigation bar after rotation.
/// <summary>
/// On iOS 26 and later, autoresizing masks (UIViewAutoresizing.FlexibleWidth) are required.
/// During orientation changes, the autoresizing mask automatically adjusts the width.
/// However, we need to explicitly update the frame to ensure the title view uses the full available width from the navigation bar.
/// Without this update, the title view may not properly expand to fill the navigation bar after rotation.
/// </summary>

Copilot uses AI. Check for mistakes.
{
_measuredSize = cachedSize.ToSize();
// Even when we have a cached measurement, we still need to call Measure
// to update the virtual view's internal state and bookkeeping
Copy link

Copilot AI Dec 3, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

When using cached size, the Measure call passes _measuredSize.Height which was just retrieved from cache, but the comment suggests this is needed for internal state updates. Consider documenting why the full Measure with cached height is necessary instead of just updating state, as this may perform redundant layout calculations.

Suggested change
// to update the virtual view's internal state and bookkeeping
// to update the virtual view's internal state and bookkeeping.
//
// This call ensures that any internal flags, layout state, or side effects
// required by the virtual view are properly updated, even if the measured size
// is already known. Some views may rely on Measure being called to update
// their internal layout state, trigger events, or prepare for Arrange.
//
// Do not remove this call or replace it with a direct state update, as it may
// cause subtle bugs in layout or rendering. If you need to optimize further,
// ensure that all required internal state updates are preserved.

Copilot uses AI. Check for mistakes.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.