Add helper methods for getting objects in CPDF_FormField.
Consolidate calls to FPDF_GetFieldAttr() and make it more obvious to
readers what objects are being retrieved.
Change-Id: If348122bb23fa9e1e7857e30428cad929f74fbf7
Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/59941
Reviewed-by: Henrique Nakashima <hnakashima@chromium.org>
Commit-Queue: Lei Zhang <thestig@chromium.org>
diff --git a/core/fpdfdoc/cpdf_formfield.cpp b/core/fpdfdoc/cpdf_formfield.cpp
index 3de2bea..7bd99ea 100644
--- a/core/fpdfdoc/cpdf_formfield.cpp
+++ b/core/fpdfdoc/cpdf_formfield.cpp
@@ -172,8 +172,7 @@
case kRichText:
case kFile:
default: {
- const CPDF_Object* pDV =
- FPDF_GetFieldAttr(m_pDict.Get(), pdfium::form_fields::kDV);
+ const CPDF_Object* pDV = GetDefaultValueObject();
WideString csDValue;
if (pDV)
csDValue = pDV->GetUnicodeText();
@@ -181,8 +180,7 @@
WideString csValue;
{
// Limit the scope of |pV| because it may get invalidated below.
- const CPDF_Object* pV =
- FPDF_GetFieldAttr(m_pDict.Get(), pdfium::form_fields::kV);
+ const CPDF_Object* pV = GetValueObject();
if (pV)
csValue = pV->GetUnicodeText();
}
@@ -294,11 +292,10 @@
return GetCheckValue(bDefault);
const CPDF_Object* pValue =
- FPDF_GetFieldAttr(m_pDict.Get(), bDefault ? pdfium::form_fields::kDV
- : pdfium::form_fields::kV);
+ bDefault ? GetDefaultValueObject() : GetValueObject();
if (!pValue) {
if (!bDefault && m_Type != kText)
- pValue = FPDF_GetFieldAttr(m_pDict.Get(), pdfium::form_fields::kDV);
+ pValue = GetDefaultValueObject();
if (!pValue)
return WideString();
}
@@ -410,13 +407,9 @@
}
int CPDF_FormField::CountSelectedItems() const {
- const CPDF_Object* pValue =
- FPDF_GetFieldAttr(m_pDict.Get(), pdfium::form_fields::kV);
- if (!pValue) {
- pValue = FPDF_GetFieldAttr(m_pDict.Get(), "I");
- if (!pValue)
- return 0;
- }
+ const CPDF_Object* pValue = GetValueOrSelectedIndicesObject();
+ if (!pValue)
+ return 0;
if (pValue->IsString() || pValue->IsNumber())
return pValue->GetString().IsEmpty() ? 0 : 1;
@@ -425,13 +418,10 @@
}
int CPDF_FormField::GetSelectedIndex(int index) const {
- const CPDF_Object* pValue =
- FPDF_GetFieldAttr(m_pDict.Get(), pdfium::form_fields::kV);
- if (!pValue) {
- pValue = FPDF_GetFieldAttr(m_pDict.Get(), "I");
- if (!pValue)
- return -1;
- }
+ const CPDF_Object* pValue = GetValueOrSelectedIndicesObject();
+ if (!pValue)
+ return -1;
+
if (pValue->IsNumber())
return pValue->GetInteger();
@@ -485,13 +475,9 @@
return true;
WideString opt_value = GetOptionValue(index);
- const CPDF_Object* pValue =
- FPDF_GetFieldAttr(m_pDict.Get(), pdfium::form_fields::kV);
- if (!pValue) {
- pValue = FPDF_GetFieldAttr(m_pDict.Get(), "I");
- if (!pValue)
- return false;
- }
+ const CPDF_Object* pValue = GetValueOrSelectedIndicesObject();
+ if (!pValue)
+ return false;
if (pValue->IsString())
return pValue->GetUnicodeText() == opt_value;
@@ -562,8 +548,7 @@
void CPDF_FormField::SetItemSelectionUnselected(int index,
const WideString& opt_value) {
- const CPDF_Object* pValue =
- FPDF_GetFieldAttr(m_pDict.Get(), pdfium::form_fields::kV);
+ const CPDF_Object* pValue = GetValueObject();
if (!pValue)
return;
@@ -604,8 +589,7 @@
int CPDF_FormField::GetDefaultSelectedItem() const {
ASSERT(GetType() == kComboBox || GetType() == kListBox);
- const CPDF_Object* pValue =
- FPDF_GetFieldAttr(m_pDict.Get(), pdfium::form_fields::kDV);
+ const CPDF_Object* pValue = GetDefaultValueObject();
if (!pValue)
return -1;
WideString csDV = pValue->GetUnicodeText();
@@ -693,8 +677,7 @@
m_pDict->SetNewFor<CPDF_Name>(pdfium::form_fields::kV, csBExport);
} else {
ByteString csV;
- const CPDF_Object* pV =
- FPDF_GetFieldAttr(m_pDict.Get(), pdfium::form_fields::kV);
+ const CPDF_Object* pV = GetValueObject();
if (pV)
csV = pV->GetString();
if (csV == csBExport)
@@ -752,12 +735,12 @@
}
int CPDF_FormField::CountSelectedOptions() const {
- const CPDF_Array* pArray = ToArray(FPDF_GetFieldAttr(m_pDict.Get(), "I"));
+ const CPDF_Array* pArray = ToArray(GetSelectedIndicesObject());
return pArray ? pArray->size() : 0;
}
int CPDF_FormField::GetSelectedOptionIndex(int index) const {
- const CPDF_Array* pArray = ToArray(FPDF_GetFieldAttr(m_pDict.Get(), "I"));
+ const CPDF_Array* pArray = ToArray(GetSelectedIndicesObject());
if (!pArray)
return -1;
@@ -768,7 +751,7 @@
}
bool CPDF_FormField::IsOptionSelected(int iOptIndex) const {
- const CPDF_Array* pArray = ToArray(FPDF_GetFieldAttr(m_pDict.Get(), "I"));
+ const CPDF_Array* pArray = ToArray(GetSelectedIndicesObject());
if (!pArray)
return false;
@@ -916,6 +899,25 @@
}
}
+const CPDF_Object* CPDF_FormField::GetDefaultValueObject() const {
+ return FPDF_GetFieldAttr(m_pDict.Get(), pdfium::form_fields::kDV);
+}
+
+const CPDF_Object* CPDF_FormField::GetValueObject() const {
+ return FPDF_GetFieldAttr(m_pDict.Get(), pdfium::form_fields::kV);
+}
+
+const CPDF_Object* CPDF_FormField::GetSelectedIndicesObject() const {
+ ASSERT(GetType() == kComboBox || GetType() == kListBox);
+ return FPDF_GetFieldAttr(m_pDict.Get(), "I");
+}
+
+const CPDF_Object* CPDF_FormField::GetValueOrSelectedIndicesObject() const {
+ ASSERT(GetType() == kComboBox || GetType() == kListBox);
+ const CPDF_Object* pValue = GetValueObject();
+ return pValue ? pValue : GetSelectedIndicesObject();
+}
+
const std::vector<UnownedPtr<CPDF_FormControl>>& CPDF_FormField::GetControls()
const {
return m_pForm->GetControlsForField(this);
diff --git a/core/fpdfdoc/cpdf_formfield.h b/core/fpdfdoc/cpdf_formfield.h
index 960fb0e..4c59591 100644
--- a/core/fpdfdoc/cpdf_formfield.h
+++ b/core/fpdfdoc/cpdf_formfield.h
@@ -189,6 +189,16 @@
bool NotifyListOrComboBoxBeforeChange(const WideString& value);
void NotifyListOrComboBoxAfterChange();
+ const CPDF_Object* GetDefaultValueObject() const;
+ const CPDF_Object* GetValueObject() const;
+
+ // For choice fields.
+ const CPDF_Object* GetSelectedIndicesObject() const;
+
+ // For choice fields.
+ // Value object takes precedence over selected indices object.
+ const CPDF_Object* GetValueOrSelectedIndicesObject() const;
+
const std::vector<UnownedPtr<CPDF_FormControl>>& GetControls() const;
CPDF_FormField::Type m_Type = kUnknown;