Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(251)

Unified Diff: third_party/WebKit/Source/core/dom/LayoutTreeBuilderTraversal.cpp

Issue 2257053003: Fix a crash when pseudo elements are used for a shadow host (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: update Created 4 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: third_party/WebKit/Source/core/dom/LayoutTreeBuilderTraversal.cpp
diff --git a/third_party/WebKit/Source/core/dom/LayoutTreeBuilderTraversal.cpp b/third_party/WebKit/Source/core/dom/LayoutTreeBuilderTraversal.cpp
index 997922db655506282715ae06824ee6225b93f3e2..faf753568130985a82c10051bb05fa1e20c82c54 100644
--- a/third_party/WebKit/Source/core/dom/LayoutTreeBuilderTraversal.cpp
+++ b/third_party/WebKit/Source/core/dom/LayoutTreeBuilderTraversal.cpp
@@ -51,49 +51,61 @@ void ParentDetails::didTraverseInsertionPoint(const InsertionPoint* insertionPoi
}
}
+inline static void assertPseudoElementParent(const PseudoElement& pseudoElement)
+{
+ DCHECK(pseudoElement.parentNode());
+ DCHECK(pseudoElement.parentNode()->canParticipateInFlatTree());
+}
+
ContainerNode* parent(const Node& node, ParentDetails* details)
{
- // TODO(hayato): Uncomment this once we can be sure LayoutTreeBuilderTraversal::parent() is used only for a node in a document.
+ // TODO(hayato): Uncomment this once we can be sure LayoutTreeBuilderTraversal::parent() is used only for a node which is connected.
// DCHECK(node.isConnected());
+ if (node.isPseudoElement()) {
+ assertPseudoElementParent(toPseudoElement(node));
+ return node.parentNode();
+ }
return FlatTreeTraversal::parent(node, details);
}
Node* nextSibling(const Node& node)
{
if (node.isBeforePseudoElement()) {
- if (Node* next = FlatTreeTraversal::firstChild(*FlatTreeTraversal::parent(node)))
+ assertPseudoElementParent(toPseudoElement(node));
+ if (Node* next = FlatTreeTraversal::firstChild(*node.parentNode()))
return next;
} else {
+ if (node.isAfterPseudoElement())
+ return nullptr;
if (Node* next = FlatTreeTraversal::nextSibling(node))
return next;
- if (node.isAfterPseudoElement())
- return 0;
}
Node* parent = FlatTreeTraversal::parent(node);
if (parent && parent->isElementNode())
return toElement(parent)->pseudoElement(PseudoIdAfter);
- return 0;
+ return nullptr;
}
Node* previousSibling(const Node& node)
{
if (node.isAfterPseudoElement()) {
- if (Node* previous = FlatTreeTraversal::lastChild(*FlatTreeTraversal::parent(node)))
+ assertPseudoElementParent(toPseudoElement(node));
+ if (Node* previous = FlatTreeTraversal::lastChild(*node.parentNode()))
return previous;
} else {
+ if (node.isBeforePseudoElement())
+ return nullptr;
if (Node* previous = FlatTreeTraversal::previousSibling(node))
return previous;
- if (node.isBeforePseudoElement())
- return 0;
}
Node* parent = FlatTreeTraversal::parent(node);
if (parent && parent->isElementNode())
return toElement(parent)->pseudoElement(PseudoIdBefore);
- return 0;
+ return nullptr;
}
static Node* lastChild(const Node& node)

Powered by Google App Engine
This is Rietveld 408576698