Split CFXJSE_Engine::QueryNodeByFlag() into Query/Update.

-- Remove out parameter from update method.
-- Keep out parameter in query method due to subtle return convention.
-- Don't make unused bindings for no-op update of nodes.
-- Remove some needless locals.

Change-Id: I569b6f0b3e74761347777a93151fdbcf267e0cdd
Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/81090
Reviewed-by: Lei Zhang <thestig@chromium.org>
Commit-Queue: Tom Sepez <tsepez@chromium.org>
diff --git a/fxjs/xfa/cfxjse_engine.cpp b/fxjs/xfa/cfxjse_engine.cpp
index fc5f118..8e04bb8 100644
--- a/fxjs/xfa/cfxjse_engine.cpp
+++ b/fxjs/xfa/cfxjse_engine.cpp
@@ -181,8 +181,7 @@
 bool CFXJSE_Engine::QueryNodeByFlag(CXFA_Node* refNode,
                                     WideStringView propname,
                                     v8::Local<v8::Value>* pValue,
-                                    XFA_ResolveNodeMask dwFlag,
-                                    bool bSetting) {
+                                    XFA_ResolveNodeMask dwFlag) {
   if (!refNode)
     return false;
 
@@ -200,7 +199,29 @@
       maybeResult.value().script_attribute.callback) {
     CJX_Object* jsObject = maybeResult.value().objects.front()->JSObject();
     (*maybeResult.value().script_attribute.callback)(
-        GetIsolate(), jsObject, pValue, bSetting,
+        GetIsolate(), jsObject, pValue, false,
+        maybeResult.value().script_attribute.attribute);
+  }
+  return true;
+}
+
+bool CFXJSE_Engine::UpdateNodeByFlag(CXFA_Node* refNode,
+                                     WideStringView propname,
+                                     v8::Local<v8::Value> pValue,
+                                     XFA_ResolveNodeMask dwFlag) {
+  if (!refNode)
+    return false;
+
+  Optional<CFXJSE_Engine::ResolveResult> maybeResult =
+      ResolveObjects(refNode, propname, dwFlag);
+  if (!maybeResult.has_value())
+    return false;
+
+  if (maybeResult.value().type == ResolveResult::Type::kAttribute &&
+      maybeResult.value().script_attribute.callback) {
+    CJX_Object* jsObject = maybeResult.value().objects.front()->JSObject();
+    (*maybeResult.value().script_attribute.callback)(
+        GetIsolate(), jsObject, &pValue, true,
         maybeResult.value().script_attribute.attribute);
   }
   return true;
@@ -219,12 +240,11 @@
     pRefNode = ToNode(lpScriptContext->GetVariablesThis(lpOrginalNode));
 
   WideString wsPropName = WideString::FromUTF8(szPropName);
-  if (lpScriptContext->QueryNodeByFlag(
-          pRefNode, wsPropName.AsStringView(), &pValue,
+  if (lpScriptContext->UpdateNodeByFlag(
+          pRefNode, wsPropName.AsStringView(), pValue,
           XFA_RESOLVENODE_Parent | XFA_RESOLVENODE_Siblings |
               XFA_RESOLVENODE_Children | XFA_RESOLVENODE_Properties |
-              XFA_RESOLVENODE_Attributes,
-          true)) {
+              XFA_RESOLVENODE_Attributes)) {
     return;
   }
   if (lpOrginalNode->IsThisProxy() && fxv8::IsUndefined(pValue)) {
@@ -273,19 +293,18 @@
   }
 
   CXFA_Node* pRefNode = ToNode(lpScriptContext->GetThisObject());
-  if (pOriginalObject->IsThisProxy()) {
+  if (pOriginalObject->IsThisProxy())
     pRefNode = ToNode(lpScriptContext->GetVariablesThis(pOriginalObject));
-  }
+
   if (lpScriptContext->QueryNodeByFlag(
           pRefNode, wsPropName.AsStringView(), &pValue,
           XFA_RESOLVENODE_Children | XFA_RESOLVENODE_Properties |
-              XFA_RESOLVENODE_Attributes,
-          false)) {
+              XFA_RESOLVENODE_Attributes)) {
     return pValue;
   }
   if (lpScriptContext->QueryNodeByFlag(
           pRefNode, wsPropName.AsStringView(), &pValue,
-          XFA_RESOLVENODE_Parent | XFA_RESOLVENODE_Siblings, false)) {
+          XFA_RESOLVENODE_Parent | XFA_RESOLVENODE_Siblings)) {
     return pValue;
   }
 
