chore(web-components): add hasMatchingState and swapStates functions #33156
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.
Previous Behavior
For each instance where we're toggling between two states, we remove the previous state if it exists, and then apply the new state if it exists.
There are no checks to see if the new state getting checked is an allowed state for the attribute. This allows for arbitrary states to be applied, which can lead to unexpected behavior. For instance, an
appearance
attribute could be set to any value, and that value would be applied toElementInternals.states
.It could also lead to state collisions, where setting something like
appearance="large"
would simultaneously be invalid ("large" is not a valid state forappearance
), and would apply thelarge
state to theElementInternals.states
set (large
is a valid state for thesize
attribute, but thesize
attribute isn't set tolarge
.)New Behavior
This PR adds the
hasMatchingState
function, which can be used to determine if a given string state is valid and accepted for a given state object.This PR also adds the
swapStates
function, which can be used to swap between two states. This is a really common pattern in our codebase, and this function will make it easier to remove the old state, and apply the new state, while also ensuring that the new state is accepted for that attribute.