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

Don't crash when the user tries to duplicate a tab with a profile that no longer exists #4429

Closed
wants to merge 10 commits into from

Conversation

zadjii-msft
Copy link
Member

Summary of the Pull Request

When the user tries to duplicateTab with a profile that doesn't exist anymore (like might happen after a settings reload), don't crash.

PR Checklist

Detailed Description of the Pull Request / Additional comments

CascadiaSettings::BuildSettings can throw if the GUID doesn't exist. This wraps those calls up with a try/catch.

It also adds a couple tests - a few SettingsTests for try/catching this state. It also adds a XAML-y test in TabTests that creates a TerminalPage and then performs som UI-like actions on it. This test required a minor change to how we generate the new tab dropdown - in the tests, Application::Current() is not a TerminalApp::App, so it doesn't have a Logic() to query. So wrap that in a try/catch as well.

Validation Steps Performed

  • Ran tests - new tests pass!
  • Validated scenario manually

  You need to initialize a TerminalPage weirdly in the test, including _not_ checking App.Logic(), since the App doesn't have a Logic()
@zadjii-msft
Copy link
Member Author

I'm also going to self-block this PR until #4683 is merged, since I'll want to come through and cover duplicating panes as well

# Conflicts:
#	src/cascadia/LocalTests_TerminalApp/SettingsTests.cpp
#	src/cascadia/TerminalApp/TerminalPage.cpp
@zadjii-msft zadjii-msft added Area-User Interface Issues pertaining to the user interface of the Console or Terminal Product-Terminal The new Windows Terminal. labels Mar 18, 2020
  Okay this is harder, but maybe not impossible, but probably impossible in v1.

  The Profile knows how to build the connection settings, and the
  ControlSettings, etc. However, when the settings reloads like in this bug,
  we'll remove all the old profiles, and build a new list.

  If we wanted the case 1 behavior, we could wait until the Profile is a winrt
  object, then have each Pane hold a strong ref to the Profile that it's
  hosting. Then it would be trivial to be able to duplicate the settings from
  it. I believe that work is tracked in #3998.

  How palatable is doing case 3 now (to fix the crash), then filing a follow up
  to do case 1 once #3998 is done?
@zadjii-msft
Copy link
Member Author

Hey this PR has been superseded by #5090. I'll move the discussion there.

DHowett-MSFT pushed a commit that referenced this pull request Mar 26, 2020
This PR has evolved to encapsulate two related fixes that I can't really
untie anymore.

#2455 - Duplicating a tab that doesn't exist anymore

This was the bug I was originally fixing in #4429. 

When the user tries to `duplicateTab` with a profile that doesn't exist
anymore (like might happen after a settings reload), don't crash.

As I was going about adding tests for this, got blocked by the fact that
the Terminal couldn't open _any_ panes while the `TerminalPage` was size
0x0. This had two theoretical solutions: 

* Fake the `TerminalPage` into thinking it had a real size in the test -
  probably possible, though I'm unsure how it would work in practice.
* Change `Pane`s to not require an `ActualWidth`, `ActualHeight` on
  initialization. 

Fortuately, the second option was something else that was already on my
backlog of bugs. 

#4618 - `wt` command-line can't consistently parse more than one arg

Presently, the Terminal just arbitrarily dispatches a bunch of handlers
to try and handle all the commands provided on the commandline. That's
lead to a bunch of reports that not all the commands will always get
executed, nor will they all get executed in the same order. 

This PR also changes the `TerminalPage` to be able to dispatch all the
commands sequentially, all at once in the startup. No longer will there
be a hot second where the commands seem to execute themselves in from of
the user - they'll all happen behind the scenes on startup. 

This involved a couple other changes areound the `TerminalPage`
* I had to make sure that panes could be opened at a 0x0 size. Now they
  use a star sizing based off the percentage of the parent they're
  supposed to consume, so that when the parent _does_ get laid out,
  they'll take the appropriate size of that parent.
* I had to do some math ahead of time to try and calculate what a
  `SplitState::Automatic` would be evaluated as, despite the fact that
  we don't actually know how big the pane will be. 
* I had to ensure that `focus-tab` commands appropriately mark a single
  tab as focused while we're in startup, without roundtripping to the
  Dispatcher thread and back

## References

#4429 - the original PR for #2455
#5047 - a follow-up task from discussion in #4429
#4953 - a PR for making panes use star sizing, which was immensly
        helpful for this PR.

## Detailed Description of the Pull Request / Additional comments

`CascadiaSettings::BuildSettings` can throw if the GUID doesn't exist.
This wraps those calls up with a try/catch.

It also adds a couple tests - a few `SettingsTests` for try/catching
this state. It also adds a XAML-y test in `TabTests` that creates a
`TerminalPage` and then performs som UI-like actions on it. This test
required a minor change to how we generate the new tab dropdown - in the
tests, `Application::Current()` is _not_ a `TerminalApp::App`, so it
doesn't have a `Logic()` to query. So wrap that in a try/catch as well.

While working on these tests, I found that we'd crash pretty agressively
for mysterious reasons if the TestHostApp became focused while the test
was running. This was due to a call in
`TSFInputControl::NotifyFocusEnter` that would callback to
`TSFInputControl::_layoutRequested`, which would crash on setting the
`MaxSize` of the canvas to a negative value. This PR includes a hotfix
for that bug as well. 

## Validation Steps Performed

* Manual testing with a _lot_ of commands in a commandline
* run the tests
* Team tested in selfhost

Closes #2455
Closes #4618
@DHowett DHowett deleted the dev/migrie/b/2455-with-new-tests branch October 26, 2021 17:00
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Area-User Interface Issues pertaining to the user interface of the Console or Terminal Product-Terminal The new Windows Terminal.
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Bug Report: Cannot find profile --> Crash
3 participants