From e904e900dfc61ae7e89a9602ae9424094bd35440 Mon Sep 17 00:00:00 2001 From: Shane Neuville <5375137+PureWeen@users.noreply.github.com> Date: Tue, 2 Jun 2026 16:26:42 -0500 Subject: [PATCH 01/11] ci: skip provision AVD creation in ci-copilot.yml (inline script owns it) (#35714) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit > [!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](https://github.com/dotnet/maui/wiki/Testing-PR-Builds) from this PR and let us know in a comment if this change resolves your issue. Thank you! Follow-up to @kubaflo's review on #35687. ## What In `eng/pipelines/ci-copilot.yml`, when `parameters.Platform == 'android'`, the Android AVD was being created twice: 1. **First**, via `common/provision.yml` running the `ProvisionAndroidSdkAvdCreateAvds` MSBuild target — because `skipAndroidCreateAvds: ${{ ne(parameters.Platform, 'android') }}` evaluated to `false` for Android. That target invokes `dotnet android avd create --name "Emulator_30" … --force`. 2. **Then**, the inline `Create AVD and boot Android Emulator` script ran `avdmanager create avd -n Emulator_30 -k "system-images;android-30;google_apis_playstore;x86_64" --device "Nexus 5X" --force`. Both create the same AVD name with `--force`, so the second silently overwrites the first — no error, just ~30–60s wasted on every Copilot review pipeline run for Android. The inline script is the canonical source of truth: it pins the `google_apis_playstore` image variant, the `Nexus 5X` device profile, the `disk.dataPartition.size=2048m` shrink, and ADB key pre-auth. None of those are applied by `ProvisionAndroidSdkAvdCreateAvds`. So the right fix is to skip the provision step entirely and let the inline script own AVD creation. ## Change Pinned `skipAndroidCreateAvds: true` (with an explanatory comment) at both call sites of `common/provision.yml` in `ci-copilot.yml` (the ReviewPR stage and the Deep stage). The inline `avdmanager` blocks are untouched. This is the AVD-creation portion of #35376 being reverted — the inline script that same PR added already handles AVD creation, so the provision-step AVD creation was redundant. ## Scope This change is scoped to **`ci-copilot.yml`** only — the Copilot review pipeline. It does **not** touch the required gating pipelines: - `maui-pr` - `maui-pr-devicetests` - `maui-pr-uitests` ## Follow-up Needs to be ported to `net11.0` afterward via the automated `merge/main-to-net11.0` flow. Co-authored-by: bot Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- eng/pipelines/ci-copilot.yml | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/eng/pipelines/ci-copilot.yml b/eng/pipelines/ci-copilot.yml index ebce013b91ea..8ee93ed66321 100644 --- a/eng/pipelines/ci-copilot.yml +++ b/eng/pipelines/ci-copilot.yml @@ -124,7 +124,10 @@ stages: skipAndroidPlatformApis: true onlyAndroidPlatformDefaultApis: true skipAndroidEmulatorImages: ${{ ne(parameters.Platform, 'android') }} - skipAndroidCreateAvds: ${{ ne(parameters.Platform, 'android') }} + # AVD is created by the inline 'Create AVD and boot Android Emulator' script below + # with specific config (playstore image variant, partition shrink, ADB key pre-auth) + # that ProvisionAndroidSdkAvdCreateAvds doesn't replicate. + skipAndroidCreateAvds: true androidEmulatorApiLevel: '30' skipSimulatorSetup: ${{ or(eq(parameters.Platform, 'android'), eq(parameters.Platform, 'windows'), eq(parameters.Platform, 'catalyst')) }} skipCertificates: true @@ -871,7 +874,10 @@ stages: skipAndroidPlatformApis: true onlyAndroidPlatformDefaultApis: true skipAndroidEmulatorImages: ${{ ne(parameters.Platform, 'android') }} - skipAndroidCreateAvds: ${{ ne(parameters.Platform, 'android') }} + # AVD is created by the inline 'Create AVD and boot Android Emulator' script below + # with specific config (playstore image variant, partition shrink, ADB key pre-auth) + # that ProvisionAndroidSdkAvdCreateAvds doesn't replicate. + skipAndroidCreateAvds: true androidEmulatorApiLevel: '30' skipSimulatorSetup: ${{ or(eq(parameters.Platform, 'android'), eq(parameters.Platform, 'windows'), eq(parameters.Platform, 'catalyst')) }} skipCertificates: true From 45e2a4d7c134acae687cc38d9bac300f43df59e2 Mon Sep 17 00:00:00 2001 From: Shane Neuville <5375137+PureWeen@users.noreply.github.com> Date: Wed, 3 Jun 2026 11:46:06 -0500 Subject: [PATCH 02/11] Stop PR Review Queue workflow from running on forks and @-pinging PR authors (#35751) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit > [!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](https://github.com/dotnet/maui/wiki/Testing-PR-Builds) from this PR and let us know in a comment if this change resolves your issue. Thank you! ## Problem Two issues with the daily "PR Review Queue" automation: ### 1. Workflow runs in forks and creates duplicate tracking issues `.github/workflows/pr-review-queue.yml` had no fork guard, so the daily scheduled run (`cron: "0 8 * * 1-5"`) was firing in active forks of dotnet/maui as well as in upstream. The `gh issue create --repo ${{ github.repository }}` step targets the running repo, so each fork ended up with its own `[PR Review Queue]` issue alongside the legitimate dotnet/maui one — e.g. `PureWeen/maui#105` and `dotnet/maui#35732` for the same day, both pinging the fork owner. ### 2. Every PR author gets @-mentioned daily The markdown table emitted each PR author handle as a raw `@username`, which GitHub parses as a real mention. Each daily run created a new issue and notified every PR author — community contributors, partner devs, bots — even though the issue is purely an internal MAUI-team triage artifact. ## Changes **`.github/workflows/pr-review-queue.yml`** — Add the same `github.repository_owner == 'dotnet'` guard already used by 8 other dotnet-owned workflows in this repo (`backport.yml`, `rebase.yml`, `locker.yml`, `dogfood-comment.yml`, `maestro-changelog.yml`, `inclusive-heat-sensor.yml`, `dotnet-format-daily.yml`, `dotnet-autoformat-pr-push.yml`). Applied to both jobs: - `generate-report` — stops the scheduled issue creation on forks. - `validate` — stops fork-internal PRs from spending CI on the dry-run. **`.github/skills/find-reviewable-pr/scripts/query-reviewable-prs.ps1`** — Wrap author handles in backticks (`` `@username` ``) in all four table-row formats. GitHub does not parse mentions inside code spans, so no notifications fire, but the table still reads naturally as a list of author handles. ## Verification - YAML parses cleanly (`python3 -c "import yaml; yaml.safe_load(...)"`). - PowerShell escape verified — `"``@$($pr.Author)``"` renders as `` `@PureWeen` ``. - Existing renderer logic for `$showMilestone` / `$showTurn` variants left intact; only the author cell changed. ## Out of scope Other automation in this repo was checked and is already fork-safe: - The gh-aw `*.lock.yml` files (`agentic-labeler`, `daily-repo-status`, `copilot-evaluate-tests`) and `agentics-maintenance.yml` are auto-generated (`DO NOT EDIT`) and have their own pre-activation role checks. - `review-trigger.yml` is implicitly fork-safe via its actor-permission check. --------- Co-authored-by: bot Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- .../scripts/query-reviewable-prs.ps1 | 12 ++++++++---- .github/workflows/pr-review-queue.yml | 6 ++++-- 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/.github/skills/find-reviewable-pr/scripts/query-reviewable-prs.ps1 b/.github/skills/find-reviewable-pr/scripts/query-reviewable-prs.ps1 index c9fa57bcb647..dfa6b3d4e4d9 100644 --- a/.github/skills/find-reviewable-pr/scripts/query-reviewable-prs.ps1 +++ b/.github/skills/find-reviewable-pr/scripts/query-reviewable-prs.ps1 @@ -1219,14 +1219,18 @@ function Format-Markdown-Output { $title = $rawTitle.Replace('|', '\|') $link = "[#$($pr.Number)]($($pr.URL))" $turnCol = "$($pr.TurnIcon) $($pr.TurnDetail)" + # Wrap author handles in backticks so GitHub renders them as inline code + # rather than as @mentions — this issue is for MAUI team triage tracking, + # not a notification firehose to every PR author each day. + $author = "``@$($pr.Author)``" if ($showMilestone -and $showTurn) { - [void]$md.AppendLine("| $link | $title | @$($pr.Author) | $($pr.Milestone) | $turnCol | $($pr.Platform) | $($pr.Age)d |") + [void]$md.AppendLine("| $link | $title | $author | $($pr.Milestone) | $turnCol | $($pr.Platform) | $($pr.Age)d |") } elseif ($showMilestone) { - [void]$md.AppendLine("| $link | $title | @$($pr.Author) | $($pr.Milestone) | $($pr.Platform) | $($pr.Age)d | $($pr.Updated)d ago |") + [void]$md.AppendLine("| $link | $title | $author | $($pr.Milestone) | $($pr.Platform) | $($pr.Age)d | $($pr.Updated)d ago |") } elseif ($showTurn) { - [void]$md.AppendLine("| $link | $title | @$($pr.Author) | $turnCol | $($pr.Platform) | $($pr.Age)d |") + [void]$md.AppendLine("| $link | $title | $author | $turnCol | $($pr.Platform) | $($pr.Age)d |") } else { - [void]$md.AppendLine("| $link | $title | @$($pr.Author) | $($pr.Platform) | $($pr.Age)d | $($pr.Updated)d ago |") + [void]$md.AppendLine("| $link | $title | $author | $($pr.Platform) | $($pr.Age)d | $($pr.Updated)d ago |") } } [void]$md.AppendLine("") diff --git a/.github/workflows/pr-review-queue.yml b/.github/workflows/pr-review-queue.yml index f41baf1872a5..4f3f500fa614 100644 --- a/.github/workflows/pr-review-queue.yml +++ b/.github/workflows/pr-review-queue.yml @@ -20,7 +20,9 @@ concurrency: jobs: generate-report: runs-on: ubuntu-latest - if: github.event_name != 'pull_request' + # Guard: only run in dotnet/maui — prevents the scheduled run from firing + # in forks and pinging fork owners with duplicate queue issues. + if: github.repository_owner == 'dotnet' && github.event_name != 'pull_request' permissions: contents: read issues: write @@ -86,7 +88,7 @@ jobs: # Dry-run on PRs: validate the script works without creating issues validate: runs-on: ubuntu-latest - if: github.event_name == 'pull_request' + if: github.repository_owner == 'dotnet' && github.event_name == 'pull_request' permissions: contents: read pull-requests: read From 1221e4d99e68993c76047d63b6b6fe61c9a3faca Mon Sep 17 00:00:00 2001 From: Shane Neuville <5375137+PureWeen@users.noreply.github.com> Date: Wed, 3 Jun 2026 12:20:14 -0500 Subject: [PATCH 03/11] [ci] Set __PWSH_LOGIN_CHECKED to avoid macOS pwsh 'procargs failed' startup crashes (#35724) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit > [!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](https://github.com/dotnet/maui/wiki/Testing-PR-Builds) from this PR and let us know in a comment if this change resolves your issue. Thank you! ## Description PowerShell 7.4.x intermittently crashes at startup on macOS with: ``` Call to 'procargs' failed with errno 5 Unhandled exception. Microsoft.PowerShell.ManagedPSEntry+StartupException at Microsoft.PowerShell.ManagedPSEntry.ThrowOnFailure(String call, Int32 code) at Microsoft.PowerShell.ManagedPSEntry.AttemptExecPwshLogin(String[] args) at Microsoft.PowerShell.ManagedPSEntry.Main(String[] args) ``` This is [PowerShell/PowerShell#20802](https://github.com/PowerShell/PowerShell/issues/20802) — open and untriaged since November 2023, **0 comments, no linked PRs, no fix shipped**. The crash happens in `AttemptExecPwshLogin`, which on macOS calls `sysctl(KERN_PROCARGS2)` to inspect its own `argv[0]` and decide whether pwsh was launched as a login shell. That `sysctl` call races intermittently and returns `errno 5`, aborting startup before pwsh reads any user script. ## Repro / impact Hit on the internal `dotnet-maui` pipeline (definition 1095), build **2990586**, during release-prep for `release/11.0.1xx-preview5`: > `##[section]Starting: Provision Android SDK - Common Packages` → `Call to 'procargs' failed with errno 5` → task fails with exit code `null`. A rerun on a different agent passed, but every macOS `pwsh:` / `PowerShell@2` step in the pipeline is a flake risk going forward. Inventory: ~57 pwsh tasks across 15 pipeline YAMLs, ~45 of them on macOS-eligible jobs. ## Fix PowerShell itself ships a short-circuit for this code path. From [`src/powershell/Program.cs`](https://github.com/PowerShell/PowerShell/blob/master/src/powershell/Program.cs): ```csharp private const string LOGIN_ENV_VAR_NAME = "__PWSH_LOGIN_CHECKED"; if (Environment.GetEnvironmentVariable(LOGIN_ENV_VAR_NAME) != null) { Environment.SetEnvironmentVariable(LOGIN_ENV_VAR_NAME, null); return; // ← skips the racy sysctl(KERN_PROCARGS2) entirely } ``` Setting `__PWSH_LOGIN_CHECKED=1` makes pwsh skip the racy syscall. This PR declares it as a pipeline-level variable in `eng/pipelines/common/variables.yml` (included by every macOS-touching pipeline — `ci.yml`, `ci-official.yml`, `ci-device-tests.yml`, `ci-copilot.yml`, `ci-uitests.yml`, `device-tests.yml`, `ui-tests.yml`, `handlers.yml`, etc.). Per [AzDO docs](https://learn.microsoft.com/azure/devops/pipelines/process/variables), user-defined variables are injected as environment variables for every task — so every `pwsh:` / `PowerShell@2` step in every job inherits it. ## Safety analysis This is safe because: - **CI never wants login-shell semantics.** No `-Login` flag, no leading `-` in `argv[0]`. The skipped code's `IsLogin()` check would have returned `false` and the function would have returned without doing anything visible. We just avoid the broken syscall that precedes that decision. - **The env var is single-use per process.** `AttemptExecPwshLogin` consumes it via `SetEnvironmentVariable(LOGIN_ENV_VAR_NAME, null)`, so nested `pwsh-launches-pwsh` scenarios still work normally (each new task gets a fresh AzDO-injected value). - **Windows is unaffected.** The read is inside a `#if UNIX` block; Windows pwsh ignores the var entirely. Setting it on Windows agents is a no-op. - **Safe even under `-Login`.** If a future step explicitly adds `-Login`, the short-circuit still routes around the broken syscall — the same syscall the login-shell *detection* relies on. So there's no regression even in that (currently nonexistent) use case. ## Empirical validation Verified locally on `pwsh 7.4.5` / macOS 26.5 (same 7.4.x minor as the CI agent that crashed): | Run | Command | Result | | --- | --- | --- | | Control | `pwsh ... -Command 'Write-Output "envvar=[$Env:__PWSH_LOGIN_CHECKED]"'` | `envvar=[]` (var unset; nothing to clear) | | Test | `__PWSH_LOGIN_CHECKED=1 pwsh ... -Command 'Write-Output "envvar=[$Env:__PWSH_LOGIN_CHECKED]"'` | `envvar=[]` ← **proves the short-circuit ran** (the only line that clears the var is inside the skip-path; if it cleared, the racy syscall was never reached) | | Soak | 100 × `__PWSH_LOGIN_CHECKED=1 pwsh ... -Command 'exit 0'` | **0/100 failures**; no behavioral change | ## Backport plan - This PR: `main` (.NET 10 SR dev). Drives the fix into ongoing servicing builds. - Will cherry-pick to `net11.0` afterward (where build 2990586 crashed during preview5 prep). Diff is verified to apply cleanly to both branches. ## Related macOS-agent flakes (out of scope) The same dnceng macOS agent pool has produced other, *unrelated* flakes during this release-prep window (e.g. `IDEDownloadableMetalToolchainCoordinator: Failed to remount` and `iOS 26.2 platform not installed` on builds 2990581 and 2990384). Those are agent-image issues and need agent-side fixes — they're not addressed here. This PR fixes one specific class of macOS flake (pwsh startup race), not all of them. Co-authored-by: bot Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- eng/pipelines/common/variables.yml | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/eng/pipelines/common/variables.yml b/eng/pipelines/common/variables.yml index 8dee742a2525..d878b0ddb12c 100644 --- a/eng/pipelines/common/variables.yml +++ b/eng/pipelines/common/variables.yml @@ -15,6 +15,15 @@ variables: value: 26.0.1 - name: POWERSHELL_VERSION value: 7.4.0 +# Workaround for PowerShell/PowerShell#20802 (open since Nov 2023): +# pwsh 7.4.x intermittently aborts at startup on macOS with +# 'Call to procargs failed with errno 5' +# because AttemptExecPwshLogin() races on sysctl(KERN_PROCARGS2). +# Setting __PWSH_LOGIN_CHECKED makes pwsh short-circuit the login-shell +# detection that triggers the racy syscall (see Program.cs in PowerShell repo). +# Hit on internal dnceng dotnet-maui build 2990586 (release/11.0.1xx-preview5). +- name: __PWSH_LOGIN_CHECKED + value: '1' # Localization variables - name: LocBranchPrefix value: 'loc-hb' From c389325ecfebf1d07b03d9a928ebf921a78670c7 Mon Sep 17 00:00:00 2001 From: Jonathan Peppers Date: Fri, 5 Jun 2026 13:22:53 -0500 Subject: [PATCH 04/11] [HybridWebView] Filter Android `message` events by source (#35717) > [!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](https://github.com/dotnet/maui/wiki/Testing-PR-Builds) from this PR and let us know in a comment if this change resolves your issue. Thank you! ### Description of Change HybridWebView generally expects all hosted code to be local app content, so this is general hardening -- it's just for correctness, not security enforcement. On Android, the JS side subscribes to `window`'s `message` event to receive messages from .NET, but did not check where each event came from. Anything else on the page that calls `window.postMessage` (for example, a nested iframe posting to its parent) would be dispatched through `HybridWebViewMessageReceived` the same as a real native message. Native messages arrive via `WebView.postWebMessage` and produce a `MessageEvent` with `source === null` (no sending window). Only dispatch when that's true; otherwise drop the event and log a warning so unexpected senders are visible during development. This rejects every `window.postMessage` caller, including same-origin iframes, and is the one invariant we can rely on across Android WebView versions. (An earlier revision of this PR also gated on `origin === window.location.origin`. The existing `HybridWebViewTests_SendRawMessage` device test caught that this is wrong on Android: `postWebMessage` events arrive with an empty-string `origin`, not the page origin, so the equality check dropped all real native messages. The origin comparison has been removed.) Windows (WebView2) and iOS/MacCatalyst (WKWebView) use platform-specific channels and are unaffected. ### Issues Fixed N/A --------- Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- .../src/Handlers/HybridWebView/HybridWebView.js | 11 +++++++++++ .../src/Handlers/HybridWebView/HybridWebView.ts | 13 ++++++++++++- 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/src/Core/src/Handlers/HybridWebView/HybridWebView.js b/src/Core/src/Handlers/HybridWebView/HybridWebView.js index e4b9d2330c93..a4acb769e63d 100644 --- a/src/Core/src/Handlers/HybridWebView/HybridWebView.js +++ b/src/Core/src/Handlers/HybridWebView/HybridWebView.js @@ -35,7 +35,18 @@ } else { // Android WebView + // Native -> JS messages are delivered via WebView.postWebMessage. The resulting + // MessageEvent has source === null (no sending window) -- that's the invariant we + // can rely on across WebView versions. Drop any 'message' event whose source is + // a Window (e.g. a nested iframe calling window.parent.postMessage), which would + // otherwise be mistaken for a native message. NOTE: we intentionally do not check + // arg.origin here because Android WebView delivers postWebMessage events with an + // empty-string origin, not window.location.origin. window.addEventListener('message', (arg) => { + if (arg.source !== null) { + console.warn(`HybridWebView: ignored 'message' event from unexpected sender (origin: '${arg.origin}').`); + return; + } dispatchHybridWebViewMessage(arg.data); }); } diff --git a/src/Core/src/Handlers/HybridWebView/HybridWebView.ts b/src/Core/src/Handlers/HybridWebView/HybridWebView.ts index 8c72bfee4b78..0ed4a49bd8a7 100644 --- a/src/Core/src/Handlers/HybridWebView/HybridWebView.ts +++ b/src/Core/src/Handlers/HybridWebView/HybridWebView.ts @@ -87,7 +87,18 @@ interface DotNetInvokeResult { }; } else { // Android WebView - window.addEventListener('message', (arg: any) => { + // Native -> JS messages are delivered via WebView.postWebMessage. The resulting + // MessageEvent has source === null (no sending window) -- that's the invariant we + // can rely on across WebView versions. Drop any 'message' event whose source is + // a Window (e.g. a nested iframe calling window.parent.postMessage), which would + // otherwise be mistaken for a native message. NOTE: we intentionally do not check + // arg.origin here because Android WebView delivers postWebMessage events with an + // empty-string origin, not window.location.origin. + window.addEventListener('message', (arg: MessageEvent) => { + if (arg.source !== null) { + console.warn(`HybridWebView: ignored 'message' event from unexpected sender (origin: '${arg.origin}').`); + return; + } dispatchHybridWebViewMessage(arg.data); }); } From 5ae9e084ab9a20b5f7a5cf24d8d6d02688e893a8 Mon Sep 17 00:00:00 2001 From: NirmalKumarYuvaraj <97871636+NirmalKumarYuvaraj@users.noreply.github.com> Date: Wed, 6 Aug 2025 16:31:51 +0530 Subject: [PATCH 05/11] Fixed ios webview subdirectory ignore issue --- .../TestCases.HostApp/Issues/Issue23315.cs | 39 +++++++++++++++++++ .../Resources/Raw/foo/bar/baz/test.html | 10 +++++ .../Tests/Issues/Issue23315.cs | 20 ++++++++++ .../Handlers/WebView/WebViewHandler.iOS.cs | 8 +++- src/Core/src/Platform/iOS/MauiWKWebView.cs | 8 +++- 5 files changed, 81 insertions(+), 4 deletions(-) create mode 100644 src/Controls/tests/TestCases.HostApp/Issues/Issue23315.cs create mode 100644 src/Controls/tests/TestCases.HostApp/Resources/Raw/foo/bar/baz/test.html create mode 100644 src/Controls/tests/TestCases.Shared.Tests/Tests/Issues/Issue23315.cs diff --git a/src/Controls/tests/TestCases.HostApp/Issues/Issue23315.cs b/src/Controls/tests/TestCases.HostApp/Issues/Issue23315.cs new file mode 100644 index 000000000000..365c6e47c7e7 --- /dev/null +++ b/src/Controls/tests/TestCases.HostApp/Issues/Issue23315.cs @@ -0,0 +1,39 @@ +namespace Maui.Controls.Sample.Issues; + +[Issue(IssueTracker.Github, 23315, "LoadFile in src/Core/src/Platform/iOS/MauiWKWebView.cs ignore directories", PlatformAffected.iOS | PlatformAffected.macOS)] +public class Issue23315 : TestContentPage +{ + public Issue23315() + { + } + + protected override void Init() + { + WebView webView = new WebView + { + Source = "foo/bar/baz/test.html" + }; + + var descriptionLabel = new Label + { + Text = "This test verifies that the WebView can load files from subdirectories correctly. If you see a blank screen, it means the test has failed.", + AutomationId = "DescriptionLabel", + HorizontalOptions = LayoutOptions.Center, + VerticalOptions = LayoutOptions.CenterAndExpand + }; + + var grid = new Grid + { + RowDefinitions = + { + new RowDefinition(), + new RowDefinition { Height = 300 } + } + }; + + grid.Add(webView, 0, 0); + grid.Add(descriptionLabel, 0, 1); + + Content = grid; + } +} \ No newline at end of file diff --git a/src/Controls/tests/TestCases.HostApp/Resources/Raw/foo/bar/baz/test.html b/src/Controls/tests/TestCases.HostApp/Resources/Raw/foo/bar/baz/test.html new file mode 100644 index 000000000000..a9a7f159cfbb --- /dev/null +++ b/src/Controls/tests/TestCases.HostApp/Resources/Raw/foo/bar/baz/test.html @@ -0,0 +1,10 @@ + + + + Nested Subdirectory Test File + + +

Nested Subdirectory Test File

+

This is test.html from the foo/bar/baz nested subdirectories.

+ + diff --git a/src/Controls/tests/TestCases.Shared.Tests/Tests/Issues/Issue23315.cs b/src/Controls/tests/TestCases.Shared.Tests/Tests/Issues/Issue23315.cs new file mode 100644 index 000000000000..3ef4a9ca2377 --- /dev/null +++ b/src/Controls/tests/TestCases.Shared.Tests/Tests/Issues/Issue23315.cs @@ -0,0 +1,20 @@ +using NUnit.Framework; +using UITest.Appium; +using UITest.Core; + +namespace Microsoft.Maui.TestCases.Tests.Issues +{ + public class Issue23315(TestDevice device) : _IssuesUITest(device) + { + public override string Issue => "LoadFile in src/Core/src/Platform/iOS/MauiWKWebView.cs ignore directories"; + + [Test] + [Category(UITestCategories.WebView)] + public void WebViewCanLoadFileFromSubdirectory() + { + App.WaitForElement("DescriptionLabel"); + Thread.Sleep(1000); // Allow time for the UI to settle before taking a screenshot + VerifyScreenshot(); + } + } +} diff --git a/src/Core/src/Handlers/WebView/WebViewHandler.iOS.cs b/src/Core/src/Handlers/WebView/WebViewHandler.iOS.cs index ddc3c99a0d83..db08a4ab8e0b 100644 --- a/src/Core/src/Handlers/WebView/WebViewHandler.iOS.cs +++ b/src/Core/src/Handlers/WebView/WebViewHandler.iOS.cs @@ -523,10 +523,14 @@ bool LoadFile(string url) { var file = Path.GetFileNameWithoutExtension(url); var ext = Path.GetExtension(url); + var directory = Path.GetDirectoryName(url); - var nsUrl = NSBundle.MainBundle.GetUrlForResource(file, ext); + // // If there's a subdirectory, use the overload that accepts a subdirectory parameter else fallback to the original method if subdirectory method fails or if no subdirectory + NSUrl? nsUrl = string.IsNullOrEmpty(directory) + ? NSBundle.MainBundle.GetUrlForResource(file, ext, directory) + : NSBundle.MainBundle.GetUrlForResource(file, ext); - if (nsUrl == null) + if (nsUrl is null) { return false; } diff --git a/src/Core/src/Platform/iOS/MauiWKWebView.cs b/src/Core/src/Platform/iOS/MauiWKWebView.cs index 149924163e6b..52bf1a233e7d 100644 --- a/src/Core/src/Platform/iOS/MauiWKWebView.cs +++ b/src/Core/src/Platform/iOS/MauiWKWebView.cs @@ -186,10 +186,14 @@ bool LoadFile(string url) { var file = Path.GetFileNameWithoutExtension(url); var ext = Path.GetExtension(url); + var directory = Path.GetDirectoryName(url); - var nsUrl = NSBundle.MainBundle.GetUrlForResource(file, ext); + // If there's a subdirectory, use the overload that accepts a subdirectory parameter else fallback to the original method if subdirectory method fails or if no subdirectory + NSUrl? nsUrl = string.IsNullOrEmpty(directory) + ? NSBundle.MainBundle.GetUrlForResource(file, ext) + : NSBundle.MainBundle.GetUrlForResource(file, ext, directory); - if (nsUrl == null) + if (nsUrl is null) { return false; } From 039eaaa65337307b91d9c6b1ec2228140ab6b56b Mon Sep 17 00:00:00 2001 From: NirmalKumarYuvaraj <97871636+NirmalKumarYuvaraj@users.noreply.github.com> Date: Wed, 6 Aug 2025 16:52:25 +0530 Subject: [PATCH 06/11] added snapshots --- .../WebViewCanLoadFileFromSubdirectory.png | Bin 0 -> 33970 bytes .../Tests/Issues/Issue23315.cs | 3 +-- .../ios/WebViewCanLoadFileFromSubdirectory.png | Bin 0 -> 33352 bytes 3 files changed, 1 insertion(+), 2 deletions(-) create mode 100644 src/Controls/tests/TestCases.Android.Tests/snapshots/android/WebViewCanLoadFileFromSubdirectory.png create mode 100644 src/Controls/tests/TestCases.iOS.Tests/snapshots/ios/WebViewCanLoadFileFromSubdirectory.png diff --git a/src/Controls/tests/TestCases.Android.Tests/snapshots/android/WebViewCanLoadFileFromSubdirectory.png b/src/Controls/tests/TestCases.Android.Tests/snapshots/android/WebViewCanLoadFileFromSubdirectory.png new file mode 100644 index 0000000000000000000000000000000000000000..3712e2d015bb333e92283ca4a72e76f2102bd8b6 GIT binary patch literal 33970 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≪MC50tURh+odlq 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 literal 0 HcmV?d00001 diff --git a/src/Controls/tests/TestCases.Shared.Tests/Tests/Issues/Issue23315.cs b/src/Controls/tests/TestCases.Shared.Tests/Tests/Issues/Issue23315.cs index 3ef4a9ca2377..0904bff95206 100644 --- a/src/Controls/tests/TestCases.Shared.Tests/Tests/Issues/Issue23315.cs +++ b/src/Controls/tests/TestCases.Shared.Tests/Tests/Issues/Issue23315.cs @@ -12,8 +12,7 @@ public class Issue23315(TestDevice device) : _IssuesUITest(device) [Category(UITestCategories.WebView)] public void WebViewCanLoadFileFromSubdirectory() { - App.WaitForElement("DescriptionLabel"); - Thread.Sleep(1000); // Allow time for the UI to settle before taking a screenshot + App.WaitForElement("DescriptionLabel", timeout: TimeSpan.FromSeconds(3)); VerifyScreenshot(); } } diff --git a/src/Controls/tests/TestCases.iOS.Tests/snapshots/ios/WebViewCanLoadFileFromSubdirectory.png b/src/Controls/tests/TestCases.iOS.Tests/snapshots/ios/WebViewCanLoadFileFromSubdirectory.png new file mode 100644 index 0000000000000000000000000000000000000000..5c9112801e9347d15a3d92c940abb13f64a68e29 GIT binary patch literal 33352 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 literal 0 HcmV?d00001 From b962a7d66d42e693bd8f7dfaa57d70f2b1decca1 Mon Sep 17 00:00:00 2001 From: NirmalKumarYuvaraj <97871636+NirmalKumarYuvaraj@users.noreply.github.com> Date: Fri, 8 Aug 2025 09:33:16 +0530 Subject: [PATCH 07/11] minor changes --- src/Core/src/Handlers/WebView/WebViewHandler.iOS.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Core/src/Handlers/WebView/WebViewHandler.iOS.cs b/src/Core/src/Handlers/WebView/WebViewHandler.iOS.cs index db08a4ab8e0b..166e4aec40a6 100644 --- a/src/Core/src/Handlers/WebView/WebViewHandler.iOS.cs +++ b/src/Core/src/Handlers/WebView/WebViewHandler.iOS.cs @@ -527,8 +527,8 @@ bool LoadFile(string url) // // If there's a subdirectory, use the overload that accepts a subdirectory parameter else fallback to the original method if subdirectory method fails or if no subdirectory NSUrl? nsUrl = string.IsNullOrEmpty(directory) - ? NSBundle.MainBundle.GetUrlForResource(file, ext, directory) - : NSBundle.MainBundle.GetUrlForResource(file, ext); + ? NSBundle.MainBundle.GetUrlForResource(file, ext) + : NSBundle.MainBundle.GetUrlForResource(file, ext, directory); if (nsUrl is null) { From 783c8958309396457ae0acf0fda1879344346d1e Mon Sep 17 00:00:00 2001 From: NirmalKumarYuvaraj <97871636+NirmalKumarYuvaraj@users.noreply.github.com> Date: Mon, 13 Oct 2025 10:13:22 +0530 Subject: [PATCH 08/11] Added common helper --- .../Handlers/WebView/WebViewHandler.iOS.cs | 26 ++----------- src/Core/src/Platform/iOS/MauiWKWebView.cs | 30 ++------------ .../src/Platform/iOS/WebViewExtensions.cs | 39 +++++++++++++++++++ 3 files changed, 46 insertions(+), 49 deletions(-) diff --git a/src/Core/src/Handlers/WebView/WebViewHandler.iOS.cs b/src/Core/src/Handlers/WebView/WebViewHandler.iOS.cs index 166e4aec40a6..6145159d251a 100644 --- a/src/Core/src/Handlers/WebView/WebViewHandler.iOS.cs +++ b/src/Core/src/Handlers/WebView/WebViewHandler.iOS.cs @@ -519,32 +519,12 @@ static string GetCookieString(List existingCookies) bool LoadFile(string url) { - try + if (PlatformView is null) { - var file = Path.GetFileNameWithoutExtension(url); - var ext = Path.GetExtension(url); - var directory = Path.GetDirectoryName(url); - - // // If there's a subdirectory, use the overload that accepts a subdirectory parameter else fallback to the original method if subdirectory method fails or if no subdirectory - NSUrl? nsUrl = string.IsNullOrEmpty(directory) - ? NSBundle.MainBundle.GetUrlForResource(file, ext) - : NSBundle.MainBundle.GetUrlForResource(file, ext, directory); - - if (nsUrl is null) - { - return false; - } - - PlatformView?.LoadFileUrl(nsUrl, nsUrl); - - return true; - } - catch (Exception) - { - MauiContext?.CreateLogger()?.LogWarning("Could not load {url} as local file", url); + return false; } - return false; + return PlatformView.LoadFile(url, MauiContext?.CreateLogger()); } public static void MapEvaluateJavaScriptAsync(IWebViewHandler handler, IWebView webView, object? arg) diff --git a/src/Core/src/Platform/iOS/MauiWKWebView.cs b/src/Core/src/Platform/iOS/MauiWKWebView.cs index 52bf1a233e7d..8dc542188823 100644 --- a/src/Core/src/Platform/iOS/MauiWKWebView.cs +++ b/src/Core/src/Platform/iOS/MauiWKWebView.cs @@ -182,33 +182,11 @@ public static WKWebViewConfiguration CreateConfiguration() bool LoadFile(string url) { - try - { - var file = Path.GetFileNameWithoutExtension(url); - var ext = Path.GetExtension(url); - var directory = Path.GetDirectoryName(url); - - // If there's a subdirectory, use the overload that accepts a subdirectory parameter else fallback to the original method if subdirectory method fails or if no subdirectory - NSUrl? nsUrl = string.IsNullOrEmpty(directory) - ? NSBundle.MainBundle.GetUrlForResource(file, ext) - : NSBundle.MainBundle.GetUrlForResource(file, ext, directory); - - if (nsUrl is null) - { - return false; - } - - LoadFileUrl(nsUrl, nsUrl); - - return true; - } - catch (Exception ex) - { - if (_handler.TryGetTarget(out var handler)) - handler.MauiContext?.CreateLogger()?.LogWarning($"Could not load {url} as local file: {ex}"); - } + ILogger? logger = null; + if (_handler.TryGetTarget(out var handler)) + logger = handler.MauiContext?.CreateLogger(); - return false; + return this.LoadFile(url, logger); } [UnconditionalSuppressMessage("Memory", "MEM0002", Justification = IUIViewLifeCycleEvents.UnconditionalSuppressMessage)] diff --git a/src/Core/src/Platform/iOS/WebViewExtensions.cs b/src/Core/src/Platform/iOS/WebViewExtensions.cs index 09b0e3c2bf2f..21a295fe0842 100644 --- a/src/Core/src/Platform/iOS/WebViewExtensions.cs +++ b/src/Core/src/Platform/iOS/WebViewExtensions.cs @@ -1,6 +1,8 @@ using System; +using System.IO; using System.Threading.Tasks; using Foundation; +using Microsoft.Extensions.Logging; using WebKit; namespace Microsoft.Maui.Platform @@ -141,5 +143,42 @@ internal static string HandleWKWebViewResult(NSObject? result) return result.ToString() ?? "null"; } + + /// + /// Loads a local file URL into the WebView using NSBundle resource loading. + /// + /// The WKWebView instance to load the file into + /// The local file URL to load + /// Optional logger for error reporting + /// True if the file was successfully loaded, false otherwise + internal static bool LoadFile(this WKWebView webView, string url, ILogger? logger = null) + { + try + { + var file = Path.GetFileNameWithoutExtension(url); + var ext = Path.GetExtension(url); + var directory = Path.GetDirectoryName(url); + + // If there's a subdirectory, use the overload that accepts a subdirectory parameter else fallback to the original method if subdirectory method fails or if no subdirectory + NSUrl? nsUrl = string.IsNullOrEmpty(directory) + ? NSBundle.MainBundle.GetUrlForResource(file, ext) + : NSBundle.MainBundle.GetUrlForResource(file, ext, directory); + + if (nsUrl is null) + { + return false; + } + + webView.LoadFileUrl(nsUrl, nsUrl); + + return true; + } + catch (Exception ex) + { + logger?.LogWarning($"Could not load {url} as local file: {ex}"); + } + + return false; + } } } From 730d6bf863e78c13a83a3d301e404ab515debe97 Mon Sep 17 00:00:00 2001 From: NirmalKumarYuvaraj <97871636+NirmalKumarYuvaraj@users.noreply.github.com> Date: Wed, 3 Dec 2025 10:47:46 +0530 Subject: [PATCH 09/11] modified waiting time. --- .../tests/TestCases.Shared.Tests/Tests/Issues/Issue23315.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Controls/tests/TestCases.Shared.Tests/Tests/Issues/Issue23315.cs b/src/Controls/tests/TestCases.Shared.Tests/Tests/Issues/Issue23315.cs index 0904bff95206..f1a836811722 100644 --- a/src/Controls/tests/TestCases.Shared.Tests/Tests/Issues/Issue23315.cs +++ b/src/Controls/tests/TestCases.Shared.Tests/Tests/Issues/Issue23315.cs @@ -12,7 +12,7 @@ public class Issue23315(TestDevice device) : _IssuesUITest(device) [Category(UITestCategories.WebView)] public void WebViewCanLoadFileFromSubdirectory() { - App.WaitForElement("DescriptionLabel", timeout: TimeSpan.FromSeconds(3)); + App.WaitForElement("DescriptionLabel", timeout: TimeSpan.FromSeconds(5)); VerifyScreenshot(); } } From b7e30d6e4a2acb4f86999140039bacac95b8d14f Mon Sep 17 00:00:00 2001 From: NirmalKumarYuvaraj <97871636+NirmalKumarYuvaraj@users.noreply.github.com> Date: Mon, 8 Jun 2026 12:05:09 +0530 Subject: [PATCH 10/11] test case modified --- .../WebViewCanLoadFileFromSubdirectory.png | Bin 33970 -> 0 bytes .../TestCases.HostApp/Issues/Issue23315.cs | 33 ++++++++++++++---- .../Tests/Issues/Issue23315.cs | 8 +++-- .../WebViewCanLoadFileFromSubdirectory.png | Bin 33352 -> 0 bytes 4 files changed, 32 insertions(+), 9 deletions(-) delete mode 100644 src/Controls/tests/TestCases.Android.Tests/snapshots/android/WebViewCanLoadFileFromSubdirectory.png delete mode 100644 src/Controls/tests/TestCases.iOS.Tests/snapshots/ios/WebViewCanLoadFileFromSubdirectory.png diff --git a/src/Controls/tests/TestCases.Android.Tests/snapshots/android/WebViewCanLoadFileFromSubdirectory.png b/src/Controls/tests/TestCases.Android.Tests/snapshots/android/WebViewCanLoadFileFromSubdirectory.png deleted file mode 100644 index 3712e2d015bb333e92283ca4a72e76f2102bd8b6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 33970 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≪MC50tURh+odlq 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 diff --git a/src/Controls/tests/TestCases.HostApp/Issues/Issue23315.cs b/src/Controls/tests/TestCases.HostApp/Issues/Issue23315.cs index 365c6e47c7e7..68709d6c0f64 100644 --- a/src/Controls/tests/TestCases.HostApp/Issues/Issue23315.cs +++ b/src/Controls/tests/TestCases.HostApp/Issues/Issue23315.cs @@ -9,17 +9,36 @@ public Issue23315() protected override void Init() { + var statusLabel = new Label + { + Text = "Loading...", + AutomationId = "StatusLabel", + HorizontalOptions = LayoutOptions.Center, + VerticalOptions = LayoutOptions.Center + }; + WebView webView = new WebView { Source = "foo/bar/baz/test.html" }; - var descriptionLabel = new Label + webView.Navigated += async (sender, e) => { - Text = "This test verifies that the WebView can load files from subdirectories correctly. If you see a blank screen, it means the test has failed.", - AutomationId = "DescriptionLabel", - HorizontalOptions = LayoutOptions.Center, - VerticalOptions = LayoutOptions.CenterAndExpand + if (e.Result != WebNavigationResult.Success) + { + statusLabel.Text = $"Failed: {e.Result}"; + return; + } + + try + { + var title = await webView.EvaluateJavaScriptAsync("document.title"); + statusLabel.Text = title ?? "Empty"; + } + catch (Exception ex) + { + statusLabel.Text = $"Exception: {ex.Message}"; + } }; var grid = new Grid @@ -27,12 +46,12 @@ protected override void Init() RowDefinitions = { new RowDefinition(), - new RowDefinition { Height = 300 } + new RowDefinition { Height = 100 } } }; grid.Add(webView, 0, 0); - grid.Add(descriptionLabel, 0, 1); + grid.Add(statusLabel, 0, 1); Content = grid; } diff --git a/src/Controls/tests/TestCases.Shared.Tests/Tests/Issues/Issue23315.cs b/src/Controls/tests/TestCases.Shared.Tests/Tests/Issues/Issue23315.cs index f1a836811722..30360e281388 100644 --- a/src/Controls/tests/TestCases.Shared.Tests/Tests/Issues/Issue23315.cs +++ b/src/Controls/tests/TestCases.Shared.Tests/Tests/Issues/Issue23315.cs @@ -12,8 +12,12 @@ public class Issue23315(TestDevice device) : _IssuesUITest(device) [Category(UITestCategories.WebView)] public void WebViewCanLoadFileFromSubdirectory() { - App.WaitForElement("DescriptionLabel", timeout: TimeSpan.FromSeconds(5)); - VerifyScreenshot(); + // The HostApp loads `foo/bar/baz/test.html` whose is "Nested Subdirectory Test File". + // When the bug is present on iOS/MacCatalyst, LoadFile strips the directory part + // and tries to load only `test.html`, so the navigation fails and the label + // never reports the expected title. + App.WaitForElement("StatusLabel", timeout: TimeSpan.FromSeconds(10)); + App.WaitForTextToBePresentInElement("StatusLabel", "Nested Subdirectory Test File"); } } } diff --git a/src/Controls/tests/TestCases.iOS.Tests/snapshots/ios/WebViewCanLoadFileFromSubdirectory.png b/src/Controls/tests/TestCases.iOS.Tests/snapshots/ios/WebViewCanLoadFileFromSubdirectory.png deleted file mode 100644 index 5c9112801e9347d15a3d92c940abb13f64a68e29..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 33352 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 Uwb|um+{Oe{*Hg>8ar?=C0UfkX&j0`b From b0c18cb8b25bc925791437f8b41940af13b5d37d Mon Sep 17 00:00:00 2001 From: NirmalKumarYuvaraj <97871636+NirmalKumarYuvaraj@users.noreply.github.com> Date: Mon, 8 Jun 2026 13:04:41 +0530 Subject: [PATCH 11/11] test modifications --- .../tests/TestCases.HostApp/Issues/Issue23315.cs | 14 +++----------- .../Tests/Issues/Issue23315.cs | 5 +++-- 2 files changed, 6 insertions(+), 13 deletions(-) diff --git a/src/Controls/tests/TestCases.HostApp/Issues/Issue23315.cs b/src/Controls/tests/TestCases.HostApp/Issues/Issue23315.cs index 68709d6c0f64..94c4c905a37a 100644 --- a/src/Controls/tests/TestCases.HostApp/Issues/Issue23315.cs +++ b/src/Controls/tests/TestCases.HostApp/Issues/Issue23315.cs @@ -11,7 +11,6 @@ protected override void Init() { var statusLabel = new Label { - Text = "Loading...", AutomationId = "StatusLabel", HorizontalOptions = LayoutOptions.Center, VerticalOptions = LayoutOptions.Center @@ -26,18 +25,11 @@ protected override void Init() { if (e.Result != WebNavigationResult.Success) { - statusLabel.Text = $"Failed: {e.Result}"; - return; + statusLabel.Text = $"Failed"; } - - try - { - var title = await webView.EvaluateJavaScriptAsync("document.title"); - statusLabel.Text = title ?? "Empty"; - } - catch (Exception ex) + else if (e.Result == WebNavigationResult.Success) { - statusLabel.Text = $"Exception: {ex.Message}"; + statusLabel.Text = $"Success"; } }; diff --git a/src/Controls/tests/TestCases.Shared.Tests/Tests/Issues/Issue23315.cs b/src/Controls/tests/TestCases.Shared.Tests/Tests/Issues/Issue23315.cs index 30360e281388..cb4b373a13d4 100644 --- a/src/Controls/tests/TestCases.Shared.Tests/Tests/Issues/Issue23315.cs +++ b/src/Controls/tests/TestCases.Shared.Tests/Tests/Issues/Issue23315.cs @@ -16,8 +16,9 @@ public void WebViewCanLoadFileFromSubdirectory() // When the bug is present on iOS/MacCatalyst, LoadFile strips the directory part // and tries to load only `test.html`, so the navigation fails and the label // never reports the expected title. - App.WaitForElement("StatusLabel", timeout: TimeSpan.FromSeconds(10)); - App.WaitForTextToBePresentInElement("StatusLabel", "Nested Subdirectory Test File"); + var statusLabel = App.WaitForElement("StatusLabel", timeout: TimeSpan.FromSeconds(10)); + var text = statusLabel.GetText(); + Assert.That(text, Is.EqualTo("Success"), $"Expected to load the file from the subdirectory, but got '{text}' instead."); } } }