summaryrefslogtreecommitdiff
path: root/xfa/fxfa/parser
diff options
context:
space:
mode:
authorTom Sepez <tsepez@chromium.org>2018-07-30 19:31:19 +0000
committerChromium commit bot <commit-bot@chromium.org>2018-07-30 19:31:19 +0000
commitd718d634b7aa3311a5b6298574d06f091365259f (patch)
tree39560860d111a143e6d3b27e42245ca79710daab /xfa/fxfa/parser
parent5822da79e645ad896c4aeec623d38a92ee7231a8 (diff)
downloadpdfium-d718d634b7aa3311a5b6298574d06f091365259f.tar.xz
Type-safe iteration over CXFA_ContentLayoutItems.
There's no reason that every CXFA_LayoutItem must be a CXFA_ContentLayout item, so use checked conversions. The code may already be arranging things so the constraint is already satisfied, but this adds an additional layer of safety. Tidy some long expressions with pre-existing typedef for node iterator while we're at it. Change-Id: If1448131ca73bfedb2266b070f1a913688598e64 Reviewed-on: https://pdfium-review.googlesource.com/39051 Reviewed-by: Lei Zhang <thestig@chromium.org> Commit-Queue: Tom Sepez <tsepez@chromium.org>
Diffstat (limited to 'xfa/fxfa/parser')
-rw-r--r--xfa/fxfa/parser/cxfa_itemlayoutprocessor.cpp151
-rw-r--r--xfa/fxfa/parser/cxfa_layoutitem.cpp2
-rw-r--r--xfa/fxfa/parser/cxfa_traversestrategy_xfanode.h4
3 files changed, 92 insertions, 65 deletions
diff --git a/xfa/fxfa/parser/cxfa_itemlayoutprocessor.cpp b/xfa/fxfa/parser/cxfa_itemlayoutprocessor.cpp
index 2ff9acd25a..60dd8a37a5 100644
--- a/xfa/fxfa/parser/cxfa_itemlayoutprocessor.cpp
+++ b/xfa/fxfa/parser/cxfa_itemlayoutprocessor.cpp
@@ -212,10 +212,12 @@ void RelocateTableRowCells(CXFA_ContentLayoutItem* pLayoutRow,
int32_t nCurrentColIdx = 0;
bool bMetWholeRowCell = false;
- for (auto* pLayoutChild =
- static_cast<CXFA_ContentLayoutItem*>(pLayoutRow->m_pFirstChild);
- pLayoutChild; pLayoutChild = static_cast<CXFA_ContentLayoutItem*>(
- pLayoutChild->m_pNextSibling)) {
+ for (CXFA_LayoutItem* pIter = pLayoutRow->m_pFirstChild; pIter;
+ pIter = pIter->m_pNextSibling) {
+ CXFA_ContentLayoutItem* pLayoutChild = pIter->AsContentLayoutItem();
+ if (!pLayoutChild)
+ continue;
+
int32_t nOriginalColSpan =
pLayoutChild->GetFormNode()->JSObject()->GetInteger(
XFA_Attribute::ColSpan);
@@ -257,7 +259,10 @@ void RelocateTableRowCells(CXFA_ContentLayoutItem* pLayoutRow,
if (bContainerHeightAutoSize) {
for (CXFA_LayoutItem* pIter = pLayoutRow->m_pFirstChild; pIter;
pIter = pIter->m_pNextSibling) {
- auto* pLayoutChild = static_cast<CXFA_ContentLayoutItem*>(pIter);
+ CXFA_ContentLayoutItem* pLayoutChild = pIter->AsContentLayoutItem();
+ if (!pLayoutChild)
+ continue;
+
UpdateWidgetSize(pLayoutChild, &pLayoutChild->m_sSize.width,
&fContentCalculatedHeight);
float fOldChildHeight = pLayoutChild->m_sSize.height;
@@ -283,8 +288,12 @@ void RelocateTableRowCells(CXFA_ContentLayoutItem* pLayoutRow,
if (fOffHeight > 0) {
for (CXFA_LayoutItem* pInnerIter = pLayoutChild->m_pFirstChild;
pInnerIter; pInnerIter = pInnerIter->m_pNextSibling) {
- static_cast<CXFA_ContentLayoutItem*>(pInnerIter)->m_sPos.y +=
- fOffHeight;
+ CXFA_ContentLayoutItem* pInnerChild =
+ pInnerIter->AsContentLayoutItem();
+ if (!pInnerChild)
+ continue;
+
+ pInnerChild->m_sPos.y += fOffHeight;
}
}
}
@@ -307,7 +316,10 @@ void RelocateTableRowCells(CXFA_ContentLayoutItem* pLayoutRow,
XFA_AttributeEnum::Rl_row) {
for (CXFA_LayoutItem* pIter = pLayoutRow->m_pFirstChild; pIter;
pIter = pIter->m_pNextSibling) {
- auto* pLayoutChild = static_cast<CXFA_ContentLayoutItem*>(pIter);
+ CXFA_ContentLayoutItem* pLayoutChild = pIter->AsContentLayoutItem();
+ if (!pLayoutChild)
+ continue;
+
pLayoutChild->m_sPos.x = fContentCalculatedWidth -
pLayoutChild->m_sPos.x -
pLayoutChild->m_sSize.width;
@@ -431,16 +443,13 @@ void DeleteLayoutGeneratedNode(CXFA_Node* pGenerateNode) {
CXFA_FFNotify* pNotify = pGenerateNode->GetDocument()->GetNotify();
CXFA_LayoutProcessor* pDocLayout =
pGenerateNode->GetDocument()->GetLayoutProcessor();
- CXFA_NodeIteratorTemplate<CXFA_Node, CXFA_TraverseStrategy_XFANode> sIterator(
- pGenerateNode);
+ CXFA_NodeIterator sIterator(pGenerateNode);
for (CXFA_Node* pNode = sIterator.GetCurrent(); pNode;
pNode = sIterator.MoveToNext()) {
CXFA_ContentLayoutItem* pCurLayoutItem =
- static_cast<CXFA_ContentLayoutItem*>(
- pNode->JSObject()->GetLayoutItem());
- CXFA_ContentLayoutItem* pNextLayoutItem = nullptr;
+ ToContentLayoutItem(pNode->JSObject()->GetLayoutItem());
while (pCurLayoutItem) {
- pNextLayoutItem = pCurLayoutItem->m_pNext;
+ CXFA_ContentLayoutItem* pNextLayoutItem = pCurLayoutItem->m_pNext;
pNotify->OnLayoutItemRemoving(pDocLayout, pCurLayoutItem);
delete pCurLayoutItem;
pCurLayoutItem = pNextLayoutItem;
@@ -509,7 +518,10 @@ bool FindLayoutItemSplitPos(CXFA_ContentLayoutItem* pLayoutItem,
float fRelSplitPos = *fProposedSplitPos - fCurBottomMargin;
for (CXFA_LayoutItem* pIter = pLayoutItem->m_pFirstChild; pIter;
pIter = pIter->m_pNextSibling) {
- auto* pChildItem = static_cast<CXFA_ContentLayoutItem*>(pIter);
+ CXFA_ContentLayoutItem* pChildItem = pIter->AsContentLayoutItem();
+ if (!pChildItem)
+ continue;
+
float fChildOffset =
fCurVerticalOffset + fCurTopMargin + pChildItem->m_sPos.y;
bool bChange = false;
@@ -623,8 +635,8 @@ CXFA_ItemLayoutProcessor::CXFA_ItemLayoutProcessor(CXFA_Node* pNode,
ASSERT(GetFormNode());
ASSERT(GetFormNode()->IsContainerNode() ||
GetFormNode()->GetElementType() == XFA_Element::Form);
- m_pOldLayoutItem = static_cast<CXFA_ContentLayoutItem*>(
- GetFormNode()->JSObject()->GetLayoutItem());
+ m_pOldLayoutItem =
+ ToContentLayoutItem(GetFormNode()->JSObject()->GetLayoutItem());
}
CXFA_ItemLayoutProcessor::~CXFA_ItemLayoutProcessor() {}
@@ -644,8 +656,7 @@ CXFA_ContentLayoutItem* CXFA_ItemLayoutProcessor::CreateContentLayoutItem(
pFormNode->GetDocument()->GetNotify()->OnCreateContentLayoutItem(
pFormNode);
CXFA_ContentLayoutItem* pPrevLayoutItem =
- static_cast<CXFA_ContentLayoutItem*>(
- pFormNode->JSObject()->GetLayoutItem());
+ ToContentLayoutItem(pFormNode->JSObject()->GetLayoutItem());
if (pPrevLayoutItem) {
while (pPrevLayoutItem->m_pNext)
pPrevLayoutItem = pPrevLayoutItem->m_pNext;
@@ -722,8 +733,12 @@ void CXFA_ItemLayoutProcessor::SplitLayoutItem(
pSecondParent->m_sSize.height += fCurTopMargin;
for (CXFA_LayoutItem* pParentIter = pSecondParent->m_pParent; pParentIter;
pParentIter = pParentIter->m_pParent) {
- static_cast<CXFA_ContentLayoutItem*>(pParentIter)->m_sSize.height +=
- fCurTopMargin;
+ CXFA_ContentLayoutItem* pContentItem =
+ pParentIter->AsContentLayoutItem();
+ if (!pContentItem)
+ continue;
+
+ pContentItem->m_sSize.height += fCurTopMargin;
}
}
} else {
@@ -733,7 +748,7 @@ void CXFA_ItemLayoutProcessor::SplitLayoutItem(
}
CXFA_ContentLayoutItem* pChildren =
- static_cast<CXFA_ContentLayoutItem*>(pLayoutItem->m_pFirstChild);
+ ToContentLayoutItem(pLayoutItem->m_pFirstChild);
pLayoutItem->m_pFirstChild = nullptr;
float lHeightForKeep = 0;
@@ -741,8 +756,7 @@ void CXFA_ItemLayoutProcessor::SplitLayoutItem(
std::vector<CXFA_ContentLayoutItem*> keepLayoutItems;
for (CXFA_ContentLayoutItem *pChildItem = pChildren, *pChildNext = nullptr;
pChildItem; pChildItem = pChildNext) {
- pChildNext =
- static_cast<CXFA_ContentLayoutItem*>(pChildItem->m_pNextSibling);
+ pChildNext = ToContentLayoutItem(pChildItem->m_pNextSibling);
pChildItem->m_pNextSibling = nullptr;
if (fSplitPos <= fCurTopMargin + pChildItem->m_sPos.y + fCurBottomMargin +
XFA_LAYOUT_FLOAT_PERCISION) {
@@ -803,8 +817,7 @@ void CXFA_ItemLayoutProcessor::SplitLayoutItem(float fSplitPos) {
CXFA_ContentLayoutItem* CXFA_ItemLayoutProcessor::ExtractLayoutItem() {
CXFA_ContentLayoutItem* pLayoutItem = m_pLayoutItem;
if (pLayoutItem) {
- m_pLayoutItem =
- static_cast<CXFA_ContentLayoutItem*>(pLayoutItem->m_pNextSibling);
+ m_pLayoutItem = ToContentLayoutItem(pLayoutItem->m_pNextSibling);
pLayoutItem->m_pNextSibling = nullptr;
}
@@ -1291,10 +1304,11 @@ void CXFA_ItemLayoutProcessor::DoLayoutTableContainer(CXFA_Node* pLayoutNode) {
std::vector<CXFA_ContentLayoutItem*> rgRowItems;
std::vector<int32_t> rgRowItemsSpan;
std::vector<float> rgRowItemsWidth;
- for (auto* pLayoutChild =
- static_cast<CXFA_ContentLayoutItem*>(m_pLayoutItem->m_pFirstChild);
- pLayoutChild; pLayoutChild = static_cast<CXFA_ContentLayoutItem*>(
- pLayoutChild->m_pNextSibling)) {
+ for (CXFA_LayoutItem* pIter = m_pLayoutItem->m_pFirstChild; pIter;
+ pIter = pIter->m_pNextSibling) {
+ CXFA_ContentLayoutItem* pLayoutChild = pIter->AsContentLayoutItem();
+ if (!pLayoutChild)
+ continue;
if (pLayoutChild->GetFormNode()->GetElementType() != XFA_Element::Subform)
continue;
if (!pLayoutChild->GetFormNode()->PresenceRequiresSpace())
@@ -1307,8 +1321,8 @@ void CXFA_ItemLayoutProcessor::DoLayoutTableContainer(CXFA_Node* pLayoutNode) {
eLayout != XFA_AttributeEnum::Rl_row) {
continue;
}
- auto* pRowLayoutCell =
- static_cast<CXFA_ContentLayoutItem*>(pLayoutChild->m_pFirstChild);
+ CXFA_ContentLayoutItem* pRowLayoutCell =
+ ToContentLayoutItem(pLayoutChild->m_pFirstChild);
if (pRowLayoutCell) {
rgRowItems.push_back(pRowLayoutCell);
int32_t iColSpan =
@@ -1329,8 +1343,8 @@ void CXFA_ItemLayoutProcessor::DoLayoutTableContainer(CXFA_Node* pLayoutNode) {
while (rgRowItems[i] &&
(rgRowItemsSpan[i] <= 0 ||
!rgRowItems[i]->GetFormNode()->PresenceRequiresSpace())) {
- auto* pNewCell = static_cast<CXFA_ContentLayoutItem*>(
- rgRowItems[i]->m_pNextSibling);
+ CXFA_ContentLayoutItem* pNewCell =
+ ToContentLayoutItem(rgRowItems[i]->m_pNextSibling);
if (rgRowItemsSpan[i] < 0 &&
rgRowItems[i]->GetFormNode()->PresenceRequiresSpace()) {
pNewCell = nullptr;
@@ -1385,7 +1399,9 @@ void CXFA_ItemLayoutProcessor::DoLayoutTableContainer(CXFA_Node* pLayoutNode) {
float fCurrentRowY = 0;
for (CXFA_LayoutItem* pIter = m_pLayoutItem->m_pFirstChild; pIter;
pIter = pIter->m_pNextSibling) {
- auto* pLayoutChild = static_cast<CXFA_ContentLayoutItem*>(pIter);
+ CXFA_ContentLayoutItem* pLayoutChild = pIter->AsContentLayoutItem();
+ if (!pLayoutChild)
+ continue;
if (!pLayoutChild->GetFormNode()->PresenceRequiresSpace())
continue;
@@ -1529,7 +1545,10 @@ bool CXFA_ItemLayoutProcessor::JudgePutNextPage(
float fItemsHeight = 0;
for (CXFA_LayoutItem* pIter = pParentLayoutItem->m_pFirstChild; pIter;
pIter = pIter->m_pNextSibling) {
- auto* pChildLayoutItem = static_cast<CXFA_ContentLayoutItem*>(pIter);
+ CXFA_ContentLayoutItem* pChildLayoutItem = pIter->AsContentLayoutItem();
+ if (!pChildLayoutItem)
+ continue;
+
if (ExistContainerKeep(pChildLayoutItem->GetFormNode(), false)) {
pKeepItems->push_back(pChildLayoutItem);
fItemsHeight += pChildLayoutItem->m_sSize.height;
@@ -1546,8 +1565,7 @@ void CXFA_ItemLayoutProcessor::ProcessUnUseBinds(CXFA_Node* pFormNode) {
if (!pFormNode)
return;
- CXFA_NodeIteratorTemplate<CXFA_Node, CXFA_TraverseStrategy_XFANode> sIterator(
- pFormNode);
+ CXFA_NodeIterator sIterator(pFormNode);
for (CXFA_Node* pNode = sIterator.MoveToNext(); pNode;
pNode = sIterator.MoveToNext()) {
if (pNode->IsContainerNode()) {
@@ -1658,21 +1676,25 @@ XFA_ItemLayoutProcessorResult CXFA_ItemLayoutProcessor::DoLayoutFlowedContainer(
if (m_pLayoutItem) {
if (m_nCurChildNodeStage != XFA_ItemLayoutProcessorStages::Done &&
eFlowStrategy != XFA_AttributeEnum::Tb) {
- pLayoutChild =
- static_cast<CXFA_ContentLayoutItem*>(m_pLayoutItem->m_pFirstChild);
- for (CXFA_ContentLayoutItem* pLayoutNext = pLayoutChild; pLayoutNext;
- pLayoutNext = static_cast<CXFA_ContentLayoutItem*>(
- pLayoutNext->m_pNextSibling)) {
- if (pLayoutNext->m_sPos.y != pLayoutChild->m_sPos.y)
- pLayoutChild = pLayoutNext;
+ pLayoutChild = ToContentLayoutItem(m_pLayoutItem->m_pFirstChild);
+ for (CXFA_LayoutItem* pLayoutNext = pLayoutChild; pLayoutNext;
+ pLayoutNext = pLayoutNext->m_pNextSibling) {
+ CXFA_ContentLayoutItem* pContentNext =
+ pLayoutNext->AsContentLayoutItem();
+ if (!pContentNext)
+ continue;
+
+ if (pContentNext->m_sPos.y != pLayoutChild->m_sPos.y)
+ pLayoutChild = pContentNext;
}
}
- for (auto* pLayoutTempChild =
- static_cast<CXFA_ContentLayoutItem*>(m_pLayoutItem->m_pFirstChild);
- pLayoutTempChild != pLayoutChild;
- pLayoutTempChild = static_cast<CXFA_ContentLayoutItem*>(
- pLayoutTempChild->m_pNextSibling)) {
+ for (CXFA_LayoutItem* pTempChild = m_pLayoutItem->m_pFirstChild;
+ pTempChild != pLayoutChild; pTempChild = pTempChild->m_pNextSibling) {
+ CXFA_ContentLayoutItem* pLayoutTempChild =
+ pTempChild->AsContentLayoutItem();
+ if (!pLayoutTempChild)
+ continue;
if (!pLayoutTempChild->GetFormNode()->PresenceRequiresSpace())
continue;
@@ -1714,9 +1736,11 @@ XFA_ItemLayoutProcessorResult CXFA_ItemLayoutProcessor::DoLayoutFlowedContainer(
uint8_t uCurHAlignState =
(eFlowStrategy != XFA_AttributeEnum::Rl_tb ? 0 : 2);
if (pLayoutChild) {
- for (CXFA_ContentLayoutItem* pLayoutNext = pLayoutChild; pLayoutNext;
- pLayoutNext = static_cast<CXFA_ContentLayoutItem*>(
- pLayoutNext->m_pNextSibling)) {
+ for (CXFA_LayoutItem* pNext = pLayoutChild; pNext;
+ pNext = pNext->m_pNextSibling) {
+ CXFA_ContentLayoutItem* pLayoutNext = pNext->AsContentLayoutItem();
+ if (!pLayoutNext)
+ continue;
if (!pLayoutNext->m_pNextSibling && m_pCurChildPreprocessor &&
m_pCurChildPreprocessor->GetFormNode() ==
pLayoutNext->GetFormNode()) {
@@ -1741,26 +1765,25 @@ XFA_ItemLayoutProcessorResult CXFA_ItemLayoutProcessor::DoLayoutFlowedContainer(
}
}
- if (static_cast<CXFA_ContentLayoutItem*>(m_pLayoutItem->m_pFirstChild) ==
- pLayoutChild) {
+ if (ToContentLayoutItem(m_pLayoutItem->m_pFirstChild) == pLayoutChild) {
m_pLayoutItem->m_pFirstChild = nullptr;
} else {
for (CXFA_LayoutItem* pLayoutNext = m_pLayoutItem->m_pFirstChild;
pLayoutNext; pLayoutNext = pLayoutNext->m_pNextSibling) {
- if (static_cast<CXFA_ContentLayoutItem*>(
- pLayoutNext->m_pNextSibling) == pLayoutChild) {
+ if (ToContentLayoutItem(pLayoutNext->m_pNextSibling) ==
+ pLayoutChild) {
pLayoutNext->m_pNextSibling = nullptr;
break;
}
}
}
- auto* pLayoutNextTemp =
- static_cast<CXFA_ContentLayoutItem*>(pLayoutChild);
+ CXFA_ContentLayoutItem* pLayoutNextTemp =
+ ToContentLayoutItem(pLayoutChild);
while (pLayoutNextTemp) {
pLayoutNextTemp->m_pParent = nullptr;
- auto* pSaveLayoutNext = static_cast<CXFA_ContentLayoutItem*>(
- pLayoutNextTemp->m_pNextSibling);
+ CXFA_ContentLayoutItem* pSaveLayoutNext =
+ ToContentLayoutItem(pLayoutNextTemp->m_pNextSibling);
pLayoutNextTemp->m_pNextSibling = nullptr;
pLayoutNextTemp = pSaveLayoutNext;
}
@@ -2397,7 +2420,11 @@ void CXFA_ItemLayoutProcessor::AddLeaderAfterSplit(
float fHeight = pLeaderLayoutItem->m_sSize.height;
for (CXFA_LayoutItem* pIter = m_pLayoutItem->m_pFirstChild; pIter;
pIter = pIter->m_pNextSibling) {
- static_cast<CXFA_ContentLayoutItem*>(pIter)->m_sPos.y += fHeight;
+ CXFA_ContentLayoutItem* pContentItem = pIter->AsContentLayoutItem();
+ if (!pContentItem)
+ continue;
+
+ pContentItem->m_sPos.y += fHeight;
}
pLeaderLayoutItem->m_sPos.y = 0;
diff --git a/xfa/fxfa/parser/cxfa_layoutitem.cpp b/xfa/fxfa/parser/cxfa_layoutitem.cpp
index aac7e5db41..42294a508b 100644
--- a/xfa/fxfa/parser/cxfa_layoutitem.cpp
+++ b/xfa/fxfa/parser/cxfa_layoutitem.cpp
@@ -28,7 +28,7 @@ void XFA_ReleaseLayoutItem(CXFA_LayoutItem* pLayoutItem) {
}
pNotify->OnLayoutItemRemoving(pDocLayout, pLayoutItem);
if (pLayoutItem->GetFormNode()->GetElementType() == XFA_Element::PageArea) {
- pNotify->OnPageEvent(static_cast<CXFA_ContainerLayoutItem*>(pLayoutItem),
+ pNotify->OnPageEvent(ToContainerLayoutItem(pLayoutItem),
XFA_PAGEVIEWEVENT_PostRemoved);
}
delete pLayoutItem;
diff --git a/xfa/fxfa/parser/cxfa_traversestrategy_xfanode.h b/xfa/fxfa/parser/cxfa_traversestrategy_xfanode.h
index fc98d18623..90f39a8ba0 100644
--- a/xfa/fxfa/parser/cxfa_traversestrategy_xfanode.h
+++ b/xfa/fxfa/parser/cxfa_traversestrategy_xfanode.h
@@ -22,7 +22,7 @@ class CXFA_TraverseStrategy_XFANode {
}
};
-typedef CXFA_NodeIteratorTemplate<CXFA_Node, CXFA_TraverseStrategy_XFANode>
- CXFA_NodeIterator;
+using CXFA_NodeIterator =
+ CXFA_NodeIteratorTemplate<CXFA_Node, CXFA_TraverseStrategy_XFANode>;
#endif // XFA_FXFA_PARSER_CXFA_TRAVERSESTRATEGY_XFANODE_H_