-
Notifications
You must be signed in to change notification settings - Fork 887
fix: add checks for preventing HSL colors from entering React state #9893
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
Merged
Merged
Changes from all commits
Commits
Show all changes
5 commits
Select commit
Hold shift + click to select a range
7e00355
fix: remove hsl color from initial form state
Parkreiner f34c7b9
chore: add extra color helpers
Parkreiner 115813e
chore: add extra runtime validation for colors
Parkreiner 9ed3c36
chore: clean up comments for clarity
Parkreiner f5fd404
chore: add tests for colors
Parkreiner File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,81 @@ | ||
/** | ||
* Not testing hslToHex, because it's code directly copied from a reliable | ||
* source | ||
*/ | ||
import { isHslColor, isHexColor } from "./colors"; | ||
|
||
describe(`${isHslColor.name}`, () => { | ||
it("Should reject obviously wrong or malformed inputs", () => { | ||
const wrongInputs = [ | ||
"", | ||
"Hi :)", | ||
"hsl", | ||
"#333", | ||
"#444666", | ||
"rgb(255, 300, 299)", | ||
"hsl(255deg, 10%, 20%", | ||
"hsv(255deg, 10%, 20%)", | ||
"hsb(255deg, 10%, 20%)", | ||
"hsl(0%, 10deg, 20)", | ||
]; | ||
|
||
for (const str of wrongInputs) { | ||
expect(isHslColor(str)).toBe(false); | ||
} | ||
}); | ||
|
||
it("Should allow strings with or without deg unit", () => { | ||
const base = "hsl(200deg, 100%, 37%)"; | ||
expect(isHslColor(base)).toBe(true); | ||
|
||
const withoutDeg = base.replace("deg", ""); | ||
expect(isHslColor(withoutDeg)).toBe(true); | ||
}); | ||
|
||
it("Should not care about whether there are spaces separating the inner values", () => { | ||
const inputs = [ | ||
"hsl(180deg,20%,97%)", | ||
"hsl(180deg, 20%, 97%)", | ||
"hsl(180deg, 20%, 97%)", | ||
]; | ||
|
||
for (const str of inputs) { | ||
expect(isHslColor(str)).toBe(true); | ||
} | ||
}); | ||
|
||
it("Should reject HSL strings that don't have percents for saturation/luminosity values", () => { | ||
expect(isHslColor("hsl(20%, 45, 92)")).toBe(false); | ||
}); | ||
|
||
it("Should catch HSL strings that follow the correct pattern, but have impossible values", () => { | ||
const inputs = [ | ||
"hsl(360deg, 120%, 240%)", // Impossible hue | ||
"hsl(100deg, 120%, 84%)", // Impossible saturation | ||
"hsl(257, 12%, 110%)", // Impossible luminosity | ||
"hsl(360deg, 120%, 240%)", // Impossible everything | ||
]; | ||
|
||
for (const str of inputs) { | ||
expect(isHslColor(str)).toBe(false); | ||
} | ||
}); | ||
}); | ||
|
||
describe(`${isHexColor.name}`, () => { | ||
it("Should reject obviously wrong or malformed inputs", () => { | ||
const inputs = ["", "#", "#bananas", "#ZZZZZZ", "AB179C", "#55555"]; | ||
|
||
for (const str of inputs) { | ||
expect(isHexColor(str)).toBe(false); | ||
} | ||
}); | ||
|
||
it("Should be fully case-insensitive", () => { | ||
const inputs = ["#aaaaaa", "#BBBBBB", "#CcCcCc"]; | ||
|
||
for (const str of inputs) { | ||
expect(isHexColor(str)).toBe(true); | ||
} | ||
}); | ||
}); |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
KISS-related question: why do we need other changes in the PR? Did you identify any places where we can face HSL related issue?
EDIT:
I'm thinking about changes around the DashboardProvider.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Yeah, KISS is definitely something I need to keep in mind more, but at least here, I feel like some kind of defensive changes (maybe not necessarily these) made sense.
The way I see it, there's a few risks right now:
DashboardProvider
is already a top-level component that can be imported by anything else from the/components
folder. It's also a context provider, so any importing component's sub-children would be able to use it indirectly, as wellRequireAuth
componentI felt like having the provider be in charge of validating incoming state changes would be the best way to prevent any future mismatches from popping up
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Thanks for the explanation! Sounds good to me 👍