Don't static_cast<>(this) to subclass in CXFA_LayoutItem methods.

Instead, move the methods to the subclass where they belong.
Fix IWYU in CJX_Object.h to fix compilation.

Change-Id: I4c71f28235b9cf5000e9ddaf33d6602baf22205f
Reviewed-on: https://pdfium-review.googlesource.com/39170
Commit-Queue: Tom Sepez <tsepez@chromium.org>
Reviewed-by: Lei Zhang <thestig@chromium.org>
diff --git a/fxjs/xfa/cjx_layoutpseudomodel.cpp b/fxjs/xfa/cjx_layoutpseudomodel.cpp
index ea842c7..4c460c8 100644
--- a/fxjs/xfa/cjx_layoutpseudomodel.cpp
+++ b/fxjs/xfa/cjx_layoutpseudomodel.cpp
@@ -92,7 +92,8 @@
   if (!pDocLayout)
     return CJS_Return();
 
-  CXFA_LayoutItem* pLayoutItem = pDocLayout->GetLayoutItem(pNode);
+  CXFA_ContentLayoutItem* pLayoutItem =
+      ToContentLayoutItem(pDocLayout->GetLayoutItem(pNode));
   if (!pLayoutItem)
     return CJS_Return();
 
@@ -195,7 +196,8 @@
   if (!pDocLayout)
     return CJS_Return();
 
-  CXFA_LayoutItem* pLayoutItem = pDocLayout->GetLayoutItem(pNode);
+  CXFA_ContentLayoutItem* pLayoutItem =
+      ToContentLayoutItem(pDocLayout->GetLayoutItem(pNode));
   if (!pLayoutItem)
     return CJS_Return(runtime->NewNumber(-1));
 
@@ -473,7 +475,8 @@
   if (!pDocLayout)
     return CJS_Return();
 
-  CXFA_LayoutItem* pLayoutItem = pDocLayout->GetLayoutItem(pNode);
+  CXFA_ContentLayoutItem* pLayoutItem =
+      ToContentLayoutItem(pDocLayout->GetLayoutItem(pNode));
   if (!pLayoutItem)
     return CJS_Return(runtime->NewNumber(-1));
 
diff --git a/fxjs/xfa/cjx_object.h b/fxjs/xfa/cjx_object.h
index 5b57cbe..c9042b5 100644
--- a/fxjs/xfa/cjx_object.h
+++ b/fxjs/xfa/cjx_object.h
@@ -19,6 +19,7 @@
 #include "third_party/base/optional.h"
 #include "third_party/base/span.h"
 #include "xfa/fxfa/fxfa_basic.h"
+#include "xfa/fxfa/parser/cxfa_measurement.h"
 
 class CFXJSE_Value;
 class CFX_V8;
diff --git a/xfa/fxfa/cxfa_fffield.cpp b/xfa/fxfa/cxfa_fffield.cpp
index f3c1412..8dd0a9e 100644
--- a/xfa/fxfa/cxfa_fffield.cpp
+++ b/xfa/fxfa/cxfa_fffield.cpp
@@ -167,7 +167,7 @@
   CFX_RectF rtWidget = GetRectWithoutRotate();
   CXFA_Margin* margin = m_pNode->GetMarginIfExists();
   if (margin) {
-    CXFA_LayoutItem* pItem = this;
+    CXFA_ContentLayoutItem* pItem = this;
     float fLeftInset = margin->GetLeftInset();
     float fRightInset = margin->GetRightInset();
     float fTopInset = margin->GetTopInset();
@@ -195,7 +195,7 @@
       m_rtCaption.Reset();
     } else {
       fCapReserve = caption->GetReserve();
-      CXFA_LayoutItem* pItem = this;
+      CXFA_ContentLayoutItem* pItem = this;
       if (!pItem->GetPrev() && !pItem->GetNext()) {
         m_rtCaption = rtWidget;
       } else {
diff --git a/xfa/fxfa/cxfa_fftext.cpp b/xfa/fxfa/cxfa_fftext.cpp
index 453a74b..3012ab9 100644
--- a/xfa/fxfa/cxfa_fftext.cpp
+++ b/xfa/fxfa/cxfa_fftext.cpp
@@ -42,7 +42,7 @@
   CFX_RectF rtText = GetRectWithoutRotate();
   CXFA_Margin* margin = m_pNode->GetMarginIfExists();
   if (margin) {
-    CXFA_LayoutItem* pItem = this;
+    CXFA_ContentLayoutItem* pItem = this;
     if (!pItem->GetPrev() && !pItem->GetNext()) {
       XFA_RectWithoutMargin(&rtText, margin);
     } else {
@@ -78,7 +78,7 @@
     return true;
 
   pTextLayout->m_Blocks.clear();
-  CXFA_LayoutItem* pItem = this;
+  CXFA_ContentLayoutItem* pItem = this;
   if (!pItem->GetPrev() && !pItem->GetNext())
     return true;
 
diff --git a/xfa/fxfa/cxfa_fwltheme.cpp b/xfa/fxfa/cxfa_fwltheme.cpp
index 1a94ba6..73f03ce 100644
--- a/xfa/fxfa/cxfa_fwltheme.cpp
+++ b/xfa/fxfa/cxfa_fwltheme.cpp
@@ -157,7 +157,7 @@
   if (!pWidget)
     return CFX_RectF();
 
-  CXFA_LayoutItem* pItem = pWidget;
+  CXFA_ContentLayoutItem* pItem = pWidget;
   CXFA_Node* pNode = pWidget->GetNode();
   CFX_RectF rect = pNode->GetUIMargin();
   CXFA_Para* para = pNode->GetParaIfExists();
diff --git a/xfa/fxfa/parser/cxfa_contentlayoutitem.cpp b/xfa/fxfa/parser/cxfa_contentlayoutitem.cpp
index 1ee364b..e763e2d 100644
--- a/xfa/fxfa/parser/cxfa_contentlayoutitem.cpp
+++ b/xfa/fxfa/parser/cxfa_contentlayoutitem.cpp
@@ -7,6 +7,7 @@
 #include "xfa/fxfa/parser/cxfa_contentlayoutitem.h"
 
 #include "fxjs/xfa/cjx_object.h"
+#include "xfa/fxfa/parser/cxfa_margin.h"
 #include "xfa/fxfa/parser/cxfa_node.h"
 
 CXFA_ContentLayoutItem::CXFA_ContentLayoutItem(CXFA_Node* pNode)
@@ -19,3 +20,81 @@
   if (m_pFormNode->JSObject()->GetLayoutItem() == this)
     m_pFormNode->JSObject()->SetLayoutItem(nullptr);
 }
+
+CXFA_ContentLayoutItem* CXFA_ContentLayoutItem::GetFirst() {
+  CXFA_ContentLayoutItem* pCurNode = this;
+  while (pCurNode->m_pPrev)
+    pCurNode = pCurNode->m_pPrev;
+
+  return pCurNode;
+}
+
+CXFA_ContentLayoutItem* CXFA_ContentLayoutItem::GetLast() {
+  CXFA_ContentLayoutItem* pCurNode = this;
+  while (pCurNode->m_pNext)
+    pCurNode = pCurNode->m_pNext;
+
+  return pCurNode;
+}
+
+CFX_RectF CXFA_ContentLayoutItem::GetRect(bool bRelative) const {
+  CFX_PointF sPos = m_sPos;
+  CFX_SizeF sSize = m_sSize;
+  if (bRelative)
+    return CFX_RectF(sPos, sSize);
+
+  for (CXFA_LayoutItem* pLayoutItem = m_pParent; pLayoutItem;
+       pLayoutItem = pLayoutItem->m_pParent) {
+    if (CXFA_ContentLayoutItem* pContent = pLayoutItem->AsContentLayoutItem()) {
+      sPos += pContent->m_sPos;
+      CXFA_Margin* pMarginNode =
+          pContent->m_pFormNode->GetFirstChildByClass<CXFA_Margin>(
+              XFA_Element::Margin);
+      if (pMarginNode) {
+        sPos += CFX_PointF(pMarginNode->JSObject()
+                               ->GetMeasure(XFA_Attribute::LeftInset)
+                               .ToUnit(XFA_Unit::Pt),
+                           pMarginNode->JSObject()
+                               ->GetMeasure(XFA_Attribute::TopInset)
+                               .ToUnit(XFA_Unit::Pt));
+      }
+      continue;
+    }
+
+    if (pLayoutItem->GetFormNode()->GetElementType() ==
+        XFA_Element::ContentArea) {
+      sPos += CFX_PointF(pLayoutItem->GetFormNode()
+                             ->JSObject()
+                             ->GetMeasure(XFA_Attribute::X)
+                             .ToUnit(XFA_Unit::Pt),
+                         pLayoutItem->GetFormNode()
+                             ->JSObject()
+                             ->GetMeasure(XFA_Attribute::Y)
+                             .ToUnit(XFA_Unit::Pt));
+      break;
+    }
+    if (pLayoutItem->GetFormNode()->GetElementType() == XFA_Element::PageArea)
+      break;
+  }
+  return CFX_RectF(sPos, sSize);
+}
+
+int32_t CXFA_ContentLayoutItem::GetIndex() const {
+  int32_t iIndex = 0;
+  const CXFA_ContentLayoutItem* pCurNode = this;
+  while (pCurNode->m_pPrev) {
+    pCurNode = pCurNode->m_pPrev;
+    ++iIndex;
+  }
+  return iIndex;
+}
+
+int32_t CXFA_ContentLayoutItem::GetCount() const {
+  int32_t iCount = GetIndex() + 1;
+  const CXFA_ContentLayoutItem* pCurNode = this;
+  while (pCurNode->m_pNext) {
+    pCurNode = pCurNode->m_pNext;
+    iCount++;
+  }
+  return iCount;
+}
diff --git a/xfa/fxfa/parser/cxfa_contentlayoutitem.h b/xfa/fxfa/parser/cxfa_contentlayoutitem.h
index 500d3e4..c7c440f 100644
--- a/xfa/fxfa/parser/cxfa_contentlayoutitem.h
+++ b/xfa/fxfa/parser/cxfa_contentlayoutitem.h
@@ -14,6 +14,15 @@
   explicit CXFA_ContentLayoutItem(CXFA_Node* pNode);
   ~CXFA_ContentLayoutItem() override;
 
+  CXFA_ContentLayoutItem* GetFirst();
+  CXFA_ContentLayoutItem* GetLast();
+  CXFA_ContentLayoutItem* GetPrev() const { return m_pPrev; }
+  CXFA_ContentLayoutItem* GetNext() const { return m_pNext; }
+
+  CFX_RectF GetRect(bool bRelative) const;
+  int32_t GetIndex() const;
+  int32_t GetCount() const;
+
   CXFA_ContentLayoutItem* m_pPrev;
   CXFA_ContentLayoutItem* m_pNext;
   CFX_PointF m_sPos;
diff --git a/xfa/fxfa/parser/cxfa_layoutitem.cpp b/xfa/fxfa/parser/cxfa_layoutitem.cpp
index 42294a5..8b1c30e 100644
--- a/xfa/fxfa/parser/cxfa_layoutitem.cpp
+++ b/xfa/fxfa/parser/cxfa_layoutitem.cpp
@@ -57,105 +57,6 @@
   }
   return nullptr;
 }
-
-CFX_RectF CXFA_LayoutItem::GetRect(bool bRelative) const {
-  ASSERT(m_bIsContentLayoutItem);
-
-  auto* pThis = static_cast<const CXFA_ContentLayoutItem*>(this);
-  CFX_PointF sPos = pThis->m_sPos;
-  CFX_SizeF sSize = pThis->m_sSize;
-  if (bRelative)
-    return CFX_RectF(sPos, sSize);
-
-  for (CXFA_LayoutItem* pLayoutItem = pThis->m_pParent; pLayoutItem;
-       pLayoutItem = pLayoutItem->m_pParent) {
-    if (CXFA_ContentLayoutItem* pContent = pLayoutItem->AsContentLayoutItem()) {
-      sPos += pContent->m_sPos;
-      CXFA_Margin* pMarginNode =
-          pLayoutItem->m_pFormNode->GetFirstChildByClass<CXFA_Margin>(
-              XFA_Element::Margin);
-      if (pMarginNode) {
-        sPos += CFX_PointF(pMarginNode->JSObject()
-                               ->GetMeasure(XFA_Attribute::LeftInset)
-                               .ToUnit(XFA_Unit::Pt),
-                           pMarginNode->JSObject()
-                               ->GetMeasure(XFA_Attribute::TopInset)
-                               .ToUnit(XFA_Unit::Pt));
-      }
-      continue;
-    }
-
-    if (pLayoutItem->m_pFormNode->GetElementType() ==
-        XFA_Element::ContentArea) {
-      sPos += CFX_PointF(pLayoutItem->m_pFormNode->JSObject()
-                             ->GetMeasure(XFA_Attribute::X)
-                             .ToUnit(XFA_Unit::Pt),
-                         pLayoutItem->m_pFormNode->JSObject()
-                             ->GetMeasure(XFA_Attribute::Y)
-                             .ToUnit(XFA_Unit::Pt));
-      break;
-    }
-    if (pLayoutItem->m_pFormNode->GetElementType() == XFA_Element::PageArea)
-      break;
-  }
-  return CFX_RectF(sPos, sSize);
-}
-
-CXFA_LayoutItem* CXFA_LayoutItem::GetFirst() {
-  ASSERT(m_bIsContentLayoutItem);
-  CXFA_ContentLayoutItem* pCurNode = static_cast<CXFA_ContentLayoutItem*>(this);
-  while (pCurNode->m_pPrev)
-    pCurNode = pCurNode->m_pPrev;
-
-  return pCurNode;
-}
-
-const CXFA_LayoutItem* CXFA_LayoutItem::GetLast() const {
-  ASSERT(m_bIsContentLayoutItem);
-  const CXFA_ContentLayoutItem* pCurNode =
-      static_cast<const CXFA_ContentLayoutItem*>(this);
-  while (pCurNode->m_pNext)
-    pCurNode = pCurNode->m_pNext;
-
-  return pCurNode;
-}
-
-CXFA_LayoutItem* CXFA_LayoutItem::GetPrev() const {
-  ASSERT(m_bIsContentLayoutItem);
-
-  return static_cast<const CXFA_ContentLayoutItem*>(this)->m_pPrev;
-}
-
-CXFA_LayoutItem* CXFA_LayoutItem::GetNext() const {
-  ASSERT(m_bIsContentLayoutItem);
-  return static_cast<const CXFA_ContentLayoutItem*>(this)->m_pNext;
-}
-
-int32_t CXFA_LayoutItem::GetIndex() const {
-  ASSERT(m_bIsContentLayoutItem);
-  int32_t iIndex = 0;
-  const CXFA_ContentLayoutItem* pCurNode =
-      static_cast<const CXFA_ContentLayoutItem*>(this);
-  while (pCurNode->m_pPrev) {
-    pCurNode = pCurNode->m_pPrev;
-    ++iIndex;
-  }
-  return iIndex;
-}
-
-int32_t CXFA_LayoutItem::GetCount() const {
-  ASSERT(m_bIsContentLayoutItem);
-
-  int32_t iCount = GetIndex() + 1;
-  const CXFA_ContentLayoutItem* pCurNode =
-      static_cast<const CXFA_ContentLayoutItem*>(this);
-  while (pCurNode->m_pNext) {
-    pCurNode = pCurNode->m_pNext;
-    iCount++;
-  }
-  return iCount;
-}
-
 void CXFA_LayoutItem::AddChild(CXFA_LayoutItem* pChildItem) {
   if (pChildItem->m_pParent)
     pChildItem->m_pParent->RemoveChild(pChildItem);
diff --git a/xfa/fxfa/parser/cxfa_layoutitem.h b/xfa/fxfa/parser/cxfa_layoutitem.h
index 6e51a05..f5568df 100644
--- a/xfa/fxfa/parser/cxfa_layoutitem.h
+++ b/xfa/fxfa/parser/cxfa_layoutitem.h
@@ -24,19 +24,10 @@
   CXFA_ContentLayoutItem* AsContentLayoutItem();
 
   CXFA_ContainerLayoutItem* GetPage() const;
-  CFX_RectF GetRect(bool bRelative) const;
-
+  CXFA_LayoutItem* GetParent() const { return m_pParent; }
   CXFA_Node* GetFormNode() const { return m_pFormNode.Get(); }
   void SetFormNode(CXFA_Node* pNode) { m_pFormNode = pNode; }
 
-  int32_t GetIndex() const;
-  int32_t GetCount() const;
-
-  CXFA_LayoutItem* GetParent() const { return m_pParent; }
-  CXFA_LayoutItem* GetFirst();
-  const CXFA_LayoutItem* GetLast() const;
-  CXFA_LayoutItem* GetPrev() const;
-  CXFA_LayoutItem* GetNext() const;
 
   void AddChild(CXFA_LayoutItem* pChildItem);
   void AddHeadChild(CXFA_LayoutItem* pChildItem);