Add another interface to prevent fwl -> fxfa inclusion.

- Also add a comment for a class declaration that had me scratching
my head for a few moments when I read it.

Change-Id: If6ed1ae3c5ceadea36b0b1b6cc10ea7c694e489f
Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/55130
Reviewed-by: Lei Zhang <thestig@chromium.org>
Commit-Queue: Tom Sepez <tsepez@chromium.org>
diff --git a/xfa/fwl/cfwl_edit.cpp b/xfa/fwl/cfwl_edit.cpp
index fcd4159..7d09f71 100644
--- a/xfa/fwl/cfwl_edit.cpp
+++ b/xfa/fwl/cfwl_edit.cpp
@@ -907,17 +907,12 @@
     pRect->Offset(rtOuter.left, rtOuter.top);
   }
 
-  CXFA_FFWidget* pXFAWidget = pOuter->GetFFWidget();
+  CFWL_Widget::AdapterIface* pXFAWidget = pOuter->GetFFWidget();
   if (!pXFAWidget)
     return;
 
-  IXFA_DocEnvironment* pDocEnvironment =
-      pXFAWidget->GetDoc()->GetDocEnvironment();
-  if (!pDocEnvironment)
-    return;
-
   CFX_RectF rt = pXFAWidget->GetRotateMatrix().TransformRect(*pRect);
-  pDocEnvironment->DisplayCaret(pXFAWidget, true, &rt);
+  pXFAWidget->DisplayCaret(true, &rt);
 }
 
 void CFWL_Edit::HideCaret(CFX_RectF* pRect) {
@@ -931,16 +926,11 @@
   while (pOuter->GetOuter())
     pOuter = pOuter->GetOuter();
 
-  CXFA_FFWidget* pXFAWidget = pOuter->GetFFWidget();
+  CFWL_Widget::AdapterIface* pXFAWidget = pOuter->GetFFWidget();
   if (!pXFAWidget)
     return;
 
-  IXFA_DocEnvironment* pDocEnvironment =
-      pXFAWidget->GetDoc()->GetDocEnvironment();
-  if (!pDocEnvironment)
-    return;
-
-  pDocEnvironment->DisplayCaret(pXFAWidget, false, pRect);
+  pXFAWidget->DisplayCaret(false, pRect);
 }
 
 bool CFWL_Edit::ValidateNumberChar(wchar_t cNum) {
diff --git a/xfa/fwl/cfwl_widget.h b/xfa/fwl/cfwl_widget.h
index 0fe8e4c..3c15c69 100644
--- a/xfa/fwl/cfwl_widget.h
+++ b/xfa/fwl/cfwl_widget.h
@@ -45,11 +45,18 @@
 class CFWL_MessageKey;
 class CFWL_Widget;
 class CFWL_WidgetMgr;
-class CXFA_FFWidget;
 class IFWL_ThemeProvider;
 
+// NOTE: CFWL_Widget serves as its own delegate until replaced at runtime.
 class CFWL_Widget : public IFWL_WidgetDelegate {
  public:
+  class AdapterIface {
+   public:
+    virtual ~AdapterIface() {}
+    virtual CFX_Matrix GetRotateMatrix() = 0;
+    virtual void DisplayCaret(bool bVisible, const CFX_RectF* pRtAnchor) = 0;
+  };
+
   ~CFWL_Widget() override;
 
   virtual FWL_Type GetClassID() const = 0;
@@ -114,8 +121,8 @@
   uint32_t GetEventKey() const { return m_nEventKey; }
   void SetEventKey(uint32_t key) { m_nEventKey = key; }
 
-  CXFA_FFWidget* GetFFWidget() const { return m_pFFWidget; }
-  void SetFFWidget(CXFA_FFWidget* pItem) { m_pFFWidget = pItem; }
+  AdapterIface* GetFFWidget() const { return m_pFFWidget; }
+  void SetFFWidget(AdapterIface* pItem) { m_pFFWidget = pItem; }
 
   void RepaintRect(const CFX_RectF& pRect);
 
@@ -166,7 +173,7 @@
   bool IsParent(CFWL_Widget* pParent);
 
   uint32_t m_nEventKey = 0;
-  CXFA_FFWidget* m_pFFWidget = nullptr;
+  AdapterIface* m_pFFWidget = nullptr;
   UnownedPtr<IFWL_WidgetDelegate> m_pDelegate;
 };
 
diff --git a/xfa/fxfa/cxfa_ffwidget.cpp b/xfa/fxfa/cxfa_ffwidget.cpp
index d5c1367..acd74d5 100644
--- a/xfa/fxfa/cxfa_ffwidget.cpp
+++ b/xfa/fxfa/cxfa_ffwidget.cpp
@@ -549,6 +549,14 @@
   return mt;
 }
 
