Nest CXFA_LoaderContext inside CXFA_TextLayout

Ownership shows that the CXFA_TextLayout is responsible for tracing
its LoaderContext's node member.

Bug: pdfium:1563
Change-Id: I4ff3e9a1da7f242712c23d009644f35434e2e05c
Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/73450
Commit-Queue: Tom Sepez <tsepez@chromium.org>
Reviewed-by: Lei Zhang <thestig@chromium.org>
diff --git a/xfa/fxfa/BUILD.gn b/xfa/fxfa/BUILD.gn
index 53a8dc0..d4d4d7b 100644
--- a/xfa/fxfa/BUILD.gn
+++ b/xfa/fxfa/BUILD.gn
@@ -71,8 +71,6 @@
     "cxfa_fwltheme.h",
     "cxfa_imagerenderer.cpp",
     "cxfa_imagerenderer.h",
-    "cxfa_loadercontext.cpp",
-    "cxfa_loadercontext.h",
     "cxfa_pieceline.cpp",
     "cxfa_pieceline.h",
     "cxfa_readynodeiterator.cpp",
diff --git a/xfa/fxfa/cxfa_loadercontext.cpp b/xfa/fxfa/cxfa_loadercontext.cpp
deleted file mode 100644
index 5f66050..0000000
--- a/xfa/fxfa/cxfa_loadercontext.cpp
+++ /dev/null
@@ -1,13 +0,0 @@
-// Copyright 2017 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/cxfa_loadercontext.h"
-
-#include "core/fxcrt/css/cfx_csscomputedstyle.h"
-
-CXFA_LoaderContext::CXFA_LoaderContext() = default;
-
-CXFA_LoaderContext::~CXFA_LoaderContext() = default;
diff --git a/xfa/fxfa/cxfa_loadercontext.h b/xfa/fxfa/cxfa_loadercontext.h
deleted file mode 100644
index ddcb909..0000000
--- a/xfa/fxfa/cxfa_loadercontext.h
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2017 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_CXFA_LOADERCONTEXT_H_
-#define XFA_FXFA_CXFA_LOADERCONTEXT_H_
-
-#include <vector>
-
-#include "core/fxcrt/fx_system.h"
-#include "core/fxcrt/retain_ptr.h"
-#include "core/fxcrt/unowned_ptr.h"
-
-class CFX_CSSComputedStyle;
-class CFX_XMLNode;
-class CXFA_Node;
-
-struct CXFA_BlockHeight {
-  size_t szBlockIndex;
-  float fHeight;
-};
-
-struct CXFA_LoaderContext {
-  CXFA_LoaderContext();
-  ~CXFA_LoaderContext();
-
-  bool bSaveLineHeight = false;
-  bool bFilterSpace = false;
-  float fWidth = 0;
-  float fHeight = 0;
-  float fLastPos = 0;
-  float fStartLineOffset = 0;
-  int32_t iChar = 0;
-  // TODO(thestig): Make this size_t?
-  int32_t iTotalLines = -1;
-  UnownedPtr<const CFX_XMLNode> pXMLNode;
-  UnownedPtr<CXFA_Node> pNode;
-  RetainPtr<CFX_CSSComputedStyle> pParentStyle;
-  std::vector<float> lineHeights;
-  std::vector<CXFA_BlockHeight> blockHeights;
-};
-
-#endif  // XFA_FXFA_CXFA_LOADERCONTEXT_H_
diff --git a/xfa/fxfa/cxfa_textlayout.cpp b/xfa/fxfa/cxfa_textlayout.cpp
index 23b5083..95eddf7 100644
--- a/xfa/fxfa/cxfa_textlayout.cpp
+++ b/xfa/fxfa/cxfa_textlayout.cpp
@@ -27,7 +27,6 @@
 #include "xfa/fgas/layout/cfx_rtfbreak.h"
 #include "xfa/fgas/layout/cfx_textuserdata.h"
 #include "xfa/fxfa/cxfa_ffdoc.h"
-#include "xfa/fxfa/cxfa_loadercontext.h"
 #include "xfa/fxfa/cxfa_pieceline.h"
 #include "xfa/fxfa/cxfa_textparsecontext.h"
 #include "xfa/fxfa/cxfa_textpiece.h"
