summaryrefslogtreecommitdiff
path: root/xfa
diff options
context:
space:
mode:
authorDan Sinclair <dsinclair@chromium.org>2018-04-09 16:14:55 +0000
committerChromium commit bot <commit-bot@chromium.org>2018-04-09 16:14:55 +0000
commit2b4ad9ff5bf1727d12ef2bcce7e3fa925bbe8978 (patch)
treeec7691e24cee40c81f4214a089efcc5fa146a744 /xfa
parenta0706f0c904673ea9f679829ff87e730e5800765 (diff)
downloadpdfium-2b4ad9ff5bf1727d12ef2bcce7e3fa925bbe8978.tar.xz
Remove CXFA nodes instead of CFX_XML nodes
When we set data into the CJX nodes, we need to update the backing store of the XFA nodes, which are the XML nodes. When we update the backing store, there are cases where we need to remove the children (setting CData on a node or setting the value of an Attribute which is backed by a real node). Currently we call DeleteChildren on the XML node. This causes issues when we cleanup the tree as XFA nodes may point to these deleted XML nodes. Instead, this CL cleans up the XFA nodes which will in turn clean up the XML nodes. This seems like the right thing to do as we no longer have the backing nodes, so we should no longer have the XFA nodes on top of them. Bug: chromium:813155 Change-Id: I63d53fd56999ec9d3b3af2ab5952b374663f040c Reviewed-on: https://pdfium-review.googlesource.com/29950 Reviewed-by: Henrique Nakashima <hnakashima@chromium.org> Commit-Queue: dsinclair <dsinclair@chromium.org>
Diffstat (limited to 'xfa')
-rw-r--r--xfa/fxfa/parser/cxfa_node.cpp6
1 files changed, 4 insertions, 2 deletions
diff --git a/xfa/fxfa/parser/cxfa_node.cpp b/xfa/fxfa/parser/cxfa_node.cpp
index 3823d2eae0..7122d95bff 100644
--- a/xfa/fxfa/parser/cxfa_node.cpp
+++ b/xfa/fxfa/parser/cxfa_node.cpp
@@ -4678,8 +4678,10 @@ void CXFA_Node::SetToXML(const WideString& value) {
}
}
}
- if (bDeleteChildren)
- elem->DeleteChildren();
+ if (bDeleteChildren) {
+ while (auto* child = GetLastChild())
+ RemoveChild(child, false);
+ }
elem->SetTextData(value);
break;