+void CXFA_FFWidget::DisplayCaret(bool bVisible, const CFX_RectF* pRtAnchor) {
+  IXFA_DocEnvironment* pDocEnvironment = GetDoc()->GetDocEnvironment();
+  if (!pDocEnvironment)
+    return;
+
+  pDocEnvironment->DisplayCaret(this, bVisible, pRtAnchor);
+}
+
 bool CXFA_FFWidget::IsLayoutRectEmpty() {
   CFX_RectF rtLayout = GetRectWithoutRotate();
   return rtLayout.width < 0.1f && rtLayout.height < 0.1f;
diff --git a/xfa/fxfa/cxfa_ffwidget.h b/xfa/fxfa/cxfa_ffwidget.h
index 1327c54..58ebb66 100644
--- a/xfa/fxfa/cxfa_ffwidget.h
+++ b/xfa/fxfa/cxfa_ffwidget.h
@@ -14,6 +14,7 @@
 #include "core/fxge/cfx_graphstatedata.h"
 #include "xfa/fwl/cfwl_app.h"
 #include "xfa/fwl/cfwl_messagemouse.h"
+#include "xfa/fwl/cfwl_widget.h"
 #include "xfa/fxfa/fxfa.h"
 #include "xfa/fxfa/layout/cxfa_contentlayoutitem.h"
 
@@ -61,13 +62,17 @@
   int32_t m_iRefCount;
 };
 
-class CXFA_FFWidget {
+class CXFA_FFWidget : public CFWL_Widget::AdapterIface {
  public:
   enum FocusOption { kDoNotDrawFocus = 0, kDrawFocus };
   enum HighlightOption { kNoHighlight = 0, kHighlight };
 
   explicit CXFA_FFWidget(CXFA_Node* pNode);
-  virtual ~CXFA_FFWidget();
+  ~CXFA_FFWidget() override;
+
+  // CFWL_Widget::AdapterIface:
+  CFX_Matrix GetRotateMatrix() override;
+  void DisplayCaret(bool bVisible, const CFX_RectF* pRtAnchor) override;
 
   virtual CFX_RectF GetBBox(FocusOption focus);
   virtual void RenderWidget(CXFA_Graphics* pGS,
@@ -141,7 +146,6 @@
     return GetLayoutItem()->TestStatusBits(XFA_WidgetStatus_Focused);
   }
   CFX_PointF Rotate2Normal(const CFX_PointF& point);
-  CFX_Matrix GetRotateMatrix();
   bool IsLayoutRectEmpty();
   CXFA_LayoutItem* GetParent();
   bool IsAncestorOf(CXFA_FFWidget* pWidget);
diff --git a/xfa/fxfa/cxfa_fwladapterwidgetmgr.cpp b/xfa/fxfa/cxfa_fwladapterwidgetmgr.cpp
index 3e25c73..ff8534d 100644
--- a/xfa/fxfa/cxfa_fwladapterwidgetmgr.cpp
+++ b/xfa/fxfa/cxfa_fwladapterwidgetmgr.cpp
@@ -17,7 +17,7 @@
   if (!pWidget)
     return;
 
-  CXFA_FFWidget* pFFWidget = pWidget->GetFFWidget();
+  auto* pFFWidget = static_cast<CXFA_FFWidget*>(pWidget->GetFFWidget());
   if (!pFFWidget)
     return;
 
@@ -29,7 +29,7 @@
                                            float fMaxHeight,
                                            const CFX_RectF& rtAnchor,
                                            CFX_RectF* pPopupRect) {
-  CXFA_FFWidget* pFFWidget = pWidget->GetFFWidget();
+  auto* pFFWidget = static_cast<CXFA_FFWidget*>(pWidget->GetFFWidget());
   CFX_RectF rtRotateAnchor =
       pFFWidget->GetRotateMatrix().TransformRect(rtAnchor);
   pFFWidget->GetDoc()->GetDocEnvironment()->GetPopupPos(
diff --git a/xfa/fxfa/cxfa_fwltheme.cpp b/xfa/fxfa/cxfa_fwltheme.cpp
index 459e44d..0e87554 100644
--- a/xfa/fxfa/cxfa_fwltheme.cpp
+++ b/xfa/fxfa/cxfa_fwltheme.cpp
@@ -42,7 +42,7 @@
   CFWL_Widget* pOuter = pWidget;
   while (pOuter && pOuter->GetOuter())
     pOuter = pOuter->GetOuter();
-  return pOuter ? pOuter->GetFFWidget() : nullptr;
+  return pOuter ? static_cast<CXFA_FFWidget*>(pOuter->GetFFWidget()) : nullptr;
 }
 
 CXFA_FWLTheme::CXFA_FWLTheme(CXFA_FFApp* pApp)