Skip to content

[Android] Fix for Android RefreshView incorrectly triggering pull-to-refresh when scrolling inside WebView or HybridWebView on cold-start#35633

Merged
kubaflo merged 4 commits into
dotnet:inflight/currentfrom
BagavathiPerumal:fix-35572
Jun 12, 2026
Merged

Conversation

@BagavathiPerumal

Copy link
Copy Markdown
Contributor

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!

Issue details

On Android, when a RefreshView wraps a WebView whose inner HTML contains a scrollable element that is pre-scrolled away from the top, pulling down inside the WebView incorrectly triggers the pull-to-refresh indicator even though the inner content has not yet reached the top. The expected behavior is that the RefreshView should only refresh after the user has scrolled the inner content all the way to the top and then continues pulling downward.

This issue is specific to cold-start or root/startup page scenarios where the WebView source is loaded before the native view is fully attached to the window hierarchy, and does not reproduce in navigated pages within the HostApp environment.

Root Cause

The issue occurs because of a timing mismatch between Android's addJavascriptInterface registration and the WebView page load sequence. Android only exposes a JavaScript interface to pages that begin loading after the interface is registered. The original code deferred Attach to OnAttachedToWindow, which works for normal navigation but fails in cold-start scenarios where Source is set before the view enters the window hierarchy.

In that case, the page loads before OnAttachedToWindow fires, leaving window.mauiRefreshViewHost undefined in JS, scroll state is never reported, CanScrollUp stays false, and SwipeRefreshLayout incorrectly triggers pull-to-refresh on every gesture.

Description of Change

The fix involves moving Attach(this) into the MauiWebView and MauiHybridWebView constructors, guaranteeing the JS bridge is registered before any page load regardless of lifecycle timing. Since Attach is idempotent, the existing OnAttachedToWindow call becomes a harmless no-op. To prevent unnecessary JS overhead on standalone WebViews, OnPageFinished now checks IsInsideMauiSwipeRefreshLayout before injecting the rAF polling observer, and OnAttachedToWindow calls Detach() when the WebView is not inside a RefreshView, removing the bridge for standalone WebViews after window attachment.

Why Tests were not added:

Regarding the test case: The HostApp always navigates to test pages at runtime, so OnAttachedToWindow is triggered before MAUI calls LoadDataWithBaseURL, and the JS bridge is registered correctly. However, in cold start or root page scenarios such as the Sandbox, the page loads before OnAttachedToWindow, causing the bridge to register too late and making window.mauiRefreshViewHost unavailable in JavaScript. Since the HostApp does not reproduce this lifecycle order, the issue can only be verified manually using the Sandbox sample and cannot be covered by HostApp UI tests.

Tested the behavior in the following platforms.

  • Android
  • Mac
  • iOS
  • Windows

Issues Fixed

Fixes #35572

Output

Before Issue Fix After Issue Fix
35572-BeforeFix.mov
35572-AfterFix.mov

@dotnet-policy-service dotnet-policy-service Bot added the partner/syncfusion Issues / PR's with Syncfusion collaboration label May 27, 2026
@BagavathiPerumal BagavathiPerumal added the community ✨ Community Contribution label May 27, 2026
@kubaflo

kubaflo commented May 27, 2026

Copy link
Copy Markdown
Contributor

/review -b feature/refactor-copilot-yml

@sheiksyedm sheiksyedm marked this pull request as ready for review May 27, 2026 14:02
kubaflo
kubaflo previously approved these changes May 28, 2026
@kubaflo kubaflo changed the base branch from inflight/current to main May 28, 2026 09:01
@kubaflo kubaflo dismissed their stale review May 28, 2026 09:01

The base branch was changed.

@kubaflo

kubaflo commented May 28, 2026

Copy link
Copy Markdown
Contributor

/review -b feature/refactor-copilot-yml

@github-actions

github-actions Bot commented May 28, 2026

Copy link
Copy Markdown
Contributor

🚀 Dogfood this PR with:

⚠️ WARNING: Do not do this without first carefully reviewing the code of this PR to satisfy yourself it is safe.

curl -fsSL https://raw.githubusercontent.com/dotnet/maui/main/eng/scripts/get-maui-pr.sh | bash -s -- 35633

Or

  • Run remotely in PowerShell:
iex "& { $(irm https://raw.githubusercontent.com/dotnet/maui/main/eng/scripts/get-maui-pr.ps1) } 35633"

@kubaflo

kubaflo commented Jun 4, 2026

Copy link
Copy Markdown
Contributor

/review -b feature/enhanced-reviewer

@MauiBot MauiBot left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Expert Review — 2 findings

See inline comments for details.

Comment thread src/Core/src/Platform/Android/RefreshViewWebViewScrollCapture.cs
@MauiBot MauiBot added s/agent-fix-pr-picked AI could not beat the PR fix - PR is the best among all candidates s/agent-reviewed PR was reviewed by AI agent workflow (full 4-phase review) labels Jun 4, 2026
MauiBot

This comment was marked as outdated.

@dotnet dotnet deleted a comment from MauiBot Jun 10, 2026
@dotnet dotnet deleted a comment from github-actions Bot Jun 10, 2026
@kubaflo

kubaflo commented Jun 10, 2026

Copy link
Copy Markdown
Contributor

/review rerun

@github-actions github-actions Bot added the s/agent-ready-for-rerun AI review has a new PR-author comment or commit and is ready for rerun label Jun 10, 2026
@kubaflo

kubaflo commented Jun 11, 2026

Copy link
Copy Markdown
Contributor

/review -b feature/enhanced-reviewer -p android

@github-actions github-actions Bot added s/agent-review-in-progress AI review is currently running for this PR and removed s/agent-ready-for-rerun AI review has a new PR-author comment or commit and is ready for rerun labels Jun 11, 2026
@MauiBot MauiBot added s/agent-fix-pr-picked AI could not beat the PR fix - PR is the best among all candidates and removed s/agent-fix-win AI found a better alternative fix than the PR labels Jun 11, 2026

@MauiBot MauiBot left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

AI Review Summary

@BagavathiPerumal — new AI review results are available based on this last commit: 3baf2c6.
fix-35572-Changes updated based on suggestion. To request a fresh review after new comments or commits, comment /review rerun.

Gate Passed Code Review In Review Confidence Medium Platform Android

Review Sessions — click to expand
Gate — Test Before & After Fix

Gate Result: ✅ PASSED

Platform: ANDROID · Base: main · Merge base: dd5b6d2e

Test Without Fix (expect FAIL) With Fix (expect PASS)
📱 WebViewHandlerTests (WebView_HasScrollCaptureBridge_AfterConstruction) Category=WebView ✅ FAIL — 1380s ✅ PASS — 296s
🖥️ Issue33510 Issue33510 ✅ FAIL — 585s ✅ PASS — 522s
🔴 Without fix — 📱 WebViewHandlerTests (WebView_HasScrollCaptureBridge_AfterConstruction): FAIL ✅ · 1380s

(truncated to last 15,000 chars)

