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(&param, 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);