Fix downcast in CXFA_FFTextEdit.
The |ff_widget_type_| of a CXFA_Node may reflect the type of its
UI child node if it is of widget type |kNone|, so even if it claims
to be of a particular type, it is only safe to downcast its UI
child to that particular type.
Bug: chromium:1026918
Change-Id: I5daef3c6436ada6d31126ddb380f6420651b47e5
Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/62670
Commit-Queue: Tom Sepez <tsepez@chromium.org>
Reviewed-by: Lei Zhang <thestig@chromium.org>
diff --git a/testing/resources/pixel/xfa_specific/bug_1026918.evt b/testing/resources/pixel/xfa_specific/bug_1026918.evt
new file mode 100644
index 0000000..3a16c14
--- /dev/null
+++ b/testing/resources/pixel/xfa_specific/bug_1026918.evt
@@ -0,0 +1,2 @@
+mousemove,0,0
+mousedown,left,0,0
\ No newline at end of file
diff --git a/testing/resources/pixel/xfa_specific/bug_1026918.in b/testing/resources/pixel/xfa_specific/bug_1026918.in
new file mode 100644
index 0000000..3dee61e
--- /dev/null
+++ b/testing/resources/pixel/xfa_specific/bug_1026918.in
@@ -0,0 +1,50 @@
+{{header}}
+{{object 1 0}} <<
+ /Type /Catalog
+ /Pages 2 0 R
+ /AcroForm <<
+ /XFA 4 0 R
+ >>
+ /NeedsRendering true
+>>
+endobj
+{{object 2 0}} <<
+ /Type /Pages
+ /Count 1
+ /Kids [3 0 R]
+>>
+endobj
+{{object 3 0}} <<
+ /Type /Page
+ /Parent 2 0 R
+ /MediaBox [0 0 3 3]
+>>
+endobj
+{{object 4 0}} <<
+ {{streamlen}}
+>>
+stream
+<xdp xmlns="http://ns.adobe.com/xdp/">
+ <config>
+ <acrobat>
+ <acrobat7>
+ <dynamicRender>required</dynamicRender>
+ </acrobat7>
+ </acrobat>
+ </config>
+ <template>
+ <subform>
+ <bookend leader="$"></bookend>
+ <field>
+ <keep next="pageArea"></keep>
+ <ui>
+ <barcode type="code3Of9"></barcode>
+ </ui>
+ </field>
+ </subform>
+ </template>
+</xdp>
+endstream
+endobj
+{{trailer}}
+%%EOF
\ No newline at end of file
diff --git a/testing/resources/pixel/xfa_specific/bug_1026918_expected.pdf.0.png b/testing/resources/pixel/xfa_specific/bug_1026918_expected.pdf.0.png
new file mode 100644
index 0000000..08c11b0
--- /dev/null
+++ b/testing/resources/pixel/xfa_specific/bug_1026918_expected.pdf.0.png
Binary files differ
diff --git a/xfa/fxfa/cxfa_fftextedit.cpp b/xfa/fxfa/cxfa_fftextedit.cpp
index f5282ba..5ac9f57 100644
--- a/xfa/fxfa/cxfa_fftextedit.cpp
+++ b/xfa/fxfa/cxfa_fftextedit.cpp
@@ -274,7 +274,7 @@
} else if (m_pNode->GetFFWidgetType() == XFA_FFWidgetType::kBarcode) {
int32_t nDataLen = 0;
if (eType == XFA_VALUEPICTURE_Edit) {
- nDataLen = static_cast<CXFA_Barcode*>(m_pNode.Get())
+ nDataLen = static_cast<CXFA_Barcode*>(m_pNode->GetUIChildNode())
->GetDataLength()
.value_or(0);
}
diff --git a/xfa/fxfa/parser/cxfa_node.h b/xfa/fxfa/parser/cxfa_node.h
index 057c26a..9d9aec5 100644
--- a/xfa/fxfa/parser/cxfa_node.h
+++ b/xfa/fxfa/parser/cxfa_node.h
@@ -266,6 +266,9 @@
CXFA_EventParam* pEventParam);
CXFA_Node* GetUIChildNode();
+
+ // NOTE: value returned is often determined by child UI node, and
+ // can't be used to infer anything about this particual node itself.
XFA_FFWidgetType GetFFWidgetType();
CFX_RectF GetUIMargin();