ng.Tasks.dll.so
  [43/129] Xamarin.AndroidX.Lifecycle.LiveData.Core.dll -> Xamarin.AndroidX.Lifecycle.LiveData.Core.dll.so
  [116/129] System.Threading.Thread.dll -> System.Threading.Thread.dll.so
  [117/129] System.Text.Json.dll -> System.Text.Json.dll.so
  [44/129] Xamarin.AndroidX.Lifecycle.ViewModel.Android.dll -> Xamarin.AndroidX.Lifecycle.ViewModel.Android.dll.so
  [118/129] System.Threading.dll -> System.Threading.dll.so
  [119/129] System.Threading.ThreadPool.dll -> System.Threading.ThreadPool.dll.so
  [45/129] Xamarin.AndroidX.Lifecycle.ViewModelSavedState.Android.dll -> Xamarin.AndroidX.Lifecycle.ViewModelSavedState.Android.dll.so
  [120/129] System.Xml.Linq.dll -> System.Xml.Linq.dll.so
  [121/129] System.Xml.ReaderWriter.dll -> System.Xml.ReaderWriter.dll.so
  [122/129] System.Xml.XDocument.dll -> System.Xml.XDocument.dll.so
  [46/129] Xamarin.AndroidX.Loader.dll -> Xamarin.AndroidX.Loader.dll.so
  [123/129] System.dll -> System.dll.so
  [124/129] netstandard.dll -> netstandard.dll.so
  [47/129] Xamarin.AndroidX.Navigation.Common.Android.dll -> Xamarin.AndroidX.Navigation.Common.Android.dll.so
  [125/129] Mono.Android.Export.dll -> Mono.Android.Export.dll.so
  [48/129] Xamarin.AndroidX.Navigation.Fragment.dll -> Xamarin.AndroidX.Navigation.Fragment.dll.so
  [126/129] Mono.Android.Runtime.dll -> Mono.Android.Runtime.dll.so
  [127/129] Java.Interop.dll -> Java.Interop.dll.so
  [49/129] Xamarin.AndroidX.Navigation.Runtime.Android.dll -> Xamarin.AndroidX.Navigation.Runtime.Android.dll.so
  [50/129] Xamarin.AndroidX.Navigation.UI.dll -> Xamarin.AndroidX.Navigation.UI.dll.so
  [51/129] Xamarin.AndroidX.RecyclerView.dll -> Xamarin.AndroidX.RecyclerView.dll.so
  [52/129] Xamarin.AndroidX.SavedState.SavedState.Android.dll -> Xamarin.AndroidX.SavedState.SavedState.Android.dll.so
  [53/129] Xamarin.AndroidX.SwipeRefreshLayout.dll -> Xamarin.AndroidX.SwipeRefreshLayout.dll.so
  [54/129] Xamarin.AndroidX.ViewPager.dll -> Xamarin.AndroidX.ViewPager.dll.so
  [128/129] Mono.Android.dll -> Mono.Android.dll.so
  [55/129] Xamarin.AndroidX.ViewPager2.dll -> Xamarin.AndroidX.ViewPager2.dll.so
  [56/129] Xamarin.Google.Android.Material.dll -> Xamarin.Google.Android.Material.dll.so
  [57/129] Xamarin.Kotlin.StdLib.dll -> Xamarin.Kotlin.StdLib.dll.so
  [58/129] Xamarin.KotlinX.Coroutines.Core.Jvm.dll -> Xamarin.KotlinX.Coroutines.Core.Jvm.dll.so
  [59/129] Xamarin.KotlinX.Serialization.Core.Jvm.dll -> Xamarin.KotlinX.Serialization.Core.Jvm.dll.so
  [60/129] xunit.abstractions.dll -> xunit.abstractions.dll.so
  [61/129] xunit.assert.dll -> xunit.assert.dll.so
  [62/129] xunit.core.dll -> xunit.core.dll.so
  [63/129] xunit.execution.dotnet.dll -> xunit.execution.dotnet.dll.so
  [64/129] xunit.runner.utility.netcoreapp10.dll -> xunit.runner.utility.netcoreapp10.dll.so
  [65/129] System.Collections.Concurrent.dll -> System.Collections.Concurrent.dll.so
  [66/129] System.Collections.Immutable.dll -> System.Collections.Immutable.dll.so
  [67/129] System.Collections.NonGeneric.dll -> System.Collections.NonGeneric.dll.so
  [68/129] System.Collections.Specialized.dll -> System.Collections.Specialized.dll.so
  [69/129] System.Collections.dll -> System.Collections.dll.so
  [70/129] System.ComponentModel.Primitives.dll -> System.ComponentModel.Primitives.dll.so
  [71/129] System.ComponentModel.TypeConverter.dll -> System.ComponentModel.TypeConverter.dll.so
  [72/129] System.ComponentModel.dll -> System.ComponentModel.dll.so
  [73/129] System.Console.dll -> System.Console.dll.so
  [74/129] System.Diagnostics.Debug.dll -> System.Diagnostics.Debug.dll.so
  [129/129] System.Private.CoreLib.dll -> System.Private.CoreLib.dll.so
  [75/129] System.Diagnostics.DiagnosticSource.dll -> System.Diagnostics.DiagnosticSource.dll.so
  [76/129] System.Diagnostics.Process.dll -> System.Diagnostics.Process.dll.so
  [77/129] System.Diagnostics.Tools.dll -> System.Diagnostics.Tools.dll.so
  [78/129] System.Diagnostics.TraceSource.dll -> System.Diagnostics.TraceSource.dll.so
  [79/129] System.Diagnostics.Tracing.dll -> System.Diagnostics.Tracing.dll.so
  [80/129] System.Drawing.Primitives.dll -> System.Drawing.Primitives.dll.so
  [81/129] System.Drawing.dll -> System.Drawing.dll.so
  [82/129] System.Formats.Asn1.dll -> System.Formats.Asn1.dll.so
  [83/129] System.Globalization.dll -> System.Globalization.dll.so
  [84/129] System.IO.Compression.Brotli.dll -> System.IO.Compression.Brotli.dll.so
  [85/129] System.IO.Compression.dll -> System.IO.Compression.dll.so
  [86/129] System.IO.FileSystem.dll -> System.IO.FileSystem.dll.so
  [87/129] System.IO.Pipelines.dll -> System.IO.Pipelines.dll.so
  [88/129] System.IO.dll -> System.IO.dll.so
  [89/129] System.Linq.Expressions.dll -> System.Linq.Expressions.dll.so
  [90/129] System.Linq.dll -> System.Linq.dll.so
  [91/129] System.Memory.dll -> System.Memory.dll.so
  [92/129] System.Net.Http.dll -> System.Net.Http.dll.so
  [93/129] System.Net.NameResolution.dll -> System.Net.NameResolution.dll.so
  [94/129] System.Net.Primitives.dll -> System.Net.Primitives.dll.so
  [95/129] System.Net.Requests.dll -> System.Net.Requests.dll.so
  [96/129] System.Net.Sockets.dll -> System.Net.Sockets.dll.so
  [97/129] System.Numerics.Vectors.dll -> System.Numerics.Vectors.dll.so
  [98/129] System.ObjectModel.dll -> System.ObjectModel.dll.so
  [99/129] System.Private.Uri.dll -> System.Private.Uri.dll.so
  [100/129] System.Private.Xml.Linq.dll -> System.Private.Xml.Linq.dll.so
  [101/129] System.Private.Xml.dll -> System.Private.Xml.dll.so
  [102/129] System.Reflection.Extensions.dll -> System.Reflection.Extensions.dll.so
  [103/129] System.Reflection.TypeExtensions.dll -> System.Reflection.TypeExtensions.dll.so
  [104/129] System.Reflection.dll -> System.Reflection.dll.so
  [105/129] System.Runtime.Extensions.dll -> System.Runtime.Extensions.dll.so
  [106/129] System.Runtime.InteropServices.RuntimeInformation.dll -> System.Runtime.InteropServices.RuntimeInformation.dll.so
  [107/129] System.Runtime.InteropServices.dll -> System.Runtime.InteropServices.dll.so
  [108/129] System.Runtime.Loader.dll -> System.Runtime.Loader.dll.so
  [109/129] System.Runtime.Numerics.dll -> System.Runtime.Numerics.dll.so
  [110/129] System.Runtime.dll -> System.Runtime.dll.so
  [111/129] System.Security.Cryptography.dll -> System.Security.Cryptography.dll.so
  [112/129] System.Text.Encoding.dll -> System.Text.Encoding.dll.so
  [113/129] System.Text.Encodings.Web.dll -> System.Text.Encodings.Web.dll.so
  [114/129] System.Text.Json.dll -> System.Text.Json.dll.so
  [115/129] System.Text.RegularExpressions.dll -> System.Text.RegularExpressions.dll.so
  [116/129] System.Threading.Tasks.dll -> System.Threading.Tasks.dll.so
  [117/129] System.Threading.Thread.dll -> System.Threading.Thread.dll.so
  [118/129] System.Threading.ThreadPool.dll -> System.Threading.ThreadPool.dll.so
  [119/129] System.Threading.dll -> System.Threading.dll.so
  [120/129] System.Xml.Linq.dll -> System.Xml.Linq.dll.so
  [121/129] System.Xml.ReaderWriter.dll -> System.Xml.ReaderWriter.dll.so
  [122/129] System.Xml.XDocument.dll -> System.Xml.XDocument.dll.so
  [123/129] System.dll -> System.dll.so
  [124/129] netstandard.dll -> netstandard.dll.so
  [125/129] Java.Interop.dll -> Java.Interop.dll.so
  [126/129] Mono.Android.Export.dll -> Mono.Android.Export.dll.so
  [127/129] Mono.Android.Runtime.dll -> Mono.Android.Runtime.dll.so
  [128/129] Mono.Android.dll -> Mono.Android.dll.so
  [129/129] System.Private.CoreLib.dll -> System.Private.CoreLib.dll.so

Build succeeded.
    0 Warning(s)
    0 Error(s)

