Retain corresponding layoutitem in CXFA_FFDocView::SetFocus().

Prevent destruction of the newly focused widget. Remove the need for an
ObserverPtr, and potential nullptr dereference with the ObserverPtr.

Bug: chromium:982193
Change-Id: I1e210c91ab90f90a6d3fc7de9d83dd1427e97f0d
Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/66713
Reviewed-by: Tom Sepez <tsepez@chromium.org>
Commit-Queue: Lei Zhang <thestig@chromium.org>
diff --git a/xfa/fxfa/cxfa_ffdocview.cpp b/xfa/fxfa/cxfa_ffdocview.cpp
index 3a44122..62b2fb2 100644
--- a/xfa/fxfa/cxfa_ffdocview.cpp
+++ b/xfa/fxfa/cxfa_ffdocview.cpp
@@ -291,7 +291,10 @@
   if (pNewFocus == m_pFocusWidget)
     return false;
 
-  ObservedPtr<CXFA_FFWidget> pNewWatched(pNewFocus);
+  // Prevents destruction of the CXFA_ContentLayoutItem that owns |pNewFocus|.
+  RetainPtr<CXFA_ContentLayoutItem> retain_layout(
+      pNewFocus ? pNewFocus->GetLayoutItem() : nullptr);
+
   if (m_pFocusWidget) {
     CXFA_ContentLayoutItem* pItem = m_pFocusWidget->GetLayoutItem();
     if (pItem->TestStatusBits(XFA_WidgetStatus_Visible) &&
@@ -303,23 +306,22 @@
     }
   }
   if (m_pFocusWidget) {
-    if (!m_pFocusWidget->OnKillFocus(pNewWatched.Get()))
+    if (!m_pFocusWidget->OnKillFocus(pNewFocus))
       return false;
   }
 
-  if (pNewWatched) {
-    if (pNewWatched->GetLayoutItem()->TestStatusBits(
-            XFA_WidgetStatus_Visible)) {
-      if (!pNewWatched->IsLoaded())
-        pNewWatched->LoadWidget();
-      if (!pNewWatched->OnSetFocus(m_pFocusWidget.Get()))
-        pNewWatched.Reset();
+  if (pNewFocus) {
+    if (pNewFocus->GetLayoutItem()->TestStatusBits(XFA_WidgetStatus_Visible)) {
+      if (!pNewFocus->IsLoaded())
+        pNewFocus->LoadWidget();
+      if (!pNewFocus->OnSetFocus(m_pFocusWidget.Get()))
+        pNewFocus = nullptr;
     }
   }
-  if (pNewWatched) {
-    CXFA_Node* node = pNewWatched->GetNode();
+  if (pNewFocus) {
+    CXFA_Node* node = pNewFocus->GetNode();
     m_pFocusNode = node->IsWidgetReady() ? node : nullptr;
-    m_pFocusWidget.Reset(pNewWatched.Get());
+    m_pFocusWidget.Reset(pNewFocus);
   } else {
     m_pFocusNode.Reset();
     m_pFocusWidget.Reset();