Use CFXA_Script subclass for scripts in XFA.

-- remove unused bool return value.

Change-Id: I705464bdf20e35a4815b4f7188f9d090afde2e34
Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/94031
Commit-Queue: Tom Sepez <tsepez@chromium.org>
Reviewed-by: Lei Zhang <thestig@chromium.org>
diff --git a/fxjs/xfa/cfxjse_engine.cpp b/fxjs/xfa/cfxjse_engine.cpp
index 8784a20..7a4e436 100644
--- a/fxjs/xfa/cfxjse_engine.cpp
+++ b/fxjs/xfa/cfxjse_engine.cpp
@@ -34,6 +34,7 @@
 #include "xfa/fxfa/parser/cxfa_node.h"
 #include "xfa/fxfa/parser/cxfa_object.h"
 #include "xfa/fxfa/parser/cxfa_thisproxy.h"
+#include "xfa/fxfa/parser/cxfa_variables.h"
 #include "xfa/fxfa/parser/xfa_basic_data.h"
 #include "xfa/fxfa/parser/xfa_utils.h"
 
@@ -319,7 +320,8 @@
   CXFA_Object* pScriptObject =
       pScriptContext->GetVariablesScript(pOriginalObject);
   if (pScriptObject && pScriptContext->QueryVariableValue(
-                           pScriptObject->AsNode(), szPropName, &pValue)) {
+                           CXFA_Script::FromNode(pScriptObject->AsNode()),
+                           szPropName, &pValue)) {
     return pValue;
   }
 
@@ -401,8 +403,9 @@
   if (!pScriptObject)
     return pReturnValue;
 
-  if (pScriptContext->QueryVariableValue(ToNode(pScriptObject), szPropName,
-                                         &pReturnValue)) {
+  if (pScriptContext->QueryVariableValue(
+          CXFA_Script::FromNode(pScriptObject->AsNode()), szPropName,
+          &pReturnValue)) {
     return pReturnValue;
   }
   absl::optional<XFA_SCRIPTATTRIBUTEINFO> info = XFA_GetScriptAttributeByName(
@@ -483,8 +486,8 @@
   CXFA_Object* pScriptObject =
       pScriptContext->GetVariablesScript(pOriginalObject);
   if (pScriptObject) {
-    pScriptContext->UpdateVariableValue(ToNode(pScriptObject), szPropName,
-                                        pValue);
+    pScriptContext->UpdateVariableValue(
+        CXFA_Script::FromNode(pScriptObject->AsNode()), szPropName, pValue);
   }
 }
 
@@ -546,7 +549,7 @@
   return !m_upObjectArray.empty() ? m_upObjectArray.back() : nullptr;
 }
 
