diff --git a/dom/base/nsContentUtils.cpp b/dom/base/nsContentUtils.cpp index db8ea5fed7..adaf35920e 100644 --- a/dom/base/nsContentUtils.cpp +++ b/dom/base/nsContentUtils.cpp @@ -2395,34 +2395,35 @@ nsContentUtils::GetCommonAncestor(nsIDOMNode *aNode, return CallQueryInterface(common, aCommonAncestor); } -// static -nsINode* -nsContentUtils::GetCommonAncestor(nsINode* aNode1, - nsINode* aNode2) +template +static Node* +GetCommonAncestorInternal(Node* aNode1, + Node* aNode2, + GetParentFunc aGetParentFunc) { if (aNode1 == aNode2) { return aNode1; } // Build the chain of parents - AutoTArray parents1, parents2; + AutoTArray parents1, parents2; do { parents1.AppendElement(aNode1); - aNode1 = aNode1->GetParentNode(); + aNode1 = aGetParentFunc(aNode1); } while (aNode1); do { parents2.AppendElement(aNode2); - aNode2 = aNode2->GetParentNode(); + aNode2 = aGetParentFunc(aNode2); } while (aNode2); // Find where the parent chain differs uint32_t pos1 = parents1.Length(); uint32_t pos2 = parents2.Length(); - nsINode* parent = nullptr; + Node* parent = nullptr; uint32_t len; for (len = std::min(pos1, pos2); len > 0; --len) { - nsINode* child1 = parents1.ElementAt(--pos1); - nsINode* child2 = parents2.ElementAt(--pos2); + Node* child1 = parents1.ElementAt(--pos1); + Node* child2 = parents2.ElementAt(--pos2); if (child1 != child2) { break; } @@ -2432,6 +2433,15 @@ nsContentUtils::GetCommonAncestor(nsINode* aNode1, return parent; } +/* static */ +nsINode* +nsContentUtils::GetCommonAncestor(nsINode* aNode1, nsINode* aNode2) +{ + return GetCommonAncestorInternal(aNode1, aNode2, [](nsINode* aNode) { + return aNode->GetParentNode(); + }); +} + // static nsINode* nsContentUtils::GetCommonAncestorUnderInteractiveContent(nsINode* aNode1, diff --git a/dom/base/nsContentUtils.h b/dom/base/nsContentUtils.h index 74239c8036..c6e8070576 100644 --- a/dom/base/nsContentUtils.h +++ b/dom/base/nsContentUtils.h @@ -333,11 +333,10 @@ public: nsIDOMNode** aCommonAncestor); /** - * Returns the common ancestor, if any, for two nodes. Returns null if the - * nodes are disconnected. + * Returns the common ancestor, if any, for two nodes. + * Returns null if the nodes are disconnected. */ - static nsINode* GetCommonAncestor(nsINode* aNode1, - nsINode* aNode2); + static nsINode* GetCommonAncestor(nsINode* aNode1, nsINode* aNode2); /** * Returns the common ancestor under interactive content, if any.