OLD | NEW |
1 // Copyright 2016 PDFium Authors. All rights reserved. | 1 // Copyright 2016 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 "fpdfsdk/cpdfsdk_formfillenvironment.h" | 7 #include "fpdfsdk/cpdfsdk_formfillenvironment.h" |
8 | 8 |
9 #include <memory> | 9 #include <memory> |
10 | 10 |
(...skipping 23 matching lines...) Expand all Loading... |
34 UnderlyingDocumentType* pDoc, | 34 UnderlyingDocumentType* pDoc, |
35 FPDF_FORMFILLINFO* pFFinfo) | 35 FPDF_FORMFILLINFO* pFFinfo) |
36 : m_pInfo(pFFinfo), | 36 : m_pInfo(pFFinfo), |
37 m_pUnderlyingDoc(pDoc), | 37 m_pUnderlyingDoc(pDoc), |
38 m_pSysHandler(new CFX_SystemHandler(this)), | 38 m_pSysHandler(new CFX_SystemHandler(this)), |
39 m_bChangeMask(false), | 39 m_bChangeMask(false), |
40 m_bBeingDestroyed(false) {} | 40 m_bBeingDestroyed(false) {} |
41 | 41 |
42 CPDFSDK_FormFillEnvironment::~CPDFSDK_FormFillEnvironment() { | 42 CPDFSDK_FormFillEnvironment::~CPDFSDK_FormFillEnvironment() { |
43 m_bBeingDestroyed = true; | 43 m_bBeingDestroyed = true; |
44 | |
45 ClearAllFocusedAnnots(); | 44 ClearAllFocusedAnnots(); |
46 | 45 |
47 // |m_pAnnotHandlerMgr| will try to access |m_pFormFiller| | 46 // |m_PageMap| will try to access |m_pInterForm| when it cleans itself up. |
48 // when it cleans up. So, we must make sure it is cleaned up before | 47 // Make sure it is deleted before |m_pInterForm|. |
49 // |m_pFormFiller|. | 48 m_PageMap.clear(); |
| 49 |
| 50 // |m_pAnnotHandlerMgr| will try to access |m_pFormFiller| when it cleans |
| 51 // itself up. Make sure it is deleted before |m_pFormFiller|. |
50 m_pAnnotHandlerMgr.reset(); | 52 m_pAnnotHandlerMgr.reset(); |
51 | 53 |
52 // Must destroy the |m_pFormFiller| before the environment (|this|) | 54 // Must destroy the |m_pFormFiller| before the environment (|this|) |
53 // because any created form widgets hold a pointer to the environment. | 55 // because any created form widgets hold a pointer to the environment. |
54 // Those widgets may call things like KillTimer() as they are shutdown. | 56 // Those widgets may call things like KillTimer() as they are shutdown. |
55 m_pFormFiller.reset(); | 57 m_pFormFiller.reset(); |
56 | 58 |
57 if (m_pInfo && m_pInfo->Release) | 59 if (m_pInfo && m_pInfo->Release) |
58 m_pInfo->Release(m_pInfo); | 60 m_pInfo->Release(m_pInfo); |
59 } | 61 } |
(...skipping 496 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
556 } | 558 } |
557 | 559 |
558 void CPDFSDK_FormFillEnvironment::PageEvent(int iPageCount, | 560 void CPDFSDK_FormFillEnvironment::PageEvent(int iPageCount, |
559 uint32_t dwEventType) const { | 561 uint32_t dwEventType) const { |
560 if (m_pInfo && m_pInfo->FFI_PageEvent) | 562 if (m_pInfo && m_pInfo->FFI_PageEvent) |
561 m_pInfo->FFI_PageEvent(m_pInfo, iPageCount, dwEventType); | 563 m_pInfo->FFI_PageEvent(m_pInfo, iPageCount, dwEventType); |
562 } | 564 } |
563 #endif // PDF_ENABLE_XFA | 565 #endif // PDF_ENABLE_XFA |
564 | 566 |
565 void CPDFSDK_FormFillEnvironment::ClearAllFocusedAnnots() { | 567 void CPDFSDK_FormFillEnvironment::ClearAllFocusedAnnots() { |
566 for (auto& it : m_pageMap) { | 568 for (auto& it : m_PageMap) { |
567 if (it.second->IsValidSDKAnnot(GetFocusAnnot())) | 569 if (it.second->IsValidSDKAnnot(GetFocusAnnot())) |
568 KillFocusAnnot(0); | 570 KillFocusAnnot(0); |
569 } | 571 } |
570 } | 572 } |
571 | 573 |
572 CPDFSDK_PageView* CPDFSDK_FormFillEnvironment::GetPageView( | 574 CPDFSDK_PageView* CPDFSDK_FormFillEnvironment::GetPageView( |
573 UnderlyingPageType* pUnderlyingPage, | 575 UnderlyingPageType* pUnderlyingPage, |
574 bool renew) { | 576 bool renew) { |
575 auto it = m_pageMap.find(pUnderlyingPage); | 577 auto it = m_PageMap.find(pUnderlyingPage); |
576 if (it != m_pageMap.end()) | 578 if (it != m_PageMap.end()) |
577 return it->second.get(); | 579 return it->second.get(); |
578 | 580 |
579 if (!renew) | 581 if (!renew) |
580 return nullptr; | 582 return nullptr; |
581 | 583 |
582 CPDFSDK_PageView* pPageView = new CPDFSDK_PageView(this, pUnderlyingPage); | 584 CPDFSDK_PageView* pPageView = new CPDFSDK_PageView(this, pUnderlyingPage); |
583 m_pageMap[pUnderlyingPage].reset(pPageView); | 585 m_PageMap[pUnderlyingPage].reset(pPageView); |
584 // Delay to load all the annotations, to avoid endless loop. | 586 // Delay to load all the annotations, to avoid endless loop. |
585 pPageView->LoadFXAnnots(); | 587 pPageView->LoadFXAnnots(); |
586 return pPageView; | 588 return pPageView; |
587 } | 589 } |
588 | 590 |
589 CPDFSDK_PageView* CPDFSDK_FormFillEnvironment::GetCurrentView() { | 591 CPDFSDK_PageView* CPDFSDK_FormFillEnvironment::GetCurrentView() { |
590 UnderlyingPageType* pPage = | 592 UnderlyingPageType* pPage = |
591 UnderlyingFromFPDFPage(GetCurrentPage(m_pUnderlyingDoc)); | 593 UnderlyingFromFPDFPage(GetCurrentPage(m_pUnderlyingDoc)); |
592 return pPage ? GetPageView(pPage, true) : nullptr; | 594 return pPage ? GetPageView(pPage, true) : nullptr; |
593 } | 595 } |
594 | 596 |
595 CPDFSDK_PageView* CPDFSDK_FormFillEnvironment::GetPageView(int nIndex) { | 597 CPDFSDK_PageView* CPDFSDK_FormFillEnvironment::GetPageView(int nIndex) { |
596 UnderlyingPageType* pTempPage = | 598 UnderlyingPageType* pTempPage = |
597 UnderlyingFromFPDFPage(GetPage(m_pUnderlyingDoc, nIndex)); | 599 UnderlyingFromFPDFPage(GetPage(m_pUnderlyingDoc, nIndex)); |
598 if (!pTempPage) | 600 if (!pTempPage) |
599 return nullptr; | 601 return nullptr; |
600 | 602 |
601 auto it = m_pageMap.find(pTempPage); | 603 auto it = m_PageMap.find(pTempPage); |
602 return it != m_pageMap.end() ? it->second.get() : nullptr; | 604 return it != m_PageMap.end() ? it->second.get() : nullptr; |
603 } | 605 } |
604 | 606 |
605 void CPDFSDK_FormFillEnvironment::ProcJavascriptFun() { | 607 void CPDFSDK_FormFillEnvironment::ProcJavascriptFun() { |
606 CPDF_Document* pPDFDoc = GetPDFDocument(); | 608 CPDF_Document* pPDFDoc = GetPDFDocument(); |
607 CPDF_DocJSActions docJS(pPDFDoc); | 609 CPDF_DocJSActions docJS(pPDFDoc); |
608 int iCount = docJS.CountJSActions(); | 610 int iCount = docJS.CountJSActions(); |
609 if (iCount < 1) | 611 if (iCount < 1) |
610 return; | 612 return; |
611 for (int i = 0; i < iCount; i++) { | 613 for (int i = 0; i < iCount; i++) { |
612 CFX_ByteString csJSName; | 614 CFX_ByteString csJSName; |
(...skipping 27 matching lines...) Expand all Loading... |
640 CPDF_Action action(pDict); | 642 CPDF_Action action(pDict); |
641 if (GetActionHander()) | 643 if (GetActionHander()) |
642 GetActionHander()->DoAction_DocOpen(action, this); | 644 GetActionHander()->DoAction_DocOpen(action, this); |
643 return true; | 645 return true; |
644 } | 646 } |
645 return false; | 647 return false; |
646 } | 648 } |
647 | 649 |
648 void CPDFSDK_FormFillEnvironment::RemovePageView( | 650 void CPDFSDK_FormFillEnvironment::RemovePageView( |
649 UnderlyingPageType* pUnderlyingPage) { | 651 UnderlyingPageType* pUnderlyingPage) { |
650 auto it = m_pageMap.find(pUnderlyingPage); | 652 auto it = m_PageMap.find(pUnderlyingPage); |
651 if (it == m_pageMap.end()) | 653 if (it == m_PageMap.end()) |
652 return; | 654 return; |
653 | 655 |
654 CPDFSDK_PageView* pPageView = it->second.get(); | 656 CPDFSDK_PageView* pPageView = it->second.get(); |
655 if (pPageView->IsLocked() || pPageView->IsBeingDestroyed()) | 657 if (pPageView->IsLocked() || pPageView->IsBeingDestroyed()) |
656 return; | 658 return; |
657 | 659 |
658 // Mark the page view so we do not come into |RemovePageView| a second | 660 // Mark the page view so we do not come into |RemovePageView| a second |
659 // time while we're in the process of removing. | 661 // time while we're in the process of removing. |
660 pPageView->SetBeingDestroyed(); | 662 pPageView->SetBeingDestroyed(); |
661 | 663 |
662 // This must happen before we remove |pPageView| from the map because | 664 // This must happen before we remove |pPageView| from the map because |
663 // |KillFocusAnnot| can call into the |GetPage| method which will | 665 // |KillFocusAnnot| can call into the |GetPage| method which will |
664 // look for this page view in the map, if it doesn't find it a new one will | 666 // look for this page view in the map, if it doesn't find it a new one will |
665 // be created. We then have two page views pointing to the same page and | 667 // be created. We then have two page views pointing to the same page and |
666 // bad things happen. | 668 // bad things happen. |
667 if (pPageView->IsValidSDKAnnot(GetFocusAnnot())) | 669 if (pPageView->IsValidSDKAnnot(GetFocusAnnot())) |
668 KillFocusAnnot(0); | 670 KillFocusAnnot(0); |
669 | 671 |
670 // Remove the page from the map to make sure we don't accidentally attempt | 672 // Remove the page from the map to make sure we don't accidentally attempt |
671 // to use the |pPageView| while we're cleaning it up. | 673 // to use the |pPageView| while we're cleaning it up. |
672 m_pageMap.erase(it); | 674 m_PageMap.erase(it); |
673 } | 675 } |
674 | 676 |
675 UnderlyingPageType* CPDFSDK_FormFillEnvironment::GetPage(int nIndex) { | 677 UnderlyingPageType* CPDFSDK_FormFillEnvironment::GetPage(int nIndex) { |
676 return UnderlyingFromFPDFPage(GetPage(m_pUnderlyingDoc, nIndex)); | 678 return UnderlyingFromFPDFPage(GetPage(m_pUnderlyingDoc, nIndex)); |
677 } | 679 } |
678 | 680 |
679 CPDFSDK_InterForm* CPDFSDK_FormFillEnvironment::GetInterForm() { | 681 CPDFSDK_InterForm* CPDFSDK_FormFillEnvironment::GetInterForm() { |
680 if (!m_pInterForm) | 682 if (!m_pInterForm) |
681 m_pInterForm = pdfium::MakeUnique<CPDFSDK_InterForm>(this); | 683 m_pInterForm = pdfium::MakeUnique<CPDFSDK_InterForm>(this); |
682 return m_pInterForm.get(); | 684 return m_pInterForm.get(); |
683 } | 685 } |
684 | 686 |
685 void CPDFSDK_FormFillEnvironment::UpdateAllViews(CPDFSDK_PageView* pSender, | 687 void CPDFSDK_FormFillEnvironment::UpdateAllViews(CPDFSDK_PageView* pSender, |
686 CPDFSDK_Annot* pAnnot) { | 688 CPDFSDK_Annot* pAnnot) { |
687 for (const auto& it : m_pageMap) { | 689 for (const auto& it : m_PageMap) { |
688 CPDFSDK_PageView* pPageView = it.second.get(); | 690 CPDFSDK_PageView* pPageView = it.second.get(); |
689 if (pPageView != pSender) | 691 if (pPageView != pSender) |
690 pPageView->UpdateView(pAnnot); | 692 pPageView->UpdateView(pAnnot); |
691 } | 693 } |
692 } | 694 } |
693 | 695 |
694 bool CPDFSDK_FormFillEnvironment::SetFocusAnnot( | 696 bool CPDFSDK_FormFillEnvironment::SetFocusAnnot( |
695 CPDFSDK_Annot::ObservedPtr* pAnnot) { | 697 CPDFSDK_Annot::ObservedPtr* pAnnot) { |
696 if (m_bBeingDestroyed) | 698 if (m_bBeingDestroyed) |
697 return false; | 699 return false; |
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
751 } else { | 753 } else { |
752 m_pFocusAnnot.Reset(pFocusAnnot.Get()); | 754 m_pFocusAnnot.Reset(pFocusAnnot.Get()); |
753 } | 755 } |
754 } | 756 } |
755 return false; | 757 return false; |
756 } | 758 } |
757 | 759 |
758 bool CPDFSDK_FormFillEnvironment::GetPermissions(int nFlag) { | 760 bool CPDFSDK_FormFillEnvironment::GetPermissions(int nFlag) { |
759 return !!(GetPDFDocument()->GetUserPermissions() & nFlag); | 761 return !!(GetPDFDocument()->GetUserPermissions() & nFlag); |
760 } | 762 } |
OLD | NEW |