Skip to content

Commit

Permalink
detect all variables that start with --
Browse files Browse the repository at this point in the history
This was already the case before, but we were also verifying that it was
preceded by `var(`. Let's remove that code to make sure code like this
works:
```js
let var = '--my-var';
let style = bla.getPropertyValue(var);
```
  • Loading branch information
RobinMalfait committed Feb 5, 2025
1 parent a2dd966 commit ac2a0c9
Showing 1 changed file with 8 additions and 33 deletions.
41 changes: 8 additions & 33 deletions crates/oxide/src/parser.rs
Original file line number Diff line number Diff line change
Expand Up @@ -159,7 +159,7 @@ impl<'a> Extractor<'a> {
}

while !candidate.is_empty() {
match Extractor::is_valid_candidate_string(candidate, self.input, self.idx_start) {
match Extractor::is_valid_candidate_string(candidate) {
ValidationResult::Valid => return ParseAction::SingleCandidate(candidate),
ValidationResult::Restart => return ParseAction::RestartAt(self.idx_start + 1),
_ => {}
Expand Down Expand Up @@ -240,11 +240,7 @@ impl<'a> Extractor<'a> {
}

#[inline(always)]
fn is_valid_candidate_string(
candidate: &'a [u8],
input: &[u8],
start_idx: usize,
) -> ValidationResult {
fn is_valid_candidate_string(candidate: &'a [u8]) -> ValidationResult {
// Reject candidates that start with a capital letter
if candidate[0].is_ascii_uppercase() {
return ValidationResult::Invalid;
Expand Down Expand Up @@ -307,14 +303,6 @@ impl<'a> Extractor<'a> {
}
}

// CSS variables must be preceded by `var(` to be considered a valid CSS variable candidate
if candidate.starts_with(b"--") {
match input.get(start_idx - 4..start_idx) {
Some(b"var(") => return ValidationResult::Valid,
_ => return ValidationResult::Invalid,
}
}

let split_candidate = Extractor::split_candidate(candidate);

let mut offset = 0;
Expand Down Expand Up @@ -1738,44 +1726,31 @@ mod test {
);
}

#[test]
fn test_css_variables_must_be_preceded_by_var_open_paren() {
let candidates = run("[--do-not-emit:true]", false);
assert_eq!(
candidates,
// Looks little funky, but `--do-not-emit` on its own is not emitted
vec!["[--do-not-emit:true]", "--do-not-emit:true"]
);

let candidates = run("<div style={{ '--do-not-emit': true }}>", false);
assert_eq!(candidates, vec!["div", "style", "true"]);
}

#[test]
fn test_is_valid_candidate_string() {
assert_eq!(
Extractor::is_valid_candidate_string(b"foo", b"", 0),
Extractor::is_valid_candidate_string(b"foo"),
ValidationResult::Valid
);
assert_eq!(
Extractor::is_valid_candidate_string(b"foo-(--color-red-500)", b"", 0),
Extractor::is_valid_candidate_string(b"foo-(--color-red-500)"),
ValidationResult::Valid
);
assert_eq!(
Extractor::is_valid_candidate_string(b"bg-[url(foo)]", b"", 0),
Extractor::is_valid_candidate_string(b"bg-[url(foo)]"),
ValidationResult::Valid
);
assert_eq!(
Extractor::is_valid_candidate_string(b"group-foo/(--bar)", b"", 0),
Extractor::is_valid_candidate_string(b"group-foo/(--bar)"),
ValidationResult::Valid
);

assert_eq!(
Extractor::is_valid_candidate_string(b"foo(\"bg-red-500\")", b"", 0),
Extractor::is_valid_candidate_string(b"foo(\"bg-red-500\")"),
ValidationResult::Restart
);
assert_eq!(
Extractor::is_valid_candidate_string(b"foo-(", b"", 0),
Extractor::is_valid_candidate_string(b"foo-("),
ValidationResult::Restart
);
}
Expand Down

0 comments on commit ac2a0c9

Please sign in to comment.