Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix(material/tooltip): decouple removal logic from change detection #19432

Merged
merged 2 commits into from
Mar 6, 2022

Conversation

crisbeto
Copy link
Member

Currently the logic in the tooltip that removes it from the DOM is run either if the trigger is destroyed or the exit animation has finished. The problem is that if the trigger is detached from change detection, but hasn't been destroyed, the exit animation will never run and the element won't be cleaned up. These changes switch to using CSS animations and manipulating the DOM node directly to trigger the animation.

Fixes #19365.

@crisbeto crisbeto added P3 An issue that is relevant to core functions, but does not impede progress. Important, but not urgent merge: caretaker note Alert the caretaker performing the merge to check the PR for an out of normal action needed or note G This is is related to a Google internal issue target: patch This PR is targeted for the next patch release labels May 24, 2020
@googlebot googlebot added the cla: yes PR author has agreed to Google's Contributor License Agreement label May 24, 2020
@crisbeto
Copy link
Member Author

Caretaker note: these changes have the potential to break people's tests. We should determine whether to move forward, based on how many targets it breaks.

@crisbeto crisbeto force-pushed the 19365/tooltip-animations-refactor branch 2 times, most recently from 2f8fdae to 1be7eeb Compare May 24, 2020 12:12
opacity: 0;
transform: scale(0);

// Use a very short animation if animations are disabled so the `animationend` event still fires.
Copy link
Member

Choose a reason for hiding this comment

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

We can check with a presubmit, but this feels like it could cause some issues where people are expecting synchronous behavior

src/material/tooltip/tooltip.ts Outdated Show resolved Hide resolved

