Do not call into formfiller code with a NULL PageView.
authorLei Zhang <thestig@chromium.org>
Fri, 2 Oct 2015 21:01:37 +0000 (14:01 -0700)
committerLei Zhang <thestig@chromium.org>
Fri, 2 Oct 2015 21:01:37 +0000 (14:01 -0700)
BUG=537173
R=jun_fang@foxitsoftware.com, tsepez@chromium.org

Review URL: https://codereview.chromium.org/1376093002 .

fpdfsdk/include/formfiller/FFL_FormFiller.h
fpdfsdk/src/formfiller/FFL_FormFiller.cpp
fpdfsdk/src/formfiller/FFL_IFormFiller.cpp

index 799154c..35b4bdf 100644 (file)
@@ -76,8 +76,8 @@ class CFFL_FormFiller : public IPWL_Provider, public CPWL_TimerHandler {
                             FX_UINT nFlags);
   virtual FX_BOOL OnChar(CPDFSDK_Annot* pAnnot, FX_UINT nChar, FX_UINT nFlags);
 
-  FX_BOOL SetFocusForAnnot(CPDFSDK_Annot* pAnnot, FX_UINT nFlag);
-  FX_BOOL KillFocusForAnnot(CPDFSDK_Annot* pAnnot, FX_UINT nFlag);
+  void SetFocusForAnnot(CPDFSDK_Annot* pAnnot, FX_UINT nFlag);
+  void KillFocusForAnnot(CPDFSDK_Annot* pAnnot, FX_UINT nFlag);
 
   // CPWL_TimerHandler
   void TimerProc() override;
index 80e1b0e..1bd2944 100644 (file)
@@ -242,8 +242,7 @@ FX_BOOL CFFL_FormFiller::OnChar(CPDFSDK_Annot* pAnnot,
   return FALSE;
 }
 
-FX_BOOL CFFL_FormFiller::SetFocusForAnnot(CPDFSDK_Annot* pAnnot,
-                                          FX_UINT nFlag) {
+void CFFL_FormFiller::SetFocusForAnnot(CPDFSDK_Annot* pAnnot, FX_UINT nFlag) {
   CPDFSDK_Widget* pWidget = (CPDFSDK_Widget*)pAnnot;
   CPDF_Page* pPage = pWidget->GetPDFPage();
   CPDFSDK_Document* pDoc = m_pApp->GetSDKDocument();
@@ -254,31 +253,31 @@ FX_BOOL CFFL_FormFiller::SetFocusForAnnot(CPDFSDK_Annot* pAnnot,
   m_bValid = TRUE;
   FX_RECT rcRect = GetViewBBox(pPageView, pAnnot);
   InvalidateRect(rcRect.left, rcRect.top, rcRect.right, rcRect.bottom);
-  return TRUE;
 }
 
-FX_BOOL CFFL_FormFiller::KillFocusForAnnot(CPDFSDK_Annot* pAnnot,
-                                           FX_UINT nFlag) {
+void CFFL_FormFiller::KillFocusForAnnot(CPDFSDK_Annot* pAnnot, FX_UINT nFlag) {
   if (!IsValid())
-    return TRUE;
+    return;
 
   CPDFSDK_PageView* pPageView = GetCurPageView();
+  if (!pPageView)
+    return;
+
   CommitData(pPageView, nFlag);
 
   if (CPWL_Wnd* pWnd = GetPDFWindow(pPageView, FALSE))
     pWnd->KillFocus();
 
+  FX_BOOL bDestroyPDFWindow;
   switch (m_pWidget->GetFieldType()) {
     case FIELDTYPE_PUSHBUTTON:
     case FIELDTYPE_CHECKBOX:
     case FIELDTYPE_RADIOBUTTON:
-      EscapeFiller(pPageView, TRUE);
-      break;
+      bDestroyPDFWindow = TRUE;
     default:
-      EscapeFiller(pPageView, FALSE);
-      break;
+      bDestroyPDFWindow = FALSE;
   }
-  return TRUE;
+  EscapeFiller(pPageView, bDestroyPDFWindow);
 }
 
 FX_BOOL CFFL_FormFiller::IsValid() const {
index f8f8c6a..69ff932 100644 (file)
@@ -459,7 +459,7 @@ FX_BOOL CFFL_IFormFiller::OnSetFocus(CPDFSDK_Annot* pAnnot, FX_UINT nFlag) {
   }
 
   if (CFFL_FormFiller* pFormFiller = GetFormFiller(pAnnot, TRUE))
-    return pFormFiller->SetFocusForAnnot(pAnnot, nFlag);
+    pFormFiller->SetFocusForAnnot(pAnnot, nFlag);
 
   return TRUE;
 }
@@ -470,8 +470,7 @@ FX_BOOL CFFL_IFormFiller::OnKillFocus(CPDFSDK_Annot* pAnnot, FX_UINT nFlag) {
   ASSERT(pAnnot->GetPDFAnnot()->GetSubType() == "Widget");
 
   if (CFFL_FormFiller* pFormFiller = GetFormFiller(pAnnot, FALSE)) {
-    if (!pFormFiller->KillFocusForAnnot(pAnnot, nFlag))
-      return FALSE;
+    pFormFiller->KillFocusForAnnot(pAnnot, nFlag);
 
     if (!m_bNotifying) {
       CPDFSDK_Widget* pWidget = (CPDFSDK_Widget*)pAnnot;