Return unique_ptr from CXFA_FFNotify::OnCreate{Container,Content}LayoutItem()

... and then immediately release it, but it is a step in the right
direction.

Change-Id: Ib52972c6789d8f98a576d1c69f8019541c96ac51
Reviewed-on: https://pdfium-review.googlesource.com/39152
Commit-Queue: Tom Sepez <tsepez@chromium.org>
Reviewed-by: Lei Zhang <thestig@chromium.org>
diff --git a/xfa/fxfa/cxfa_ffnotify.cpp b/xfa/fxfa/cxfa_ffnotify.cpp
index 586b048..715877c 100644
--- a/xfa/fxfa/cxfa_ffnotify.cpp
+++ b/xfa/fxfa/cxfa_ffnotify.cpp
@@ -6,7 +6,6 @@
 
 #include "xfa/fxfa/cxfa_ffnotify.h"
 
-#include <memory>
 #include <utility>
 
 #include "xfa/fxfa/cxfa_ffapp.h"
@@ -91,101 +90,106 @@
   }
 }
 
-CXFA_ContainerLayoutItem* CXFA_FFNotify::OnCreateContainerLayoutItem(
-    CXFA_Node* pNode) {
+std::unique_ptr<CXFA_ContainerLayoutItem>
+CXFA_FFNotify::OnCreateContainerLayoutItem(CXFA_Node* pNode) {
   XFA_Element type = pNode->GetElementType();
-  ASSERT(type == XFA_Element::ContentArea || type == XFA_Element::PageArea);
-
   if (type == XFA_Element::PageArea) {
     CXFA_LayoutProcessor* pLayout = m_pDoc->GetXFADoc()->GetLayoutProcessor();
-    return new CXFA_FFPageView(m_pDoc->GetDocView(pLayout), pNode);
+    return pdfium::MakeUnique<CXFA_FFPageView>(m_pDoc->GetDocView(pLayout),
+                                               pNode);
   }
-  return new CXFA_ContainerLayoutItem(pNode);
+  if (type == XFA_Element::ContentArea)
+    return pdfium::MakeUnique<CXFA_ContainerLayoutItem>(pNode);
+
+  NOTREACHED();
+  return nullptr;
 }
 
-CXFA_ContentLayoutItem* CXFA_FFNotify::OnCreateContentLayoutItem(
-    CXFA_Node* pNode) {
+std::unique_ptr<CXFA_ContentLayoutItem>
+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 new CXFA_ContentLayoutItem(pNode);
+    return pdfium::MakeUnique<CXFA_ContentLayoutItem>(pNode);
 
-  CXFA_FFWidget* pWidget = nullptr;
+  std::unique_ptr<CXFA_FFWidget> pWidget;
   switch (pNode->GetFFWidgetType()) {
     case XFA_FFWidgetType::kBarcode: {
       CXFA_Node* child = pNode->GetUIChildNode();
-      if (child->GetElementType() == XFA_Element::Barcode)
-        pWidget = new CXFA_FFBarcode(pNode, static_cast<CXFA_Barcode*>(child));
+      if (child->GetElementType() == XFA_Element::Barcode) {
+        pWidget = pdfium::MakeUnique<CXFA_FFBarcode>(
+            pNode, static_cast<CXFA_Barcode*>(child));
+      }
       break;
     }
     case XFA_FFWidgetType::kButton: {
       CXFA_Node* child = pNode->GetUIChildNode();
       if (child->GetElementType() == XFA_Element::Button) {
-        pWidget =
-            new CXFA_FFPushButton(pNode, static_cast<CXFA_Button*>(child));
+        pWidget = pdfium::MakeUnique<CXFA_FFPushButton>(
+            pNode, static_cast<CXFA_Button*>(child));
       }
       break;
     }
     case XFA_FFWidgetType::kCheckButton: {
       CXFA_Node* child = pNode->GetUIChildNode();
       if (child->GetElementType() == XFA_Element::CheckButton) {
-        pWidget = new CXFA_FFCheckButton(pNode,
-                                         static_cast<CXFA_CheckButton*>(child));
+        pWidget = pdfium::MakeUnique<CXFA_FFCheckButton>(
+            pNode, static_cast<CXFA_CheckButton*>(child));
       }
       break;
     }
     case XFA_FFWidgetType::kChoiceList: {
       if (pNode->IsListBox())
-        pWidget = new CXFA_FFListBox(pNode);
+        pWidget = pdfium::MakeUnique<CXFA_FFListBox>(pNode);
       else
-        pWidget = new CXFA_FFComboBox(pNode);
+        pWidget = pdfium::MakeUnique<CXFA_FFComboBox>(pNode);
       break;
     }
     case XFA_FFWidgetType::kDateTimeEdit:
-      pWidget = new CXFA_FFDateTimeEdit(pNode);
+      pWidget = pdfium::MakeUnique<CXFA_FFDateTimeEdit>(pNode);
       break;
     case XFA_FFWidgetType::kImageEdit:
-      pWidget = new CXFA_FFImageEdit(pNode);
+      pWidget = pdfium::MakeUnique<CXFA_FFImageEdit>(pNode);
       break;
     case XFA_FFWidgetType::kNumericEdit:
-      pWidget = new CXFA_FFNumericEdit(pNode);
+      pWidget = pdfium::MakeUnique<CXFA_FFNumericEdit>(pNode);
       break;
     case XFA_FFWidgetType::kPasswordEdit: {
       CXFA_Node* child = pNode->GetUIChildNode();
       if (child->GetElementType() == XFA_Element::PasswordEdit) {
-        pWidget = new CXFA_FFPasswordEdit(
+        pWidget = pdfium::MakeUnique<CXFA_FFPasswordEdit>(
             pNode, static_cast<CXFA_PasswordEdit*>(child));
       }
       break;
     }
     case XFA_FFWidgetType::kSignature:
-      pWidget = new CXFA_FFSignature(pNode);
+      pWidget = pdfium::MakeUnique<CXFA_FFSignature>(pNode);
       break;
     case XFA_FFWidgetType::kTextEdit:
-      pWidget = new CXFA_FFTextEdit(pNode);
+      pWidget = pdfium::MakeUnique<CXFA_FFTextEdit>(pNode);
       break;
     case XFA_FFWidgetType::kArc:
-      pWidget = new CXFA_FFArc(pNode);
+      pWidget = pdfium::MakeUnique<CXFA_FFArc>(pNode);
       break;
     case XFA_FFWidgetType::kLine:
-      pWidget = new CXFA_FFLine(pNode);
+      pWidget = pdfium::MakeUnique<CXFA_FFLine>(pNode);
       break;
     case XFA_FFWidgetType::kRectangle:
-      pWidget = new CXFA_FFRectangle(pNode);
+      pWidget = pdfium::MakeUnique<CXFA_FFRectangle>(pNode);
       break;
     case XFA_FFWidgetType::kText:
-      pWidget = new CXFA_FFText(pNode);
+      pWidget = pdfium::MakeUnique<CXFA_FFText>(pNode);
       break;
     case XFA_FFWidgetType::kImage:
-      pWidget = new CXFA_FFImage(pNode);
+      pWidget = pdfium::MakeUnique<CXFA_FFImage>(pNode);
       break;
     case XFA_FFWidgetType::kSubform:
-      pWidget = new CXFA_FFWidget(pNode);
+      pWidget = pdfium::MakeUnique<CXFA_FFWidget>(pNode);
       break;
     case XFA_FFWidgetType::kExclGroup:
-      pWidget = new CXFA_FFExclGroup(pNode);
+      pWidget = pdfium::MakeUnique<CXFA_FFExclGroup>(pNode);
       break;
     case XFA_FFWidgetType::kNone:
       return nullptr;
diff --git a/xfa/fxfa/cxfa_ffnotify.h b/xfa/fxfa/cxfa_ffnotify.h
index 6715f82..298a101 100644
--- a/xfa/fxfa/cxfa_ffnotify.h
+++ b/xfa/fxfa/cxfa_ffnotify.h
@@ -7,6 +7,8 @@
 #ifndef XFA_FXFA_CXFA_FFNOTIFY_H_
 #define XFA_FXFA_CXFA_FFNOTIFY_H_
 
+#include <memory>
+
 #include "xfa/fxfa/cxfa_eventparam.h"
 #include "xfa/fxfa/parser/cxfa_document.h"
 
@@ -39,8 +41,10 @@
   void OnChildAdded(CXFA_Node* pSender);
   void OnChildRemoved();
 
-  CXFA_ContainerLayoutItem* OnCreateContainerLayoutItem(CXFA_Node* pNode);
-  CXFA_ContentLayoutItem* OnCreateContentLayoutItem(CXFA_Node* pNode);
+  std::unique_ptr<CXFA_ContainerLayoutItem> OnCreateContainerLayoutItem(
+      CXFA_Node* pNode);
+  std::unique_ptr<CXFA_ContentLayoutItem> OnCreateContentLayoutItem(
+      CXFA_Node* pNode);
 
   void OnLayoutItemAdded(CXFA_LayoutProcessor* pLayout,
                          CXFA_LayoutItem* pSender,
diff --git a/xfa/fxfa/parser/cxfa_itemlayoutprocessor.cpp b/xfa/fxfa/parser/cxfa_itemlayoutprocessor.cpp
index 60dd8a3..e09b17d 100644
--- a/xfa/fxfa/parser/cxfa_itemlayoutprocessor.cpp
+++ b/xfa/fxfa/parser/cxfa_itemlayoutprocessor.cpp
@@ -652,9 +652,10 @@
     m_pOldLayoutItem = m_pOldLayoutItem->m_pNext;
     return pLayoutItem;
   }
-  pLayoutItem =
-      pFormNode->GetDocument()->GetNotify()->OnCreateContentLayoutItem(
-          pFormNode);
+  pLayoutItem = pFormNode->GetDocument()
+                    ->GetNotify()
+                    ->OnCreateContentLayoutItem(pFormNode)
+                    .release();
   CXFA_ContentLayoutItem* pPrevLayoutItem =
       ToContentLayoutItem(pFormNode->JSObject()->GetLayoutItem());
   if (pPrevLayoutItem) {
diff --git a/xfa/fxfa/parser/cxfa_layoutpagemgr.cpp b/xfa/fxfa/parser/cxfa_layoutpagemgr.cpp
index b6c95c1..411ad24 100644
--- a/xfa/fxfa/parser/cxfa_layoutpagemgr.cpp
+++ b/xfa/fxfa/parser/cxfa_layoutpagemgr.cpp
@@ -582,7 +582,8 @@
     pNewPageAreaLayoutItem = pContainerItem;
   } else {
     CXFA_FFNotify* pNotify = pNewPageArea->GetDocument()->GetNotify();
-    auto* pContainerItem = pNotify->OnCreateContainerLayoutItem(pNewPageArea);
+    auto* pContainerItem =
+        pNotify->OnCreateContainerLayoutItem(pNewPageArea).release();
     m_PageArray.push_back(pContainerItem);
     m_nAvailPages++;
     pNotify->OnPageEvent(pContainerItem, XFA_PAGEVIEWEVENT_PostRemoved);