From 817063e9ca911e3f9da94db1ebc02ae3436fa0a9 Mon Sep 17 00:00:00 2001 From: rdlabo Date: Wed, 14 Oct 2026 16:42:21 +0900 Subject: [PATCH 1/5] feat: anchor Vertical Bars popovers to native SwiftUI buttons --- demo/e2e/native-ui-shell.spec.ts | 99 ++++++ .../NativeUIShellTests.swift | 44 +++ .../popover/popover-content.component.ts | 34 ++ .../app/index/pages/popover/popover.page.html | 26 +- .../app/index/pages/popover/popover.page.ts | 21 +- demo/src/global.scss | 9 + demo/src/main.ts | 6 +- demo/src/native-ui-shell-lifecycle.spec.ts | 11 +- docs/native-ui-shell.md | 20 +- .../Components/ShellVerticalBars.swift | 69 +++- .../IonicNativeUIShellPlugin.swift | 58 +++- .../Overlays/ShellOverlayController.swift | 113 +++++++ .../Overlays/ShellOverlayHost.swift | 36 ++ src/native/definitions.ts | 28 +- src/native/index.ts | 29 +- src/native/overlays/content.ts | 51 +++ src/native/overlays/controller.ts | 312 ++++++++++++++++++ src/native/overlays/dialog-animation.ts | 30 ++ src/native/overlays/dismiss-animation.ts | 12 + src/native/overlays/focus.ts | 64 ++++ src/native/overlays/popover.ts | 80 +++++ src/native/overlays/styles.ts | 80 +++++ src/native/runtime.ts | 29 +- src/native/shared/projection-id.ts | 2 + 24 files changed, 1239 insertions(+), 24 deletions(-) create mode 100644 demo/src/app/index/pages/popover/popover-content.component.ts create mode 100644 ios/Sources/IonicNativeUIShellPlugin/Overlays/ShellOverlayController.swift create mode 100644 ios/Sources/IonicNativeUIShellPlugin/Overlays/ShellOverlayHost.swift create mode 100644 src/native/overlays/content.ts create mode 100644 src/native/overlays/controller.ts create mode 100644 src/native/overlays/dialog-animation.ts create mode 100644 src/native/overlays/dismiss-animation.ts create mode 100644 src/native/overlays/focus.ts create mode 100644 src/native/overlays/popover.ts create mode 100644 src/native/overlays/styles.ts create mode 100644 src/native/shared/projection-id.ts diff --git a/demo/e2e/native-ui-shell.spec.ts b/demo/e2e/native-ui-shell.spec.ts index ee691e4b..2d0c4cca 100644 --- a/demo/e2e/native-ui-shell.spec.ts +++ b/demo/e2e/native-ui-shell.spec.ts @@ -18,6 +18,7 @@ interface ShellMock extends ShellMockCore { lateSearch?: () => void; tabRetirements: number; retirementDetails: { path: string; tabs: string }[]; + preparedPopovers: number; } const mockNative = async (page: Page, fail = false, nativeEdge: 'leading' | 'trailing' | null | 'unreported' = 'trailing') => { @@ -46,6 +47,13 @@ const mockNative = async (page: Page, fail = false, nativeEdge: 'leading' | 'tra notifyListeners(eventName: string, data: unknown) { for (const listener of this.listeners[eventName] ?? []) listener(data as never); }, + preparedPopovers: 0, + async prepareOverlay() { + this.preparedPopovers++; + throw new Error('Native popover unavailable'); + }, + async closeOverlay() {}, + async stopOverlays() {}, async configure(options: { verticalBarsOnly?: boolean }) { this.configuredWith = options; return { supported: true, verticalBars: nativeEdge !== null }; @@ -3376,3 +3384,94 @@ test('tab visibility ignores query parameters and fragments', async ({ page }) = await page.goto('/main/index?verticalBarsOnly&buttonDefaultFill=solid#comparison'); await expect(page.locator('ion-tab-bar')).not.toHaveClass(/tab-bar-hidden/); }); + +for (const standalone of [false, true]) + test(`Vertical Bars popover retains native controls and background geometry (${standalone ? 'standalone' : 'full shell'})`, async ({ + page, + }) => { + await page.setViewportSize({ width: 700, height: 900 }); + await mockNative(page); + await page.goto(`/main/index/popover${standalone ? '?verticalBarsOnly' : ''}`); + await page.locator('ion-app').evaluate((app) => app.classList.add('ios-theme-vertical-bars')); + const trigger = page.locator('#native-popover-trigger'); + await expect(trigger).toHaveAttribute('data-native-ui-shell-vertical-bars-member', '', { timeout: 15000 }); + await page.evaluate(() => + Object.assign(Capacitor.registerPlugin('IonicNativeUIShell'), { + async prepareOverlay() {}, + async presentOverlay() {}, + async dismissOverlay() {}, + }), + ); + await page + .locator('app-popover ion-content') + .first() + .evaluate(async (content: HTMLIonContentElement) => content.scrollToPoint(0, 100)); + const geometry = () => + page + .locator('app-popover ion-content') + .first() + .evaluate(async (content: HTMLIonContentElement) => { + const rect = content.getBoundingClientRect(); + return { x: rect.x, y: rect.y, width: rect.width, height: rect.height, scroll: (await content.getScrollElement()).scrollTop }; + }); + const before = await geometry(); + for (let attempt = 1; attempt <= 3; attempt++) { + const updateCount = await page.evaluate(() => Capacitor.registerPlugin('IonicNativeUIShell').updates.length); + const opened = page.waitForEvent('popup'); + await activate(page, 'Open popover'); + const relay = await opened; + await expect(relay.getByText('Toolbar popover', { exact: true })).toBeVisible(); + expect(await relay.evaluate(() => document.compatMode)).toBe('CSS1Compat'); + expect((await relay.getByRole('button', { name: 'Increment', exact: true }).boundingBox())!.height).toBeLessThan(80); + await expect(trigger).toHaveAttribute('data-native-ui-shell-vertical-bars-member', '', { timeout: 15000 }); + expect(await geometry()).toEqual(before); + expect( + await page.evaluate( + (start) => + Capacitor.registerPlugin('IonicNativeUIShell') + .updates.slice(start) + .every((snapshot) => + snapshot.controls.some( + (control) => + control.placement === 'vertical-bars' && control.items.some((item) => item.accessibilityLabel === 'Open popover'), + ), + ), + updateCount, + ), + ).toBe(true); + await relay.getByRole('button', { name: 'Increment', exact: true }).click(); + await expect(relay.getByText(`Count: ${attempt}`, { exact: true })).toBeVisible(); + await relay.getByRole('button', { name: 'Close popover', exact: true }).click(); + await expect.poll(() => relay.isClosed()).toBe(true); + await expect(trigger).toHaveAttribute('data-native-ui-shell-vertical-bars-member', '', { timeout: 15000 }); + expect(await geometry()).toEqual(before); + } + }); + +test('ordinary popovers stay in the source WebView', async ({ page }) => { + await mockNative(page); + await page.goto('/main/index/popover'); + await expect(page.locator('#native-popover-trigger')).toHaveAttribute('data-native-ui-shell', ''); + + await activate(page, 'Open popover'); + await expect(page.getByText('Toolbar popover', { exact: true })).toBeVisible(); + expect(page.context().pages()).toHaveLength(1); + expect(await page.evaluate(() => Capacitor.registerPlugin('IonicNativeUIShell').preparedPopovers)).toBe(0); + await page.getByRole('button', { name: 'Close popover', exact: true }).click(); +}); + +test('Vertical Bars popover preparation failure restores usable Web content and projection updates', async ({ page }) => { + await page.setViewportSize({ width: 700, height: 900 }); + await mockNative(page); + await page.goto('/main/index/popover'); + await page.locator('ion-app').evaluate((app) => app.classList.add('ios-theme-vertical-bars')); + const trigger = page.locator('#native-popover-trigger'); + await expect(trigger).toHaveAttribute('data-native-ui-shell-vertical-bars-member', '', { timeout: 15000 }); + await activate(page, 'Open popover'); + await expect(page.getByText('Toolbar popover', { exact: true })).toBeVisible(); + await page.getByRole('button', { name: 'Increment', exact: true }).click(); + await expect(page.getByText('Count: 1', { exact: true })).toBeVisible(); + await page.getByRole('button', { name: 'Close popover', exact: true }).click(); + await expect(trigger).toHaveAttribute('data-native-ui-shell-vertical-bars-member', '', { timeout: 15000 }); + expect(page.context().pages()).toHaveLength(1); +}); diff --git a/demo/ios/NativeUIShellTests/NativeUIShellTests.swift b/demo/ios/NativeUIShellTests/NativeUIShellTests.swift index f9c14590..5e5bd5cd 100644 --- a/demo/ios/NativeUIShellTests/NativeUIShellTests.swift +++ b/demo/ios/NativeUIShellTests/NativeUIShellTests.swift @@ -504,6 +504,50 @@ final class NativeUIShellTests: XCTestCase { XCTAssertTrue(main.identifier.hasPrefix("shell-")) } + func testVerticalBarsPopoverKeepsBackgroundAndLiveActions() throws { + let app = XCUIApplication(bundleIdentifier: "io.ionic.theme.ios27") + app.launch() + let toggle = app.webViews.switches["iPhone Duo Mode"] + XCTAssertTrue(toggle.waitForExistence(timeout: 15), app.debugDescription) + if toggle.value as? String == "0" { toggle.tap() } + openPage(app, name: "popover") + let trigger = nativeButton(app, label: "Open popover") + XCTAssertTrue(trigger.waitForExistence(timeout: 10), app.debugDescription) + assertOnVerticalBars(trigger, in: app) + let source = app.webViews.firstMatch + let sourceFrame = source.frame + let triggerFrame = trigger.frame + let background = app.webViews.staticTexts["Controller"].firstMatch + XCTAssertTrue(background.exists, app.debugDescription) + let backgroundFrame = background.frame + capture("vertical-popover-before") + for attempt in 1...3 { + trigger.tap() + let title = app.webViews.staticTexts["Toolbar popover"].firstMatch + XCTAssertTrue(title.waitForExistence(timeout: 5), app.debugDescription) + // SwiftUI's modal accessibility scope hides covered controls from XCTest. + // Their native identities and geometry are checked again after dismissal. + capture("vertical-popover-open-\(attempt)") + let increment = app.webViews.buttons["Increment"].firstMatch + XCTAssertLessThan(increment.frame.height, 80, "Popover buttons must keep their intrinsic height") + increment.coordinate(withNormalizedOffset: CGVector(dx: 0.5, dy: 0.5)).tap() + XCTAssertTrue(app.webViews.staticTexts["Count: \(attempt)"].firstMatch.waitForExistence(timeout: 5), app.debugDescription) + if attempt == 2 { + app.coordinate(withNormalizedOffset: CGVector(dx: 0.2, dy: 0.8)).tap() + } else { + app.webViews.buttons["Close popover"].firstMatch.coordinate(withNormalizedOffset: CGVector(dx: 0.5, dy: 0.5)).tap() + } + XCTAssertTrue(title.waitForNonExistence(timeout: 5), app.debugDescription) + XCTAssertTrue(trigger.waitForExistence(timeout: 5), app.debugDescription) + XCTAssertEqual(trigger.frame.minX, triggerFrame.minX, accuracy: 1) + XCTAssertEqual(trigger.frame.minY, triggerFrame.minY, accuracy: 1) + XCTAssertEqual(source.frame.minX, sourceFrame.minX, accuracy: 1) + XCTAssertEqual(source.frame.minY, sourceFrame.minY, accuracy: 1) + XCTAssertEqual(background.frame.minY, backgroundFrame.minY, accuracy: 1) + capture("vertical-popover-dismissed-\(attempt)") + } + } + private func openPage(_ app: XCUIApplication, name: String) { let label = name == "native-ui-shell" ? "native-ui-shell (Preview)" : name let entry = app.webViews.buttons[label].exists ? app.webViews.buttons[label] : app.webViews.links[label] diff --git a/demo/src/app/index/pages/popover/popover-content.component.ts b/demo/src/app/index/pages/popover/popover-content.component.ts new file mode 100644 index 00000000..8d0dfc8d --- /dev/null +++ b/demo/src/app/index/pages/popover/popover-content.component.ts @@ -0,0 +1,34 @@ +import { Component, input, signal } from '@angular/core'; +import { IonButton, IonContent, IonItem, IonItemGroup, IonLabel, IonList } from '@demo/ionic'; + +@Component({ + selector: 'app-popover-content', + standalone: true, + imports: [IonButton, IonContent, IonItem, IonItemGroup, IonLabel, IonList], + template: ` + + + + Count: {{ count() }}Increment + @if (scrollable()) { + @for (row of rows; track row) { + Row {{ row }} + } + } + + + + `, + styles: [':host { display: block; height: 100%; }'], +}) +export class PopoverContentComponent { + readonly scrollable = input(false); + readonly count = signal(0); + readonly rows = Array.from({ length: 20 }, (_, index) => index + 1); + readonly increment = (value: number) => value + 1; +} diff --git a/demo/src/app/index/pages/popover/popover.page.html b/demo/src/app/index/pages/popover/popover.page.html index 5b04510b..a671a08b 100644 --- a/demo/src/app/index/pages/popover/popover.page.html +++ b/demo/src/app/index/pages/popover/popover.page.html @@ -4,8 +4,23 @@ popover + + + + + + +
+

Toolbar popover

+

Count: {{ toolbarCount() }}

+ Increment + Close popover +
+
@@ -14,15 +29,20 @@

popover

- - - This page is a component demo for @rdlabo/ionic-theme-ios27.
+ + Controller + + Compact controller popover + Scrollable controller popover + + + diff --git a/demo/src/app/index/pages/popover/popover.page.ts b/demo/src/app/index/pages/popover/popover.page.ts index 29f06c48..bd88157e 100644 --- a/demo/src/app/index/pages/popover/popover.page.ts +++ b/demo/src/app/index/pages/popover/popover.page.ts @@ -1,4 +1,6 @@ -import { Component, OnInit } from '@angular/core'; +import { Component, inject, OnInit, signal } from '@angular/core'; + +import { PopoverContentComponent } from './popover-content.component'; import { FormsModule } from '@angular/forms'; import { @@ -18,6 +20,7 @@ import { IonText, IonTitle, IonToolbar, + PopoverController, } from '@demo/ionic'; @Component({ @@ -46,7 +49,21 @@ import { ], }) export class PopoverPage implements OnInit { - constructor() {} + readonly toolbarCount = signal(0); + incrementToolbar() { + this.toolbarCount.update((value) => value + 1); + } + readonly popoverController = inject(PopoverController); + + async present(event: Event, scrollable = false) { + const popover = await this.popoverController.create({ + component: PopoverContentComponent, + componentProps: { scrollable }, + event, + cssClass: scrollable ? 'demo-scrollable-popover' : 'demo-compact-popover', + }); + await popover.present(); + } ngOnInit() {} } diff --git a/demo/src/global.scss b/demo/src/global.scss index fba628bb..82046d09 100644 --- a/demo/src/global.scss +++ b/demo/src/global.scss @@ -228,3 +228,12 @@ app-settings-page { } } } + +ion-popover.demo-compact-popover { + --width: 280px; + --height: 90px; +} +ion-popover.demo-scrollable-popover { + --width: 300px; + --height: 360px; +} diff --git a/demo/src/main.ts b/demo/src/main.ts index 23dc4c40..4680659d 100644 --- a/demo/src/main.ts +++ b/demo/src/main.ts @@ -45,7 +45,11 @@ const startShell = stockIonic || new URLSearchParams(window.location.search).has('verticalBarsOnly') ? enableVerticalControlArea : enableNativeUIShell; const buttonDefaultFill = stockIonic || new URLSearchParams(window.location.search).get('buttonDefaultFill') === 'solid' ? 'solid' : null; const buttonProjection = new URLSearchParams(window.location.search).get('buttonProjection') === 'source' ? 'source' : 'system'; -void startShell({ buttonProjection, buttonDefaultFill }).then((handle) => { +void startShell({ + buttonProjection, + buttonDefaultFill, + controls: { tabs: true, toolbar: true, segment: true, fab: true, popover: true }, +}).then((handle) => { const app = document.querySelector('ion-app'); if (app) Object.assign(app, { nativeUIShell: handle }); }); diff --git a/demo/src/native-ui-shell-lifecycle.spec.ts b/demo/src/native-ui-shell-lifecycle.spec.ts index 8d5960e6..8ad545b1 100644 --- a/demo/src/native-ui-shell-lifecycle.spec.ts +++ b/demo/src/native-ui-shell-lifecycle.spec.ts @@ -1,5 +1,5 @@ import { expect, test } from 'vitest'; -import { enableNativeUIShell, setVerticalControlAreaPlacement } from '../../src/native'; +import { enableNativeUIShell, enableVerticalControlArea, setVerticalControlAreaPlacement } from '../../src/native'; test('placement requires ion-app and clears it when disabled', () => { document.body.replaceChildren(); @@ -51,3 +51,12 @@ test('a new activation survives the previous runtime finishing its destroy', asy await enableNativeUIShell({ enabled: false }); expect(second.getStatus().state).toBe('stopped'); }); + +test('standalone Vertical Bars forwards popover opt-in into the shared runtime', async () => { + const handle = await enableVerticalControlArea({ controls: { popover: true } }); + await expect( + enableNativeUIShell({ controls: { tabs: true, toolbar: true, popover: true }, verticalBarsOnly: true }), + ).resolves.toBeDefined(); + await expect(enableVerticalControlArea()).rejects.toThrow('different controls'); + await handle.destroy(); +}); diff --git a/docs/native-ui-shell.md b/docs/native-ui-shell.md index 25e1c0ca..b8523118 100644 --- a/docs/native-ui-shell.md +++ b/docs/native-ui-shell.md @@ -126,7 +126,7 @@ The built-in `iosTransitionAnimation` waits for native retirement before startin Tab switches skip the Web/native crossfade so a retiring UIKit snapshot cannot linger over the next tab. Detection uses the router URL versus the still-selected tab on `ionViewWillLeave` (and vanilla `ionTabsWillChange` / `ionTabsDidChange` DOM events). Stack pushes and pops keep the normal 180ms handoff. -Standard Ionic overlays suspend native projection until dismissal. Unsupported searchable-tab configurations use the existing Web animation and share this ownership with Web glass gestures. CSS motion of supported containing surfaces also causes temporary Web rendering. +Standard Ionic overlays suspend native projection until dismissal, except for the opt-in native Vertical Bars popovers described below. Unsupported searchable-tab configurations use the existing Web animation and share this ownership with Web glass gestures. CSS motion of supported containing surfaces also causes temporary Web rendering. During retirement, the source is restored and allowed to paint before its native cover is removed. During acquisition, the source is hidden only after a successful, current native response. Delayed responses are revalidated per control: existing eligible controls retain their native cover while content updates catch up. Only removed or ineligible sources return to Web; newly acquired sources require an exact acknowledgement. Ordinary page mutations never call the global clear operation. UIKit tab instances and items are retained, and equal frames/selections are not reapplied. Duplicate/stale activations are discarded. WebKit and UIKit still render separately: the implementation avoids an intentional blank frame, but does not provide an OS-level atomic compositing guarantee. Validate custom transitions and overlays on the app's supported simulators before rollout; unknown overlay systems are outside the automatic integration contract. @@ -154,7 +154,23 @@ const shell = await enableNativeUIShell({ const disabledShell = await enableNativeUIShell({ enabled: false }); ``` -Omitting `controls` enables every supported control for backward compatibility. When `controls` is present, only entries set to `true` are native-eligible. Available entries are `tabs`, `toolbar`, `segment`, and `fab`. +Omitting `controls` enables `tabs`, `toolbar`, `segment`, and `fab` for backward compatibility. When `controls` is present, only entries set to `true` are native-eligible. `popover` is opt-in and defaults to `false`. + +### Popovers anchored to Vertical Bars + +Enable `controls.popover` together with `controls.toolbar` to present popovers from accepted native Vertical Bars `ion-button` controls: + +```ts +await enableNativeUIShell({ + controls: { tabs: true, toolbar: true, segment: true, fab: true, popover: true }, +}); +``` + +The same option is available through `enableVerticalControlArea()`. Use an `ion-popover` whose `trigger` identifies the projected button, or pass that button's click event to `PopoverController.create({ event, ... })`. The button must be accepted by native Vertical Bars; regular toolbar buttons, body controls, and missing or rejected anchors retain Ionic's Web presentation. + +The page's native controls stay projected throughout preparation, presentation and dismissal. The relay prepares its child WebView while Ionic initializes the content, bypasses the Web enter animation, and presents through the button's standard SwiftUI popover. It does not resize or reparent the source WebView. Ionic retains its controller, lifecycle, live application handlers and dismissal data; the live content temporarily moves into the child document and is restored during cleanup. + +Only one popover is relayed at a time. Opening another overlay or menu, leaving the page, suspending the shell, or losing the native layout restores Web rendering. Modal, sheet and alert relay are outside this feature. Native presentation owns the arrow, corners and animation; custom Web enter/leave animations do not replace them. Initial content dimensions come from Ionic; arbitrary cross-document CSS, document-bound queries and full VoiceOver/hardware-keyboard parity are not guaranteed. Failure to prepare or find the native anchor restores the Web popover. For a custom modal or overlay that Native UI Shell cannot detect, acquire a suspension before presenting it. The resolved suspension means projected controls have returned to Web rendering. Always release it after dismissal: diff --git a/ios/Sources/IonicNativeUIShellPlugin/Components/ShellVerticalBars.swift b/ios/Sources/IonicNativeUIShellPlugin/Components/ShellVerticalBars.swift index c5e76e9b..bfd8b7d0 100644 --- a/ios/Sources/IonicNativeUIShellPlugin/Components/ShellVerticalBars.swift +++ b/ios/Sources/IonicNativeUIShellPlugin/Components/ShellVerticalBars.swift @@ -7,6 +7,7 @@ protocol ShellVerticalBarsControlling: AnyObject { func attach(to owner: UIViewController, in parent: UIView) @MainActor func apply(_ controls: [ShellControl], rendering: ShellRendering, edge: String) var ownsKeyboardChrome: Bool { get } + func presentPopover(anchor: String, host: ShellOverlayHost, completion: @escaping () -> Void) -> Bool func detach() } @@ -32,6 +33,9 @@ final class ShellVerticalBarsModel: ObservableObject { let slot: ShellControl.ToolbarSlot? } + @Published var popoverAnchor: String? + var popoverHost: ShellOverlayHost? + var popoverPresented: (() -> Void)? @Published var search: ShellVerticalSearchModel? @Published var back: Item? @Published var groups: [Group] = [] @@ -129,6 +133,13 @@ private func verticalBarsButton(_ item: ShellVerticalBarsModel.Item, model: Shel } } +@available(iOS 26.0, *) +private struct ShellVerticalPopoverContent: UIViewControllerRepresentable { + let host: ShellOverlayHost + func makeUIViewController(context: Context) -> ShellOverlayHost { host } + func updateUIViewController(_ controller: ShellOverlayHost, context: Context) {} +} + @available(iOS 26.0, *) private struct ShellVerticalBarsButton: ToolbarContent { @ObservedObject var model: ShellVerticalBarsModel @@ -138,7 +149,38 @@ private struct ShellVerticalBarsButton: ToolbarContent { // Observe here so same-ID updates also refresh the shared toolbar background. var body: some ToolbarContent { if let item = model.groups.lazy.flatMap(\.items).first(where: { $0.id == id }) { - ToolbarItem(placement: placement) { verticalBarsButton(item, model: model) } + ToolbarItem(placement: placement) { + verticalBarsButton(item, model: model) + .popover(isPresented: Binding( + get: { model.popoverAnchor == item.id }, + set: { shown in + if !shown { + model.popoverAnchor = nil + model.popoverHost?.event("dismiss") + } + } + )) { + if let host = model.popoverHost { + ShellVerticalPopoverContent(host: host) + .frame(width: host.preferredContentSize.width, height: host.preferredContentSize.height) + .preferredColorScheme(host.options?["dark"] as? Bool == true ? .dark : .light) + .presentationCompactAdaptation(.popover) + .interactiveDismissDisabled(host.options?["backdropDismiss"] as? Bool == false) + .onAppear { + let completion = model.popoverPresented + model.popoverPresented = nil + completion?() + } + .onDisappear { + host.anchoredVisible = false + let completion = host.anchoredDidDismiss + host.anchoredDidDismiss = nil + if model.popoverHost === host { model.popoverHost = nil } + completion?() + } + } + } + } .sharedBackgroundVisibility(item.clear ? .hidden : .automatic) } } @@ -426,6 +468,31 @@ final class ShellVerticalBarsController: ShellVerticalBarsControlling { controller.overrideUserInterfaceStyle = controls.contains(where: \.dark) ? .dark : .light } + func presentPopover(anchor: String, host: ShellOverlayHost, completion: @escaping () -> Void) -> Bool { + guard container.window != nil, model.popoverAnchor == nil, + model.groups.flatMap(\.items).contains(where: { $0.id == anchor && !$0.disabled }) else { return false } + model.popoverHost = host + model.popoverPresented = completion + host.anchoredVisible = true + host.dismissAnchored = { [weak self, weak host] in + guard let self, let host else { return } + if self.model.popoverAnchor == nil { + host.anchoredVisible = false + let completion = host.anchoredDidDismiss + host.anchoredDidDismiss = nil + completion?() + } else { + var transaction = Transaction() + transaction.disablesAnimations = host.options?["animated"] as? Bool == false + withTransaction(transaction) { self.model.popoverAnchor = nil } + } + } + var transaction = Transaction() + transaction.disablesAnimations = host.options?["animated"] as? Bool == false + withTransaction(transaction) { model.popoverAnchor = anchor } + return true + } + func detach() { guard controller.parent != nil else { return } controller.willMove(toParent: nil) diff --git a/ios/Sources/IonicNativeUIShellPlugin/IonicNativeUIShellPlugin.swift b/ios/Sources/IonicNativeUIShellPlugin/IonicNativeUIShellPlugin.swift index 0bac7c88..4751a4a9 100644 --- a/ios/Sources/IonicNativeUIShellPlugin/IonicNativeUIShellPlugin.swift +++ b/ios/Sources/IonicNativeUIShellPlugin/IonicNativeUIShellPlugin.swift @@ -10,8 +10,14 @@ public class IonicNativeUIShellPlugin: CAPPlugin, CAPBridgedPlugin, UITabBarDele CAPPluginMethod(name: "configure", returnType: CAPPluginReturnPromise), CAPPluginMethod(name: "getWebViewMetrics", returnType: CAPPluginReturnPromise), CAPPluginMethod(name: "update", returnType: CAPPluginReturnPromise), - CAPPluginMethod(name: "clear", returnType: CAPPluginReturnPromise) + CAPPluginMethod(name: "clear", returnType: CAPPluginReturnPromise), + CAPPluginMethod(name: "prepareOverlay", returnType: CAPPluginReturnPromise), + CAPPluginMethod(name: "presentOverlay", returnType: CAPPluginReturnPromise), + CAPPluginMethod(name: "dismissOverlay", returnType: CAPPluginReturnPromise), + CAPPluginMethod(name: "closeOverlay", returnType: CAPPluginReturnPromise), + CAPPluginMethod(name: "stopOverlays", returnType: CAPPluginReturnPromise) ] + private var overlays: ShellOverlayController? private var host: ShellHost? private var verticalBars: ShellVerticalBarsControlling? private var controls: [String: UIView] = [:] @@ -74,6 +80,56 @@ public class IonicNativeUIShellPlugin: CAPPlugin, CAPBridgedPlugin, UITabBarDele observers.forEach(NotificationCenter.default.removeObserver) } + @objc func prepareOverlay(_ call: CAPPluginCall) { + DispatchQueue.main.async { [weak self] in + guard let self, let id = call.getString("id"), + let source = self.bridge?.webView, let owner = self.bridge?.viewController else { + call.reject("Popover source unavailable"); return + } + if self.overlays == nil { + self.overlays = ShellOverlayController(source: source, owner: owner) { [weak self] id, action in + self?.notifyListeners("overlay", data: ["id": id, "action": action]) + } + } + guard self.overlays?.prepare(id) == true else { call.reject("Popover already pending"); return } + call.resolve() + } + } + + @objc func presentOverlay(_ call: CAPPluginCall) { + DispatchQueue.main.async { [weak self] in + guard let self, let overlays = self.overlays, let id = call.getString("id") else { + call.reject("Popover not prepared"); return + } + overlays.present(id, options: call.getObject("presentation"), anchored: { [weak self] anchor, host, completion in + self?.verticalBars?.presentPopover(anchor: anchor, host: host, completion: completion) ?? false + }) { presented in + if presented { call.resolve() } else { call.reject("Native Vertical Bars anchor unavailable") } + } + } + } + + @objc func dismissOverlay(_ call: CAPPluginCall) { + DispatchQueue.main.async { [weak self] in + guard let overlays = self?.overlays, let id = call.getString("id") else { call.resolve(); return } + overlays.dismiss(id, animated: call.getBool("animated") ?? false) { call.resolve() } + } + } + + @objc func closeOverlay(_ call: CAPPluginCall) { + DispatchQueue.main.async { [weak self] in + guard let overlays = self?.overlays, let id = call.getString("id") else { call.resolve(); return } + overlays.close(id) { call.resolve() } + } + } + + @objc func stopOverlays(_ call: CAPPluginCall) { + DispatchQueue.main.async { [weak self] in + guard let self, let overlays = self.overlays else { call.resolve(); return } + overlays.stop { self.overlays = nil; call.resolve() } + } + } + private func webViewMetrics() -> JSObject? { guard #available(iOS 26.0, *), let webView = bridge?.webView else { return nil } webView.layoutIfNeeded() diff --git a/ios/Sources/IonicNativeUIShellPlugin/Overlays/ShellOverlayController.swift b/ios/Sources/IonicNativeUIShellPlugin/Overlays/ShellOverlayController.swift new file mode 100644 index 00000000..25a4c596 --- /dev/null +++ b/ios/Sources/IonicNativeUIShellPlugin/Overlays/ShellOverlayController.swift @@ -0,0 +1,113 @@ +import UIKit +import WebKit + +/// Intercepts only a prepared blank window. Other requests keep Capacitor's behavior. +final class ShellOverlayController: NSObject, WKUIDelegate { + private weak var source: WKWebView? + private weak var owner: UIViewController? + private let original: WKUIDelegate? + private let automaticallyOpensWindows: Bool + private var prepared: String? + private let event: (String, String) -> Void + private var id: String? + private var host: ShellOverlayHost? + + init(source: WKWebView, owner: UIViewController, event: @escaping (String, String) -> Void) { + self.source = source + self.owner = owner + self.event = event + original = source.uiDelegate + automaticallyOpensWindows = source.configuration.preferences.javaScriptCanOpenWindowsAutomatically + super.init() + source.uiDelegate = self + } + + override func responds(to selector: Selector!) -> Bool { + super.responds(to: selector) || original?.responds(to: selector) == true + } + + override func forwardingTarget(for selector: Selector!) -> Any? { + original?.responds(to: selector) == true ? original : super.forwardingTarget(for: selector) + } + + func prepare(_ id: String) -> Bool { + guard prepared == nil, host == nil else { return false } + prepared = id + source?.configuration.preferences.javaScriptCanOpenWindowsAutomatically = true + return true + } + + func webView(_ webView: WKWebView, createWebViewWith configuration: WKWebViewConfiguration, + for navigationAction: WKNavigationAction, windowFeatures: WKWindowFeatures) -> WKWebView? { + // WebKit percent-encodes '#' inside about: URLs; compare the decoded form. + guard webView === source, navigationAction.sourceFrame.isMainFrame, + let prepared, navigationAction.targetFrame == nil, + navigationAction.request.url?.absoluteString.removingPercentEncoding == "about:blank#\(prepared)" else { + return original?.webView?(webView, createWebViewWith: configuration, + for: navigationAction, windowFeatures: windowFeatures) + } + self.prepared = nil + source?.configuration.preferences.javaScriptCanOpenWindowsAutomatically = automaticallyOpensWindows + id = prepared + let host = ShellOverlayHost(configuration: configuration, options: nil) { [weak self] action in + self?.event(prepared, action) + } + host.webView.uiDelegate = self + host.webView.frame = source?.bounds ?? .zero + self.host = host + return host.webView + } + + func present(_ id: String, options: [String: Any]?, anchored: (String, ShellOverlayHost, @escaping () -> Void) -> Bool, + completion: @escaping (Bool) -> Void) { + guard self.id == id, let host, let owner, + owner.presentedViewController == nil else { completion(false); return } + host.apply(options) + if host.options?["kind"] as? String == "popover", + let anchor = host.options?["anchorId"] as? String, + anchored(anchor, host, { completion(true) }) { return } + completion(false) + } + + // Keep the WebView alive until JavaScript has restored the adopted nodes and listeners. + func dismiss(_ id: String, animated: Bool, completion: @escaping () -> Void) { + guard self.id == id, let host else { completion(); return } + if let dismiss = host.dismissAnchored { + if host.anchoredVisible { host.anchoredDidDismiss = completion; dismiss() } + else { completion() } + return + } + guard host.presentingViewController != nil else { completion(); return } + host.dismiss(animated: animated, completion: completion) + } + + func close(_ id: String, completion: @escaping () -> Void) { + if prepared == id { + prepared = nil + source?.configuration.preferences.javaScriptCanOpenWindowsAutomatically = automaticallyOpensWindows + } + guard self.id == id, let host else { completion(); return } + let finish = { [self] in + host.webView.uiDelegate = nil + self.host = nil + self.id = nil + completion() + } + if let dismiss = host.dismissAnchored, host.anchoredVisible { host.anchoredDidDismiss = finish; dismiss() } + else if host.presentingViewController == nil { finish() } + else { host.dismiss(animated: false, completion: finish) } + } + + func stop(completion: @escaping () -> Void) { + let finish = { [self] in + prepared = nil + if let source, source.uiDelegate === self { + source.uiDelegate = original + source.configuration.preferences.javaScriptCanOpenWindowsAutomatically = automaticallyOpensWindows + } + completion() + } + if let id { close(id, completion: finish) } + else { finish() } + } +} diff --git a/ios/Sources/IonicNativeUIShellPlugin/Overlays/ShellOverlayHost.swift b/ios/Sources/IonicNativeUIShellPlugin/Overlays/ShellOverlayHost.swift new file mode 100644 index 00000000..a05ecb21 --- /dev/null +++ b/ios/Sources/IonicNativeUIShellPlugin/Overlays/ShellOverlayHost.swift @@ -0,0 +1,36 @@ +import UIKit +import WebKit + +/// Hosts only the live content of a Vertical Bars popover. +final class ShellOverlayHost: UIViewController { + let webView: WKWebView + private(set) var options: [String: Any]? + let event: (String) -> Void + var dismissAnchored: (() -> Void)? + var anchoredVisible = false + var anchoredDidDismiss: (() -> Void)? + + init(configuration: WKWebViewConfiguration, options: [String: Any]?, event: @escaping (String) -> Void) { + webView = WKWebView(frame: .zero, configuration: configuration) + self.event = event + super.init(nibName: nil, bundle: nil) + apply(options) + } + required init?(coder: NSCoder) { fatalError("init(coder:) has not been implemented") } + + func apply(_ options: [String: Any]?) { + guard let options else { return } + self.options = options + preferredContentSize = CGSize(width: options["width"] as? Double ?? 280, height: options["height"] as? Double ?? 200) + overrideUserInterfaceStyle = options["dark"] as? Bool == true ? .dark : .light + } + + override func loadView() { + webView.isOpaque = false + webView.backgroundColor = .clear + webView.scrollView.backgroundColor = .clear + webView.scrollView.contentInsetAdjustmentBehavior = .never + view = webView + view.accessibilityViewIsModal = true + } +} diff --git a/src/native/definitions.ts b/src/native/definitions.ts index f36e5601..ea639cbb 100644 --- a/src/native/definitions.ts +++ b/src/native/definitions.ts @@ -11,6 +11,8 @@ export interface NativeUIShellStatus { } export interface VerticalControlAreaOptions { + /** Opt-in popovers anchored to native Vertical Bars buttons. */ + controls?: Pick; /** Appearance of native vertical ion-button and ion-menu-button actions. * `system` (default) uses SwiftUI styling and template icons; `source` projects supported Ionic fill and colors. * Local data-projection="source|system" or ios-theme-projection-source / ios-theme-projection-system take precedence: @@ -32,7 +34,7 @@ export interface VerticalControlAreaOptions { export interface NativeUIShellOptions extends VerticalControlAreaOptions { /** Enables Native UI Shell globally. Defaults to `true`. */ enabled?: boolean; - /** Controls eligible for native projection. Omit to enable every control; when present, only `true` controls are enabled. */ + /** Controls eligible for native projection. Omit to enable tabs, toolbar, segment and fab; popover always requires explicit opt-in. When present, only `true` controls are enabled. */ controls?: NativeUIShellControls; /** Internal: limit native projection to the Vertical Control Area. */ verticalBarsOnly?: boolean; @@ -47,6 +49,8 @@ export interface NativeUIShellControls { segment?: boolean; /** Projects floating action buttons. */ fab?: boolean; + /** Relays popovers anchored to native Vertical Bars buttons. Defaults to false. */ + popover?: boolean; } export interface NativeUIShellHandle { @@ -183,9 +187,31 @@ export interface WebViewMetrics { export interface NativeUIShellPlugin { configure(options?: { verticalBarsOnly?: boolean }): Promise<{ supported: boolean }>; getWebViewMetrics(): Promise; + prepareOverlay(options: { id: string }): Promise; + presentOverlay(options: { id: string; presentation?: ShellPopoverPresentation }): Promise; + dismissOverlay(options: { id: string; animated: boolean }): Promise; + closeOverlay(options: { id: string }): Promise; + stopOverlays(): Promise; update(snapshot: ShellSnapshot): Promise<{ revision: number; rejectedSearches?: string[]; rejectedControls?: string[] }>; clear(options: { revision: number }): Promise; addListener(name: 'activate', listener: (event: ShellActivation) => void): Promise; addListener(name: 'search', listener: (event: ShellSearchEvent) => void): Promise; addListener(name: 'webViewMetricsChange', listener: (event: WebViewMetrics) => void): Promise; + addListener(name: 'overlay', listener: (event: ShellOverlayEvent) => void): Promise; +} + +export interface ShellPopoverPresentation { + kind: 'popover'; + animated: boolean; + dark: boolean; + anchorId: string; + width: number; + height: number; + backgroundColor: string; + backdropDismiss: boolean; +} + +export interface ShellOverlayEvent { + id: string; + action: 'dismiss'; } diff --git a/src/native/index.ts b/src/native/index.ts index e9059deb..77424e6f 100644 --- a/src/native/index.ts +++ b/src/native/index.ts @@ -11,6 +11,7 @@ import type { WebViewMetrics, } from './definitions'; import { createRuntime } from './runtime'; +import { createOverlayController } from './overlays/controller'; import { createVerticalBarsWebProjection } from './vertical-bars-web'; import { prehideVerticalBarsToolbarSources } from './prehide'; import { observeVerticalBarsModals } from './shared/modal'; @@ -64,7 +65,7 @@ const manage = ( handle: NativeUIShellHandle, lifecycle: { reason?: string; - suspend?: () => (() => void) | undefined; + suspend?: () => (() => void) | undefined | Promise<(() => void) | undefined>; /** Runs after teardown; clears the shared slot only while this activation owns it. */ release?: () => void; destroy?: () => void | Promise; @@ -75,7 +76,7 @@ const manage = ( getStatus: () => (lifecycle.reason ? { ...handle.getStatus(), reason: lifecycle.reason } : handle.getStatus()), async suspend() { const lease = await handle.suspend(); - const resume = lifecycle.suspend?.(); + const resume = await lifecycle.suspend?.(); return { async resume() { await lease.resume(); @@ -89,8 +90,11 @@ const manage = ( try { await handle.destroy(); } finally { - await lifecycle.destroy?.(); - lifecycle.release?.(); + try { + await lifecycle.destroy?.(); + } finally { + lifecycle.release?.(); + } } }, }; @@ -171,7 +175,7 @@ export const enableVerticalControlArea = async (options: VerticalControlAreaOpti const handle = await enableNativeUIShell({ buttonProjection: options.buttonProjection, buttonDefaultFill: options.buttonDefaultFill, - controls: { tabs: true, toolbar: true }, + controls: { tabs: true, toolbar: true, popover: options.controls?.popover === true }, verticalBarsOnly: true, }); return { @@ -203,6 +207,7 @@ export const enableNativeUIShell = (options: NativeUIShellOptions = {}): Promise // Local source overrides can use this even when the startup projection is system. options.buttonDefaultFill ?? null, ...(['tabs', 'toolbar', 'segment', 'fab'] as const).map((component) => !controls || controls[component] === true), + controls?.popover === true, ]); if (active && activeConfiguration !== configuration) return Promise.reject( @@ -235,6 +240,7 @@ export const enableNativeUIShell = (options: NativeUIShellOptions = {}): Promise (async () => { if (Capacitor.getPlatform() !== 'ios') return fallback('Requires Capacitor iOS'); let runtime: NativeUIShellHandle | undefined; + let overlays: Awaited> | undefined; let metricsListener: Awaited> | undefined; let stopVerticalBarsLayout: (() => void) | undefined; try { @@ -261,10 +267,20 @@ export const enableNativeUIShell = (options: NativeUIShellOptions = {}): Promise native, createVerticalBarsWebProjection(document, options, () => !nativeVerticalBars() || native.getStatus().state === 'stopped'), ); + if (controls?.popover === true) + overlays = await createOverlayController(document, plugin, options, native.retain, nativeVerticalBars); return manage(runtime, { - suspend: () => prehide?.suspend(), + suspend: async () => { + const restorePrehide = prehide?.suspend(); + const resumeOverlays = await overlays?.suspend(); + return () => { + restorePrehide?.(); + resumeOverlays?.(); + }; + }, release, destroy: async () => { + await overlays?.destroy(); await metricsListener?.remove().catch(() => {}); stopVerticalBarsLayout?.(); prehide?.stop(); @@ -272,6 +288,7 @@ export const enableNativeUIShell = (options: NativeUIShellOptions = {}): Promise }, }); } catch (error) { + await overlays?.destroy(); await runtime?.destroy(); await metricsListener?.remove().catch(() => {}); stopVerticalBarsLayout?.(); diff --git a/src/native/overlays/content.ts b/src/native/overlays/content.ts new file mode 100644 index 00000000..bd91e51b --- /dev/null +++ b/src/native/overlays/content.ts @@ -0,0 +1,51 @@ +import { sheetText } from './styles'; + +/** Constructed stylesheets cannot cross documents with their nodes. */ +export const moveContent = (content: HTMLElement[], destination: HTMLElement): (() => void) => { + const home = content.map((element) => ({ element, parent: element.parentNode!, next: element.nextSibling })); + const roots: { root: ShadowRoot; css: string; sheets: CSSStyleSheet[] }[] = []; + const collect = (node: Element) => { + if (node.shadowRoot) { + roots.push({ + root: node.shadowRoot, + css: sheetText(node.shadowRoot.adoptedStyleSheets), + sheets: [...node.shadowRoot.adoptedStyleSheets], + }); + for (const child of Array.from(node.shadowRoot.children)) collect(child); + } + for (const child of Array.from(node.children)) collect(child); + }; + content.forEach(collect); + for (const element of content) destination.append(destination.ownerDocument.adoptNode(element)); + const styles = roots + .filter(({ css }) => css) + .map(({ root, css }) => { + const style = destination.ownerDocument.createElement('style'); + style.textContent = css; + root.append(style); + return style; + }); + return () => { + styles.forEach((style) => style.remove()); + for (const { element, parent, next } of home) { + const connected = element.isConnected; + parent.ownerDocument!.adoptNode(element); + // Ionic may already have destroyed the Angular component on dismiss. + if (connected) parent.insertBefore(element, next?.parentNode === parent ? next : null); + } + for (const { root, css, sheets } of roots) { + // WebKit re-associates adopted sheets with the new document across + // adoptNode, so they may no longer match this root; fall back to the + // inline copy instead of aborting the remaining restore. + try { + root.adoptedStyleSheets = sheets; + } catch { + if (css) { + const style = root.ownerDocument.createElement('style'); + style.textContent = css; + root.append(style); + } + } + } + }; +}; diff --git a/src/native/overlays/controller.ts b/src/native/overlays/controller.ts new file mode 100644 index 00000000..c13ec0da --- /dev/null +++ b/src/native/overlays/controller.ts @@ -0,0 +1,312 @@ +import type { NativeUIShellOptions, NativeUIShellPlugin } from '../definitions'; +import { bounded } from '../runtime'; +import { isExcluded, isPermanentlyExcluded, isShellDisabled } from '../shared/dom'; +import { activeElement, trapFocus } from './focus'; +import { relayPopover, popoverPresentation, verticalBarsPopoverAnchor } from './popover'; +import { nativeDialogAnimation } from './dialog-animation'; +import { relayStyles } from './styles'; + +type Presentation = { kind: 'popover'; animated: boolean }; +type Overlay = HTMLIonPopoverElement; +const lifecycle = (overlay: Overlay, phase: string) => + `ion${overlay.localName.slice(4, 5).toUpperCase()}${overlay.localName.slice(5)}${phase}`; + +interface Connection { + id: string; + overlay: Overlay; + dismissed: boolean; + win?: Window; + focus: Element | null; + stopStyles?: () => void; + releaseProjection?: () => void; + stopContent?: () => void; + stopFocus?: () => void; + stopEvents?: () => void; + stopChildEvents?: () => void; + stopExclusions?: () => void; + closing?: Promise; + nativeClosing?: Promise; + stopAnimation?: () => void; + hideAnimation?: () => void; + stopLifecycle?: () => void; +} + +/** Ionic owns lifecycle and dismissal; only one overlay is relayed at a time. */ +export const createOverlayController = async ( + doc: Document, + plugin: NativeUIShellPlugin, + options: NativeUIShellOptions, + retainProjection: () => () => void, + nativeVerticalBars: () => boolean, +) => { + let current: Connection | undefined; + let opening = Promise.resolve(); + let sequence = 0; + let stopped = false; + const suspensions = new Set(); + const events = ['Modal', 'Popover', 'Alert', 'ActionSheet', 'Loading', 'Picker', 'Toast'].map((name) => `ion${name}WillPresent`); + const cleanup = async (connection: Connection) => { + // Every teardown step is isolated and bounded: a throwing or hanging step + // must not strand the retained page projections or the child window. + const stage = async (label: string, run?: () => void | Promise) => { + try { + await bounded(Promise.resolve(run?.())); + } catch (error) { + console.error(`Native overlay teardown failed at ${label}; continuing cleanup anyway.`, error); + } + }; + try { + await stage('events', connection.stopEvents); + await stage('lifecycle', connection.stopLifecycle); + await stage('childEvents', connection.stopChildEvents); + await stage('exclusions', connection.stopExclusions); + await stage('focus', connection.stopFocus); + // A timed-out dismissal must not strand the relayed content in the child window. + await connection.nativeClosing?.catch((error) => { + console.error('Native overlay dismissal did not complete; restoring the Web content anyway.', error); + }); + await stage('content', connection.stopContent); + await stage('animation', connection.stopAnimation); + await stage('styles', connection.stopStyles); + await stage('close', () => bounded(plugin.closeOverlay({ id: connection.id }))); + } finally { + // The page projections must be released even if teardown throws above. + connection.releaseProjection?.(); + connection.releaseProjection = undefined; + try { + connection.win?.close(); + } catch (error) { + console.error('Native overlay window was already gone.', error); + } + if (current === connection) current = undefined; + const focus = connection.focus as HTMLElement | null; + if (focus?.isConnected && focus.tabIndex >= 0) focus.focus({ preventScroll: true }); + } + }; + const release = (connection: Connection): Promise => (connection.closing ??= cleanup(connection)); + const restoreWeb = async () => { + if (current) await release(current); + }; + const excluded = (overlay: HTMLElement) => isPermanentlyExcluded(overlay) || isExcluded(overlay) || isShellDisabled(overlay); + const connect = async (connection: Connection, ready: Promise, presentation: Presentation) => { + const { overlay } = connection; + const gone = () => + current !== connection || + stopped || + suspensions.size || + connection.dismissed || + !overlay.isConnected || + !nativeVerticalBars() || + excluded(overlay); + // Keep the source invisible while the native toolbar prepares its popover. + connection.hideAnimation?.(); + try { + // Prepare the child window concurrently with Ionic's content initialization. + const staging = (async () => { + await bounded( + plugin.prepareOverlay({ + id: connection.id, + }), + ); + if (gone()) return undefined; + const win = doc.defaultView!.open(`about:blank#${connection.id}`, '_blank'); + if (!win) throw new Error('Native overlay window unavailable'); + connection.win = win; + // The requested blank page replaces the initial document created by window.open. + // WebKit percent-encodes the '#' marker in the popup URL; compare decoded. + // Adopt nodes only after that navigation; otherwise WebKit discards the relay. + if (decodeURIComponent(win.document.URL) !== `about:blank#${connection.id}` || win.document.readyState !== 'complete') + await bounded(new Promise((resolve) => win.addEventListener('load', () => resolve(), { once: true }))); + if (gone()) return undefined; + // about:blank is a quirks-mode document in WebKit. Initialize standards + // mode before adopting live content: otherwise percentage button heights + // can resolve against the entire popover viewport. + win.document.open(); + win.document.write(''); + win.document.close(); + connection.stopChildEvents = observe(win.document); + const environment = relayStyles(doc, win.document, overlay); + connection.stopStyles = environment.stop; + await bounded(environment.ready); + if (gone()) return undefined; + return { destination: environment.destination, win }; + })(); + // The staging join is awaited below; settle early rejections quietly. + staging.catch(() => {}); + // Ionic initializes its gestures after didPresent. Let that turn finish before adopting their content. + // A stalled presentation must not park the opening queue forever. + await bounded(ready); + // Placement is captured after Ionic has laid out the overlay. + await bounded(new Promise((resolve) => doc.defaultView!.requestAnimationFrame(() => resolve()))); + const staged = await staging; + if (gone() || !staged) { + await release(connection); + return; + } + const focused = activeElement(doc) as HTMLElement | null; + const nativePresentation = popoverPresentation(overlay); + const content = relayPopover(overlay, staged.destination); + connection.stopContent = content.stop; + connection.hideAnimation?.(); + // Ionic does not dismiss a presented overlay when its page is hidden or + // destroyed; without this a popover could retain the page projections + // forever and freeze every later control update. + const exclusions = new MutationObserver(() => { + if (!overlay.isConnected || !nativeVerticalBars() || excluded(overlay) || isShellDisabled(content.root)) + void release(connection).catch(console.error); + }); + const attributes = { attributes: true, attributeFilter: ['class', 'data-shell', 'hidden', 'inert'] }; + for (let node: HTMLElement | null = overlay; node; node = node.parentElement) { + exclusions.observe(node, attributes); + exclusions.observe(node, { childList: true }); + } + exclusions.observe(content.root, { ...attributes, subtree: true }); + connection.stopExclusions = () => exclusions.disconnect(); + connection.stopFocus = trapFocus( + content.root, + () => + !connection.dismissed && + (!('focusTrap' in overlay) || overlay.focusTrap !== false) && + !overlay.classList.contains('ion-disable-focus-trap'), + ); + const close = () => { + void release(connection).catch(console.error); + }; + const escape = (event: KeyboardEvent) => { + if (event.key === 'Escape' && overlay.backdropDismiss) void overlay.dismiss(undefined, 'backdrop'); + }; + staged.win.document.addEventListener('keydown', escape); + overlay.addEventListener(lifecycle(overlay, 'DidDismiss'), close, { once: true }); + connection.stopEvents = () => { + staged.win.document.removeEventListener('keydown', escape); + overlay.removeEventListener(lifecycle(overlay, 'DidDismiss'), close); + }; + // SwiftUI owns the only visible presentation animation. + await bounded( + plugin.presentOverlay({ + id: connection.id, + presentation: { ...nativePresentation, animated: presentation.animated }, + }), + ); + (focused?.isConnected && focused.ownerDocument === staged.win.document ? focused : content.root).focus({ preventScroll: true }); + } catch (error) { + await release(connection); + console.error('Native overlay projection failed; keeping Ionic content in the source WebView.', error); + } + }; + const present = (event: Event) => { + const overlay = event.target as Overlay; + if (current) { + const connection = current; + current = undefined; + opening = opening.then(() => release(connection)).catch(console.error); + if (!connection.dismissed) return; + // A didDismiss handler may immediately open the next popover while SwiftUI is still closing this one. + connection.stopAnimation?.(); + connection.stopAnimation = undefined; + } + const enabled = + overlay.localName === 'ion-popover' && + options.controls?.popover === true && + nativeVerticalBars() && + verticalBarsPopoverAnchor(overlay) !== undefined; + if (stopped || suspensions.size || !enabled || excluded(overlay)) { + opening = opening.then(restoreWeb).catch(console.error); + return; + } + const connection: Connection = { id: `ios-theme-overlay-${++sequence}`, overlay, dismissed: false, focus: activeElement(doc) }; + const presentation: Presentation = { kind: 'popover', animated: overlay.animated }; + current = connection; + // Retain synchronously, before the scheduled projection update can retire the rail. + connection.releaseProjection = retainProjection(); + const closed = () => { + connection.dismissed = true; + }; + overlay.addEventListener(lifecycle(overlay, 'DidDismiss'), closed, { once: true }); + let resolveReady!: () => void; + const readyPromise = new Promise((resolve) => { + resolveReady = resolve; + }); + const ready = () => { + resolveReady(); + }; + const closeNative = () => + (connection.nativeClosing ??= bounded(plugin.dismissOverlay({ id: connection.id, animated: presentation.animated }))); + const animation = nativeDialogAnimation(overlay, closeNative); + connection.stopAnimation = animation.stop; + connection.hideAnimation = animation.hide; + animation.hide(); + overlay.addEventListener(lifecycle(overlay, 'DidPresent'), ready, { once: true }); + connection.stopLifecycle = () => overlay.removeEventListener(lifecycle(overlay, 'DidDismiss'), closed); + opening = opening + .then(() => connect(connection, readyPromise, presentation)) + .catch(console.error) + .finally(() => { + overlay.removeEventListener(lifecycle(overlay, 'DidPresent'), ready); + }); + }; + const menuOpen = (event: Event) => { + if (!event.composedPath().some((node): node is HTMLElement => node instanceof HTMLElement && node.matches('ion-menu'))) return; + // Menus render in the source document below the native overlay; release the relay. + const connection = current; + current = undefined; + if (connection) opening = opening.then(() => release(connection)).catch(console.error); + }; + const observe = (target: Document) => { + for (const name of events) target.addEventListener(name, present); + target.addEventListener('ionWillOpen', menuOpen); + return () => { + for (const name of events) target.removeEventListener(name, present); + target.removeEventListener('ionWillOpen', menuOpen); + }; + }; + const invalidate = () => { + const connection = current; + current = undefined; + if (connection) opening = opening.then(() => release(connection)).catch(console.error); + }; + // Retention must not freeze an obsolete layout or a departed page. + const win = doc.defaultView!; + win.addEventListener('resize', invalidate); + doc.addEventListener('ionViewWillLeave', invalidate); + const visibility = () => { + if (doc.hidden) invalidate(); + }; + doc.addEventListener('visibilitychange', visibility); + const listener = await bounded( + plugin.addListener('overlay', (event) => { + if (event.id !== current?.id) return; + if (event.action === 'dismiss' && current.overlay.backdropDismiss) + void current.overlay.dismiss(undefined, 'backdrop').catch(console.error); + }), + ); + const stopEvents = observe(doc); + return { + async suspend() { + const lease = Symbol(); + suspensions.add(lease); + await opening; + await restoreWeb(); + return () => { + suspensions.delete(lease); + }; + }, + async destroy() { + stopped = true; + stopEvents(); + win.removeEventListener('resize', invalidate); + doc.removeEventListener('ionViewWillLeave', invalidate); + doc.removeEventListener('visibilitychange', visibility); + try { + await opening; + await restoreWeb(); + } finally { + try { + await bounded(plugin.stopOverlays()); + } finally { + await listener.remove(); + } + } + }, + }; +}; diff --git a/src/native/overlays/dialog-animation.ts b/src/native/overlays/dialog-animation.ts new file mode 100644 index 00000000..fcdc5557 --- /dev/null +++ b/src/native/overlays/dialog-animation.ts @@ -0,0 +1,30 @@ +import { createAnimation } from '@ionic/core/components/index.js'; +import { dismissAnimation } from './dismiss-animation'; + +export type Dialog = HTMLIonPopoverElement; + +/** Hide the emptied source surface once the relay hosts the same live content. */ +export const nativeDialogAnimation = (overlay: Dialog, close: () => Promise) => { + const enterAnimation = overlay.enterAnimation; + overlay.enterAnimation = () => createAnimation(); + const leaveAnimation = overlay.leaveAnimation; + const opacity = overlay.style.opacity; + const event = 'ionPopoverWillDismiss'; + const dismiss = () => { + const closing = close(); + overlay.leaveAnimation = () => dismissAnimation(closing); + }; + overlay.addEventListener(event, dismiss); + return { + // Hide the source surface while the native presentation prepares. + hide() { + overlay.style.opacity = '0'; + }, + stop() { + overlay.removeEventListener(event, dismiss); + overlay.enterAnimation = enterAnimation; + overlay.leaveAnimation = leaveAnimation; + overlay.style.opacity = opacity; + }, + }; +}; diff --git a/src/native/overlays/dismiss-animation.ts b/src/native/overlays/dismiss-animation.ts new file mode 100644 index 00000000..7e3b6ca7 --- /dev/null +++ b/src/native/overlays/dismiss-animation.ts @@ -0,0 +1,12 @@ +import { createAnimation } from '@ionic/core/components/index.js'; + +/** Let Ionic finish dismissal after the native presentation has closed. */ +export const dismissAnimation = (closing: Promise) => { + const animation = createAnimation(); + const play = animation.play; + animation.play = async (options) => { + await closing; + await play(options); + }; + return animation; +}; diff --git a/src/native/overlays/focus.ts b/src/native/overlays/focus.ts new file mode 100644 index 00000000..eca21b35 --- /dev/null +++ b/src/native/overlays/focus.ts @@ -0,0 +1,64 @@ +export const activeElement = (doc: Document): Element | null => { + let element = doc.activeElement; + while (element?.shadowRoot?.activeElement) element = element.shadowRoot.activeElement; + return element; +}; + +const focusableElements = (root: HTMLElement): HTMLElement[] => { + const elements: HTMLElement[] = []; + const win = root.ownerDocument.defaultView!; + const collect = (scope: HTMLElement | ShadowRoot) => { + for (const node of Array.from(scope.querySelectorAll('*'))) { + if (node.inert || node.closest('[inert]') || (node as HTMLButtonElement).disabled) continue; + const before = elements.length; + if (node.shadowRoot) collect(node.shadowRoot); + const css = win.getComputedStyle(node); + if ( + elements.length === before && + node.tabIndex >= 0 && + !node.hidden && + css.display !== 'none' && + css.visibility !== 'hidden' && + node.getClientRects().length + ) + elements.push(node); + } + }; + collect(root); + return elements + .map((element, index) => ({ element, index })) + .sort((a, b) => (a.element.tabIndex || Infinity) - (b.element.tabIndex || Infinity) || a.index - b.index) + .map(({ element }) => element); +}; + +export const trapFocus = (root: HTMLElement, enabled: () => boolean): (() => void) => { + const doc = root.ownerDocument; + const previous = root.getAttribute('tabindex'); + root.tabIndex = -1; + let last: Element | null; + const onFocus = (event: FocusEvent) => { + if (!enabled()) return; + if (event.composedPath().includes(root)) { + last = activeElement(doc); + return; + } + const elements = focusableElements(root); + (elements.find((element) => element === last) ?? elements[0] ?? root).focus({ preventScroll: true }); + }; + const onKey = (event: KeyboardEvent) => { + if (event.key !== 'Tab' || event.altKey || event.ctrlKey || event.metaKey || !enabled()) return; + const elements = focusableElements(root); + const index = elements.findIndex((element) => element === activeElement(doc)); + const next = event.shiftKey ? (index <= 0 ? elements.length - 1 : index - 1) : (index + 1) % elements.length; + event.preventDefault(); + (elements[next] ?? root).focus(); + }; + doc.addEventListener('focusin', onFocus, true); + doc.addEventListener('keydown', onKey, true); + return () => { + doc.removeEventListener('focusin', onFocus, true); + doc.removeEventListener('keydown', onKey, true); + if (previous === null) root.removeAttribute('tabindex'); + else root.setAttribute('tabindex', previous); + }; +}; diff --git a/src/native/overlays/popover.ts b/src/native/overlays/popover.ts new file mode 100644 index 00000000..205c731e --- /dev/null +++ b/src/native/overlays/popover.ts @@ -0,0 +1,80 @@ +import type { ShellPopoverPresentation } from '../definitions'; +import { projectionIds } from '../shared/projection-id'; +import { isDark } from '../shared/dom'; +import { moveContent } from './content'; + +export const popoverTrigger = (overlay: HTMLIonPopoverElement): Element | undefined => { + const event = overlay.event as MouseEvent | undefined; + const target = (overlay.trigger ? overlay.ownerDocument.getElementById(overlay.trigger) : event?.target) as Element | undefined; + return target?.closest?.('ion-button,ion-fab-button,ion-item') ?? target; +}; + +/** Only accepted native rail buttons can retain the page projection. */ +export const verticalBarsPopoverAnchor = (overlay: HTMLIonPopoverElement): string | undefined => { + const trigger = popoverTrigger(overlay); + if ( + !trigger?.matches('ion-button[data-native-ui-shell-vertical-bars-member]') || + !trigger.closest('[data-native-ui-shell]') || + (trigger as HTMLIonButtonElement).disabled + ) + return undefined; + return projectionIds.get(trigger); +}; + +export const popoverPresentation = (overlay: HTMLIonPopoverElement): ShellPopoverPresentation => { + const content = overlay.shadowRoot!.querySelector('.popover-content')!; + const rect = content.getBoundingClientRect(); + const anchorId = verticalBarsPopoverAnchor(overlay); + if (!anchorId) throw new Error('Native Vertical Bars anchor unavailable'); + return { + kind: 'popover', + animated: overlay.animated, + dark: isDark(overlay.ownerDocument.defaultView!.getComputedStyle(overlay)), + anchorId, + width: rect.width, + height: rect.height, + backgroundColor: overlay.ownerDocument.defaultView!.getComputedStyle(content).backgroundColor, + backdropDismiss: overlay.backdropDismiss, + }; +}; + +export const relayPopover = (overlay: HTMLIonPopoverElement, destination: HTMLElement) => { + const doc = destination.ownerDocument; + const source = overlay.shadowRoot!.querySelector('.popover-content')!; + const root = doc.createElement('ion-popover'); + for (const attribute of Array.from(overlay.attributes)) root.setAttribute(attribute.name, attribute.value); + Object.assign(root.style, { + position: 'absolute', + inset: '0', + display: 'block', + visibility: 'visible', + opacity: '1', + pointerEvents: 'auto', + }); + root.setAttribute('role', 'dialog'); + root.setAttribute('aria-modal', 'true'); + const shadow = root.attachShadow({ mode: 'open' }); + const shell = doc.createElement('div'); + const css = overlay.ownerDocument.defaultView!.getComputedStyle(source); + Object.assign(shell.style, { height: '100%', overflow: css.overflow, background: css.backgroundColor }); + shell.append(doc.createElement('slot')); + shadow.append(shell); + destination.append(root); + // Components such as ion-select-popover dismiss their closest ion-popover. + root.dismiss = (...args) => overlay.dismiss(...args); + const restore = moveContent(Array.from(source.querySelector('slot')!.assignedElements()) as HTMLElement[], root); + const select = (event: MouseEvent) => { + if (!event.composedPath().includes(shell)) { + if (overlay.backdropDismiss) void overlay.dismiss(undefined, 'backdrop'); + } else if (overlay.dismissOnSelect) void overlay.dismiss(); + }; + root.addEventListener('click', select); + return { + root, + stop() { + root.removeEventListener('click', select); + restore(); + root.remove(); + }, + }; +}; diff --git a/src/native/overlays/styles.ts b/src/native/overlays/styles.ts new file mode 100644 index 00000000..29740318 --- /dev/null +++ b/src/native/overlays/styles.ts @@ -0,0 +1,80 @@ +export const sheetText = (sheets: readonly CSSStyleSheet[]): string => + sheets.flatMap((sheet) => Array.from(sheet.cssRules, (rule) => rule.cssText)).join('\n'); + +export const relayStyles = ( + source: Document, + destination: Document, + overlay: HTMLElement, +): { destination: HTMLElement; ready: Promise; stop: () => void } => { + const base = destination.createElement('base'); + base.href = source.baseURI; + destination.head.append(base); + const copies = new Map(); + const sheets = destination.createElement('style'); + destination.head.append(sheets); + const sync = () => { + sheets.textContent = sheetText(source.adoptedStyleSheets); + const sources = Array.from(source.querySelectorAll('meta[name=viewport],link[rel=stylesheet],style:not([data-overlay-relay-local])')); + for (const [node, copy] of copies) + if (!sources.includes(node)) { + copy.remove(); + copies.delete(node); + } + for (const node of sources) { + let copy = copies.get(node); + if (!copy) { + copy = node.cloneNode(true) as Element; + copies.set(node, copy); + } else { + for (const attribute of Array.from(copy.attributes)) copy.removeAttribute(attribute.name); + for (const attribute of Array.from(node.attributes)) copy.setAttribute(attribute.name, attribute.value); + copy.textContent = node.textContent; + } + destination.head.append(copy); + } + destination.head.append(surface); + }; + const surface = destination.createElement('style'); + surface.textContent = 'html,body{background:transparent!important}'; + const observers: MutationObserver[] = []; + const mirror = (node: Element, target: HTMLElement, flatten = false) => { + const update = () => { + for (const attribute of Array.from(target.attributes)) if (!node.hasAttribute(attribute.name)) target.removeAttribute(attribute.name); + for (const attribute of Array.from(node.attributes)) target.setAttribute(attribute.name, attribute.value); + // The popover content must not inherit the source page's rail layout. + if (target.localName === 'ion-app') target.classList.remove('ios-theme-vertical-bars'); + if (flatten) target.style.setProperty('display', 'contents', 'important'); + }; + update(); + const observer = new MutationObserver(update); + observer.observe(node, { attributes: true }); + observers.push(observer); + }; + mirror(source.documentElement, destination.documentElement); + mirror(source.body, destination.body); + const ancestors: Element[] = []; + for (let node = overlay.parentElement; node && node !== source.body; node = node.parentElement) ancestors.unshift(node); + let parent = destination.body; + for (const node of ancestors) { + const shell = destination.createElement(node.localName); + mirror(node, shell, true); + parent.append(shell); + parent = shell; + } + sync(); + // A copied external stylesheet can still be loading when Ionic's content is + // ready. Do not expose an unstyled first native frame (notably button sizes). + const ready = Promise.all( + Array.from(destination.querySelectorAll('link[rel=stylesheet]'), (link) => { + if (link.sheet) return Promise.resolve(); + return new Promise((resolve, reject) => { + link.addEventListener('load', () => resolve(), { once: true }); + link.addEventListener('error', () => reject(new Error('Popover stylesheet unavailable')), { once: true }); + }); + }), + ).then(() => undefined); + const observer = new MutationObserver(sync); + observer.observe(source.head, { subtree: true, childList: true, characterData: true, attributes: true }); + observers.push(observer); + return { destination: parent, ready, stop: () => observers.forEach((item) => item.disconnect()) }; +}; diff --git a/src/native/runtime.ts b/src/native/runtime.ts index aeb2d7f3..707a8eb2 100644 --- a/src/native/runtime.ts +++ b/src/native/runtime.ts @@ -1,3 +1,4 @@ +import { projectionIds } from './shared/projection-id'; import { inVerticalBarsSurface, topModal, modalUsesVerticalBars, modalVerticalBarFrame } from './shared/modal'; import type { PluginListenerHandle } from '@capacitor/core'; import { LIFECYCLE_WILL_ENTER, LIFECYCLE_WILL_LEAVE, LIFECYCLE_DID_ENTER, LIFECYCLE_DID_LEAVE } from '@ionic/core/components/index.js'; @@ -35,7 +36,7 @@ const verticalBarsMarker = 'data-native-ui-shell-vertical-bars'; const verticalBarsMemberMarker = 'data-native-ui-shell-vertical-bars-member'; // A failed bridge must not leave the source inaccessible indefinitely. -const bounded = (promise: Promise): Promise => +export const bounded = (promise: Promise): Promise => new Promise((resolve, reject) => { const timer = setTimeout(() => reject(new Error('Native UI Shell bridge timed out')), 5000); promise.then(resolve, reject).finally(() => clearTimeout(timer)); @@ -47,7 +48,7 @@ export const createRuntime = async ( options: NativeUIShellOptions = {}, nativeVerticalBars: () => boolean = () => true, verticalBarsOnly = false, -): Promise => { +): Promise () => void }> => { const win = doc.defaultView!; const icons = createIconRenderer(); const crossfade = createCrossfade(win); @@ -77,6 +78,7 @@ export const createRuntime = async ( let dirty = false; let pending = false; let stopped = false; + let retentions = 0; /** True while a tab-switch handoff should skip crossfade. */ let tabSwitchHandoff = false; /** Keep instant updates until this time — DidLeave often precedes the retire sync. */ @@ -108,6 +110,7 @@ export const createRuntime = async ( if (!value) { value = `shell-${++nextId}`; ids.set(element, value); + projectionIds.set(element, value); } return value; }; @@ -303,8 +306,11 @@ export const createRuntime = async ( pending = true; syncToolbarText(doc); handoffInstant = tabSwitchHandoff || handoffAcrossPending || modalPresentHandoff || win.performance.now() < handoffUntil; - modalPresentHandoff = false; try { + // A retained sync performs no update; keep the modal handoff armed so the + // deferred retirement still runs instantly after the overlay releases. + if (retentions && !manualSuspensions.size) return; + modalPresentHandoff = false; const size = `${win.innerWidth}:${win.innerHeight}`; // WebKit can resize before Ionic's fixed DOM positions catch up. // Measure on the next frame instead of retiring a valid native search. @@ -326,7 +332,7 @@ export const createRuntime = async ( ); } } - if (stopped || dirty) return; + if (stopped || dirty || (retentions && !manualSuspensions.size)) return; const retained = new Set(candidates.flatMap(candidateSources)); const removed = Array.from(sources.keys()).filter((element) => !retained.has(element)); if (removed.length) { @@ -361,7 +367,7 @@ export const createRuntime = async ( updates++; updatingRevision = snapshot.revision; const result = await bounded(plugin.update(snapshot)); - if (stopped) return; + if (stopped || (retentions && !manualSuspensions.size)) return; if (result.revision !== snapshot.revision) throw new Error('Native UI Shell revision mismatch'); if (`${win.innerWidth}:${win.innerHeight}` !== size) { lastSnapshot = ''; @@ -637,7 +643,18 @@ export const createRuntime = async ( on(win.visualViewport, 'resize', refreshLayout); on(win.visualViewport, 'scroll'); } - const handle: NativeUIShellHandle = { + const handle: NativeUIShellHandle & { retain: () => () => void } = { + // A native overlay covers this surface; keep its controls and Web ownership intact. + retain() { + retentions++; + let released = false; + return () => { + if (released) return; + released = true; + retentions--; + schedule(); + }; + }, getStatus: (): NativeUIShellStatus => ({ state: stopped ? 'stopped' : sources.size ? 'native' : 'web', projected: sources.size, diff --git a/src/native/shared/projection-id.ts b/src/native/shared/projection-id.ts new file mode 100644 index 00000000..9da66b67 --- /dev/null +++ b/src/native/shared/projection-id.ts @@ -0,0 +1,2 @@ +/** Internal identity used to anchor overlays to their native control. */ +export const projectionIds = new WeakMap(); From e7dd249621ada9a121addfdb7f15b81d7ee971fb Mon Sep 17 00:00:00 2001 From: rdlabo Date: Wed, 14 Oct 2026 17:20:08 +0900 Subject: [PATCH 2/5] fix: wait for SwiftUI popover dismissal before restoring content --- demo/ios/NativeUIShellTests/NativeUIShellTests.swift | 4 ++-- .../Components/ShellVerticalBars.swift | 12 +++++------- 2 files changed, 7 insertions(+), 9 deletions(-) diff --git a/demo/ios/NativeUIShellTests/NativeUIShellTests.swift b/demo/ios/NativeUIShellTests/NativeUIShellTests.swift index 5e5bd5cd..86cb29c4 100644 --- a/demo/ios/NativeUIShellTests/NativeUIShellTests.swift +++ b/demo/ios/NativeUIShellTests/NativeUIShellTests.swift @@ -521,7 +521,7 @@ final class NativeUIShellTests: XCTestCase { XCTAssertTrue(background.exists, app.debugDescription) let backgroundFrame = background.frame capture("vertical-popover-before") - for attempt in 1...3 { + for attempt in 1...20 { trigger.tap() let title = app.webViews.staticTexts["Toolbar popover"].firstMatch XCTAssertTrue(title.waitForExistence(timeout: 5), app.debugDescription) @@ -532,7 +532,7 @@ final class NativeUIShellTests: XCTestCase { XCTAssertLessThan(increment.frame.height, 80, "Popover buttons must keep their intrinsic height") increment.coordinate(withNormalizedOffset: CGVector(dx: 0.5, dy: 0.5)).tap() XCTAssertTrue(app.webViews.staticTexts["Count: \(attempt)"].firstMatch.waitForExistence(timeout: 5), app.debugDescription) - if attempt == 2 { + if attempt % 2 == 0 { app.coordinate(withNormalizedOffset: CGVector(dx: 0.2, dy: 0.8)).tap() } else { app.webViews.buttons["Close popover"].firstMatch.coordinate(withNormalizedOffset: CGVector(dx: 0.5, dy: 0.5)).tap() diff --git a/ios/Sources/IonicNativeUIShellPlugin/Components/ShellVerticalBars.swift b/ios/Sources/IonicNativeUIShellPlugin/Components/ShellVerticalBars.swift index bfd8b7d0..51f52c88 100644 --- a/ios/Sources/IonicNativeUIShellPlugin/Components/ShellVerticalBars.swift +++ b/ios/Sources/IonicNativeUIShellPlugin/Components/ShellVerticalBars.swift @@ -154,7 +154,7 @@ private struct ShellVerticalBarsButton: ToolbarContent { .popover(isPresented: Binding( get: { model.popoverAnchor == item.id }, set: { shown in - if !shown { + if !shown && model.popoverAnchor == item.id { model.popoverAnchor = nil model.popoverHost?.event("dismiss") } @@ -476,12 +476,10 @@ final class ShellVerticalBarsController: ShellVerticalBarsControlling { host.anchoredVisible = true host.dismissAnchored = { [weak self, weak host] in guard let self, let host else { return } - if self.model.popoverAnchor == nil { - host.anchoredVisible = false - let completion = host.anchoredDidDismiss - host.anchoredDidDismiss = nil - completion?() - } else { + // A backdrop tap clears the binding before SwiftUI finishes closing. + // Keep the live content and completion until onDisappear, including + // when dismissal has already started through the system binding. + if self.model.popoverAnchor != nil { var transaction = Transaction() transaction.disablesAnimations = host.options?["animated"] as? Bool == false withTransaction(transaction) { self.model.popoverAnchor = nil } From 104c4b97bc4494e08ed8290ae59785a6897254c0 Mon Sep 17 00:00:00 2001 From: rdlabo Date: Wed, 14 Oct 2026 17:20:27 +0900 Subject: [PATCH 3/5] test: update popover demo screenshot baselines --- .../popover-dark.png | Bin 52059 -> 64207 bytes .../screenshot.spec.ts-snapshots/popover.png | Bin 51859 -> 63666 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/demo/e2e/screenshot.spec.ts-snapshots/popover-dark.png b/demo/e2e/screenshot.spec.ts-snapshots/popover-dark.png index 9ece9087444be347452ba3766ee2eb87da56c864..034bcdc1ab2b458410a2f1711d445f72b47e33aa 100644 GIT binary patch literal 64207 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%0DAt-h6uT_g?$8i%Zb%%;hdQvqM*!@6OO-aThas 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

_;GXRj?Sm>?y&!2 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 a5ocXMXNFw%avxS&ijY*4C=xe*^IrfO=t83a diff --git a/demo/e2e/screenshot.spec.ts-snapshots/popover.png b/demo/e2e/screenshot.spec.ts-snapshots/popover.png index ea5d8c73aa436e508f166e23b340b1a26a3d4665..6d31302bb3f09649b9bb931ae51e12ec6aad03c5 100644 GIT binary patch literal 63666 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 C_c>kw From 8a249860044eeafa9939539ac7ff884a5fb80e40 Mon Sep 17 00:00:00 2001 From: rdlabo Date: Wed, 14 Oct 2026 23:14:05 +0900 Subject: [PATCH 4/5] fix: retain popover anchor taps received during dismissal --- demo/e2e/native-ui-shell.spec.ts | 55 +++++++++++++++++++++++++++++++ docs/native-ui-shell.md | 2 +- src/native/overlays/controller.ts | 14 ++++++-- src/native/runtime.ts | 43 +++++++++++++----------- 4 files changed, 91 insertions(+), 23 deletions(-) diff --git a/demo/e2e/native-ui-shell.spec.ts b/demo/e2e/native-ui-shell.spec.ts index 2d0c4cca..870cde02 100644 --- a/demo/e2e/native-ui-shell.spec.ts +++ b/demo/e2e/native-ui-shell.spec.ts @@ -3475,3 +3475,58 @@ test('Vertical Bars popover preparation failure restores usable Web content and await expect(trigger).toHaveAttribute('data-native-ui-shell-vertical-bars-member', '', { timeout: 15000 }); expect(page.context().pages()).toHaveLength(1); }); + +for (const disabled of [false, true]) + test(`Vertical Bars popover handles anchor clicks during dismissal (${disabled ? 'disabled before replay' : 'reopens once'})`, async ({ + page, + }) => { + await page.setViewportSize({ width: 700, height: 900 }); + await mockNative(page); + await page.goto('/main/index/popover'); + await page.locator('ion-app').evaluate((app) => app.classList.add('ios-theme-vertical-bars')); + const trigger = page.locator('#native-popover-trigger'); + await expect(trigger).toHaveAttribute('data-native-ui-shell-vertical-bars-member', '', { timeout: 15000 }); + await page.evaluate(() => { + const plugin = Capacitor.registerPlugin void }>('IonicNativeUIShell'); + Object.assign(plugin, { + async prepareOverlay() {}, + async presentOverlay() {}, + dismissOverlay: () => + new Promise((resolve) => { + plugin.finishDismiss = resolve; + }), + }); + }); + const opened = page.waitForEvent('popup'); + await activate(page, 'Open popover'); + const relay = await opened; + await expect(relay.getByText('Toolbar popover', { exact: true })).toBeVisible(); + await relay.getByRole('button', { name: 'Close popover', exact: true }).click(); + await expect + .poll(() => + page.evaluate(() => !!Capacitor.registerPlugin void }>('IonicNativeUIShell').finishDismiss), + ) + .toBe(true); + // UIKit can accept the next tap while Ionic still waits for didDismiss. + // Repeated clicks must coalesce, and a now-disabled source must not replay. + for (let i = 0; i < 3; i++) await activate(page, 'Open popover'); + if (disabled) + await trigger.evaluate((button: HTMLIonButtonElement) => { + button.disabled = true; + }); + await page.evaluate(() => Capacitor.registerPlugin void }>('IonicNativeUIShell').finishDismiss!()); + await expect.poll(() => relay.isClosed()).toBe(true); + if (disabled) { + await expect(trigger).toHaveJSProperty('disabled', true); + await expect.poll(() => page.context().pages().length).toBe(1); + } else { + await expect.poll(() => page.context().pages().length).toBe(2); + const reopened = page + .context() + .pages() + .find((candidate) => candidate !== page)!; + await expect(reopened.getByText('Toolbar popover', { exact: true })).toBeVisible(); + await reopened.getByRole('button', { name: 'Increment', exact: true }).click(); + await expect(reopened.getByText('Count: 1', { exact: true })).toBeVisible(); + } + }); diff --git a/docs/native-ui-shell.md b/docs/native-ui-shell.md index b8523118..6063a4f4 100644 --- a/docs/native-ui-shell.md +++ b/docs/native-ui-shell.md @@ -168,7 +168,7 @@ await enableNativeUIShell({ The same option is available through `enableVerticalControlArea()`. Use an `ion-popover` whose `trigger` identifies the projected button, or pass that button's click event to `PopoverController.create({ event, ... })`. The button must be accepted by native Vertical Bars; regular toolbar buttons, body controls, and missing or rejected anchors retain Ionic's Web presentation. -The page's native controls stay projected throughout preparation, presentation and dismissal. The relay prepares its child WebView while Ionic initializes the content, bypasses the Web enter animation, and presents through the button's standard SwiftUI popover. It does not resize or reparent the source WebView. Ionic retains its controller, lifecycle, live application handlers and dismissal data; the live content temporarily moves into the child document and is restored during cleanup. +The page's native controls stay projected throughout preparation, presentation and dismissal. If the same native anchor accepts a tap while Ionic is still dismissing, one activation is retained and revalidated after cleanup; repeated taps coalesce. The relay prepares its child WebView while Ionic initializes the content, bypasses the Web enter animation, and presents through the button's standard SwiftUI popover. It does not resize or reparent the source WebView. Ionic retains its controller, lifecycle, live application handlers and dismissal data; the live content temporarily moves into the child document and is restored during cleanup. Only one popover is relayed at a time. Opening another overlay or menu, leaving the page, suspending the shell, or losing the native layout restores Web rendering. Modal, sheet and alert relay are outside this feature. Native presentation owns the arrow, corners and animation; custom Web enter/leave animations do not replace them. Initial content dimensions come from Ionic; arbitrary cross-document CSS, document-bound queries and full VoiceOver/hardware-keyboard parity are not guaranteed. Failure to prepare or find the native anchor restores the Web popover. diff --git a/src/native/overlays/controller.ts b/src/native/overlays/controller.ts index c13ec0da..42220d24 100644 --- a/src/native/overlays/controller.ts +++ b/src/native/overlays/controller.ts @@ -36,7 +36,7 @@ export const createOverlayController = async ( doc: Document, plugin: NativeUIShellPlugin, options: NativeUIShellOptions, - retainProjection: () => () => void, + retainProjection: (deferActivation?: (id: string) => boolean) => () => void, nativeVerticalBars: () => boolean, ) => { let current: Connection | undefined; @@ -218,7 +218,17 @@ export const createOverlayController = async ( const presentation: Presentation = { kind: 'popover', animated: overlay.animated }; current = connection; // Retain synchronously, before the scheduled projection update can retire the rail. - connection.releaseProjection = retainProjection(); + const anchorId = verticalBarsPopoverAnchor(overlay); + connection.releaseProjection = retainProjection( + (id) => + id === anchorId && + current === connection && + !!connection.nativeClosing && + !stopped && + !suspensions.size && + nativeVerticalBars() && + !excluded(overlay), + ); const closed = () => { connection.dismissed = true; }; diff --git a/src/native/runtime.ts b/src/native/runtime.ts index 707a8eb2..4c406dcb 100644 --- a/src/native/runtime.ts +++ b/src/native/runtime.ts @@ -48,7 +48,7 @@ export const createRuntime = async ( options: NativeUIShellOptions = {}, nativeVerticalBars: () => boolean = () => true, verticalBarsOnly = false, -): Promise () => void }> => { +): Promise boolean) => () => void }> => { const win = doc.defaultView!; const icons = createIconRenderer(); const crossfade = createCrossfade(win); @@ -78,7 +78,7 @@ export const createRuntime = async ( let dirty = false; let pending = false; let stopped = false; - let retentions = 0; + const retentions = new Set<{ accepts?: (id: string) => boolean; activation?: ShellActivation }>(); /** True while a tab-switch handoff should skip crossfade. */ let tabSwitchHandoff = false; /** Keep instant updates until this time — DidLeave often precedes the retire sync. */ @@ -309,7 +309,7 @@ export const createRuntime = async ( try { // A retained sync performs no update; keep the modal handoff armed so the // deferred retirement still runs instantly after the overlay releases. - if (retentions && !manualSuspensions.size) return; + if (retentions.size && !manualSuspensions.size) return; modalPresentHandoff = false; const size = `${win.innerWidth}:${win.innerHeight}`; // WebKit can resize before Ionic's fixed DOM positions catch up. @@ -332,7 +332,7 @@ export const createRuntime = async ( ); } } - if (stopped || dirty || (retentions && !manualSuspensions.size)) return; + if (stopped || dirty || (retentions.size && !manualSuspensions.size)) return; const retained = new Set(candidates.flatMap(candidateSources)); const removed = Array.from(sources.keys()).filter((element) => !retained.has(element)); if (removed.length) { @@ -367,7 +367,7 @@ export const createRuntime = async ( updates++; updatingRevision = snapshot.revision; const result = await bounded(plugin.update(snapshot)); - if (stopped || (retentions && !manualSuspensions.size)) return; + if (stopped || (retentions.size && !manualSuspensions.size)) return; if (result.revision !== snapshot.revision) throw new Error('Native UI Shell revision mismatch'); if (`${win.innerWidth}:${win.innerHeight}` !== size) { lastSnapshot = ''; @@ -643,15 +643,17 @@ export const createRuntime = async ( on(win.visualViewport, 'resize', refreshLayout); on(win.visualViewport, 'scroll'); } - const handle: NativeUIShellHandle & { retain: () => () => void } = { + const handle: NativeUIShellHandle & { retain: (deferActivation?: (id: string) => boolean) => () => void } = { // A native overlay covers this surface; keep its controls and Web ownership intact. - retain() { - retentions++; - let released = false; + retain(deferActivation) { + const retention: { accepts?: (id: string) => boolean; activation?: ShellActivation } = { accepts: deferActivation }; + retentions.add(retention); return () => { - if (released) return; - released = true; - retentions--; + if (!retentions.delete(retention)) return; + // UIKit may already expose the anchor while Ionic is still dismissing. + // Replay at most one validated input after the live content is restored. + const activation = retention.activation; + if (activation && retention.accepts?.(activation.id)) win.queueMicrotask(() => activate(activation)); schedule(); }; }, @@ -712,15 +714,16 @@ export const createRuntime = async ( }, }; const activate = (event: ShellActivation) => { - if ( - stopped || - doc.hidden || - event.revision < acceptedRevision || - event.revision > revision || - event.sequence <= lastSequence || - overlayOpen(false, true) - ) + if (stopped || doc.hidden || event.revision < acceptedRevision || event.revision > revision || event.sequence <= lastSequence) return; + if (overlayOpen(false, true)) { + if (!manualSuspensions.size) { + for (const retention of retentions) { + if (retention.accepts?.(event.id) && (!retention.activation || event.sequence > retention.activation.sequence)) + retention.activation = event; + } + } return; + } // Native may send input before update() resolves on the JS bridge. // Revalidate it after ownership is accepted, using the same action path. if (event.revision > acceptedRevision && event.revision === updatingRevision) { From 6ba2639b615481dd0502cf3c96ddeeff78bee381 Mon Sep 17 00:00:00 2001 From: rdlabo Date: Thu, 15 Oct 2026 01:33:48 +0900 Subject: [PATCH 5/5] fix: complete popover cancellation and dismissal lifecycles --- demo/e2e/native-ui-shell.spec.ts | 81 +++++++++++++++++++ .../Components/ShellVerticalBars.swift | 21 +++-- .../Overlays/ShellOverlayController.swift | 11 ++- .../ShellSnapshotTests.swift | 27 +++++++ src/native/overlays/dismiss-animation.ts | 5 +- 5 files changed, 134 insertions(+), 11 deletions(-) diff --git a/demo/e2e/native-ui-shell.spec.ts b/demo/e2e/native-ui-shell.spec.ts index 870cde02..de9f34df 100644 --- a/demo/e2e/native-ui-shell.spec.ts +++ b/demo/e2e/native-ui-shell.spec.ts @@ -3530,3 +3530,84 @@ for (const disabled of [false, true]) await expect(reopened.getByText('Count: 1', { exact: true })).toBeVisible(); } }); + +for (const failure of ['reject', 'timeout'] as const) + test(`Vertical Bars popover preserves didDismiss after native dismissal ${failure}`, async ({ page }) => { + await page.setViewportSize({ width: 700, height: 900 }); + await mockNative(page); + await page.goto('/main/index/popover'); + await page.locator('ion-app').evaluate((app) => app.classList.add('ios-theme-vertical-bars')); + const trigger = page.locator('#native-popover-trigger'); + await expect(trigger).toHaveAttribute('data-native-ui-shell-vertical-bars-member', '', { timeout: 15000 }); + await page.evaluate((failure) => { + Object.assign(Capacitor.registerPlugin('IonicNativeUIShell'), { + async prepareOverlay() {}, + async presentOverlay() {}, + dismissOverlay: () => (failure === 'reject' ? Promise.reject(new Error('Native dismiss failed')) : new Promise(() => {})), + }); + }, failure); + const opened = page.waitForEvent('popup'); + await activate(page, 'Open popover'); + const relay = await opened; + await expect(relay.getByText('Toolbar popover', { exact: true })).toBeVisible(); + const result = await page.locator('ion-popover[trigger="native-popover-trigger"]').evaluate(async (overlay: HTMLIonPopoverElement) => { + const didDismiss = overlay.onDidDismiss(); + await overlay.dismiss({ saved: true }, 'confirm'); + return Promise.race([didDismiss, new Promise((resolve) => setTimeout(() => resolve('missing didDismiss'), 1000))]); + }); + expect(result).toEqual({ data: { saved: true }, role: 'confirm' }); + await expect.poll(() => relay.isClosed()).toBe(true); + await expect(trigger).toHaveAttribute('data-native-ui-shell-vertical-bars-member', ''); + const reopened = page.waitForEvent('popup'); + await activate(page, 'Open popover'); + await expect((await reopened).getByText('Toolbar popover', { exact: true })).toBeVisible(); + }); + +for (const nestedInRelay of [false, true]) + test(`Vertical Bars popover restores nested overlays (${nestedInRelay ? 'inline content' : 'source controller'})`, async ({ page }) => { + await page.setViewportSize({ width: 700, height: 900 }); + await mockNative(page); + await page.goto('/main/index/popover'); + await page.locator('ion-app').evaluate((app) => app.classList.add('ios-theme-vertical-bars')); + await expect(page.locator('#native-popover-trigger')).toHaveAttribute('data-native-ui-shell-vertical-bars-member', ''); + await page.evaluate(() => + Object.assign(Capacitor.registerPlugin('IonicNativeUIShell'), { + async prepareOverlay() {}, + async presentOverlay() {}, + async dismissOverlay() {}, + }), + ); + await page.evaluate(() => { + const open = window.open.bind(window); + window.open = (...args) => { + const relay = open(...args); + (window as Window & { reviewRelay?: Window | null }).reviewRelay = relay; + return relay; + }; + }); + const opened = page.waitForEvent('popup'); + await activate(page, 'Open popover'); + const relay = await opened; + await expect(relay.getByText('Toolbar popover', { exact: true })).toBeVisible(); + await page.evaluate(async (nestedInRelay) => { + const nested = document.createElement('ion-popover'); + nested.id = 'nested-review-popover'; + const body = document.createElement('div'); + body.textContent = 'Nested content'; + nested.component = body; + if (nestedInRelay) { + // The Angular content remains live in the child document. + const windows = window as Window & { reviewRelay?: Window }; + windows.reviewRelay!.document.querySelector('ion-popover > div')!.append(nested); + } else document.querySelector('ion-app')!.append(nested); + await nested.present(); + }, nestedInRelay); + await expect.poll(() => relay.isClosed()).toBe(true); + await expect(page.getByText('Nested content', { exact: true })).toBeVisible(); + await page + .locator('#nested-review-popover') + .evaluate(async (overlay: HTMLIonPopoverElement) => overlay.dismiss(undefined, undefined, false)); + await expect(page.getByText('Toolbar popover', { exact: true })).toBeVisible(); + await page.getByRole('button', { name: 'Close popover', exact: true }).click(); + await expect(page.locator('#native-popover-trigger')).toHaveAttribute('data-native-ui-shell-vertical-bars-member', ''); + }); diff --git a/ios/Sources/IonicNativeUIShellPlugin/Components/ShellVerticalBars.swift b/ios/Sources/IonicNativeUIShellPlugin/Components/ShellVerticalBars.swift index 51f52c88..cc13f1de 100644 --- a/ios/Sources/IonicNativeUIShellPlugin/Components/ShellVerticalBars.swift +++ b/ios/Sources/IonicNativeUIShellPlugin/Components/ShellVerticalBars.swift @@ -7,7 +7,7 @@ protocol ShellVerticalBarsControlling: AnyObject { func attach(to owner: UIViewController, in parent: UIView) @MainActor func apply(_ controls: [ShellControl], rendering: ShellRendering, edge: String) var ownsKeyboardChrome: Bool { get } - func presentPopover(anchor: String, host: ShellOverlayHost, completion: @escaping () -> Void) -> Bool + func presentPopover(anchor: String, host: ShellOverlayHost, completion: @escaping (Bool) -> Void) -> Bool func detach() } @@ -35,7 +35,7 @@ final class ShellVerticalBarsModel: ObservableObject { @Published var popoverAnchor: String? var popoverHost: ShellOverlayHost? - var popoverPresented: (() -> Void)? + var popoverPresented: ((Bool) -> Void)? @Published var search: ShellVerticalSearchModel? @Published var back: Item? @Published var groups: [Group] = [] @@ -167,9 +167,11 @@ private struct ShellVerticalBarsButton: ToolbarContent { .presentationCompactAdaptation(.popover) .interactiveDismissDisabled(host.options?["backdropDismiss"] as? Bool == false) .onAppear { + guard model.popoverHost === host else { return } + host.anchoredVisible = true let completion = model.popoverPresented model.popoverPresented = nil - completion?() + completion?(true) } .onDisappear { host.anchoredVisible = false @@ -468,14 +470,14 @@ final class ShellVerticalBarsController: ShellVerticalBarsControlling { controller.overrideUserInterfaceStyle = controls.contains(where: \.dark) ? .dark : .light } - func presentPopover(anchor: String, host: ShellOverlayHost, completion: @escaping () -> Void) -> Bool { + func presentPopover(anchor: String, host: ShellOverlayHost, completion: @escaping (Bool) -> Void) -> Bool { guard container.window != nil, model.popoverAnchor == nil, model.groups.flatMap(\.items).contains(where: { $0.id == anchor && !$0.disabled }) else { return false } model.popoverHost = host model.popoverPresented = completion - host.anchoredVisible = true + host.anchoredVisible = false host.dismissAnchored = { [weak self, weak host] in - guard let self, let host else { return } + guard let self, let host, self.model.popoverHost === host else { return } // A backdrop tap clears the binding before SwiftUI finishes closing. // Keep the live content and completion until onDisappear, including // when dismissal has already started through the system binding. @@ -484,6 +486,13 @@ final class ShellVerticalBarsController: ShellVerticalBarsControlling { transaction.disablesAnimations = host.options?["animated"] as? Bool == false withTransaction(transaction) { self.model.popoverAnchor = nil } } + // Before onAppear there will be no onDisappear to finish cleanup. + if !host.anchoredVisible { + let completion = self.model.popoverPresented + self.model.popoverPresented = nil + self.model.popoverHost = nil + completion?(false) + } } var transaction = Transaction() transaction.disablesAnimations = host.options?["animated"] as? Bool == false diff --git a/ios/Sources/IonicNativeUIShellPlugin/Overlays/ShellOverlayController.swift b/ios/Sources/IonicNativeUIShellPlugin/Overlays/ShellOverlayController.swift index 25a4c596..ca42ac7b 100644 --- a/ios/Sources/IonicNativeUIShellPlugin/Overlays/ShellOverlayController.swift +++ b/ios/Sources/IonicNativeUIShellPlugin/Overlays/ShellOverlayController.swift @@ -58,14 +58,14 @@ final class ShellOverlayController: NSObject, WKUIDelegate { return host.webView } - func present(_ id: String, options: [String: Any]?, anchored: (String, ShellOverlayHost, @escaping () -> Void) -> Bool, + func present(_ id: String, options: [String: Any]?, anchored: (String, ShellOverlayHost, @escaping (Bool) -> Void) -> Bool, completion: @escaping (Bool) -> Void) { guard self.id == id, let host, let owner, owner.presentedViewController == nil else { completion(false); return } host.apply(options) if host.options?["kind"] as? String == "popover", let anchor = host.options?["anchorId"] as? String, - anchored(anchor, host, { completion(true) }) { return } + anchored(anchor, host, completion) { return } completion(false) } @@ -74,7 +74,7 @@ final class ShellOverlayController: NSObject, WKUIDelegate { guard self.id == id, let host else { completion(); return } if let dismiss = host.dismissAnchored { if host.anchoredVisible { host.anchoredDidDismiss = completion; dismiss() } - else { completion() } + else { dismiss(); completion() } return } guard host.presentingViewController != nil else { completion(); return } @@ -93,7 +93,10 @@ final class ShellOverlayController: NSObject, WKUIDelegate { self.id = nil completion() } - if let dismiss = host.dismissAnchored, host.anchoredVisible { host.anchoredDidDismiss = finish; dismiss() } + if let dismiss = host.dismissAnchored { + if host.anchoredVisible { host.anchoredDidDismiss = finish; dismiss() } + else { dismiss(); finish() } + } else if host.presentingViewController == nil { finish() } else { host.dismiss(animated: false, completion: finish) } } diff --git a/ios/Tests/IonicNativeUIShellPluginTests/ShellSnapshotTests.swift b/ios/Tests/IonicNativeUIShellPluginTests/ShellSnapshotTests.swift index 13fcf74e..4c303a9f 100644 --- a/ios/Tests/IonicNativeUIShellPluginTests/ShellSnapshotTests.swift +++ b/ios/Tests/IonicNativeUIShellPluginTests/ShellSnapshotTests.swift @@ -1,8 +1,35 @@ import XCTest +import WebKit import Capacitor @testable import IonicNativeUIShellPlugin final class ShellSnapshotTests: XCTestCase { + @MainActor func testVerticalPopoverCanCancelBeforeSwiftUIAppearsAndReopen() throws { + guard #available(iOS 26.0, *) else { throw XCTSkip("Requires native Vertical Bars") } + let owner = UIViewController() + let window = UIWindow(frame: CGRect(x: 0, y: 0, width: 700, height: 900)) + window.rootViewController = owner + window.makeKeyAndVisible() + defer { window.isHidden = true } + let rail = ShellVerticalBarsController(activate: { _ in }, changed: { _, _, _, _, _ in 0 }) + rail.attach(to: owner, in: owner.view) + defer { rail.detach() } + rail.apply(try decode([control(["placement": "vertical-bars"])]).controls, + rendering: ShellRendering(), edge: "right") + for _ in 0..<3 { + let host = ShellOverlayHost(configuration: WKWebViewConfiguration(), options: nil, event: { _ in }) + var results: [Bool] = [] + XCTAssertTrue(rail.presentPopover(anchor: "action", host: host, completion: { results.append($0) })) + // Cancel in the same runloop turn, before SwiftUI can call onAppear. + XCTAssertFalse(host.anchoredVisible) + host.dismissAnchored?() + XCTAssertEqual(results, [false]) + XCTAssertFalse(host.anchoredVisible) + host.dismissAnchored?() + XCTAssertEqual(results, [false], "Cancellation must settle presentation only once") + } + } + private func item(_ changes: JSObject = [:]) -> JSObject { var value: JSObject = ["id": "action", "x": 4.0, "y": 8.0, "width": 44.0, "height": 44.0, "label": "Send", "accessibilityLabel": "Send message", "disabled": false, "selected": false, diff --git a/src/native/overlays/dismiss-animation.ts b/src/native/overlays/dismiss-animation.ts index 7e3b6ca7..90484ec9 100644 --- a/src/native/overlays/dismiss-animation.ts +++ b/src/native/overlays/dismiss-animation.ts @@ -5,7 +5,10 @@ export const dismissAnimation = (closing: Promise) => { const animation = createAnimation(); const play = animation.play; animation.play = async (options) => { - await closing; + // A native failure must not suppress Ionic's didDismiss event/data. + await closing.catch((error) => { + console.error('Native popover dismissal failed; completing the Ionic lifecycle.', error); + }); await play(options); }; return animation;