Visitar URL original
fix(tooltip): Let go of a ToolTip in the service when it closes, however it closed by mikernet · Pull Request #25137 · unoplatform/uno · GitHub
Skip to content

fix(tooltip): Let go of a ToolTip in the service when it closes, however it closed - #25137

Merged
MartinZikmund merged 15 commits into
unoplatform:masterfrom
mikernet:dev/mikernet/tooltip-external-close
Nov 5, 2026
Merged

MartinZikmund merged 15 commits into
unoplatform:masterfrom
mikernet:dev/mikernet/tooltip-external-close

Conversation

@mikernet

@mikernet mikernet commented Oct 9, 2026 •

Copy link
Copy Markdown
Contributor

Stacked on #24592: GitHub can't base a PR on a branch of a fork, so this PR targets master and its diff includes #24592's commits. This PR's own changes are the last two commits, c43992e and 7c16adc. I'll rebase it onto master once #24592 merges.

GitHub Issue: related to #25099 (follow-up to #25102)

PR Type:

🐞 Bugfix

What changed? 🚀

ToolTipService keeps the automatic ToolTip it last opened as its current one. A tooltip closed by a path the service does not drive, such as its popup being closed along with the other popups or the app setting IsOpen to false, stayed referenced as the current tooltip, and through it the owner it is set on.

WinUI clears ToolTipServiceMetadata::m_tpCurrentToolTip in the tooltip's own IsOpen change rather than in the service's close paths, so the service lets go of a tooltip whichever path closed it (MUX Reference: ToolTip_Partial.cpp, ToolTip::OnIsOpenChanged). This PR does the same: ToolTip.OnOpenChanged tells the service when the tooltip has closed, and the service drops it if it is still the current one. The change sits in the closing branch of ToolTip.OnOpenChanged, which #24592 rewrites, hence the stacking.

Relation to #25102

A tooltip whose opening is cancelled during the show delay never changes IsOpen, so the tooltip-side notification cannot cover it; WinUI drops that pending state in the service's cancel path (ToolTipService::CancelAutomaticToolTip). #25102 already makes the service's close path drop the current tooltip, so this PR carries those two ToolTipService hunks from #25102 verbatim, which makes it complete on its own base. The hunks are identical, so the two PRs merge cleanly in either order; whichever lands second simply contains them already.

With both in place, the service clears the current tooltip when it closes or cancels one itself, and the tooltip tells the service when anything else closed it. #25102 alone already releases the owner once it unloads, since OnOwnerUnloaded closes through the service; what this PR adds on top is that a tooltip closed outside the service is not held while its owner is still loaded.

Tests

