Index: fpdfsdk/fsdk_baseform.cpp |
diff --git a/fpdfsdk/fsdk_baseform.cpp b/fpdfsdk/fsdk_baseform.cpp |
index afbd95870d3f62b5ed0842ca6e7a99abda1fc4fa..dbaa06011d54cee8f8fddbae005bde422ba4ffa8 100644 |
--- a/fpdfsdk/fsdk_baseform.cpp |
+++ b/fpdfsdk/fsdk_baseform.cpp |
@@ -26,6 +26,7 @@ |
#include "fpdfsdk/javascript/ijs_context.h" |
#include "fpdfsdk/javascript/ijs_runtime.h" |
#include "fpdfsdk/pdfwindow/PWL_Utils.h" |
+#include "third_party/base/stl_util.h" |
#ifdef PDF_ENABLE_XFA |
#include "fpdfsdk/fpdfxfa/include/fpdfxfa_doc.h" |
@@ -47,6 +48,22 @@ PDFSDK_FieldAction::PDFSDK_FieldAction() |
bFieldFull(FALSE), |
bRC(TRUE) {} |
+CPDFSDK_Widget::Observer::Observer(CPDFSDK_Widget** pWatchedPtr) |
+ : m_pWatchedPtr(pWatchedPtr) { |
+ (*m_pWatchedPtr)->AddObserver(this); |
+} |
+ |
+CPDFSDK_Widget::Observer::~Observer() { |
+ if (m_pWatchedPtr) |
+ (*m_pWatchedPtr)->RemoveObserver(this); |
+} |
+ |
+void CPDFSDK_Widget::Observer::OnWidgetDestroyed() { |
+ ASSERT(m_pWatchedPtr); |
+ *m_pWatchedPtr = nullptr; |
+ m_pWatchedPtr = nullptr; |
+} |
+ |
CPDFSDK_Widget::CPDFSDK_Widget(CPDF_Annot* pAnnot, |
CPDFSDK_PageView* pPageView, |
CPDFSDK_InterForm* pInterForm) |
@@ -62,7 +79,20 @@ CPDFSDK_Widget::CPDFSDK_Widget(CPDF_Annot* pAnnot, |
{ |
} |
-CPDFSDK_Widget::~CPDFSDK_Widget() {} |
+CPDFSDK_Widget::~CPDFSDK_Widget() { |
+ for (auto* pObserver : m_Observers) |
+ pObserver->OnWidgetDestroyed(); |
+} |
+ |
+void CPDFSDK_Widget::AddObserver(Observer* pObserver) { |
+ ASSERT(!pdfium::ContainsKey(m_Observers, pObserver)); |
+ m_Observers.insert(pObserver); |
+} |
+ |
+void CPDFSDK_Widget::RemoveObserver(Observer* pObserver) { |
+ ASSERT(pdfium::ContainsKey(m_Observers, pObserver)); |
+ m_Observers.erase(pObserver); |
+} |
#ifdef PDF_ENABLE_XFA |
CXFA_FFWidget* CPDFSDK_Widget::GetMixXFAWidget() const { |