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 |