@@ -67,6 +66,14 @@
 
 }  // namespace
 
+CXFA_TextLayout::LoaderContext::LoaderContext() = default;
+
+CXFA_TextLayout::LoaderContext::~LoaderContext() = default;
+
+void CXFA_TextLayout::LoaderContext::Trace(cppgc::Visitor* visitor) const {
+  visitor->Trace(pNode);
+}
+
 CXFA_TextLayout::CXFA_TextLayout(CXFA_FFDoc* doc,
                                  CXFA_TextProvider* pTextProvider)
     : m_pDoc(doc), m_pTextProvider(pTextProvider) {
@@ -82,6 +89,8 @@
   visitor->Trace(m_pDoc);
   visitor->Trace(m_pTextProvider);
   visitor->Trace(m_pTextDataNode);
+  if (m_pLoader)
+    m_pLoader->Trace(visitor);
 }
 
 void CXFA_TextLayout::Unload() {
@@ -299,7 +308,7 @@
 
 float CXFA_TextLayout::StartLayout(float fWidth) {
   if (!m_pLoader)
-    m_pLoader = std::make_unique<CXFA_LoaderContext>();
+    m_pLoader = std::make_unique<LoaderContext>();
 
   if (fWidth < 0 ||
       (m_pLoader->fWidth > -1 && fabs(fWidth - m_pLoader->fWidth) > 0)) {
diff --git a/xfa/fxfa/cxfa_textlayout.h b/xfa/fxfa/cxfa_textlayout.h
index b8cdd78..cb285de 100644
--- a/xfa/fxfa/cxfa_textlayout.h
+++ b/xfa/fxfa/cxfa_textlayout.h
@@ -13,6 +13,8 @@
 #include "core/fxcrt/css/cfx_css.h"
 #include "core/fxcrt/fx_coordinates.h"
 #include "core/fxcrt/fx_string.h"
+#include "core/fxcrt/retain_ptr.h"
+#include "core/fxcrt/unowned_ptr.h"
 #include "fxjs/gc/heap.h"
 #include "v8/include/cppgc/garbage-collected.h"
 #include "v8/include/cppgc/member.h"
@@ -32,7 +34,6 @@
 class CXFA_TextProvider;
 class CXFA_TextTabstopsContext;
 class TextCharPos;
-struct CXFA_LoaderContext;
 struct FX_RTFTEXTOBJ;
 
 class CXFA_TextLayout final : public cppgc::GarbageCollected<CXFA_TextLayout> {
@@ -73,6 +74,33 @@
     size_t szLength;
   };
 
+  struct BlockHeight {
+    size_t szBlockIndex;
+    float fHeight;
+  };
+
+  struct LoaderContext {
+    LoaderContext();
+    ~LoaderContext();
+
+    void Trace(cppgc::Visitor* visitor) const;
+
+    bool bSaveLineHeight = false;
+    bool bFilterSpace = false;
+    float fWidth = 0;
+    float fHeight = 0;
+    float fLastPos = 0;
+    float fStartLineOffset = 0;
+    int32_t iChar = 0;
+    // TODO(thestig): Make this size_t?
+    int32_t iTotalLines = -1;
+    UnownedPtr<const CFX_XMLNode> pXMLNode;
+    RetainPtr<CFX_CSSComputedStyle> pParentStyle;
+    cppgc::Member<CXFA_Node> pNode;
+    std::vector<float> lineHeights;
+    std::vector<BlockHeight> blockHeights;
+  };
+
   CXFA_TextLayout(CXFA_FFDoc* doc, CXFA_TextProvider* pTextProvider);
 
   void GetTextDataNode();
@@ -136,7 +164,7 @@
   cppgc::Member<CXFA_TextProvider> const m_pTextProvider;
   cppgc::Member<CXFA_Node> m_pTextDataNode;
   std::unique_ptr<CFX_RTFBreak> m_pBreak;
-  std::unique_ptr<CXFA_LoaderContext> m_pLoader;
+  std::unique_ptr<LoaderContext> m_pLoader;
   CXFA_TextParser m_textParser;
   std::vector<std::unique_ptr<CXFA_PieceLine>> m_pieceLines;
   std::unique_ptr<CXFA_TextTabstopsContext> m_pTabstopContext;