Index: third_party/WebKit/Source/core/dom/Node.cpp |
diff --git a/third_party/WebKit/Source/core/dom/Node.cpp b/third_party/WebKit/Source/core/dom/Node.cpp |
index 7018a3bc473fb3124ca0479161f0bceaf3d82b9b..578f245ab2c871bb4709946013f4d0294a50117a 100644 |
--- a/third_party/WebKit/Source/core/dom/Node.cpp |
+++ b/third_party/WebKit/Source/core/dom/Node.cpp |
@@ -2303,6 +2303,55 @@ bool Node::isUserActionElementFocused() const |
return document().userActionElements().isFocused(this); |
} |
+std::ostream& operator<<(std::ostream& os, CustomElementState state) |
+{ |
+ switch (state) { |
+ case CustomElementState::Uncustomized: return os << "Uncustomized"; |
+ case CustomElementState::Undefined: return os << "Undefined"; |
+ case CustomElementState::Custom: return os << "Custom"; |
+ default: NOTREACHED(); |
+ } |
+ return os; |
+} |
+ |
+CustomElementState Node::getCustomElementState() const |
+{ |
+ return !isCustomElement() |
+ ? CustomElementState::Uncustomized |
+ : (getFlag(CustomElementCustomFlag) ? CustomElementState::Custom : CustomElementState::Undefined); |
+} |
+ |
+void Node::setCustomElementState(CustomElementState newState) |
+{ |
+ CustomElementState oldState = getCustomElementState(); |
+ |
+ switch (newState) { |
+ case CustomElementState::Uncustomized: |
+ NOTREACHED(); // Everything starts in this state |
+ return; |
+ |
+ case CustomElementState::Undefined: |
+ DCHECK_EQ(CustomElementState::Uncustomized, oldState); |
+ break; |
+ |
+ case CustomElementState::Custom: |
+ DCHECK_EQ(CustomElementState::Undefined, oldState); |
+ break; |
+ } |
+ |
+ DCHECK(isHTMLElement()); |
+ DCHECK_NE(V0Upgraded, getV0CustomElementState()); |
+ |
+ setFlag(CustomElementFlag); |
+ if (newState == CustomElementState::Custom) |
+ setFlag(CustomElementCustomFlag); |
+ DCHECK(newState == getCustomElementState()); |
+ |
+ // TODO(kojii): Should fire pseudoStateChanged() when :defined selector is |
+ // ready. |
+ // toElement(this)->pseudoStateChanged(CSSSelector::PseudoDefined); |
+} |
+ |
void Node::setV0CustomElementState(V0CustomElementState newState) |
{ |
V0CustomElementState oldState = getV0CustomElementState(); |
@@ -2322,6 +2371,7 @@ void Node::setV0CustomElementState(V0CustomElementState newState) |
} |
DCHECK(isHTMLElement() || isSVGElement()); |
+ DCHECK(CustomElementState::Custom != getCustomElementState()); |
setFlag(V0CustomElementFlag); |
setFlag(newState == V0Upgraded, V0CustomElementUpgradedFlag); |