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();