Time Elapsed 00:10:50.27
[11.0.0-prerelease.26230.4+92962e5c46ac08a66ded4c5696209cc60f1a232f] XHarness command issued: android test --app /home/vsts/work/1/s/artifacts/bin/Core.DeviceTests/Release/net10.0-android/com.microsoft.maui.core.devicetests-Signed.apk --package-name com.microsoft.maui.core.devicetests --device-id emulator-5554 -o artifacts/log --timeout 01:00:00 -v --arg TestFilter=Category=WebView
�[40m�[37mdbug�[39m�[22m�[49m: ADBRunner using ADB.exe supplied from /home/vsts/.nuget/packages/microsoft.dotnet.xharness.cli/11.0.0-prerelease.26230.4/tools/net10.0/any/../../../runtimes/any/native/adb/linux/adb
�[40m�[37mdbug�[39m�[22m�[49m: Full resolved path:'/home/vsts/.nuget/packages/microsoft.dotnet.xharness.cli/11.0.0-prerelease.26230.4/runtimes/any/native/adb/linux/adb'
�[40m�[32minfo�[39m�[22m�[49m: Will attempt to find device supporting architectures: 'arm64-v8a', 'x86_64'
�[40m�[37mdbug�[39m�[22m�[49m: Executing command: '/home/vsts/.nuget/packages/microsoft.dotnet.xharness.cli/11.0.0-prerelease.26230.4/runtimes/any/native/adb/linux/adb start-server'
�[40m�[37mdbug�[39m�[22m�[49m: 
�[40m�[32minfo�[39m�[22m�[49m: Finding attached devices/emulators...
�[40m�[37mdbug�[39m�[22m�[49m: Executing command: '/home/vsts/.nuget/packages/microsoft.dotnet.xharness.cli/11.0.0-prerelease.26230.4/runtimes/any/native/adb/linux/adb devices -l'
�[40m�[37mdbug�[39m�[22m�[49m: Found 1 possible devices
�[40m�[37mdbug�[39m�[22m�[49m: Evaluating output line for device serial: emulator-5554          device product:sdk_gphone_x86_64 model:sdk_gphone_x86_64 device:generic_x86_64_arm64 transport_id:3
�[40m�[37mdbug�[39m�[22m�[49m: Executing command: '/home/vsts/.nuget/packages/microsoft.dotnet.xharness.cli/11.0.0-prerelease.26230.4/runtimes/any/native/adb/linux/adb -s emulator-5554 shell getprop ro.product.cpu.abilist'
�[40m�[37mdbug�[39m�[22m�[49m: Found 1 possible devices. Using 'emulator-5554'
�[40m�[32minfo�[39m�[22m�[49m: Active Android device set to serial 'emulator-5554'
�[40m�[37mdbug�[39m�[22m�[49m: Executing command: '/home/vsts/.nuget/packages/microsoft.dotnet.xharness.cli/11.0.0-prerelease.26230.4/runtimes/any/native/adb/linux/adb -s emulator-5554 -s emulator-5554 shell getprop ro.product.cpu.abi'
�[40m�[37mdbug�[39m�[22m�[49m: Executing command: '/home/vsts/.nuget/packages/microsoft.dotnet.xharness.cli/11.0.0-prerelease.26230.4/runtimes/any/native/adb/linux/adb -s emulator-5554 -s emulator-5554 shell getprop ro.build.version.sdk'
�[40m�[32minfo�[39m�[22m�[49m: Waiting for device to be available (max 5 minutes)
�[40m�[37mdbug�[39m�[22m�[49m: Executing command: '/home/vsts/.nuget/packages/microsoft.dotnet.xharness.cli/11.0.0-prerelease.26230.4/runtimes/any/native/adb/linux/adb -s emulator-5554 wait-for-device'
�[40m�[37mdbug�[39m�[22m�[49m: Executing command: '/home/vsts/.nuget/packages/microsoft.dotnet.xharness.cli/11.0.0-prerelease.26230.4/runtimes/any/native/adb/linux/adb -s emulator-5554 -s emulator-5554 shell getprop sys.boot_completed'
�[40m�[37mdbug�[39m�[22m�[49m: sys.boot_completed = '1'
�[40m�[37mdbug�[39m�[22m�[49m: Waited 0 seconds for device boot completion
�[40m�[37mdbug�[39m�[22m�[49m: Working with emulator-5554 (API 30)
�[40m�[37mdbug�[39m�[22m�[49m: Check current adb install and/or package verification settings
�[40m�[37mdbug�[39m�[22m�[49m: Executing command: '/home/vsts/.nuget/packages/microsoft.dotnet.xharness.cli/11.0.0-prerelease.26230.4/runtimes/any/native/adb/linux/adb -s emulator-5554 shell settings get global verifier_verify_adb_installs'
�[40m�[37mdbug�[39m�[22m�[49m: verifier_verify_adb_installs = 0
�[40m�[37mdbug�[39m�[22m�[49m: Executing command: '/home/vsts/.nuget/packages/microsoft.dotnet.xharness.cli/11.0.0-prerelease.26230.4/runtimes/any/native/adb/linux/adb -s emulator-5554 shell settings get global package_verifier_enable'
�[40m�[37mdbug�[39m�[22m�[49m: package_verifier_enable = 
�[40m�[1m�[33mwarn�[39m�[22m�[49m: Installing debug apks on a device might be rejected with INSTALL_FAILED_VERIFICATION_FAILURE. Make sure to set 'package_verifier_enable' to '0'
�[40m�[32minfo�[39m�[22m�[49m: Attempting to remove apk 'com.microsoft.maui.core.devicetests'..
�[40m�[37mdbug�[39m�[22m�[49m: Executing command: '/home/vsts/.nuget/packages/microsoft.dotnet.xharness.cli/11.0.0-prerelease.26230.4/runtimes/any/native/adb/linux/adb -s emulator-5554 uninstall com.microsoft.maui.core.devicetests'
�[40m�[1m�[33mwarn�[39m�[22m�[49m: Hit broken pipe error; Will make one attempt to restart ADB server, and retry the uninstallation
�[40m�[37mdbug�[39m�[22m�[49m: Executing command: '/home/vsts/.nuget/packages/microsoft.dotnet.xharness.cli/11.0.0-prerelease.26230.4/runtimes/any/native/adb/linux/adb -s emulator-5554 kill-server'
�[40m�[37mdbug�[39m�[22m�[49m: Executing command: '/home/vsts/.nuget/packages/microsoft.dotnet.xharness.cli/11.0.0-prerelease.26230.4/runtimes/any/native/adb/linux/adb -s emulator-5554 start-server'
�[40m�[37mdbug�[39m�[22m�[49m: 
�[40m�[37mdbug�[39m�[22m�[49m: Executing command: '/home/vsts/.nuget/packages/microsoft.dotnet.xharness.cli/11.0.0-prerelease.26230.4/runtimes/any/native/adb/linux/adb -s emulator-5554 uninstall com.microsoft.maui.core.devicetests'
�[41m�[30mfail�[39m�[22m�[49m: Error: Exit code: 20
      Std out:
      
      
      Std err:
      - waiting for device -
      cmd: Can't find service: package
      
      
      
�[40m�[32minfo�[39m�[22m�[49m: Attempting to install /home/vsts/work/1/s/artifacts/bin/Core.DeviceTests/Release/net10.0-android/com.microsoft.maui.core.devicetests-Signed.apk
�[40m�[37mdbug�[39m�[22m�[49m: Executing command: '/home/vsts/.nuget/packages/microsoft.dotnet.xharness.cli/11.0.0-prerelease.26230.4/runtimes/any/native/adb/linux/adb -s emulator-5554 install /home/vsts/work/1/s/artifacts/bin/Core.DeviceTests/Release/net10.0-android/com.microsoft.maui.core.devicetests-Signed.apk'
�[41m�[30mfail�[39m�[22m�[49m: Error:
      Exit code: 1
      Std out:
      Serving...
      Performing Incremental Install
      cmd: Can't find service: package
      Performing Streamed Install
      
      
      Std err:
      adb: failed to install /home/vsts/work/1/s/artifacts/bin/Core.DeviceTests/Release/net10.0-android/com.microsoft.maui.core.devicetests-Signed.apk: cmd: Can't find service: package
      
      
      
�[41m�[1m�[37mcrit�[39m�[22m�[49m: Install failure: Test command cannot continue
�[40m�[32minfo�[39m�[22m�[49m: Attempting to remove apk 'com.microsoft.maui.core.devicetests'..
�[40m�[37mdbug�[39m�[22m�[49m: Executing command: '/home/vsts/.nuget/packages/microsoft.dotnet.xharness.cli/11.0.0-prerelease.26230.4/runtimes/any/native/adb/linux/adb -s emulator-5554 uninstall com.microsoft.maui.core.devicetests'
�[41m�[30mfail�[39m�[22m�[49m: Error: Exit code: 20
      Std out:
      
      
      Std err:
      cmd: Can't find service: package
      
      
      
�[40m�[32minfo�[39m�[22m�[49m: Attempting to remove apk 'com.microsoft.maui.core.devicetests'..
�[40m�[37mdbug�[39m�[22m�[49m: Executing command: '/home/vsts/.nuget/packages/microsoft.dotnet.xharness.cli/11.0.0-prerelease.26230.4/runtimes/any/native/adb/linux/adb -s emulator-5554 uninstall com.microsoft.maui.core.devicetests'
�[41m�[30mfail�[39m�[22m�[49m: Error: Exit code: 20
      Std out:
      
      
      Std err:
      cmd: Can't find service: package
      
      
      
XHarness exit code: 78 (PACKAGE_INSTALLATION_FAILURE)
  Tests completed with exit code: 78

🟢 With fix — 📱 WebViewHandlerTests (WebView_HasScrollCaptureBridge_AfterConstruction): PASS ✅ · 296s

(truncated to last 15,000 chars)

ling Enabled Initializes Correctly
      06-11 12:24:34.022 10303 10330 I DOTNET  : [FILTER] Included test (filtered by Trait; 'Category':'ContentView'): [SearchBar] Auto Scaling Enabled Initializes Correctly
      06-11 12:24:34.022 10303 10330 I DOTNET  : [FILTER] Included test (filtered by Trait; 'Category':'Element'): [SearchBar] Auto Scaling Enabled Initializes Correctly
      06-11 12:24:34.022 10303 10330 I DOTNET  : [FILTER] Included test (filtered by Trait; 'Category':'DatePicker'): [SearchBar] Auto Scaling Enabled Initializes Correctly
      06-11 12:24:34.022 10303 10330 I DOTNET  : [FILTER] Included test (filtered by Trait; 'Category':'Dispatcher'): [SearchBar] Auto Scaling Enabled Initializes Correctly
      06-11 12:24:34.022 10303 10330 I DOTNET  : [FILTER] Included test (filtered by Trait; 'Category':'Editor'): [SearchBar] Auto Scaling Enabled Initializes Correctly
      06-11 12:24:34.022 10303 10330 I DOTNET  : [FILTER] Included test (filtered by Trait; 'Category':'Entry'): [SearchBar] Auto Scaling Enabled Initializes Correctly
      06-11 12:24:34.022 10303 10330 I DOTNET  : [FILTER] Included test (filtered by Trait; 'Category':'FlowDirection'): [SearchBar] Auto Scaling Enabled Initializes Correctly
      06-11 12:24:34.022 10303 10330 I DOTNET  : [FILTER] Included test (filtered by Trait; 'Category':'FlyoutView'): [SearchBar] Auto Scaling Enabled Initializes Correctly
      06-11 12:24:34.022 10303 10330 I DOTNET  : [FILTER] Included test (filtered by Trait; 'Category':'Fonts'): [SearchBar] Auto Scaling Enabled Initializes Correctly
      06-11 12:24:34.022 10303 10330 I DOTNET  : [FILTER] Included test (filtered by Trait; 'Category':'Graphics'): [SearchBar] Auto Scaling Enabled Initializes Correctly
      06-11 12:24:34.022 10303 10330 I DOTNET  : [FILTER] Included test (filtered by Trait; 'Category':'GraphicsView'): [SearchBar] Auto Scaling Enabled Initializes Correctly
      06-11 12:24:34.022 10303 10330 I DOTNET  : [FILTER] Included test (filtered by Trait; 'Category':'Image'): [SearchBar] Auto Scaling Enabled Initializes Correctly
      06-11 12:24:34.022 10303 10330 I DOTNET  : [FILTER] Included test (filtered by Trait; 'Category':'ImageButton'): [SearchBar] Auto Scaling Enabled Initializes Correctly
      06-11 12:24:34.022 10303 10330 I DOTNET  : [FILTER] Included test (filtered by Trait; 'Category':'ImageSource'): [SearchBar] Auto Scaling Enabled Initializes Correctly
      06-11 12:24:34.022 10303 10330 I DOTNET  : [FILTER] Included test (filtered by Trait; 'Category':'IndicatorView'): [SearchBar] Auto Scaling Enabled Initializes Correctly
      06-11 12:24:34.022 10303 10330 I DOTNET  : [FILTER] Included test (filtered by Trait; 'Category':'Label'): [SearchBar] Auto Scaling Enabled Initializes Correctly
      06-11 12:24:34.022 10303 10330 I DOTNET  : [FILTER] Included test (filtered by Trait; 'Category':'Layout'): [SearchBar] Auto Scaling Enabled Initializes Correctly
      06-11 12:24:34.022 10303 10330 I DOTNET  : [FILTER] Included test (filtered by Trait; 'Category':'Memory'): [SearchBar] Auto Scaling Enabled Initializes Correctly
      06-11 12:24:34.022 10303 10330 I DOTNET  : [FILTER] Included test (filtered by Trait; 'Category':'NavigationPage'): [SearchBar] Auto Scaling Enabled Initializes Correctly
      06-11 12:24:34.022 10303 10330 I DOTNET  : [FILTER] Included test (filtered by Trait; 'Category':'Page'): [SearchBar] Auto Scaling Enabled Initializes Correctly
      06-11 12:24:34.022 10303 10330 I DOTNET  : [FILTER] Included test (filtered by Trait; 'Category':'Picker'): [SearchBar] Auto Scaling Enabled Initializes Correctly
      06-11 12:24:34.022 10303 10330 I DOTNET  : [FILTER] Included test (filtered by Trait; 'Category':'ProgressBar'): [SearchBar] Auto Scaling Enabled Initializes Correctly
      06-11 12:24:34.022 10303 10330 I DOTNET  : [FILTER] Included test (filtered by Trait; 'Category':'RefreshView'): [SearchBar] Auto Scaling Enabled Initializes Correctly
      06-11 12:24:34.022 10303 10330 I DOTNET  : [FILTER] Included test (filtered by Trait; 'Category':'ScrollView'): [SearchBar] Auto Scaling Enabled Initializes Correctly
      06-11 12:24:34.022 10303 10330 I DOTNET  : [FILTER] Excluded test (filtered by Trait; 'Category':'SearchBar'): [SearchBar] Auto Scaling Enabled Initializes Correctly
      06-11 12:24:34.022 10303 10330 I DOTNET  : [FILTER] Included test (filtered by Trait; 'Category':'ShapeView'): [SearchBar] Auto Scaling Enabled Initializes Correctly
      06-11 12:24:34.022 10303 10330 I DOTNET  : [FILTER] Included test (filtered by Trait; 'Category':'Slider'): [SearchBar] Auto Scaling Enabled Initializes Correctly
      06-11 12:24:34.022 10303 10330 I DOTNET  : [FILTER] Included test (filtered by Trait; 'Category':'Stepper'): [SearchBar] Auto Scaling Enabled Initializes Correctly
      06-11 12:24:34.022 10303 10330 I DOTNET  : [FILTER] Included test (filtered by Trait; 'Category':'SwipeView'): [SearchBar] Auto Scaling Enabled Initializes Correctly
      06-11 12:24:34.022 10303 10330 I DOTNET  : [FILTER] Included test (filtered by Trait; 'Category':'Switch'): [SearchBar] Auto Scaling Enabled Initializes Correctly
      06-11 12:24:34.022 10303 10330 I DOTNET  : [FILTER] Included test (filtered by Trait; 'Category':'Formatting'): [SearchBar] Auto Scaling Enabled Initializes Correctly
      06-11 12:24:34.022 10303 10330 I DOTNET  : [FILTER] Included test (filtered by Trait; 'Category':'TimePicker'): [SearchBar] Auto Scaling Enabled Initializes Correctly
      06-11 12:24:34.022 10303 10330 I DOTNET  : [FILTER] Included test (filtered by Trait; 'Category':'View'): [SearchBar] Auto Scaling Enabled Initializes Correctly
      06-11 12:24:34.022 10303 10330 I DOTNET  : [FILTER] Included test (filtered by Trait; 'Category':'Window'): [SearchBar] Auto Scaling Enabled Initializes Correctly
      06-11 12:24:34.022 10303 10330 I DOTNET  : [FILTER] Included test (filtered by Trait; 'Category':'MauiContext'): [SearchBar] Font Family and Weight Initializes Correctly
      06-11 12:24:34.022 10303 10330 I DOTNET  : [FILTER] Included test (filtered by Trait; 'Category':'Application'): [SearchBar] Font Family and Weight Initializes Correctly
      06-11 12:24:34.022 10303 10330 I DOTNET  : [FILTER] Included test (filtered by Trait; 'Category':'BoxView'): [SearchBar] Font Family and Weight Initializes Correctly
      06-11 12:24:34.022 10303 10330 I DOTNET  : [FILTER] Included test (filtered by Trait; 'Category':'RadioButton'): [SearchBar] Font Family and Weight Initializes Correctly
      06-11 12:24:34.022 10303 10330 I DOTNET  : [FILTER] Included test (filtered by Trait; 'Category':'WindowOverlay'): [SearchBar] Font Family and Weight Initializes Correctly
      06-11 12:24:34.022 10303 10330 I DOTNET  : [FILTER] Included test (filtered by Trait; 'Category':'ActivityIndicator'): [SearchBar] Font Family and Weight Initializes Correctly
      06-11 12:24:34.022 10303 10330 I DOTNET  : [FILTER] Included test (filtered by Trait; 'Category':'Border'): [SearchBar] Font Family and Weight Initializes Correctly
      06-11 12:24:34.022 10303 10330 I DOTNET  : [FILTER] Included test (filtered by Trait; 'Category':'Button'): [SearchBar] Font Family and Weight Initializes Correctly
      06-11 12:24:34.022 10303 10330 I DOTNET  : [FILTER] Included test (filtered by Trait; 'Category':'CheckBox'): [SearchBar] Font Family and Weight Initializes Correctly
      06-11 12:24:34.022 10303 10330 I DOTNET  : [FILTER] Included test (filtered by Trait; 'Category':'ContentView'): [SearchBar] Font Family and Weight Initializes Correctly
      06-11 12:24:34.022 10303 10330 I DOTNET  : [FILTER] Included test (filtered by Trait; 'Category':'Element'): [SearchBar] Font Family and Weight Initializes Correctly
      06-11 12:24:34.022 10303 10330 I DOTNET  : [FILTER] Included test (filtered by Trait; 'Category':'DatePicker'): [SearchBar] Font Family and Weight Initializes Correctly
      06-11 12:24:34.022 10303 10330 I DOTNET  : [FILTER] Included test (filtered by Trait; 'Category':'Dispatcher'): [SearchBar] Font Family and Weight Initializes Correctly
      06-11 12:24:34.022 10303 10330 I DOTNET  : [FILTER] Included test (filtered by Trait; 'Category':'Editor'): [SearchBar] Font Family and Weight Initializes Correctly
      06-11 12:24:34.052 10303 10330 I DOTNET  : [Test environment: 64-bit .NET .NET 10.0 [collection-per-class, non-parallel]]
      06-11 12:24:34.052 10303 10330 I DOTNET  : [Test framework: xUnit.net 2.9.0.0]
      06-11 12:24:34.063 10303 10330 I DOTNET  : Test collection for Microsoft.Maui.DeviceTests.WebViewHandlerTests
      06-11 12:24:34.567 10303 10381 I DOTNET  : 	[PASS] Native View Bounding Box is not empty
      06-11 12:24:34.632 10303 10388 I DOTNET  : 	[PASS] Native View Bounding Box is not empty
      06-11 12:24:34.644 10303 10388 I DOTNET  : 	[PASS] Native View Bounding Box is not empty
      06-11 12:24:34.658 10303 10388 I DOTNET  : 	[PASS] Setting Semantic Hint makes element accessible
      06-11 12:24:34.659 10303 10388 I DOTNET  : 	[PASS] HandlersHaveAllExpectedContructors
      06-11 12:24:34.680 10303 10388 I DOTNET  : 	[PASS] RotationY Initialize Correctly
      06-11 12:24:34.703 10303 10393 I DOTNET  : 	[PASS] RotationY Initialize Correctly
      06-11 12:24:34.718 10303 10393 I DOTNET  : 	[PASS] RotationY Initialize Correctly
      06-11 12:24:34.724 10303 10393 I DOTNET  : 	[PASS] Setting Semantic Description makes element accessible
      06-11 12:24:34.762 10303 10398 I DOTNET  : 	[PASS] TranslationY Initialize Correctly
      06-11 12:24:34.771 10303 10398 I DOTNET  : 	[PASS] TranslationY Initialize Correctly
      06-11 12:24:34.798 10303 10398 I DOTNET  : 	[PASS] Opacity is set correctly
      06-11 12:24:34.817 10303 10398 I DOTNET  : 	[PASS] Opacity is set correctly
      06-11 12:24:34.832 10303 10398 I DOTNET  : 	[PASS] NeedsContainerWhenInputTransparent
      06-11 12:24:34.838 10303 10398 I DOTNET  : 	[PASS] RotationX Initialize Correctly
      06-11 12:24:34.856 10303 10398 I DOTNET  : 	[PASS] RotationX Initialize Correctly
      06-11 12:24:34.888 10303 10403 I DOTNET  : 	[PASS] DisconnectHandlerDoesntCrash
      06-11 12:24:34.897 10303 10403 I DOTNET  : 	[PASS] MinimumHeightInitializes
      06-11 12:24:34.903 10303 10403 I DOTNET  : 	[PASS] MinimumHeightInitializes
      06-11 12:24:34.911 10303 10403 I DOTNET  : 	[PASS] TranslationX Initialize Correctly
      06-11 12:24:34.922 10303 10403 I DOTNET  : 	[PASS] TranslationX Initialize Correctly
      06-11 12:24:34.951 10303 10408 I DOTNET  : 	[PASS] View Renders To Image
      06-11 12:24:34.962 10303 10408 I DOTNET  : 	[PASS] View Renders To Image
      06-11 12:24:34.968 10303 10408 I DOTNET  : 	[PASS] Rotation Initialize Correctly
      06-11 12:24:34.990 10303 10408 I DOTNET  : 	[PASS] Rotation Initialize Correctly
      06-11 12:24:34.991 10303 10408 I DOTNET  : 	[IGNORED] Semantic Hint is set correctly
      06-11 12:24:34.991 10303 10408 I DOTNET  : 	[IGNORED] Semantic Description is set correctly
      06-11 12:24:35.527 10303 10420 I DOTNET  : 	[PASS] ContainerView Adds And Removes
      06-11 12:24:35.654 10303 10420 I DOTNET  : 	[PASS] WebView loads non-Western character encoded URLs correctly
      06-11 12:24:35.664 10303 10420 I DOTNET  : 	[PASS] WebView loads non-Western character encoded URLs correctly
      06-11 12:24:35.664 10303 10420 I DOTNET  : 	[IGNORED] WebBrowser autoplays HTML5 Video
      06-11 12:24:35.728 10303 10420 I DOTNET  : 	[PASS] MauiWebView has JS bridge registered at construction time
      06-11 12:24:35.754 10303 10420 I DOTNET  : 	[PASS] Null Semantics Doesnt throw exception
      06-11 12:24:35.780 10303 10420 I DOTNET  : 	[PASS] Visibility is set correctly
      06-11 12:24:35.795 10303 10420 I DOTNET  : 	[PASS] Visibility is set correctly
      06-11 12:24:35.805 10303 10420 I DOTNET  : 	[PASS] MinimumWidthInitializes
      06-11 12:24:35.812 10303 10420 I DOTNET  : 	[PASS] MinimumWidthInitializes
      06-11 12:24:35.826 10303 10420 I DOTNET  : 	[PASS] UrlSource Initializes Correctly
      06-11 12:24:35.841 10303 10420 I DOTNET  : 	[PASS] UrlSource Initializes Correctly
      06-11 12:24:35.889 10303 10420 I DOTNET  : 	[PASS] FlowDirection is set correctly
      06-11 12:24:35.896 10303 10420 I DOTNET  : 	[PASS] FlowDirection is set correctly
      06-11 12:24:35.921 10303 10420 I DOTNET  : 	[PASS] Clip Initializes ContainerView Correctly
      06-11 12:24:35.935 10303 10420 I DOTNET  : 	[PASS] ScaleY Initialize Correctly
      06-11 12:24:35.960 10303 10420 I DOTNET  : 	[PASS] ScaleY Initialize Correctly
      06-11 12:24:35.967 10303 10420 I DOTNET  : 	[PASS] Native View Bounds are not empty
      06-11 12:24:35.976 10303 10420 I DOTNET  : 	[PASS] Native View Bounds are not empty
      06-11 12:24:35.990 10303 10420 I DOTNET  : 	[PASS] Semantic Heading is set correctly
      06-11 12:24:36.010 10303 10420 I DOTNET  : 	[PASS] ScaleX Initialize Correctly
      06-11 12:24:36.069 10303 10420 I DOTNET  : 	[PASS] ScaleX Initialize Correctly
      06-11 12:24:36.076 10303 10420 I DOTNET  : 	[PASS] ScaleX Initialize Correctly
      06-11 12:24:36.098 10303 10420 I DOTNET  : 	[PASS] ContainerView Remains If Shadow Mapper Runs Again
      06-11 12:24:36.107 10303 10420 I DOTNET  : 	[PASS] Automation Id is set correctly
      06-11 12:24:36.144 10303 10420 I DOTNET  : 	[PASS] PlatformView Transforms are not empty
      06-11 12:24:36.160 10303 10420 I DOTNET  : 	[PASS] PlatformView Transforms are not empty
      06-11 12:24:36.173 10303 10420 I DOTNET  : Microsoft.Maui.DeviceTests.WebViewHandlerTests 1.8509999 ms
      06-11 12:24:36.276 10303 10330 I DOTNET  : Xml file was written to the provided writer.
      06-11 12:24:36.276 10303 10330 I DOTNET  : Tests run: 1321 Passed: 71 Inconclusive: 0 Failed: 0 Ignored: 1247
�[40m�[32minfo�[39m�[22m�[49m: <<XHARNESS_RESULT_START>>
      {
        "version": 1,
        "machineName": "runnervm32qxw",
        "exitCode": 0,
        "exitCodeName": "SUCCESS",
        "platform": "android",
        "instrumentationExitCode": 0,
        "device": "emulator-5554",
        "deviceOsVersion": "API 30",
        "architecture": "x86_64",
        "files": [
          {
            "name": "testResults.xml",
            "type": "test-results"
          },
          {
            "name": "adb-logcat-com.microsoft.maui.core.devicetests-default.log",
            "type": "logcat"
          }
        ]
      }
      <<XHARNESS_RESULT_END>>
�[40m�[32minfo�[39m�[22m�[49m: Attempting to remove apk 'com.microsoft.maui.core.devicetests'..
�[40m�[37mdbug�[39m�[22m�[49m: Executing command: '/home/vsts/.nuget/packages/microsoft.dotnet.xharness.cli/11.0.0-prerelease.26230.4/runtimes/any/native/adb/linux/adb -s emulator-5554 uninstall com.microsoft.maui.core.devicetests'
�[40m�[32minfo�[39m�[22m�[49m: Successfully uninstalled com.microsoft.maui.core.devicetests
XHarness exit code: 0
  Tests completed successfully

🔴 Without fix — 🖥️ Issue33510: FAIL ✅ · 585s
  Determining projects to restore...
  Restored /home/vsts/work/1/s/src/Controls/src/Core/Controls.Core.csproj (in 2.46 sec).
  Restored /home/vsts/work/1/s/src/Controls/src/BindingSourceGen/Controls.BindingSourceGen.csproj (in 33 ms).
  Restored /home/vsts/work/1/s/src/BlazorWebView/src/Maui/Microsoft.AspNetCore.Components.WebView.Maui.csproj (in 5.37 sec).
  Restored /home/vsts/work/1/s/src/Controls/Maps/src/Controls.Maps.csproj (in 2.81 sec).
  Restored /home/vsts/work/1/s/src/Graphics/src/Graphics/Graphics.csproj (in 10 ms).
  Restored /home/vsts/work/1/s/src/Essentials/src/Essentials.csproj (in 30 ms).
  Restored /home/vsts/work/1/s/src/Core/src/Core.csproj (in 91 ms).
  Restored /home/vsts/work/1/s/src/Core/maps/src/Maps.csproj (in 37 ms).
  Restored /home/vsts/work/1/s/src/Controls/Foldable/src/Controls.Foldable.csproj (in 314 ms).
  Restored /home/vsts/work/1/s/src/Controls/src/Xaml/Controls.Xaml.csproj (in 77 ms).
  Restored /home/vsts/work/1/s/src/Controls/tests/TestCases.HostApp/Controls.TestCases.HostApp.csproj (in 436 ms).
  ##vso[build.updatebuildnumber]10.0.80-ci+azdo.14346778
  Graphics -> /home/vsts/work/1/s/artifacts/bin/Graphics/Debug/net10.0-android36.0/Microsoft.Maui.Graphics.dll
  ##vso[build.updatebuildnumber]10.0.80-ci+azdo.14346778
  Essentials -> /home/vsts/work/1/s/artifacts/bin/Essentials/Debug/net10.0-android36.0/Microsoft.Maui.Essentials.dll
  ##vso[build.updatebuildnumber]10.0.80-ci+azdo.14346778
  Core -> /home/vsts/work/1/s/artifacts/bin/Core/Debug/net10.0-android36.0/Microsoft.Maui.dll
  Controls.BindingSourceGen -> /home/vsts/work/1/s/artifacts/bin/Controls.BindingSourceGen/Debug/netstandard2.0/Microsoft.Maui.Controls.BindingSourceGen.dll
  ##vso[build.updatebuildnumber]10.0.80-ci+azdo.14346778
  Maps -> /home/vsts/work/1/s/artifacts/bin/Maps/Debug/net10.0-android36.0/Microsoft.Maui.Maps.dll
  ##vso[build.updatebuildnumber]10.0.80-ci+azdo.14346778
  Controls.Core -> /home/vsts/work/1/s/artifacts/bin/Controls.Core/Debug/net10.0-android36.0/Microsoft.Maui.Controls.dll
  ##vso[build.updatebuildnumber]10.0.80-ci+azdo.14346778
  ##vso[build.updatebuildnumber]10.0.80-ci+azdo.14346778
  Controls.Maps -> /home/vsts/work/1/s/artifacts/bin/Controls.Maps/Debug/net10.0-android36.0/Microsoft.Maui.Controls.Maps.dll
  ##vso[build.updatebuildnumber]10.0.80-ci+azdo.14346778
  Controls.Xaml -> /home/vsts/work/1/s/artifacts/bin/Controls.Xaml/Debug/net10.0-android36.0/Microsoft.Maui.Controls.Xaml.dll
  Microsoft.AspNetCore.Components.WebView.Maui -> /home/vsts/work/1/s/artifacts/bin/Microsoft.AspNetCore.Components.WebView.Maui/Debug/net10.0-android36.0/Microsoft.AspNetCore.Components.WebView.Maui.dll
  ##vso[build.updatebuildnumber]10.0.80-ci+azdo.14346778
  Controls.Foldable -> /home/vsts/work/1/s/artifacts/bin/Controls.Foldable/Debug/net10.0-android36.0/Microsoft.Maui.Controls.Foldable.dll
  Controls.TestCases.HostApp -> /home/vsts/work/1/s/artifacts/bin/Controls.TestCases.HostApp/Debug/net10.0-android/Controls.TestCases.HostApp.dll
  ##vso[build.updatebuildnumber]10.0.80-ci+azdo.14346778
  Graphics -> /home/vsts/work/1/s/artifacts/bin/Controls.TestCases.HostApp/Debug/net10.0-android/Microsoft.Maui.Graphics.dll
  ##vso[build.updatebuildnumber]10.0.80-ci+azdo.14346778
  Essentials -> /home/vsts/work/1/s/artifacts/bin/Controls.TestCases.HostApp/Debug/net10.0-android/Microsoft.Maui.Essentials.dll
  ##vso[build.updatebuildnumber]10.0.80-ci+azdo.14346778
  Core -> /home/vsts/work/1/s/artifacts/bin/Controls.TestCases.HostApp/Debug/net10.0-android/Microsoft.Maui.dll
  Controls.BindingSourceGen -> /home/vsts/work/1/s/artifacts/bin/Controls.BindingSourceGen/Debug/netstandard2.0/Microsoft.Maui.Controls.BindingSourceGen.dll
  ##vso[build.updatebuildnumber]10.0.80-ci+azdo.14346778
  ##vso[build.updatebuildnumber]10.0.80-ci+azdo.14346778
  Maps -> /home/vsts/work/1/s/artifacts/bin/Controls.TestCases.HostApp/Debug/net10.0-android/Microsoft.Maui.Maps.dll
  Controls.Core -> /home/vsts/work/1/s/artifacts/bin/Controls.TestCases.HostApp/Debug/net10.0-android/Microsoft.Maui.Controls.dll
  ##vso[build.updatebuildnumber]10.0.80-ci+azdo.14346778
  ##vso[build.updatebuildnumber]10.0.80-ci+azdo.14346778
  ##vso[build.updatebuildnumber]10.0.80-ci+azdo.14346778
  ##vso[build.updatebuildnumber]10.0.80-ci+azdo.14346778
  Microsoft.AspNetCore.Components.WebView.Maui -> /home/vsts/work/1/s/artifacts/bin/Controls.TestCases.HostApp/Debug/net10.0-android/Microsoft.AspNetCore.Components.WebView.Maui.dll
  Controls.Xaml -> /home/vsts/work/1/s/artifacts/bin/Controls.TestCases.HostApp/Debug/net10.0-android/Microsoft.Maui.Controls.Xaml.dll
  Controls.Maps -> /home/vsts/work/1/s/artifacts/bin/Controls.TestCases.HostApp/Debug/net10.0-android/Microsoft.Maui.Controls.Maps.dll
  Controls.Foldable -> /home/vsts/work/1/s/artifacts/bin/Controls.TestCases.HostApp/Debug/net10.0-android/Microsoft.Maui.Controls.Foldable.dll

Build succeeded.
    0 Warning(s)
    0 Error(s)

Time Elapsed 00:06:49.34
Broadcasting: Intent { act=android.intent.action.CLOSE_SYSTEM_DIALOGS flg=0x400000 }
Broadcast completed: result=0
  Determining projects to restore...
  Restored /home/vsts/work/1/s/src/Controls/tests/CustomAttributes/Controls.CustomAttributes.csproj (in 793 ms).
  Restored /home/vsts/work/1/s/src/TestUtils/src/VisualTestUtils/VisualTestUtils.csproj (in 3 ms).
  Restored /home/vsts/work/1/s/src/TestUtils/src/VisualTestUtils.MagickNet/VisualTestUtils.MagickNet.csproj (in 14.82 sec).
  Restored /home/vsts/work/1/s/src/Controls/tests/TestCases.Android.Tests/Controls.TestCases.Android.Tests.csproj (in 15.71 sec).
  Restored /home/vsts/work/1/s/src/TestUtils/src/UITest.Core/UITest.Core.csproj (in 1 ms).
  Restored /home/vsts/work/1/s/src/TestUtils/src/UITest.Appium/UITest.Appium.csproj (in 2 ms).
  Restored /home/vsts/work/1/s/src/TestUtils/src/UITest.NUnit/UITest.NUnit.csproj (in 649 ms).
  Restored /home/vsts/work/1/s/src/TestUtils/src/UITest.Analyzers/UITest.Analyzers.csproj (in 3.34 sec).
  5 of 13 projects are up-to-date for restore.
  ##vso[build.updatebuildnumber]10.0.80-ci+azdo.14346778
  Graphics -> /home/vsts/work/1/s/artifacts/bin/Graphics/Debug/net10.0/Microsoft.Maui.Graphics.dll
  ##vso[build.updatebuildnumber]10.0.80-ci+azdo.14346778
  Essentials -> /home/vsts/work/1/s/artifacts/bin/Essentials/Debug/net10.0/Microsoft.Maui.Essentials.dll
  Controls.CustomAttributes -> /home/vsts/work/1/s/artifacts/bin/Controls.CustomAttributes/Debug/net10.0/Controls.CustomAttributes.dll
  ##vso[build.updatebuildnumber]10.0.80-ci+azdo.14346778
  Core -> /home/vsts/work/1/s/artifacts/bin/Core/Debug/net10.0/Microsoft.Maui.dll
  Controls.BindingSourceGen -> /home/vsts/work/1/s/artifacts/bin/Controls.BindingSourceGen/Debug/netstandard2.0/Microsoft.Maui.Controls.BindingSourceGen.dll
  ##vso[build.updatebuildnumber]10.0.80-ci+azdo.14346778
  Controls.Core -> /home/vsts/work/1/s/artifacts/bin/Controls.Core/Debug/net10.0/Microsoft.Maui.Controls.dll
  UITest.Core -> /home/vsts/work/1/s/artifacts/bin/UITest.Core/Debug/net10.0/UITest.Core.dll
  VisualTestUtils -> /home/vsts/work/1/s/artifacts/bin/VisualTestUtils/Debug/netstandard2.0/VisualTestUtils.dll
  UITest.NUnit -> /home/vsts/work/1/s/artifacts/bin/UITest.NUnit/Debug/net10.0/UITest.NUnit.dll
  VisualTestUtils.MagickNet -> /home/vsts/work/1/s/artifacts/bin/VisualTestUtils.MagickNet/Debug/netstandard2.0/VisualTestUtils.MagickNet.dll
  UITest.Appium -> /home/vsts/work/1/s/artifacts/bin/UITest.Appium/Debug/net10.0/UITest.Appium.dll
  UITest.Analyzers -> /home/vsts/work/1/s/artifacts/bin/UITest.Analyzers/Debug/netstandard2.0/UITest.Analyzers.dll
  Controls.TestCases.Android.Tests -> /home/vsts/work/1/s/artifacts/bin/Controls.TestCases.Android.Tests/Debug/net10.0/Controls.TestCases.Android.Tests.dll
Test run for /home/vsts/work/1/s/artifacts/bin/Controls.TestCases.Android.Tests/Debug/net10.0/Controls.TestCases.Android.Tests.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.
[xUnit.net 00:00:00.00] xUnit.net VSTest Adapter v2.8.2+699d445a1a (64-bit .NET 10.0.0)
[xUnit.net 00:00:00.12]   Discovering: Controls.TestCases.Android.Tests
[xUnit.net 00:00:00.33]   Discovered:  Controls.TestCases.Android.Tests
NUnit Adapter 4.5.0.0: Test execution started
Running selected tests in /home/vsts/work/1/s/artifacts/bin/Controls.TestCases.Android.Tests/Debug/net10.0/Controls.TestCases.Android.Tests.dll
   NUnit3TestExecutor discovered 1 of 1 NUnit test cases using Current Discovery mode, Non-Explicit run
>>>>> 06/11/2026 12:19:22 FixtureSetup for Issue33510(Android)
>>>>> 06/11/2026 12:19:23 PullToRefreshShouldNotTriggerWhenWebViewIsScrolledDown Start
>>>>> 06/11/2026 12:19:35 PullToRefreshShouldNotTriggerWhenWebViewIsScrolledDown Stop
>>>>> 06/11/2026 12:19:36 Log types: logcat, bugreport, server
  Failed PullToRefreshShouldNotTriggerWhenWebViewIsScrolledDown [13 s]
  Error Message:
     RefreshView should not trigger while WebView content is not at the top.
Assert.That(App.FindElement(StatusLabel).GetText(), Does.Not.Contain("Refresh triggered"))
  Expected: not String containing "Refresh triggered"
  But was:  "Refresh triggered"

  Stack Trace:
     at Microsoft.Maui.TestCases.Tests.Issues.Issue33510.PullToRefreshShouldNotTriggerWhenWebViewIsScrolledDown() in /_/src/Controls/tests/TestCases.Shared.Tests/Tests/Issues/Issue33510.cs:line 44

1)    at Microsoft.Maui.TestCases.Tests.Issues.Issue33510.PullToRefreshShouldNotTriggerWhenWebViewIsScrolledDown() in /_/src/Controls/tests/TestCases.Shared.Tests/Tests/Issues/Issue33510.cs:line 44


NUnit Adapter 4.5.0.0: Test execution complete
Results File: /home/vsts/work/1/s/CustomAgentLogsTmp/UITests/TestResults/Issue33510.trx

Total tests: 1
Test Run Failed.
     Failed: 1
 Total time: 36.2135 Seconds
>>> TRX_RESULT_FILE: /home/vsts/work/1/s/CustomAgentLogsTmp/UITests/TestResults/Issue33510.trx

🟢 With fix — 🖥️ Issue33510: PASS ✅ · 522s
  Determining projects to restore...
  Restored /home/vsts/work/1/s/src/Essentials/src/Essentials.csproj (in 669 ms).
  Restored /home/vsts/work/1/s/src/Graphics/src/Graphics/Graphics.csproj (in 669 ms).
  Restored /home/vsts/work/1/s/src/Core/src/Core.csproj (in 134 ms).
  Restored /home/vsts/work/1/s/src/Controls/src/Core/Controls.Core.csproj (in 26 ms).
  Restored /home/vsts/work/1/s/src/Controls/src/Xaml/Controls.Xaml.csproj (in 167 ms).
  Restored /home/vsts/work/1/s/src/Controls/src/BindingSourceGen/Controls.BindingSourceGen.csproj (in 21 ms).
  5 of 11 projects are up-to-date for restore.
  ##vso[build.updatebuildnumber]10.0.80-ci+azdo.14346778
  Graphics -> /home/vsts/work/1/s/artifacts/bin/Graphics/Debug/net10.0-android36.0/Microsoft.Maui.Graphics.dll
  ##vso[build.updatebuildnumber]10.0.80-ci+azdo.14346778
  Essentials -> /home/vsts/work/1/s/artifacts/bin/Essentials/Debug/net10.0-android36.0/Microsoft.Maui.Essentials.dll
  ##vso[build.updatebuildnumber]10.0.80-ci+azdo.14346778
  Core -> /home/vsts/work/1/s/artifacts/bin/Core/Debug/net10.0-android36.0/Microsoft.Maui.dll
  Controls.BindingSourceGen -> /home/vsts/work/1/s/artifacts/bin/Controls.BindingSourceGen/Debug/netstandard2.0/Microsoft.Maui.Controls.BindingSourceGen.dll
  ##vso[build.updatebuildnumber]10.0.80-ci+azdo.14346778
  ##vso[build.updatebuildnumber]10.0.80-ci+azdo.14346778
  Maps -> /home/vsts/work/1/s/artifacts/bin/Maps/Debug/net10.0-android36.0/Microsoft.Maui.Maps.dll
  Controls.Core -> /home/vsts/work/1/s/artifacts/bin/Controls.Core/Debug/net10.0-android36.0/Microsoft.Maui.Controls.dll
  ##vso[build.updatebuildnumber]10.0.80-ci+azdo.14346778
  ##vso[build.updatebuildnumber]10.0.80-ci+azdo.14346778
  ##vso[build.updatebuildnumber]10.0.80-ci+azdo.14346778
  ##vso[build.updatebuildnumber]10.0.80-ci+azdo.14346778
  Controls.Maps -> /home/vsts/work/1/s/artifacts/bin/Controls.Maps/Debug/net10.0-android36.0/Microsoft.Maui.Controls.Maps.dll
  Controls.Foldable -> /home/vsts/work/1/s/artifacts/bin/Controls.Foldable/Debug/net10.0-android36.0/Microsoft.Maui.Controls.Foldable.dll
  Controls.Xaml -> /home/vsts/work/1/s/artifacts/bin/Controls.Xaml/Debug/net10.0-android36.0/Microsoft.Maui.Controls.Xaml.dll
  Microsoft.AspNetCore.Components.WebView.Maui -> /home/vsts/work/1/s/artifacts/bin/Microsoft.AspNetCore.Components.WebView.Maui/Debug/net10.0-android36.0/Microsoft.AspNetCore.Components.WebView.Maui.dll
  Controls.TestCases.HostApp -> /home/vsts/work/1/s/artifacts/bin/Controls.TestCases.HostApp/Debug/net10.0-android/Controls.TestCases.HostApp.dll
  ##vso[build.updatebuildnumber]10.0.80-ci+azdo.14346778
  Graphics -> /home/vsts/work/1/s/artifacts/bin/Controls.TestCases.HostApp/Debug/net10.0-android/Microsoft.Maui.Graphics.dll
  ##vso[build.updatebuildnumber]10.0.80-ci+azdo.14346778
  Essentials -> /home/vsts/work/1/s/artifacts/bin/Controls.TestCases.HostApp/Debug/net10.0-android/Microsoft.Maui.Essentials.dll
  ##vso[build.updatebuildnumber]10.0.80-ci+azdo.14346778
  Core -> /home/vsts/work/1/s/artifacts/bin/Controls.TestCases.HostApp/Debug/net10.0-android/Microsoft.Maui.dll
  Controls.BindingSourceGen -> /home/vsts/work/1/s/artifacts/bin/Controls.BindingSourceGen/Debug/netstandard2.0/Microsoft.Maui.Controls.BindingSourceGen.dll
  ##vso[build.updatebuildnumber]10.0.80-ci+azdo.14346778
  ##vso[build.updatebuildnumber]10.0.80-ci+azdo.14346778
  Maps -> /home/vsts/work/1/s/artifacts/bin/Controls.TestCases.HostApp/Debug/net10.0-android/Microsoft.Maui.Maps.dll
  Controls.Core -> /home/vsts/work/1/s/artifacts/bin/Controls.TestCases.HostApp/Debug/net10.0-android/Microsoft.Maui.Controls.dll
  ##vso[build.updatebuildnumber]10.0.80-ci+azdo.14346778
  ##vso[build.updatebuildnumber]10.0.80-ci+azdo.14346778
  ##vso[build.updatebuildnumber]10.0.80-ci+azdo.14346778
  ##vso[build.updatebuildnumber]10.0.80-ci+azdo.14346778
  Controls.Xaml -> /home/vsts/work/1/s/artifacts/bin/Controls.TestCases.HostApp/Debug/net10.0-android/Microsoft.Maui.Controls.Xaml.dll
  Controls.Maps -> /home/vsts/work/1/s/artifacts/bin/Controls.TestCases.HostApp/Debug/net10.0-android/Microsoft.Maui.Controls.Maps.dll
  Microsoft.AspNetCore.Components.WebView.Maui -> /home/vsts/work/1/s/artifacts/bin/Controls.TestCases.HostApp/Debug/net10.0-android/Microsoft.AspNetCore.Components.WebView.Maui.dll
  Controls.Foldable -> /home/vsts/work/1/s/artifacts/bin/Controls.TestCases.HostApp/Debug/net10.0-android/Microsoft.Maui.Controls.Foldable.dll

Build succeeded.
    0 Warning(s)
    0 Error(s)

Time Elapsed 00:06:36.32
Broadcasting: Intent { act=android.intent.action.CLOSE_SYSTEM_DIALOGS flg=0x400000 }
Broadcast completed: result=0
  Determining projects to restore...
  All projects are up-to-date for restore.
  ##vso[build.updatebuildnumber]10.0.80-ci+azdo.14346778
  Graphics -> /home/vsts/work/1/s/artifacts/bin/Graphics/Debug/net10.0/Microsoft.Maui.Graphics.dll
  ##vso[build.updatebuildnumber]10.0.80-ci+azdo.14346778
  Essentials -> /home/vsts/work/1/s/artifacts/bin/Essentials/Debug/net10.0/Microsoft.Maui.Essentials.dll
  Controls.CustomAttributes -> /home/vsts/work/1/s/artifacts/bin/Controls.CustomAttributes/Debug/net10.0/Controls.CustomAttributes.dll
  ##vso[build.updatebuildnumber]10.0.80-ci+azdo.14346778
  Core -> /home/vsts/work/1/s/artifacts/bin/Core/Debug/net10.0/Microsoft.Maui.dll
  Controls.BindingSourceGen -> /home/vsts/work/1/s/artifacts/bin/Controls.BindingSourceGen/Debug/netstandard2.0/Microsoft.Maui.Controls.BindingSourceGen.dll
  ##vso[build.updatebuildnumber]10.0.80-ci+azdo.14346778
  Controls.Core -> /home/vsts/work/1/s/artifacts/bin/Controls.Core/Debug/net10.0/Microsoft.Maui.Controls.dll
  UITest.Core -> /home/vsts/work/1/s/artifacts/bin/UITest.Core/Debug/net10.0/UITest.Core.dll
  UITest.Appium -> /home/vsts/work/1/s/artifacts/bin/UITest.Appium/Debug/net10.0/UITest.Appium.dll
  UITest.NUnit -> /home/vsts/work/1/s/artifacts/bin/UITest.NUnit/Debug/net10.0/UITest.NUnit.dll
  VisualTestUtils -> /home/vsts/work/1/s/artifacts/bin/VisualTestUtils/Debug/netstandard2.0/VisualTestUtils.dll
  VisualTestUtils.MagickNet -> /home/vsts/work/1/s/artifacts/bin/VisualTestUtils.MagickNet/Debug/netstandard2.0/VisualTestUtils.MagickNet.dll
  UITest.Analyzers -> /home/vsts/work/1/s/artifacts/bin/UITest.Analyzers/Debug/netstandard2.0/UITest.Analyzers.dll
  Controls.TestCases.Android.Tests -> /home/vsts/work/1/s/artifacts/bin/Controls.TestCases.Android.Tests/Debug/net10.0/Controls.TestCases.Android.Tests.dll
Test run for /home/vsts/work/1/s/artifacts/bin/Controls.TestCases.Android.Tests/Debug/net10.0/Controls.TestCases.Android.Tests.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.
[xUnit.net 00:00:00.00] xUnit.net VSTest Adapter v2.8.2+699d445a1a (64-bit .NET 10.0.0)
[xUnit.net 00:00:00.12]   Discovering: Controls.TestCases.Android.Tests
[xUnit.net 00:00:00.33]   Discovered:  Controls.TestCases.Android.Tests
NUnit Adapter 4.5.0.0: Test execution started
Running selected tests in /home/vsts/work/1/s/artifacts/bin/Controls.TestCases.Android.Tests/Debug/net10.0/Controls.TestCases.Android.Tests.dll
   NUnit3TestExecutor discovered 1 of 1 NUnit test cases using Current Discovery mode, Non-Explicit run
>>>>> 06/11/2026 12:33:09 FixtureSetup for Issue33510(Android)
>>>>> 06/11/2026 12:33:10 PullToRefreshShouldNotTriggerWhenWebViewIsScrolledDown Start
>>>>> 06/11/2026 12:33:19 PullToRefreshShouldNotTriggerWhenWebViewIsScrolledDown Stop
  Passed PullToRefreshShouldNotTriggerWhenWebViewIsScrolledDown [9 s]
NUnit Adapter 4.5.0.0: Test execution complete
Results File: /home/vsts/work/1/s/CustomAgentLogsTmp/UITests/TestResults/Issue33510.trx

Test Run Successful.
Total tests: 1
     Passed: 1
 Total time: 21.5610 Seconds
>>> TRX_RESULT_FILE: /home/vsts/work/1/s/CustomAgentLogsTmp/UITests/TestResults/Issue33510.trx

📁 Fix files reverted (7 files)
  • eng/pipelines/ci-copilot.yml
  • src/Core/src/Platform/Android/MauiHybridWebView.cs
  • src/Core/src/Platform/Android/MauiHybridWebViewClient.cs
  • src/Core/src/Platform/Android/MauiSwipeRefreshLayout.cs
  • src/Core/src/Platform/Android/MauiWebView.cs
  • src/Core/src/Platform/Android/MauiWebViewClient.cs
  • src/Core/src/PublicAPI/net-android/PublicAPI.Unshipped.txt

New files (not reverted):

  • src/Core/src/Platform/Android/RefreshViewWebViewScrollCapture.cs

UI Tests — RefreshView,ViewBaseTests

Detected UI test categories: RefreshView,ViewBaseTests

Deep UI tests — 158 passed, 0 failed across 2 categories on platform-pool agent (replaces in-process counts above).

🧪 UI Test Execution Results (deep, platform pool)

Category Tests Snapshot diffs
RefreshView 40/40 ✓
ViewBaseTests 118/119 ✓
📎 Download drop-deep-uitests artifact (TRX + snapshot diffs)

Pre-Flight — Context & Validation

Issue: #35572 - [inflight regression] Android RefreshView incorrectly refreshes when pulling inside a pre-scrolled WebView internal scroll container
PR: #35633 - [Android] Fix for Android RefreshView incorrectly triggering pull-to-refresh when scrolling inside WebView or HybridWebView on cold-start
Platforms Affected: Android
Files Changed: 6 implementation, 3 test

Key Findings

  • The bug is Android-only and involves RefreshView wrapping WebView/HybridWebView content with an internal HTML scroller that is already scrolled down; RefreshView refreshes before that inner scroller reaches the top.
  • PR fix registers mauiRefreshViewHost in MauiWebView/MauiHybridWebView constructors so Android exposes the JS bridge before cold-start page load, injects the observer only while hosted in MauiSwipeRefreshLayout, and adds touch interception ownership in MauiSwipeRefreshLayout.
  • Gate artifact already reports PASS: without fix, WebView_HasScrollCaptureBridge_AfterConstruction and Issue33510 fail; with fix, both pass. Gate verification was not re-run.
  • Prior inline review concerns covered transient detach/re-attach bridge loss, MOVE fallback when JS had not reported state, and UI test assertion timing. Current revision adds deferred detach, MOVE fallback, and a revised test path; latest code-review found no actionable code issues.
  • Impacted UI categories recorded by prior detection: RefreshView, ViewBaseTests.

Code Review Summary

Verdict: NEEDS_DISCUSSION
Confidence: medium
Errors: 0 | Warnings: 0 | Suggestions: 0

Key code review findings:

  • No new concrete code findings from the independent code-review sub-agent; inline-findings.json is [].
  • Devil's advocate note: Android WebView lifecycle remains subtle and CI status should be classified before merge readiness.

Fix Candidates

# Source Approach Test Result Files Changed Notes
PR PR #35633 Pre-register JS bridge in WebView/HybridWebView constructors; inject observer for WebViews inside RefreshView; cache WebView touch ownership and retain bridge through transient detach. ✅ PASSED (Gate) MauiWebView.cs, MauiHybridWebView.cs, MauiWebViewClient.cs, MauiHybridWebViewClient.cs, MauiSwipeRefreshLayout.cs, RefreshViewWebViewScrollCapture.cs, tests/PublicAPI Original PR

Code Review — Deep Analysis

Code Review — PR #35633

Independent Assessment

What this changes: Adds Android RefreshView/WebView scroll-state capture via a pre-registered JS bridge, lifecycle detach handling, gesture arbitration, and regression coverage.
Inferred motivation: Prevent RefreshView from intercepting pull gestures while WebView/HybridWebView internal HTML content can still scroll upward, especially during cold-start/root page loading.

Reconciliation with PR Narrative

Author claims: Bridge registration was too late for cold-start pages; constructor registration plus scoped observer injection fixes it.
Agreement/disagreement: Code matches the claimed root cause and approach. Existing review concerns about transient detach and MOVE fallback appear addressed.

Findings

No new concrete code findings. Expert reviewer returned no inline findings; inline-findings.json was written as [].

Devil's Advocate

The Android WebView lifecycle is subtle, and I cannot empirically verify cold-start/Shell transition behavior here. CI is currently red (Build Analysis, maui-pr-uitests, maui-pr-devicetests), so this should not be treated as ready until failures are resolved or classified unrelated.

Verdict: NEEDS_DISCUSSION

Confidence: medium
Summary: Code review found no actionable code issues, but failing CI prevents LGTM under the skill rules. Human/CI follow-up is needed before merge readiness.


Fix — Analysis & Comparison

Fix Candidates

# Source Approach Test Result Files Changed Notes
1 maui-expert-reviewer Native WebView gesture ownership in MauiSwipeRefreshLayout; no JS bridge reliance. ❌ FAIL 2 files Failed WebView_HasScrollCaptureBridge_AfterConstruction; abandoning constructor bridge cannot satisfy cold-start gate.
2 maui-expert-reviewer Constructor bridge plus JS-driven transient CanChildScrollUp() block on nearest MauiSwipeRefreshLayout; no parent OnInterceptTouchEvent gesture state. ✅ PASS 7 files Passed device WebView and UI Issue33510, but not clearly better than PR due async JS-to-parent state, stale-block, multi-WebView, and cancellation risks.
3 maui-expert-reviewer Constructor bridge plus child-owned DOM gesture gate using RequestDisallowInterceptTouchEvent from bridge callbacks; no parent OnInterceptTouchEvent state or parent scroll block. ✅ PASS 7 files Passed device WebView and UI Issue33510, but not clearly better than PR due JS timing and ancestor-intercept fragility.
PR PR #35633 Constructor bridge, scoped observer injection, deferred detach for transient reattach, and MauiSwipeRefreshLayout.OnInterceptTouchEvent ownership using cached JS/native scroll state. ✅ PASSED (Gate) 10 files Original PR; remains selected because it passes gate and has fewer timing-sensitive JS-to-parent interactions than passing alternatives.

Cross-Pollination

Model Round New Ideas? Details
maui-expert-reviewer 1 Yes Native-only parent gesture ownership; learned it cannot satisfy constructor bridge gate.
maui-expert-reviewer 2 Yes JS-driven parent CanChildScrollUp() block; passed tests but introduced parent stale-state risks.
maui-expert-reviewer 3 Yes Child-owned DOM RequestDisallowInterceptTouchEvent gate; passed tests but introduced JS timing/ancestor propagation risks.
maui-expert-reviewer 4 No Meaningfully different approaches were exhausted: native-only fails gate; two JS-driven alternatives pass tests but are not demonstrably better than the PR's native parent-intercept state machine.

Exhausted: Yes
Selected Fix: PR's fix — It already passed the gate, and the passing alternatives are not demonstrably better. Candidate 2 and 3 validate that other strategies can satisfy current tests, but both move more correctness into asynchronous JavaScript gesture callbacks and add stale-state/timing risks that the PR's native interception path avoids.

Attempt Details

  • try-fix-1/content.md: native-only approach, failed device gate.
  • try-fix-2/content.md: JS-driven CanChildScrollUp() gate, passed device and UI tests, not selected.
  • try-fix-3/content.md: child-owned DOM gesture gate, passed device and UI tests, not selected.

Report — Final Recommendation

Comparative Fix Report — PR #35633

Candidates compared

Rank Candidate Test result Assessment
1 pr ✅ Passed gate Best candidate. It fixes constructor-time JS bridge registration, scopes observer injection to RefreshView hosting, preserves the bridge through transient detach/re-attach, and handles gesture ownership in native MauiSwipeRefreshLayout state.
2 pr-plus-reviewer ✅ Passed gate Equivalent to pr. Expert review produced no actionable inline findings, so no sandbox changes were applied; ranked immediately after pr only to make the single selected winner explicit.
3 try-fix-3 ✅ Passed device WebView and Issue33510 UI tests Functionally viable in the tested scenarios, but more fragile than the PR because it relies on JS touch timing and RequestDisallowInterceptTouchEvent propagation across ancestors for gesture ownership.
4 try-fix-2 ✅ Passed device WebView and Issue33510 UI tests Functionally viable in the tested scenarios, but less desirable than the PR because asynchronous JS callbacks mutate parent RefreshView suppression state and introduce stale-state, multi-WebView, detach, and cancellation risks.
5 try-fix-1 ❌ Failed regression tests Ranked last because it failed WebView_HasScrollCaptureBridge_AfterConstruction; candidates that fail regression tests must rank below candidates that pass.

Comparative analysis

try-fix-1 is eliminated because it failed the regression gate. Its native-only gesture ownership idea could prevent some parent interception, but it abandoned constructor-time JS bridge registration and therefore does not satisfy the cold-start requirement.

try-fix-2 and try-fix-3 both pass the recorded Android regression tests, but each shifts more correctness into asynchronous JavaScript-to-native gesture callbacks. try-fix-2 blocks CanChildScrollUp() via parent state, which creates additional stale-block and multi-WebView edge cases. try-fix-3 lets the DOM observer call RequestDisallowInterceptTouchEvent, which is more sensitive to early MOVE events, cancellation, multi-touch, and ancestor propagation.

The PR fix passes the gate while keeping the crucial constructor bridge registration and using a native parent-intercept state machine for gesture ownership. The expert reviewer found no actionable issues, making pr-plus-reviewer identical to pr; because there is no diff between the top two candidates, the raw PR candidate is selected as the winner.

Winner

Selected candidate: pr

The PR is the single winning candidate because it passed the regression gate, has no actionable expert-review findings, and is less timing-sensitive than the passing try-fix alternatives.


Future Action — review latest findings

No alternative fix was selected for this run. Review the session findings and CI results before merging.

@kubaflo

kubaflo commented Jun 11, 2026

Copy link
Copy Markdown
Contributor

/review tests

@github-actions

Copy link
Copy Markdown
Contributor

Tests Failure Analysis

@BagavathiPerumal — test-failure review results are available based on commit 3baf2c6.
To request a fresh review after new comments, commits, or CI runs, comment /review tests.

Overall Likely unrelated Failures 3 Platform windows, macos

Test Failure Review: Likely unrelated - click to expand

Overall verdict: Likely unrelated

All three distinct failures are on Windows and macOS platforms; this PR changes only Android code. Both maui-pr-devicetests and maui-pr-uitests have been failing on main continuously (5 consecutive failures each), confirming pre-existing infrastructure instability rather than regressions introduced by this PR.

Failure Verdict Evidence
maui-pr-devicetests — Run DeviceTests Windows Likely unrelated Helix work items Controls.DeviceTests-packaged and Controls.DeviceTests-unpackaged failed on windows.11.amd64.client.open (job 97b5145c). PR touches only Android files; all Android, iOS, and Mac device tests passed. Main branch builds 1459940, 1455022, 1454817, 1451776, 1448204 all failed for the same definition.
maui-pr-uitests — macOS UITests Controls CollectionView Likely unrelated Job cancelled after exceeding 180-minute limit on agent Azure Pipelines 180. PR does not touch CollectionView. Main branch builds 1455207, 1454908, 1451775, 1448203, 1446888 all failed for the same definition.
maui-pr-uitests — macOS UITests Controls Shell Likely unrelated Job cancelled after exceeding 180-minute limit on agent Azure Pipelines 188; test results published (run 4030123) show 1 non-flaky failure but PR changes no Shell code. Same pre-existing base-branch failure pattern.

Recommended action

No action needed on the PR side. The Windows device test and macOS UI test failures are pre-existing on main; the primary maui-pr build passed and all Android-platform test jobs succeeded.

Evidence details

PR scope: 10 files changed, all in src/Core/src/Platform/Android/ and Android-specific test files. Labels: platform/android, area-controls-refreshview. Primary build (maui-pr, build 1455512) passed.

Windows device tests (build 1455950):

  • Helix job 97b5145c-2d23-4d1e-928d-67d525474ef7 on windows.11.amd64.client.open completed with 13 work items; work items Controls.DeviceTests-packaged and Controls.DeviceTests-unpackaged reported as failed.
  • Helix console log returned 404 (unavailable); specific test names within those work items could not be confirmed.
  • All other device test stages (Android CoreCLR, Android Mono, iOS Mono, MacCatalyst Mono) passed.
  • Recent maui-pr-devicetests main-branch builds: all failed (1459940 on 2026-06-11, 1455022 on 2026-06-08, 1454817 on 2026-06-08, 1451776 on 2026-06-08, 1448204 on 2026-06-03).

macOS UI test timeouts (build 1455949):

  • macOS UITests Controls CollectionView: job timeout after 180 minutes (Azure Pipelines 180).
  • macOS UITests Controls Shell: job timeout after 180 minutes (Azure Pipelines 188); Publish the mac_ui_tests_controls test results task reports 272 results published (test run 4030123) with 1 non-flaky failure, but specific test name not extractable without authenticated AzDO test API access.
  • Android, iOS, and WinUI UI test jobs all passed.
  • Recent maui-pr-uitests main-branch builds: all failed (1455207 on 2026-06-09, 1454908 on 2026-06-09, 1451775 on 2026-06-08, 1448203 on 2026-06-04, 1446888 on 2026-06-03).

Limitations: No AzDO bearer token was available; authenticated _apis/test queries were skipped. The specific failing test names within the macOS Shell run and the Windows Helix work items could not be confirmed without authenticated access. Build Analysis check is derivative of the above failures.

@kubaflo kubaflo changed the base branch from main to inflight/current June 11, 2026 19:48

@kubaflo kubaflo left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Can you please resolve conflicts?

…ure for MauiWebView and MauiHybridWebView by moving Attach to constructor, detaching bridge for standalone WebViews, adding IsInsideMauiSwipeRefreshLayout guard in OnPageFinished, and adding constructor bridge attachment device test.
@BagavathiPerumal

Copy link
Copy Markdown
Contributor Author

Can you please resolve conflicts?

@kubaflo, I have resolved the merge conflict on this PR.

@kubaflo kubaflo merged commit 364b36b into dotnet:inflight/current Jun 12, 2026
2 of 11 checks passed
@github-actions github-actions Bot added this to the .NET 10 SR9 milestone Jun 12, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area-controls-refreshview RefreshView community ✨ Community Contribution partner/syncfusion Issues / PR's with Syncfusion collaboration platform/android s/agent-fix-pr-picked AI could not beat the PR fix - PR is the best among all candidates s/agent-review-in-progress AI review is currently running for this PR s/agent-reviewed PR was reviewed by AI agent workflow (full 4-phase review)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[inflight regression] Android RefreshView incorrectly refreshes when pulling inside a pre-scrolled WebView internal scroll container

5 participants