diff options
author | dsinclair <dsinclair@chromium.org> | 2016-09-07 05:46:55 -0700 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2016-09-07 05:46:55 -0700 |
commit | ce04a458828b45035dab46c13e14a1f0ae67a2b7 (patch) | |
tree | 089f5eb29d12518d8de99d9c30dba8da3d441e1f /fpdfsdk/javascript | |
parent | 0a765b832c5b9dd0a46fb5a25ce09d52dedb336b (diff) | |
download | pdfium-ce04a458828b45035dab46c13e14a1f0ae67a2b7.tar.xz |
Add observer for BAAnnots from Javascript
This Cl moves the observer code from the CPDFSDK_Widget up into the
CPDFSDK_Annot base class and then adds a second observer for CPDFSDK_BAAnnot
objects.
This allows us to attach an observer to the Annot javascript class which will
update its internal pointer to the BAAnnot if the BAAnnot is destroyed by
the CPDFSDK_PageView being destroyed.
BUG=chromium:642307
Review-Url: https://codereview.chromium.org/2306663002
Diffstat (limited to 'fpdfsdk/javascript')
-rw-r--r-- | fpdfsdk/javascript/Annot.cpp | 35 | ||||
-rw-r--r-- | fpdfsdk/javascript/Annot.h | 5 | ||||
-rw-r--r-- | fpdfsdk/javascript/Field.cpp | 7 |
3 files changed, 36 insertions, 11 deletions
diff --git a/fpdfsdk/javascript/Annot.cpp b/fpdfsdk/javascript/Annot.cpp index a23d42f72a..ab84247baa 100644 --- a/fpdfsdk/javascript/Annot.cpp +++ b/fpdfsdk/javascript/Annot.cpp @@ -11,6 +11,14 @@ #include "fpdfsdk/javascript/JS_Value.h" #include "fpdfsdk/javascript/cjs_context.h" +namespace { + +CPDFSDK_BAAnnot* ToBAAnnot(CPDFSDK_Annot* annot) { + return static_cast<CPDFSDK_BAAnnot*>(annot); +} + +} // namespace + BEGIN_JS_STATIC_CONST(CJS_Annot) END_JS_STATIC_CONST() @@ -32,8 +40,12 @@ Annot::~Annot() {} FX_BOOL Annot::hidden(IJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError) { + CPDFSDK_BAAnnot* baAnnot = ToBAAnnot(m_pAnnot); + if (!baAnnot) + return FALSE; + if (vp.IsGetting()) { - CPDF_Annot* pPDFAnnot = m_BAAnnot->GetPDFAnnot(); + CPDF_Annot* pPDFAnnot = baAnnot->GetPDFAnnot(); vp << CPDF_Annot::IsAnnotationHidden(pPDFAnnot->GetAnnotDict()); return TRUE; } @@ -41,7 +53,7 @@ FX_BOOL Annot::hidden(IJS_Context* cc, bool bHidden; vp >> bHidden; - uint32_t flags = m_BAAnnot->GetFlags(); + uint32_t flags = baAnnot->GetFlags(); if (bHidden) { flags |= ANNOTFLAG_HIDDEN; flags |= ANNOTFLAG_INVISIBLE; @@ -53,21 +65,25 @@ FX_BOOL Annot::hidden(IJS_Context* cc, flags &= ~ANNOTFLAG_NOVIEW; flags |= ANNOTFLAG_PRINT; } - m_BAAnnot->SetFlags(flags); + baAnnot->SetFlags(flags); return TRUE; } FX_BOOL Annot::name(IJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError) { + CPDFSDK_BAAnnot* baAnnot = ToBAAnnot(m_pAnnot); + if (!baAnnot) + return FALSE; + if (vp.IsGetting()) { - vp << m_BAAnnot->GetAnnotName(); + vp << baAnnot->GetAnnotName(); return TRUE; } CFX_WideString annotName; vp >> annotName; - m_BAAnnot->SetAnnotName(annotName); + baAnnot->SetAnnotName(annotName); return TRUE; } @@ -80,10 +96,15 @@ FX_BOOL Annot::type(IJS_Context* cc, return FALSE; } - vp << CPDF_Annot::AnnotSubtypeToString(m_BAAnnot->GetAnnotSubtype()); + CPDFSDK_BAAnnot* baAnnot = ToBAAnnot(m_pAnnot); + if (!baAnnot) + return FALSE; + + vp << CPDF_Annot::AnnotSubtypeToString(baAnnot->GetAnnotSubtype()); return TRUE; } void Annot::SetSDKAnnot(CPDFSDK_BAAnnot* annot) { - m_BAAnnot = annot; + m_pAnnot = annot; + m_pObserver.reset(new CPDFSDK_Annot::Observer(&m_pAnnot)); } diff --git a/fpdfsdk/javascript/Annot.h b/fpdfsdk/javascript/Annot.h index b3ea292aed..be850350ae 100644 --- a/fpdfsdk/javascript/Annot.h +++ b/fpdfsdk/javascript/Annot.h @@ -7,6 +7,8 @@ #ifndef FPDFSDK_JAVASCRIPT_ANNOT_H_ #define FPDFSDK_JAVASCRIPT_ANNOT_H_ +#include <memory> + #include "fpdfsdk/include/cpdfsdk_baannot.h" #include "fpdfsdk/javascript/JS_Define.h" @@ -22,7 +24,8 @@ class Annot : public CJS_EmbedObj { void SetSDKAnnot(CPDFSDK_BAAnnot* annot); private: - CPDFSDK_BAAnnot* m_BAAnnot = nullptr; + CPDFSDK_Annot* m_pAnnot = nullptr; + std::unique_ptr<CPDFSDK_Annot::Observer> m_pObserver; }; class CJS_Annot : public CJS_Object { diff --git a/fpdfsdk/javascript/Field.cpp b/fpdfsdk/javascript/Field.cpp index 5c279d6b53..3f5e5e1b0f 100644 --- a/fpdfsdk/javascript/Field.cpp +++ b/fpdfsdk/javascript/Field.cpp @@ -267,11 +267,12 @@ void Field::UpdateFormField(CPDFSDK_Document* pDocument, if (bResetAP) { int nFieldType = pFormField->GetFieldType(); if (nFieldType == FIELDTYPE_COMBOBOX || nFieldType == FIELDTYPE_TEXTFIELD) { - for (CPDFSDK_Widget* pWidget : widgets) { + for (CPDFSDK_Annot* pAnnot : widgets) { FX_BOOL bFormatted = FALSE; - CPDFSDK_Widget::Observer observer(&pWidget); + CPDFSDK_Widget* pWidget = static_cast<CPDFSDK_Widget*>(pAnnot); + CPDFSDK_Widget::Observer observer(&pAnnot); CFX_WideString sValue = pWidget->OnFormat(bFormatted); - if (pWidget) { + if (pAnnot) { pWidget->ResetAppearance(bFormatted ? sValue.c_str() : nullptr, FALSE); } |