servo/components/style/invalidation
Emilio Cobos Álvarez c1bc588c93 style: Keep track of nested dependencies for :where() and :is().
The tricky part of :is() and :where() is that they can have combinators inside,
so something like this is valid:

  foo:is(#bar > .baz) ~ taz

The current invalidation logic is based on the assumption that you can
represent a combinator as a (selector, offset) tuple, which are stored in the
Dependency struct. This assumption breaks with :is() and :where(), so we need
to make them be able to represent a combinator in an "inner" selector.

For this purpose, we add a `parent` dependency. With it, when invalidating
inside the `:is()` we can represent combinators inside as a stack.

The basic idea is that, for the example above, when an id of "bar" is added or
removed, we'd find a dependency like:

    Dependency {
        selector: #bar > .baz,
        offset: 1, // pointing to the `>` combinator
        parent: Some(Dependency {
            selector: foo:is(#bar > .baz) > taz,
            offset: 1, // Pointing to the `~` combinator.
            parent: None,
        })
    }

That way, we'd start matching at the element that changed, towards the right,
and if we find an element that matches .baz, instead of invalidating that
element, we'd look at the parent dependency, then double-check that the whole
left-hand-side of the selector (foo:is(#bar > .baz)) actually changed, and then
keep invalidating to the right using the parent dependency as usual.

This patch only builds the data structure and keeps the code compiling, the
actual invalidation work will come in a following patch.

Differential Revision: https://phabricator.services.mozilla.com/D71421
2020-06-04 01:50:36 +02:00
..
element style: Keep track of nested dependencies for :where() and :is(). 2020-06-04 01:50:36 +02:00
media_queries.rs style: Remove unnecessary mem::transmute in MediaListKey. 2019-01-13 21:58:28 +01:00
mod.rs Update MPL license to https (part 4) 2018-11-19 14:47:27 +01:00
stylesheets.rs style: Use fallible allocation for stylesheet invalidation. 2019-10-09 13:21:35 +02:00