Remove CXFA_Document::HasFlag() and SetFlag().

Also remove |CXFA_Document::m_dwDocFlags| and enum XFA_DocFlag. Replace
them with equivalent bools or Optional<bool>, and add trivial
getters/setters as needed.

Fix nits in CXFA_Node and CXFA_DocumentParserTest along the way.

Change-Id: I76f76a40736362ea07ba7b059be12325dcd6cd93
Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/59133
Reviewed-by: Tom Sepez <tsepez@chromium.org>
Commit-Queue: Lei Zhang <thestig@chromium.org>
diff --git a/fxjs/xfa/cfxjse_engine.cpp b/fxjs/xfa/cfxjse_engine.cpp
index e4675fd..8dafcb3 100644
--- a/fxjs/xfa/cfxjse_engine.cpp
+++ b/fxjs/xfa/cfxjse_engine.cpp
@@ -460,7 +460,7 @@
 }
 
 bool CFXJSE_Engine::IsStrictScopeInJavaScript() {
-  return m_pDocument->HasFlag(XFA_DOCFLAG_StrictScoping);
+  return m_pDocument->is_strict_scoping();
 }
 
 CXFA_Script::Type CFXJSE_Engine::GetType() {
diff --git a/xfa/fxfa/parser/cxfa_document.cpp b/xfa/fxfa/parser/cxfa_document.cpp
index 0626909..4212c1a 100644
--- a/xfa/fxfa/parser/cxfa_document.cpp
+++ b/xfa/fxfa/parser/cxfa_document.cpp
@@ -1376,16 +1376,9 @@
   return AddOwnedNode(CXFA_Node::Create(this, eElement, packet));
 }
 
-void CXFA_Document::SetFlag(uint32_t dwFlag, bool bOn) {
-  if (bOn)
-    m_dwDocFlags |= dwFlag;
-  else
-    m_dwDocFlags &= ~dwFlag;
-}
-
 bool CXFA_Document::IsInteractive() {
-  if (m_dwDocFlags & XFA_DOCFLAG_HasInteractive)
-    return !!(m_dwDocFlags & XFA_DOCFLAG_Interactive);
+  if (m_Interactive.has_value())
+    return m_Interactive.value();
 
   CXFA_Node* pConfig = ToNode(GetXFAObject(XFA_HASHCODE_Config));
   if (!pConfig)
@@ -1402,16 +1395,13 @@
 
   CXFA_Interactive* pFormFiller =
       pPDF->GetChild<CXFA_Interactive>(0, XFA_Element::Interactive, false);
-  if (pFormFiller) {
-    m_dwDocFlags |= XFA_DOCFLAG_HasInteractive;
+  if (!pFormFiller)
+    return false;
 
-    WideString wsInteractive = pFormFiller->JSObject()->GetContent(false);
-    if (wsInteractive.EqualsASCII("1")) {
-      m_dwDocFlags |= XFA_DOCFLAG_Interactive;
-      return true;
-    }
-  }
-  return false;
+  WideString wsInteractive = pFormFiller->JSObject()->GetContent(false);
+  bool bInteractive = wsInteractive.EqualsASCII("1");
+  m_Interactive = bInteractive;
+  return bInteractive;
 }
 
 CXFA_LocaleMgr* CXFA_Document::GetLocaleMgr() {
diff --git a/xfa/fxfa/parser/cxfa_document.h b/xfa/fxfa/parser/cxfa_document.h
index ca40234..878284c 100644
--- a/xfa/fxfa/parser/cxfa_document.h
+++ b/xfa/fxfa/parser/cxfa_document.h
@@ -12,6 +12,7 @@
 #include <vector>
 
 #include "core/fxcrt/unowned_ptr.h"
+#include "third_party/base/optional.h"
 #include "xfa/fxfa/fxfa.h"
 #include "xfa/fxfa/parser/cxfa_localemgr.h"
 #include "xfa/fxfa/parser/cxfa_nodeowner.h"
@@ -34,13 +35,6 @@
   XFA_VERSION_MAX = 400,
 };
 
-enum XFA_DocFlag {
-  XFA_DOCFLAG_StrictScoping = 0x0001,
-  XFA_DOCFLAG_HasInteractive = 0x0002,
-  XFA_DOCFLAG_Interactive = 0x0004,
-  XFA_DOCFLAG_Scripting = 0x0008
-};
-
 class CFXJSE_Engine;
 class CJS_Runtime;
 class CScript_DataWindow;
@@ -95,10 +89,11 @@
   CXFA_Node* GetRoot() const { return m_pRootNode; }
   void SetRoot(CXFA_Node* pNewRoot) { m_pRootNode = pNewRoot; }
 
-  bool HasFlag(uint32_t dwFlag) const {
-    return (m_dwDocFlags & dwFlag) == dwFlag;
-  }
-  void SetFlag(uint32_t dwFlag, bool bOn);
+  bool is_strict_scoping() const { return m_bStrictScoping; }
+  void set_is_strict_scoping() { m_bStrictScoping = true; }
+
+  bool is_scripting() const { return m_bScripting; }
+  void set_is_scripting() { m_bScripting = true; }
 
   bool IsInteractive();
   XFA_VERSION GetCurVersionMode() { return m_eCurVersionMode; }
