No need to observe garbage-collected CXFA_FFWidget either.
Bug: pdfium:1563
Change-Id: I0a17e1a2f7a605cc7badfab91a9f983148867a0b
Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/73395
Commit-Queue: Tom Sepez <tsepez@chromium.org>
Reviewed-by: Lei Zhang <thestig@chromium.org>
diff --git a/fpdfsdk/cpdfsdk_widget.cpp b/fpdfsdk/cpdfsdk_widget.cpp
index 63eca28..c7724a27 100644
--- a/fpdfsdk/cpdfsdk_widget.cpp
+++ b/fpdfsdk/cpdfsdk_widget.cpp
@@ -184,7 +184,7 @@
}
bool CPDFSDK_Widget::HasXFAAAction(PDFSDK_XFAAActionType eXFAAAT) const {
- ObservedPtr<CXFA_FFWidget> pWidget(GetMixXFAWidget());
+ CXFA_FFWidget* pWidget = GetMixXFAWidget();
if (!pWidget)
return false;
@@ -202,9 +202,7 @@
}
}
- // Check |pWidget| again because JS may have destroyed it in the block above.
- return pWidget &&
- pWidget->HasEventUnderHandler(eEventType, pXFAWidgetHandler);
+ return pWidget->HasEventUnderHandler(eEventType, pXFAWidgetHandler);
}
bool CPDFSDK_Widget::OnXFAAAction(PDFSDK_XFAAActionType eXFAAAT,
@@ -215,7 +213,7 @@
if (!pContext)
return false;
- ObservedPtr<CXFA_FFWidget> pWidget(GetMixXFAWidget());
+ CXFA_FFWidget* pWidget = GetMixXFAWidget();
if (!pWidget)
return false;
@@ -247,12 +245,9 @@
}
}
- // Check |pWidget| again because JS may have destroyed it in the block above.
- if (!pWidget)
- return false;
-
bool ret = pWidget->ProcessEventUnderHandler(¶m, pXFAWidgetHandler);
- if (CXFA_FFDocView* pDocView = pContext->GetXFADocView())
+ CXFA_FFDocView* pDocView = pContext->GetXFADocView();
+ if (pDocView)
pDocView->UpdateDocView();
return ret;
diff --git a/fpdfsdk/fpdfxfa/cpdfxfa_widget.h b/fpdfsdk/fpdfxfa/cpdfxfa_widget.h
index 972845f..a3d35f7 100644
--- a/fpdfsdk/fpdfxfa/cpdfxfa_widget.h
+++ b/fpdfsdk/fpdfxfa/cpdfxfa_widget.h
@@ -8,9 +8,9 @@
#define FPDFSDK_FPDFXFA_CPDFXFA_WIDGET_H_
#include "core/fxcrt/fx_coordinates.h"
-#include "core/fxcrt/observed_ptr.h"
#include "core/fxcrt/unowned_ptr.h"
#include "fpdfsdk/cpdfsdk_annot.h"
+#include "v8/include/cppgc/persistent.h"
#include "xfa/fxfa/cxfa_ffwidget.h"
class CPDFSDK_InteractiveForm;
@@ -35,7 +35,7 @@
private:
UnownedPtr<CPDFSDK_InteractiveForm> const m_pInteractiveForm;
- ObservedPtr<CXFA_FFWidget> const m_pXFAFFWidget;
+ cppgc::Persistent<CXFA_FFWidget> const m_pXFAFFWidget;
};
#endif // FPDFSDK_FPDFXFA_CPDFXFA_WIDGET_H_
diff --git a/xfa/fxfa/cxfa_ffcombobox.cpp b/xfa/fxfa/cxfa_ffcombobox.cpp
index 7477133..1e9feaa 100644
--- a/xfa/fxfa/cxfa_ffcombobox.cpp
+++ b/xfa/fxfa/cxfa_ffcombobox.cpp
@@ -117,11 +117,10 @@
}
bool CXFA_FFComboBox::OnKillFocus(CXFA_FFWidget* pNewWidget) {
- ObservedPtr<CXFA_FFWidget> pNewWatched(pNewWidget);
if (!ProcessCommittedData())
UpdateFWLData();
- return pNewWatched && CXFA_FFField::OnKillFocus(pNewWatched.Get());
+ return pNewWidget && CXFA_FFField::OnKillFocus(pNewWidget);
}
void CXFA_FFComboBox::OpenDropDownList() {
diff --git a/xfa/fxfa/cxfa_ffdocview.cpp b/xfa/fxfa/cxfa_ffdocview.cpp
index 13abb3a..0663015 100644
--- a/xfa/fxfa/cxfa_ffdocview.cpp
+++ b/xfa/fxfa/cxfa_ffdocview.cpp
@@ -67,6 +67,7 @@
visitor->Trace(m_pDoc);
visitor->Trace(m_pWidgetHandler);
visitor->Trace(m_pFocusNode);
+ visitor->Trace(m_pFocusWidget);
ContainerTrace(visitor, m_ValidateNodes);
ContainerTrace(visitor, m_CalculateNodes);
ContainerTrace(visitor, m_NewAddedNodes);
@@ -147,7 +148,7 @@
m_CalculateNodes.clear();
if (m_pFocusNode && !m_pFocusWidget)
- SetFocusNode(m_pFocusNode.Get());
+ SetFocusNode(m_pFocusNode);
m_iStatus = XFA_DOCVIEW_LAYOUTSTATUS_End;
}
@@ -213,13 +214,8 @@
pWidget->IsFocused())) {
continue;
}
- ObservedPtr<CXFA_FFWidget> pWatched(pWidget);
- ObservedPtr<CXFA_FFWidget> pWatchedNext(pNext);
- pWatched->UpdateFWLData();
- if (pWatched)
- pWatched->InvalidateRect();
- if (!pWatchedNext)
- break;
+ pWidget->UpdateFWLData();
+ pWidget->InvalidateRect();
}
}
@@ -306,8 +302,8 @@
!pItem->TestStatusBits(XFA_WidgetStatus_Focused)) {
if (!m_pFocusWidget->IsLoaded())
m_pFocusWidget->LoadWidget();
- if (!m_pFocusWidget->OnSetFocus(m_pFocusWidget.Get()))
- m_pFocusWidget.Reset();
+ if (!m_pFocusWidget->OnSetFocus(m_pFocusWidget))
+ m_pFocusWidget.Clear();
}
}
if (m_pFocusWidget) {
@@ -319,17 +315,17 @@
if (pNewFocus->GetLayoutItem()->TestStatusBits(XFA_WidgetStatus_Visible)) {
if (!pNewFocus->IsLoaded())
pNewFocus->LoadWidget();
- if (!pNewFocus->OnSetFocus(m_pFocusWidget.Get()))
+ if (!pNewFocus->OnSetFocus(m_pFocusWidget))
pNewFocus = nullptr;
}
}
if (pNewFocus) {
CXFA_Node* node = pNewFocus->GetNode();
m_pFocusNode = node->IsWidgetReady() ? node : nullptr;
- m_pFocusWidget.Reset(pNewFocus);
+ m_pFocusWidget = pNewFocus;
} else {
m_pFocusNode.Clear();
- m_pFocusWidget.Reset();
+ m_pFocusWidget.Clear();
}
return true;
}
@@ -343,15 +339,15 @@
if (m_iStatus != XFA_DOCVIEW_LAYOUTSTATUS_End)
return;
- m_pDoc->SetFocusWidget(m_pFocusWidget.Get());
+ m_pDoc->SetFocusWidget(m_pFocusWidget);
}
void CXFA_FFDocView::DeleteLayoutItem(CXFA_FFWidget* pWidget) {
if (m_pFocusNode != pWidget->GetNode())
return;
- m_pFocusNode = nullptr;
- m_pFocusWidget.Reset();
+ m_pFocusNode.Clear();
+ m_pFocusWidget.Clear();
}
static XFA_EventError XFA_ProcessEvent(CXFA_FFDocView* pDocView,
diff --git a/xfa/fxfa/cxfa_ffdocview.h b/xfa/fxfa/cxfa_ffdocview.h
index 74bd34c..486e199 100644
--- a/xfa/fxfa/cxfa_ffdocview.h
+++ b/xfa/fxfa/cxfa_ffdocview.h
@@ -11,7 +11,6 @@
#include <memory>
#include <vector>
-#include "core/fxcrt/observed_ptr.h"
#include "fxjs/gc/heap.h"
#include "v8/include/cppgc/garbage-collected.h"
#include "v8/include/cppgc/member.h"
@@ -68,7 +67,7 @@
void ResetNode(CXFA_Node* pNode);
CXFA_Node* GetRootSubform();
CXFA_FFWidgetHandler* GetWidgetHandler();
- CXFA_FFWidget* GetFocusWidget() const { return m_pFocusWidget.Get(); }
+ CXFA_FFWidget* GetFocusWidget() const { return m_pFocusWidget; }
bool SetFocus(CXFA_FFWidget* pNewFocus);
CXFA_FFWidget* GetWidgetForNode(CXFA_Node* node);
CXFA_FFWidget* GetWidgetByName(const WideString& wsName,
@@ -91,7 +90,7 @@
bool RunLayout();
void AddNewFormNode(CXFA_Node* pNode);
void AddIndexChangedSubform(CXFA_Node* pNode);
- CXFA_Node* GetFocusNode() const { return m_pFocusNode.Get(); }
+ CXFA_Node* GetFocusNode() const { return m_pFocusNode; }
void SetFocusNode(CXFA_Node* pNode);
void DeleteLayoutItem(CXFA_FFWidget* pWidget);
XFA_EventError ExecEventActivityByDeepFirst(CXFA_Node* pFormNode,
@@ -125,7 +124,7 @@
cppgc::Member<CXFA_FFDoc> const m_pDoc;
cppgc::Member<CXFA_FFWidgetHandler> m_pWidgetHandler;
cppgc::Member<CXFA_Node> m_pFocusNode;
- ObservedPtr<CXFA_FFWidget> m_pFocusWidget;
+ cppgc::Member<CXFA_FFWidget> m_pFocusWidget;
std::list<cppgc::Member<CXFA_Node>> m_ValidateNodes;
std::vector<cppgc::Member<CXFA_Node>> m_CalculateNodes;
std::list<cppgc::Member<CXFA_BindItems>> m_BindItems;
diff --git a/xfa/fxfa/cxfa_fffield.cpp b/xfa/fxfa/cxfa_fffield.cpp
index 319942b..6002cb8 100644
--- a/xfa/fxfa/cxfa_fffield.cpp
+++ b/xfa/fxfa/cxfa_fffield.cpp
@@ -512,14 +512,13 @@
}
bool CXFA_FFField::OnKillFocus(CXFA_FFWidget* pNewWidget) {
- ObservedPtr<CXFA_FFWidget> pNewWatched(pNewWidget);
if (GetNormalWidget()) {
CFWL_MessageKillFocus msg(nullptr, GetNormalWidget());
SendMessageToFWLWidget(&msg);
GetLayoutItem()->ClearStatusBits(XFA_WidgetStatus_Focused);
InvalidateRect();
}
- return pNewWatched && CXFA_FFWidget::OnKillFocus(pNewWatched.Get());
+ return pNewWidget && CXFA_FFWidget::OnKillFocus(pNewWidget);
}
bool CXFA_FFField::OnKeyDown(uint32_t dwKeyCode, uint32_t dwFlags) {
diff --git a/xfa/fxfa/cxfa_fflistbox.cpp b/xfa/fxfa/cxfa_fflistbox.cpp
index 5cd39ba..039f389 100644
--- a/xfa/fxfa/cxfa_fflistbox.cpp
+++ b/xfa/fxfa/cxfa_fflistbox.cpp
@@ -84,11 +84,10 @@
}
bool CXFA_FFListBox::OnKillFocus(CXFA_FFWidget* pNewFocus) {
- ObservedPtr<CXFA_FFWidget> pNewWatched(pNewFocus);
if (!ProcessCommittedData())
UpdateFWLData();
- return pNewWatched && CXFA_FFField::OnKillFocus(pNewWatched.Get());
+ return pNewFocus && CXFA_FFField::OnKillFocus(pNewFocus);
}
bool CXFA_FFListBox::CommitData() {
diff --git a/xfa/fxfa/cxfa_ffnotify.cpp b/xfa/fxfa/cxfa_ffnotify.cpp
index af589bf..515691f 100644
--- a/xfa/fxfa/cxfa_ffnotify.cpp
+++ b/xfa/fxfa/cxfa_ffnotify.cpp
@@ -268,13 +268,8 @@
if (!hWidget)
return;
- // SetFocusWidget() may destroy |hWidget| object by JS callback.
- ObservedPtr<CXFA_FFWidget> pObservedWidget(hWidget);
CXFA_FFDoc* hDoc = GetFFDoc();
hDoc->SetFocusWidget(hWidget);
- if (!pObservedWidget)
- return;
-
if (hWidget->GetNode()->GetFFWidgetType() != XFA_FFWidgetType::kChoiceList)
return;
diff --git a/xfa/fxfa/cxfa_fftextedit.cpp b/xfa/fxfa/cxfa_fftextedit.cpp
index 8a2be60..c0c51b8 100644
--- a/xfa/fxfa/cxfa_fftextedit.cpp
+++ b/xfa/fxfa/cxfa_fftextedit.cpp
@@ -163,14 +163,13 @@
}
bool CXFA_FFTextEdit::OnSetFocus(CXFA_FFWidget* pOldWidget) {
- ObservedPtr<CXFA_FFWidget> pOldWatched(pOldWidget);
GetLayoutItem()->ClearStatusBits(XFA_WidgetStatus_TextEditValueChanged);
if (!IsFocused()) {
GetLayoutItem()->SetStatusBits(XFA_WidgetStatus_Focused);
UpdateFWLData();
InvalidateRect();
}
- if (!CXFA_FFWidget::OnSetFocus(pOldWatched.Get()))
+ if (!CXFA_FFWidget::OnSetFocus(pOldWidget))
return false;
CFWL_MessageSetFocus msg(nullptr, GetNormalWidget());
@@ -179,16 +178,16 @@
}
bool CXFA_FFTextEdit::OnKillFocus(CXFA_FFWidget* pNewWidget) {
- ObservedPtr<CXFA_FFWidget> pNewWatched(pNewWidget);
CFWL_MessageKillFocus msg(nullptr, GetNormalWidget());
SendMessageToFWLWidget(&msg);
+
GetLayoutItem()->ClearStatusBits(XFA_WidgetStatus_Focused);
SetEditScrollOffset();
ProcessCommittedData();
UpdateFWLData();
InvalidateRect();
- if (!CXFA_FFWidget::OnKillFocus(pNewWatched.Get()))
+ if (!CXFA_FFWidget::OnKillFocus(pNewWidget))
return false;
GetLayoutItem()->ClearStatusBits(XFA_WidgetStatus_TextEditValueChanged);
diff --git a/xfa/fxfa/cxfa_ffwidget.cpp b/xfa/fxfa/cxfa_ffwidget.cpp
index 41b7931..77ca30c 100644
--- a/xfa/fxfa/cxfa_ffwidget.cpp
+++ b/xfa/fxfa/cxfa_ffwidget.cpp
@@ -440,22 +440,17 @@
}
bool CXFA_FFWidget::OnKillFocus(CXFA_FFWidget* pNewWidget) {
- ObservedPtr<CXFA_FFWidget> pNewWatched(pNewWidget);
GetLayoutItem()->ClearStatusBits(XFA_WidgetStatus_Focused);
EventKillFocus();
if (!pNewWidget)
return true;
- if (!pNewWatched)
- return false;
-
- // OnKillFocus event may remove |pNewWidget|.
CXFA_FFWidget* pParent = GetFFWidget(ToContentLayoutItem(GetParent()));
if (pParent && !pParent->IsAncestorOf(pNewWidget)) {
if (!pParent->OnKillFocus(pNewWidget))
return false;
}
- return !!pNewWatched;
+ return true;
}
bool CXFA_FFWidget::OnKeyDown(uint32_t dwKeyCode, uint32_t dwFlags) {
diff --git a/xfa/fxfa/cxfa_ffwidget.h b/xfa/fxfa/cxfa_ffwidget.h
index 4e33caf..637d7a7 100644
--- a/xfa/fxfa/cxfa_ffwidget.h
+++ b/xfa/fxfa/cxfa_ffwidget.h
@@ -11,7 +11,6 @@
#include "core/fpdfdoc/cpdf_formfield.h"
#include "core/fxcodec/fx_codec_def.h"
-#include "core/fxcrt/observed_ptr.h"
#include "core/fxge/cfx_graphstatedata.h"
#include "fxjs/gc/heap.h"
#include "v8/include/cppgc/garbage-collected.h"
@@ -70,7 +69,6 @@
};
class CXFA_FFWidget : public cppgc::GarbageCollected<CXFA_FFWidget>,
- public Observable,
public CFWL_Widget::AdapterIface {
CPPGC_USING_PRE_FINALIZER(CXFA_FFWidget, PreFinalize);