Better encapsulate CPDF_InteractiveForm::m_pFormNotify.
Funnel calls through CPDF_InteractiveForm methods rather than handing
out a pointer to m_pFormNotify. Let CPDF_InteractiveForm deal with
the possibility of no m_pFormNotify, which doesn't happen apart
from tests.
Change-Id: I2eaeedfc0542c6eedd0bf7472afa69766bd774d9
Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/98951
Reviewed-by: Lei Zhang <thestig@chromium.org>
Commit-Queue: Tom Sepez <tsepez@chromium.org>
diff --git a/core/fpdfdoc/cpdf_formfield.cpp b/core/fpdfdoc/cpdf_formfield.cpp
index 3e83912..7a0554d 100644
--- a/core/fpdfdoc/cpdf_formfield.cpp
+++ b/core/fpdfdoc/cpdf_formfield.cpp
@@ -156,8 +156,7 @@
CheckControl(i, GetControl(i)->IsDefaultChecked(),
NotificationOption::kDoNotNotify);
}
- if (m_pForm->GetFormNotify())
- m_pForm->GetFormNotify()->AfterCheckedStatusChange(this);
+ m_pForm->NotifyAfterCheckedStatusChange(this);
break;
}
case kComboBox:
@@ -196,7 +195,7 @@
if (!bHasRV && (csDValue == csValue))
return false;
- if (!NotifyBeforeValueChange(csDValue))
+ if (!m_pForm->NotifyBeforeValueChange(this, csDValue))
return false;
{
@@ -217,7 +216,7 @@
m_pDict->RemoveFor(pdfium::form_fields::kRV);
}
}
- NotifyAfterValueChange();
+ m_pForm->NotifyAfterValueChange(this);
break;
}
}
@@ -343,7 +342,7 @@
case kComboBox: {
WideString csValue = value;
if (notify == NotificationOption::kNotify &&
- !NotifyBeforeValueChange(csValue)) {
+ !m_pForm->NotifyBeforeValueChange(this, csValue)) {
return false;
}
ByteString key(bDefault ? pdfium::form_fields::kDV
@@ -363,7 +362,7 @@
}
}
if (notify == NotificationOption::kNotify)
- NotifyAfterValueChange();
+ m_pForm->NotifyAfterValueChange(this);
break;
}
case kListBox: {
@@ -375,7 +374,7 @@
return false;
if (notify == NotificationOption::kNotify &&
- !NotifyBeforeSelectionChange(value)) {
+ !m_pForm->NotifyBeforeSelectionChange(this, value)) {
return false;
}
if (!bDefault) {
@@ -383,7 +382,7 @@
SetItemSelection(iIndex, NotificationOption::kDoNotNotify);
}
if (notify == NotificationOption::kNotify)
- NotifyAfterSelectionChange();
+ m_pForm->NotifyAfterSelectionChange(this);
break;
}
default:
@@ -460,7 +459,7 @@
}
bool CPDF_FormField::ClearSelection(NotificationOption notify) {
- if (notify == NotificationOption::kNotify && m_pForm->GetFormNotify()) {
+ if (notify == NotificationOption::kNotify) {
WideString csValue;
int iIndex = GetSelectedIndex(0);
if (iIndex >= 0)
@@ -637,8 +636,8 @@
m_pDict->SetNewFor<CPDF_Name>(pdfium::form_fields::kV,
ByteString::FormatInteger(iControlIndex));
}
- if (notify == NotificationOption::kNotify && m_pForm->GetFormNotify())
- m_pForm->GetFormNotify()->AfterCheckedStatusChange(this);
+ if (notify == NotificationOption::kNotify)
+ m_pForm->NotifyAfterCheckedStatusChange(this);
return true;
}
@@ -674,8 +673,8 @@
if (val)
break;
}
- if (notify == NotificationOption::kNotify && m_pForm->GetFormNotify())
- m_pForm->GetFormNotify()->AfterCheckedStatusChange(this);
+ if (notify == NotificationOption::kNotify)
+ m_pForm->NotifyAfterCheckedStatusChange(this);
return true;
}
@@ -830,34 +829,12 @@
return pdfium::Contains(values, GetOptionValue(index));
}
-bool CPDF_FormField::NotifyBeforeSelectionChange(const WideString& value) {
- auto* pNotify = m_pForm->GetFormNotify();
- return !pNotify || pNotify->BeforeSelectionChange(this, value);
-}
-
-void CPDF_FormField::NotifyAfterSelectionChange() {
- auto* pNotify = m_pForm->GetFormNotify();
- if (pNotify)
- pNotify->AfterSelectionChange(this);
-}
-
-bool CPDF_FormField::NotifyBeforeValueChange(const WideString& value) {
- auto* pNotify = m_pForm->GetFormNotify();
- return !pNotify || pNotify->BeforeValueChange(this, value);
-}
-
-void CPDF_FormField::NotifyAfterValueChange() {
- auto* pNotify = m_pForm->GetFormNotify();
- if (pNotify)
- pNotify->AfterValueChange(this);
-}
-
bool CPDF_FormField::NotifyListOrComboBoxBeforeChange(const WideString& value) {
switch (GetType()) {
case kListBox:
- return NotifyBeforeSelectionChange(value);
+ return m_pForm->NotifyBeforeSelectionChange(this, value);
case kComboBox:
- return NotifyBeforeValueChange(value);
+ return m_pForm->NotifyBeforeValueChange(this, value);
default:
return true;
}
@@ -866,10 +843,10 @@
void CPDF_FormField::NotifyListOrComboBoxAfterChange() {
switch (GetType()) {
case kListBox:
- NotifyAfterSelectionChange();
+ m_pForm->NotifyAfterSelectionChange(this);
break;
case kComboBox:
- NotifyAfterValueChange();
+ m_pForm->NotifyAfterValueChange(this);
break;
default:
break;
diff --git a/core/fpdfdoc/cpdf_formfield.h b/core/fpdfdoc/cpdf_formfield.h
index db8952b..a899776 100644
--- a/core/fpdfdoc/cpdf_formfield.h
+++ b/core/fpdfdoc/cpdf_formfield.h
@@ -156,10 +156,6 @@
bool bDefault,
NotificationOption notify);
void SetItemSelectionSelected(int index, const WideString& opt_value);
- bool NotifyBeforeSelectionChange(const WideString& value);
- void NotifyAfterSelectionChange();
- bool NotifyBeforeValueChange(const WideString& value);
- void NotifyAfterValueChange();
bool NotifyListOrComboBoxBeforeChange(const WideString& value);
void NotifyListOrComboBoxAfterChange();
diff --git a/core/fpdfdoc/cpdf_interactiveform.cpp b/core/fpdfdoc/cpdf_interactiveform.cpp
index 02c06f4..7e6a344 100644
--- a/core/fpdfdoc/cpdf_interactiveform.cpp
+++ b/core/fpdfdoc/cpdf_interactiveform.cpp
@@ -997,3 +997,31 @@
void CPDF_InteractiveForm::SetNotifierIface(NotifierIface* pNotify) {
m_pFormNotify = pNotify;
}
+
+bool CPDF_InteractiveForm::NotifyBeforeValueChange(CPDF_FormField* pField,
+ const WideString& csValue) {
+ return !m_pFormNotify || m_pFormNotify->BeforeValueChange(pField, csValue);
+}
+
+void CPDF_InteractiveForm::NotifyAfterValueChange(CPDF_FormField* pField) {
+ if (m_pFormNotify)
+ m_pFormNotify->AfterValueChange(pField);
+}
+
+bool CPDF_InteractiveForm::NotifyBeforeSelectionChange(
+ CPDF_FormField* pField,
+ const WideString& csValue) {
+ return !m_pFormNotify ||
+ m_pFormNotify->BeforeSelectionChange(pField, csValue);
+}
+
+void CPDF_InteractiveForm::NotifyAfterSelectionChange(CPDF_FormField* pField) {
+ if (m_pFormNotify)
+ m_pFormNotify->AfterSelectionChange(pField);
+}
+
+void CPDF_InteractiveForm::NotifyAfterCheckedStatusChange(
+ CPDF_FormField* pField) {
+ if (m_pFormNotify)
+ m_pFormNotify->AfterCheckedStatusChange(pField);
+}
diff --git a/core/fpdfdoc/cpdf_interactiveform.h b/core/fpdfdoc/cpdf_interactiveform.h
index ee39243..3499ef5 100644
--- a/core/fpdfdoc/cpdf_interactiveform.h
+++ b/core/fpdfdoc/cpdf_interactiveform.h
@@ -90,11 +90,19 @@
void SetNotifierIface(NotifierIface* pNotify);
void FixPageFields(CPDF_Page* pPage);
- NotifierIface* GetFormNotify() const { return m_pFormNotify.Get(); }
CPDF_Document* GetDocument() const { return m_pDocument.Get(); }
const CPDF_Dictionary* GetFormDict() const { return m_pFormDict.Get(); }
RetainPtr<CPDF_Dictionary> GetMutableFormDict() { return m_pFormDict; }
+ // Wrap callbacks thru NotifierIface.
+ bool NotifyBeforeValueChange(CPDF_FormField* pField,
+ const WideString& csValue);
+ void NotifyAfterValueChange(CPDF_FormField* pField);
+ bool NotifyBeforeSelectionChange(CPDF_FormField* pField,
+ const WideString& csValue);
+ void NotifyAfterSelectionChange(CPDF_FormField* pField);
+ void NotifyAfterCheckedStatusChange(CPDF_FormField* pField);
+
const std::vector<UnownedPtr<CPDF_FormControl>>& GetControlsForField(
const CPDF_FormField* pField);