diff options
Diffstat (limited to 'chromium/third_party/blink/renderer/core/dom/node_rare_data.h')
-rw-r--r-- | chromium/third_party/blink/renderer/core/dom/node_rare_data.h | 100 |
1 files changed, 66 insertions, 34 deletions
diff --git a/chromium/third_party/blink/renderer/core/dom/node_rare_data.h b/chromium/third_party/blink/renderer/core/dom/node_rare_data.h index 3ea8cc3a9e9..d9e0238cee2 100644 --- a/chromium/third_party/blink/renderer/core/dom/node_rare_data.h +++ b/chromium/third_party/blink/renderer/core/dom/node_rare_data.h @@ -27,6 +27,7 @@ #include "third_party/blink/renderer/platform/heap/thread_state.h" #include "third_party/blink/renderer/platform/wtf/bit_field.h" #include "third_party/blink/renderer/platform/wtf/buildflags.h" +#include "third_party/blink/renderer/platform/wtf/casting.h" #include "third_party/blink/renderer/platform/wtf/hash_set.h" namespace blink { @@ -34,10 +35,13 @@ namespace blink { class ComputedStyle; enum class DynamicRestyleFlags; enum class ElementFlags; +class ElementRareData; class FlatTreeNodeData; class LayoutObject; class MutationObserverRegistration; class NodeListsNodeData; +class NodeRenderingData; +class NodeRareData; class ScrollTimeline; class NodeMutationObserverData final @@ -67,45 +71,78 @@ class NodeMutationObserverData final HeapHashSet<Member<MutationObserverRegistration>> transient_registry_; }; -class GC_PLUGIN_IGNORE( - "GC plugin reports that TraceAfterDispatch is not called but it is called " - "by both NodeRareDate::TraceAfterDispatch and " - "NodeRenderingData::TraceAfterDispatch.") NodeData - : public GarbageCollected<NodeData> { +class NodeData : public GarbageCollected<NodeData> { public: - NodeData(bool is_rare_data, bool is_element_rare_data) - : connected_frame_count_(0), - element_flags_(0), - bit_field_(RestyleFlags::encode(0) | - IsElementRareData::encode(is_element_rare_data) | - IsRareData::encode(is_rare_data)) { - DCHECK(!is_element_rare_data || is_rare_data); - } - void Trace(Visitor*) const; - void TraceAfterDispatch(blink::Visitor*) const {} - enum { kConnectedFrameCountBits = 10, // Must fit Page::maxNumberOfFrames. kNumberOfElementFlags = 6, kNumberOfDynamicRestyleFlags = 14 }; + enum class ClassType : uint8_t { + kNodeRareData, + kElementRareData, + kNodeRenderingData, + kLastType = kNodeRenderingData + }; + + void Trace(Visitor*) const; + void TraceAfterDispatch(blink::Visitor*) const {} + protected: using BitField = WTF::ConcurrentlyReadBitField<uint16_t>; using RestyleFlags = BitField::DefineFirstValue<uint16_t, kNumberOfDynamicRestyleFlags>; - using IsElementRareData = RestyleFlags:: - DefineNextValue<bool, 1, WTF::BitFieldValueConstness::kConst>; - using IsRareData = IsElementRareData:: - DefineNextValue<bool, 1, WTF::BitFieldValueConstness::kConst>; + static constexpr size_t kClassTypeBits = 2; + static_assert(static_cast<size_t>(ClassType::kLastType) < + ((size_t{1} << kClassTypeBits)), + "Too many subtypes to fit into bitfield."); + using ClassTypeData = + RestyleFlags::DefineNextValue<uint8_t, + kClassTypeBits, + WTF::BitFieldValueConstness::kConst>; + + explicit NodeData(ClassType sub_type) + : connected_frame_count_(0), + element_flags_(0), + bit_field_(RestyleFlags::encode(0) | + ClassTypeData::encode(static_cast<uint8_t>(sub_type))) {} + + ClassType GetClassType() const { + return static_cast<ClassType>(bit_field_.get_concurrently<ClassTypeData>()); + } uint16_t connected_frame_count_ : kConnectedFrameCountBits; uint16_t element_flags_ : kNumberOfElementFlags; BitField bit_field_; + + friend struct DowncastTraits<NodeRareData>; + friend struct DowncastTraits<NodeRenderingData>; + friend struct DowncastTraits<ElementRareData>; +}; + +template <> +struct DowncastTraits<NodeRenderingData> { + static bool AllowFrom(const NodeData& node_data) { + return node_data.GetClassType() == NodeData::ClassType::kNodeRenderingData; + } +}; + +template <> +struct DowncastTraits<NodeRareData> { + static bool AllowFrom(const NodeData& node_data) { + return node_data.GetClassType() == NodeData::ClassType::kNodeRareData; + } }; -class GC_PLUGIN_IGNORE("Manual dispatch implemented in NodeData.") - NodeRenderingData final : public NodeData { +template <> +struct DowncastTraits<ElementRareData> { + static bool AllowFrom(const NodeData& node_data) { + return node_data.GetClassType() == NodeData::ClassType::kElementRareData; + } +}; + +class NodeRenderingData final : public NodeData { public: NodeRenderingData(LayoutObject*, scoped_refptr<const ComputedStyle> computed_style); @@ -126,20 +163,17 @@ class GC_PLUGIN_IGNORE("Manual dispatch implemented in NodeData.") static NodeRenderingData& SharedEmptyData(); bool IsSharedEmptyData() { return this == &SharedEmptyData(); } - void TraceAfterDispatch(Visitor* visitor) const { - NodeData::TraceAfterDispatch(visitor); - } + void TraceAfterDispatch(Visitor* visitor) const; private: LayoutObject* layout_object_; scoped_refptr<const ComputedStyle> computed_style_; }; -class GC_PLUGIN_IGNORE("Manual dispatch implemented in NodeData.") NodeRareData - : public NodeData { +class NodeRareData : public NodeData { public: explicit NodeRareData(NodeRenderingData* node_layout_data) - : NodeRareData(node_layout_data, false) {} + : NodeRareData(ClassType::kNodeRareData, node_layout_data) {} NodeRareData(const NodeRareData&) = delete; NodeRareData& operator=(const NodeRareData&) = delete; @@ -204,16 +238,14 @@ class GC_PLUGIN_IGNORE("Manual dispatch implemented in NodeData.") NodeRareData bool HasRestyleFlags() const { return bit_field_.get<RestyleFlags>(); } void ClearRestyleFlags() { bit_field_.set<RestyleFlags>(0); } - void TraceAfterDispatch(blink::Visitor*) const; - void FinalizeGarbageCollectedObject(); void RegisterScrollTimeline(ScrollTimeline*); void UnregisterScrollTimeline(ScrollTimeline*); + void TraceAfterDispatch(blink::Visitor*) const; + protected: - explicit NodeRareData(NodeRenderingData* node_layout_data, - bool is_element_rare_data) - : NodeData(true, is_element_rare_data), - node_layout_data_(node_layout_data) { + NodeRareData(ClassType class_type, NodeRenderingData* node_layout_data) + : NodeData(class_type), node_layout_data_(node_layout_data) { CHECK_NE(node_layout_data, nullptr); } |