/**
* Shows the tooltip with an animation originating from the provided origin
* @param delay Amount of milliseconds to the delay showing the tooltip.
*/
show(delay: number): void {
show(delay: number, isUserInteraction?: boolean): void {
Copy link
Member

Choose a reason for hiding this comment

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

Technically this is a breaking change since we export TooltipComponent in the public API (probably unintentionally)

Copy link
Member Author

Choose a reason for hiding this comment

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

I don't think it's breaking since the new parameter is optional.

Copy link
Member

@jelbourn jelbourn left a comment

Choose a reason for hiding this comment

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

LGTM

@jelbourn
Copy link
Member

jelbourn commented Jun 9, 2020

Looks like it needs a rebase to presubmit

@crisbeto crisbeto force-pushed the 19365/tooltip-animations-refactor branch from 1be7eeb to f31088b Compare June 9, 2020 15:22
@crisbeto crisbeto added action: merge The PR is ready for merge by the caretaker and removed needs rebase labels Jun 9, 2020
@crisbeto crisbeto force-pushed the 19365/tooltip-animations-refactor branch from f31088b to 27181b3 Compare June 13, 2020 09:58
@crisbeto crisbeto force-pushed the 19365/tooltip-animations-refactor branch from 27181b3 to b532858 Compare July 3, 2020 21:05
@mmalerba mmalerba removed the lgtm label Jul 31, 2020
@crisbeto crisbeto force-pushed the 19365/tooltip-animations-refactor branch from b532858 to 9f1ab9e Compare August 1, 2020 12:00
@crisbeto crisbeto force-pushed the 19365/tooltip-animations-refactor branch from 9f1ab9e to c28838e Compare August 16, 2020 07:17
@crisbeto
Copy link
Member Author

I pushed one more change to help address the concerns from #15990 by binding the internal animationend event outside the NgZone. I'm also bumping it to a P2, because this has come up a few times while triaging issues.

@crisbeto crisbeto added P2 The issue is important to a large percentage of users, with a workaround and removed P3 An issue that is relevant to core functions, but does not impede progress. Important, but not urgent labels Aug 16, 2020
@mmalerba
Copy link
Contributor

mmalerba commented Sep 2, 2020

FYI this has 24 failing targets, it would be possible to get in, but would take some effort

@crisbeto crisbeto force-pushed the 19365/tooltip-animations-refactor branch 2 times, most recently from a9182a7 to a12d729 Compare June 20, 2021 12:18
@andrewseguin andrewseguin added needs rebase and removed cla: yes PR author has agreed to Google's Contributor License Agreement labels Dec 28, 2021
@crisbeto crisbeto force-pushed the 19365/tooltip-animations-refactor branch from a12d729 to 136cacf Compare January 3, 2022 09:40
@mmalerba
Copy link
Contributor

It seems that there's something not being properly flushed when using the harness. There's a test that looks roughly like this:

  const tooltip1 = await getHarness(MatTooltipHarness.with({selector: 'tt1'}));
  await (await tooltip1.host()).hover();
  expect(await tooltip1.isOpen()).toEqual(true);
  await (await tooltip1.host()).mouseAway();
  const tooltip2 = await getHarness(MatTooltipHarness.with({selector: 'tt2'}));
  await (await tooltip2.host()).hover();
  expect(await tooltip2.isOpen()).toEqual(true);
  await (await tooltip2.host()).mouseAway();

For the second tooltip the isOpen check fails, if I comment out the tooltip1 stuff then it passes

@mmalerba mmalerba removed the action: merge The PR is ready for merge by the caretaker label Jan 20, 2022
@crisbeto crisbeto force-pushed the 19365/tooltip-animations-refactor branch from 136cacf to 46e4e9a Compare March 5, 2022 11:01
@crisbeto crisbeto added the action: merge The PR is ready for merge by the caretaker label Mar 5, 2022
@crisbeto
Copy link
Member Author

crisbeto commented Mar 5, 2022

I've rebased and added some logic to the test harnesses to simulate the animationend events.

@crisbeto crisbeto force-pushed the 19365/tooltip-animations-refactor branch 4 times, most recently from 27cf676 to da99bbd Compare March 5, 2022 15:33
Currently the logic in the tooltip that removes it from the DOM is run either if the trigger
is destroyed or the exit animation has finished. The problem is that if the trigger is
detached from change detection, but hasn't been destroyed, the exit animation will
never run and the element won't be cleaned up. These changes switch to using CSS
animations and manipulating the DOM node directly to trigger the animation.

Fixes angular#19365.
@crisbeto crisbeto force-pushed the 19365/tooltip-animations-refactor branch 4 times, most recently from 851cdfe to 01eacdc Compare March 6, 2022 09:34
@crisbeto crisbeto force-pushed the 19365/tooltip-animations-refactor branch from 01eacdc to fb516c0 Compare March 6, 2022 10:16
@crisbeto crisbeto merged commit a5ab8e9 into angular:master Mar 6, 2022
crisbeto added a commit that referenced this pull request Mar 6, 2022
…19432)

* fix(material/tooltip): decouple removal logic from change detection

Currently the logic in the tooltip that removes it from the DOM is run either if the trigger
is destroyed or the exit animation has finished. The problem is that if the trigger is
detached from change detection, but hasn't been destroyed, the exit animation will
never run and the element won't be cleaned up. These changes switch to using CSS
animations and manipulating the DOM node directly to trigger the animation.

Fixes #19365.

* fixup! fix(material/tooltip): decouple removal logic from change detection

(cherry picked from commit a5ab8e9)
crapStone pushed a commit to Calciumdibromid/CaBr2 that referenced this pull request Mar 18, 2022
This PR contains the following updates:

| Package | Type | Update | Change |
|---|---|---|---|
| [@angular/cdk](https://github.com/angular/components) | dependencies | patch | [`13.2.5` -> `13.2.6`](https://renovatebot.com/diffs/npm/@angular%2fcdk/13.2.5/13.2.6) |
| [@angular/material](https://github.com/angular/components) | dependencies | patch | [`13.2.5` -> `13.2.6`](https://renovatebot.com/diffs/npm/@angular%2fmaterial/13.2.5/13.2.6) |

---

### Release Notes

<details>
<summary>angular/components</summary>

### [`v13.2.6`](https://github.com/angular/components/blob/HEAD/CHANGELOG.md#&#8203;1326-suede-spaghetti-2022-03-09)

[Compare Source](angular/components@13.2.5...13.2.6)

##### cdk

| Commit | Type | Description |
| -- | -- | -- |
| [39929a815d](angular/components@39929a8) | fix | **overlay:** backdrop timeouts not being cleared in some cases ([#&#8203;23972](angular/components#23972)) |
| [2f2b0c7cf4](angular/components@2f2b0c7) | fix | **testing:** dispatch mouseover and mouseout events in UnitTestElement ([#&#8203;24490](angular/components#24490)) |
| [edca54f2d0](angular/components@edca54f) | fix | **testing:** require at least one argument for locator functions ([#&#8203;23619](angular/components#23619)) |

##### material

| Commit | Type | Description |
| -- | -- | -- |
| [c4993ac171](angular/components@c4993ac) | fix | **button:** avoid setting a tabindex on all link buttons ([#&#8203;22901](angular/components#22901)) |
| [c47d30e0e5](angular/components@c47d30e) | fix | **dialog:** don't wait for animation before moving focus ([#&#8203;24121](angular/components#24121)) |
| [70b8248568](angular/components@70b8248) | fix | **expansion:** able to tab into descendants with visibility while closed ([#&#8203;24045](angular/components#24045)) |
| [d22d73ab8d](angular/components@d22d73a) | fix | **select:** disabled state out of sync when swapping form group with a disabled one ([#&#8203;17872](angular/components#17872)) |
| [911d6b71d4](angular/components@911d6b7) | fix | **slide-toggle:** clear name from host node ([#&#8203;15505](angular/components#15505)) |
| [4b5363d160](angular/components@4b5363d) | fix | **tooltip:** decouple removal logic from change detection ([#&#8203;19432](angular/components#19432)) |

##### material-experimental

| Commit | Type | Description |
| -- | -- | -- |
| [8414646d79](angular/components@8414646) | fix | **mdc-card:** remove extra margin if header doesn't have an avatar ([#&#8203;19072](angular/components#19072)) |
| [f66486dc5b](angular/components@f66486d) | fix | **mdc-slider:** fix a few null pointer exceptions ([#&#8203;23659](angular/components#23659)) |

##### multiple

| Commit | Type | Description |
| -- | -- | -- |
| [6ee0089ce6](angular/components@6ee0089) | fix | don't block child component animations on open ([#&#8203;24529](angular/components#24529)) |

#### Special Thanks

Andrew Seguin, Jeri Peier, Kristiyan Kostadinov and Paul Gschwendtner

<!-- CHANGELOG SPLIT MARKER -->

</details>

---

### Configuration

📅 **Schedule**: At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about these updates again.

---

 - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, click this checkbox.

---

This PR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate).

Co-authored-by: cabr2-bot <[email protected]>
Reviewed-on: https://codeberg.org/Calciumdibromid/CaBr2/pulls/1214
Reviewed-by: Epsilon_02 <[email protected]>
Co-authored-by: Calciumdibromid Bot <[email protected]>
Co-committed-by: Calciumdibromid Bot <[email protected]>
forsti0506 pushed a commit to forsti0506/components that referenced this pull request Apr 3, 2022
…ngular#19432)

* fix(material/tooltip): decouple removal logic from change detection

Currently the logic in the tooltip that removes it from the DOM is run either if the trigger
is destroyed or the exit animation has finished. The problem is that if the trigger is
detached from change detection, but hasn't been destroyed, the exit animation will
never run and the element won't be cleaned up. These changes switch to using CSS
animations and manipulating the DOM node directly to trigger the animation.

Fixes angular#19365.

* fixup! fix(material/tooltip): decouple removal logic from change detection
@angular-automatic-lock-bot
Copy link

This issue has been automatically locked due to inactivity.
Please file a new issue if you are encountering a similar or related problem.

Read more about our automatic conversation locking policy.

This action has been performed automatically by a bot.

@angular-automatic-lock-bot angular-automatic-lock-bot bot locked and limited conversation to collaborators Apr 6, 2022
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
action: merge The PR is ready for merge by the caretaker G This is is related to a Google internal issue merge: caretaker note Alert the caretaker performing the merge to check the PR for an out of normal action needed or note P2 The issue is important to a large percentage of users, with a workaround target: patch This PR is targeted for the next patch release
Projects
None yet
Development

Successfully merging this pull request may close these issues.

bug(MatTooltip): MatTooltip not work well with cdk-virtual-scroll-viewport
5 participants