Fix all fragments not loading when one is badly formed (#10601)

Adds try-catch blocks to the parts where we layer a fragment onto a profile and create a new profile from a fragment. This allows us to continue looping over the remaining fragments after failing to use a badly-formed one, instead of aborting prematurely.

## PR Checklist
* [x] Closes #10590

## Validation Steps Performed
Non-badly formed fragments get loaded even if there is a badly formed one somewhere

(cherry picked from commit a89746a869)
This commit is contained in:
PankajBhojwani 2021-07-09 13:43:34 -07:00 committed by Dustin Howett
parent 5c93e4bf12
commit 0480f20d20
No known key found for this signature in database
GPG key ID: 0719BB71B334EE77

View file

@ -545,14 +545,20 @@ void CascadiaSettings::_ParseAndLayerFragmentFiles(const std::unordered_set<std:
auto matchingProfile = _FindMatchingProfile(profileStub);
if (matchingProfile)
{
// We found a matching profile, create a child of it and put the modifications there
// (we add a new inheritance layer)
auto childImpl{ matchingProfile->CreateChild() };
childImpl->LayerJson(profileStub);
childImpl->Origin(OriginTag::Fragment);
try
{
// We found a matching profile, create a child of it and put the modifications there
// (we add a new inheritance layer)
auto childImpl{ matchingProfile->CreateChild() };
childImpl->LayerJson(profileStub);
childImpl->Origin(OriginTag::Fragment);
// replace parent in _profiles with child
_allProfiles.SetAt(_FindMatchingProfileIndex(matchingProfile->ToJson()).value(), *childImpl);
// replace parent in _profiles with child
_allProfiles.SetAt(_FindMatchingProfileIndex(matchingProfile->ToJson()).value(), *childImpl);
}
catch (...)
{
}
}
}
else
@ -561,13 +567,19 @@ void CascadiaSettings::_ParseAndLayerFragmentFiles(const std::unordered_set<std:
// (it must have at least a name)
if (profileStub.isMember(JsonKey(NameKey)))
{
auto newProfile = Profile::FromJson(profileStub);
// Make sure to give the new profile a source, then we add it to our list of profiles
// We don't make modifications to the user's settings file yet, that will happen when
// _AppendDynamicProfilesToUserSettings() is called later
newProfile->Source(source);
newProfile->Origin(OriginTag::Fragment);
_allProfiles.Append(*newProfile);
try
{
auto newProfile = Profile::FromJson(profileStub);
// Make sure to give the new profile a source, then we add it to our list of profiles
// We don't make modifications to the user's settings file yet, that will happen when
// _AppendDynamicProfilesToUserSettings() is called later
newProfile->Source(source);
newProfile->Origin(OriginTag::Fragment);
_allProfiles.Append(*newProfile);
}
catch (...)
{
}
}
}
}