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