Index: xfa/fxfa/parser/xfa_script_imp.cpp |
diff --git a/xfa/fxfa/parser/xfa_script_imp.cpp b/xfa/fxfa/parser/xfa_script_imp.cpp |
index 6dc4d3b9f040dfc53c878085ae42e8e9cdadd142..723a9aec7a2458f8ff898bed051c73f5bd01baeb 100644 |
--- a/xfa/fxfa/parser/xfa_script_imp.cpp |
+++ b/xfa/fxfa/parser/xfa_script_imp.cpp |
@@ -81,42 +81,33 @@ CXFA_Object* CXFA_ScriptContext::ToObject(CFXJSE_Value* pValue, |
CXFA_ScriptContext::CXFA_ScriptContext(CXFA_Document* pDocument) |
: m_pDocument(pDocument), |
- m_pJsContext(nullptr), |
m_pIsolate(nullptr), |
m_pJsClass(nullptr), |
m_eScriptType(XFA_SCRIPTLANGTYPE_Unkown), |
m_pScriptNodeArray(nullptr), |
- m_pResolveProcessor(nullptr), |
- m_hFM2JSContext(nullptr), |
m_pThisObject(nullptr), |
m_dwBuiltInInFlags(0), |
- m_eRunAtType(XFA_ATTRIBUTEENUM_Client) { |
-} |
+ m_eRunAtType(XFA_ATTRIBUTEENUM_Client) {} |
CXFA_ScriptContext::~CXFA_ScriptContext() { |
- FX_POSITION ps = m_mapXFAToValue.GetStartPosition(); |
+ FX_POSITION ps = m_mapVariableToContext.GetStartPosition(); |
while (ps) { |
- CXFA_Object* pXFAObj; |
- CFXJSE_Value* pValue; |
- m_mapXFAToValue.GetNextAssoc(ps, pXFAObj, pValue); |
- delete pValue; |
- } |
- m_mapXFAToValue.RemoveAll(); |
- ReleaseVariablesMap(); |
+ CXFA_Object* pScriptNode; |
+ CFXJSE_Context* pVariableContext = nullptr; |
+ m_mapVariableToContext.GetNextAssoc(ps, pScriptNode, pVariableContext); |
- delete m_hFM2JSContext; |
- delete m_pJsContext; |
+ delete ToThisProxy(pVariableContext->GetGlobalObject().get(), nullptr); |
+ delete pVariableContext; |
+ } |
+ m_mapVariableToContext.RemoveAll(); |
- delete m_pResolveProcessor; |
m_upObjectArray.RemoveAll(); |
- for (int32_t i = 0; i < m_CacheListArray.GetSize(); i++) |
- delete m_CacheListArray[i]; |
} |
void CXFA_ScriptContext::Initialize(v8::Isolate* pIsolate) { |
m_pIsolate = pIsolate; |
DefineJsContext(); |
DefineJsClass(); |
- m_pResolveProcessor = new CXFA_ResolveProcessor; |
+ m_ResolveProcessor.reset(new CXFA_ResolveProcessor); |
} |
FX_BOOL CXFA_ScriptContext::RunScript(XFA_SCRIPTLANGTYPE eScriptType, |
const CFX_WideStringC& wsScript, |
@@ -126,9 +117,9 @@ FX_BOOL CXFA_ScriptContext::RunScript(XFA_SCRIPTLANGTYPE eScriptType, |
XFA_SCRIPTLANGTYPE eSaveType = m_eScriptType; |
m_eScriptType = eScriptType; |
if (eScriptType == XFA_SCRIPTLANGTYPE_Formcalc) { |
- if (!m_hFM2JSContext) { |
- m_hFM2JSContext = |
- new CXFA_FM2JSContext(m_pIsolate, m_pJsContext, m_pDocument); |
+ if (!m_FM2JSContext) { |
+ m_FM2JSContext.reset( |
+ new CXFA_FM2JSContext(m_pIsolate, m_JsContext.get(), m_pDocument)); |
} |
CFX_WideTextBuf wsJavaScript; |
CFX_WideString wsErrorInfo; |
@@ -145,9 +136,9 @@ FX_BOOL CXFA_ScriptContext::RunScript(XFA_SCRIPTLANGTYPE eScriptType, |
} |
CXFA_Object* pOriginalObject = m_pThisObject; |
m_pThisObject = pThisObject; |
- CFXJSE_Value* pValue = pThisObject ? GetJSValueFromMap(pThisObject) : NULL; |
+ CFXJSE_Value* pValue = pThisObject ? GetJSValueFromMap(pThisObject) : nullptr; |
FX_BOOL bRet = |
- m_pJsContext->ExecuteScript(btScript.c_str(), hRetValue, pValue); |
+ m_JsContext->ExecuteScript(btScript.c_str(), hRetValue, pValue); |
m_pThisObject = pOriginalObject; |
m_eScriptType = eSaveType; |
return bRet; |
@@ -217,7 +208,7 @@ void CXFA_ScriptContext::GlobalPropertyGetter(CFXJSE_Value* pObject, |
CFX_WideString wsPropName = CFX_WideString::FromUTF8(szPropName); |
if (lpScriptContext->GetType() == XFA_SCRIPTLANGTYPE_Formcalc) { |
if (szPropName == kFormCalcRuntime) { |
- lpScriptContext->m_hFM2JSContext->GlobalPropertyGetter(pValue); |
+ lpScriptContext->m_FM2JSContext->GlobalPropertyGetter(pValue); |
return; |
} |
XFA_HashCode uHashCode = static_cast<XFA_HashCode>( |
@@ -327,7 +318,7 @@ void CXFA_ScriptContext::NormalPropertySetter(CFXJSE_Value* pOriginalValue, |
wsPropName = wsPropName.Right(wsPropName.GetLength() - 1); |
} |
CXFA_Node* pNode = ToNode(pObject); |
- CXFA_Node* pPropOrChild = NULL; |
+ CXFA_Node* pPropOrChild = nullptr; |
const XFA_ELEMENTINFO* lpElementInfo = |
XFA_GetElementByName(wsPropName.AsStringC()); |
if (lpElementInfo) { |
@@ -420,10 +411,10 @@ XFA_SCRIPTLANGTYPE CXFA_ScriptContext::GetType() { |
return m_eScriptType; |
} |
void CXFA_ScriptContext::DefineJsContext() { |
- m_pJsContext = CFXJSE_Context::Create(m_pIsolate, &GlobalClassDescriptor, |
- m_pDocument->GetRoot()); |
- RemoveBuiltInObjs(m_pJsContext); |
- m_pJsContext->EnableCompatibleMode(); |
+ m_JsContext.reset(CFXJSE_Context::Create(m_pIsolate, &GlobalClassDescriptor, |
+ m_pDocument->GetRoot())); |
+ RemoveBuiltInObjs(m_JsContext.get()); |
+ m_JsContext->EnableCompatibleMode(); |
} |
CFXJSE_Context* CXFA_ScriptContext::CreateVariablesContext( |
CXFA_Node* pScriptNode, |
@@ -520,21 +511,8 @@ FX_BOOL CXFA_ScriptContext::QueryVariableValue( |
return bRes; |
} |
-void CXFA_ScriptContext::ReleaseVariablesMap() { |
- FX_POSITION ps = m_mapVariableToContext.GetStartPosition(); |
- while (ps) { |
- CXFA_Object* pScriptNode; |
- CFXJSE_Context* pVariableContext = nullptr; |
- m_mapVariableToContext.GetNextAssoc(ps, pScriptNode, pVariableContext); |
- |
- delete ToThisProxy(pVariableContext->GetGlobalObject().get(), nullptr); |
- delete pVariableContext; |
- } |
- m_mapVariableToContext.RemoveAll(); |
-} |
- |
void CXFA_ScriptContext::DefineJsClass() { |
- m_pJsClass = CFXJSE_Class::Create(m_pJsContext, &NormalClassDescriptor); |
+ m_pJsClass = CFXJSE_Class::Create(m_JsContext.get(), &NormalClassDescriptor); |
} |
void CXFA_ScriptContext::RemoveBuiltInObjs(CFXJSE_Context* pContext) const { |
@@ -567,10 +545,10 @@ int32_t CXFA_ScriptContext::ResolveObjects(CXFA_Object* refNode, |
} |
FX_BOOL bNextCreate = FALSE; |
if (dwStyles & XFA_RESOLVENODE_CreateNode) { |
- m_pResolveProcessor->GetNodeHelper()->XFA_SetCreateNodeType(bindNode); |
+ m_ResolveProcessor->GetNodeHelper()->XFA_SetCreateNodeType(bindNode); |
} |
- m_pResolveProcessor->GetNodeHelper()->m_pCreateParent = NULL; |
- m_pResolveProcessor->GetNodeHelper()->m_iCurAllStart = -1; |
+ m_ResolveProcessor->GetNodeHelper()->m_pCreateParent = nullptr; |
+ m_ResolveProcessor->GetNodeHelper()->m_iCurAllStart = -1; |
CXFA_ResolveNodesData rndFind; |
int32_t nStart = 0; |
int32_t nLevel = 0; |
@@ -583,13 +561,13 @@ int32_t CXFA_ScriptContext::ResolveObjects(CXFA_Object* refNode, |
nNodes = findNodes.GetSize(); |
int32_t i = 0; |
rndFind.m_dwStyles = dwStyles; |
- m_pResolveProcessor->m_iCurStart = nStart; |
- nStart = m_pResolveProcessor->XFA_ResolveNodes_GetFilter(wsExpression, |
- nStart, rndFind); |
+ m_ResolveProcessor->m_iCurStart = nStart; |
+ nStart = m_ResolveProcessor->XFA_ResolveNodes_GetFilter(wsExpression, |
+ nStart, rndFind); |
if (nStart < 1) { |
if ((dwStyles & XFA_RESOLVENODE_CreateNode) && !bNextCreate) { |
- CXFA_Node* pDataNode = NULL; |
- nStart = m_pResolveProcessor->GetNodeHelper()->m_iCurAllStart; |
+ CXFA_Node* pDataNode = nullptr; |
+ nStart = m_ResolveProcessor->GetNodeHelper()->m_iCurAllStart; |
if (nStart != -1) { |
pDataNode = m_pDocument->GetNotBindNode(findNodes); |
if (pDataNode) { |
@@ -605,7 +583,7 @@ int32_t CXFA_ScriptContext::ResolveObjects(CXFA_Object* refNode, |
} |
dwStyles |= XFA_RESOLVENODE_Bind; |
findNodes.RemoveAll(); |
- findNodes.Add(m_pResolveProcessor->GetNodeHelper()->m_pAllStartParent); |
+ findNodes.Add(m_ResolveProcessor->GetNodeHelper()->m_pAllStartParent); |
continue; |
} else { |
break; |
@@ -613,7 +591,7 @@ int32_t CXFA_ScriptContext::ResolveObjects(CXFA_Object* refNode, |
} |
if (bNextCreate) { |
FX_BOOL bCreate = |
- m_pResolveProcessor->GetNodeHelper()->XFA_ResolveNodes_CreateNode( |
+ m_ResolveProcessor->GetNodeHelper()->XFA_ResolveNodes_CreateNode( |
rndFind.m_wsName, rndFind.m_wsCondition, |
nStart == wsExpression.GetLength(), this); |
if (bCreate) { |
@@ -629,16 +607,16 @@ int32_t CXFA_ScriptContext::ResolveObjects(CXFA_Object* refNode, |
(dwStyles & XFA_RESOLVENODE_CreateNode)) && |
nNodes > 1) { |
CXFA_ResolveNodesData rndBind; |
- m_pResolveProcessor->XFA_ResolveNodes_GetFilter(wsExpression, nStart, |
- rndBind); |
- m_pResolveProcessor->XFA_ResolveNode_SetIndexDataBind( |
+ m_ResolveProcessor->XFA_ResolveNodes_GetFilter(wsExpression, nStart, |
+ rndBind); |
+ m_ResolveProcessor->XFA_ResolveNode_SetIndexDataBind( |
rndBind.m_wsCondition, i, nNodes); |
bDataBind = TRUE; |
} |
rndFind.m_CurNode = findNodes[i++]; |
rndFind.m_nLevel = nLevel; |
rndFind.m_dwFlag = XFA_RESOVENODE_RSTYPE_Nodes; |
- nRet = m_pResolveProcessor->XFA_ResolveNodes(rndFind); |
+ nRet = m_ResolveProcessor->XFA_ResolveNodes(rndFind); |
if (nRet < 1) { |
continue; |
} |
@@ -665,13 +643,13 @@ int32_t CXFA_ScriptContext::ResolveObjects(CXFA_Object* refNode, |
if (nNodes < 1) { |
if (dwStyles & XFA_RESOLVENODE_CreateNode) { |
bNextCreate = TRUE; |
- if (m_pResolveProcessor->GetNodeHelper()->m_pCreateParent == NULL) { |
- m_pResolveProcessor->GetNodeHelper()->m_pCreateParent = |
+ if (m_ResolveProcessor->GetNodeHelper()->m_pCreateParent == nullptr) { |
+ m_ResolveProcessor->GetNodeHelper()->m_pCreateParent = |
ToNode(rndFind.m_CurNode); |
- m_pResolveProcessor->GetNodeHelper()->m_iCreateCount = 1; |
+ m_ResolveProcessor->GetNodeHelper()->m_iCreateCount = 1; |
} |
FX_BOOL bCreate = |
- m_pResolveProcessor->GetNodeHelper()->XFA_ResolveNodes_CreateNode( |
+ m_ResolveProcessor->GetNodeHelper()->XFA_ResolveNodes_CreateNode( |
rndFind.m_wsName, rndFind.m_wsCondition, |
nStart == wsExpression.GetLength(), this); |
if (bCreate) { |
@@ -702,7 +680,7 @@ int32_t CXFA_ScriptContext::ResolveObjects(CXFA_Object* refNode, |
} |
if (dwStyles & (XFA_RESOLVENODE_CreateNode | XFA_RESOLVENODE_Bind | |
XFA_RESOLVENODE_BindNew)) { |
- m_pResolveProcessor->XFA_ResolveNode_SetResultCreateNode( |
+ m_ResolveProcessor->XFA_ResolveNode_SetResultCreateNode( |
resolveNodeRS, rndFind.m_wsCondition); |
if (!bNextCreate && (dwStyles & XFA_RESOLVENODE_CreateNode)) { |
resolveNodeRS.dwFlags = XFA_RESOVENODE_RSTYPE_ExistNodes; |
@@ -711,36 +689,42 @@ int32_t CXFA_ScriptContext::ResolveObjects(CXFA_Object* refNode, |
} |
return nNodes; |
} |
+ |
+void CXFA_ScriptContext::AddToCacheList(std::unique_ptr<CXFA_NodeList> pList) { |
+ m_CacheList.push_back(std::move(pList)); |
+} |
+ |
CFXJSE_Value* CXFA_ScriptContext::GetJSValueFromMap(CXFA_Object* pObject) { |
if (!pObject) |
return nullptr; |
if (pObject->IsNode()) |
RunVariablesScript(pObject->AsNode()); |
- void* pValue = m_mapXFAToValue.GetValueAt(pObject); |
- if (!pValue) { |
- CFXJSE_Value* jsValue = new CFXJSE_Value(m_pIsolate); |
- jsValue->SetObject(pObject, m_pJsClass); |
- m_mapXFAToValue.SetAt(pObject, jsValue); |
- pValue = jsValue; |
- } |
- return static_cast<CFXJSE_Value*>(pValue); |
+ auto iter = m_mapObjectToValue.find(pObject); |
+ if (iter != m_mapObjectToValue.end()) |
+ return iter->second.get(); |
+ |
+ std::unique_ptr<CFXJSE_Value> jsValue(new CFXJSE_Value(m_pIsolate)); |
+ jsValue->SetObject(pObject, m_pJsClass); |
+ CFXJSE_Value* pValue = jsValue.get(); |
+ m_mapObjectToValue.insert(std::make_pair(pObject, std::move(jsValue))); |
+ return pValue; |
} |
int32_t CXFA_ScriptContext::GetIndexByName(CXFA_Node* refNode) { |
- CXFA_NodeHelper* lpNodeHelper = m_pResolveProcessor->GetNodeHelper(); |
+ CXFA_NodeHelper* lpNodeHelper = m_ResolveProcessor->GetNodeHelper(); |
return lpNodeHelper->XFA_GetIndex(refNode, XFA_LOGIC_Transparent, |
lpNodeHelper->XFA_NodeIsProperty(refNode), |
FALSE); |
} |
int32_t CXFA_ScriptContext::GetIndexByClassName(CXFA_Node* refNode) { |
- CXFA_NodeHelper* lpNodeHelper = m_pResolveProcessor->GetNodeHelper(); |
+ CXFA_NodeHelper* lpNodeHelper = m_ResolveProcessor->GetNodeHelper(); |
return lpNodeHelper->XFA_GetIndex(refNode, XFA_LOGIC_Transparent, |
lpNodeHelper->XFA_NodeIsProperty(refNode), |
TRUE); |
} |
void CXFA_ScriptContext::GetSomExpression(CXFA_Node* refNode, |
CFX_WideString& wsExpression) { |
- CXFA_NodeHelper* lpNodeHelper = m_pResolveProcessor->GetNodeHelper(); |
+ CXFA_NodeHelper* lpNodeHelper = m_ResolveProcessor->GetNodeHelper(); |
lpNodeHelper->XFA_GetNameExpression(refNode, wsExpression, TRUE, |
XFA_LOGIC_Transparent); |
} |
@@ -748,18 +732,14 @@ void CXFA_ScriptContext::SetNodesOfRunScript(CXFA_NodeArray* pArray) { |
m_pScriptNodeArray = pArray; |
} |
void CXFA_ScriptContext::AddNodesOfRunScript(const CXFA_NodeArray& nodes) { |
- if (!m_pScriptNodeArray) { |
+ if (!m_pScriptNodeArray) |
return; |
- } |
- if (nodes.GetSize() > 0) { |
+ if (nodes.GetSize() > 0) |
m_pScriptNodeArray->Copy(nodes); |
- } |
} |
void CXFA_ScriptContext::AddNodesOfRunScript(CXFA_Node* pNode) { |
- if (!m_pScriptNodeArray) { |
+ if (!m_pScriptNodeArray) |
return; |
- } |
- if (m_pScriptNodeArray->Find(pNode) == -1) { |
+ if (m_pScriptNodeArray->Find(pNode) == -1) |
m_pScriptNodeArray->Add(pNode); |
- } |
} |