Add CPDFSDK_AnnotIteration subclasses to improve readability.

Make CPDFSDK_AnnotIteration's ctor protected, and force it to be
instantiated via CPDFSDK_AnnotForwardIteration and
CPDFSDK_AnnotReverseIteration. Then it becomes more obvious what these
classes do.

Change-Id: I769120ba31b9e1439a6f468d3e1d384239071231
Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/92130
Reviewed-by: Tom Sepez <tsepez@chromium.org>
Commit-Queue: Lei Zhang <thestig@chromium.org>
diff --git a/fpdfsdk/cpdfsdk_annotiteration.cpp b/fpdfsdk/cpdfsdk_annotiteration.cpp
index fa9a5ea..0869d0e 100644
--- a/fpdfsdk/cpdfsdk_annotiteration.cpp
+++ b/fpdfsdk/cpdfsdk_annotiteration.cpp
@@ -38,3 +38,15 @@
 }
 
 CPDFSDK_AnnotIteration::~CPDFSDK_AnnotIteration() = default;
+
+CPDFSDK_AnnotForwardIteration::CPDFSDK_AnnotForwardIteration(
+    CPDFSDK_PageView* pPageView)
+    : CPDFSDK_AnnotIteration(pPageView, /*bReverse=*/false) {}
+
+CPDFSDK_AnnotForwardIteration::~CPDFSDK_AnnotForwardIteration() = default;
+
+CPDFSDK_AnnotReverseIteration::CPDFSDK_AnnotReverseIteration(
+    CPDFSDK_PageView* pPageView)
+    : CPDFSDK_AnnotIteration(pPageView, /*bReverse=*/true) {}
+
+CPDFSDK_AnnotReverseIteration::~CPDFSDK_AnnotReverseIteration() = default;
diff --git a/fpdfsdk/cpdfsdk_annotiteration.h b/fpdfsdk/cpdfsdk_annotiteration.h
index d3a0f39..c6015a3 100644
--- a/fpdfsdk/cpdfsdk_annotiteration.h
+++ b/fpdfsdk/cpdfsdk_annotiteration.h
@@ -18,14 +18,27 @@
   using const_iterator =
       std::vector<ObservedPtr<CPDFSDK_Annot>>::const_iterator;
 
-  CPDFSDK_AnnotIteration(CPDFSDK_PageView* pPageView, bool bReverse);
-  ~CPDFSDK_AnnotIteration();
-
   const_iterator begin() const { return m_List.begin(); }
   const_iterator end() const { return m_List.end(); }
 
+ protected:
+  CPDFSDK_AnnotIteration(CPDFSDK_PageView* pPageView, bool bReverse);
+  ~CPDFSDK_AnnotIteration();
+
  private:
   std::vector<ObservedPtr<CPDFSDK_Annot>> m_List;
 };
 
+class CPDFSDK_AnnotForwardIteration : public CPDFSDK_AnnotIteration {
+ public:
+  explicit CPDFSDK_AnnotForwardIteration(CPDFSDK_PageView* pPageView);
+  ~CPDFSDK_AnnotForwardIteration();
+};
+
+class CPDFSDK_AnnotReverseIteration : public CPDFSDK_AnnotIteration {
+ public:
+  explicit CPDFSDK_AnnotReverseIteration(CPDFSDK_PageView* pPageView);
+  ~CPDFSDK_AnnotReverseIteration();
+};
+
 #endif  // FPDFSDK_CPDFSDK_ANNOTITERATION_H_
diff --git a/fpdfsdk/cpdfsdk_pageview.cpp b/fpdfsdk/cpdfsdk_pageview.cpp
index b263da9..23c7de3 100644
--- a/fpdfsdk/cpdfsdk_pageview.cpp
+++ b/fpdfsdk/cpdfsdk_pageview.cpp
@@ -81,8 +81,8 @@
 #endif  // PDF_ENABLE_XFA
 
   // for pdf/static xfa.
-  CPDFSDK_AnnotIteration annotIteration(this, true);
-  for (const auto& pSDKAnnot : annotIteration) {
+  CPDFSDK_AnnotReverseIteration annot_iteration(this);
+  for (const auto& pSDKAnnot : annot_iteration) {
     m_pFormFillEnv->GetAnnotHandlerMgr()->Annot_OnDraw(
         pSDKAnnot.Get(), pDevice, mtUser2Device, pOptions->GetDrawAnnots());
   }
@@ -90,8 +90,8 @@
 
 CPDFSDK_Annot* CPDFSDK_PageView::GetFXAnnotAtPoint(const CFX_PointF& point) {
   CPDFSDK_AnnotHandlerMgr* pAnnotMgr = m_pFormFillEnv->GetAnnotHandlerMgr();
-  CPDFSDK_AnnotIteration annotIteration(this, false);
-  for (const auto& pSDKAnnot : annotIteration) {
+  CPDFSDK_AnnotForwardIteration annot_iteration(this);
+  for (const auto& pSDKAnnot : annot_iteration) {
     CFX_FloatRect rc = pAnnotMgr->Annot_OnGetViewBBox(pSDKAnnot.Get());
     if (pSDKAnnot->GetAnnotSubtype() == CPDF_Annot::Subtype::POPUP)
       continue;
@@ -103,8 +103,8 @@
 
 CPDFSDK_Annot* CPDFSDK_PageView::GetFXWidgetAtPoint(const CFX_PointF& point) {
   CPDFSDK_AnnotHandlerMgr* pAnnotMgr = m_pFormFillEnv->GetAnnotHandlerMgr();
-  CPDFSDK_AnnotIteration annotIteration(this, false);
-  for (const auto& pSDKAnnot : annotIteration) {
+  CPDFSDK_AnnotForwardIteration annot_iteration(this);
+  for (const auto& pSDKAnnot : annot_iteration) {
     bool bHitTest = pSDKAnnot->GetAnnotSubtype() == CPDF_Annot::Subtype::WIDGET;
 #ifdef PDF_ENABLE_XFA
     bHitTest = bHitTest ||
diff --git a/fxjs/cjs_document.cpp b/fxjs/cjs_document.cpp
index 7777dda..a0bcf86 100644
--- a/fxjs/cjs_document.cpp
+++ b/fxjs/cjs_document.cpp
@@ -1025,9 +1025,9 @@
   if (!pPageView)
     return CJS_Result::Failure(JSMessage::kBadObjectError);
 
-  CPDFSDK_AnnotIteration annotIteration(pPageView, false);
+  CPDFSDK_AnnotForwardIteration annot_iteration(pPageView);
   CPDFSDK_BAAnnot* pSDKBAAnnot = nullptr;
-  for (const auto& pSDKAnnotCur : annotIteration) {
+  for (const auto& pSDKAnnotCur : annot_iteration) {
     auto* pBAAnnot = pSDKAnnotCur->AsBAAnnot();
     if (pBAAnnot && pBAAnnot->GetAnnotName() == swAnnotName) {
       pSDKBAAnnot = pBAAnnot;
@@ -1067,8 +1067,8 @@
     if (!pPageView)
       return CJS_Result::Failure(JSMessage::kBadObjectError);
 
-    CPDFSDK_AnnotIteration annotIteration(pPageView, false);
-    for (const auto& pSDKAnnotCur : annotIteration) {
+    CPDFSDK_AnnotForwardIteration annot_iteration(pPageView);
+    for (const auto& pSDKAnnotCur : annot_iteration) {
       if (!pSDKAnnotCur)
         return CJS_Result::Failure(JSMessage::kBadObjectError);