Separate CXFA_FFWidget from CXFA_ContentLayoutItem.
Layering. Precursor to ref-counting layout items so that dozens
of FF classes need not become refcounted.
Change-Id: I806c0905111cb4c3cd2ce5d7f5afa7d8e6b72235
Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/52970
Commit-Queue: Tom Sepez <tsepez@chromium.org>
Reviewed-by: Lei Zhang <thestig@chromium.org>
diff --git a/fpdfsdk/cpdfsdk_xfawidget.cpp b/fpdfsdk/cpdfsdk_xfawidget.cpp
index fc88f9c..ef6e127 100644
--- a/fpdfsdk/cpdfsdk_xfawidget.cpp
+++ b/fpdfsdk/cpdfsdk_xfawidget.cpp
@@ -31,7 +31,7 @@
}
CFX_FloatRect CPDFSDK_XFAWidget::GetRect() const {
- CFX_RectF rcBBox = GetXFAWidget()->GetRect(false);
+ CFX_RectF rcBBox = GetXFAWidget()->GetLayoutItem()->GetRect(false);
return CFX_FloatRect(rcBBox.left, rcBBox.top, rcBBox.left + rcBBox.width,
rcBBox.top + rcBBox.height);
}
diff --git a/xfa/fxfa/cxfa_ffdatetimeedit.cpp b/xfa/fxfa/cxfa_ffdatetimeedit.cpp
index eae163b..32ab1ab 100644
--- a/xfa/fxfa/cxfa_ffdatetimeedit.cpp
+++ b/xfa/fxfa/cxfa_ffdatetimeedit.cpp
@@ -172,7 +172,7 @@
}
bool CXFA_FFDateTimeEdit::IsDataChanged() {
- if (m_dwStatus & XFA_WidgetStatus_TextEditValueChanged)
+ if (GetLayoutItem()->m_dwStatus & XFA_WidgetStatus_TextEditValueChanged)
return true;
WideString wsText = GetPickerWidget()->GetEditText();
diff --git a/xfa/fxfa/cxfa_ffdocview.cpp b/xfa/fxfa/cxfa_ffdocview.cpp
index ca36cbd..587bcfa 100644
--- a/xfa/fxfa/cxfa_ffdocview.cpp
+++ b/xfa/fxfa/cxfa_ffdocview.cpp
@@ -249,7 +249,7 @@
}
CXFA_FFWidget* CXFA_FFDocView::GetWidgetForNode(CXFA_Node* node) {
- return ToFFWidget(ToContentLayoutItem(GetXFALayout()->GetLayoutItem(node)));
+ return GetFFWidget(ToContentLayoutItem(GetXFALayout()->GetLayoutItem(node)));
}
CXFA_FFWidgetHandler* CXFA_FFDocView::GetWidgetHandler() {
diff --git a/xfa/fxfa/cxfa_fffield.cpp b/xfa/fxfa/cxfa_fffield.cpp
index dfd8a69..7675de2 100644
--- a/xfa/fxfa/cxfa_fffield.cpp
+++ b/xfa/fxfa/cxfa_fffield.cpp
@@ -35,8 +35,8 @@
namespace {
-CXFA_FFField* ToField(CXFA_LayoutItem* widget) {
- return static_cast<CXFA_FFField*>(widget);
+CXFA_FFField* ToField(CXFA_ContentLayoutItem* pItem) {
+ return pItem ? static_cast<CXFA_FFField*>(pItem->GetFFWidget()) : nullptr;
}
} // namespace
@@ -103,7 +103,7 @@
}
void CXFA_FFField::DrawFocus(CXFA_Graphics* pGS, CFX_Matrix* pMatrix) {
- if (!(m_dwStatus & XFA_WidgetStatus_Focused))
+ if (!(GetLayoutItem()->m_dwStatus & XFA_WidgetStatus_Focused))
return;
pGS->SetStrokeColor(CXFA_GEColor(0xFF000000));
@@ -142,13 +142,13 @@
}
float fScrollOffset = 0;
- CXFA_FFField* pPrev = ToField(GetPrev());
+ CXFA_FFField* pPrev = ToField(GetLayoutItem()->GetPrev());
if (pPrev)
fScrollOffset = -(m_pNode->GetUIMargin().top);
while (pPrev) {
fScrollOffset += pPrev->m_rtUI.height;
- pPrev = ToField(pPrev->GetPrev());
+ pPrev = ToField(pPrev->GetLayoutItem()->GetPrev());
}
static_cast<CFWL_Edit*>(m_pNormalWidget.get())
->SetScrollOffset(fScrollOffset);
@@ -169,7 +169,7 @@
CFX_RectF rtWidget = GetRectWithoutRotate();
CXFA_Margin* margin = m_pNode->GetMarginIfExists();
if (margin) {
- CXFA_ContentLayoutItem* pItem = this;
+ CXFA_ContentLayoutItem* pItem = GetLayoutItem();
float fLeftInset = margin->GetLeftInset();
float fRightInset = margin->GetRightInset();
float fTopInset = margin->GetTopInset();
@@ -191,8 +191,10 @@
CXFA_Caption* caption = m_pNode->GetCaptionIfExists();
if (caption && !caption->IsHidden()) {
iCapPlacement = caption->GetPlacementType();
- if ((iCapPlacement == XFA_AttributeValue::Top && GetPrev()) ||
- (iCapPlacement == XFA_AttributeValue::Bottom && GetNext())) {
+ if ((iCapPlacement == XFA_AttributeValue::Top &&
+ GetLayoutItem()->GetPrev()) ||
+ (iCapPlacement == XFA_AttributeValue::Bottom &&
+ GetLayoutItem()->GetNext())) {
m_rtCaption = CFX_RectF();
} else {
fCapReserve = caption->GetReserve();
@@ -202,7 +204,7 @@
} else {
fCapReserve = std::min(fCapReserve, rtWidget.width);
}
- CXFA_ContentLayoutItem* pItem = this;
+ CXFA_ContentLayoutItem* pItem = GetLayoutItem();
if (!pItem->GetPrev() && !pItem->GetNext()) {
m_rtCaption = rtWidget;
} else {
@@ -499,7 +501,7 @@
CFWL_MessageSetFocus ms(nullptr, m_pNormalWidget.get());
TranslateFWLMessage(&ms);
- m_dwStatus |= XFA_WidgetStatus_Focused;
+ GetLayoutItem()->m_dwStatus |= XFA_WidgetStatus_Focused;
InvalidateRect();
return true;
}
@@ -510,7 +512,7 @@
CFWL_MessageKillFocus ms(nullptr, m_pNormalWidget.get());
TranslateFWLMessage(&ms);
- m_dwStatus &= ~XFA_WidgetStatus_Focused;
+ GetLayoutItem()->m_dwStatus &= ~XFA_WidgetStatus_Focused;
InvalidateRect();
CXFA_FFWidget::OnKillFocus(pNewWidget);
return true;
diff --git a/xfa/fxfa/cxfa_ffnotify.cpp b/xfa/fxfa/cxfa_ffnotify.cpp
index be551d2..6c5f444 100644
--- a/xfa/fxfa/cxfa_ffnotify.cpp
+++ b/xfa/fxfa/cxfa_ffnotify.cpp
@@ -107,14 +107,14 @@
return nullptr;
}
-std::unique_ptr<CXFA_ContentLayoutItem>
-CXFA_FFNotify::OnCreateContentLayoutItem(CXFA_Node* pNode) {
+std::unique_ptr<CXFA_FFWidget> CXFA_FFNotify::OnCreateContentLayoutItem(
+ CXFA_Node* pNode) {
ASSERT(pNode->GetElementType() != XFA_Element::ContentArea);
ASSERT(pNode->GetElementType() != XFA_Element::PageArea);
// We only need to create the widget for certain types of objects.
if (!pNode->HasCreatedUIWidget())
- return pdfium::MakeUnique<CXFA_ContentLayoutItem>(pNode);
+ return nullptr;
std::unique_ptr<CXFA_FFWidget> pWidget;
switch (pNode->GetFFWidgetType()) {
diff --git a/xfa/fxfa/cxfa_ffnotify.h b/xfa/fxfa/cxfa_ffnotify.h
index 34b850b..23a50dc 100644
--- a/xfa/fxfa/cxfa_ffnotify.h
+++ b/xfa/fxfa/cxfa_ffnotify.h
@@ -43,8 +43,7 @@
void OnChildRemoved();
std::unique_ptr<CXFA_ViewLayoutItem> OnCreateViewLayoutItem(CXFA_Node* pNode);
- std::unique_ptr<CXFA_ContentLayoutItem> OnCreateContentLayoutItem(
- CXFA_Node* pNode);
+ std::unique_ptr<CXFA_FFWidget> OnCreateContentLayoutItem(CXFA_Node* pNode);
void OnLayoutItemAdded(CXFA_LayoutProcessor* pLayout,
CXFA_LayoutItem* pSender,
diff --git a/xfa/fxfa/cxfa_ffpageview.cpp b/xfa/fxfa/cxfa_ffpageview.cpp
index 29b4f5c..5ad5036 100644
--- a/xfa/fxfa/cxfa_ffpageview.cpp
+++ b/xfa/fxfa/cxfa_ffpageview.cpp
@@ -197,8 +197,8 @@
return pLayoutItem ? XFA_GetWidgetFromLayoutItem(pLayoutItem) : nullptr;
}
-bool CXFA_FFPageWidgetIterator::SetCurrentWidget(CXFA_FFWidget* hWidget) {
- return hWidget && m_sIterator.SetCurrent(hWidget);
+bool CXFA_FFPageWidgetIterator::SetCurrentWidget(CXFA_FFWidget* pWidget) {
+ return pWidget && m_sIterator.SetCurrent(pWidget->GetLayoutItem());
}
CXFA_FFWidget* CXFA_FFPageWidgetIterator::GetWidget(
diff --git a/xfa/fxfa/cxfa_fftext.cpp b/xfa/fxfa/cxfa_fftext.cpp
index 0db0aff..8e6cddb 100644
--- a/xfa/fxfa/cxfa_fftext.cpp
+++ b/xfa/fxfa/cxfa_fftext.cpp
@@ -42,7 +42,7 @@
CFX_RectF rtText = GetRectWithoutRotate();
CXFA_Margin* margin = m_pNode->GetMarginIfExists();
if (margin) {
- CXFA_ContentLayoutItem* pItem = this;
+ CXFA_ContentLayoutItem* pItem = GetLayoutItem();
if (!pItem->GetPrev() && !pItem->GetNext()) {
XFA_RectWithoutMargin(&rtText, margin);
} else {
@@ -61,7 +61,8 @@
CFX_Matrix mt(1, 0, 0, 1, rtText.left, rtText.top);
CFX_RectF rtClip = mtRotate.TransformRect(rtText);
mt.Concat(mtRotate);
- pTextLayout->DrawString(pRenderDevice, mt, rtClip, GetIndex());
+ pTextLayout->DrawString(pRenderDevice, mt, rtClip,
+ GetLayoutItem()->GetIndex());
}
bool CXFA_FFText::IsLoaded() {
@@ -78,7 +79,7 @@
return true;
pTextLayout->ClearBlocks();
- CXFA_ContentLayoutItem* pItem = this;
+ CXFA_ContentLayoutItem* pItem = GetLayoutItem();
if (!pItem->GetPrev() && !pItem->GetNext())
return true;
diff --git a/xfa/fxfa/cxfa_fftextedit.cpp b/xfa/fxfa/cxfa_fftextedit.cpp
index 9d125db..528d55e 100644
--- a/xfa/fxfa/cxfa_fftextedit.cpp
+++ b/xfa/fxfa/cxfa_fftextedit.cpp
@@ -121,7 +121,7 @@
void CXFA_FFTextEdit::OnLButtonDown(uint32_t dwFlags, const CFX_PointF& point) {
if (!IsFocused()) {
- m_dwStatus |= XFA_WidgetStatus_Focused;
+ GetLayoutItem()->m_dwStatus |= XFA_WidgetStatus_Focused;
UpdateFWLData();
InvalidateRect();
}
@@ -136,7 +136,7 @@
void CXFA_FFTextEdit::OnRButtonDown(uint32_t dwFlags, const CFX_PointF& point) {
if (!IsFocused()) {
- m_dwStatus |= XFA_WidgetStatus_Focused;
+ GetLayoutItem()->m_dwStatus |= XFA_WidgetStatus_Focused;
UpdateFWLData();
InvalidateRect();
}
@@ -158,9 +158,9 @@
}
bool CXFA_FFTextEdit::OnSetFocus(CXFA_FFWidget* pOldWidget) {
- m_dwStatus &= ~XFA_WidgetStatus_TextEditValueChanged;
+ GetLayoutItem()->m_dwStatus &= ~XFA_WidgetStatus_TextEditValueChanged;
if (!IsFocused()) {
- m_dwStatus |= XFA_WidgetStatus_Focused;
+ GetLayoutItem()->m_dwStatus |= XFA_WidgetStatus_Focused;
UpdateFWLData();
InvalidateRect();
}
@@ -173,7 +173,7 @@
bool CXFA_FFTextEdit::OnKillFocus(CXFA_FFWidget* pNewWidget) {
CFWL_MessageKillFocus ms(nullptr, m_pNormalWidget.get());
TranslateFWLMessage(&ms);
- m_dwStatus &= ~XFA_WidgetStatus_Focused;
+ GetLayoutItem()->m_dwStatus &= ~XFA_WidgetStatus_Focused;
SetEditScrollOffset();
ProcessCommittedData();
@@ -181,7 +181,7 @@
InvalidateRect();
CXFA_FFWidget::OnKillFocus(pNewWidget);
- m_dwStatus &= ~XFA_WidgetStatus_TextEditValueChanged;
+ GetLayoutItem()->m_dwStatus &= ~XFA_WidgetStatus_TextEditValueChanged;
return true;
}
@@ -211,7 +211,8 @@
}
bool CXFA_FFTextEdit::IsDataChanged() {
- return (m_dwStatus & XFA_WidgetStatus_TextEditValueChanged) != 0;
+ auto* pItem = GetLayoutItem();
+ return !!(pItem->m_dwStatus & XFA_WidgetStatus_TextEditValueChanged);
}
uint32_t CXFA_FFTextEdit::GetAlignment() {
@@ -299,7 +300,7 @@
void CXFA_FFTextEdit::OnTextWillChange(CFWL_Widget* pWidget,
CFWL_EventTextWillChange* event) {
- m_dwStatus |= XFA_WidgetStatus_TextEditValueChanged;
+ GetLayoutItem()->m_dwStatus |= XFA_WidgetStatus_TextEditValueChanged;
CXFA_EventParam eParam;
eParam.m_eType = XFA_EVENT_Change;
diff --git a/xfa/fxfa/cxfa_ffwidget.cpp b/xfa/fxfa/cxfa_ffwidget.cpp
index 1c25af5..1db5c05 100644
--- a/xfa/fxfa/cxfa_ffwidget.cpp
+++ b/xfa/fxfa/cxfa_ffwidget.cpp
@@ -226,35 +226,30 @@
if (!pLayoutItem->GetFormNode()->HasCreatedUIWidget())
return nullptr;
- return ToFFWidget(ToContentLayoutItem(pLayoutItem));
+ return GetFFWidget(ToContentLayoutItem(pLayoutItem));
}
CXFA_CalcData::CXFA_CalcData() : m_iRefCount(0) {}
CXFA_CalcData::~CXFA_CalcData() {}
-CXFA_FFWidget::CXFA_FFWidget(CXFA_Node* node)
- : CXFA_ContentLayoutItem(node), m_pNode(node) {}
+CXFA_FFWidget::CXFA_FFWidget(CXFA_Node* node) : m_pNode(node) {}
CXFA_FFWidget::~CXFA_FFWidget() = default;
-CXFA_FFWidget* CXFA_FFWidget::AsFFWidget() {
- return this;
-}
-
const CFWL_App* CXFA_FFWidget::GetFWLApp() {
return GetPageView()->GetDocView()->GetDoc()->GetApp()->GetFWLApp();
}
const CFX_RectF& CXFA_FFWidget::GetWidgetRect() const {
- if ((m_dwStatus & XFA_WidgetStatus_RectCached) == 0)
+ if ((GetLayoutItem()->m_dwStatus & XFA_WidgetStatus_RectCached) == 0)
RecacheWidgetRect();
return m_rtWidget;
}
const CFX_RectF& CXFA_FFWidget::RecacheWidgetRect() const {
- m_dwStatus |= XFA_WidgetStatus_RectCached;
- m_rtWidget = GetRect(false);
+ GetLayoutItem()->m_dwStatus |= XFA_WidgetStatus_RectCached;
+ m_rtWidget = GetLayoutItem()->GetRect(false);
return m_rtWidget;
}
@@ -283,11 +278,12 @@
}
uint32_t CXFA_FFWidget::GetStatus() {
- return m_dwStatus;
+ return GetLayoutItem()->m_dwStatus;
}
void CXFA_FFWidget::ModifyStatus(uint32_t dwAdded, uint32_t dwRemoved) {
- m_dwStatus = (m_dwStatus & ~dwRemoved) | dwAdded;
+ GetLayoutItem()->m_dwStatus =
+ (GetLayoutItem()->m_dwStatus & ~dwRemoved) | dwAdded;
}
CFX_RectF CXFA_FFWidget::GetBBox(uint32_t dwStatus, FocusOption focus) {
@@ -402,11 +398,11 @@
}
bool CXFA_FFWidget::OnSetFocus(CXFA_FFWidget* pOldWidget) {
- CXFA_FFWidget* pParent = ToFFWidget(ToContentLayoutItem(GetParent()));
+ CXFA_FFWidget* pParent = GetFFWidget(ToContentLayoutItem(GetParent()));
if (pParent && !pParent->IsAncestorOf(pOldWidget))
pParent->OnSetFocus(pOldWidget);
- m_dwStatus |= XFA_WidgetStatus_Focused;
+ GetLayoutItem()->m_dwStatus |= XFA_WidgetStatus_Focused;
CXFA_EventParam eParam;
eParam.m_eType = XFA_EVENT_Enter;
eParam.m_pTarget = m_pNode.Get();
@@ -415,12 +411,12 @@
}
bool CXFA_FFWidget::OnKillFocus(CXFA_FFWidget* pNewWidget) {
- m_dwStatus &= ~XFA_WidgetStatus_Focused;
+ GetLayoutItem()->m_dwStatus &= ~XFA_WidgetStatus_Focused;
EventKillFocus();
if (!pNewWidget)
return true;
- CXFA_FFWidget* pParent = ToFFWidget(ToContentLayoutItem(GetParent()));
+ CXFA_FFWidget* pParent = GetFFWidget(ToContentLayoutItem(GetParent()));
if (pParent && !pParent->IsAncestorOf(pNewWidget))
pParent->OnKillFocus(pNewWidget);
@@ -602,12 +598,12 @@
}
bool CXFA_FFWidget::IsMatchVisibleStatus(uint32_t dwStatus) {
- return !!(m_dwStatus & XFA_WidgetStatus_Visible);
+ return !!(GetLayoutItem()->m_dwStatus & XFA_WidgetStatus_Visible);
}
void CXFA_FFWidget::EventKillFocus() {
- if (m_dwStatus & XFA_WidgetStatus_Access) {
- m_dwStatus &= ~XFA_WidgetStatus_Access;
+ if (GetLayoutItem()->m_dwStatus & XFA_WidgetStatus_Access) {
+ GetLayoutItem()->m_dwStatus &= ~XFA_WidgetStatus_Access;
return;
}
CXFA_EventParam eParam;
@@ -617,10 +613,10 @@
}
bool CXFA_FFWidget::IsButtonDown() {
- return (m_dwStatus & XFA_WidgetStatus_ButtonDown) != 0;
+ return (GetLayoutItem()->m_dwStatus & XFA_WidgetStatus_ButtonDown) != 0;
}
void CXFA_FFWidget::SetButtonDown(bool bSet) {
- bSet ? m_dwStatus |= XFA_WidgetStatus_ButtonDown
- : m_dwStatus &= ~XFA_WidgetStatus_ButtonDown;
+ bSet ? GetLayoutItem()->m_dwStatus |= XFA_WidgetStatus_ButtonDown
+ : GetLayoutItem()->m_dwStatus &= ~XFA_WidgetStatus_ButtonDown;
}
diff --git a/xfa/fxfa/cxfa_ffwidget.h b/xfa/fxfa/cxfa_ffwidget.h
index fbd9266..02a9baa 100644
--- a/xfa/fxfa/cxfa_ffwidget.h
+++ b/xfa/fxfa/cxfa_ffwidget.h
@@ -61,15 +61,12 @@
int32_t m_iRefCount;
};
-class CXFA_FFWidget : public CXFA_ContentLayoutItem {
+class CXFA_FFWidget {
public:
enum FocusOption { kDoNotDrawFocus = 0, kDrawFocus };
explicit CXFA_FFWidget(CXFA_Node* pNode);
- ~CXFA_FFWidget() override;
-
- // CXFA_ContentLayoutItem:
- CXFA_FFWidget* AsFFWidget() override;
+ virtual ~CXFA_FFWidget();
virtual CFX_RectF GetBBox(uint32_t dwStatus, FocusOption focus);
virtual void RenderWidget(CXFA_Graphics* pGS,
@@ -121,9 +118,11 @@
virtual void Delete();
virtual void DeSelect();
virtual WideString GetText();
-
virtual FormFieldType GetFormFieldType();
+ CXFA_Node* GetNode() const { return m_pNode.Get(); }
+ CXFA_ContentLayoutItem* GetLayoutItem() const { return m_pLayoutItem.Get(); }
+ void SetLayoutItem(CXFA_ContentLayoutItem* pItem) { m_pLayoutItem = pItem; }
CXFA_FFPageView* GetPageView() const { return m_pPageView.Get(); }
void SetPageView(CXFA_FFPageView* pPageView) { m_pPageView = pPageView; }
CXFA_FFDocView* GetDocView() const { return m_pDocView.Get(); }
@@ -134,13 +133,13 @@
uint32_t GetStatus();
void ModifyStatus(uint32_t dwAdded, uint32_t dwRemoved);
- CXFA_Node* GetNode() const { return m_pNode.Get(); }
-
CXFA_FFDoc* GetDoc();
CXFA_FFApp* GetApp();
IXFA_AppProvider* GetAppProvider();
void InvalidateRect();
- bool IsFocused() const { return !!(m_dwStatus & XFA_WidgetStatus_Focused); }
+ bool IsFocused() const {
+ return !!(GetLayoutItem()->m_dwStatus & XFA_WidgetStatus_Focused);
+ }
CFX_PointF Rotate2Normal(const CFX_PointF& point);
CFX_Matrix GetRotateMatrix();
bool IsLayoutRectEmpty();
@@ -167,6 +166,7 @@
bool IsButtonDown();
void SetButtonDown(bool bSet);
+ UnownedPtr<CXFA_ContentLayoutItem> m_pLayoutItem;
UnownedPtr<CXFA_FFDocView> m_pDocView;
UnownedPtr<CXFA_FFPageView> m_pPageView;
UnownedPtr<CXFA_Node> const m_pNode;
diff --git a/xfa/fxfa/cxfa_ffwidgethandler.cpp b/xfa/fxfa/cxfa_ffwidgethandler.cpp
index 9b43c87..842dc1f 100644
--- a/xfa/fxfa/cxfa_ffwidgethandler.cpp
+++ b/xfa/fxfa/cxfa_ffwidgethandler.cpp
@@ -276,7 +276,7 @@
m_pDocView->RunLayout();
CXFA_LayoutItem* pLayout =
m_pDocView->GetXFALayout()->GetLayoutItem(pNewFormItem);
- return ToFFWidget(ToContentLayoutItem(pLayout));
+ return GetFFWidget(ToContentLayoutItem(pLayout));
}
CXFA_Node* CXFA_FFWidgetHandler::CreateWidgetFormItem(
diff --git a/xfa/fxfa/cxfa_fwltheme.cpp b/xfa/fxfa/cxfa_fwltheme.cpp
index 5cb5564..4aab239 100644
--- a/xfa/fxfa/cxfa_fwltheme.cpp
+++ b/xfa/fxfa/cxfa_fwltheme.cpp
@@ -150,7 +150,7 @@
if (!pWidget)
return CFX_RectF();
- CXFA_ContentLayoutItem* pItem = pWidget;
+ CXFA_ContentLayoutItem* pItem = pWidget->GetLayoutItem();
CXFA_Node* pNode = pWidget->GetNode();
CFX_RectF rect = pNode->GetUIMargin();
CXFA_Para* para = pNode->GetParaIfExists();
diff --git a/xfa/fxfa/layout/cxfa_contentlayoutitem.cpp b/xfa/fxfa/layout/cxfa_contentlayoutitem.cpp
index b88e1ae..157c7a3 100644
--- a/xfa/fxfa/layout/cxfa_contentlayoutitem.cpp
+++ b/xfa/fxfa/layout/cxfa_contentlayoutitem.cpp
@@ -6,12 +6,20 @@
#include "xfa/fxfa/layout/cxfa_contentlayoutitem.h"
+#include <utility>
+
#include "fxjs/xfa/cjx_object.h"
+#include "xfa/fxfa/cxfa_ffwidget.h"
#include "xfa/fxfa/parser/cxfa_margin.h"
#include "xfa/fxfa/parser/cxfa_node.h"
-CXFA_ContentLayoutItem::CXFA_ContentLayoutItem(CXFA_Node* pNode)
- : CXFA_LayoutItem(pNode, kContentItem) {}
+CXFA_ContentLayoutItem::CXFA_ContentLayoutItem(
+ CXFA_Node* pNode,
+ std::unique_ptr<CXFA_FFWidget> pWidget)
+ : CXFA_LayoutItem(pNode, kContentItem), m_pFFWidget(std::move(pWidget)) {
+ if (m_pFFWidget)
+ m_pFFWidget->SetLayoutItem(this);
+}
CXFA_ContentLayoutItem::~CXFA_ContentLayoutItem() {
RemoveSelf();
@@ -20,10 +28,6 @@
pJsObject->SetLayoutItem(nullptr);
}
-CXFA_FFWidget* CXFA_ContentLayoutItem::AsFFWidget() {
- return nullptr;
-}
-
CXFA_ContentLayoutItem* CXFA_ContentLayoutItem::GetFirst() {
CXFA_ContentLayoutItem* pCurNode = this;
while (auto* pPrev = pCurNode->GetPrev())
diff --git a/xfa/fxfa/layout/cxfa_contentlayoutitem.h b/xfa/fxfa/layout/cxfa_contentlayoutitem.h
index 2f8316e..fa1591e 100644
--- a/xfa/fxfa/layout/cxfa_contentlayoutitem.h
+++ b/xfa/fxfa/layout/cxfa_contentlayoutitem.h
@@ -7,6 +7,8 @@
#ifndef XFA_FXFA_LAYOUT_CXFA_CONTENTLAYOUTITEM_H_
#define XFA_FXFA_LAYOUT_CXFA_CONTENTLAYOUTITEM_H_
+#include <memory>
+
#include "core/fxcrt/unowned_ptr.h"
#include "xfa/fxfa/layout/cxfa_layoutitem.h"
@@ -14,10 +16,11 @@
class CXFA_ContentLayoutItem : public CXFA_LayoutItem {
public:
- explicit CXFA_ContentLayoutItem(CXFA_Node* pNode);
+ CXFA_ContentLayoutItem(CXFA_Node* pNode,
+ std::unique_ptr<CXFA_FFWidget> pFFWidget);
~CXFA_ContentLayoutItem() override;
- virtual CXFA_FFWidget* AsFFWidget();
+ CXFA_FFWidget* GetFFWidget() { return m_pFFWidget.get(); }
CXFA_ContentLayoutItem* GetFirst();
CXFA_ContentLayoutItem* GetLast();
@@ -37,10 +40,11 @@
UnownedPtr<CXFA_ContentLayoutItem> m_pPrev;
UnownedPtr<CXFA_ContentLayoutItem> m_pNext;
+ std::unique_ptr<CXFA_FFWidget> const m_pFFWidget;
};
-inline CXFA_FFWidget* ToFFWidget(CXFA_ContentLayoutItem* item) {
- return item ? item->AsFFWidget() : nullptr;
+inline CXFA_FFWidget* GetFFWidget(CXFA_ContentLayoutItem* item) {
+ return item ? item->GetFFWidget() : nullptr;
}
#endif // XFA_FXFA_LAYOUT_CXFA_CONTENTLAYOUTITEM_H_
diff --git a/xfa/fxfa/layout/cxfa_itemlayoutprocessor.cpp b/xfa/fxfa/layout/cxfa_itemlayoutprocessor.cpp
index 9db5dca..a6ddfc8 100644
--- a/xfa/fxfa/layout/cxfa_itemlayoutprocessor.cpp
+++ b/xfa/fxfa/layout/cxfa_itemlayoutprocessor.cpp
@@ -18,6 +18,7 @@
#include "third_party/base/stl_util.h"
#include "xfa/fxfa/cxfa_ffdoc.h"
#include "xfa/fxfa/cxfa_ffnotify.h"
+#include "xfa/fxfa/cxfa_ffwidget.h"
#include "xfa/fxfa/layout/cxfa_contentlayoutitem.h"
#include "xfa/fxfa/layout/cxfa_layoutcontext.h"
#include "xfa/fxfa/layout/cxfa_layoutpagemgr.h"
@@ -639,9 +640,9 @@
m_pOldLayoutItem = m_pOldLayoutItem->GetNext();
return pLayoutItem;
}
- pLayoutItem = pFormNode->GetDocument()
- ->GetNotify()
- ->OnCreateContentLayoutItem(pFormNode)
+ CXFA_FFNotify* pNotify = pFormNode->GetDocument()->GetNotify();
+ pLayoutItem = pdfium::MakeUnique<CXFA_ContentLayoutItem>(
+ pFormNode, pNotify->OnCreateContentLayoutItem(pFormNode))
.release();
CXFA_ContentLayoutItem* pPrevLayoutItem =
ToContentLayoutItem(pFormNode->JSObject()->GetLayoutItem());
diff --git a/xfa/fxfa/parser/cxfa_node.cpp b/xfa/fxfa/parser/cxfa_node.cpp
index 95fedd8..737e05d 100644
--- a/xfa/fxfa/parser/cxfa_node.cpp
+++ b/xfa/fxfa/parser/cxfa_node.cpp
@@ -3164,7 +3164,7 @@
}
CXFA_FFWidget* CXFA_Node::GetNextWidget(CXFA_FFWidget* pWidget) {
- return ToFFWidget(pWidget->GetNext());
+ return GetFFWidget(pWidget->GetLayoutItem()->GetNext());
}
void CXFA_Node::UpdateUIDisplay(CXFA_FFDocView* pDocView,