mirror of
https://repo.dactyloidae.xyz/Dactyloidae/UXP.git
synced 2026-09-25 09:57:32 +09:00
Bug 1321284 - Crash in nsCSSFrameConstructor::GetInsertionPrevSibling when trying to reframe native anonymous content
* Make StyleChildrenIterator skip NAC generated by root element primary frame ancestors. * Add nsINode::GetFlattenedTreeParentNodeForStyle. * Add iterator class to find all restyle roots. NOTE: Parts 1, 2, and "4.2" Tag #1375
This commit is contained in:
parent
cb2b45e472
commit
a03838af22
14 changed files with 226 additions and 35 deletions
|
|
@ -33,14 +33,15 @@ inline mozilla::dom::ShadowRoot* nsIContent::GetShadowRoot() const
|
|||
return AsElement()->FastGetShadowRoot();
|
||||
}
|
||||
|
||||
inline nsINode* nsINode::GetFlattenedTreeParentNode() const
|
||||
template<nsIContent::FlattenedParentType Type>
|
||||
static inline nsINode*
|
||||
GetFlattenedTreeParentNode(const nsINode* aNode)
|
||||
{
|
||||
nsINode* parent = GetParentNode();
|
||||
|
||||
nsINode* parent = aNode->GetParentNode();
|
||||
// Try to short-circuit past the complicated and not-exactly-fast logic for
|
||||
// computing the flattened parent.
|
||||
//
|
||||
// There are three cases where we need might something other than parentNode:
|
||||
// There are four cases where we need might something other than parentNode:
|
||||
// (1) The node is an explicit child of an XBL-bound element, re-bound
|
||||
// to an XBL insertion point.
|
||||
// (2) The node is a top-level element in a shadow tree, whose flattened
|
||||
|
|
@ -48,18 +49,31 @@ inline nsINode* nsINode::GetFlattenedTreeParentNode() const
|
|||
// is the shadow root).
|
||||
// (3) The node is an explicit child of an element with a shadow root,
|
||||
// re-bound to an insertion point.
|
||||
bool needSlowCall = HasFlag(NODE_MAY_BE_IN_BINDING_MNGR) ||
|
||||
IsInShadowTree() ||
|
||||
(parent && parent->IsContent() &&
|
||||
parent->AsContent()->GetShadowRoot());
|
||||
// (4) We want the flattened parent for style, and the node is the root
|
||||
// of a native anonymous content subtree parented to the document's
|
||||
// root element.
|
||||
bool needSlowCall = aNode->HasFlag(NODE_MAY_BE_IN_BINDING_MNGR) ||
|
||||
aNode->IsInShadowTree() ||
|
||||
(parent &&
|
||||
parent->IsContent() &&
|
||||
parent->AsContent()->GetShadowRoot()) ||
|
||||
(Type == nsIContent::eForStyle &&
|
||||
aNode->IsContent() &&
|
||||
aNode->AsContent()->IsRootOfNativeAnonymousSubtree() &&
|
||||
aNode->OwnerDoc()->GetRootElement() == parent);
|
||||
if (MOZ_UNLIKELY(needSlowCall)) {
|
||||
MOZ_ASSERT(IsContent());
|
||||
return AsContent()->GetFlattenedTreeParentNodeInternal();
|
||||
MOZ_ASSERT(aNode->IsContent());
|
||||
return aNode->AsContent()->GetFlattenedTreeParentNodeInternal(Type);
|
||||
}
|
||||
|
||||
return parent;
|
||||
}
|
||||
|
||||
inline nsINode*
|
||||
nsINode::GetFlattenedTreeParentNode() const
|
||||
{
|
||||
return ::GetFlattenedTreeParentNode<nsIContent::eNotForStyle>(this);
|
||||
}
|
||||
|
||||
inline nsIContent*
|
||||
nsIContent::GetFlattenedTreeParent() const
|
||||
{
|
||||
|
|
@ -67,5 +81,10 @@ nsIContent::GetFlattenedTreeParent() const
|
|||
return (parent && parent->IsContent()) ? parent->AsContent() : nullptr;
|
||||
}
|
||||
|
||||
inline nsINode*
|
||||
nsINode::GetFlattenedTreeParentNodeForStyle() const
|
||||
{
|
||||
return ::GetFlattenedTreeParentNode<nsIContent::eForStyle>(this);
|
||||
}
|
||||
|
||||
#endif // nsIContentInlines_h
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue