Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(801)

Side by Side Diff: fpdfsdk/javascript/Field.cpp

Issue 2624933002: Annotation deleted while retriveing it in JS (Closed)
Patch Set: rebase, another case. Created 3 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « fpdfsdk/javascript/Document.cpp ('k') | testing/resources/javascript/bug_679642.in » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2014 PDFium Authors. All rights reserved. 1 // Copyright 2014 PDFium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com 5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
6 6
7 #include "fpdfsdk/javascript/Field.h" 7 #include "fpdfsdk/javascript/Field.h"
8 8
9 #include <algorithm> 9 #include <algorithm>
10 #include <memory> 10 #include <memory>
(...skipping 247 matching lines...) Expand 10 before | Expand all | Expand 10 after
258 } 258 }
259 259
260 void Field::UpdateFormField(CPDFSDK_FormFillEnvironment* pFormFillEnv, 260 void Field::UpdateFormField(CPDFSDK_FormFillEnvironment* pFormFillEnv,
261 CPDF_FormField* pFormField, 261 CPDF_FormField* pFormField,
262 bool bChangeMark, 262 bool bChangeMark,
263 bool bResetAP, 263 bool bResetAP,
264 bool bRefresh) { 264 bool bRefresh) {
265 CPDFSDK_InterForm* pInterForm = pFormFillEnv->GetInterForm(); 265 CPDFSDK_InterForm* pInterForm = pFormFillEnv->GetInterForm();
266 266
267 if (bResetAP) { 267 if (bResetAP) {
268 std::vector<CPDFSDK_Widget*> widgets; 268 std::vector<CPDFSDK_Annot::ObservedPtr> widgets;
269 pInterForm->GetWidgets(pFormField, &widgets); 269 pInterForm->GetWidgets(pFormField, &widgets);
270 270
271 int nFieldType = pFormField->GetFieldType(); 271 int nFieldType = pFormField->GetFieldType();
272 if (nFieldType == FIELDTYPE_COMBOBOX || nFieldType == FIELDTYPE_TEXTFIELD) { 272 if (nFieldType == FIELDTYPE_COMBOBOX || nFieldType == FIELDTYPE_TEXTFIELD) {
273 for (CPDFSDK_Annot* pAnnot : widgets) { 273 for (auto& pObserved : widgets) {
274 bool bFormatted = false;
275 CPDFSDK_Annot::ObservedPtr pObserved(pAnnot);
276 CFX_WideString sValue =
277 static_cast<CPDFSDK_Widget*>(pObserved.Get())->OnFormat(bFormatted);
278 if (pObserved) { 274 if (pObserved) {
279 static_cast<CPDFSDK_Widget*>(pObserved.Get()) 275 bool bFormatted = false;
280 ->ResetAppearance(bFormatted ? &sValue : nullptr, false); 276 CFX_WideString sValue = static_cast<CPDFSDK_Widget*>(pObserved.Get())
277 ->OnFormat(bFormatted);
278 if (pObserved) { // Not redundant, may be clobbered by OnFormat.
279 static_cast<CPDFSDK_Widget*>(pObserved.Get())
280 ->ResetAppearance(bFormatted ? &sValue : nullptr, false);
281 }
281 } 282 }
282 } 283 }
283 } else { 284 } else {
284 for (CPDFSDK_Widget* pWidget : widgets) { 285 for (auto& pObserved : widgets) {
285 pWidget->ResetAppearance(nullptr, false); 286 if (pObserved) {
287 static_cast<CPDFSDK_Widget*>(pObserved.Get())
288 ->ResetAppearance(nullptr, false);
289 }
286 } 290 }
287 } 291 }
288 } 292 }
289 293
290 if (bRefresh) { 294 if (bRefresh) {
291 // Refresh the widget list. The calls in |bResetAP| may have caused widgets 295 // Refresh the widget list. The calls in |bResetAP| may have caused widgets
292 // to be removed from the list. We need to call |GetWidgets| again to be 296 // to be removed from the list. We need to call |GetWidgets| again to be
293 // sure none of the widgets have been deleted. 297 // sure none of the widgets have been deleted.
294 std::vector<CPDFSDK_Widget*> widgets; 298 std::vector<CPDFSDK_Annot::ObservedPtr> widgets;
295 pInterForm->GetWidgets(pFormField, &widgets); 299 pInterForm->GetWidgets(pFormField, &widgets);
296 300
297 // TODO(dsinclair): Determine if all widgets share the same 301 // TODO(dsinclair): Determine if all widgets share the same
298 // CPDFSDK_InterForm. If that's the case, we can move the code to 302 // CPDFSDK_InterForm. If that's the case, we can move the code to
299 // |GetFormFillEnv| out of the loop. 303 // |GetFormFillEnv| out of the loop.
300 for (CPDFSDK_Widget* pWidget : widgets) { 304 for (auto& pObserved : widgets) {
301 pWidget->GetInterForm() 305 if (pObserved) {
302 ->GetFormFillEnv() 306 CPDFSDK_Widget* pWidget = static_cast<CPDFSDK_Widget*>(pObserved.Get());
303 ->UpdateAllViews(nullptr, pWidget); 307 pWidget->GetInterForm()->GetFormFillEnv()->UpdateAllViews(nullptr,
308 pWidget);
309 }
304 } 310 }
305 } 311 }
306 312
307 if (bChangeMark) 313 if (bChangeMark)
308 pFormFillEnv->SetChangeMark(); 314 pFormFillEnv->SetChangeMark();
309 } 315 }
310 316
311 void Field::UpdateFormControl(CPDFSDK_FormFillEnvironment* pFormFillEnv, 317 void Field::UpdateFormControl(CPDFSDK_FormFillEnvironment* pFormFillEnv,
312 CPDF_FormControl* pFormControl, 318 CPDF_FormControl* pFormControl,
313 bool bChangeMark, 319 bool bChangeMark,
(...skipping 1482 matching lines...) Expand 10 before | Expand all | Expand 10 after
1796 if (pFormField->GetFieldType() != FIELDTYPE_COMBOBOX && 1802 if (pFormField->GetFieldType() != FIELDTYPE_COMBOBOX &&
1797 pFormField->GetFieldType() != FIELDTYPE_LISTBOX) { 1803 pFormField->GetFieldType() != FIELDTYPE_LISTBOX) {
1798 return false; 1804 return false;
1799 } 1805 }
1800 1806
1801 vp << (int32_t)pFormField->CountOptions(); 1807 vp << (int32_t)pFormField->CountOptions();
1802 return true; 1808 return true;
1803 } 1809 }
1804 1810
1805 bool Field::page(IJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError) { 1811 bool Field::page(IJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError) {
1806 if (!vp.IsGetting()) 1812 if (!vp.IsGetting()) {
1813 sError = JSGetStringFromID(IDS_STRING_JSREADONLY);
1807 return false; 1814 return false;
1815 }
1808 1816
1809 std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName); 1817 std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName);
1810 if (FieldArray.empty()) 1818 if (FieldArray.empty())
1811 return false; 1819 return false;
1812 1820
1813 CPDF_FormField* pFormField = FieldArray[0]; 1821 CPDF_FormField* pFormField = FieldArray[0];
1814 if (!pFormField) 1822 if (!pFormField)
1815 return false; 1823 return false;
1816 1824
1817 std::vector<CPDFSDK_Widget*> widgets; 1825 std::vector<CPDFSDK_Annot::ObservedPtr> widgets;
1818 m_pFormFillEnv->GetInterForm()->GetWidgets(pFormField, &widgets); 1826 m_pFormFillEnv->GetInterForm()->GetWidgets(pFormField, &widgets);
1819
1820 if (widgets.empty()) { 1827 if (widgets.empty()) {
1821 vp << (int32_t)-1; 1828 vp << (int32_t)-1;
1822 return true; 1829 return true;
1823 } 1830 }
1824 1831
1825 CJS_Runtime* pRuntime = CJS_Runtime::FromContext(cc); 1832 CJS_Runtime* pRuntime = CJS_Runtime::FromContext(cc);
1826 CJS_Array PageArray; 1833 CJS_Array PageArray;
1827 for (size_t i = 0; i < widgets.size(); ++i) { 1834 int i = 0;
1828 CPDFSDK_PageView* pPageView = widgets[i]->GetPageView(); 1835 for (const auto& pObserved : widgets) {
1836 if (!pObserved) {
1837 sError = JSGetStringFromID(IDS_STRING_JSBADOBJECT);
1838 return false;
1839 }
1840
1841 auto pWidget = static_cast<CPDFSDK_Widget*>(pObserved.Get());
1842 CPDFSDK_PageView* pPageView = pWidget->GetPageView();
1829 if (!pPageView) 1843 if (!pPageView)
1830 return false; 1844 return false;
1831 1845
1832 PageArray.SetElement( 1846 PageArray.SetElement(
1833 pRuntime, i, CJS_Value(pRuntime, (int32_t)pPageView->GetPageIndex())); 1847 pRuntime, i, CJS_Value(pRuntime, (int32_t)pPageView->GetPageIndex()));
1848 ++i;
1834 } 1849 }
1835 1850
1836 vp << PageArray; 1851 vp << PageArray;
1837 return true; 1852 return true;
1838 } 1853 }
1839 1854
1840 bool Field::password(IJS_Context* cc, 1855 bool Field::password(IJS_Context* cc,
1841 CJS_PropValue& vp, 1856 CJS_PropValue& vp,
1842 CFX_WideString& sError) { 1857 CFX_WideString& sError) {
1843 ASSERT(m_pFormFillEnv); 1858 ASSERT(m_pFormFillEnv);
(...skipping 1620 matching lines...) Expand 10 before | Expand all | Expand 10 after
3464 } 3479 }
3465 } 3480 }
3466 3481
3467 void Field::AddField(CPDFSDK_FormFillEnvironment* pFormFillEnv, 3482 void Field::AddField(CPDFSDK_FormFillEnvironment* pFormFillEnv,
3468 int nPageIndex, 3483 int nPageIndex,
3469 int nFieldType, 3484 int nFieldType,
3470 const CFX_WideString& sName, 3485 const CFX_WideString& sName,
3471 const CFX_FloatRect& rcCoords) { 3486 const CFX_FloatRect& rcCoords) {
3472 // Not supported. 3487 // Not supported.
3473 } 3488 }
OLDNEW
« no previous file with comments | « fpdfsdk/javascript/Document.cpp ('k') | testing/resources/javascript/bug_679642.in » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698