@@ -140,7 +135,9 @@
   std::unique_ptr<CScript_LayoutPseudoModel> m_pScriptLayout;
   std::unique_ptr<CScript_SignaturePseudoModel> m_pScriptSignature;
   XFA_VERSION m_eCurVersionMode = XFA_VERSION_DEFAULT;
-  uint32_t m_dwDocFlags = 0;
+  Optional<bool> m_Interactive;
+  bool m_bStrictScoping = false;
+  bool m_bScripting = false;
 };
 
 #endif  // XFA_FXFA_PARSER_CXFA_DOCUMENT_H_
diff --git a/xfa/fxfa/parser/cxfa_document_parser.cpp b/xfa/fxfa/parser/cxfa_document_parser.cpp
index da3cfce..b141f7d 100644
--- a/xfa/fxfa/parser/cxfa_document_parser.cpp
+++ b/xfa/fxfa/parser/cxfa_document_parser.cpp
@@ -1028,14 +1028,14 @@
         (pXFANode->GetDocument()->RecognizeXFAVersionNumber(target_data[0]) !=
          XFA_VERSION_UNKNOWN) &&
         target_data[1].EqualsASCII("v2.7-scripting:1")) {
-      pXFANode->GetDocument()->SetFlag(XFA_DOCFLAG_Scripting, true);
+      pXFANode->GetDocument()->set_is_scripting();
     }
     return;
   }
   if (pXMLInstruction->IsAcrobat()) {
     if (target_data.size() > 1 && target_data[0].EqualsASCII("JavaScript") &&
         target_data[1].EqualsASCII("strictScoping")) {
-      pXFANode->GetDocument()->SetFlag(XFA_DOCFLAG_StrictScoping, true);
+      pXFANode->GetDocument()->set_is_strict_scoping();
     }
   }
 }
diff --git a/xfa/fxfa/parser/cxfa_document_parser_unittest.cpp b/xfa/fxfa/parser/cxfa_document_parser_unittest.cpp
index 29127a0..625473a 100644
--- a/xfa/fxfa/parser/cxfa_document_parser_unittest.cpp
+++ b/xfa/fxfa/parser/cxfa_document_parser_unittest.cpp
@@ -33,92 +33,92 @@
 };
 
 TEST_F(CXFA_DocumentParserTest, XMLInstructionsScriptOff) {
-  static const char input[] =
+  static const char kInput[] =
       "<config>\n"
       "<?originalXFAVersion http://www.xfa.org/schema/xfa-template/2.7 "
       "v2.7-scripting:0 ?>\n"
       "</config>";
-  EXPECT_FALSE(GetDoc()->HasFlag(XFA_DOCFLAG_Scripting));
+  EXPECT_FALSE(GetDoc()->is_scripting());
 
   auto stream = pdfium::MakeRetain<CFX_ReadOnlyMemoryStream>(
-      pdfium::as_bytes(pdfium::make_span(input)));
+      pdfium::as_bytes(pdfium::make_span(kInput)));
   ASSERT_TRUE(GetParser()->Parse(stream, XFA_PacketType::Config));
 
   CXFA_Node* root = GetParser()->GetRootNode();
-  ASSERT_TRUE(root != nullptr);
-  EXPECT_FALSE(GetDoc()->HasFlag(XFA_DOCFLAG_Scripting));
+  ASSERT_TRUE(root);
+  EXPECT_FALSE(GetDoc()->is_scripting());
 }
 
 TEST_F(CXFA_DocumentParserTest, XMLInstructionsScriptOn) {
-  static const char input[] =
+  static const char kInput[] =
       "<config>\n"
       "<?originalXFAVersion http://www.xfa.org/schema/xfa-template/2.7 "
       "v2.7-scripting:1 ?>\n"
       "</config>";
 
-  EXPECT_FALSE(GetDoc()->HasFlag(XFA_DOCFLAG_Scripting));
+  EXPECT_FALSE(GetDoc()->is_scripting());
 
   auto stream = pdfium::MakeRetain<CFX_ReadOnlyMemoryStream>(
-      pdfium::as_bytes(pdfium::make_span(input)));
+      pdfium::as_bytes(pdfium::make_span(kInput)));
   ASSERT_TRUE(GetParser()->Parse(stream, XFA_PacketType::Config));
 
   CXFA_Node* root = GetParser()->GetRootNode();
