
Pseudo-elements' style is only computed while building the layout tree. This meant that previously, they would not have their style recomputed in some cases. (Such as when :hover is applied to an ancestor.) Now, when recomputing an element's style, we also return a full invalidation if one or more pseudo-elements would exist either before or after style recomputation. This heuristic produces some false positives, but no false negatives. Because pseudo-elements' style is computed during layout building, any computation done here is then thrown away. So this approach minimises the amount of wasted style computation. Plus it's simple, until we have data on what approach would be faster. This fixes the Acid2 nose becoming blue when the .nose div is hovered.
34 lines
1.2 KiB
C++
34 lines
1.2 KiB
C++
/*
|
|
* Copyright (c) 2024, Aliaksandr Kalenik <kalenik.aliaksandr@gmail.com>
|
|
*
|
|
* SPDX-License-Identifier: BSD-2-Clause
|
|
*/
|
|
|
|
#pragma once
|
|
|
|
#include <LibWeb/CSS/PropertyID.h>
|
|
|
|
namespace Web::CSS {
|
|
|
|
struct RequiredInvalidationAfterStyleChange {
|
|
bool repaint : 1 { false };
|
|
bool rebuild_stacking_context_tree : 1 { false };
|
|
bool relayout : 1 { false };
|
|
bool rebuild_layout_tree : 1 { false };
|
|
|
|
void operator|=(RequiredInvalidationAfterStyleChange const& other)
|
|
{
|
|
repaint |= other.repaint;
|
|
rebuild_stacking_context_tree |= other.rebuild_stacking_context_tree;
|
|
relayout |= other.relayout;
|
|
rebuild_layout_tree |= other.rebuild_layout_tree;
|
|
}
|
|
|
|
[[nodiscard]] bool is_none() const { return !repaint && !rebuild_stacking_context_tree && !relayout && !rebuild_layout_tree; }
|
|
[[nodiscard]] bool is_full() const { return repaint && rebuild_stacking_context_tree && relayout && rebuild_layout_tree; }
|
|
static RequiredInvalidationAfterStyleChange full() { return { true, true, true, true }; }
|
|
};
|
|
|
|
RequiredInvalidationAfterStyleChange compute_property_invalidation(CSS::PropertyID property_id, RefPtr<CSS::StyleValue const> const& old_value, RefPtr<CSS::StyleValue const> const& new_value);
|
|
|
|
}
|