| OLD | NEW |
| 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 527 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 538 if (m_eScriptType != XFA_SCRIPTLANGTYPE_Formcalc || | 538 if (m_eScriptType != XFA_SCRIPTLANGTYPE_Formcalc || |
| 539 (dwStyles & (XFA_RESOLVENODE_Parent | XFA_RESOLVENODE_Siblings))) { | 539 (dwStyles & (XFA_RESOLVENODE_Parent | XFA_RESOLVENODE_Siblings))) { |
| 540 m_upObjectArray.RemoveAll(); | 540 m_upObjectArray.RemoveAll(); |
| 541 } | 541 } |
| 542 if (refNode && refNode->IsNode() && | 542 if (refNode && refNode->IsNode() && |
| 543 (dwStyles & (XFA_RESOLVENODE_Parent | XFA_RESOLVENODE_Siblings))) { | 543 (dwStyles & (XFA_RESOLVENODE_Parent | XFA_RESOLVENODE_Siblings))) { |
| 544 m_upObjectArray.Add(refNode->AsNode()); | 544 m_upObjectArray.Add(refNode->AsNode()); |
| 545 } | 545 } |
| 546 FX_BOOL bNextCreate = FALSE; | 546 FX_BOOL bNextCreate = FALSE; |
| 547 if (dwStyles & XFA_RESOLVENODE_CreateNode) { | 547 if (dwStyles & XFA_RESOLVENODE_CreateNode) { |
| 548 m_ResolveProcessor->GetNodeHelper()->XFA_SetCreateNodeType(bindNode); | 548 m_ResolveProcessor->GetNodeHelper()->SetCreateNodeType(bindNode); |
| 549 } | 549 } |
| 550 m_ResolveProcessor->GetNodeHelper()->m_pCreateParent = nullptr; | 550 m_ResolveProcessor->GetNodeHelper()->m_pCreateParent = nullptr; |
| 551 m_ResolveProcessor->GetNodeHelper()->m_iCurAllStart = -1; | 551 m_ResolveProcessor->GetNodeHelper()->m_iCurAllStart = -1; |
| 552 CXFA_ResolveNodesData rndFind; | 552 CXFA_ResolveNodesData rndFind; |
| 553 int32_t nStart = 0; | 553 int32_t nStart = 0; |
| 554 int32_t nLevel = 0; | 554 int32_t nLevel = 0; |
| 555 int32_t nRet = -1; | 555 int32_t nRet = -1; |
| 556 rndFind.m_pSC = this; | 556 rndFind.m_pSC = this; |
| 557 CXFA_ObjArray findNodes; | 557 CXFA_ObjArray findNodes; |
| 558 findNodes.Add(refNode ? refNode : m_pDocument->GetRoot()); | 558 findNodes.Add(refNode ? refNode : m_pDocument->GetRoot()); |
| 559 int32_t nNodes = 0; | 559 int32_t nNodes = 0; |
| 560 while (TRUE) { | 560 while (TRUE) { |
| 561 nNodes = findNodes.GetSize(); | 561 nNodes = findNodes.GetSize(); |
| 562 int32_t i = 0; | 562 int32_t i = 0; |
| 563 rndFind.m_dwStyles = dwStyles; | 563 rndFind.m_dwStyles = dwStyles; |
| 564 m_ResolveProcessor->m_iCurStart = nStart; | 564 m_ResolveProcessor->SetCurStart(nStart); |
| 565 nStart = m_ResolveProcessor->XFA_ResolveNodes_GetFilter(wsExpression, | 565 nStart = m_ResolveProcessor->GetFilter(wsExpression, nStart, rndFind); |
| 566 nStart, rndFind); | |
| 567 if (nStart < 1) { | 566 if (nStart < 1) { |
| 568 if ((dwStyles & XFA_RESOLVENODE_CreateNode) && !bNextCreate) { | 567 if ((dwStyles & XFA_RESOLVENODE_CreateNode) && !bNextCreate) { |
| 569 CXFA_Node* pDataNode = nullptr; | 568 CXFA_Node* pDataNode = nullptr; |
| 570 nStart = m_ResolveProcessor->GetNodeHelper()->m_iCurAllStart; | 569 nStart = m_ResolveProcessor->GetNodeHelper()->m_iCurAllStart; |
| 571 if (nStart != -1) { | 570 if (nStart != -1) { |
| 572 pDataNode = m_pDocument->GetNotBindNode(findNodes); | 571 pDataNode = m_pDocument->GetNotBindNode(findNodes); |
| 573 if (pDataNode) { | 572 if (pDataNode) { |
| 574 findNodes.RemoveAll(); | 573 findNodes.RemoveAll(); |
| 575 findNodes.Add(pDataNode); | 574 findNodes.Add(pDataNode); |
| 576 break; | 575 break; |
| 577 } | 576 } |
| 578 } else { | 577 } else { |
| 579 pDataNode = findNodes[0]->AsNode(); | 578 pDataNode = findNodes[0]->AsNode(); |
| 580 findNodes.RemoveAll(); | 579 findNodes.RemoveAll(); |
| 581 findNodes.Add(pDataNode); | 580 findNodes.Add(pDataNode); |
| 582 break; | 581 break; |
| 583 } | 582 } |
| 584 dwStyles |= XFA_RESOLVENODE_Bind; | 583 dwStyles |= XFA_RESOLVENODE_Bind; |
| 585 findNodes.RemoveAll(); | 584 findNodes.RemoveAll(); |
| 586 findNodes.Add(m_ResolveProcessor->GetNodeHelper()->m_pAllStartParent); | 585 findNodes.Add(m_ResolveProcessor->GetNodeHelper()->m_pAllStartParent); |
| 587 continue; | 586 continue; |
| 588 } else { | 587 } else { |
| 589 break; | 588 break; |
| 590 } | 589 } |
| 591 } | 590 } |
| 592 if (bNextCreate) { | 591 if (bNextCreate) { |
| 593 FX_BOOL bCreate = | 592 FX_BOOL bCreate = |
| 594 m_ResolveProcessor->GetNodeHelper()->XFA_ResolveNodes_CreateNode( | 593 m_ResolveProcessor->GetNodeHelper()->ResolveNodes_CreateNode( |
| 595 rndFind.m_wsName, rndFind.m_wsCondition, | 594 rndFind.m_wsName, rndFind.m_wsCondition, |
| 596 nStart == wsExpression.GetLength(), this); | 595 nStart == wsExpression.GetLength(), this); |
| 597 if (bCreate) { | 596 if (bCreate) { |
| 598 continue; | 597 continue; |
| 599 } else { | 598 } else { |
| 600 break; | 599 break; |
| 601 } | 600 } |
| 602 } | 601 } |
| 603 CXFA_ObjArray retNodes; | 602 CXFA_ObjArray retNodes; |
| 604 while (i < nNodes) { | 603 while (i < nNodes) { |
| 605 FX_BOOL bDataBind = FALSE; | 604 FX_BOOL bDataBind = FALSE; |
| 606 if (((dwStyles & XFA_RESOLVENODE_Bind) || | 605 if (((dwStyles & XFA_RESOLVENODE_Bind) || |
| 607 (dwStyles & XFA_RESOLVENODE_CreateNode)) && | 606 (dwStyles & XFA_RESOLVENODE_CreateNode)) && |
| 608 nNodes > 1) { | 607 nNodes > 1) { |
| 609 CXFA_ResolveNodesData rndBind; | 608 CXFA_ResolveNodesData rndBind; |
| 610 m_ResolveProcessor->XFA_ResolveNodes_GetFilter(wsExpression, nStart, | 609 m_ResolveProcessor->GetFilter(wsExpression, nStart, rndBind); |
| 611 rndBind); | 610 m_ResolveProcessor->SetIndexDataBind(rndBind.m_wsCondition, i, nNodes); |
| 612 m_ResolveProcessor->XFA_ResolveNode_SetIndexDataBind( | |
| 613 rndBind.m_wsCondition, i, nNodes); | |
| 614 bDataBind = TRUE; | 611 bDataBind = TRUE; |
| 615 } | 612 } |
| 616 rndFind.m_CurNode = findNodes[i++]; | 613 rndFind.m_CurNode = findNodes[i++]; |
| 617 rndFind.m_nLevel = nLevel; | 614 rndFind.m_nLevel = nLevel; |
| 618 rndFind.m_dwFlag = XFA_RESOVENODE_RSTYPE_Nodes; | 615 rndFind.m_dwFlag = XFA_RESOVENODE_RSTYPE_Nodes; |
| 619 nRet = m_ResolveProcessor->XFA_ResolveNodes(rndFind); | 616 nRet = m_ResolveProcessor->Resolve(rndFind); |
| 620 if (nRet < 1) { | 617 if (nRet < 1) { |
| 621 continue; | 618 continue; |
| 622 } | 619 } |
| 623 if (rndFind.m_dwFlag == XFA_RESOVENODE_RSTYPE_Attribute && | 620 if (rndFind.m_dwFlag == XFA_RESOVENODE_RSTYPE_Attribute && |
| 624 rndFind.m_pScriptAttribute && nStart < wsExpression.GetLength()) { | 621 rndFind.m_pScriptAttribute && nStart < wsExpression.GetLength()) { |
| 625 std::unique_ptr<CFXJSE_Value> pValue(new CFXJSE_Value(m_pIsolate)); | 622 std::unique_ptr<CFXJSE_Value> pValue(new CFXJSE_Value(m_pIsolate)); |
| 626 (rndFind.m_Nodes[0]->*(rndFind.m_pScriptAttribute->lpfnCallback))( | 623 (rndFind.m_Nodes[0]->*(rndFind.m_pScriptAttribute->lpfnCallback))( |
| 627 pValue.get(), FALSE, | 624 pValue.get(), FALSE, |
| 628 (XFA_ATTRIBUTE)rndFind.m_pScriptAttribute->eAttribute); | 625 (XFA_ATTRIBUTE)rndFind.m_pScriptAttribute->eAttribute); |
| 629 rndFind.m_Nodes.SetAt(0, ToObject(pValue.get(), nullptr)); | 626 rndFind.m_Nodes.SetAt(0, ToObject(pValue.get(), nullptr)); |
| (...skipping 12 matching lines...) Expand all Loading... |
| 642 nNodes = retNodes.GetSize(); | 639 nNodes = retNodes.GetSize(); |
| 643 if (nNodes < 1) { | 640 if (nNodes < 1) { |
| 644 if (dwStyles & XFA_RESOLVENODE_CreateNode) { | 641 if (dwStyles & XFA_RESOLVENODE_CreateNode) { |
| 645 bNextCreate = TRUE; | 642 bNextCreate = TRUE; |
| 646 if (!m_ResolveProcessor->GetNodeHelper()->m_pCreateParent) { | 643 if (!m_ResolveProcessor->GetNodeHelper()->m_pCreateParent) { |
| 647 m_ResolveProcessor->GetNodeHelper()->m_pCreateParent = | 644 m_ResolveProcessor->GetNodeHelper()->m_pCreateParent = |
| 648 ToNode(rndFind.m_CurNode); | 645 ToNode(rndFind.m_CurNode); |
| 649 m_ResolveProcessor->GetNodeHelper()->m_iCreateCount = 1; | 646 m_ResolveProcessor->GetNodeHelper()->m_iCreateCount = 1; |
| 650 } | 647 } |
| 651 FX_BOOL bCreate = | 648 FX_BOOL bCreate = |
| 652 m_ResolveProcessor->GetNodeHelper()->XFA_ResolveNodes_CreateNode( | 649 m_ResolveProcessor->GetNodeHelper()->ResolveNodes_CreateNode( |
| 653 rndFind.m_wsName, rndFind.m_wsCondition, | 650 rndFind.m_wsName, rndFind.m_wsCondition, |
| 654 nStart == wsExpression.GetLength(), this); | 651 nStart == wsExpression.GetLength(), this); |
| 655 if (bCreate) { | 652 if (bCreate) { |
| 656 continue; | 653 continue; |
| 657 } else { | 654 } else { |
| 658 break; | 655 break; |
| 659 } | 656 } |
| 660 } else { | 657 } else { |
| 661 break; | 658 break; |
| 662 } | 659 } |
| (...skipping 10 matching lines...) Expand all Loading... |
| 673 if (nNodes > 0) { | 670 if (nNodes > 0) { |
| 674 resolveNodeRS.nodes.Append(findNodes); | 671 resolveNodeRS.nodes.Append(findNodes); |
| 675 } | 672 } |
| 676 if (rndFind.m_dwFlag == XFA_RESOVENODE_RSTYPE_Attribute) { | 673 if (rndFind.m_dwFlag == XFA_RESOVENODE_RSTYPE_Attribute) { |
| 677 resolveNodeRS.pScriptAttribute = rndFind.m_pScriptAttribute; | 674 resolveNodeRS.pScriptAttribute = rndFind.m_pScriptAttribute; |
| 678 return 1; | 675 return 1; |
| 679 } | 676 } |
| 680 } | 677 } |
| 681 if (dwStyles & (XFA_RESOLVENODE_CreateNode | XFA_RESOLVENODE_Bind | | 678 if (dwStyles & (XFA_RESOLVENODE_CreateNode | XFA_RESOLVENODE_Bind | |
| 682 XFA_RESOLVENODE_BindNew)) { | 679 XFA_RESOLVENODE_BindNew)) { |
| 683 m_ResolveProcessor->XFA_ResolveNode_SetResultCreateNode( | 680 m_ResolveProcessor->SetResultCreateNode(resolveNodeRS, |
| 684 resolveNodeRS, rndFind.m_wsCondition); | 681 rndFind.m_wsCondition); |
| 685 if (!bNextCreate && (dwStyles & XFA_RESOLVENODE_CreateNode)) { | 682 if (!bNextCreate && (dwStyles & XFA_RESOLVENODE_CreateNode)) { |
| 686 resolveNodeRS.dwFlags = XFA_RESOVENODE_RSTYPE_ExistNodes; | 683 resolveNodeRS.dwFlags = XFA_RESOVENODE_RSTYPE_ExistNodes; |
| 687 } | 684 } |
| 688 return resolveNodeRS.nodes.GetSize(); | 685 return resolveNodeRS.nodes.GetSize(); |
| 689 } | 686 } |
| 690 return nNodes; | 687 return nNodes; |
| 691 } | 688 } |
| 692 | 689 |
| 693 void CXFA_ScriptContext::AddToCacheList(std::unique_ptr<CXFA_NodeList> pList) { | 690 void CXFA_ScriptContext::AddToCacheList(std::unique_ptr<CXFA_NodeList> pList) { |
| 694 m_CacheList.push_back(std::move(pList)); | 691 m_CacheList.push_back(std::move(pList)); |
| (...skipping 10 matching lines...) Expand all Loading... |
| 705 return iter->second.get(); | 702 return iter->second.get(); |
| 706 | 703 |
| 707 std::unique_ptr<CFXJSE_Value> jsValue(new CFXJSE_Value(m_pIsolate)); | 704 std::unique_ptr<CFXJSE_Value> jsValue(new CFXJSE_Value(m_pIsolate)); |
| 708 jsValue->SetObject(pObject, m_pJsClass); | 705 jsValue->SetObject(pObject, m_pJsClass); |
| 709 CFXJSE_Value* pValue = jsValue.get(); | 706 CFXJSE_Value* pValue = jsValue.get(); |
| 710 m_mapObjectToValue.insert(std::make_pair(pObject, std::move(jsValue))); | 707 m_mapObjectToValue.insert(std::make_pair(pObject, std::move(jsValue))); |
| 711 return pValue; | 708 return pValue; |
| 712 } | 709 } |
| 713 int32_t CXFA_ScriptContext::GetIndexByName(CXFA_Node* refNode) { | 710 int32_t CXFA_ScriptContext::GetIndexByName(CXFA_Node* refNode) { |
| 714 CXFA_NodeHelper* lpNodeHelper = m_ResolveProcessor->GetNodeHelper(); | 711 CXFA_NodeHelper* lpNodeHelper = m_ResolveProcessor->GetNodeHelper(); |
| 715 return lpNodeHelper->XFA_GetIndex(refNode, XFA_LOGIC_Transparent, | 712 return lpNodeHelper->GetIndex(refNode, XFA_LOGIC_Transparent, |
| 716 lpNodeHelper->XFA_NodeIsProperty(refNode), | 713 lpNodeHelper->NodeIsProperty(refNode), FALSE); |
| 717 FALSE); | |
| 718 } | 714 } |
| 719 int32_t CXFA_ScriptContext::GetIndexByClassName(CXFA_Node* refNode) { | 715 int32_t CXFA_ScriptContext::GetIndexByClassName(CXFA_Node* refNode) { |
| 720 CXFA_NodeHelper* lpNodeHelper = m_ResolveProcessor->GetNodeHelper(); | 716 CXFA_NodeHelper* lpNodeHelper = m_ResolveProcessor->GetNodeHelper(); |
| 721 return lpNodeHelper->XFA_GetIndex(refNode, XFA_LOGIC_Transparent, | 717 return lpNodeHelper->GetIndex(refNode, XFA_LOGIC_Transparent, |
| 722 lpNodeHelper->XFA_NodeIsProperty(refNode), | 718 lpNodeHelper->NodeIsProperty(refNode), TRUE); |
| 723 TRUE); | |
| 724 } | 719 } |
| 725 void CXFA_ScriptContext::GetSomExpression(CXFA_Node* refNode, | 720 void CXFA_ScriptContext::GetSomExpression(CXFA_Node* refNode, |
| 726 CFX_WideString& wsExpression) { | 721 CFX_WideString& wsExpression) { |
| 727 CXFA_NodeHelper* lpNodeHelper = m_ResolveProcessor->GetNodeHelper(); | 722 CXFA_NodeHelper* lpNodeHelper = m_ResolveProcessor->GetNodeHelper(); |
| 728 lpNodeHelper->XFA_GetNameExpression(refNode, wsExpression, TRUE, | 723 lpNodeHelper->GetNameExpression(refNode, wsExpression, TRUE, |
| 729 XFA_LOGIC_Transparent); | 724 XFA_LOGIC_Transparent); |
| 730 } | 725 } |
| 731 void CXFA_ScriptContext::SetNodesOfRunScript(CXFA_NodeArray* pArray) { | 726 void CXFA_ScriptContext::SetNodesOfRunScript(CXFA_NodeArray* pArray) { |
| 732 m_pScriptNodeArray = pArray; | 727 m_pScriptNodeArray = pArray; |
| 733 } | 728 } |
| 734 void CXFA_ScriptContext::AddNodesOfRunScript(const CXFA_NodeArray& nodes) { | 729 void CXFA_ScriptContext::AddNodesOfRunScript(const CXFA_NodeArray& nodes) { |
| 735 if (!m_pScriptNodeArray) | 730 if (!m_pScriptNodeArray) |
| 736 return; | 731 return; |
| 737 if (nodes.GetSize() > 0) | 732 if (nodes.GetSize() > 0) |
| 738 m_pScriptNodeArray->Copy(nodes); | 733 m_pScriptNodeArray->Copy(nodes); |
| 739 } | 734 } |
| 740 void CXFA_ScriptContext::AddNodesOfRunScript(CXFA_Node* pNode) { | 735 void CXFA_ScriptContext::AddNodesOfRunScript(CXFA_Node* pNode) { |
| 741 if (!m_pScriptNodeArray) | 736 if (!m_pScriptNodeArray) |
| 742 return; | 737 return; |
| 743 if (m_pScriptNodeArray->Find(pNode) == -1) | 738 if (m_pScriptNodeArray->Find(pNode) == -1) |
| 744 m_pScriptNodeArray->Add(pNode); | 739 m_pScriptNodeArray->Add(pNode); |
| 745 } | 740 } |
| OLD | NEW |