-CFXJSE_Context* CFXJSE_Engine::CreateVariablesContext(CXFA_Node* pScriptNode,
+CFXJSE_Context* CFXJSE_Engine::CreateVariablesContext(CXFA_Script* pScriptNode,
                                                       CXFA_Node* pSubform) {
   if (!pScriptNode || !pSubform)
     return nullptr;
@@ -573,29 +576,26 @@
   return pProxy ? pProxy->GetScriptNode() : pObject;
 }
 
-bool CFXJSE_Engine::RunVariablesScript(CXFA_Node* pScriptNode) {
+void CFXJSE_Engine::RunVariablesScript(CXFA_Script* pScriptNode) {
   if (!pScriptNode)
-    return false;
+    return;
 
-  if (pScriptNode->GetElementType() != XFA_Element::Script)
-    return true;
-
-  CXFA_Node* pParent = pScriptNode->GetParent();
-  if (!pParent || pParent->GetElementType() != XFA_Element::Variables)
-    return false;
+  auto* pParent = CXFA_Variables::FromNode(pScriptNode->GetParent());
+  if (!pParent)
+    return;
 
   auto it = m_mapVariableToContext.find(pScriptNode->JSObject());
   if (it != m_mapVariableToContext.end() && it->second)
-    return true;
+    return;
 
   CXFA_Node* pTextNode = pScriptNode->GetFirstChild();
   if (!pTextNode)
-    return false;
+    return;
 
   absl::optional<WideString> wsScript =
       pTextNode->JSObject()->TryCData(XFA_Attribute::Value, true);
   if (!wsScript.has_value())
-    return false;
+    return;
 
   ByteString btScript = wsScript->ToUTF8();
   auto hRetValue = std::make_unique<CFXJSE_Value>();
@@ -604,26 +604,24 @@
       CreateVariablesContext(pScriptNode, pThisObject);
   AutoRestorer<cppgc::Persistent<CXFA_Object>> nodeRestorer(&m_pThisObject);
   m_pThisObject = pThisObject;
-  return pVariablesContext->ExecuteScript(
-      btScript.AsStringView(), hRetValue.get(), v8::Local<v8::Object>());
+  pVariablesContext->ExecuteScript(btScript.AsStringView(), hRetValue.get(),
+                                   v8::Local<v8::Object>());
 }
 
 CFXJSE_Context* CFXJSE_Engine::VariablesContextForScriptNode(
-    CXFA_Node* pScriptNode) {
-  if (!pScriptNode || pScriptNode->GetElementType() != XFA_Element::Script)
+    CXFA_Script* pScriptNode) {
+  if (!pScriptNode)
     return nullptr;
 
-  CXFA_Node* variablesNode = pScriptNode->GetParent();
-  if (!variablesNode ||
-      variablesNode->GetElementType() != XFA_Element::Variables) {
+  auto* variablesNode = CXFA_Variables::FromNode(pScriptNode->GetParent());
+  if (!variablesNode)
     return nullptr;
-  }
 
   auto it = m_mapVariableToContext.find(pScriptNode->JSObject());
   return it != m_mapVariableToContext.end() ? it->second.get() : nullptr;
 }
 
-bool CFXJSE_Engine::QueryVariableValue(CXFA_Node* pScriptNode,
+bool CFXJSE_Engine::QueryVariableValue(CXFA_Script* pScriptNode,
                                        ByteStringView szPropName,
                                        v8::Local<v8::Value>* pValue) {
   CFXJSE_Context* pVariableContext = VariablesContextForScriptNode(pScriptNode);
@@ -649,7 +647,7 @@
   return true;
 }
 
-bool CFXJSE_Engine::UpdateVariableValue(CXFA_Node* pScriptNode,
+bool CFXJSE_Engine::UpdateVariableValue(CXFA_Script* pScriptNode,
                                         ByteStringView szPropName,
                                         v8::Local<v8::Value> pValue) {
   CFXJSE_Context* pVariableContext = VariablesContextForScriptNode(pScriptNode);
@@ -859,8 +857,7 @@
 
 v8::Local<v8::Object> CFXJSE_Engine::GetOrCreateJSBindingFromMap(
     CXFA_Object* pObject) {
-  if (pObject->IsNode())
-    RunVariablesScript(pObject->AsNode());
+  RunVariablesScript(CXFA_Script::FromNode(pObject->AsNode()));
 
   CJX_Object* pCJXObject = pObject->JSObject();
   auto iter = m_mapObjectToObject.find(pCJXObject);
diff --git a/fxjs/xfa/cfxjse_engine.h b/fxjs/xfa/cfxjse_engine.h
index 21c0ff4..ce8108e 100644
--- a/fxjs/xfa/cfxjse_engine.h
+++ b/fxjs/xfa/cfxjse_engine.h
@@ -150,7 +150,7 @@
   bool IsResolvingNodes() const { return m_bResolvingNodes; }
 
  private:
-  CFXJSE_Context* CreateVariablesContext(CXFA_Node* pScriptNode,
+  CFXJSE_Context* CreateVariablesContext(CXFA_Script* pScriptNode,
                                          CXFA_Node* pSubform);
   void RemoveBuiltInObjs(CFXJSE_Context* pContext);
   bool QueryNodeByFlag(CXFA_Node* refNode,
@@ -164,14 +164,14 @@
   bool IsStrictScopeInJavaScript();
   CXFA_Object* GetVariablesThis(CXFA_Object* pObject);
   CXFA_Object* GetVariablesScript(CXFA_Object* pObject);
-  CFXJSE_Context* VariablesContextForScriptNode(CXFA_Node* pScriptNode);
-  bool QueryVariableValue(CXFA_Node* pScriptNode,
+  CFXJSE_Context* VariablesContextForScriptNode(CXFA_Script* pScriptNode);
+  bool QueryVariableValue(CXFA_Script* pScriptNode,
                           ByteStringView szPropName,
                           v8::Local<v8::Value>* pValue);
-  bool UpdateVariableValue(CXFA_Node* pScriptNode,
+  bool UpdateVariableValue(CXFA_Script* pScriptNode,
                            ByteStringView szPropName,
                            v8::Local<v8::Value> pValue);
-  bool RunVariablesScript(CXFA_Node* pScriptNode);
+  void RunVariablesScript(CXFA_Script* pScriptNode);
 
   UnownedPtr<CJS_Runtime> const m_pSubordinateRuntime;
   cppgc::WeakPersistent<CXFA_Document> const m_pDocument;
diff --git a/xfa/fxfa/parser/cxfa_script.cpp b/xfa/fxfa/parser/cxfa_script.cpp
index e5791ca..cc15761 100644
--- a/xfa/fxfa/parser/cxfa_script.cpp
+++ b/xfa/fxfa/parser/cxfa_script.cpp
@@ -32,6 +32,13 @@
 
 }  // namespace
 
+// static
+CXFA_Script* CXFA_Script::FromNode(CXFA_Node* pNode) {
+  return pNode && pNode->GetElementType() == XFA_Element::Script
+             ? static_cast<CXFA_Script*>(pNode)
+             : nullptr;
+}
+
 CXFA_Script::CXFA_Script(CXFA_Document* doc, XFA_PacketType packet)
     : CXFA_Node(doc,
                 packet,
diff --git a/xfa/fxfa/parser/cxfa_script.h b/xfa/fxfa/parser/cxfa_script.h
index 065a400..2eaa672 100644
--- a/xfa/fxfa/parser/cxfa_script.h
+++ b/xfa/fxfa/parser/cxfa_script.h
@@ -18,6 +18,8 @@
     Unknown,
   };
 
+  static CXFA_Script* FromNode(CXFA_Node* pNode);
+
   CONSTRUCT_VIA_MAKE_GARBAGE_COLLECTED;
   ~CXFA_Script() override;
 
diff --git a/xfa/fxfa/parser/cxfa_thisproxy.cpp b/xfa/fxfa/parser/cxfa_thisproxy.cpp
index b16d920..6b346b6 100644
--- a/xfa/fxfa/parser/cxfa_thisproxy.cpp
+++ b/xfa/fxfa/parser/cxfa_thisproxy.cpp
@@ -9,8 +9,9 @@
 #include "fxjs/xfa/cjx_object.h"
 #include "xfa/fxfa/parser/cxfa_document.h"
 #include "xfa/fxfa/parser/cxfa_node.h"
+#include "xfa/fxfa/parser/cxfa_script.h"
 
-CXFA_ThisProxy::CXFA_ThisProxy(CXFA_Node* pThisNode, CXFA_Node* pScriptNode)
+CXFA_ThisProxy::CXFA_ThisProxy(CXFA_Node* pThisNode, CXFA_Script* pScriptNode)
     : CXFA_Object(
           pThisNode->GetDocument(),
           XFA_ObjectType::ThisProxy,
diff --git a/xfa/fxfa/parser/cxfa_thisproxy.h b/xfa/fxfa/parser/cxfa_thisproxy.h
index 86f595a..e21e214 100644
--- a/xfa/fxfa/parser/cxfa_thisproxy.h
+++ b/xfa/fxfa/parser/cxfa_thisproxy.h
@@ -12,6 +12,7 @@
 #include "xfa/fxfa/parser/cxfa_object.h"
 
 class CXFA_Node;
+class CXFA_Script;
 
 class CXFA_ThisProxy final : public CXFA_Object {
  public:
@@ -21,13 +22,13 @@
   void Trace(cppgc::Visitor* visitor) const override;
 
   CXFA_Node* GetThisNode() const { return m_pThisNode.Get(); }
-  CXFA_Node* GetScriptNode() const { return m_pScriptNode.Get(); }
+  CXFA_Script* GetScriptNode() const { return m_pScriptNode.Get(); }
 
  private:
-  CXFA_ThisProxy(CXFA_Node* pThisNode, CXFA_Node* pScriptNode);
+  CXFA_ThisProxy(CXFA_Node* pThisNode, CXFA_Script* pScriptNode);
 
   cppgc::Member<CXFA_Node> m_pThisNode;
-  cppgc::Member<CXFA_Node> m_pScriptNode;
+  cppgc::Member<CXFA_Script> m_pScriptNode;
 };
 
 #endif  // XFA_FXFA_PARSER_CXFA_THISPROXY_H_
diff --git a/xfa/fxfa/parser/cxfa_variables.cpp b/xfa/fxfa/parser/cxfa_variables.cpp
index 855b430..db912e3 100644
--- a/xfa/fxfa/parser/cxfa_variables.cpp
+++ b/xfa/fxfa/parser/cxfa_variables.cpp
@@ -19,6 +19,13 @@
 
 }  // namespace
 
+// static
+CXFA_Variables* CXFA_Variables::FromNode(CXFA_Node* pNode) {
+  return pNode && pNode->GetElementType() == XFA_Element::Variables
+             ? static_cast<CXFA_Variables*>(pNode)
+             : nullptr;
+}
+
 CXFA_Variables::CXFA_Variables(CXFA_Document* doc, XFA_PacketType packet)
     : CXFA_Node(doc,
                 packet,
diff --git a/xfa/fxfa/parser/cxfa_variables.h b/xfa/fxfa/parser/cxfa_variables.h
index 67ea571..72a3492 100644
--- a/xfa/fxfa/parser/cxfa_variables.h
+++ b/xfa/fxfa/parser/cxfa_variables.h
@@ -11,6 +11,8 @@
 
 class CXFA_Variables final : public CXFA_Node {
  public:
+  static CXFA_Variables* FromNode(CXFA_Node* pNode);
+
   CONSTRUCT_VIA_MAKE_GARBAGE_COLLECTED;
   ~CXFA_Variables() override;