Commit 3025c678 authored by Fergal Daly's avatar Fergal Daly Committed by Commit Bot

Add methods to Element that allow access to the parsed names in the

part= attribute.


R=hayato@chromium.org

Bug: 805271
Change-Id: Ie3ebecb3848b21d93189c6044d2c410490bb4ded
Reviewed-on: https://chromium-review.googlesource.com/958311
Commit-Queue: Fergal Daly <fergal@chromium.org>
Reviewed-by: default avatarHayato Ito <hayato@chromium.org>
Cr-Commit-Position: refs/heads/master@{#544387}
parent f0283d94
...@@ -1541,6 +1541,9 @@ void Element::AttributeChanged(const AttributeModificationParams& params) { ...@@ -1541,6 +1541,9 @@ void Element::AttributeChanged(const AttributeModificationParams& params) {
} }
} else if (name == HTMLNames::nameAttr) { } else if (name == HTMLNames::nameAttr) {
SetHasName(!params.new_value.IsNull()); SetHasName(!params.new_value.IsNull());
} else if (name == HTMLNames::partAttr) {
if (RuntimeEnabledFeatures::CSSPartPseudoElementEnabled())
EnsureElementRareData().SetPart(params.new_value);
} else if (IsStyledElement()) { } else if (IsStyledElement()) {
if (name == styleAttr) { if (name == styleAttr) {
StyleAttributeChanged(params.new_value, params.reason); StyleAttributeChanged(params.new_value, params.reason);
...@@ -4807,4 +4810,21 @@ void Element::TraceWrappers(const ScriptWrappableVisitor* visitor) const { ...@@ -4807,4 +4810,21 @@ void Element::TraceWrappers(const ScriptWrappableVisitor* visitor) const {
ContainerNode::TraceWrappers(visitor); ContainerNode::TraceWrappers(visitor);
} }
bool Element::HasPartName() const {
if (!RuntimeEnabledFeatures::CSSPartPseudoElementEnabled())
return false;
if (HasRareData()) {
if (auto* part_names = GetElementRareData()->PartNames()) {
return part_names->size() > 0;
}
}
return false;
}
const SpaceSplitString* Element::PartNames() const {
return RuntimeEnabledFeatures::CSSPartPseudoElementEnabled() && HasRareData()
? GetElementRareData()->PartNames()
: nullptr;
}
} // namespace blink } // namespace blink
...@@ -810,6 +810,9 @@ class CORE_EXPORT Element : public ContainerNode { ...@@ -810,6 +810,9 @@ class CORE_EXPORT Element : public ContainerNode {
const SpaceSplitString& ClassNames() const; const SpaceSplitString& ClassNames() const;
bool HasClassName(const AtomicString& class_name) const; bool HasClassName(const AtomicString& class_name) const;
bool HasPartName() const;
const SpaceSplitString* PartNames() const;
ScrollOffset SavedLayerScrollOffset() const; ScrollOffset SavedLayerScrollOffset() const;
void SetSavedLayerScrollOffset(const ScrollOffset&); void SetSavedLayerScrollOffset(const ScrollOffset&);
......
...@@ -40,7 +40,7 @@ namespace blink { ...@@ -40,7 +40,7 @@ namespace blink {
struct SameSizeAsElementRareData : NodeRareData { struct SameSizeAsElementRareData : NodeRareData {
IntSize scroll_offset; IntSize scroll_offset;
void* pointers_or_strings[3]; void* pointers_or_strings[4];
Member<void*> members[14]; Member<void*> members[14];
}; };
......
...@@ -35,6 +35,7 @@ ...@@ -35,6 +35,7 @@
#include "core/dom/NodeRareData.h" #include "core/dom/NodeRareData.h"
#include "core/dom/PseudoElement.h" #include "core/dom/PseudoElement.h"
#include "core/dom/PseudoElementData.h" #include "core/dom/PseudoElementData.h"
#include "core/dom/SpaceSplitString.h"
#include "core/html/custom/CustomElementDefinition.h" #include "core/html/custom/CustomElementDefinition.h"
#include "core/html/custom/V0CustomElementDefinition.h" #include "core/html/custom/V0CustomElementDefinition.h"
#include "core/intersection_observer/ElementIntersectionObserverData.h" #include "core/intersection_observer/ElementIntersectionObserverData.h"
...@@ -97,6 +98,16 @@ class ElementRareData : public NodeRareData { ...@@ -97,6 +98,16 @@ class ElementRareData : public NodeRareData {
class_list_ = class_list; class_list_ = class_list;
} }
void SetPart(const AtomicString part_names) {
if (!RuntimeEnabledFeatures::CSSPartPseudoElementEnabled())
return;
if (!part_names_) {
part_names_.reset(new SpaceSplitString());
}
part_names_->Set(part_names);
}
const SpaceSplitString* PartNames() const { return part_names_.get(); }
DatasetDOMStringMap* Dataset() const { return dataset_.Get(); } DatasetDOMStringMap* Dataset() const { return dataset_.Get(); }
void SetDataset(DatasetDOMStringMap* dataset) { void SetDataset(DatasetDOMStringMap* dataset) {
dataset_ = dataset; dataset_ = dataset;
...@@ -181,6 +192,7 @@ class ElementRareData : public NodeRareData { ...@@ -181,6 +192,7 @@ class ElementRareData : public NodeRareData {
TraceWrapperMember<DatasetDOMStringMap> dataset_; TraceWrapperMember<DatasetDOMStringMap> dataset_;
TraceWrapperMember<ElementShadow> shadow_; TraceWrapperMember<ElementShadow> shadow_;
TraceWrapperMember<DOMTokenList> class_list_; TraceWrapperMember<DOMTokenList> class_list_;
std::unique_ptr<SpaceSplitString> part_names_;
TraceWrapperMember<NamedNodeMap> attribute_map_; TraceWrapperMember<NamedNodeMap> attribute_map_;
Member<AttrNodeList> attr_node_list_; Member<AttrNodeList> attr_node_list_;
Member<InlineCSSStyleDeclaration> cssom_wrapper_; Member<InlineCSSStyleDeclaration> cssom_wrapper_;
......
...@@ -344,4 +344,50 @@ TEST_F(ElementTest, GetBoundingClientRectForSVG) { ...@@ -344,4 +344,50 @@ TEST_F(ElementTest, GetBoundingClientRectForSVG) {
EXPECT_EQ(IntRect(10, 100, 100, 71), svg_stroke->BoundsInViewport()); EXPECT_EQ(IntRect(10, 100, 100, 71), svg_stroke->BoundsInViewport());
} }
TEST_F(ElementTest, PartAttribute) {
Document& document = GetDocument();
SetBodyContent(R"HTML(
<span id='has_one_part' part='partname'></span>
<span id='has_two_parts' part='partname1 partname2'></span>
<span id='has_no_part'></span>
)HTML");
Element* has_one_part = document.getElementById("has_one_part");
Element* has_two_parts = document.getElementById("has_two_parts");
Element* has_no_part = document.getElementById("has_no_part");
ASSERT_TRUE(has_no_part);
ASSERT_TRUE(has_one_part);
ASSERT_TRUE(has_two_parts);
{
EXPECT_TRUE(has_one_part->HasPartName());
const SpaceSplitString* part_names = has_one_part->PartNames();
ASSERT_TRUE(part_names);
ASSERT_EQ(1UL, part_names->size());
ASSERT_EQ("partname", (*part_names)[0].Ascii());
}
{
EXPECT_TRUE(has_two_parts->HasPartName());
const SpaceSplitString* part_names = has_two_parts->PartNames();
ASSERT_TRUE(part_names);
ASSERT_EQ(2UL, part_names->size());
ASSERT_EQ("partname1", (*part_names)[0].Ascii());
ASSERT_EQ("partname2", (*part_names)[1].Ascii());
}
{
EXPECT_FALSE(has_no_part->HasPartName());
EXPECT_FALSE(has_no_part->PartNames());
// Now update the attribute value and make sure it's reflected.
has_no_part->setAttribute("part", "partname");
const SpaceSplitString* part_names = has_no_part->PartNames();
ASSERT_TRUE(part_names);
ASSERT_EQ(1UL, part_names->size());
ASSERT_EQ("partname", (*part_names)[0].Ascii());
}
}
} // namespace blink } // namespace blink
...@@ -298,6 +298,7 @@ ...@@ -298,6 +298,7 @@
"onwheel", "onwheel",
"open", "open",
"optimum", "optimum",
"part",
"pattern", "pattern",
"placeholder", "placeholder",
"ping", "ping",
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment