Fold CXFA_MarginData into CXFA_Margin

This CL removes the CXFA_MarginData wrapper and moves the methods
directly to CXFA_Margin.

Change-Id: I7c9e979fb78d0d356605f1318489daabcb8c32cd
Reviewed-on: https://pdfium-review.googlesource.com/22110
Reviewed-by: Henrique Nakashima <hnakashima@chromium.org>
Commit-Queue: dsinclair <dsinclair@chromium.org>
diff --git a/BUILD.gn b/BUILD.gn
index b6482c7..4533544 100644
--- a/BUILD.gn
+++ b/BUILD.gn
@@ -2432,8 +2432,6 @@
       "xfa/fxfa/parser/cxfa_map.h",
       "xfa/fxfa/parser/cxfa_margin.cpp",
       "xfa/fxfa/parser/cxfa_margin.h",
-      "xfa/fxfa/parser/cxfa_margindata.cpp",
-      "xfa/fxfa/parser/cxfa_margindata.h",
       "xfa/fxfa/parser/cxfa_mdp.cpp",
       "xfa/fxfa/parser/cxfa_mdp.h",
       "xfa/fxfa/parser/cxfa_measurement.cpp",
diff --git a/fxjs/xfa/cjx_object.cpp b/fxjs/xfa/cjx_object.cpp
index 304b861..b1e3030 100644
--- a/fxjs/xfa/cjx_object.cpp
+++ b/fxjs/xfa/cjx_object.cpp
@@ -431,6 +431,14 @@
   return ToNode(GetXFAObject())->GetDefaultMeasurement(eAttr);
 }
 
+pdfium::Optional<float> CJX_Object::TryMeasureAsFloat(
+    XFA_Attribute attr) const {
+  pdfium::Optional<CXFA_Measurement> measure = TryMeasure(attr, false);
+  if (measure)
+    return {measure->ToUnit(XFA_Unit::Pt)};
+  return {};
+}
+
 CXFA_Measurement CJX_Object::GetMeasure(XFA_Attribute eAttr) const {
   return TryMeasure(eAttr, true).value_or(CXFA_Measurement());
 }
diff --git a/fxjs/xfa/cjx_object.h b/fxjs/xfa/cjx_object.h
index f6ce3cc..32bb01f 100644
--- a/fxjs/xfa/cjx_object.h
+++ b/fxjs/xfa/cjx_object.h
@@ -197,6 +197,7 @@
 
   pdfium::Optional<CXFA_Measurement> TryMeasure(XFA_Attribute eAttr,
                                                 bool bUseDefault) const;
+  pdfium::Optional<float> TryMeasureAsFloat(XFA_Attribute attr) const;
   bool SetMeasure(XFA_Attribute eAttr, CXFA_Measurement mValue, bool bNotify);
   CXFA_Measurement GetMeasure(XFA_Attribute eAttr) const;
 
diff --git a/xfa/fxfa/cxfa_ffarc.cpp b/xfa/fxfa/cxfa_ffarc.cpp
index 7f9e938..e670ba9 100644
--- a/xfa/fxfa/cxfa_ffarc.cpp
+++ b/xfa/fxfa/cxfa_ffarc.cpp
@@ -23,9 +23,9 @@
     return;
 
   CFX_RectF rtArc = GetRectWithoutRotate();
-  CXFA_MarginData marginData = m_pDataAcc->GetMarginData();
-  if (marginData.HasValidNode())
-    XFA_RectWidthoutMargin(rtArc, marginData);
+  CXFA_Margin* margin = m_pDataAcc->GetMargin();
+  if (margin)
+    XFA_RectWidthoutMargin(rtArc, margin);
 
   CFX_Matrix mtRotate = GetRotateMatrix();
   mtRotate.Concat(matrix);
diff --git a/xfa/fxfa/cxfa_ffcheckbutton.cpp b/xfa/fxfa/cxfa_ffcheckbutton.cpp
index 8dc2882..0036978 100644
--- a/xfa/fxfa/cxfa_ffcheckbutton.cpp
+++ b/xfa/fxfa/cxfa_ffcheckbutton.cpp
@@ -89,10 +89,10 @@
   CXFA_FFWidget::PerformLayout();
 
   float fCheckSize = m_pDataAcc->GetCheckButtonSize();
-  CXFA_MarginData marginData = m_pDataAcc->GetMarginData();
+  CXFA_Margin* margin = m_pDataAcc->GetMargin();
   CFX_RectF rtWidget = GetRectWithoutRotate();
-  if (marginData.HasValidNode())
-    XFA_RectWidthoutMargin(rtWidget, marginData);
+  if (margin)
+    XFA_RectWidthoutMargin(rtWidget, margin);
 
   XFA_AttributeEnum iCapPlacement = XFA_AttributeEnum::Unknown;
   float fCapReserve = 0;
@@ -120,18 +120,18 @@
   }
 
   m_rtUI = rtWidget;
-  CXFA_MarginData captionMarginData = captionData.GetMarginData();
+  CXFA_Margin* captionMargin = captionData.GetMargin();
   switch (iCapPlacement) {
     case XFA_AttributeEnum::Left: {
       m_rtCaption.width = fCapReserve;
-      CapLeftRightPlacement(captionMarginData);
+      CapLeftRightPlacement(captionMargin);
       m_rtUI.width -= fCapReserve;
       m_rtUI.left += fCapReserve;
       break;
     }
     case XFA_AttributeEnum::Top: {
       m_rtCaption.height = fCapReserve;
-      XFA_RectWidthoutMargin(m_rtCaption, captionMarginData);
+      XFA_RectWidthoutMargin(m_rtCaption, captionMargin);
       m_rtUI.height -= fCapReserve;
       m_rtUI.top += fCapReserve;
       break;
@@ -139,14 +139,14 @@
     case XFA_AttributeEnum::Right: {
       m_rtCaption.left = m_rtCaption.right() - fCapReserve;
       m_rtCaption.width = fCapReserve;
-      CapLeftRightPlacement(captionMarginData);
+      CapLeftRightPlacement(captionMargin);
       m_rtUI.width -= fCapReserve;
       break;
     }
     case XFA_AttributeEnum::Bottom: {
       m_rtCaption.top = m_rtCaption.bottom() - fCapReserve;
       m_rtCaption.height = fCapReserve;
-      XFA_RectWidthoutMargin(m_rtCaption, captionMarginData);
+      XFA_RectWidthoutMargin(m_rtCaption, captionMargin);
       m_rtUI.height -= fCapReserve;
       break;
     }
@@ -173,9 +173,9 @@
   m_rtCheckBox = m_rtUI;
   CXFA_BorderData borderUIData = m_pDataAcc->GetUIBorderData();
   if (borderUIData.HasValidNode()) {
-    CXFA_MarginData borderMarginData = borderUIData.GetMarginData();
-    if (borderMarginData.HasValidNode())
-      XFA_RectWidthoutMargin(m_rtUI, borderMarginData);
+    CXFA_Margin* borderMargin = borderUIData.GetMargin();
+    if (borderMargin)
+      XFA_RectWidthoutMargin(m_rtUI, borderMargin);
   }
 
   m_rtUI.Normalize();
@@ -188,8 +188,8 @@
 }
 
 void CXFA_FFCheckButton::CapLeftRightPlacement(
-    const CXFA_MarginData& captionMarginData) {
-  XFA_RectWidthoutMargin(m_rtCaption, captionMarginData);
+    const CXFA_Margin* captionMargin) {
+  XFA_RectWidthoutMargin(m_rtCaption, captionMargin);
   if (m_rtCaption.height < 0)
     m_rtCaption.top += m_rtCaption.height;
   if (m_rtCaption.width < 0) {
diff --git a/xfa/fxfa/cxfa_ffcheckbutton.h b/xfa/fxfa/cxfa_ffcheckbutton.h
index 36d97d7..56fd1c9 100644
--- a/xfa/fxfa/cxfa_ffcheckbutton.h
+++ b/xfa/fxfa/cxfa_ffcheckbutton.h
@@ -35,7 +35,7 @@
  private:
   bool CommitData() override;
   bool IsDataChanged() override;
-  void CapLeftRightPlacement(const CXFA_MarginData& captionMarginData);
+  void CapLeftRightPlacement(const CXFA_Margin* captionMargin);
   void AddUIMargin(XFA_AttributeEnum iCapPlacement);
   XFA_CHECKSTATE FWLState2XFAState();
 
diff --git a/xfa/fxfa/cxfa_fffield.cpp b/xfa/fxfa/cxfa_fffield.cpp
index 827d38d..75bd064 100644
--- a/xfa/fxfa/cxfa_fffield.cpp
+++ b/xfa/fxfa/cxfa_fffield.cpp
@@ -23,6 +23,7 @@
 #include "xfa/fxfa/cxfa_fwltheme.h"
 #include "xfa/fxfa/cxfa_textlayout.h"
 #include "xfa/fxfa/parser/cxfa_calculate.h"
+#include "xfa/fxfa/parser/cxfa_margin.h"
 #include "xfa/fxfa/parser/cxfa_node.h"
 #include "xfa/fxfa/parser/cxfa_script.h"
 #include "xfa/fxgraphics/cxfa_gecolor.h"
@@ -168,13 +169,13 @@
 
 void CXFA_FFField::CapPlacement() {
   CFX_RectF rtWidget = GetRectWithoutRotate();
-  CXFA_MarginData marginData = m_pDataAcc->GetMarginData();
-  if (marginData.HasValidNode()) {
+  CXFA_Margin* margin = m_pDataAcc->GetMargin();
+  if (margin) {
     CXFA_LayoutItem* pItem = this;
-    float fLeftInset = marginData.GetLeftInset();
-    float fRightInset = marginData.GetRightInset();
-    float fTopInset = marginData.GetTopInset();
-    float fBottomInset = marginData.GetBottomInset();
+    float fLeftInset = margin->GetLeftInset();
+    float fRightInset = margin->GetRightInset();
+    float fTopInset = margin->GetTopInset();
+    float fBottomInset = margin->GetBottomInset();
     if (!pItem->GetPrev() && !pItem->GetNext()) {
       rtWidget.Deflate(fLeftInset, fTopInset, fRightInset, fBottomInset);
     } else {
@@ -209,7 +210,7 @@
           m_rtCaption.height += pItem->GetRect(false).Height();
           pItem = pItem->GetNext();
         }
-        XFA_RectWidthoutMargin(m_rtCaption, marginData);
+        XFA_RectWidthoutMargin(m_rtCaption, margin);
       }
 
       CXFA_TextLayout* pCapTextLayout = m_pDataAcc->GetCaptionTextLayout();
@@ -231,16 +232,14 @@
   switch (iCapPlacement) {
     case XFA_AttributeEnum::Left: {
       m_rtCaption.width = fCapReserve;
-      CapLeftRightPlacement(captionData.GetMarginData(), rtWidget,
-                            iCapPlacement);
+      CapLeftRightPlacement(captionData.GetMargin(), rtWidget, iCapPlacement);
       m_rtUI.width -= fCapReserve;
       m_rtUI.left += fCapReserve;
       break;
     }
     case XFA_AttributeEnum::Top: {
       m_rtCaption.height = fCapReserve;
-      CapTopBottomPlacement(captionData.GetMarginData(), rtWidget,
-                            iCapPlacement);
+      CapTopBottomPlacement(captionData.GetMargin(), rtWidget, iCapPlacement);
       m_rtUI.top += fCapReserve;
       m_rtUI.height -= fCapReserve;
       break;
@@ -248,16 +247,14 @@
     case XFA_AttributeEnum::Right: {
       m_rtCaption.left = m_rtCaption.right() - fCapReserve;
       m_rtCaption.width = fCapReserve;
-      CapLeftRightPlacement(captionData.GetMarginData(), rtWidget,
-                            iCapPlacement);
+      CapLeftRightPlacement(captionData.GetMargin(), rtWidget, iCapPlacement);
       m_rtUI.width -= fCapReserve;
       break;
     }
     case XFA_AttributeEnum::Bottom: {
       m_rtCaption.top = m_rtCaption.bottom() - fCapReserve;
       m_rtCaption.height = fCapReserve;
-      CapTopBottomPlacement(captionData.GetMarginData(), rtWidget,
-                            iCapPlacement);
+      CapTopBottomPlacement(captionData.GetMargin(), rtWidget, iCapPlacement);
       m_rtUI.height -= fCapReserve;
       break;
     }
@@ -269,20 +266,20 @@
 
   CXFA_BorderData borderUIData = m_pDataAcc->GetUIBorderData();
   if (borderUIData.HasValidNode()) {
-    CXFA_MarginData borderMarginData = borderUIData.GetMarginData();
-    if (borderMarginData.HasValidNode())
-      XFA_RectWidthoutMargin(m_rtUI, borderMarginData);
+    CXFA_Margin* borderMargin = borderUIData.GetMargin();
+    if (borderMargin)
+      XFA_RectWidthoutMargin(m_rtUI, borderMargin);
   }
   m_rtUI.Normalize();
 }
 
-void CXFA_FFField::CapTopBottomPlacement(const CXFA_MarginData& marginData,
+void CXFA_FFField::CapTopBottomPlacement(const CXFA_Margin* margin,
                                          const CFX_RectF& rtWidget,
                                          XFA_AttributeEnum iCapPlacement) {
   CFX_RectF rtUIMargin = m_pDataAcc->GetUIMargin();
   m_rtCaption.left += rtUIMargin.left;
-  if (marginData.HasValidNode()) {
-    XFA_RectWidthoutMargin(m_rtCaption, marginData);
+  if (margin) {
+    XFA_RectWidthoutMargin(m_rtCaption, margin);
     if (m_rtCaption.height < 0)
       m_rtCaption.top += m_rtCaption.height;
   }
@@ -302,14 +299,14 @@
   }
 }
 
-void CXFA_FFField::CapLeftRightPlacement(const CXFA_MarginData& marginData,
+void CXFA_FFField::CapLeftRightPlacement(const CXFA_Margin* margin,
                                          const CFX_RectF& rtWidget,
                                          XFA_AttributeEnum iCapPlacement) {
   CFX_RectF rtUIMargin = m_pDataAcc->GetUIMargin();
   m_rtCaption.top += rtUIMargin.top;
   m_rtCaption.height -= rtUIMargin.top;
-  if (marginData.HasValidNode()) {
-    XFA_RectWidthoutMargin(m_rtCaption, marginData);
+  if (margin) {
+    XFA_RectWidthoutMargin(m_rtCaption, margin);
     if (m_rtCaption.height < 0)
       m_rtCaption.top += m_rtCaption.height;
   }
diff --git a/xfa/fxfa/cxfa_fffield.h b/xfa/fxfa/cxfa_fffield.h
index b566fe9..f605127 100644
--- a/xfa/fxfa/cxfa_fffield.h
+++ b/xfa/fxfa/cxfa_fffield.h
@@ -83,10 +83,10 @@
   void DrawFocus(CXFA_Graphics* pGS, CFX_Matrix* pMatrix);
   void TranslateFWLMessage(CFWL_Message* pMessage);
   void CapPlacement();
-  void CapTopBottomPlacement(const CXFA_MarginData& marginData,
+  void CapTopBottomPlacement(const CXFA_Margin* margin,
                              const CFX_RectF& rtWidget,
                              XFA_AttributeEnum iCapPlacement);
-  void CapLeftRightPlacement(const CXFA_MarginData& marginData,
+  void CapLeftRightPlacement(const CXFA_Margin* margin,
                              const CFX_RectF& rtWidget,
                              XFA_AttributeEnum iCapPlacement);
   void SetEditScrollOffset();
diff --git a/xfa/fxfa/cxfa_ffimage.cpp b/xfa/fxfa/cxfa_ffimage.cpp
index 864d34e..c37234c 100644
--- a/xfa/fxfa/cxfa_ffimage.cpp
+++ b/xfa/fxfa/cxfa_ffimage.cpp
@@ -51,9 +51,9 @@
     return;
 
   CFX_RectF rtImage = GetRectWithoutRotate();
-  CXFA_MarginData marginData = m_pDataAcc->GetMarginData();
-  if (marginData.HasValidNode())
-    XFA_RectWidthoutMargin(rtImage, marginData);
+  CXFA_Margin* margin = m_pDataAcc->GetMargin();
+  if (margin)
+    XFA_RectWidthoutMargin(rtImage, margin);
 
   XFA_AttributeEnum iHorzAlign = XFA_AttributeEnum::Left;
   XFA_AttributeEnum iVertAlign = XFA_AttributeEnum::Top;
diff --git a/xfa/fxfa/cxfa_ffline.cpp b/xfa/fxfa/cxfa_ffline.cpp
index fb2c98a..bbe928f 100644
--- a/xfa/fxfa/cxfa_ffline.cpp
+++ b/xfa/fxfa/cxfa_ffline.cpp
@@ -109,9 +109,9 @@
   mtRotate.Concat(matrix);
 
   CFX_RectF rtLine = GetRectWithoutRotate();
-  CXFA_MarginData marginData = m_pDataAcc->GetMarginData();
-  if (marginData.HasValidNode())
-    XFA_RectWidthoutMargin(rtLine, marginData);
+  CXFA_Margin* margin = m_pDataAcc->GetMargin();
+  if (margin)
+    XFA_RectWidthoutMargin(rtLine, margin);
 
   GetRectFromHand(rtLine, lineData.GetHand(), fLineWidth);
   CXFA_GEPath linePath;
diff --git a/xfa/fxfa/cxfa_ffpushbutton.cpp b/xfa/fxfa/cxfa_ffpushbutton.cpp
index 615c8ae..914b350 100644
--- a/xfa/fxfa/cxfa_ffpushbutton.cpp
+++ b/xfa/fxfa/cxfa_ffpushbutton.cpp
@@ -97,15 +97,15 @@
   CFX_RectF rtWidget = GetRectWithoutRotate();
 
   m_rtUI = rtWidget;
-  CXFA_MarginData marginData = m_pDataAcc->GetMarginData();
-  if (marginData.HasValidNode())
-    XFA_RectWidthoutMargin(rtWidget, marginData);
+  CXFA_Margin* margin = m_pDataAcc->GetMargin();
+  if (margin)
+    XFA_RectWidthoutMargin(rtWidget, margin);
 
   CXFA_CaptionData captionData = m_pDataAcc->GetCaptionData();
   m_rtCaption = rtWidget;
-  CXFA_MarginData captionMarginData = captionData.GetMarginData();
-  if (captionMarginData.HasValidNode())
-    XFA_RectWidthoutMargin(m_rtCaption, captionMarginData);
+  CXFA_Margin* captionMargin = captionData.GetMargin();
+  if (captionMargin)
+    XFA_RectWidthoutMargin(m_rtCaption, captionMargin);
 
   LayoutHighlightCaption();
   SetFWLRect();
diff --git a/xfa/fxfa/cxfa_ffrectangle.cpp b/xfa/fxfa/cxfa_ffrectangle.cpp
index 063a9e9..0804884 100644
--- a/xfa/fxfa/cxfa_ffrectangle.cpp
+++ b/xfa/fxfa/cxfa_ffrectangle.cpp
@@ -24,9 +24,9 @@
     return;
 
   CFX_RectF rect = GetRectWithoutRotate();
-  CXFA_MarginData marginData = m_pDataAcc->GetMarginData();
-  if (marginData.HasValidNode())
-    XFA_RectWidthoutMargin(rect, marginData);
+  CXFA_Margin* margin = m_pDataAcc->GetMargin();
+  if (margin)
+    XFA_RectWidthoutMargin(rect, margin);
 
   CFX_Matrix mtRotate = GetRotateMatrix();
   mtRotate.Concat(matrix);
diff --git a/xfa/fxfa/cxfa_fftext.cpp b/xfa/fxfa/cxfa_fftext.cpp
index 606c22e..46a58c2 100644
--- a/xfa/fxfa/cxfa_fftext.cpp
+++ b/xfa/fxfa/cxfa_fftext.cpp
@@ -17,6 +17,7 @@
 #include "xfa/fxfa/cxfa_pieceline.h"
 #include "xfa/fxfa/cxfa_textlayout.h"
 #include "xfa/fxfa/cxfa_textpiece.h"
+#include "xfa/fxfa/parser/cxfa_margin.h"
 #include "xfa/fxgraphics/cxfa_graphics.h"
 
 CXFA_FFText::CXFA_FFText(CXFA_WidgetAcc* pDataAcc) : CXFA_FFDraw(pDataAcc) {}
@@ -40,21 +41,21 @@
 
   CFX_RenderDevice* pRenderDevice = pGS->GetRenderDevice();
   CFX_RectF rtText = GetRectWithoutRotate();
-  CXFA_MarginData marginData = m_pDataAcc->GetMarginData();
-  if (marginData.HasValidNode()) {
+  CXFA_Margin* margin = m_pDataAcc->GetMargin();
+  if (margin) {
     CXFA_LayoutItem* pItem = this;
     if (!pItem->GetPrev() && !pItem->GetNext()) {
-      XFA_RectWidthoutMargin(rtText, marginData);
+      XFA_RectWidthoutMargin(rtText, margin);
     } else {
       float fTopInset = 0;
       float fBottomInset = 0;
       if (!pItem->GetPrev())
-        fTopInset = marginData.GetTopInset();
+        fTopInset = margin->GetTopInset();
       else if (!pItem->GetNext())
-        fBottomInset = marginData.GetBottomInset();
+        fBottomInset = margin->GetBottomInset();
 
-      rtText.Deflate(marginData.GetLeftInset(), fTopInset,
-                     marginData.GetRightInset(), fBottomInset);
+      rtText.Deflate(margin->GetLeftInset(), fTopInset, margin->GetRightInset(),
+                     fBottomInset);
     }
   }
 
@@ -85,12 +86,12 @@
   pItem = pItem->GetFirst();
   while (pItem) {
     CFX_RectF rtText = pItem->GetRect(false);
-    CXFA_MarginData marginData = m_pDataAcc->GetMarginData();
-    if (marginData.HasValidNode()) {
+    CXFA_Margin* margin = m_pDataAcc->GetMargin();
+    if (margin) {
       if (!pItem->GetPrev())
-        rtText.height -= marginData.GetTopInset();
+        rtText.height -= margin->GetTopInset();
       else if (!pItem->GetNext())
-        rtText.height -= marginData.GetBottomInset();
+        rtText.height -= margin->GetBottomInset();
     }
     pTextLayout->ItemBlocks(rtText, pItem->GetIndex());
     pItem = pItem->GetNext();
diff --git a/xfa/fxfa/cxfa_ffwidget.cpp b/xfa/fxfa/cxfa_ffwidget.cpp
index fdb10a3..9367301 100644
--- a/xfa/fxfa/cxfa_ffwidget.cpp
+++ b/xfa/fxfa/cxfa_ffwidget.cpp
@@ -31,6 +31,7 @@
 #include "xfa/fxfa/cxfa_textlayout.h"
 #include "xfa/fxfa/cxfa_widgetacc.h"
 #include "xfa/fxfa/parser/cxfa_cornerdata.h"
+#include "xfa/fxfa/parser/cxfa_margin.h"
 #include "xfa/fxfa/parser/cxfa_node.h"
 #include "xfa/fxgraphics/cxfa_gecolor.h"
 #include "xfa/fxgraphics/cxfa_gepath.h"
@@ -989,9 +990,9 @@
     return;
 
   CFX_RectF rtBorder = GetRectWithoutRotate();
-  CXFA_MarginData marginData = borderData.GetMarginData();
-  if (marginData.HasValidNode())
-    XFA_RectWidthoutMargin(rtBorder, marginData);
+  CXFA_Margin* margin = borderData.GetMargin();
+  if (margin)
+    XFA_RectWidthoutMargin(rtBorder, margin);
 
   rtBorder.Normalize();
   DrawBorder(pGS, borderData, rtBorder, matrix);
@@ -2016,13 +2017,13 @@
 }
 
 void XFA_RectWidthoutMargin(CFX_RectF& rt,
-                            const CXFA_MarginData& marginData,
+                            const CXFA_Margin* margin,
                             bool bUI) {
-  if (!marginData.HasValidNode())
+  if (!margin)
     return;
 
-  rt.Deflate(marginData.GetLeftInset(), marginData.GetTopInset(),
-             marginData.GetRightInset(), marginData.GetBottomInset());
+  rt.Deflate(margin->GetLeftInset(), margin->GetTopInset(),
+             margin->GetRightInset(), margin->GetBottomInset());
 }
 
 CXFA_FFWidget* XFA_GetWidgetFromLayoutItem(CXFA_LayoutItem* pLayoutItem) {
diff --git a/xfa/fxfa/cxfa_ffwidget.h b/xfa/fxfa/cxfa_ffwidget.h
index a258e02..ac3d985 100644
--- a/xfa/fxfa/cxfa_ffwidget.h
+++ b/xfa/fxfa/cxfa_ffwidget.h
@@ -63,7 +63,7 @@
 FXCODEC_IMAGE_TYPE XFA_GetImageType(const WideString& wsType);
 char* XFA_Base64Encode(const uint8_t* buf, int32_t buf_len);
 void XFA_RectWidthoutMargin(CFX_RectF& rt,
-                            const CXFA_MarginData& marginData,
+                            const CXFA_Margin* margin,
                             bool bUI = false);
 CXFA_FFWidget* XFA_GetWidgetFromLayoutItem(CXFA_LayoutItem* pLayoutItem);
 bool XFA_IsCreateWidget(XFA_Element iType);
diff --git a/xfa/fxfa/cxfa_widgetacc.cpp b/xfa/fxfa/cxfa_widgetacc.cpp
index dcf621f..ec33159 100644
--- a/xfa/fxfa/cxfa_widgetacc.cpp
+++ b/xfa/fxfa/cxfa_widgetacc.cpp
@@ -25,6 +25,7 @@
 #include "xfa/fxfa/parser/cxfa_items.h"
 #include "xfa/fxfa/parser/cxfa_layoutprocessor.h"
 #include "xfa/fxfa/parser/cxfa_localevalue.h"
+#include "xfa/fxfa/parser/cxfa_margin.h"
 #include "xfa/fxfa/parser/cxfa_node.h"
 #include "xfa/fxfa/parser/cxfa_para.h"
 #include "xfa/fxfa/parser/cxfa_script.h"
@@ -725,12 +726,12 @@
     }
   }
 
-  CXFA_MarginData captionMarginData = captionData.GetMarginData();
-  if (captionMarginData.HasValidNode()) {
-    float fLeftInset = captionMarginData.GetLeftInset();
-    float fTopInset = captionMarginData.GetTopInset();
-    float fRightInset = captionMarginData.GetRightInset();
-    float fBottomInset = captionMarginData.GetBottomInset();
+  CXFA_Margin* captionMargin = captionData.GetMargin();
+  if (captionMargin) {
+    float fLeftInset = captionMargin->GetLeftInset();
+    float fTopInset = captionMargin->GetTopInset();
+    float fRightInset = captionMargin->GetRightInset();
+    float fBottomInset = captionMargin->GetBottomInset();
     if (bReserveExit) {
       bVert ? (szCap.width += fLeftInset + fRightInset)
             : (szCap.height += fTopInset + fBottomInset);
@@ -768,10 +769,10 @@
 }
 
 bool CXFA_WidgetAcc::CalculateWidgetAutoSize(CFX_SizeF& size) {
-  CXFA_MarginData marginData = GetMarginData();
-  if (marginData.HasValidNode()) {
-    size.width += marginData.GetLeftInset() + marginData.GetRightInset();
-    size.height += marginData.GetTopInset() + marginData.GetBottomInset();
+  CXFA_Margin* margin = GetMargin();
+  if (margin) {
+    size.width += margin->GetLeftInset() + margin->GetRightInset();
+    size.height += margin->GetTopInset() + margin->GetBottomInset();
   }
 
   CXFA_Para* para = GetPara();
@@ -860,9 +861,9 @@
     }
     CFX_RectF rtUIMargin = GetUIMargin();
     size.width -= rtUIMargin.left + rtUIMargin.width;
-    CXFA_MarginData marginData = GetMarginData();
-    if (marginData.HasValidNode())
-      size.width -= marginData.GetLeftInset() + marginData.GetRightInset();
+    CXFA_Margin* margin = GetMargin();
+    if (margin)
+      size.width -= margin->GetLeftInset() + margin->GetRightInset();
 
     CalculateTextContentSize(size);
     size.height += rtUIMargin.top + rtUIMargin.height;
@@ -1005,9 +1006,9 @@
 }
 
 float CXFA_WidgetAcc::CalculateWidgetAutoWidth(float fWidthCalc) {
-  CXFA_MarginData marginData = GetMarginData();
-  if (marginData.HasValidNode())
-    fWidthCalc += marginData.GetLeftInset() + marginData.GetRightInset();
+  CXFA_Margin* margin = GetMargin();
+  if (margin)
+    fWidthCalc += margin->GetLeftInset() + margin->GetRightInset();
 
   pdfium::Optional<float> min = TryMinWidth();
   if (min)
@@ -1021,16 +1022,16 @@
 }
 
 float CXFA_WidgetAcc::GetWidthWithoutMargin(float fWidthCalc) {
-  CXFA_MarginData marginData = GetMarginData();
-  if (marginData.HasValidNode())
-    fWidthCalc -= marginData.GetLeftInset() + marginData.GetRightInset();
+  CXFA_Margin* margin = GetMargin();
+  if (margin)
+    fWidthCalc -= margin->GetLeftInset() + margin->GetRightInset();
   return fWidthCalc;
 }
 
 float CXFA_WidgetAcc::CalculateWidgetAutoHeight(float fHeightCalc) {
-  CXFA_MarginData marginData = GetMarginData();
-  if (marginData.HasValidNode())
-    fHeightCalc += marginData.GetTopInset() + marginData.GetBottomInset();
+  CXFA_Margin* margin = GetMargin();
+  if (margin)
+    fHeightCalc += margin->GetTopInset() + margin->GetBottomInset();
 
   pdfium::Optional<float> min = TryMinHeight();
   if (min)
@@ -1044,9 +1045,9 @@
 }
 
 float CXFA_WidgetAcc::GetHeightWithoutMargin(float fHeightCalc) {
-  CXFA_MarginData marginData = GetMarginData();
-  if (marginData.HasValidNode())
-    fHeightCalc -= marginData.GetTopInset() + marginData.GetBottomInset();
+  CXFA_Margin* margin = GetMargin();
+  if (margin)
+    fHeightCalc -= margin->GetTopInset() + margin->GetBottomInset();
   return fHeightCalc;
 }
 
@@ -1149,10 +1150,10 @@
   float fTopInset = 0;
   float fBottomInset = 0;
   if (iBlockIndex == 0) {
-    CXFA_MarginData marginData = GetMarginData();
-    if (marginData.HasValidNode()) {
-      fTopInset = marginData.GetTopInset();
-      fBottomInset = marginData.GetBottomInset();
+    CXFA_Margin* margin = GetMargin();
+    if (margin) {
+      fTopInset = margin->GetTopInset();
+      fBottomInset = margin->GetBottomInset();
     }
 
     CFX_RectF rtUIMargin = GetUIMargin();
diff --git a/xfa/fxfa/cxfa_widgetacc.h b/xfa/fxfa/cxfa_widgetacc.h
index e193bd2..35bed64 100644
--- a/xfa/fxfa/cxfa_widgetacc.h
+++ b/xfa/fxfa/cxfa_widgetacc.h
@@ -17,7 +17,6 @@
 #include "xfa/fxfa/parser/cxfa_boxdata.h"
 #include "xfa/fxfa/parser/cxfa_eventdata.h"
 #include "xfa/fxfa/parser/cxfa_imagedata.h"
-#include "xfa/fxfa/parser/cxfa_margindata.h"
 #include "xfa/fxfa/parser/cxfa_widgetdata.h"
 
 class CFGAS_GEFont;
diff --git a/xfa/fxfa/parser/cxfa_boxdata.cpp b/xfa/fxfa/parser/cxfa_boxdata.cpp
index 6e27c71..31fefbf 100644
--- a/xfa/fxfa/parser/cxfa_boxdata.cpp
+++ b/xfa/fxfa/parser/cxfa_boxdata.cpp
@@ -139,10 +139,9 @@
   return CXFA_FillData(pFillNode);
 }
 
-CXFA_MarginData CXFA_BoxData::GetMarginData() const {
-  return CXFA_MarginData(
-      m_pNode ? m_pNode->GetChild<CXFA_Margin>(0, XFA_Element::Margin, false)
-              : nullptr);
+CXFA_Margin* CXFA_BoxData::GetMargin() const {
+  return m_pNode ? m_pNode->GetChild<CXFA_Margin>(0, XFA_Element::Margin, false)
+                 : nullptr;
 }
 
 std::tuple<XFA_AttributeEnum, bool, float> CXFA_BoxData::Get3DStyle() const {
diff --git a/xfa/fxfa/parser/cxfa_boxdata.h b/xfa/fxfa/parser/cxfa_boxdata.h
index 38a7faa..c44065f 100644
--- a/xfa/fxfa/parser/cxfa_boxdata.h
+++ b/xfa/fxfa/parser/cxfa_boxdata.h
@@ -14,8 +14,8 @@
 #include "xfa/fxfa/parser/cxfa_datadata.h"
 #include "xfa/fxfa/parser/cxfa_edgedata.h"
 #include "xfa/fxfa/parser/cxfa_filldata.h"
-#include "xfa/fxfa/parser/cxfa_margindata.h"
 
+class CXFA_Margin;
 class CXFA_Node;
 
 class CXFA_BoxData : public CXFA_DataData {
@@ -32,7 +32,7 @@
   int32_t CountEdges() const;
   CXFA_EdgeData GetEdgeData(int32_t nIndex) const;
   CXFA_FillData GetFillData(bool bModified) const;
-  CXFA_MarginData GetMarginData() const;
+  CXFA_Margin* GetMargin() const;
 
   std::vector<CXFA_StrokeData> GetStrokes() const;
 
diff --git a/xfa/fxfa/parser/cxfa_captiondata.cpp b/xfa/fxfa/parser/cxfa_captiondata.cpp
index 59dbb2b..276d10c 100644
--- a/xfa/fxfa/parser/cxfa_captiondata.cpp
+++ b/xfa/fxfa/parser/cxfa_captiondata.cpp
@@ -39,10 +39,9 @@
       .ToUnit(XFA_Unit::Pt);
 }
 
-CXFA_MarginData CXFA_CaptionData::GetMarginData() const {
-  return CXFA_MarginData(
-      m_pNode ? m_pNode->GetChild<CXFA_Margin>(0, XFA_Element::Margin, false)
-              : nullptr);
+CXFA_Margin* CXFA_CaptionData::GetMargin() const {
+  return m_pNode ? m_pNode->GetChild<CXFA_Margin>(0, XFA_Element::Margin, false)
+                 : nullptr;
 }
 
 CXFA_FontData CXFA_CaptionData::GetFontData() const {
diff --git a/xfa/fxfa/parser/cxfa_captiondata.h b/xfa/fxfa/parser/cxfa_captiondata.h
index 119c34e..4b526b6 100644
--- a/xfa/fxfa/parser/cxfa_captiondata.h
+++ b/xfa/fxfa/parser/cxfa_captiondata.h
@@ -9,8 +9,8 @@
 
 #include "xfa/fxfa/parser/cxfa_datadata.h"
 #include "xfa/fxfa/parser/cxfa_fontdata.h"
-#include "xfa/fxfa/parser/cxfa_margindata.h"
 
+class CXFA_Margin;
 class CXFA_Node;
 class CXFA_Value;
 
@@ -22,7 +22,7 @@
   bool IsHidden() const;
   XFA_AttributeEnum GetPlacementType() const;
   float GetReserve() const;
-  CXFA_MarginData GetMarginData() const;
+  CXFA_Margin* GetMargin() const;
   CXFA_FontData GetFontData() const;
   CXFA_Value* GetValue() const;
 };
diff --git a/xfa/fxfa/parser/cxfa_datadata.cpp b/xfa/fxfa/parser/cxfa_datadata.cpp
index b2c8119..76a4651 100644
--- a/xfa/fxfa/parser/cxfa_datadata.cpp
+++ b/xfa/fxfa/parser/cxfa_datadata.cpp
@@ -71,9 +71,5 @@
 
 pdfium::Optional<float> CXFA_DataData::TryMeasureAsFloat(
     XFA_Attribute attr) const {
-  pdfium::Optional<CXFA_Measurement> measure =
-      m_pNode->JSObject()->TryMeasure(attr, false);
-  if (measure)
-    return {measure->ToUnit(XFA_Unit::Pt)};
-  return {};
+  return m_pNode->JSObject()->TryMeasureAsFloat(attr);
 }
diff --git a/xfa/fxfa/parser/cxfa_margin.cpp b/xfa/fxfa/parser/cxfa_margin.cpp
index 6a50d13..6dd4d39 100644
--- a/xfa/fxfa/parser/cxfa_margin.cpp
+++ b/xfa/fxfa/parser/cxfa_margin.cpp
@@ -39,3 +39,35 @@
                 pdfium::MakeUnique<CJX_Margin>(this)) {}
 
 CXFA_Margin::~CXFA_Margin() {}
+
+float CXFA_Margin::GetLeftInset() const {
+  return TryLeftInset().value_or(0);
+}
+
+float CXFA_Margin::GetTopInset() const {
+  return TryTopInset().value_or(0);
+}
+
+float CXFA_Margin::GetRightInset() const {
+  return TryRightInset().value_or(0);
+}
+
+float CXFA_Margin::GetBottomInset() const {
+  return TryBottomInset().value_or(0);
+}
+
+pdfium::Optional<float> CXFA_Margin::TryLeftInset() const {
+  return JSObject()->TryMeasureAsFloat(XFA_Attribute::LeftInset);
+}
+
+pdfium::Optional<float> CXFA_Margin::TryTopInset() const {
+  return JSObject()->TryMeasureAsFloat(XFA_Attribute::TopInset);
+}
+
+pdfium::Optional<float> CXFA_Margin::TryRightInset() const {
+  return JSObject()->TryMeasureAsFloat(XFA_Attribute::RightInset);
+}
+
+pdfium::Optional<float> CXFA_Margin::TryBottomInset() const {
+  return JSObject()->TryMeasureAsFloat(XFA_Attribute::BottomInset);
+}
diff --git a/xfa/fxfa/parser/cxfa_margin.h b/xfa/fxfa/parser/cxfa_margin.h
index 3ac7657..621704a 100644
--- a/xfa/fxfa/parser/cxfa_margin.h
+++ b/xfa/fxfa/parser/cxfa_margin.h
@@ -13,6 +13,16 @@
  public:
   CXFA_Margin(CXFA_Document* doc, XFA_PacketType packet);
   ~CXFA_Margin() override;
+
+  float GetLeftInset() const;
+  float GetTopInset() const;
+  float GetRightInset() const;
+  float GetBottomInset() const;
+
+  pdfium::Optional<float> TryLeftInset() const;
+  pdfium::Optional<float> TryTopInset() const;
+  pdfium::Optional<float> TryRightInset() const;
+  pdfium::Optional<float> TryBottomInset() const;
 };
 
 #endif  // XFA_FXFA_PARSER_CXFA_MARGIN_H_
diff --git a/xfa/fxfa/parser/cxfa_margindata.cpp b/xfa/fxfa/parser/cxfa_margindata.cpp
deleted file mode 100644
index c8baf2d..0000000
--- a/xfa/fxfa/parser/cxfa_margindata.cpp
+++ /dev/null
@@ -1,41 +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
-
-#include "xfa/fxfa/parser/cxfa_margindata.h"
-
-CXFA_MarginData::CXFA_MarginData(CXFA_Node* pNode) : CXFA_DataData(pNode) {}
-
-float CXFA_MarginData::GetLeftInset() const {
-  return TryLeftInset().value_or(0);
-}
-
-float CXFA_MarginData::GetTopInset() const {
-  return TryTopInset().value_or(0);
-}
-
-float CXFA_MarginData::GetRightInset() const {
-  return TryRightInset().value_or(0);
-}
-
-float CXFA_MarginData::GetBottomInset() const {
-  return TryBottomInset().value_or(0);
-}
-
-pdfium::Optional<float> CXFA_MarginData::TryLeftInset() const {
-  return TryMeasureAsFloat(XFA_Attribute::LeftInset);
-}
-
-pdfium::Optional<float> CXFA_MarginData::TryTopInset() const {
-  return TryMeasureAsFloat(XFA_Attribute::TopInset);
-}
-
-pdfium::Optional<float> CXFA_MarginData::TryRightInset() const {
-  return TryMeasureAsFloat(XFA_Attribute::RightInset);
-}
-
-pdfium::Optional<float> CXFA_MarginData::TryBottomInset() const {
-  return TryMeasureAsFloat(XFA_Attribute::BottomInset);
-}
diff --git a/xfa/fxfa/parser/cxfa_margindata.h b/xfa/fxfa/parser/cxfa_margindata.h
deleted file mode 100644
index 069aa7c..0000000
--- a/xfa/fxfa/parser/cxfa_margindata.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_MARGINDATA_H_
-#define XFA_FXFA_PARSER_CXFA_MARGINDATA_H_
-
-#include "core/fxcrt/fx_system.h"
-#include "xfa/fxfa/parser/cxfa_datadata.h"
-
-class CXFA_Node;
-
-class CXFA_MarginData : public CXFA_DataData {
- public:
-  explicit CXFA_MarginData(CXFA_Node* pNode);
-
-  float GetLeftInset() const;
-  float GetTopInset() const;
-  float GetRightInset() const;
-  float GetBottomInset() const;
-
-  pdfium::Optional<float> TryLeftInset() const;
-  pdfium::Optional<float> TryTopInset() const;
-  pdfium::Optional<float> TryRightInset() const;
-  pdfium::Optional<float> TryBottomInset() const;
-};
-
-#endif  // XFA_FXFA_PARSER_CXFA_MARGINDATA_H_
diff --git a/xfa/fxfa/parser/cxfa_widgetdata.cpp b/xfa/fxfa/parser/cxfa_widgetdata.cpp
index ba10f24..0f31fba 100644
--- a/xfa/fxfa/parser/cxfa_widgetdata.cpp
+++ b/xfa/fxfa/parser/cxfa_widgetdata.cpp
@@ -275,9 +275,9 @@
       0, XFA_Element::Font, bModified));
 }
 
-CXFA_MarginData CXFA_WidgetData::GetMarginData() {
-  return CXFA_MarginData(m_pNode->JSObject()->GetProperty<CXFA_Margin>(
-      0, XFA_Element::Margin, false));
+CXFA_Margin* CXFA_WidgetData::GetMargin() {
+  return m_pNode->JSObject()->GetProperty<CXFA_Margin>(0, XFA_Element::Margin,
+                                                       false);
 }
 
 CXFA_Para* CXFA_WidgetData::GetPara() {
@@ -373,12 +373,13 @@
 
 CFX_RectF CXFA_WidgetData::GetUIMargin() {
   CXFA_Node* pUIChild = GetUIChild();
-  CXFA_MarginData mgUI =
-      CXFA_MarginData(pUIChild ? pUIChild->JSObject()->GetProperty<CXFA_Margin>(
-                                     0, XFA_Element::Margin, false)
-                               : nullptr);
+  CXFA_Margin* mgUI = nullptr;
+  if (pUIChild) {
+    mgUI = pUIChild->JSObject()->GetProperty<CXFA_Margin>(
+        0, XFA_Element::Margin, false);
+  }
 
-  if (!mgUI.HasValidNode())
+  if (!mgUI)
     return CFX_RectF();
 
   CXFA_BorderData borderData = GetUIBorderData();
@@ -387,10 +388,10 @@
     return CFX_RectF();
   }
 
-  pdfium::Optional<float> left = mgUI.TryLeftInset();
-  pdfium::Optional<float> top = mgUI.TryTopInset();
-  pdfium::Optional<float> right = mgUI.TryRightInset();
-  pdfium::Optional<float> bottom = mgUI.TryBottomInset();
+  pdfium::Optional<float> left = mgUI->TryLeftInset();
+  pdfium::Optional<float> top = mgUI->TryTopInset();
+  pdfium::Optional<float> right = mgUI->TryRightInset();
+  pdfium::Optional<float> bottom = mgUI->TryBottomInset();
   if (borderData.HasValidNode()) {
     bool bVisible = false;
     float fThickness = 0;
diff --git a/xfa/fxfa/parser/cxfa_widgetdata.h b/xfa/fxfa/parser/cxfa_widgetdata.h
index e7016bd..e2dbfbf 100644
--- a/xfa/fxfa/parser/cxfa_widgetdata.h
+++ b/xfa/fxfa/parser/cxfa_widgetdata.h
@@ -19,7 +19,6 @@
 #include "xfa/fxfa/parser/cxfa_captiondata.h"
 #include "xfa/fxfa/parser/cxfa_datadata.h"
 #include "xfa/fxfa/parser/cxfa_fontdata.h"
-#include "xfa/fxfa/parser/cxfa_margindata.h"
 
 enum XFA_CHECKSTATE {
   XFA_CHECKSTATE_On = 0,
@@ -35,6 +34,7 @@
 };
 
 class CXFA_Calculate;
+class CXFA_Margin;
 class CXFA_Node;
 class CXFA_Para;
 class CXFA_Validate;
@@ -61,7 +61,7 @@
   CXFA_BorderData GetBorderData(bool bModified);
   CXFA_CaptionData GetCaptionData();
   CXFA_FontData GetFontData(bool bModified);
-  CXFA_MarginData GetMarginData();
+  CXFA_Margin* GetMargin();
   CXFA_Para* GetPara();
   CXFA_Value* GetDefaultValue();
   CXFA_Value* GetFormValue();