Fixing CommandBarFlyout lifetime crashing bug #6929
Merged
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Description
The onCompleteFunc function provided to CommandBarFlyoutCommandBar::PlayCloseAnimation method would sometimes be executed on an already destroyed CommandBarFlyout, causing an app crash.
Motivation and Context
This problem recently surfaced when a consumer called CommandBarFlyout.Hide in a FlyoutClosed handler. By the time the closing animation completed, the CommandBarFlyout may already have been destroyed. The app would crash in the onCompleteFunc function execution, while operating on a destroyed instance.
The fix is to pass a weak reference to the CommandBarFlyout instance alongside the onCompleteFunc function and check if that object is still alive before invoking onCompleteFunc. The call is skipped otherwise.
How Has This Been Tested?
Manually tested the application that surfaced this bug and could no longer repro. It was originally repro'able within a couple minutes while OS & Style animations are turned on.
Expanded the MuxControlsTestApp to optionally cover CommandBarFlyout.Hide being called in FlyoutClosed handler.
Created a new regression test with that scenario, which required the use of DefaultCommandBarFlyoutCommandBarStyle with its animations turned on.