From facd0157ce975158da1659fb58a16c1308bd553b Mon Sep 17 00:00:00 2001 From: Bo Xu Date: Wed, 24 Sep 2014 10:49:52 -0700 Subject: Lock page in LoadFXAnnot to prevent unintended page closing BUG=410326 R=tsepez@chromium.org Review URL: https://codereview.chromium.org/594403003 --- fpdfsdk/include/fsdk_mgr.h | 25 ++++++++----------------- fpdfsdk/src/fpdfview.cpp | 6 ++++++ fpdfsdk/src/fsdk_mgr.cpp | 23 ++++++++++++++++++++--- 3 files changed, 34 insertions(+), 20 deletions(-) diff --git a/fpdfsdk/include/fsdk_mgr.h b/fpdfsdk/include/fsdk_mgr.h index 95d1a79352..a6f990c36f 100644 --- a/fpdfsdk/include/fsdk_mgr.h +++ b/fpdfsdk/include/fsdk_mgr.h @@ -460,15 +460,12 @@ private: CPDF_OCContext * m_pOccontent; FX_BOOL m_bChangeMask; }; - class CPDFSDK_PageView FX_FINAL { public: CPDFSDK_PageView(CPDFSDK_Document* pSDKDoc,CPDF_Page* page); ~CPDFSDK_PageView(); -public: void PageView_OnDraw(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device,CPDF_RenderOptions* pOptions) ; -public: CPDF_Annot* GetPDFAnnotAtPoint(FX_FLOAT pageX, FX_FLOAT pageY); CPDFSDK_Annot* GetFXAnnotAtPoint(FX_FLOAT pageX, FX_FLOAT pageY); CPDF_Annot* GetPDFWidgetAtPoint(FX_FLOAT pageX, FX_FLOAT pageY); @@ -489,7 +486,6 @@ public: CPDF_Page* GetPDFPage(){return m_page;} CPDF_Document* GetPDFDocument(); CPDFSDK_Document* GetSDKDocument() {return m_pSDKDoc;} -public: FX_BOOL OnLButtonDown(const CPDF_Point & point, FX_UINT nFlag); FX_BOOL OnLButtonUp(const CPDF_Point & point, FX_UINT nFlag); FX_BOOL OnChar(int nChar, FX_UINT nFlag); @@ -499,39 +495,34 @@ public: FX_BOOL OnMouseMove(const CPDF_Point & point, int nFlag); FX_BOOL OnMouseWheel(double deltaX, double deltaY,const CPDF_Point& point, int nFlag); FX_BOOL IsValidAnnot(FX_LPVOID p); -public: void GetCurrentMatrix(CPDF_Matrix& matrix) {matrix = m_curMatrix;} void UpdateRects(CFX_RectArray& rects); void UpdateView(CPDFSDK_Annot* pAnnot); CFX_PtrArray* GetAnnotList(){ return &m_fxAnnotArray; } -public: int GetPageIndex(); void LoadFXAnnots(); -private: - CPDF_Matrix m_curMatrix; + void SetValid(FX_BOOL bValid) {m_bValid = bValid;} + FX_BOOL IsValid() {return m_bValid;} + void SetLock(FX_BOOL bLocked) {m_bLocked= bLocked;} + FX_BOOL IsLocked() {return m_bLocked;} + void TakeOverPage() {m_bTakeOverPage = TRUE;} private: void PageView_OnHighlightFormFields(CFX_RenderDevice* pDevice, CPDFSDK_Widget* pWidget); - -private: + CPDF_Matrix m_curMatrix; CPDF_Page* m_page; CPDF_AnnotList* m_pAnnotList; - //CPDFSDK_Annot* m_pFocusAnnot; CFX_PtrArray m_fxAnnotArray; - CPDFSDK_Document* m_pSDKDoc; -private: CPDFSDK_Widget* m_CaptureWidget; FX_BOOL m_bEnterWidget; FX_BOOL m_bExitWidget; FX_BOOL m_bOnWidget; -public: - void SetValid(FX_BOOL bValid) {m_bValid = bValid;} - FX_BOOL IsValid() {return m_bValid;} -private: FX_BOOL m_bValid; + FX_BOOL m_bLocked; + FX_BOOL m_bTakeOverPage; }; diff --git a/fpdfsdk/src/fpdfview.cpp b/fpdfsdk/src/fpdfview.cpp index 49dabe300b..bd49862e1c 100644 --- a/fpdfsdk/src/fpdfview.cpp +++ b/fpdfsdk/src/fpdfview.cpp @@ -5,6 +5,7 @@ // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com #include "../include/fsdk_define.h" +#include "../include/fsdk_mgr.h" #include "../include/fpdfview.h" #include "../include/fsdk_rendercontext.h" #include "../include/fpdf_progressive.h" @@ -591,6 +592,11 @@ DLLEXPORT void STDCALL FPDF_RenderPageBitmap(FPDF_BITMAP bitmap, FPDF_PAGE page, DLLEXPORT void STDCALL FPDF_ClosePage(FPDF_PAGE page) { if (!page) return; + CPDFSDK_PageView* pPageView = (CPDFSDK_PageView*)(((CPDF_Page*)page))->GetPrivateData((FX_LPVOID)page); + if (pPageView && pPageView->IsLocked()) { + pPageView->TakeOverPage(); + return; + } delete (CPDF_Page*)page; } diff --git a/fpdfsdk/src/fsdk_mgr.cpp b/fpdfsdk/src/fsdk_mgr.cpp index 52173b4c96..efb21a7efc 100644 --- a/fpdfsdk/src/fsdk_mgr.cpp +++ b/fpdfsdk/src/fsdk_mgr.cpp @@ -332,7 +332,14 @@ CPDFSDK_Document::CPDFSDK_Document(CPDF_Document* pDoc,CPDFDoc_Environment* pEnv CPDFSDK_Document::~CPDFSDK_Document() { - m_pageMap.RemoveAll(); + FX_POSITION pos = m_pageMap.GetStartPosition(); + while (pos) { + CPDF_Page* pPage = NULL; + CPDFSDK_PageView* pPageView = NULL; + m_pageMap.GetNextAssoc(pos, pPage, pPageView); + delete pPageView; + } + m_pageMap.RemoveAll(); if(m_pInterForm) { m_pInterForm->Destroy(); @@ -453,7 +460,7 @@ CPDF_OCContext* CPDFSDK_Document::GetOCContext() void CPDFSDK_Document::ReMovePageView(CPDF_Page* pPDFPage) { CPDFSDK_PageView* pPageView = (CPDFSDK_PageView*)m_pageMap.GetValueAt(pPDFPage); - if(pPageView) + if(pPageView && !pPageView->IsLocked()) { delete pPageView; m_pageMap.RemoveKey(pPDFPage); @@ -608,7 +615,7 @@ CPDFSDK_PageView::CPDFSDK_PageView(CPDFSDK_Document* pSDKDoc,CPDF_Page* page):m_ CPDF_InterForm* pPDFInterForm = pInterForm->GetInterForm(); pPDFInterForm->FixPageFields(page); } - + m_page->SetPrivateData((FX_LPVOID)m_page, (FX_LPVOID)this, NULL); m_fxAnnotArray.RemoveAll(); m_bEnterWidget = FALSE; @@ -616,12 +623,15 @@ CPDFSDK_PageView::CPDFSDK_PageView(CPDFSDK_Document* pSDKDoc,CPDF_Page* page):m_ m_bOnWidget = FALSE; m_CaptureWidget = NULL; m_bValid = FALSE; + m_bLocked = FALSE; + m_bTakeOverPage = FALSE; } CPDFSDK_PageView::~CPDFSDK_PageView() { CPDFDoc_Environment* pEnv = m_pSDKDoc->GetEnv(); int nAnnotCount = m_fxAnnotArray.GetSize(); + for (int i=0; iRemovePrivateData((FX_LPVOID)m_page); + if(m_bTakeOverPage) { + delete m_page; + } } void CPDFSDK_PageView::PageView_OnDraw(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device,CPDF_RenderOptions* pOptions) @@ -972,6 +986,7 @@ void CPDFSDK_PageView::LoadFXAnnots() m_pAnnotList = new CPDF_AnnotList(m_page); CPDF_InterForm::EnableUpdateAP(enableAPUpdate); int nCount = m_pAnnotList->Count(); + SetLock(TRUE); for(int i=0; iGetAt(i); @@ -981,6 +996,7 @@ void CPDFSDK_PageView::LoadFXAnnots() CPDFSDK_AnnotHandlerMgr* pAnnotHandlerMgr = pEnv->GetAnnotHandlerMgr(); ASSERT(pAnnotHandlerMgr != NULL); + if(pAnnotHandlerMgr) { CPDFSDK_Annot* pAnnot = pAnnotHandlerMgr->NewAnnot(pPDFAnnot, this); @@ -992,6 +1008,7 @@ void CPDFSDK_PageView::LoadFXAnnots() } } + SetLock(FALSE); } void CPDFSDK_PageView::UpdateRects(CFX_RectArray& rects) -- cgit v1.2.3