style: Don't allow to share style by rule node for links

(Regardless of visitedness)

Differential Revision: https://phabricator.services.mozilla.com/D180353
This commit is contained in:
Emilio Cobos Álvarez 2023-06-12 10:21:15 +00:00 committed by Martin Robinson
parent c8ccb52c9e
commit 78f8d575b7

View file

@ -879,19 +879,13 @@ impl<E: TElement> StyleSharingCache<E> {
if target.local_name() != candidate.element.local_name() { if target.local_name() != candidate.element.local_name() {
return None; return None;
} }
// Rule nodes and styles are computed independent of the element's // Rule nodes and styles are computed independent of the element's actual visitedness,
// actual visitedness, but at the end of the cascade (in // but at the end of the cascade (in `adjust_for_visited`) we do store the
// `adjust_for_visited`) we do store the visitedness as a flag in // RELEVANT_LINK_VISITED flag, so we can't share by rule node between visited and
// style. (This is a subtle change from initial visited work that // unvisited styles. We don't check for visitedness and just refuse to share for links
// landed when computed values were fused, see // entirely, so that visitedness doesn't affect timing.
// https://bugzilla.mozilla.org/show_bug.cgi?id=1381635.) debug_assert_eq!(target.is_link(), candidate.element.is_link(), "Linkness mismatch");
// So at the moment, we need to additionally compare visitedness, if target.is_link() {
// since that is not accounted for by rule nodes alone.
// FIXME(jryans): This seems like it breaks the constant time
// requirements of visited, assuming we get a cache hit on only one
// of unvisited vs. visited.
// TODO(emilio): We no longer have such a flag, remove this check.
if target.is_visited_link() != candidate.element.is_visited_link() {
return None; return None;
} }