// Copyright 2014 PDFium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

#include "xfa/fxfa/cxfa_ffdochandler.h"

#include "core/fxcrt/cfx_checksumcontext.h"
#include "fxjs/cfxjse_engine.h"
#include "xfa/fxfa/cxfa_ffdoc.h"
#include "xfa/fxfa/parser/cxfa_node.h"
#include "xfa/fxfa/parser/xfa_resolvenode_rs.h"

CXFA_FFDocHandler::CXFA_FFDocHandler() {}

CXFA_FFDocHandler::~CXFA_FFDocHandler() {}

CFXJSE_Value* CXFA_FFDocHandler::GetXFAScriptObject(CXFA_FFDoc* hDoc) {
  CXFA_Document* pXFADoc = hDoc->GetXFADoc();
  if (!pXFADoc)
    return nullptr;

  CFXJSE_Engine* pScriptContext = pXFADoc->GetScriptContext();
  if (!pScriptContext)
    return nullptr;
  return pScriptContext->GetJSValueFromMap(pXFADoc->GetRoot());
}

XFA_ATTRIBUTEENUM CXFA_FFDocHandler::GetRestoreState(CXFA_FFDoc* hDoc) {
  CXFA_Document* pXFADoc = hDoc->GetXFADoc();
  if (!pXFADoc)
    return XFA_ATTRIBUTEENUM_Unknown;

  CXFA_Node* pForm = ToNode(pXFADoc->GetXFAObject(XFA_HASHCODE_Form));
  if (!pForm)
    return XFA_ATTRIBUTEENUM_Unknown;

  CXFA_Node* pSubForm = pForm->GetFirstChildByClass(XFA_Element::Subform);
  if (!pSubForm)
    return XFA_ATTRIBUTEENUM_Unknown;
  return pSubForm->JSNode()->GetEnum(XFA_ATTRIBUTE_RestoreState);
}

bool CXFA_FFDocHandler::RunDocScript(CXFA_FFDoc* hDoc,
                                     XFA_SCRIPTTYPE eScriptType,
                                     const WideStringView& wsScript,
                                     CFXJSE_Value* pRetValue,
                                     CFXJSE_Value* pThisValue) {
  CXFA_Document* pXFADoc = hDoc->GetXFADoc();
  if (!pXFADoc)
    return false;

  CFXJSE_Engine* pScriptContext = pXFADoc->GetScriptContext();
  if (!pScriptContext)
    return false;

  return pScriptContext->RunScript(
      (XFA_SCRIPTLANGTYPE)eScriptType, wsScript, pRetValue,
      pThisValue ? CFXJSE_Engine::ToObject(pThisValue, nullptr) : nullptr);
}