@@ -351,40 +370,36 @@
 
   v8::Local<v8::Value> pReturnValue = fxv8::NewUndefinedHelper(pIsolate);
   CXFA_Object* pObject = lpScriptContext->GetVariablesThis(pOriginalObject);
-  bool bRet = lpScriptContext->QueryNodeByFlag(
-      ToNode(pObject), wsPropName.AsStringView(), &pReturnValue,
-      XFA_RESOLVENODE_Children | XFA_RESOLVENODE_Properties |
-          XFA_RESOLVENODE_Attributes,
-      false);
-  if (bRet)
+  CXFA_Node* pRefNode = ToNode(pObject);
+  if (lpScriptContext->QueryNodeByFlag(
+          pRefNode, wsPropName.AsStringView(), &pReturnValue,
+          XFA_RESOLVENODE_Children | XFA_RESOLVENODE_Properties |
+              XFA_RESOLVENODE_Attributes)) {
     return pReturnValue;
-
+  }
   if (pObject == lpScriptContext->GetThisObject() ||
       (lpScriptContext->GetType() == CXFA_Script::Type::Javascript &&
        !lpScriptContext->IsStrictScopeInJavaScript())) {
-    bRet = lpScriptContext->QueryNodeByFlag(
-        ToNode(pObject), wsPropName.AsStringView(), &pReturnValue,
-        XFA_RESOLVENODE_Parent | XFA_RESOLVENODE_Siblings, false);
+    if (lpScriptContext->QueryNodeByFlag(
+            pRefNode, wsPropName.AsStringView(), &pReturnValue,
+            XFA_RESOLVENODE_Parent | XFA_RESOLVENODE_Siblings)) {
+      return pReturnValue;
+    }
   }
-  if (bRet)
-    return pReturnValue;
-
   CXFA_Object* pScriptObject =
       lpScriptContext->GetVariablesScript(pOriginalObject);
   if (!pScriptObject)
     return pReturnValue;
 
-  bRet = lpScriptContext->QueryVariableValue(ToNode(pScriptObject), szPropName,
-                                             &pReturnValue, true);
-  if (bRet)
+  if (lpScriptContext->QueryVariableValue(ToNode(pScriptObject), szPropName,
+                                          &pReturnValue, true)) {
     return pReturnValue;
-
+  }
   Optional<XFA_SCRIPTATTRIBUTEINFO> info = XFA_GetScriptAttributeByName(
       pObject->GetElementType(), wsPropName.AsStringView());
   if (info.has_value()) {
-    CJX_Object* jsObject = pObject->JSObject();
-    (*info.value().callback)(pIsolate, jsObject, &pReturnValue, false,
-                             info.value().attribute);
+    (*info.value().callback)(pIsolate, pObject->JSObject(), &pReturnValue,
+                             false, info.value().attribute);
     return pReturnValue;
   }
 
diff --git a/fxjs/xfa/cfxjse_engine.h b/fxjs/xfa/cfxjse_engine.h
index 73e7c55..65707b3 100644
--- a/fxjs/xfa/cfxjse_engine.h
+++ b/fxjs/xfa/cfxjse_engine.h
@@ -152,8 +152,11 @@
   bool QueryNodeByFlag(CXFA_Node* refNode,
                        WideStringView propname,
                        v8::Local<v8::Value>* pValue,
-                       XFA_ResolveNodeMask dwFlag,
-                       bool bSetting);
+                       XFA_ResolveNodeMask dwFlag);
+  bool UpdateNodeByFlag(CXFA_Node* refNode,
+                        WideStringView propname,
+                        v8::Local<v8::Value> pValue,
+                        XFA_ResolveNodeMask dwFlag);
   bool IsStrictScopeInJavaScript();
   CXFA_Object* GetVariablesThis(CXFA_Object* pObject);
   CXFA_Object* GetVariablesScript(CXFA_Object* pObject);