Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(463)

Side by Side Diff: xfa/fxfa/parser/xfa_script_imp.cpp

Issue 2062113002: Cleanup ownership in CXFA_ScriptContext. (Closed) Base URL: https://pdfium.googlesource.com/pdfium.git@master
Patch Set: Review feedback Created 4 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « xfa/fxfa/parser/xfa_script_imp.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2014 PDFium Authors. All rights reserved. 1 // Copyright 2014 PDFium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com 5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
6 6
7 #include "xfa/fxfa/parser/xfa_script_imp.h" 7 #include "xfa/fxfa/parser/xfa_script_imp.h"
8 8
9 #include "core/fxcrt/include/fx_ext.h" 9 #include "core/fxcrt/include/fx_ext.h"
10 #include "fxjse/include/cfxjse_arguments.h" 10 #include "fxjse/include/cfxjse_arguments.h"
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after
74 } // namespace 74 } // namespace
75 75
76 // static. 76 // static.
77 CXFA_Object* CXFA_ScriptContext::ToObject(CFXJSE_Value* pValue, 77 CXFA_Object* CXFA_ScriptContext::ToObject(CFXJSE_Value* pValue,
78 CFXJSE_Class* pClass) { 78 CFXJSE_Class* pClass) {
79 return static_cast<CXFA_Object*>(pValue->ToHostObject(pClass)); 79 return static_cast<CXFA_Object*>(pValue->ToHostObject(pClass));
80 } 80 }
81 81
82 CXFA_ScriptContext::CXFA_ScriptContext(CXFA_Document* pDocument) 82 CXFA_ScriptContext::CXFA_ScriptContext(CXFA_Document* pDocument)
83 : m_pDocument(pDocument), 83 : m_pDocument(pDocument),
84 m_pJsContext(nullptr),
85 m_pIsolate(nullptr), 84 m_pIsolate(nullptr),
86 m_pJsClass(nullptr), 85 m_pJsClass(nullptr),
87 m_eScriptType(XFA_SCRIPTLANGTYPE_Unkown), 86 m_eScriptType(XFA_SCRIPTLANGTYPE_Unkown),
88 m_pScriptNodeArray(nullptr), 87 m_pScriptNodeArray(nullptr),
89 m_pResolveProcessor(nullptr),
90 m_hFM2JSContext(nullptr),
91 m_pThisObject(nullptr), 88 m_pThisObject(nullptr),
92 m_dwBuiltInInFlags(0), 89 m_dwBuiltInInFlags(0),
93 m_eRunAtType(XFA_ATTRIBUTEENUM_Client) { 90 m_eRunAtType(XFA_ATTRIBUTEENUM_Client) {}
94 }
95 91
96 CXFA_ScriptContext::~CXFA_ScriptContext() { 92 CXFA_ScriptContext::~CXFA_ScriptContext() {
97 FX_POSITION ps = m_mapXFAToValue.GetStartPosition(); 93 FX_POSITION ps = m_mapVariableToContext.GetStartPosition();
98 while (ps) { 94 while (ps) {
99 CXFA_Object* pXFAObj; 95 CXFA_Object* pScriptNode;
100 CFXJSE_Value* pValue; 96 CFXJSE_Context* pVariableContext = nullptr;
101 m_mapXFAToValue.GetNextAssoc(ps, pXFAObj, pValue); 97 m_mapVariableToContext.GetNextAssoc(ps, pScriptNode, pVariableContext);
102 delete pValue; 98
99 delete ToThisProxy(pVariableContext->GetGlobalObject().get(), nullptr);
100 delete pVariableContext;
103 } 101 }
104 m_mapXFAToValue.RemoveAll(); 102 m_mapVariableToContext.RemoveAll();
105 ReleaseVariablesMap();
106 103
107 delete m_hFM2JSContext;
108 delete m_pJsContext;
109
110 delete m_pResolveProcessor;
111 m_upObjectArray.RemoveAll(); 104 m_upObjectArray.RemoveAll();
112 for (int32_t i = 0; i < m_CacheListArray.GetSize(); i++)
113 delete m_CacheListArray[i];
114 } 105 }
115 void CXFA_ScriptContext::Initialize(v8::Isolate* pIsolate) { 106 void CXFA_ScriptContext::Initialize(v8::Isolate* pIsolate) {
116 m_pIsolate = pIsolate; 107 m_pIsolate = pIsolate;
117 DefineJsContext(); 108 DefineJsContext();
118 DefineJsClass(); 109 DefineJsClass();
119 m_pResolveProcessor = new CXFA_ResolveProcessor; 110 m_ResolveProcessor.reset(new CXFA_ResolveProcessor);
120 } 111 }
121 FX_BOOL CXFA_ScriptContext::RunScript(XFA_SCRIPTLANGTYPE eScriptType, 112 FX_BOOL CXFA_ScriptContext::RunScript(XFA_SCRIPTLANGTYPE eScriptType,
122 const CFX_WideStringC& wsScript, 113 const CFX_WideStringC& wsScript,
123 CFXJSE_Value* hRetValue, 114 CFXJSE_Value* hRetValue,
124 CXFA_Object* pThisObject) { 115 CXFA_Object* pThisObject) {
125 CFX_ByteString btScript; 116 CFX_ByteString btScript;
126 XFA_SCRIPTLANGTYPE eSaveType = m_eScriptType; 117 XFA_SCRIPTLANGTYPE eSaveType = m_eScriptType;
127 m_eScriptType = eScriptType; 118 m_eScriptType = eScriptType;
128 if (eScriptType == XFA_SCRIPTLANGTYPE_Formcalc) { 119 if (eScriptType == XFA_SCRIPTLANGTYPE_Formcalc) {
129 if (!m_hFM2JSContext) { 120 if (!m_FM2JSContext) {
130 m_hFM2JSContext = 121 m_FM2JSContext.reset(
131 new CXFA_FM2JSContext(m_pIsolate, m_pJsContext, m_pDocument); 122 new CXFA_FM2JSContext(m_pIsolate, m_JsContext.get(), m_pDocument));
132 } 123 }
133 CFX_WideTextBuf wsJavaScript; 124 CFX_WideTextBuf wsJavaScript;
134 CFX_WideString wsErrorInfo; 125 CFX_WideString wsErrorInfo;
135 int32_t iFlags = 126 int32_t iFlags =
136 CXFA_FM2JSContext::Translate(wsScript, wsJavaScript, wsErrorInfo); 127 CXFA_FM2JSContext::Translate(wsScript, wsJavaScript, wsErrorInfo);
137 if (iFlags) { 128 if (iFlags) {
138 hRetValue->SetUndefined(); 129 hRetValue->SetUndefined();
139 return FALSE; 130 return FALSE;
140 } 131 }
141 btScript = 132 btScript =
142 FX_UTF8Encode(wsJavaScript.GetBuffer(), wsJavaScript.GetLength()); 133 FX_UTF8Encode(wsJavaScript.GetBuffer(), wsJavaScript.GetLength());
143 } else { 134 } else {
144 btScript = FX_UTF8Encode(wsScript.c_str(), wsScript.GetLength()); 135 btScript = FX_UTF8Encode(wsScript.c_str(), wsScript.GetLength());
145 } 136 }
146 CXFA_Object* pOriginalObject = m_pThisObject; 137 CXFA_Object* pOriginalObject = m_pThisObject;
147 m_pThisObject = pThisObject; 138 m_pThisObject = pThisObject;
148 CFXJSE_Value* pValue = pThisObject ? GetJSValueFromMap(pThisObject) : NULL; 139 CFXJSE_Value* pValue = pThisObject ? GetJSValueFromMap(pThisObject) : nullptr;
149 FX_BOOL bRet = 140 FX_BOOL bRet =
150 m_pJsContext->ExecuteScript(btScript.c_str(), hRetValue, pValue); 141 m_JsContext->ExecuteScript(btScript.c_str(), hRetValue, pValue);
151 m_pThisObject = pOriginalObject; 142 m_pThisObject = pOriginalObject;
152 m_eScriptType = eSaveType; 143 m_eScriptType = eSaveType;
153 return bRet; 144 return bRet;
154 } 145 }
155 void CXFA_ScriptContext::GlobalPropertySetter(CFXJSE_Value* pObject, 146 void CXFA_ScriptContext::GlobalPropertySetter(CFXJSE_Value* pObject,
156 const CFX_ByteStringC& szPropName, 147 const CFX_ByteStringC& szPropName,
157 CFXJSE_Value* pValue) { 148 CFXJSE_Value* pValue) {
158 CXFA_Object* lpOrginalNode = ToObject(pObject, nullptr); 149 CXFA_Object* lpOrginalNode = ToObject(pObject, nullptr);
159 CXFA_Document* pDoc = lpOrginalNode->GetDocument(); 150 CXFA_Document* pDoc = lpOrginalNode->GetDocument();
160 CXFA_ScriptContext* lpScriptContext = pDoc->GetScriptContext(); 151 CXFA_ScriptContext* lpScriptContext = pDoc->GetScriptContext();
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
210 void CXFA_ScriptContext::GlobalPropertyGetter(CFXJSE_Value* pObject, 201 void CXFA_ScriptContext::GlobalPropertyGetter(CFXJSE_Value* pObject,
211 const CFX_ByteStringC& szPropName, 202 const CFX_ByteStringC& szPropName,
212 CFXJSE_Value* pValue) { 203 CFXJSE_Value* pValue) {
213 CXFA_Object* pOriginalObject = ToObject(pObject, nullptr); 204 CXFA_Object* pOriginalObject = ToObject(pObject, nullptr);
214 CXFA_Document* pDoc = pOriginalObject->GetDocument(); 205 CXFA_Document* pDoc = pOriginalObject->GetDocument();
215 CXFA_ScriptContext* lpScriptContext = pDoc->GetScriptContext(); 206 CXFA_ScriptContext* lpScriptContext = pDoc->GetScriptContext();
216 CXFA_Object* lpCurNode = lpScriptContext->GetVariablesThis(pOriginalObject); 207 CXFA_Object* lpCurNode = lpScriptContext->GetVariablesThis(pOriginalObject);
217 CFX_WideString wsPropName = CFX_WideString::FromUTF8(szPropName); 208 CFX_WideString wsPropName = CFX_WideString::FromUTF8(szPropName);
218 if (lpScriptContext->GetType() == XFA_SCRIPTLANGTYPE_Formcalc) { 209 if (lpScriptContext->GetType() == XFA_SCRIPTLANGTYPE_Formcalc) {
219 if (szPropName == kFormCalcRuntime) { 210 if (szPropName == kFormCalcRuntime) {
220 lpScriptContext->m_hFM2JSContext->GlobalPropertyGetter(pValue); 211 lpScriptContext->m_FM2JSContext->GlobalPropertyGetter(pValue);
221 return; 212 return;
222 } 213 }
223 XFA_HashCode uHashCode = static_cast<XFA_HashCode>( 214 XFA_HashCode uHashCode = static_cast<XFA_HashCode>(
224 FX_HashCode_GetW(wsPropName.AsStringC(), false)); 215 FX_HashCode_GetW(wsPropName.AsStringC(), false));
225 if (uHashCode != XFA_HASHCODE_Layout) { 216 if (uHashCode != XFA_HASHCODE_Layout) {
226 CXFA_Object* pObj = 217 CXFA_Object* pObj =
227 lpScriptContext->GetDocument()->GetXFAObject(uHashCode); 218 lpScriptContext->GetDocument()->GetXFAObject(uHashCode);
228 if (pObj) { 219 if (pObj) {
229 pValue->Assign(lpScriptContext->GetJSValueFromMap(pObj)); 220 pValue->Assign(lpScriptContext->GetJSValueFromMap(pObj));
230 return; 221 return;
(...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after
320 pObject->GetClassID(), wsPropName.AsStringC()); 311 pObject->GetClassID(), wsPropName.AsStringC());
321 if (lpAttributeInfo) { 312 if (lpAttributeInfo) {
322 (pObject->*(lpAttributeInfo->lpfnCallback))( 313 (pObject->*(lpAttributeInfo->lpfnCallback))(
323 pReturnValue, TRUE, (XFA_ATTRIBUTE)lpAttributeInfo->eAttribute); 314 pReturnValue, TRUE, (XFA_ATTRIBUTE)lpAttributeInfo->eAttribute);
324 } else { 315 } else {
325 if (pObject->IsNode()) { 316 if (pObject->IsNode()) {
326 if (wsPropName.GetAt(0) == '#') { 317 if (wsPropName.GetAt(0) == '#') {
327 wsPropName = wsPropName.Right(wsPropName.GetLength() - 1); 318 wsPropName = wsPropName.Right(wsPropName.GetLength() - 1);
328 } 319 }
329 CXFA_Node* pNode = ToNode(pObject); 320 CXFA_Node* pNode = ToNode(pObject);
330 CXFA_Node* pPropOrChild = NULL; 321 CXFA_Node* pPropOrChild = nullptr;
331 const XFA_ELEMENTINFO* lpElementInfo = 322 const XFA_ELEMENTINFO* lpElementInfo =
332 XFA_GetElementByName(wsPropName.AsStringC()); 323 XFA_GetElementByName(wsPropName.AsStringC());
333 if (lpElementInfo) { 324 if (lpElementInfo) {
334 pPropOrChild = pNode->GetProperty(0, lpElementInfo->eName); 325 pPropOrChild = pNode->GetProperty(0, lpElementInfo->eName);
335 } else { 326 } else {
336 pPropOrChild = pNode->GetFirstChildByName(wsPropName.AsStringC()); 327 pPropOrChild = pNode->GetFirstChildByName(wsPropName.AsStringC());
337 } 328 }
338 if (pPropOrChild) { 329 if (pPropOrChild) {
339 CFX_WideString wsDefaultName(L"{default}"); 330 CFX_WideString wsDefaultName(L"{default}");
340 const XFA_SCRIPTATTRIBUTEINFO* lpAttrInfo = 331 const XFA_SCRIPTATTRIBUTEINFO* lpAttrInfo =
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after
413 404
414 (pObject->*(lpMethodInfo->lpfnCallback))(&args); 405 (pObject->*(lpMethodInfo->lpfnCallback))(&args);
415 } 406 }
416 FX_BOOL CXFA_ScriptContext::IsStrictScopeInJavaScript() { 407 FX_BOOL CXFA_ScriptContext::IsStrictScopeInJavaScript() {
417 return m_pDocument->HasFlag(XFA_DOCFLAG_StrictScoping); 408 return m_pDocument->HasFlag(XFA_DOCFLAG_StrictScoping);
418 } 409 }
419 XFA_SCRIPTLANGTYPE CXFA_ScriptContext::GetType() { 410 XFA_SCRIPTLANGTYPE CXFA_ScriptContext::GetType() {
420 return m_eScriptType; 411 return m_eScriptType;
421 } 412 }
422 void CXFA_ScriptContext::DefineJsContext() { 413 void CXFA_ScriptContext::DefineJsContext() {
423 m_pJsContext = CFXJSE_Context::Create(m_pIsolate, &GlobalClassDescriptor, 414 m_JsContext.reset(CFXJSE_Context::Create(m_pIsolate, &GlobalClassDescriptor,
424 m_pDocument->GetRoot()); 415 m_pDocument->GetRoot()));
425 RemoveBuiltInObjs(m_pJsContext); 416 RemoveBuiltInObjs(m_JsContext.get());
426 m_pJsContext->EnableCompatibleMode(); 417 m_JsContext->EnableCompatibleMode();
427 } 418 }
428 CFXJSE_Context* CXFA_ScriptContext::CreateVariablesContext( 419 CFXJSE_Context* CXFA_ScriptContext::CreateVariablesContext(
429 CXFA_Node* pScriptNode, 420 CXFA_Node* pScriptNode,
430 CXFA_Node* pSubform) { 421 CXFA_Node* pSubform) {
431 if (!pScriptNode || !pSubform) 422 if (!pScriptNode || !pSubform)
432 return nullptr; 423 return nullptr;
433 424
434 CFXJSE_Context* pVariablesContext = 425 CFXJSE_Context* pVariablesContext =
435 CFXJSE_Context::Create(m_pIsolate, &VariablesClassDescriptor, 426 CFXJSE_Context::Create(m_pIsolate, &VariablesClassDescriptor,
436 new CXFA_ThisProxy(pSubform, pScriptNode)); 427 new CXFA_ThisProxy(pSubform, pScriptNode));
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after
513 pValue->SetFunctionBind(hVariableValue.get(), pObject.get()); 504 pValue->SetFunctionBind(hVariableValue.get(), pObject.get());
514 else if (bGetter) 505 else if (bGetter)
515 pValue->Assign(hVariableValue.get()); 506 pValue->Assign(hVariableValue.get());
516 else 507 else
517 hVariableValue.get()->Assign(pValue); 508 hVariableValue.get()->Assign(pValue);
518 bRes = TRUE; 509 bRes = TRUE;
519 } 510 }
520 return bRes; 511 return bRes;
521 } 512 }
522 513
523 void CXFA_ScriptContext::ReleaseVariablesMap() {
524 FX_POSITION ps = m_mapVariableToContext.GetStartPosition();
525 while (ps) {
526 CXFA_Object* pScriptNode;
527 CFXJSE_Context* pVariableContext = nullptr;
528 m_mapVariableToContext.GetNextAssoc(ps, pScriptNode, pVariableContext);
529
530 delete ToThisProxy(pVariableContext->GetGlobalObject().get(), nullptr);
531 delete pVariableContext;
532 }
533 m_mapVariableToContext.RemoveAll();
534 }
535
536 void CXFA_ScriptContext::DefineJsClass() { 514 void CXFA_ScriptContext::DefineJsClass() {
537 m_pJsClass = CFXJSE_Class::Create(m_pJsContext, &NormalClassDescriptor); 515 m_pJsClass = CFXJSE_Class::Create(m_JsContext.get(), &NormalClassDescriptor);
538 } 516 }
539 517
540 void CXFA_ScriptContext::RemoveBuiltInObjs(CFXJSE_Context* pContext) const { 518 void CXFA_ScriptContext::RemoveBuiltInObjs(CFXJSE_Context* pContext) const {
541 static const CFX_ByteStringC OBJ_NAME[2] = {"Number", "Date"}; 519 static const CFX_ByteStringC OBJ_NAME[2] = {"Number", "Date"};
542 std::unique_ptr<CFXJSE_Value> pObject = pContext->GetGlobalObject(); 520 std::unique_ptr<CFXJSE_Value> pObject = pContext->GetGlobalObject();
543 std::unique_ptr<CFXJSE_Value> hProp(new CFXJSE_Value(m_pIsolate)); 521 std::unique_ptr<CFXJSE_Value> hProp(new CFXJSE_Value(m_pIsolate));
544 for (int i = 0; i < 2; ++i) { 522 for (int i = 0; i < 2; ++i) {
545 if (pObject->GetObjectProperty(OBJ_NAME[i], hProp.get())) 523 if (pObject->GetObjectProperty(OBJ_NAME[i], hProp.get()))
546 pObject->DeleteObjectProperty(OBJ_NAME[i]); 524 pObject->DeleteObjectProperty(OBJ_NAME[i]);
547 } 525 }
(...skipping 12 matching lines...) Expand all
560 if (m_eScriptType != XFA_SCRIPTLANGTYPE_Formcalc || 538 if (m_eScriptType != XFA_SCRIPTLANGTYPE_Formcalc ||
561 (dwStyles & (XFA_RESOLVENODE_Parent | XFA_RESOLVENODE_Siblings))) { 539 (dwStyles & (XFA_RESOLVENODE_Parent | XFA_RESOLVENODE_Siblings))) {
562 m_upObjectArray.RemoveAll(); 540 m_upObjectArray.RemoveAll();
563 } 541 }
564 if (refNode && refNode->IsNode() && 542 if (refNode && refNode->IsNode() &&
565 (dwStyles & (XFA_RESOLVENODE_Parent | XFA_RESOLVENODE_Siblings))) { 543 (dwStyles & (XFA_RESOLVENODE_Parent | XFA_RESOLVENODE_Siblings))) {
566 m_upObjectArray.Add(refNode->AsNode()); 544 m_upObjectArray.Add(refNode->AsNode());
567 } 545 }
568 FX_BOOL bNextCreate = FALSE; 546 FX_BOOL bNextCreate = FALSE;
569 if (dwStyles & XFA_RESOLVENODE_CreateNode) { 547 if (dwStyles & XFA_RESOLVENODE_CreateNode) {
570 m_pResolveProcessor->GetNodeHelper()->XFA_SetCreateNodeType(bindNode); 548 m_ResolveProcessor->GetNodeHelper()->XFA_SetCreateNodeType(bindNode);
571 } 549 }
572 m_pResolveProcessor->GetNodeHelper()->m_pCreateParent = NULL; 550 m_ResolveProcessor->GetNodeHelper()->m_pCreateParent = nullptr;
573 m_pResolveProcessor->GetNodeHelper()->m_iCurAllStart = -1; 551 m_ResolveProcessor->GetNodeHelper()->m_iCurAllStart = -1;
574 CXFA_ResolveNodesData rndFind; 552 CXFA_ResolveNodesData rndFind;
575 int32_t nStart = 0; 553 int32_t nStart = 0;
576 int32_t nLevel = 0; 554 int32_t nLevel = 0;
577 int32_t nRet = -1; 555 int32_t nRet = -1;
578 rndFind.m_pSC = this; 556 rndFind.m_pSC = this;
579 CXFA_ObjArray findNodes; 557 CXFA_ObjArray findNodes;
580 findNodes.Add(refNode ? refNode : m_pDocument->GetRoot()); 558 findNodes.Add(refNode ? refNode : m_pDocument->GetRoot());
581 int32_t nNodes = 0; 559 int32_t nNodes = 0;
582 while (TRUE) { 560 while (TRUE) {
583 nNodes = findNodes.GetSize(); 561 nNodes = findNodes.GetSize();
584 int32_t i = 0; 562 int32_t i = 0;
585 rndFind.m_dwStyles = dwStyles; 563 rndFind.m_dwStyles = dwStyles;
586 m_pResolveProcessor->m_iCurStart = nStart; 564 m_ResolveProcessor->m_iCurStart = nStart;
587 nStart = m_pResolveProcessor->XFA_ResolveNodes_GetFilter(wsExpression, 565 nStart = m_ResolveProcessor->XFA_ResolveNodes_GetFilter(wsExpression,
588 nStart, rndFind); 566 nStart, rndFind);
589 if (nStart < 1) { 567 if (nStart < 1) {
590 if ((dwStyles & XFA_RESOLVENODE_CreateNode) && !bNextCreate) { 568 if ((dwStyles & XFA_RESOLVENODE_CreateNode) && !bNextCreate) {
591 CXFA_Node* pDataNode = NULL; 569 CXFA_Node* pDataNode = nullptr;
592 nStart = m_pResolveProcessor->GetNodeHelper()->m_iCurAllStart; 570 nStart = m_ResolveProcessor->GetNodeHelper()->m_iCurAllStart;
593 if (nStart != -1) { 571 if (nStart != -1) {
594 pDataNode = m_pDocument->GetNotBindNode(findNodes); 572 pDataNode = m_pDocument->GetNotBindNode(findNodes);
595 if (pDataNode) { 573 if (pDataNode) {
596 findNodes.RemoveAll(); 574 findNodes.RemoveAll();
597 findNodes.Add(pDataNode); 575 findNodes.Add(pDataNode);
598 break; 576 break;
599 } 577 }
600 } else { 578 } else {
601 pDataNode = findNodes[0]->AsNode(); 579 pDataNode = findNodes[0]->AsNode();
602 findNodes.RemoveAll(); 580 findNodes.RemoveAll();
603 findNodes.Add(pDataNode); 581 findNodes.Add(pDataNode);
604 break; 582 break;
605 } 583 }
606 dwStyles |= XFA_RESOLVENODE_Bind; 584 dwStyles |= XFA_RESOLVENODE_Bind;
607 findNodes.RemoveAll(); 585 findNodes.RemoveAll();
608 findNodes.Add(m_pResolveProcessor->GetNodeHelper()->m_pAllStartParent); 586 findNodes.Add(m_ResolveProcessor->GetNodeHelper()->m_pAllStartParent);
609 continue; 587 continue;
610 } else { 588 } else {
611 break; 589 break;
612 } 590 }
613 } 591 }
614 if (bNextCreate) { 592 if (bNextCreate) {
615 FX_BOOL bCreate = 593 FX_BOOL bCreate =
616 m_pResolveProcessor->GetNodeHelper()->XFA_ResolveNodes_CreateNode( 594 m_ResolveProcessor->GetNodeHelper()->XFA_ResolveNodes_CreateNode(
617 rndFind.m_wsName, rndFind.m_wsCondition, 595 rndFind.m_wsName, rndFind.m_wsCondition,
618 nStart == wsExpression.GetLength(), this); 596 nStart == wsExpression.GetLength(), this);
619 if (bCreate) { 597 if (bCreate) {
620 continue; 598 continue;
621 } else { 599 } else {
622 break; 600 break;
623 } 601 }
624 } 602 }
625 CXFA_ObjArray retNodes; 603 CXFA_ObjArray retNodes;
626 while (i < nNodes) { 604 while (i < nNodes) {
627 FX_BOOL bDataBind = FALSE; 605 FX_BOOL bDataBind = FALSE;
628 if (((dwStyles & XFA_RESOLVENODE_Bind) || 606 if (((dwStyles & XFA_RESOLVENODE_Bind) ||
629 (dwStyles & XFA_RESOLVENODE_CreateNode)) && 607 (dwStyles & XFA_RESOLVENODE_CreateNode)) &&
630 nNodes > 1) { 608 nNodes > 1) {
631 CXFA_ResolveNodesData rndBind; 609 CXFA_ResolveNodesData rndBind;
632 m_pResolveProcessor->XFA_ResolveNodes_GetFilter(wsExpression, nStart, 610 m_ResolveProcessor->XFA_ResolveNodes_GetFilter(wsExpression, nStart,
633 rndBind); 611 rndBind);
634 m_pResolveProcessor->XFA_ResolveNode_SetIndexDataBind( 612 m_ResolveProcessor->XFA_ResolveNode_SetIndexDataBind(
635 rndBind.m_wsCondition, i, nNodes); 613 rndBind.m_wsCondition, i, nNodes);
636 bDataBind = TRUE; 614 bDataBind = TRUE;
637 } 615 }
638 rndFind.m_CurNode = findNodes[i++]; 616 rndFind.m_CurNode = findNodes[i++];
639 rndFind.m_nLevel = nLevel; 617 rndFind.m_nLevel = nLevel;
640 rndFind.m_dwFlag = XFA_RESOVENODE_RSTYPE_Nodes; 618 rndFind.m_dwFlag = XFA_RESOVENODE_RSTYPE_Nodes;
641 nRet = m_pResolveProcessor->XFA_ResolveNodes(rndFind); 619 nRet = m_ResolveProcessor->XFA_ResolveNodes(rndFind);
642 if (nRet < 1) { 620 if (nRet < 1) {
643 continue; 621 continue;
644 } 622 }
645 if (rndFind.m_dwFlag == XFA_RESOVENODE_RSTYPE_Attribute && 623 if (rndFind.m_dwFlag == XFA_RESOVENODE_RSTYPE_Attribute &&
646 rndFind.m_pScriptAttribute && nStart < wsExpression.GetLength()) { 624 rndFind.m_pScriptAttribute && nStart < wsExpression.GetLength()) {
647 std::unique_ptr<CFXJSE_Value> pValue(new CFXJSE_Value(m_pIsolate)); 625 std::unique_ptr<CFXJSE_Value> pValue(new CFXJSE_Value(m_pIsolate));
648 (rndFind.m_Nodes[0]->*(rndFind.m_pScriptAttribute->lpfnCallback))( 626 (rndFind.m_Nodes[0]->*(rndFind.m_pScriptAttribute->lpfnCallback))(
649 pValue.get(), FALSE, 627 pValue.get(), FALSE,
650 (XFA_ATTRIBUTE)rndFind.m_pScriptAttribute->eAttribute); 628 (XFA_ATTRIBUTE)rndFind.m_pScriptAttribute->eAttribute);
651 rndFind.m_Nodes.SetAt(0, ToObject(pValue.get(), nullptr)); 629 rndFind.m_Nodes.SetAt(0, ToObject(pValue.get(), nullptr));
652 } 630 }
653 int32_t iSize = m_upObjectArray.GetSize(); 631 int32_t iSize = m_upObjectArray.GetSize();
654 if (iSize) { 632 if (iSize) {
655 m_upObjectArray.RemoveAt(iSize - 1); 633 m_upObjectArray.RemoveAt(iSize - 1);
656 } 634 }
657 retNodes.Append(rndFind.m_Nodes); 635 retNodes.Append(rndFind.m_Nodes);
658 rndFind.m_Nodes.RemoveAll(); 636 rndFind.m_Nodes.RemoveAll();
659 if (bDataBind) { 637 if (bDataBind) {
660 break; 638 break;
661 } 639 }
662 } 640 }
663 findNodes.RemoveAll(); 641 findNodes.RemoveAll();
664 nNodes = retNodes.GetSize(); 642 nNodes = retNodes.GetSize();
665 if (nNodes < 1) { 643 if (nNodes < 1) {
666 if (dwStyles & XFA_RESOLVENODE_CreateNode) { 644 if (dwStyles & XFA_RESOLVENODE_CreateNode) {
667 bNextCreate = TRUE; 645 bNextCreate = TRUE;
668 if (m_pResolveProcessor->GetNodeHelper()->m_pCreateParent == NULL) { 646 if (m_ResolveProcessor->GetNodeHelper()->m_pCreateParent == nullptr) {
669 m_pResolveProcessor->GetNodeHelper()->m_pCreateParent = 647 m_ResolveProcessor->GetNodeHelper()->m_pCreateParent =
670 ToNode(rndFind.m_CurNode); 648 ToNode(rndFind.m_CurNode);
671 m_pResolveProcessor->GetNodeHelper()->m_iCreateCount = 1; 649 m_ResolveProcessor->GetNodeHelper()->m_iCreateCount = 1;
672 } 650 }
673 FX_BOOL bCreate = 651 FX_BOOL bCreate =
674 m_pResolveProcessor->GetNodeHelper()->XFA_ResolveNodes_CreateNode( 652 m_ResolveProcessor->GetNodeHelper()->XFA_ResolveNodes_CreateNode(
675 rndFind.m_wsName, rndFind.m_wsCondition, 653 rndFind.m_wsName, rndFind.m_wsCondition,
676 nStart == wsExpression.GetLength(), this); 654 nStart == wsExpression.GetLength(), this);
677 if (bCreate) { 655 if (bCreate) {
678 continue; 656 continue;
679 } else { 657 } else {
680 break; 658 break;
681 } 659 }
682 } else { 660 } else {
683 break; 661 break;
684 } 662 }
(...skipping 10 matching lines...) Expand all
695 if (nNodes > 0) { 673 if (nNodes > 0) {
696 resolveNodeRS.nodes.Append(findNodes); 674 resolveNodeRS.nodes.Append(findNodes);
697 } 675 }
698 if (rndFind.m_dwFlag == XFA_RESOVENODE_RSTYPE_Attribute) { 676 if (rndFind.m_dwFlag == XFA_RESOVENODE_RSTYPE_Attribute) {
699 resolveNodeRS.pScriptAttribute = rndFind.m_pScriptAttribute; 677 resolveNodeRS.pScriptAttribute = rndFind.m_pScriptAttribute;
700 return 1; 678 return 1;
701 } 679 }
702 } 680 }
703 if (dwStyles & (XFA_RESOLVENODE_CreateNode | XFA_RESOLVENODE_Bind | 681 if (dwStyles & (XFA_RESOLVENODE_CreateNode | XFA_RESOLVENODE_Bind |
704 XFA_RESOLVENODE_BindNew)) { 682 XFA_RESOLVENODE_BindNew)) {
705 m_pResolveProcessor->XFA_ResolveNode_SetResultCreateNode( 683 m_ResolveProcessor->XFA_ResolveNode_SetResultCreateNode(
706 resolveNodeRS, rndFind.m_wsCondition); 684 resolveNodeRS, rndFind.m_wsCondition);
707 if (!bNextCreate && (dwStyles & XFA_RESOLVENODE_CreateNode)) { 685 if (!bNextCreate && (dwStyles & XFA_RESOLVENODE_CreateNode)) {
708 resolveNodeRS.dwFlags = XFA_RESOVENODE_RSTYPE_ExistNodes; 686 resolveNodeRS.dwFlags = XFA_RESOVENODE_RSTYPE_ExistNodes;
709 } 687 }
710 return resolveNodeRS.nodes.GetSize(); 688 return resolveNodeRS.nodes.GetSize();
711 } 689 }
712 return nNodes; 690 return nNodes;
713 } 691 }
692
693 void CXFA_ScriptContext::AddToCacheList(std::unique_ptr<CXFA_NodeList> pList) {
694 m_CacheList.push_back(std::move(pList));
695 }
696
714 CFXJSE_Value* CXFA_ScriptContext::GetJSValueFromMap(CXFA_Object* pObject) { 697 CFXJSE_Value* CXFA_ScriptContext::GetJSValueFromMap(CXFA_Object* pObject) {
715 if (!pObject) 698 if (!pObject)
716 return nullptr; 699 return nullptr;
717 if (pObject->IsNode()) 700 if (pObject->IsNode())
718 RunVariablesScript(pObject->AsNode()); 701 RunVariablesScript(pObject->AsNode());
719 702
720 void* pValue = m_mapXFAToValue.GetValueAt(pObject); 703 auto iter = m_mapObjectToValue.find(pObject);
721 if (!pValue) { 704 if (iter != m_mapObjectToValue.end())
722 CFXJSE_Value* jsValue = new CFXJSE_Value(m_pIsolate); 705 return iter->second.get();
723 jsValue->SetObject(pObject, m_pJsClass); 706
724 m_mapXFAToValue.SetAt(pObject, jsValue); 707 std::unique_ptr<CFXJSE_Value> jsValue(new CFXJSE_Value(m_pIsolate));
725 pValue = jsValue; 708 jsValue->SetObject(pObject, m_pJsClass);
726 } 709 CFXJSE_Value* pValue = jsValue.get();
727 return static_cast<CFXJSE_Value*>(pValue); 710 m_mapObjectToValue.insert(std::make_pair(pObject, std::move(jsValue)));
711 return pValue;
728 } 712 }
729 int32_t CXFA_ScriptContext::GetIndexByName(CXFA_Node* refNode) { 713 int32_t CXFA_ScriptContext::GetIndexByName(CXFA_Node* refNode) {
730 CXFA_NodeHelper* lpNodeHelper = m_pResolveProcessor->GetNodeHelper(); 714 CXFA_NodeHelper* lpNodeHelper = m_ResolveProcessor->GetNodeHelper();
731 return lpNodeHelper->XFA_GetIndex(refNode, XFA_LOGIC_Transparent, 715 return lpNodeHelper->XFA_GetIndex(refNode, XFA_LOGIC_Transparent,
732 lpNodeHelper->XFA_NodeIsProperty(refNode), 716 lpNodeHelper->XFA_NodeIsProperty(refNode),
733 FALSE); 717 FALSE);
734 } 718 }
735 int32_t CXFA_ScriptContext::GetIndexByClassName(CXFA_Node* refNode) { 719 int32_t CXFA_ScriptContext::GetIndexByClassName(CXFA_Node* refNode) {
736 CXFA_NodeHelper* lpNodeHelper = m_pResolveProcessor->GetNodeHelper(); 720 CXFA_NodeHelper* lpNodeHelper = m_ResolveProcessor->GetNodeHelper();
737 return lpNodeHelper->XFA_GetIndex(refNode, XFA_LOGIC_Transparent, 721 return lpNodeHelper->XFA_GetIndex(refNode, XFA_LOGIC_Transparent,
738 lpNodeHelper->XFA_NodeIsProperty(refNode), 722 lpNodeHelper->XFA_NodeIsProperty(refNode),
739 TRUE); 723 TRUE);
740 } 724 }
741 void CXFA_ScriptContext::GetSomExpression(CXFA_Node* refNode, 725 void CXFA_ScriptContext::GetSomExpression(CXFA_Node* refNode,
742 CFX_WideString& wsExpression) { 726 CFX_WideString& wsExpression) {
743 CXFA_NodeHelper* lpNodeHelper = m_pResolveProcessor->GetNodeHelper(); 727 CXFA_NodeHelper* lpNodeHelper = m_ResolveProcessor->GetNodeHelper();
744 lpNodeHelper->XFA_GetNameExpression(refNode, wsExpression, TRUE, 728 lpNodeHelper->XFA_GetNameExpression(refNode, wsExpression, TRUE,
745 XFA_LOGIC_Transparent); 729 XFA_LOGIC_Transparent);
746 } 730 }
747 void CXFA_ScriptContext::SetNodesOfRunScript(CXFA_NodeArray* pArray) { 731 void CXFA_ScriptContext::SetNodesOfRunScript(CXFA_NodeArray* pArray) {
748 m_pScriptNodeArray = pArray; 732 m_pScriptNodeArray = pArray;
749 } 733 }
750 void CXFA_ScriptContext::AddNodesOfRunScript(const CXFA_NodeArray& nodes) { 734 void CXFA_ScriptContext::AddNodesOfRunScript(const CXFA_NodeArray& nodes) {
751 if (!m_pScriptNodeArray) { 735 if (!m_pScriptNodeArray)
752 return; 736 return;
753 } 737 if (nodes.GetSize() > 0)
754 if (nodes.GetSize() > 0) {
755 m_pScriptNodeArray->Copy(nodes); 738 m_pScriptNodeArray->Copy(nodes);
756 }
757 } 739 }
758 void CXFA_ScriptContext::AddNodesOfRunScript(CXFA_Node* pNode) { 740 void CXFA_ScriptContext::AddNodesOfRunScript(CXFA_Node* pNode) {
759 if (!m_pScriptNodeArray) { 741 if (!m_pScriptNodeArray)
760 return; 742 return;
761 } 743 if (m_pScriptNodeArray->Find(pNode) == -1)
762 if (m_pScriptNodeArray->Find(pNode) == -1) {
763 m_pScriptNodeArray->Add(pNode); 744 m_pScriptNodeArray->Add(pNode);
764 }
765 } 745 }
OLDNEW
« no previous file with comments | « xfa/fxfa/parser/xfa_script_imp.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698