Index: fpdfsdk/javascript/Field.cpp |
diff --git a/fpdfsdk/javascript/Field.cpp b/fpdfsdk/javascript/Field.cpp |
index f8ac479a42aecd0d467318f5c8b8cb372904d989..e04cbd696fdbe37162eb6cd6bc71e87f6bf869f8 100644 |
--- a/fpdfsdk/javascript/Field.cpp |
+++ b/fpdfsdk/javascript/Field.cpp |
@@ -265,24 +265,28 @@ void Field::UpdateFormField(CPDFSDK_FormFillEnvironment* pFormFillEnv, |
CPDFSDK_InterForm* pInterForm = pFormFillEnv->GetInterForm(); |
if (bResetAP) { |
- std::vector<CPDFSDK_Widget*> widgets; |
+ std::vector<CPDFSDK_Annot::ObservedPtr> widgets; |
pInterForm->GetWidgets(pFormField, &widgets); |
int nFieldType = pFormField->GetFieldType(); |
if (nFieldType == FIELDTYPE_COMBOBOX || nFieldType == FIELDTYPE_TEXTFIELD) { |
- for (CPDFSDK_Annot* pAnnot : widgets) { |
- bool bFormatted = false; |
- CPDFSDK_Annot::ObservedPtr pObserved(pAnnot); |
- CFX_WideString sValue = |
- static_cast<CPDFSDK_Widget*>(pObserved.Get())->OnFormat(bFormatted); |
+ for (auto& pObserved : widgets) { |
if (pObserved) { |
- static_cast<CPDFSDK_Widget*>(pObserved.Get()) |
- ->ResetAppearance(bFormatted ? &sValue : nullptr, false); |
+ bool bFormatted = false; |
+ CFX_WideString sValue = static_cast<CPDFSDK_Widget*>(pObserved.Get()) |
+ ->OnFormat(bFormatted); |
+ if (pObserved) { // Not redundant, may be clobbered by OnFormat. |
+ static_cast<CPDFSDK_Widget*>(pObserved.Get()) |
+ ->ResetAppearance(bFormatted ? &sValue : nullptr, false); |
+ } |
} |
} |
} else { |
- for (CPDFSDK_Widget* pWidget : widgets) { |
- pWidget->ResetAppearance(nullptr, false); |
+ for (auto& pObserved : widgets) { |
+ if (pObserved) { |
+ static_cast<CPDFSDK_Widget*>(pObserved.Get()) |
+ ->ResetAppearance(nullptr, false); |
+ } |
} |
} |
} |
@@ -291,16 +295,18 @@ void Field::UpdateFormField(CPDFSDK_FormFillEnvironment* pFormFillEnv, |
// Refresh the widget list. The calls in |bResetAP| may have caused widgets |
// to be removed from the list. We need to call |GetWidgets| again to be |
// sure none of the widgets have been deleted. |
- std::vector<CPDFSDK_Widget*> widgets; |
+ std::vector<CPDFSDK_Annot::ObservedPtr> widgets; |
pInterForm->GetWidgets(pFormField, &widgets); |
// TODO(dsinclair): Determine if all widgets share the same |
// CPDFSDK_InterForm. If that's the case, we can move the code to |
// |GetFormFillEnv| out of the loop. |
- for (CPDFSDK_Widget* pWidget : widgets) { |
- pWidget->GetInterForm() |
- ->GetFormFillEnv() |
- ->UpdateAllViews(nullptr, pWidget); |
+ for (auto& pObserved : widgets) { |
+ if (pObserved) { |
+ CPDFSDK_Widget* pWidget = static_cast<CPDFSDK_Widget*>(pObserved.Get()); |
+ pWidget->GetInterForm()->GetFormFillEnv()->UpdateAllViews(nullptr, |
+ pWidget); |
+ } |
} |
} |
@@ -1803,8 +1809,10 @@ bool Field::numItems(IJS_Context* cc, |
} |
bool Field::page(IJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError) { |
- if (!vp.IsGetting()) |
+ if (!vp.IsGetting()) { |
+ sError = JSGetStringFromID(IDS_STRING_JSREADONLY); |
return false; |
+ } |
std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName); |
if (FieldArray.empty()) |
@@ -1814,9 +1822,8 @@ bool Field::page(IJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError) { |
if (!pFormField) |
return false; |
- std::vector<CPDFSDK_Widget*> widgets; |
+ std::vector<CPDFSDK_Annot::ObservedPtr> widgets; |
m_pFormFillEnv->GetInterForm()->GetWidgets(pFormField, &widgets); |
- |
if (widgets.empty()) { |
vp << (int32_t)-1; |
return true; |
@@ -1824,13 +1831,21 @@ bool Field::page(IJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError) { |
CJS_Runtime* pRuntime = CJS_Runtime::FromContext(cc); |
CJS_Array PageArray; |
- for (size_t i = 0; i < widgets.size(); ++i) { |
- CPDFSDK_PageView* pPageView = widgets[i]->GetPageView(); |
+ int i = 0; |
+ for (const auto& pObserved : widgets) { |
+ if (!pObserved) { |
+ sError = JSGetStringFromID(IDS_STRING_JSBADOBJECT); |
+ return false; |
+ } |
+ |
+ auto pWidget = static_cast<CPDFSDK_Widget*>(pObserved.Get()); |
+ CPDFSDK_PageView* pPageView = pWidget->GetPageView(); |
if (!pPageView) |
return false; |
PageArray.SetElement( |
pRuntime, i, CJS_Value(pRuntime, (int32_t)pPageView->GetPageIndex())); |
+ ++i; |
} |
vp << PageArray; |