Make ReportUnsupportedXFA() more efficient.

ReportUnsupportedXFA() instantiates a CPDF_InteractiveForm, which can be
expensive, just to read some dictionary values. Replace this with a
simple DocHasXFA() function to do just that efficiently. Also remove
CPDF_InteractiveForm::HasXFAForm(), which now has no callers.

Change-Id: I12cb30edeb4b3ed06896e39486a391f660dcd461
Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/67010
Commit-Queue: dsinclair <dsinclair@chromium.org>
Reviewed-by: dsinclair <dsinclair@chromium.org>
diff --git a/core/fpdfdoc/cpdf_interactiveform.cpp b/core/fpdfdoc/cpdf_interactiveform.cpp
index a4a1025..8d1267b 100644
--- a/core/fpdfdoc/cpdf_interactiveform.cpp
+++ b/core/fpdfdoc/cpdf_interactiveform.cpp
@@ -874,10 +874,6 @@
   }
 }
 
-bool CPDF_InteractiveForm::HasXFAForm() const {
-  return m_pFormDict && m_pFormDict->GetArrayFor("XFA");
-}
-
 void CPDF_InteractiveForm::FixPageFields(CPDF_Page* pPage) {
   CPDF_Array* pAnnots = pPage->GetDict()->GetArrayFor("Annots");
   if (!pAnnots)
diff --git a/core/fpdfdoc/cpdf_interactiveform.h b/core/fpdfdoc/cpdf_interactiveform.h
index 7d1f6c2..eaf7fba 100644
--- a/core/fpdfdoc/cpdf_interactiveform.h
+++ b/core/fpdfdoc/cpdf_interactiveform.h
@@ -99,7 +99,6 @@
                  NotificationOption notify);
 
   void SetNotifierIface(NotifierIface* pNotify);
-  bool HasXFAForm() const;
   void FixPageFields(CPDF_Page* pPage);
 
   NotifierIface* GetFormNotify() const { return m_pFormNotify.Get(); }
diff --git a/fpdfsdk/cpdfsdk_helpers.cpp b/fpdfsdk/cpdfsdk_helpers.cpp
index 4a1f5b1..f534cf7 100644
--- a/fpdfsdk/cpdfsdk_helpers.cpp
+++ b/fpdfsdk/cpdfsdk_helpers.cpp
@@ -37,6 +37,16 @@
   return true;
 }
 
+// Use the existence of the XFA array as a signal for XFA forms.
+bool DocHasXFA(const CPDF_Document* doc) {
+  const CPDF_Dictionary* root = doc->GetRoot();
+  if (!root)
+    return false;
+
+  const CPDF_Dictionary* form = root->GetDictFor("AcroForm");
+  return form && form->GetArrayFor("XFA");
+}
+
 unsigned long GetStreamMaybeCopyAndReturnLengthImpl(const CPDF_Stream* stream,
                                                     void* buffer,
                                                     unsigned long buflen,
@@ -360,9 +370,8 @@
   }
 }
 
-void ReportUnsupportedXFA(CPDF_Document* pDoc) {
-  // XFA Forms
-  if (!pDoc->GetExtension() && CPDF_InteractiveForm(pDoc).HasXFAForm())
+void ReportUnsupportedXFA(const CPDF_Document* pDoc) {
+  if (!pDoc->GetExtension() && DocHasXFA(pDoc))
     RaiseUnsupportedError(FPDF_UNSP_DOC_XFAFORM);
 }
 
diff --git a/fpdfsdk/cpdfsdk_helpers.h b/fpdfsdk/cpdfsdk_helpers.h
index 66c47f5..51558fe 100644
--- a/fpdfsdk/cpdfsdk_helpers.h
+++ b/fpdfsdk/cpdfsdk_helpers.h
@@ -263,7 +263,7 @@
 
 void SetPDFUnsupportInfo(UNSUPPORT_INFO* unsp_info);
 void ReportUnsupportedFeatures(CPDF_Document* pDoc);
-void ReportUnsupportedXFA(CPDF_Document* pDoc);
+void ReportUnsupportedXFA(const CPDF_Document* pDoc);
 void CheckForUnsupportedAnnot(const CPDF_Annot* pAnnot);
 void ProcessParseError(CPDF_Parser::Error err);