From 8584902d81ffabc06bb4895f558e375e5429fe72 Mon Sep 17 00:00:00 2001 From: Tom Sepez Date: Sat, 28 Jul 2018 00:00:33 +0000 Subject: Remove CXFA_TraverseStrategy_ContentLayoutItem. It makes illegal casts and requires its callers to double-check the type validity of results before use. Instead, use the parent class iterator and perform checked casts. No functional difference, since it looks like the requisite checks were being made in all places. Make one "using" visible to other files to save some verbosity. Change-Id: I894ca15b4bdddd4723b787663950a58bc58b7f06 Reviewed-on: https://pdfium-review.googlesource.com/39030 Reviewed-by: Lei Zhang Commit-Queue: Lei Zhang --- BUILD.gn | 1 - fxjs/xfa/cjx_layoutpseudomodel.cpp | 51 ++++++++++------------ xfa/fxfa/cxfa_ffpageview.h | 5 --- .../cxfa_traversestrategy_contentlayoutitem.h | 30 ------------- xfa/fxfa/parser/cxfa_traversestrategy_layoutitem.h | 5 +++ 5 files changed, 29 insertions(+), 63 deletions(-) delete mode 100644 xfa/fxfa/parser/cxfa_traversestrategy_contentlayoutitem.h diff --git a/BUILD.gn b/BUILD.gn index 09cf28597c..24dfd1df59 100644 --- a/BUILD.gn +++ b/BUILD.gn @@ -2759,7 +2759,6 @@ if (pdf_enable_xfa) { "xfa/fxfa/parser/cxfa_traverse.cpp", "xfa/fxfa/parser/cxfa_traverse.h", "xfa/fxfa/parser/cxfa_traversestrategy_contentareacontainerlayoutitem.h", - "xfa/fxfa/parser/cxfa_traversestrategy_contentlayoutitem.h", "xfa/fxfa/parser/cxfa_traversestrategy_layoutitem.h", "xfa/fxfa/parser/cxfa_traversestrategy_xfacontainernode.h", "xfa/fxfa/parser/cxfa_traversestrategy_xfanode.h", diff --git a/fxjs/xfa/cjx_layoutpseudomodel.cpp b/fxjs/xfa/cjx_layoutpseudomodel.cpp index 4918349111..ea842c78e0 100644 --- a/fxjs/xfa/cjx_layoutpseudomodel.cpp +++ b/fxjs/xfa/cjx_layoutpseudomodel.cpp @@ -24,7 +24,7 @@ #include "xfa/fxfa/parser/cxfa_measurement.h" #include "xfa/fxfa/parser/cxfa_node.h" #include "xfa/fxfa/parser/cxfa_nodeiteratortemplate.h" -#include "xfa/fxfa/parser/cxfa_traversestrategy_contentlayoutitem.h" +#include "xfa/fxfa/parser/cxfa_traversestrategy_layoutitem.h" const CJX_MethodSpec CJX_LayoutPseudoModel::MethodSpecs[] = { {"absPage", absPage_static}, @@ -244,14 +244,13 @@ std::vector CJX_LayoutPseudoModel::GetObjArray( if (pItem->GetFormNode()->GetElementType() == XFA_Element::ContentArea) { retArray.push_back(pItem->GetFormNode()); if (!bOnPageArea) { - CXFA_NodeIteratorTemplate - iterator(static_cast(pItem->m_pFirstChild)); - for (CXFA_ContentLayoutItem* pItemChild = iterator.GetCurrent(); - pItemChild; pItemChild = iterator.MoveToNext()) { - if (!pItemChild->IsContentLayoutItem()) { + CXFA_LayoutItemIterator iterator(pItem->m_pFirstChild); + for (CXFA_LayoutItem* pChild = iterator.GetCurrent(); pChild; + pChild = iterator.MoveToNext()) { + CXFA_ContentLayoutItem* pItemChild = pChild->AsContentLayoutItem(); + if (!pItemChild) continue; - } + XFA_Element eType = pItemChild->GetFormNode()->GetElementType(); if (eType != XFA_Element::Field && eType != XFA_Element::Draw && eType != XFA_Element::Subform && eType != XFA_Element::Area) { @@ -266,14 +265,13 @@ std::vector CJX_LayoutPseudoModel::GetObjArray( } } else { if (bOnPageArea) { - CXFA_NodeIteratorTemplate - iterator(static_cast(pItem)); - for (CXFA_ContentLayoutItem* pItemChild = iterator.GetCurrent(); - pItemChild; pItemChild = iterator.MoveToNext()) { - if (!pItemChild->IsContentLayoutItem()) { + CXFA_LayoutItemIterator iterator(pItem); + for (CXFA_LayoutItem* pChild = iterator.GetCurrent(); pChild; + pChild = iterator.MoveToNext()) { + CXFA_ContentLayoutItem* pItemChild = pChild->AsContentLayoutItem(); + if (!pItemChild) continue; - } + XFA_Element eType = pItemChild->GetFormNode()->GetElementType(); if (eType != XFA_Element::Field && eType != XFA_Element::Draw && eType != XFA_Element::Subform && eType != XFA_Element::Area) { @@ -281,6 +279,7 @@ std::vector CJX_LayoutPseudoModel::GetObjArray( } if (pdfium::ContainsValue(formItems, pItemChild->GetFormNode())) continue; + formItems.insert(pItemChild->GetFormNode()); retArray.push_back(pItemChild->GetFormNode()); } @@ -305,12 +304,11 @@ std::vector CJX_LayoutPseudoModel::GetObjArray( pItem = pItem->m_pNextSibling) { if (pItem->GetFormNode()->GetElementType() == XFA_Element::ContentArea) { if (!bOnPageArea) { - CXFA_NodeIteratorTemplate - iterator(static_cast(pItem->m_pFirstChild)); - for (CXFA_ContentLayoutItem* pItemChild = iterator.GetCurrent(); - pItemChild; pItemChild = iterator.MoveToNext()) { - if (!pItemChild->IsContentLayoutItem()) + CXFA_LayoutItemIterator iterator(pItem->m_pFirstChild); + for (CXFA_LayoutItem* pChild = iterator.GetCurrent(); pChild; + pChild = iterator.MoveToNext()) { + CXFA_ContentLayoutItem* pItemChild = pChild->AsContentLayoutItem(); + if (!pItemChild) continue; if (pItemChild->GetFormNode()->GetElementType() != eType) continue; @@ -323,12 +321,11 @@ std::vector CJX_LayoutPseudoModel::GetObjArray( } } else { if (bOnPageArea) { - CXFA_NodeIteratorTemplate - iterator(static_cast(pItem)); - for (CXFA_ContentLayoutItem* pItemChild = iterator.GetCurrent(); - pItemChild; pItemChild = iterator.MoveToNext()) { - if (!pItemChild->IsContentLayoutItem()) + CXFA_LayoutItemIterator iterator(pItem); + for (CXFA_LayoutItem* pChild = iterator.GetCurrent(); pChild; + pChild = iterator.MoveToNext()) { + CXFA_ContentLayoutItem* pItemChild = pChild->AsContentLayoutItem(); + if (!pItemChild) continue; if (pItemChild->GetFormNode()->GetElementType() != eType) continue; diff --git a/xfa/fxfa/cxfa_ffpageview.h b/xfa/fxfa/cxfa_ffpageview.h index f3ae069638..daf2b1933e 100644 --- a/xfa/fxfa/cxfa_ffpageview.h +++ b/xfa/fxfa/cxfa_ffpageview.h @@ -12,7 +12,6 @@ #include "xfa/fxfa/parser/cxfa_containerlayoutitem.h" #include "xfa/fxfa/parser/cxfa_contentlayoutitem.h" -#include "xfa/fxfa/parser/cxfa_nodeiteratortemplate.h" #include "xfa/fxfa/parser/cxfa_traversestrategy_layoutitem.h" class CXFA_FFWidget; @@ -34,10 +33,6 @@ class CXFA_FFPageView : public CXFA_ContainerLayoutItem { UnownedPtr const m_pDocView; }; -using CXFA_LayoutItemIterator = - CXFA_NodeIteratorTemplate; - class CXFA_FFPageWidgetIterator : public IXFA_WidgetIterator { public: CXFA_FFPageWidgetIterator(CXFA_FFPageView* pPageView, uint32_t dwFilter); diff --git a/xfa/fxfa/parser/cxfa_traversestrategy_contentlayoutitem.h b/xfa/fxfa/parser/cxfa_traversestrategy_contentlayoutitem.h deleted file mode 100644 index de0d52ab10..0000000000 --- a/xfa/fxfa/parser/cxfa_traversestrategy_contentlayoutitem.h +++ /dev/null @@ -1,30 +0,0 @@ -// Copyright 2016 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com - -#ifndef XFA_FXFA_PARSER_CXFA_TRAVERSESTRATEGY_CONTENTLAYOUTITEM_H_ -#define XFA_FXFA_PARSER_CXFA_TRAVERSESTRATEGY_CONTENTLAYOUTITEM_H_ - -#include "xfa/fxfa/parser/cxfa_contentlayoutitem.h" - -class CXFA_TraverseStrategy_ContentLayoutItem { - public: - static CXFA_ContentLayoutItem* GetFirstChild( - CXFA_ContentLayoutItem* pLayoutItem) { - return static_cast(pLayoutItem->m_pFirstChild); - } - - static CXFA_ContentLayoutItem* GetNextSibling( - CXFA_ContentLayoutItem* pLayoutItem) { - return static_cast(pLayoutItem->m_pNextSibling); - } - - static CXFA_ContentLayoutItem* GetParent( - CXFA_ContentLayoutItem* pLayoutItem) { - return static_cast(pLayoutItem->m_pParent); - } -}; - -#endif // XFA_FXFA_PARSER_CXFA_TRAVERSESTRATEGY_CONTENTLAYOUTITEM_H_ diff --git a/xfa/fxfa/parser/cxfa_traversestrategy_layoutitem.h b/xfa/fxfa/parser/cxfa_traversestrategy_layoutitem.h index 7b39826130..0371eef449 100644 --- a/xfa/fxfa/parser/cxfa_traversestrategy_layoutitem.h +++ b/xfa/fxfa/parser/cxfa_traversestrategy_layoutitem.h @@ -8,6 +8,7 @@ #define XFA_FXFA_PARSER_CXFA_TRAVERSESTRATEGY_LAYOUTITEM_H_ #include "xfa/fxfa/parser/cxfa_layoutitem.h" +#include "xfa/fxfa/parser/cxfa_nodeiteratortemplate.h" class CXFA_TraverseStrategy_LayoutItem { public: @@ -22,4 +23,8 @@ class CXFA_TraverseStrategy_LayoutItem { } }; +using CXFA_LayoutItemIterator = + CXFA_NodeIteratorTemplate; + #endif // XFA_FXFA_PARSER_CXFA_TRAVERSESTRATEGY_LAYOUTITEM_H_ -- cgit v1.2.3