Use RemoveChild() in XFA_ReleaseLayoutItem. Split off from https://pdfium-review.googlesource.com/c/pdfium/+/53571 to land separately. Also fix the recursion in XFA_ReleaseLayoutItem() so that we operate in an obvious depth-first manner (the old code had the potential to fire duplicate OnLayoutItemRemoving() callbacks on the same node, for example). Change-Id: I3fb1e9bfde38f057c61fad14662143690459e0e5 Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/54050 Reviewed-by: Lei Zhang <thestig@chromium.org> Commit-Queue: Tom Sepez <tsepez@chromium.org>
diff --git a/xfa/fxfa/layout/cxfa_layoutitem.cpp b/xfa/fxfa/layout/cxfa_layoutitem.cpp index 3dc65ce..4677c34 100644 --- a/xfa/fxfa/layout/cxfa_layoutitem.cpp +++ b/xfa/fxfa/layout/cxfa_layoutitem.cpp
@@ -16,21 +16,21 @@ void XFA_ReleaseLayoutItem(CXFA_LayoutItem* pLayoutItem) { CXFA_LayoutItem* pNode = pLayoutItem->GetFirstChild(); - CXFA_Document* pDocument = pLayoutItem->GetFormNode()->GetDocument(); - CXFA_FFNotify* pNotify = pDocument->GetNotify(); - CXFA_LayoutProcessor* pDocLayout = pDocument->GetLayoutProcessor(); while (pNode) { CXFA_LayoutItem* pNext = pNode->GetNextSibling(); - pNode->SetParent(nullptr); - pNotify->OnLayoutItemRemoving(pDocLayout, pNode); XFA_ReleaseLayoutItem(pNode); pNode = pNext; } + CXFA_Document* pDocument = pLayoutItem->GetFormNode()->GetDocument(); + CXFA_FFNotify* pNotify = pDocument->GetNotify(); + CXFA_LayoutProcessor* pDocLayout = pDocument->GetLayoutProcessor(); pNotify->OnLayoutItemRemoving(pDocLayout, pLayoutItem); if (pLayoutItem->GetFormNode()->GetElementType() == XFA_Element::PageArea) { pNotify->OnPageEvent(ToViewLayoutItem(pLayoutItem), XFA_PAGEVIEWEVENT_PostRemoved); } + if (pLayoutItem->GetParent()) + pLayoutItem->GetParent()->RemoveChild(pLayoutItem); delete pLayoutItem; }