14d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// Copyright 2014 PDFium Authors. All rights reserved.
24d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// Use of this source code is governed by a BSD-style license that can be
34d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// found in the LICENSE file.
44d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
54d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
64d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
74d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#ifndef XFA_FXFA_PARSER_CXFA_SCRIPTCONTEXT_H_
84d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#define XFA_FXFA_PARSER_CXFA_SCRIPTCONTEXT_H_
94d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include <map>
114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include <memory>
124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include <vector>
134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "fxjs/cfxjse_arguments.h"
154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "xfa/fxfa/cxfa_eventparam.h"
164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "xfa/fxfa/fm2js/xfa_fm2jscontext.h"
174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "xfa/fxfa/parser/cxfa_document.h"
184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "xfa/fxfa/parser/xfa_resolvenode_rs.h"
194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#define XFA_RESOLVENODE_TagName 0x0002
214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannclass CXFA_ResolveProcessor;
234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannclass CXFA_ScriptContext {
254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann public:
264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  explicit CXFA_ScriptContext(CXFA_Document* pDocument);
274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  ~CXFA_ScriptContext();
284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  void Initialize(v8::Isolate* pIsolate);
304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  void SetEventParam(CXFA_EventParam param) { m_eventParam = param; }
314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CXFA_EventParam* GetEventParam() { return &m_eventParam; }
324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  bool RunScript(XFA_SCRIPTLANGTYPE eScriptType,
334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                 const CFX_WideStringC& wsScript,
344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                 CFXJSE_Value* pRetValue,
354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                 CXFA_Object* pThisObject = nullptr);
364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  int32_t ResolveObjects(CXFA_Object* refNode,
384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                         const CFX_WideStringC& wsExpression,
394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                         XFA_RESOLVENODE_RS& resolveNodeRS,
404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                         uint32_t dwStyles = XFA_RESOLVENODE_Children,
414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                         CXFA_Node* bindNode = nullptr);
424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CFXJSE_Value* GetJSValueFromMap(CXFA_Object* pObject);
434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  void AddToCacheList(std::unique_ptr<CXFA_NodeList> pList);
444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CXFA_Object* GetThisObject() const { return m_pThisObject; }
454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  v8::Isolate* GetRuntime() const { return m_pIsolate; }
464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  int32_t GetIndexByName(CXFA_Node* refNode);
484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  int32_t GetIndexByClassName(CXFA_Node* refNode);
494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  void GetSomExpression(CXFA_Node* refNode, CFX_WideString& wsExpression);
504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  void SetNodesOfRunScript(CXFA_NodeArray* pArray);
524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  void AddNodesOfRunScript(const CXFA_NodeArray& nodes);
534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  void AddNodesOfRunScript(CXFA_Node* pNode);
544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CFXJSE_Class* GetJseNormalClass();
554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  void SetRunAtType(XFA_ATTRIBUTEENUM eRunAt) { m_eRunAtType = eRunAt; }
574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  bool IsRunAtClient() { return m_eRunAtType != XFA_ATTRIBUTEENUM_Server; }
584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  bool QueryNodeByFlag(CXFA_Node* refNode,
594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                       const CFX_WideStringC& propname,
604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                       CFXJSE_Value* pValue,
614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                       uint32_t dwFlag,
624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                       bool bSetting);
634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  bool QueryVariableValue(CXFA_Node* pScriptNode,
644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                          const CFX_ByteStringC& szPropName,
654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                          CFXJSE_Value* pValue,
664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                          bool bGetter);
674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  bool QueryBuiltinValue(const CFX_ByteStringC& szPropName,
684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                         CFXJSE_Value* pValue);
694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  static void GlobalPropertyGetter(CFXJSE_Value* pObject,
704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                   const CFX_ByteStringC& szPropName,
714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                   CFXJSE_Value* pValue);
724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  static void GlobalPropertySetter(CFXJSE_Value* pObject,
734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                   const CFX_ByteStringC& szPropName,
744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                   CFXJSE_Value* pValue);
754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  static void NormalPropertyGetter(CFXJSE_Value* pObject,
764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                   const CFX_ByteStringC& szPropName,
774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                   CFXJSE_Value* pValue);
784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  static void NormalPropertySetter(CFXJSE_Value* pObject,
794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                   const CFX_ByteStringC& szPropName,
804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                   CFXJSE_Value* pValue);
814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  static void NormalMethodCall(CFXJSE_Value* hThis,
824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                               const CFX_ByteStringC& szFuncName,
834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                               CFXJSE_Arguments& args);
844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  static int32_t NormalPropTypeGetter(CFXJSE_Value* pObject,
854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                      const CFX_ByteStringC& szPropName,
864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                      bool bQueryIn);
874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  static int32_t GlobalPropTypeGetter(CFXJSE_Value* pObject,
884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                      const CFX_ByteStringC& szPropName,
894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                      bool bQueryIn);
904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  bool RunVariablesScript(CXFA_Node* pScriptNode);
914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CXFA_Object* GetVariablesThis(CXFA_Object* pObject, bool bScriptNode = false);
924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  bool IsStrictScopeInJavaScript();
934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  XFA_SCRIPTLANGTYPE GetType();
944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CXFA_NodeArray& GetUpObjectArray() { return m_upObjectArray; }
954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CXFA_Document* GetDocument() const { return m_pDocument; }
964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  static CXFA_Object* ToObject(CFXJSE_Value* pValue, CFXJSE_Class* pClass);
984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann private:
1004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  void DefineJsContext();
1014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CFXJSE_Context* CreateVariablesContext(CXFA_Node* pScriptNode,
1024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                         CXFA_Node* pSubform);
1034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  void DefineJsClass();
1044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  void RemoveBuiltInObjs(CFXJSE_Context* pContext) const;
1054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
1064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CXFA_Document* m_pDocument;
1074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  std::unique_ptr<CFXJSE_Context> m_JsContext;
1084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  v8::Isolate* m_pIsolate;
1094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CFXJSE_Class* m_pJsClass;
1104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  XFA_SCRIPTLANGTYPE m_eScriptType;
1114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  std::map<CXFA_Object*, std::unique_ptr<CFXJSE_Value>> m_mapObjectToValue;
1124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  std::map<CXFA_Object*, CFXJSE_Context*> m_mapVariableToContext;
1134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CXFA_EventParam m_eventParam;
1144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CXFA_NodeArray m_upObjectArray;
1154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  // CacheList holds the NodeList items so we can clean them up when we're done.
1164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  std::vector<std::unique_ptr<CXFA_NodeList>> m_CacheList;
1174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CXFA_NodeArray* m_pScriptNodeArray;
1184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  std::unique_ptr<CXFA_ResolveProcessor> m_ResolveProcessor;
1194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  std::unique_ptr<CXFA_FM2JSContext> m_FM2JSContext;
1204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CXFA_Object* m_pThisObject;
1214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  uint32_t m_dwBuiltInInFlags;
1224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  XFA_ATTRIBUTEENUM m_eRunAtType;
1234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann};
1244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
1254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#endif  //  XFA_FXFA_PARSER_CXFA_SCRIPTCONTEXT_H_
126