Differentiate the type of LayoutItem to create

This CL splits CXFA_FFNotify::OnCreateLayoutItem into a Content and
Container variant. This removes the need for casting at the two call
sites.

Change-Id: Ic19bf4398f0ea32099c270f3bb585a18004ccb5d
Reviewed-on: https://pdfium-review.googlesource.com/22412
Reviewed-by: Ryan Harrison <rharrison@chromium.org>
Commit-Queue: dsinclair <dsinclair@chromium.org>
diff --git a/xfa/fxfa/cxfa_ffnotify.cpp b/xfa/fxfa/cxfa_ffnotify.cpp
index 21273f2..5dc06f9 100644
--- a/xfa/fxfa/cxfa_ffnotify.cpp
+++ b/xfa/fxfa/cxfa_ffnotify.cpp
@@ -99,14 +99,22 @@
   }
 }
 
-CXFA_LayoutItem* CXFA_FFNotify::OnCreateLayoutItem(CXFA_Node* pNode) {
-  CXFA_LayoutProcessor* pLayout = m_pDoc->GetXFADoc()->GetDocLayout();
-  CXFA_FFDocView* pDocView = m_pDoc->GetDocView(pLayout);
+CXFA_ContainerLayoutItem* CXFA_FFNotify::OnCreateContainerLayoutItem(
+    CXFA_Node* pNode) {
+  XFA_Element type = pNode->GetElementType();
+  ASSERT(type == XFA_Element::ContentArea || type == XFA_Element::PageArea);
+
+  if (type == XFA_Element::PageArea) {
+    CXFA_LayoutProcessor* pLayout = m_pDoc->GetXFADoc()->GetDocLayout();
+    return new CXFA_FFPageView(m_pDoc->GetDocView(pLayout), pNode);
+  }
+  return new CXFA_ContainerLayoutItem(pNode);
+}
+
+CXFA_ContentLayoutItem* CXFA_FFNotify::OnCreateContentLayoutItem(
+    CXFA_Node* pNode) {
   XFA_Element eType = pNode->GetElementType();
-  if (eType == XFA_Element::PageArea)
-    return new CXFA_FFPageView(pDocView, pNode);
-  if (eType == XFA_Element::ContentArea)
-    return new CXFA_ContainerLayoutItem(pNode);
+  ASSERT(eType != XFA_Element::ContentArea && eType != XFA_Element::PageArea);
 
   // We only need to create the widget for certain types of objects.
   if (!XFA_IsCreateWidget(eType))
@@ -177,8 +185,10 @@
       break;
   }
 
-  if (pWidget)
-    pWidget->SetDocView(pDocView);
+  if (pWidget) {
+    CXFA_LayoutProcessor* pLayout = m_pDoc->GetXFADoc()->GetDocLayout();
+    pWidget->SetDocView(m_pDoc->GetDocView(pLayout));
+  }
   return pWidget;
 }
 
diff --git a/xfa/fxfa/cxfa_ffnotify.h b/xfa/fxfa/cxfa_ffnotify.h
index 35b38fd..924a060 100644
--- a/xfa/fxfa/cxfa_ffnotify.h
+++ b/xfa/fxfa/cxfa_ffnotify.h
@@ -11,6 +11,8 @@
 #include "xfa/fxfa/parser/cxfa_document.h"
 
 class CXFA_FFWidgetHandler;
+class CXFA_ContainerLayoutItem;
+class CXFA_ContentLayoutItem;
 
 class CXFA_FFNotify {
  public:
@@ -35,7 +37,9 @@
   void OnChildAdded(CXFA_Node* pSender);
   void OnChildRemoved();
 
-  CXFA_LayoutItem* OnCreateLayoutItem(CXFA_Node* pNode);
+  CXFA_ContainerLayoutItem* OnCreateContainerLayoutItem(CXFA_Node* pNode);
+  CXFA_ContentLayoutItem* OnCreateContentLayoutItem(CXFA_Node* pNode);
+
   void OnLayoutItemAdded(CXFA_LayoutProcessor* pLayout,
                          CXFA_LayoutItem* pSender,
                          int32_t iPageIdx,
diff --git a/xfa/fxfa/parser/cxfa_itemlayoutprocessor.cpp b/xfa/fxfa/parser/cxfa_itemlayoutprocessor.cpp
index bd21cdc..398a5e8 100644
--- a/xfa/fxfa/parser/cxfa_itemlayoutprocessor.cpp
+++ b/xfa/fxfa/parser/cxfa_itemlayoutprocessor.cpp
@@ -1184,9 +1184,9 @@
     m_pOldLayoutItem = m_pOldLayoutItem->m_pNext;
     return pLayoutItem;
   }
-  pLayoutItem = (CXFA_ContentLayoutItem*)pFormNode->GetDocument()
-                    ->GetNotify()
-                    ->OnCreateLayoutItem(pFormNode);
+  pLayoutItem =
+      pFormNode->GetDocument()->GetNotify()->OnCreateContentLayoutItem(
+          pFormNode);
   CXFA_ContentLayoutItem* pPrevLayoutItem =
       static_cast<CXFA_ContentLayoutItem*>(
           pFormNode->JSObject()->GetLayoutItem());
diff --git a/xfa/fxfa/parser/cxfa_layoutpagemgr.cpp b/xfa/fxfa/parser/cxfa_layoutpagemgr.cpp
index 61caae7..2090290 100644
--- a/xfa/fxfa/parser/cxfa_layoutpagemgr.cpp
+++ b/xfa/fxfa/parser/cxfa_layoutpagemgr.cpp
@@ -580,8 +580,7 @@
     pNewPageAreaLayoutItem = pContainerItem;
   } else {
     CXFA_FFNotify* pNotify = pNewPageArea->GetDocument()->GetNotify();
-    auto* pContainerItem = static_cast<CXFA_ContainerLayoutItem*>(
-        pNotify->OnCreateLayoutItem(pNewPageArea));
+    auto* pContainerItem = pNotify->OnCreateContainerLayoutItem(pNewPageArea);
     m_PageArray.push_back(pContainerItem);
     m_nAvailPages++;
     pNotify->OnPageEvent(pContainerItem, XFA_PAGEVIEWEVENT_PostRemoved);