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;