-  ASSERT_TRUE(root != nullptr);
-  EXPECT_TRUE(GetDoc()->HasFlag(XFA_DOCFLAG_Scripting));
+  ASSERT_TRUE(root);
+  EXPECT_TRUE(GetDoc()->is_scripting());
 }
 
 TEST_F(CXFA_DocumentParserTest, XMLInstructionsStrictScope) {
-  static const char input[] =
+  static const char kInput[] =
       "<config>"
       "<?acrobat JavaScript strictScoping ?>\n"
       "</config>";
 
-  EXPECT_FALSE(GetDoc()->HasFlag(XFA_DOCFLAG_StrictScoping));
+  EXPECT_FALSE(GetDoc()->is_strict_scoping());
 
   auto stream = pdfium::MakeRetain<CFX_ReadOnlyMemoryStream>(
-      pdfium::as_bytes(pdfium::make_span(input)));
+      pdfium::as_bytes(pdfium::make_span(kInput)));
   ASSERT_TRUE(GetParser()->Parse(stream, XFA_PacketType::Config));
 
   CXFA_Node* root = GetParser()->GetRootNode();
-  ASSERT_TRUE(root != nullptr);
-  EXPECT_TRUE(GetDoc()->HasFlag(XFA_DOCFLAG_StrictScoping));
+  ASSERT_TRUE(root);
+  EXPECT_TRUE(GetDoc()->is_strict_scoping());
 }
 
 TEST_F(CXFA_DocumentParserTest, XMLInstructionsStrictScopeBad) {
-  static const char input[] =
+  static const char kInput[] =
       "<config>"
       "<?acrobat JavaScript otherScoping ?>\n"
       "</config>";
 
-  EXPECT_FALSE(GetDoc()->HasFlag(XFA_DOCFLAG_StrictScoping));
+  EXPECT_FALSE(GetDoc()->is_strict_scoping());
 
   auto stream = pdfium::MakeRetain<CFX_ReadOnlyMemoryStream>(
-      pdfium::as_bytes(pdfium::make_span(input)));
+      pdfium::as_bytes(pdfium::make_span(kInput)));
   ASSERT_TRUE(GetParser()->Parse(stream, XFA_PacketType::Config));
 
   CXFA_Node* root = GetParser()->GetRootNode();
-  ASSERT_TRUE(root != nullptr);
-  EXPECT_FALSE(GetDoc()->HasFlag(XFA_DOCFLAG_StrictScoping));
+  ASSERT_TRUE(root);
+  EXPECT_FALSE(GetDoc()->is_strict_scoping());
 }
 
 TEST_F(CXFA_DocumentParserTest, MultipleXMLInstructions) {
-  static const char input[] =
+  static const char kInput[] =
       "<config>"
       "<?originalXFAVersion http://www.xfa.org/schema/xfa-template/2.7 "
       "v2.7-scripting:1 ?>\n"
       "<?acrobat JavaScript strictScoping ?>\n"
       "</config>";
 
-  EXPECT_FALSE(GetDoc()->HasFlag(XFA_DOCFLAG_Scripting));
-  EXPECT_FALSE(GetDoc()->HasFlag(XFA_DOCFLAG_StrictScoping));
+  EXPECT_FALSE(GetDoc()->is_scripting());
+  EXPECT_FALSE(GetDoc()->is_strict_scoping());
 
   auto stream = pdfium::MakeRetain<CFX_ReadOnlyMemoryStream>(
-      pdfium::as_bytes(pdfium::make_span(input)));
+      pdfium::as_bytes(pdfium::make_span(kInput)));
   ASSERT_TRUE(GetParser()->Parse(stream, XFA_PacketType::Config));
 
   CXFA_Node* root = GetParser()->GetRootNode();
-  ASSERT_TRUE(root != nullptr);
+  ASSERT_TRUE(root);
 
-  EXPECT_TRUE(GetDoc()->HasFlag(XFA_DOCFLAG_Scripting));
-  EXPECT_TRUE(GetDoc()->HasFlag(XFA_DOCFLAG_StrictScoping));
+  EXPECT_TRUE(GetDoc()->is_scripting());
+  EXPECT_TRUE(GetDoc()->is_strict_scoping());
 }
diff --git a/xfa/fxfa/parser/cxfa_node.cpp b/xfa/fxfa/parser/cxfa_node.cpp
index 465f786..59d5b73 100644
--- a/xfa/fxfa/parser/cxfa_node.cpp
+++ b/xfa/fxfa/parser/cxfa_node.cpp
@@ -2599,18 +2599,14 @@
   }
 
   XFA_VERSION version = pDocView->GetDoc()->GetXFADoc()->GetCurVersionMode();
-  bool bVersionFlag = false;
-  if (version < XFA_VERSION_208)
-    bVersionFlag = true;
+  bool bVersionFlag = version < XFA_VERSION_208;
 
   if (bInitDoc) {
     validate->ClearFlag(XFA_NodeFlag_NeedsInitApp);
   } else {
     iFormat = ProcessFormatTestValidate(pDocView, validate, bVersionFlag);
-    if (!bVersionFlag) {
-      bVersionFlag =
-          pDocView->GetDoc()->GetXFADoc()->HasFlag(XFA_DOCFLAG_Scripting);
-    }
+    if (!bVersionFlag)
+      bVersionFlag = pDocView->GetDoc()->GetXFADoc()->is_scripting();
     XFA_EventErrorAccumulate(
         &iRet,
         ProcessNullTestValidate(pDocView, validate, iFlags, bVersionFlag));