Given_ToolTip, input injection, Skia (excluded on native WinUI since they check the service's bookkeeping and managed reachability; they compile against WinAppSDK):

  • When_Popup_Closed_Externally_Then_Service_Releases_ToolTip: hovers an owner until its tooltip opens, closes the popup while the pointer stays on the owner, and checks the service no longer holds the tooltip.
  • When_Popup_Closed_Externally_Then_Owner_Collected: the same, then removes the owner and checks it is collected.
  • When_Opening_Cancelled_Then_Owner_Collected: the pointer leaves during the show delay, so the tooltip never opens; the service must drop the pending tooltip and the owner is collected once removed.

All three fail on this base without the change and pass with it; Given_ToolTip passes in full on Skia desktop, and the two collection tests pass repeatedly on Skia desktop and WASM. Run on their own in a fresh app, When_Popup_Closed_Externally_Then_Owner_Collected needs the runner's retry until #25102 is in: a shared theme brush keeps the first popup the app opens as its associated parent, and with it that tooltip and its owner (#25099). With #25102's fix for that, it passes on the first attempt there too.

PR Checklist ✅

When a ToolTip opened, it was added to the popup panel and its parent
was then reset to what it was before, which is null for a tooltip set
through ToolTipService. Layout invalidations from the tooltip content
walk the parent chain to reach the layout root, so they stopped at the
tooltip: an Image whose bitmap arrived after the tooltip opened kept
its measure-dirty flag and stayed blank until the tooltip was opened
again and measured from scratch.

The tooltip now stays parented to the popup panel while it is showing
and leaves it when it closes. The parent was reset to keep the panel's
DataContext from replacing the one the owner provides through
ToolTipService.ToolTip, so that value is re-applied after parenting and
the owner's DataContextChanged is forwarded while open.

Fixes unoplatform#24557
Popup.Child sets the logical parent override, so the public Parent is
the popup after the first open and the actual parent must drive the
attach. The owner DataContext is read before joining the popup panel,
whose own DataContext is inherited on parenting.
Copilot AI balanced review requested due to automatic review settings October 9, 2026 03:29
@mikernet

mikernet commented Oct 9, 2026 •

Copy link
Copy Markdown
Contributor Author

For a servicing/6.8 backport: ported onto the 6.8.0-dev.212 commit at Singulink@3cfe072050 (branch Singulink:custom/6.8, which also carries #24592 and #25102). On that branch Given_ToolTip passes in full (20 tests).

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

🟡 Changes recommended

Cancelling a tooltip before its delayed opening still retains it, and several tests require cleanup and discovery corrections.

3 open findings
What changed in this PR

Ensures closed tooltips are released by ToolTipService, preventing owners and DataContexts from being retained.

Changes:

  • Clears the current tooltip after external or app-driven closure.
  • Preserves popup parenting and owner DataContext behavior.
  • Adds runtime coverage for tooltip lifecycle and collection.

Review found 9 issues: one incomplete close path and eight test-convention violations.

File Description
ToolTipService.cs Tracks containers and releases closed tooltips.
ToolTip.cs Handles popup detachment, DataContext, and close notification.
Given_ToolTip.cs Adds lifecycle, layout, and leak tests.

🧠 Review effort: Balanced


💡 Add a code-review agent skill for context-aware, tailored reviews. Learn more in the docs.

The tooltip tests closed their popups in finally but left their owner as the
window content, so the visual tree outlived the test.
Copilot AI balanced review requested due to automatic review settings October 9, 2026 03:46
@mikernet
mikernet force-pushed the dev/mikernet/tooltip-external-close branch from 9d414ec to e7496a8 Compare October 9, 2026 03:46

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

🟢 Approval recommended

The close-path bookkeeping is reentrancy-safe and adequately covered by focused runtime tests.

0 open findings

3 resolved since last review

🧠 Review effort: Balanced

mikernet added a commit to mikernet/uno that referenced this pull request Oct 9, 2026
…platform#25137 after review

The unoplatform#24592 tooltip tests reset the window content in finally (ca34dc1).
The unoplatform#25137 tests follow e7496a8: compiled on every head and skipped on
native WinUI with PlatformCondition instead of #if HAS_UNO, popups closed
through the public VisualTreeHelper.GetOpenPopupsForXamlRoot, and a new
test for a tooltip whose opening is cancelled during the show delay.

The source side of e7496a8 is already on this branch: the ToolTip
close notification (3cfe072) and the service-side clears it carries
from unoplatform#25102 (800247f).
@MartinZikmund

Copy link
Copy Markdown
Member

/azp run

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

@nventive-devops

Copy link
Copy Markdown
Contributor

The build 238497 found UI Test snapshots differences: skia-linux-screenshots: 118, skia-windows-screenshots: 1134

Details
  • skia-linux-screenshots: 118 changed over 2458

    🚨🚨 Comparison Details (first 20) 🚨🚨
    • Buttons.png-dark
    • Buttons.png
    • ClipboardTests.png-dark
    • ButtonClippingTestsControl.png-dark
    • ButtonClippingTestsControl.png
    • CompositionEffectBrush.png-dark
    • CompositionEffectBrush.png
    • CompositionNineGridBrush_Source_Changes.png-dark
    • CompositionNineGridBrush_Source_Changes.png
    • CalendarView_Theming.png-dark
    • CalendarView_Theming.png
    • ElementLevelTheme.png-dark
    • ElementLevelTheme.png
    • DynamicFont.png-dark
    • DynamicFont.png
    • DropDownButtonPage.png-dark
    • Examples.png
    • Focus_FocusVisual_Properties.png-dark
    • Focus_FocusVisual_Properties.png
    • DisplayInformation.png-dark
  • skia-windows-screenshots: 1134 changed over 2474

    🚨🚨 Comparison Details (first 20) 🚨🚨
    • AnimatedIconPage.png
    • AppWindowFeatures.png-dark
    • AutoBorderStretchwithleftmargin.png
    • Attributed_text_Simple.png
    • AutomationProperties_AutomationId.png-dark
    • AutomationProperties_Relations.png-dark
    • AutomationProperties_Relations.png
    • BackGesture.png-dark
    • Basics_Automated.png-dark
    • Basics_Automated.png
    • BitmapIcon_Foreground.png-dark
    • BitmapIcon_Foreground.png
    • Border_AntiAlias.png-dark
    • Border_Simple_No_Background_With_TextBox.png-dark
    • Border_AntiAlias.png
    • Border_Simple_No_Background_With_TextBox.png
    • Border_CornerRadius_Alignments.png-dark
    • Border_CornerRadius_Alignments.png
    • Border_CornerRadius_Gradient.png-dark
    • ButtonClippingTestsControl.png-dark

@morning4coffe-dev morning4coffe-dev left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Verified by code review against WinUI ToolTip_Partial.cpp (ToolTip close path clears m_tpCurrentToolTip, around lines 394 and 2189) and ToolTipService_Partial.cpp. Read the PR's own commit e7496a8, head ToolTip.cs / ToolTipService.cs, and the new Given_ToolTip.cs tests, and checked the Azure build timeline for run 238497. Not validated: no build or test run here. The "fails without the change, passes with it" claims are author-reported.

Findings (ranked):

  1. High, CI blocker: Given_ToolTip.cs:977 and :995 call GetAbsoluteBoundsRect() on a Button outside any #if HAS_UNO guard. That extension is Uno-only and internal (src/Uno.UI/UI/LayoutHelper.cs:422). The Windows/WinAppSDK test build fails: error CS1061: 'Button' does not contain a definition for 'GetAbsoluteBoundsRect' (Azure build 238497, BuildMSIX, log 713), which fails both "Uno.UI - CI" and "Tests - WinAppSDK Build Samples App". The PR description says these tests "are compiled on every head", which the CI result contradicts. Fix: guard the bounds computation with #if HAS_UNO, or use a WinUI-compatible helper (for example TransformToVisual) so the test compiles on native WinUI.

  2. Medium, scope: the PR base is master, not the parent PR, so gh pr diff includes the parent #24592 work (commits ca34dc1, 427c457, 524dd16, f0d86ec on dev/mikernet/tooltip-image-pending) and the DataContext/AttachToPopup/DetachFromPopup rewrite in ToolTip.cs. The PR's own change is only commit e7496a8 (OnToolTipClosed, the ToolTipService hunks, and tests). Reviewers cannot evaluate this PR in isolation. Retarget the base to the parent branch, or merge #24592 first and rebase.

  3. Low, test design: the GC-based tests (When_Popup_Closed_Externally_Then_Owner_Collected, When_Opening_Cancelled_Then_Owner_Collected) depend on TestHelper.TryWaitUntilCollected and may be flaky across platforms. Confirm they are stable on Skia WASM and Desktop before merge.

  4. Nit: ToolTipService.cs internal static ToolTip CurrentToolTipForTesting adds a production-side member only for tests. Acceptable given InternalsVisibleTo, but worth a note.

Verified OK:

  • WinUI parity for the root-cause logic: ToolTip_Partial.cpp clears m_tpCurrentToolTip on the automatic close path, and the PR's if (!isOpen) in OnOpenChanged matches it. The disabled-open case (isOpen true, !IsEnabled) correctly does not release the tooltip.
  • CloseToolTipImpl now always sets IsOpen=false, which is equivalent to the old branches.
  • OnOwnerLoaded/OnOwnerUnloaded paths still close through the service.
  • Copilot's earlier findings (OnToolTipClosed missing the cancel case, the #if HAS_UNO wrapping, the WindowContent reset) are addressed at head per the author's replies.

Verdict: COMMENT. Finding 1 must be fixed before the Windows CI can pass.

The owner's DataContextChanged and ActualThemeChanged were subscribed on
open and unsubscribed on close through the container and the anchor,
which are read again each time. When the tooltip is set on another
element while it is open, both change in between, so closing unsubscribed
from the new element and left the handlers on the first one for good: it
kept writing its DataContext into the tooltip even after the tooltip was
removed from it. Keep the elements that were subscribed and unsubscribe
from those.
Since the popup lets go of the tooltip on close, every open assigns
Popup.Child afresh, and the popup adds its child to the popup panel and
removes it again, which sets and clears the tooltip's parent. The explicit
SetParent calls and the guard around the Popup.Child assignment no longer
did anything.
The closed tooltip gets its owner's DataContext changes from
ToolTipService.ToolTip's default metadata (ValueInheritsDataContext), and
the parity of forwarding them while open rests on WinUI's behavior rather
than on its source, which has no such handler: the DataContext tests run
on native WinUI and pass there. Say both where they apply.
On native WinUI the popup lets go of the tooltip only once the Closed
visual transition has played (ToolTip::Close runs when its storyboard
completes), so When_Closed_Then_Parent_Cleared failed there right after
WaitForIdle. Wait for the parent to clear instead; Uno releases it as soon
as the tooltip closes.
Copilot AI balanced review requested due to automatic review settings October 16, 2026 12:17
@mikernet
mikernet force-pushed the dev/mikernet/tooltip-external-close branch from e7496a8 to 25c50ad Compare October 16, 2026 12:17
@mikernet

mikernet commented Oct 16, 2026 •

Copy link
Copy Markdown
Contributor Author

@morning4coffe-dev, by finding:

  1. Fixed in 7c16adc: the two hover helpers take the owner's bounds from the runtime tests' GetAbsoluteBounds() (TransformToVisual(null), which WinUI has) instead of Uno's internal GetAbsoluteBoundsRect(), and import Uno.UI.Extensions for Rect.GetCenter(), which on WinAppSDK comes from Uno.UI.Extras. My earlier reply saying the tests compile on every head was wrong. I compiled Uno.UI.RuntimeTests.Windows for net10.0-windows10.0.19041.0 locally: the old head fails with the same CS1061 at both lines, and the new one builds. The rest of the tests in this PR and in fix(tooltip): Keep the popup panel as parent while a ToolTip is open #24592 use only API available on WinAppSDK outside #if HAS_UNO (ToolTipService.CurrentToolTipForTesting and VisualTreeHelper.CloseAllPopups are inside it). fix(tooltip): Keep the popup panel as parent while a ToolTip is open #24592's tests, all but its bound-DataContext one, are not excluded on native WinUI, so I also ran Given_ToolTip on the WinAppSDK SamplesApp head: they pass there.
  2. The base can't be the parent branch: it lives on my fork, and GitHub only takes a base branch from the target repository. So this PR targets master and is stacked on fix(tooltip): Keep the popup panel as parent while a ToolTip is open #24592; the body says so at the top and names this PR's own commits (c43992e, 7c16adc), the rest of the diff being fix(tooltip): Keep the popup panel as parent while a ToolTip is open #24592. I'll rebase it onto master once fix(tooltip): Keep the popup panel as parent while a ToolTip is open #24592 merges. fix(tooltip): Keep the popup panel as parent while a ToolTip is open #24592 got new commits for its own review, so I rebased this branch onto them (force-pushed).
  3. Checked; one of them depends on fix: Stop shared dependency objects retaining discarded elements and their DataContext #25102. In a full Given_ToolTip run both pass on the first attempt. Run on their own (just the two collection tests) in a fresh app, When_Opening_Cancelled_Then_Owner_Collected passed first time in all 10 desktop runs, but When_Popup_Closed_Externally_Then_Owner_Collected failed its first attempt in all 10 and passed on the runner's retry. A heap dump at that failure shows the path: Uno's built-in theme resources → a shared SolidColorBrush → its _associatedParent → the tooltip's Popup → its Opened/Closed handler → the ToolTip → the owner. A shareable value keeps the first element it is applied to as a strong associated parent, so the first popup the app opens stays alive; a second user clears the association, which is why the retry passes. That is [Skia] Shared dependency objects (style setter values, static brushes, input scopes, current tooltip) retain elements and DataContext of pages that are gone #25099, which fix: Stop shared dependency objects retaining discarded elements and their DataContext #25102 fixes in its commit "fix(dependencyobject): Make shared value links to owners non-owning"; the service no longer holds anything by then. With that commit applied locally, both tests pass on the first attempt in 5 of 5 isolated runs. So it passes on the first attempt once fix: Stop shared dependency objects retaining discarded elements and their DataContext #25102 is in; until then the runner's retry covers it, and I left the test as is rather than open a warm-up popup that would hide that leak. WASM shows the same pattern: in 5 of 5 isolated runs the cancelled test passes on the first attempt and the externally-closed one on the retry (I checked that commit on desktop only).
  4. It is a production-side member that only the tests read: there is no public way to see the service's current tooltip, and When_Popup_Closed_Externally_Then_Service_Releases_ToolTip and the cancel-path premise check need it. It is internal, read-only, and only read inside #if HAS_UNO.

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

🟡 Changes recommended

Closing a tooltip incorrectly copies its effective DataContext into the inherited value, breaking local overrides and bindings.

1 open finding

🧠 Review effort: Balanced

AttachToPopup and DetachFromPopup carried the tooltip's DataContext across
the parent change by reading DataContext, the effective value, and writing
it back at Inheritance precedence. A DataContext set or bound on the
tooltip itself was therefore copied into the layer the owner provides:
clearing a local value left it behind, and a binding re-evaluated against
its own result. Read the inherited value instead.
…ver it closed

ToolTipService kept the automatic ToolTip it last scheduled or opened as
its current one until another one opened. A tooltip closed by a path the
service does not drive (its popup closed with the other popups, or the
app setting IsOpen) stayed referenced, and so did one whose opening was
cancelled during the show delay, and with either the owner it is set on.

WinUI clears ToolTipServiceMetadata::m_tpCurrentToolTip in the ToolTip's
own IsOpen change rather than in the service's close paths, and drops the
pending owner when an automatic tooltip is cancelled before it opens. The
ToolTip now tells the service when it has closed, and the service drops
it if it is still the current one. The service also drops the current
tooltip when it closes or cancels it itself; those two hunks are unoplatform#25102's
verbatim, so the two changes merge cleanly in either order.

MUX Reference: ToolTip_Partial.cpp, ToolTip::OnIsOpenChanged;
ToolTipService_Partial.cpp, ToolTipService::CancelAutomaticToolTip.

Runtime tests: a hovered tooltip whose popup is closed while the pointer
stays on the owner is no longer the service's current tooltip and its
owner is collected once removed; a tooltip whose opening is cancelled is
dropped by the service and its owner is collected once removed.
GetAbsoluteBoundsRect is an internal Uno extension, so the two tests that
hover the owner did not compile against WinAppSDK (CS1061) and broke the
WinAppSDK test build. GetAbsoluteBounds gives the same window-relative
rectangle through TransformToVisual, which WinUI has, and the Rect
GetCenter extension comes from Uno.UI.Extras' Uno.UI.Extensions there.
Copilot AI balanced review requested due to automatic review settings October 16, 2026 13:12
@mikernet
mikernet force-pushed the dev/mikernet/tooltip-external-close branch from 25c50ad to 7c16adc Compare October 16, 2026 13:12

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

🟢 Approval recommended

The lifecycle changes have focused regression coverage, and no unresolved blocking issues remain.

0 open findings

1 resolved since last review

🧠 Review effort: Balanced

mikernet added a commit to Singulink/uno that referenced this pull request Oct 16, 2026
…at was subscribed (port)

Port of the latest unoplatform#24592 round (0994593, bd13144, 94e4f41,
d62ceb9 and b825e58 on top of ca34dc1):
- Closing unsubscribes from the elements that were subscribed on open,
  kept in _themeSource and _dataContextSource, instead of reading the
  anchor and the container again, which change when the tooltip is set
  on another element while it is open.
- AttachToPopup and DetachFromPopup carry the inherited DataContext only,
  so a DataContext set or bound on the tooltip itself is not copied into
  the layer the owner provides.
- Popup.Child parents the tooltip: the explicit SetParent calls and the
  guard around the assignment are gone.
- The tests from those commits, the [Bindable] view model they use, and
  the comments.

6.8 differences:
- The theme subscription is still behind UNO_HAS_ENHANCED_LIFECYCLE, and
  the DataContext forwarding has its own unconditional pair (47830b3),
  so _themeSource sits in the gated pair and _dataContextSource in the
  other.
- 6.8 has ReadInheritedValueOrDefaultValue on DependencyObjectStore only,
  so it is called through IDependencyObjectStoreProvider, as Control does.
- Dropping SetParent holds on 6.8 too: Popup.Child goes through the same
  OnChildChangedPartialNative, and PopupPanel.Children.Add and Remove set
  and clear the parent (UIElement.AddChild/RemoveChild on Skia and WASM,
  BindableView on Android).
- The tests live in Tests/Windows_UI_Xaml_Controls. The hover helpers keep
  GetAbsoluteBoundsRect: 7c16adc only fixes the WinAppSDK test build.

unoplatform#25137 (c43992e) carries no source change beyond the earlier port:
ToolTipService.cs already matches it.
@agneszitte

Copy link
Copy Markdown
Member

/azp run

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

@agneszitte

Copy link
Copy Markdown
Member

@MartinZikmund can you help follow up on this PR please

@unodevops

Copy link
Copy Markdown
Contributor

🤖 Your WebAssembly Sample App stage site is ready! Visit it here:

@nventive-devops

Copy link
Copy Markdown
Contributor

The build 242667 found UI Test snapshots differences: skia-linux-screenshots: 2458, skia-windows-screenshots: 2458

Details
  • skia-linux-screenshots: 2458 changed over 2492

    🚨🚨 Comparison Details (first 20) 🚨🚨
    • AndroidWindowInsets.png
    • AppBarToggleButtonTest.png
    • ApplicationViewSizing.png
    • ArcSegment.png
    • AuthenticationBroker_Cancel.png-dark
    • AutoBorderStretchwithrightmargin.png
    • AutomationProperties_Relations.png
    • AutoSizedTopLeft.png-dark
    • AutoSuggestBox_Icons.png-dark
    • AutoSuggestBox_Icons.png
    • Basics Pivot Test.png-dark
    • Basics Pivot Test.png
    • BeginTime_MultipleAnimations.png-dark
    • BeginTime_MultipleAnimations.png
    • BitmapIcon_Monochromatic.png-dark
    • BitmapIcon_Monochromatic.png
    • BorderCenteredwithmargins.png-dark
    • BorderCenteredwithmargins.png
    • BorderVersusPanelClipping.png-dark
    • BorderVersusPanelClipping.png
  • skia-windows-screenshots: 2458 changed over 2492

    🚨🚨 Comparison Details (first 20) 🚨🚨
    • AnimatedIconPage.png
    • AnimatedVisualsTestbedPage.png-dark
    • AppBarButtonWithIconTest.png
    • ApplicationViewSizing.png
    • AppWindowClosing.png-dark
    • AppWindowPositionAndSize.png
    • Arrange_Performance01.png-dark
    • Attributed_text_Supserscript.png-dark
    • AutoBorderStretchwithleftmargin.png-dark
    • AutoBorderStretchwithleftmargin.png
    • AutomationProperties_Name.png-dark
    • AutomationProperties_Name.png
    • AutoSizedTopLeft.png-dark
    • AutoSizedTopLeft.png
    • AutoSuggestBox_BitmapIcon.png-dark
    • AutoSuggestBox_BitmapIcon.png
    • BadgeNotificationTests.png-dark
    • BadgeNotificationTests.png
    • Basics.png-dark
    • Basics.png

@unodevops

Copy link
Copy Markdown
Contributor

⚠️⚠️ The build 242667 has failed on Uno.UI - CI.

@MartinZikmund
MartinZikmund merged commit 22922a6 into unoplatform:master Nov 5, 2026
73 of 76 checks passed
ajpinedam added a commit that referenced this pull request Nov 5, 2026
…sed-6.8

fix: Release the current ToolTip when it closes (backport #25137, #26096)
agneszitte added a commit that referenced this pull request Nov 10, 2026
…6.7/pr-26098

fix: Release the current ToolTip when it closes (backport #25137, #26096) (backport #26098)
mikernet added a commit to Singulink/uno that referenced this pull request Nov 14, 2026
Takes Uno's servicing/6.8 from 6951c2c up to 5254ace (42 pull
requests). Conflicts, by area:

IME and TextBox (unoplatform#25984, backport of unoplatform#25804; unoplatform#25952, backport of unoplatform#25619;
unoplatform#25976, backport of unoplatform#25818)
- Takes upstream's composition design (unoplatform#25804): the browser's input is
  the source of truth for the text, compositions included. This drops
  the composition parts of the unoplatform#24502 port (90746b8): its
  TypeScript composition handling, the StartIndex/TextChangePending
  event arguments, the IsReadOnly forwarding to the hidden input, and
  its Given_TextBox.BrowserSoftKeyboard tests.
- Keeps the non-IME browser fixes on top of it, in the form their
  master pull requests have on unoplatform#25804: Enter raised once per press and
  tracked by key code (unoplatform#25174, with Given_TextBox.BrowserEnterKey from
  master in place of the Enter tests that lived in the dropped file),
  the iOS refocus on tap (unoplatform#25185), pastes without text and isIOS from
  BrowserInputHelper.
- Moves the unoplatform#26005 MaxLength fixes onto unoplatform#25804's native input path, as
  master has them: a refused browser edit keeps the TextBox's selection,
  TextBoxView.UpdateTextFromNative reports whether the edit went in, and
  the IME keeps its range on the applied text (master be85699, which
  d226897 had ported onto the unoplatform#24502 IME). Adds that commit's browser
  and platform-applied IME tests.
- TextBox.pointers.skia.cs: upstream's file (unoplatform#25619 iOS touch editing,
  unoplatform#25818, unoplatform#25804), with the unoplatform#25126 port (the hold acts when it starts,
  a touch right-tap keeps the caret) in the form master's unoplatform#25126 branch
  has it on unoplatform#25619, including focusing before the iOS hold timer acts
  and its iOS not-focusable test.

Pointers (unoplatform#25976, backport of unoplatform#25818)
- Tapped and RightTapped are raised once the PointerReleased bubbled
  (unoplatform#25818), with the unoplatform#25732 port's window coordinates (2-argument
  routed event args, RawPosition for ContextRequested), as master's
  unoplatform#25732 branch has them.
- The release wrapper of unoplatform#25818 keeps the unoplatform#25126 port's
  StopContextMenuTimer at the start of the release.

DependencyObject (unoplatform#26142, backport of unoplatform#26123)
- Takes upstream, then the code of unoplatform#25839 (97a2f17), which replaces
  this branch's unoplatform#25102 ports (800247f, be41da6, fd40bf9,
  7546379). DependencyObjectStore.Binder.cs, .alc.cs,
  Application.Alc.cs, ResourceDictionary.alc.cs and their tests now
  match unoplatform#25839; this drops 800247f's own
  SingleParentNonFE_Parent_Removes_Value_Then_Next_Parent_Starts_Clean
  test, which unoplatform#25839 doesn't have.

Imaging (unoplatform#25597, unoplatform#25915, unoplatform#25911, unoplatform#25897)
- Keeps this branch's side: it has the later forms of these fixes
  (unoplatform#25124, unoplatform#25559, unoplatform#25633 and unoplatform#26370 ports), where upstream has the
  6.8-only unoplatform#25597 design and earlier snapshots. Upstream's shared
  download, IgnoreImageCache and failed-load fixes are covered by
  SharedImageDecode. Adds upstream's When_Source_Outlives_Brushes test.

ToolTip (unoplatform#26098, backport of unoplatform#25137 and unoplatform#26096)
- Keeps this branch's unoplatform#25137 port and adds unoplatform#26096 in master's form: the
  service releases only a ToolTip it opened, and leaves one the app
  opened during the show delay to the app. Keeps both sides' tests.

Flyout (unoplatform#26062, backport of unoplatform#26060)
- This branch had the same commits already; keeps the "Keep
  non-resizable flyouts in window" port and its tests.

Also removes a helper pair in Given_AccessibleTextBox that both sides
added.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

7 participants