1*3ac0a46fSAndroid Build Coastguard Worker // Copyright 2016 The PDFium Authors
2*3ac0a46fSAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*3ac0a46fSAndroid Build Coastguard Worker // found in the LICENSE file.
4*3ac0a46fSAndroid Build Coastguard Worker
5*3ac0a46fSAndroid Build Coastguard Worker // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
6*3ac0a46fSAndroid Build Coastguard Worker
7*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_node.h"
8*3ac0a46fSAndroid Build Coastguard Worker
9*3ac0a46fSAndroid Build Coastguard Worker #include <math.h>
10*3ac0a46fSAndroid Build Coastguard Worker #include <stdint.h>
11*3ac0a46fSAndroid Build Coastguard Worker
12*3ac0a46fSAndroid Build Coastguard Worker #include <algorithm>
13*3ac0a46fSAndroid Build Coastguard Worker #include <map>
14*3ac0a46fSAndroid Build Coastguard Worker #include <memory>
15*3ac0a46fSAndroid Build Coastguard Worker #include <set>
16*3ac0a46fSAndroid Build Coastguard Worker #include <utility>
17*3ac0a46fSAndroid Build Coastguard Worker #include <vector>
18*3ac0a46fSAndroid Build Coastguard Worker
19*3ac0a46fSAndroid Build Coastguard Worker #include "core/fxcrt/autorestorer.h"
20*3ac0a46fSAndroid Build Coastguard Worker #include "core/fxcrt/cfx_read_only_string_stream.h"
21*3ac0a46fSAndroid Build Coastguard Worker #include "core/fxcrt/cfx_read_only_vector_stream.h"
22*3ac0a46fSAndroid Build Coastguard Worker #include "core/fxcrt/data_vector.h"
23*3ac0a46fSAndroid Build Coastguard Worker #include "core/fxcrt/fx_codepage.h"
24*3ac0a46fSAndroid Build Coastguard Worker #include "core/fxcrt/fx_extension.h"
25*3ac0a46fSAndroid Build Coastguard Worker #include "core/fxcrt/stl_util.h"
26*3ac0a46fSAndroid Build Coastguard Worker #include "core/fxcrt/xml/cfx_xmldocument.h"
27*3ac0a46fSAndroid Build Coastguard Worker #include "core/fxcrt/xml/cfx_xmlelement.h"
28*3ac0a46fSAndroid Build Coastguard Worker #include "core/fxcrt/xml/cfx_xmlnode.h"
29*3ac0a46fSAndroid Build Coastguard Worker #include "core/fxcrt/xml/cfx_xmltext.h"
30*3ac0a46fSAndroid Build Coastguard Worker #include "core/fxge/dib/cfx_dibitmap.h"
31*3ac0a46fSAndroid Build Coastguard Worker #include "core/fxge/fx_font.h"
32*3ac0a46fSAndroid Build Coastguard Worker #include "fxjs/gc/container_trace.h"
33*3ac0a46fSAndroid Build Coastguard Worker #include "fxjs/xfa/cfxjse_engine.h"
34*3ac0a46fSAndroid Build Coastguard Worker #include "fxjs/xfa/cfxjse_value.h"
35*3ac0a46fSAndroid Build Coastguard Worker #include "fxjs/xfa/cjx_node.h"
36*3ac0a46fSAndroid Build Coastguard Worker #include "third_party/base/check.h"
37*3ac0a46fSAndroid Build Coastguard Worker #include "third_party/base/check_op.h"
38*3ac0a46fSAndroid Build Coastguard Worker #include "third_party/base/containers/contains.h"
39*3ac0a46fSAndroid Build Coastguard Worker #include "third_party/base/containers/span.h"
40*3ac0a46fSAndroid Build Coastguard Worker #include "third_party/base/notreached.h"
41*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fde/cfde_textout.h"
42*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fgas/crt/cfgas_decimal.h"
43*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fgas/crt/locale_iface.h"
44*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fgas/font/cfgas_fontmgr.h"
45*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fgas/font/cfgas_gefont.h"
46*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/cxfa_eventparam.h"
47*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/cxfa_ffapp.h"
48*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/cxfa_ffdocview.h"
49*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/cxfa_ffnotify.h"
50*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/cxfa_fontmgr.h"
51*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/cxfa_textprovider.h"
52*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_accessiblecontent.h"
53*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_acrobat.h"
54*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_acrobat7.h"
55*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_adbe_jsconsole.h"
56*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_adbe_jsdebugger.h"
57*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_addsilentprint.h"
58*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_addviewerpreferences.h"
59*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_adjustdata.h"
60*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_adobeextensionlevel.h"
61*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_agent.h"
62*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_alwaysembed.h"
63*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_amd.h"
64*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_appearancefilter.h"
65*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_arc.h"
66*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_area.h"
67*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_arraynodelist.h"
68*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_assist.h"
69*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_attachnodelist.h"
70*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_attributes.h"
71*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_autosave.h"
72*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_barcode.h"
73*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_base.h"
74*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_batchoutput.h"
75*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_behavioroverride.h"
76*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_bind.h"
77*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_binditems.h"
78*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_bookend.h"
79*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_boolean.h"
80*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_border.h"
81*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_break.h"
82*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_breakafter.h"
83*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_breakbefore.h"
84*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_button.h"
85*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_cache.h"
86*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_calculate.h"
87*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_calendarsymbols.h"
88*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_caption.h"
89*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_certificate.h"
90*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_certificates.h"
91*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_change.h"
92*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_checkbutton.h"
93*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_choicelist.h"
94*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_color.h"
95*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_comb.h"
96*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_command.h"
97*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_common.h"
98*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_compress.h"
99*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_compression.h"
100*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_compresslogicalstructure.h"
101*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_compressobjectstream.h"
102*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_config.h"
103*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_conformance.h"
104*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_connect.h"
105*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_connectionset.h"
106*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_connectstring.h"
107*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_contentarea.h"
108*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_contentcopy.h"
109*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_copies.h"
110*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_corner.h"
111*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_creator.h"
112*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_currencysymbol.h"
113*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_currencysymbols.h"
114*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_currentpage.h"
115*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_data.h"
116*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_datagroup.h"
117*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_datamodel.h"
118*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_datavalue.h"
119*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_date.h"
120*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_datepattern.h"
121*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_datepatterns.h"
122*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_datetime.h"
123*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_datetimeedit.h"
124*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_datetimesymbols.h"
125*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_day.h"
126*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_daynames.h"
127*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_debug.h"
128*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_decimal.h"
129*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_defaulttypeface.h"
130*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_defaultui.h"
131*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_delete.h"
132*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_delta.h"
133*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_desc.h"
134*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_destination.h"
135*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_digestmethod.h"
136*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_digestmethods.h"
137*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_document.h"
138*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_document_builder.h"
139*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_documentassembly.h"
140*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_draw.h"
141*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_driver.h"
142*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_dsigdata.h"
143*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_duplexoption.h"
144*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_dynamicrender.h"
145*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_edge.h"
146*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_effectiveinputpolicy.h"
147*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_effectiveoutputpolicy.h"
148*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_embed.h"
149*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_encoding.h"
150*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_encodings.h"
151*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_encrypt.h"
152*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_encryption.h"
153*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_encryptionlevel.h"
154*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_encryptionmethod.h"
155*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_encryptionmethods.h"
156*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_enforce.h"
157*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_equate.h"
158*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_equaterange.h"
159*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_era.h"
160*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_eranames.h"
161*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_event.h"
162*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_exclgroup.h"
163*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_exclude.h"
164*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_excludens.h"
165*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_exdata.h"
166*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_execute.h"
167*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_exobject.h"
168*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_extras.h"
169*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_field.h"
170*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_fill.h"
171*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_filter.h"
172*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_fliplabel.h"
173*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_float.h"
174*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_font.h"
175*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_fontinfo.h"
176*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_form.h"
177*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_format.h"
178*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_formfieldfilling.h"
179*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_groupparent.h"
180*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_handler.h"
181*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_hyphenation.h"
182*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_ifempty.h"
183*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_image.h"
184*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_imageedit.h"
185*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_includexdpcontent.h"
186*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_incrementalload.h"
187*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_incrementalmerge.h"
188*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_insert.h"
189*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_instancemanager.h"
190*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_integer.h"
191*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_interactive.h"
192*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_issuers.h"
193*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_items.h"
194*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_jog.h"
195*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_keep.h"
196*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_keyusage.h"
197*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_labelprinter.h"
198*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_layout.h"
199*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_level.h"
200*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_line.h"
201*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_linear.h"
202*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_linearized.h"
203*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_locale.h"
204*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_localeset.h"
205*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_localevalue.h"
206*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_lockdocument.h"
207*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_log.h"
208*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_manifest.h"
209*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_map.h"
210*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_margin.h"
211*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_mdp.h"
212*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_measurement.h"
213*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_medium.h"
214*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_mediuminfo.h"
215*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_meridiem.h"
216*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_meridiemnames.h"
217*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_message.h"
218*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_messaging.h"
219*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_mode.h"
220*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_modifyannots.h"
221*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_month.h"
222*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_monthnames.h"
223*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_msgid.h"
224*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_nameattr.h"
225*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_neverembed.h"
226*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_nodeiteratortemplate.h"
227*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_numberofcopies.h"
228*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_numberpattern.h"
229*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_numberpatterns.h"
230*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_numbersymbol.h"
231*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_numbersymbols.h"
232*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_numericedit.h"
233*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_occur.h"
234*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_oid.h"
235*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_oids.h"
236*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_openaction.h"
237*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_operation.h"
238*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_output.h"
239*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_outputbin.h"
240*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_outputxsl.h"
241*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_overflow.h"
242*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_overprint.h"
243*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_packet.h"
244*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_packets.h"
245*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_pagearea.h"
246*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_pageoffset.h"
247*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_pagerange.h"
248*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_pageset.h"
249*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_pagination.h"
250*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_paginationoverride.h"
251*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_para.h"
252*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_part.h"
253*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_password.h"
254*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_passwordedit.h"
255*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_pattern.h"
256*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_pcl.h"
257*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_pdf.h"
258*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_pdfa.h"
259*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_permissions.h"
260*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_picktraybypdfsize.h"
261*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_picture.h"
262*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_plaintextmetadata.h"
263*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_presence.h"
264*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_present.h"
265*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_print.h"
266*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_printername.h"
267*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_printhighquality.h"
268*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_printscaling.h"
269*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_producer.h"
270*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_proto.h"
271*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_ps.h"
272*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_psmap.h"
273*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_query.h"
274*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_radial.h"
275*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_range.h"
276*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_reason.h"
277*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_reasons.h"
278*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_record.h"
279*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_recordset.h"
280*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_rectangle.h"
281*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_ref.h"
282*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_relevant.h"
283*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_rename.h"
284*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_renderpolicy.h"
285*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_rootelement.h"
286*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_runscripts.h"
287*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_script.h"
288*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_scriptmodel.h"
289*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_select.h"
290*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_setproperty.h"
291*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_severity.h"
292*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_sharptext.h"
293*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_sharpxhtml.h"
294*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_sharpxml.h"
295*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_signature.h"
296*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_signatureproperties.h"
297*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_signdata.h"
298*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_signing.h"
299*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_silentprint.h"
300*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_soapaction.h"
301*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_soapaddress.h"
302*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_solid.h"
303*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_source.h"
304*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_sourceset.h"
305*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_speak.h"
306*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_staple.h"
307*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_startnode.h"
308*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_startpage.h"
309*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_stipple.h"
310*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_stroke.h"
311*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_subform.h"
312*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_subformset.h"
313*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_subjectdn.h"
314*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_subjectdns.h"
315*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_submit.h"
316*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_submitformat.h"
317*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_submiturl.h"
318*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_subsetbelow.h"
319*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_suppressbanner.h"
320*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_tagged.h"
321*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_template.h"
322*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_templatecache.h"
323*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_text.h"
324*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_textedit.h"
325*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_threshold.h"
326*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_time.h"
327*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_timepattern.h"
328*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_timepatterns.h"
329*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_timestamp.h"
330*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_to.h"
331*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_tooltip.h"
332*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_trace.h"
333*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_transform.h"
334*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_traversal.h"
335*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_traverse.h"
336*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_traversestrategy_xfacontainernode.h"
337*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_traversestrategy_xfanode.h"
338*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_type.h"
339*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_typeface.h"
340*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_typefaces.h"
341*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_ui.h"
342*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_update.h"
343*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_uri.h"
344*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_user.h"
345*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_validate.h"
346*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_validateapprovalsignatures.h"
347*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_validationmessaging.h"
348*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_value.h"
349*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_variables.h"
350*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_version.h"
351*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_versioncontrol.h"
352*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_viewerpreferences.h"
353*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_webclient.h"
354*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_whitespace.h"
355*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_window.h"
356*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_wsdladdress.h"
357*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_wsdlconnection.h"
358*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_xdc.h"
359*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_xdp.h"
360*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_xfa.h"
361*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_xmlconnection.h"
362*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_xsdconnection.h"
363*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_xsl.h"
364*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_zpl.h"
365*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/xfa_basic_data.h"
366*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/xfa_utils.h"
367*3ac0a46fSAndroid Build Coastguard Worker
368*3ac0a46fSAndroid Build Coastguard Worker class CXFA_FieldLayoutData;
369*3ac0a46fSAndroid Build Coastguard Worker class CXFA_ImageEditData;
370*3ac0a46fSAndroid Build Coastguard Worker class CXFA_ImageLayoutData;
371*3ac0a46fSAndroid Build Coastguard Worker class CXFA_TextEditData;
372*3ac0a46fSAndroid Build Coastguard Worker class CXFA_TextLayoutData;
373*3ac0a46fSAndroid Build Coastguard Worker
374*3ac0a46fSAndroid Build Coastguard Worker namespace {
375*3ac0a46fSAndroid Build Coastguard Worker
376*3ac0a46fSAndroid Build Coastguard Worker constexpr uint8_t kMaxExecuteRecursion = 2;
377*3ac0a46fSAndroid Build Coastguard Worker
378*3ac0a46fSAndroid Build Coastguard Worker constexpr uint8_t kInvBase64[128] = {
379*3ac0a46fSAndroid Build Coastguard Worker 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
380*3ac0a46fSAndroid Build Coastguard Worker 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
381*3ac0a46fSAndroid Build Coastguard Worker 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 62, 255,
382*3ac0a46fSAndroid Build Coastguard Worker 255, 255, 63, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 255, 255,
383*3ac0a46fSAndroid Build Coastguard Worker 255, 255, 255, 255, 255, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,
384*3ac0a46fSAndroid Build Coastguard Worker 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24,
385*3ac0a46fSAndroid Build Coastguard Worker 25, 255, 255, 255, 255, 255, 255, 26, 27, 28, 29, 30, 31, 32, 33,
386*3ac0a46fSAndroid Build Coastguard Worker 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48,
387*3ac0a46fSAndroid Build Coastguard Worker 49, 50, 51, 255, 255, 255, 255, 255,
388*3ac0a46fSAndroid Build Coastguard Worker };
389*3ac0a46fSAndroid Build Coastguard Worker
GetInvBase64(uint8_t x)390*3ac0a46fSAndroid Build Coastguard Worker inline uint8_t GetInvBase64(uint8_t x) {
391*3ac0a46fSAndroid Build Coastguard Worker return (x & 128) == 0 ? kInvBase64[x] : 255;
392*3ac0a46fSAndroid Build Coastguard Worker }
393*3ac0a46fSAndroid Build Coastguard Worker
XFA_RemoveBase64Whitespace(pdfium::span<const uint8_t> spStr)394*3ac0a46fSAndroid Build Coastguard Worker DataVector<uint8_t> XFA_RemoveBase64Whitespace(
395*3ac0a46fSAndroid Build Coastguard Worker pdfium::span<const uint8_t> spStr) {
396*3ac0a46fSAndroid Build Coastguard Worker DataVector<uint8_t> result;
397*3ac0a46fSAndroid Build Coastguard Worker result.reserve(spStr.size());
398*3ac0a46fSAndroid Build Coastguard Worker for (uint8_t ch : spStr) {
399*3ac0a46fSAndroid Build Coastguard Worker if (GetInvBase64(ch) != 255 || ch == '=')
400*3ac0a46fSAndroid Build Coastguard Worker result.push_back(ch);
401*3ac0a46fSAndroid Build Coastguard Worker }
402*3ac0a46fSAndroid Build Coastguard Worker return result;
403*3ac0a46fSAndroid Build Coastguard Worker }
404*3ac0a46fSAndroid Build Coastguard Worker
XFA_Base64Decode(const ByteString & bsStr)405*3ac0a46fSAndroid Build Coastguard Worker DataVector<uint8_t> XFA_Base64Decode(const ByteString& bsStr) {
406*3ac0a46fSAndroid Build Coastguard Worker DataVector<uint8_t> result;
407*3ac0a46fSAndroid Build Coastguard Worker if (bsStr.IsEmpty())
408*3ac0a46fSAndroid Build Coastguard Worker return result;
409*3ac0a46fSAndroid Build Coastguard Worker
410*3ac0a46fSAndroid Build Coastguard Worker DataVector<uint8_t> buffer = XFA_RemoveBase64Whitespace(bsStr.raw_span());
411*3ac0a46fSAndroid Build Coastguard Worker result.reserve(3 * (buffer.size() / 4));
412*3ac0a46fSAndroid Build Coastguard Worker
413*3ac0a46fSAndroid Build Coastguard Worker uint32_t dwLimb = 0;
414*3ac0a46fSAndroid Build Coastguard Worker for (size_t i = 0; i + 3 < buffer.size(); i += 4) {
415*3ac0a46fSAndroid Build Coastguard Worker if (buffer[i] == '=' || buffer[i + 1] == '=' || buffer[i + 2] == '=' ||
416*3ac0a46fSAndroid Build Coastguard Worker buffer[i + 3] == '=') {
417*3ac0a46fSAndroid Build Coastguard Worker if (buffer[i] == '=' || buffer[i + 1] == '=') {
418*3ac0a46fSAndroid Build Coastguard Worker break;
419*3ac0a46fSAndroid Build Coastguard Worker }
420*3ac0a46fSAndroid Build Coastguard Worker if (buffer[i + 2] == '=') {
421*3ac0a46fSAndroid Build Coastguard Worker dwLimb = ((uint32_t)kInvBase64[buffer[i]] << 6) |
422*3ac0a46fSAndroid Build Coastguard Worker ((uint32_t)kInvBase64[buffer[i + 1]]);
423*3ac0a46fSAndroid Build Coastguard Worker result.push_back((uint8_t)(dwLimb >> 4) & 0xFF);
424*3ac0a46fSAndroid Build Coastguard Worker } else {
425*3ac0a46fSAndroid Build Coastguard Worker dwLimb = ((uint32_t)kInvBase64[buffer[i]] << 12) |
426*3ac0a46fSAndroid Build Coastguard Worker ((uint32_t)kInvBase64[buffer[i + 1]] << 6) |
427*3ac0a46fSAndroid Build Coastguard Worker ((uint32_t)kInvBase64[buffer[i + 2]]);
428*3ac0a46fSAndroid Build Coastguard Worker result.push_back((uint8_t)(dwLimb >> 10) & 0xFF);
429*3ac0a46fSAndroid Build Coastguard Worker result.push_back((uint8_t)(dwLimb >> 2) & 0xFF);
430*3ac0a46fSAndroid Build Coastguard Worker }
431*3ac0a46fSAndroid Build Coastguard Worker } else {
432*3ac0a46fSAndroid Build Coastguard Worker dwLimb = ((uint32_t)kInvBase64[buffer[i]] << 18) |
433*3ac0a46fSAndroid Build Coastguard Worker ((uint32_t)kInvBase64[buffer[i + 1]] << 12) |
434*3ac0a46fSAndroid Build Coastguard Worker ((uint32_t)kInvBase64[buffer[i + 2]] << 6) |
435*3ac0a46fSAndroid Build Coastguard Worker ((uint32_t)kInvBase64[buffer[i + 3]]);
436*3ac0a46fSAndroid Build Coastguard Worker result.push_back((uint8_t)(dwLimb >> 16) & 0xff);
437*3ac0a46fSAndroid Build Coastguard Worker result.push_back((uint8_t)(dwLimb >> 8) & 0xff);
438*3ac0a46fSAndroid Build Coastguard Worker result.push_back((uint8_t)(dwLimb)&0xff);
439*3ac0a46fSAndroid Build Coastguard Worker }
440*3ac0a46fSAndroid Build Coastguard Worker }
441*3ac0a46fSAndroid Build Coastguard Worker return result;
442*3ac0a46fSAndroid Build Coastguard Worker }
443*3ac0a46fSAndroid Build Coastguard Worker
XFA_GetImageType(const WideString & wsType)444*3ac0a46fSAndroid Build Coastguard Worker FXCODEC_IMAGE_TYPE XFA_GetImageType(const WideString& wsType) {
445*3ac0a46fSAndroid Build Coastguard Worker WideString wsContentType(wsType);
446*3ac0a46fSAndroid Build Coastguard Worker if (wsContentType.EqualsASCIINoCase("image/jpg"))
447*3ac0a46fSAndroid Build Coastguard Worker return FXCODEC_IMAGE_JPG;
448*3ac0a46fSAndroid Build Coastguard Worker
449*3ac0a46fSAndroid Build Coastguard Worker #ifdef PDF_ENABLE_XFA_BMP
450*3ac0a46fSAndroid Build Coastguard Worker if (wsContentType.EqualsASCIINoCase("image/bmp"))
451*3ac0a46fSAndroid Build Coastguard Worker return FXCODEC_IMAGE_BMP;
452*3ac0a46fSAndroid Build Coastguard Worker #endif // PDF_ENABLE_XFA_BMP
453*3ac0a46fSAndroid Build Coastguard Worker
454*3ac0a46fSAndroid Build Coastguard Worker #ifdef PDF_ENABLE_XFA_GIF
455*3ac0a46fSAndroid Build Coastguard Worker if (wsContentType.EqualsASCIINoCase("image/gif"))
456*3ac0a46fSAndroid Build Coastguard Worker return FXCODEC_IMAGE_GIF;
457*3ac0a46fSAndroid Build Coastguard Worker #endif // PDF_ENABLE_XFA_GIF
458*3ac0a46fSAndroid Build Coastguard Worker
459*3ac0a46fSAndroid Build Coastguard Worker #ifdef PDF_ENABLE_XFA_PNG
460*3ac0a46fSAndroid Build Coastguard Worker if (wsContentType.EqualsASCIINoCase("image/png"))
461*3ac0a46fSAndroid Build Coastguard Worker return FXCODEC_IMAGE_PNG;
462*3ac0a46fSAndroid Build Coastguard Worker #endif // PDF_ENABLE_XFA_PNG
463*3ac0a46fSAndroid Build Coastguard Worker
464*3ac0a46fSAndroid Build Coastguard Worker #ifdef PDF_ENABLE_XFA_TIFF
465*3ac0a46fSAndroid Build Coastguard Worker if (wsContentType.EqualsASCII("image/tif"))
466*3ac0a46fSAndroid Build Coastguard Worker return FXCODEC_IMAGE_TIFF;
467*3ac0a46fSAndroid Build Coastguard Worker #endif // PDF_ENABLE_XFA_TIFF
468*3ac0a46fSAndroid Build Coastguard Worker
469*3ac0a46fSAndroid Build Coastguard Worker return FXCODEC_IMAGE_UNKNOWN;
470*3ac0a46fSAndroid Build Coastguard Worker }
471*3ac0a46fSAndroid Build Coastguard Worker
XFA_LoadImageData(CXFA_FFDoc * pDoc,CXFA_Image * pImage,bool & bNameImage,int32_t & iImageXDpi,int32_t & iImageYDpi)472*3ac0a46fSAndroid Build Coastguard Worker RetainPtr<CFX_DIBitmap> XFA_LoadImageData(CXFA_FFDoc* pDoc,
473*3ac0a46fSAndroid Build Coastguard Worker CXFA_Image* pImage,
474*3ac0a46fSAndroid Build Coastguard Worker bool& bNameImage,
475*3ac0a46fSAndroid Build Coastguard Worker int32_t& iImageXDpi,
476*3ac0a46fSAndroid Build Coastguard Worker int32_t& iImageYDpi) {
477*3ac0a46fSAndroid Build Coastguard Worker WideString wsHref = pImage->GetHref();
478*3ac0a46fSAndroid Build Coastguard Worker WideString wsImage = pImage->GetContent();
479*3ac0a46fSAndroid Build Coastguard Worker if (wsHref.IsEmpty() && wsImage.IsEmpty())
480*3ac0a46fSAndroid Build Coastguard Worker return nullptr;
481*3ac0a46fSAndroid Build Coastguard Worker
482*3ac0a46fSAndroid Build Coastguard Worker FXCODEC_IMAGE_TYPE type = XFA_GetImageType(pImage->GetContentType());
483*3ac0a46fSAndroid Build Coastguard Worker
484*3ac0a46fSAndroid Build Coastguard Worker RetainPtr<IFX_SeekableReadStream> pImageFileRead;
485*3ac0a46fSAndroid Build Coastguard Worker if (wsImage.GetLength() > 0) {
486*3ac0a46fSAndroid Build Coastguard Worker XFA_AttributeValue iEncoding = pImage->GetTransferEncoding();
487*3ac0a46fSAndroid Build Coastguard Worker if (iEncoding == XFA_AttributeValue::Base64) {
488*3ac0a46fSAndroid Build Coastguard Worker DataVector<uint8_t> buffer = XFA_Base64Decode(wsImage.ToUTF8());
489*3ac0a46fSAndroid Build Coastguard Worker if (!buffer.empty()) {
490*3ac0a46fSAndroid Build Coastguard Worker pImageFileRead =
491*3ac0a46fSAndroid Build Coastguard Worker pdfium::MakeRetain<CFX_ReadOnlyVectorStream>(std::move(buffer));
492*3ac0a46fSAndroid Build Coastguard Worker }
493*3ac0a46fSAndroid Build Coastguard Worker } else {
494*3ac0a46fSAndroid Build Coastguard Worker pImageFileRead =
495*3ac0a46fSAndroid Build Coastguard Worker pdfium::MakeRetain<CFX_ReadOnlyStringStream>(wsImage.ToDefANSI());
496*3ac0a46fSAndroid Build Coastguard Worker }
497*3ac0a46fSAndroid Build Coastguard Worker } else {
498*3ac0a46fSAndroid Build Coastguard Worker WideString wsURL = wsHref;
499*3ac0a46fSAndroid Build Coastguard Worker if (!(wsURL.First(7).EqualsASCII("http://") ||
500*3ac0a46fSAndroid Build Coastguard Worker wsURL.First(6).EqualsASCII("ftp://"))) {
501*3ac0a46fSAndroid Build Coastguard Worker RetainPtr<CFX_DIBitmap> pBitmap =
502*3ac0a46fSAndroid Build Coastguard Worker pDoc->GetPDFNamedImage(wsURL.AsStringView(), iImageXDpi, iImageYDpi);
503*3ac0a46fSAndroid Build Coastguard Worker if (pBitmap) {
504*3ac0a46fSAndroid Build Coastguard Worker bNameImage = true;
505*3ac0a46fSAndroid Build Coastguard Worker return pBitmap;
506*3ac0a46fSAndroid Build Coastguard Worker }
507*3ac0a46fSAndroid Build Coastguard Worker }
508*3ac0a46fSAndroid Build Coastguard Worker pImageFileRead = pDoc->OpenLinkedFile(wsURL);
509*3ac0a46fSAndroid Build Coastguard Worker }
510*3ac0a46fSAndroid Build Coastguard Worker if (!pImageFileRead)
511*3ac0a46fSAndroid Build Coastguard Worker return nullptr;
512*3ac0a46fSAndroid Build Coastguard Worker
513*3ac0a46fSAndroid Build Coastguard Worker bNameImage = false;
514*3ac0a46fSAndroid Build Coastguard Worker return XFA_LoadImageFromBuffer(std::move(pImageFileRead), type, iImageXDpi,
515*3ac0a46fSAndroid Build Coastguard Worker iImageYDpi);
516*3ac0a46fSAndroid Build Coastguard Worker }
517*3ac0a46fSAndroid Build Coastguard Worker
SplitDateTime(const WideString & wsDateTime,WideString & wsDate,WideString & wsTime)518*3ac0a46fSAndroid Build Coastguard Worker bool SplitDateTime(const WideString& wsDateTime,
519*3ac0a46fSAndroid Build Coastguard Worker WideString& wsDate,
520*3ac0a46fSAndroid Build Coastguard Worker WideString& wsTime) {
521*3ac0a46fSAndroid Build Coastguard Worker wsDate.clear();
522*3ac0a46fSAndroid Build Coastguard Worker wsTime.clear();
523*3ac0a46fSAndroid Build Coastguard Worker if (wsDateTime.IsEmpty())
524*3ac0a46fSAndroid Build Coastguard Worker return false;
525*3ac0a46fSAndroid Build Coastguard Worker
526*3ac0a46fSAndroid Build Coastguard Worker auto nSplitIndex = wsDateTime.Find('T');
527*3ac0a46fSAndroid Build Coastguard Worker if (!nSplitIndex.has_value())
528*3ac0a46fSAndroid Build Coastguard Worker nSplitIndex = wsDateTime.Find(' ');
529*3ac0a46fSAndroid Build Coastguard Worker if (!nSplitIndex.has_value())
530*3ac0a46fSAndroid Build Coastguard Worker return false;
531*3ac0a46fSAndroid Build Coastguard Worker
532*3ac0a46fSAndroid Build Coastguard Worker wsDate = wsDateTime.First(nSplitIndex.value());
533*3ac0a46fSAndroid Build Coastguard Worker if (!wsDate.IsEmpty()) {
534*3ac0a46fSAndroid Build Coastguard Worker if (!std::any_of(wsDate.begin(), wsDate.end(),
535*3ac0a46fSAndroid Build Coastguard Worker [](wchar_t c) { return FXSYS_IsDecimalDigit(c); })) {
536*3ac0a46fSAndroid Build Coastguard Worker return false;
537*3ac0a46fSAndroid Build Coastguard Worker }
538*3ac0a46fSAndroid Build Coastguard Worker }
539*3ac0a46fSAndroid Build Coastguard Worker wsTime = wsDateTime.Last(wsDateTime.GetLength() - nSplitIndex.value() - 1);
540*3ac0a46fSAndroid Build Coastguard Worker if (!wsTime.IsEmpty()) {
541*3ac0a46fSAndroid Build Coastguard Worker if (!std::any_of(wsTime.begin(), wsTime.end(),
542*3ac0a46fSAndroid Build Coastguard Worker [](wchar_t c) { return FXSYS_IsDecimalDigit(c); })) {
543*3ac0a46fSAndroid Build Coastguard Worker return false;
544*3ac0a46fSAndroid Build Coastguard Worker }
545*3ac0a46fSAndroid Build Coastguard Worker }
546*3ac0a46fSAndroid Build Coastguard Worker return true;
547*3ac0a46fSAndroid Build Coastguard Worker }
548*3ac0a46fSAndroid Build Coastguard Worker
549*3ac0a46fSAndroid Build Coastguard Worker // Stack allocated. Using containers of members would be correct here
550*3ac0a46fSAndroid Build Coastguard Worker // if advanced GC worked with STL.
551*3ac0a46fSAndroid Build Coastguard Worker using NodeSet = std::set<cppgc::Member<CXFA_Node>>;
552*3ac0a46fSAndroid Build Coastguard Worker using NodeSetPair = std::pair<NodeSet, NodeSet>;
553*3ac0a46fSAndroid Build Coastguard Worker using NodeSetPairMap = std::map<uint32_t, NodeSetPair>;
554*3ac0a46fSAndroid Build Coastguard Worker using NodeSetPairMapMap = std::map<CXFA_Node*, NodeSetPairMap>;
555*3ac0a46fSAndroid Build Coastguard Worker using NodeVector = std::vector<cppgc::Member<CXFA_Node>>;
556*3ac0a46fSAndroid Build Coastguard Worker
NodesSortedByDocumentIdx(const NodeSet & rgNodeSet)557*3ac0a46fSAndroid Build Coastguard Worker NodeVector NodesSortedByDocumentIdx(const NodeSet& rgNodeSet) {
558*3ac0a46fSAndroid Build Coastguard Worker if (rgNodeSet.empty())
559*3ac0a46fSAndroid Build Coastguard Worker return NodeVector();
560*3ac0a46fSAndroid Build Coastguard Worker
561*3ac0a46fSAndroid Build Coastguard Worker NodeVector rgNodeArray;
562*3ac0a46fSAndroid Build Coastguard Worker CXFA_Node* pCommonParent = (*rgNodeSet.begin())->GetParent();
563*3ac0a46fSAndroid Build Coastguard Worker for (CXFA_Node* pNode = pCommonParent->GetFirstChild(); pNode;
564*3ac0a46fSAndroid Build Coastguard Worker pNode = pNode->GetNextSibling()) {
565*3ac0a46fSAndroid Build Coastguard Worker if (pdfium::Contains(rgNodeSet, pNode))
566*3ac0a46fSAndroid Build Coastguard Worker rgNodeArray.push_back(pNode);
567*3ac0a46fSAndroid Build Coastguard Worker }
568*3ac0a46fSAndroid Build Coastguard Worker return rgNodeArray;
569*3ac0a46fSAndroid Build Coastguard Worker }
570*3ac0a46fSAndroid Build Coastguard Worker
NodeSetPairForNode(CXFA_Node * pNode,NodeSetPairMapMap * pMap)571*3ac0a46fSAndroid Build Coastguard Worker NodeSetPair* NodeSetPairForNode(CXFA_Node* pNode, NodeSetPairMapMap* pMap) {
572*3ac0a46fSAndroid Build Coastguard Worker CXFA_Node* pParentNode = pNode->GetParent();
573*3ac0a46fSAndroid Build Coastguard Worker uint32_t dwNameHash = pNode->GetNameHash();
574*3ac0a46fSAndroid Build Coastguard Worker if (!pParentNode || !dwNameHash)
575*3ac0a46fSAndroid Build Coastguard Worker return nullptr;
576*3ac0a46fSAndroid Build Coastguard Worker
577*3ac0a46fSAndroid Build Coastguard Worker return &((*pMap)[pParentNode][dwNameHash]);
578*3ac0a46fSAndroid Build Coastguard Worker }
579*3ac0a46fSAndroid Build Coastguard Worker
ReorderDataNodes(const NodeSet & sSet1,const NodeSet & sSet2,bool bInsertBefore)580*3ac0a46fSAndroid Build Coastguard Worker void ReorderDataNodes(const NodeSet& sSet1,
581*3ac0a46fSAndroid Build Coastguard Worker const NodeSet& sSet2,
582*3ac0a46fSAndroid Build Coastguard Worker bool bInsertBefore) {
583*3ac0a46fSAndroid Build Coastguard Worker NodeSetPairMapMap rgMap;
584*3ac0a46fSAndroid Build Coastguard Worker for (CXFA_Node* pNode : sSet1) {
585*3ac0a46fSAndroid Build Coastguard Worker NodeSetPair* pNodeSetPair = NodeSetPairForNode(pNode, &rgMap);
586*3ac0a46fSAndroid Build Coastguard Worker if (pNodeSetPair)
587*3ac0a46fSAndroid Build Coastguard Worker pNodeSetPair->first.insert(pNode);
588*3ac0a46fSAndroid Build Coastguard Worker }
589*3ac0a46fSAndroid Build Coastguard Worker for (CXFA_Node* pNode : sSet2) {
590*3ac0a46fSAndroid Build Coastguard Worker NodeSetPair* pNodeSetPair = NodeSetPairForNode(pNode, &rgMap);
591*3ac0a46fSAndroid Build Coastguard Worker if (pNodeSetPair) {
592*3ac0a46fSAndroid Build Coastguard Worker if (pdfium::Contains(pNodeSetPair->first, pNode))
593*3ac0a46fSAndroid Build Coastguard Worker pNodeSetPair->first.erase(pNode);
594*3ac0a46fSAndroid Build Coastguard Worker else
595*3ac0a46fSAndroid Build Coastguard Worker pNodeSetPair->second.insert(pNode);
596*3ac0a46fSAndroid Build Coastguard Worker }
597*3ac0a46fSAndroid Build Coastguard Worker }
598*3ac0a46fSAndroid Build Coastguard Worker for (auto& iter1 : rgMap) {
599*3ac0a46fSAndroid Build Coastguard Worker NodeSetPairMap* pNodeSetPairMap = &iter1.second;
600*3ac0a46fSAndroid Build Coastguard Worker for (auto& iter2 : *pNodeSetPairMap) {
601*3ac0a46fSAndroid Build Coastguard Worker NodeSetPair* pNodeSetPair = &iter2.second;
602*3ac0a46fSAndroid Build Coastguard Worker if (!pNodeSetPair->first.empty() && !pNodeSetPair->second.empty()) {
603*3ac0a46fSAndroid Build Coastguard Worker NodeVector rgNodeArray1 = NodesSortedByDocumentIdx(pNodeSetPair->first);
604*3ac0a46fSAndroid Build Coastguard Worker NodeVector rgNodeArray2 =
605*3ac0a46fSAndroid Build Coastguard Worker NodesSortedByDocumentIdx(pNodeSetPair->second);
606*3ac0a46fSAndroid Build Coastguard Worker CXFA_Node* pParentNode = nullptr;
607*3ac0a46fSAndroid Build Coastguard Worker CXFA_Node* pBeforeNode = nullptr;
608*3ac0a46fSAndroid Build Coastguard Worker if (bInsertBefore) {
609*3ac0a46fSAndroid Build Coastguard Worker pBeforeNode = rgNodeArray2.front();
610*3ac0a46fSAndroid Build Coastguard Worker pParentNode = pBeforeNode->GetParent();
611*3ac0a46fSAndroid Build Coastguard Worker } else {
612*3ac0a46fSAndroid Build Coastguard Worker CXFA_Node* pLastNode = rgNodeArray2.back();
613*3ac0a46fSAndroid Build Coastguard Worker pParentNode = pLastNode->GetParent();
614*3ac0a46fSAndroid Build Coastguard Worker pBeforeNode = pLastNode->GetNextSibling();
615*3ac0a46fSAndroid Build Coastguard Worker }
616*3ac0a46fSAndroid Build Coastguard Worker for (auto& pCurNode : rgNodeArray1) {
617*3ac0a46fSAndroid Build Coastguard Worker pParentNode->RemoveChildAndNotify(pCurNode, true);
618*3ac0a46fSAndroid Build Coastguard Worker pParentNode->InsertChildAndNotify(pCurNode, pBeforeNode);
619*3ac0a46fSAndroid Build Coastguard Worker }
620*3ac0a46fSAndroid Build Coastguard Worker }
621*3ac0a46fSAndroid Build Coastguard Worker }
622*3ac0a46fSAndroid Build Coastguard Worker pNodeSetPairMap->clear();
623*3ac0a46fSAndroid Build Coastguard Worker }
624*3ac0a46fSAndroid Build Coastguard Worker }
625*3ac0a46fSAndroid Build Coastguard Worker
GetEdgeThickness(const std::vector<CXFA_Stroke * > & strokes,bool b3DStyle,int32_t nIndex)626*3ac0a46fSAndroid Build Coastguard Worker float GetEdgeThickness(const std::vector<CXFA_Stroke*>& strokes,
627*3ac0a46fSAndroid Build Coastguard Worker bool b3DStyle,
628*3ac0a46fSAndroid Build Coastguard Worker int32_t nIndex) {
629*3ac0a46fSAndroid Build Coastguard Worker float fThickness = 0.0f;
630*3ac0a46fSAndroid Build Coastguard Worker CXFA_Stroke* stroke = strokes[nIndex * 2 + 1];
631*3ac0a46fSAndroid Build Coastguard Worker if (stroke->IsVisible()) {
632*3ac0a46fSAndroid Build Coastguard Worker if (nIndex == 0)
633*3ac0a46fSAndroid Build Coastguard Worker fThickness += 2.5f;
634*3ac0a46fSAndroid Build Coastguard Worker
635*3ac0a46fSAndroid Build Coastguard Worker fThickness += stroke->GetThickness() * (b3DStyle ? 4 : 2);
636*3ac0a46fSAndroid Build Coastguard Worker }
637*3ac0a46fSAndroid Build Coastguard Worker return fThickness;
638*3ac0a46fSAndroid Build Coastguard Worker }
639*3ac0a46fSAndroid Build Coastguard Worker
FormatNumStr(const WideString & wsValue,LocaleIface * pLocale)640*3ac0a46fSAndroid Build Coastguard Worker WideString FormatNumStr(const WideString& wsValue, LocaleIface* pLocale) {
641*3ac0a46fSAndroid Build Coastguard Worker if (wsValue.IsEmpty())
642*3ac0a46fSAndroid Build Coastguard Worker return WideString();
643*3ac0a46fSAndroid Build Coastguard Worker
644*3ac0a46fSAndroid Build Coastguard Worker WideString wsSrcNum = wsValue;
645*3ac0a46fSAndroid Build Coastguard Worker WideString wsGroupSymbol = pLocale->GetGroupingSymbol();
646*3ac0a46fSAndroid Build Coastguard Worker bool bNeg = false;
647*3ac0a46fSAndroid Build Coastguard Worker if (wsSrcNum[0] == '-') {
648*3ac0a46fSAndroid Build Coastguard Worker bNeg = true;
649*3ac0a46fSAndroid Build Coastguard Worker wsSrcNum.Delete(0, 1);
650*3ac0a46fSAndroid Build Coastguard Worker }
651*3ac0a46fSAndroid Build Coastguard Worker
652*3ac0a46fSAndroid Build Coastguard Worker size_t dot_index = wsSrcNum.Find('.').value_or(wsSrcNum.GetLength());
653*3ac0a46fSAndroid Build Coastguard Worker if (dot_index == 0)
654*3ac0a46fSAndroid Build Coastguard Worker return WideString();
655*3ac0a46fSAndroid Build Coastguard Worker
656*3ac0a46fSAndroid Build Coastguard Worker size_t nPos = dot_index % 3;
657*3ac0a46fSAndroid Build Coastguard Worker WideString wsOutput;
658*3ac0a46fSAndroid Build Coastguard Worker for (size_t i = 0; i < dot_index; i++) {
659*3ac0a46fSAndroid Build Coastguard Worker if (i % 3 == nPos && i != 0)
660*3ac0a46fSAndroid Build Coastguard Worker wsOutput += wsGroupSymbol;
661*3ac0a46fSAndroid Build Coastguard Worker
662*3ac0a46fSAndroid Build Coastguard Worker wsOutput += wsSrcNum[i];
663*3ac0a46fSAndroid Build Coastguard Worker }
664*3ac0a46fSAndroid Build Coastguard Worker if (dot_index < wsSrcNum.GetLength()) {
665*3ac0a46fSAndroid Build Coastguard Worker wsOutput += pLocale->GetDecimalSymbol();
666*3ac0a46fSAndroid Build Coastguard Worker wsOutput += wsSrcNum.Last(wsSrcNum.GetLength() - dot_index - 1);
667*3ac0a46fSAndroid Build Coastguard Worker }
668*3ac0a46fSAndroid Build Coastguard Worker if (bNeg)
669*3ac0a46fSAndroid Build Coastguard Worker return pLocale->GetMinusSymbol() + wsOutput;
670*3ac0a46fSAndroid Build Coastguard Worker
671*3ac0a46fSAndroid Build Coastguard Worker return wsOutput;
672*3ac0a46fSAndroid Build Coastguard Worker }
673*3ac0a46fSAndroid Build Coastguard Worker
674*3ac0a46fSAndroid Build Coastguard Worker CXFA_Node* FindFirstSiblingNamedInList(CXFA_Node* parent,
675*3ac0a46fSAndroid Build Coastguard Worker uint32_t dwNameHash,
676*3ac0a46fSAndroid Build Coastguard Worker Mask<XFA_NodeFilter> dwFilter);
677*3ac0a46fSAndroid Build Coastguard Worker CXFA_Node* FindFirstSiblingOfClassInList(CXFA_Node* parent,
678*3ac0a46fSAndroid Build Coastguard Worker XFA_Element element,
679*3ac0a46fSAndroid Build Coastguard Worker Mask<XFA_NodeFilter> dwFilter);
680*3ac0a46fSAndroid Build Coastguard Worker
FindFirstSiblingNamed(CXFA_Node * parent,uint32_t dwNameHash)681*3ac0a46fSAndroid Build Coastguard Worker CXFA_Node* FindFirstSiblingNamed(CXFA_Node* parent, uint32_t dwNameHash) {
682*3ac0a46fSAndroid Build Coastguard Worker CXFA_Node* result = FindFirstSiblingNamedInList(parent, dwNameHash,
683*3ac0a46fSAndroid Build Coastguard Worker XFA_NodeFilter::kProperties);
684*3ac0a46fSAndroid Build Coastguard Worker if (result)
685*3ac0a46fSAndroid Build Coastguard Worker return result;
686*3ac0a46fSAndroid Build Coastguard Worker
687*3ac0a46fSAndroid Build Coastguard Worker return FindFirstSiblingNamedInList(parent, dwNameHash,
688*3ac0a46fSAndroid Build Coastguard Worker XFA_NodeFilter::kChildren);
689*3ac0a46fSAndroid Build Coastguard Worker }
690*3ac0a46fSAndroid Build Coastguard Worker
FindFirstSiblingNamedInList(CXFA_Node * parent,uint32_t dwNameHash,Mask<XFA_NodeFilter> dwFilter)691*3ac0a46fSAndroid Build Coastguard Worker CXFA_Node* FindFirstSiblingNamedInList(CXFA_Node* parent,
692*3ac0a46fSAndroid Build Coastguard Worker uint32_t dwNameHash,
693*3ac0a46fSAndroid Build Coastguard Worker Mask<XFA_NodeFilter> dwFilter) {
694*3ac0a46fSAndroid Build Coastguard Worker for (CXFA_Node* child : parent->GetNodeListWithFilter(dwFilter)) {
695*3ac0a46fSAndroid Build Coastguard Worker if (child->GetNameHash() == dwNameHash)
696*3ac0a46fSAndroid Build Coastguard Worker return child;
697*3ac0a46fSAndroid Build Coastguard Worker
698*3ac0a46fSAndroid Build Coastguard Worker CXFA_Node* result = FindFirstSiblingNamed(child, dwNameHash);
699*3ac0a46fSAndroid Build Coastguard Worker if (result)
700*3ac0a46fSAndroid Build Coastguard Worker return result;
701*3ac0a46fSAndroid Build Coastguard Worker }
702*3ac0a46fSAndroid Build Coastguard Worker return nullptr;
703*3ac0a46fSAndroid Build Coastguard Worker }
704*3ac0a46fSAndroid Build Coastguard Worker
FindFirstSiblingOfClass(CXFA_Node * parent,XFA_Element element)705*3ac0a46fSAndroid Build Coastguard Worker CXFA_Node* FindFirstSiblingOfClass(CXFA_Node* parent, XFA_Element element) {
706*3ac0a46fSAndroid Build Coastguard Worker CXFA_Node* result = FindFirstSiblingOfClassInList(
707*3ac0a46fSAndroid Build Coastguard Worker parent, element, XFA_NodeFilter::kProperties);
708*3ac0a46fSAndroid Build Coastguard Worker if (result)
709*3ac0a46fSAndroid Build Coastguard Worker return result;
710*3ac0a46fSAndroid Build Coastguard Worker
711*3ac0a46fSAndroid Build Coastguard Worker return FindFirstSiblingOfClassInList(parent, element,
712*3ac0a46fSAndroid Build Coastguard Worker XFA_NodeFilter::kChildren);
713*3ac0a46fSAndroid Build Coastguard Worker }
714*3ac0a46fSAndroid Build Coastguard Worker
FindFirstSiblingOfClassInList(CXFA_Node * parent,XFA_Element element,Mask<XFA_NodeFilter> dwFilter)715*3ac0a46fSAndroid Build Coastguard Worker CXFA_Node* FindFirstSiblingOfClassInList(CXFA_Node* parent,
716*3ac0a46fSAndroid Build Coastguard Worker XFA_Element element,
717*3ac0a46fSAndroid Build Coastguard Worker Mask<XFA_NodeFilter> dwFilter) {
718*3ac0a46fSAndroid Build Coastguard Worker for (CXFA_Node* child : parent->GetNodeListWithFilter(dwFilter)) {
719*3ac0a46fSAndroid Build Coastguard Worker if (child->GetElementType() == element)
720*3ac0a46fSAndroid Build Coastguard Worker return child;
721*3ac0a46fSAndroid Build Coastguard Worker
722*3ac0a46fSAndroid Build Coastguard Worker CXFA_Node* result = FindFirstSiblingOfClass(child, element);
723*3ac0a46fSAndroid Build Coastguard Worker if (result)
724*3ac0a46fSAndroid Build Coastguard Worker return result;
725*3ac0a46fSAndroid Build Coastguard Worker }
726*3ac0a46fSAndroid Build Coastguard Worker return nullptr;
727*3ac0a46fSAndroid Build Coastguard Worker }
728*3ac0a46fSAndroid Build Coastguard Worker
GetNameExpressionSinglePath(CXFA_Node * pNode)729*3ac0a46fSAndroid Build Coastguard Worker WideString GetNameExpressionSinglePath(CXFA_Node* pNode) {
730*3ac0a46fSAndroid Build Coastguard Worker const bool bIsProperty = pNode->IsProperty();
731*3ac0a46fSAndroid Build Coastguard Worker const bool bIsClassIndex =
732*3ac0a46fSAndroid Build Coastguard Worker pNode->IsUnnamed() ||
733*3ac0a46fSAndroid Build Coastguard Worker (bIsProperty && pNode->GetElementType() != XFA_Element::PageSet);
734*3ac0a46fSAndroid Build Coastguard Worker const wchar_t* pszFormat;
735*3ac0a46fSAndroid Build Coastguard Worker WideString ws;
736*3ac0a46fSAndroid Build Coastguard Worker if (bIsClassIndex) {
737*3ac0a46fSAndroid Build Coastguard Worker pszFormat = L"#%ls[%zu]";
738*3ac0a46fSAndroid Build Coastguard Worker ws = WideString::FromASCII(pNode->GetClassName());
739*3ac0a46fSAndroid Build Coastguard Worker } else {
740*3ac0a46fSAndroid Build Coastguard Worker pszFormat = L"%ls[%zu]";
741*3ac0a46fSAndroid Build Coastguard Worker ws = pNode->JSObject()->GetCData(XFA_Attribute::Name);
742*3ac0a46fSAndroid Build Coastguard Worker ws.Replace(L".", L"\\.");
743*3ac0a46fSAndroid Build Coastguard Worker }
744*3ac0a46fSAndroid Build Coastguard Worker
745*3ac0a46fSAndroid Build Coastguard Worker return WideString::Format(pszFormat, ws.c_str(),
746*3ac0a46fSAndroid Build Coastguard Worker pNode->GetIndex(bIsProperty, bIsClassIndex));
747*3ac0a46fSAndroid Build Coastguard Worker }
748*3ac0a46fSAndroid Build Coastguard Worker
TraverseSiblings(CXFA_Node * parent,uint32_t dwNameHash,std::vector<CXFA_Node * > * pSiblings,bool bIsClassName)749*3ac0a46fSAndroid Build Coastguard Worker void TraverseSiblings(CXFA_Node* parent,
750*3ac0a46fSAndroid Build Coastguard Worker uint32_t dwNameHash,
751*3ac0a46fSAndroid Build Coastguard Worker std::vector<CXFA_Node*>* pSiblings,
752*3ac0a46fSAndroid Build Coastguard Worker bool bIsClassName) {
753*3ac0a46fSAndroid Build Coastguard Worker DCHECK(parent);
754*3ac0a46fSAndroid Build Coastguard Worker DCHECK(pSiblings);
755*3ac0a46fSAndroid Build Coastguard Worker for (CXFA_Node* child :
756*3ac0a46fSAndroid Build Coastguard Worker parent->GetNodeListWithFilter(XFA_NodeFilter::kChildren)) {
757*3ac0a46fSAndroid Build Coastguard Worker if (child->GetElementType() == XFA_Element::Variables)
758*3ac0a46fSAndroid Build Coastguard Worker continue;
759*3ac0a46fSAndroid Build Coastguard Worker
760*3ac0a46fSAndroid Build Coastguard Worker if (bIsClassName) {
761*3ac0a46fSAndroid Build Coastguard Worker if (child->GetClassHashCode() == dwNameHash)
762*3ac0a46fSAndroid Build Coastguard Worker pSiblings->push_back(child);
763*3ac0a46fSAndroid Build Coastguard Worker } else {
764*3ac0a46fSAndroid Build Coastguard Worker if (child->GetNameHash() == dwNameHash)
765*3ac0a46fSAndroid Build Coastguard Worker pSiblings->push_back(child);
766*3ac0a46fSAndroid Build Coastguard Worker }
767*3ac0a46fSAndroid Build Coastguard Worker if (child->IsTransparent() &&
768*3ac0a46fSAndroid Build Coastguard Worker child->GetElementType() != XFA_Element::PageSet) {
769*3ac0a46fSAndroid Build Coastguard Worker TraverseSiblings(child, dwNameHash, pSiblings, bIsClassName);
770*3ac0a46fSAndroid Build Coastguard Worker }
771*3ac0a46fSAndroid Build Coastguard Worker }
772*3ac0a46fSAndroid Build Coastguard Worker }
773*3ac0a46fSAndroid Build Coastguard Worker
TraversePropertiesOrSiblings(CXFA_Node * parent,uint32_t dwNameHash,std::vector<CXFA_Node * > * pSiblings,bool bIsClassName)774*3ac0a46fSAndroid Build Coastguard Worker void TraversePropertiesOrSiblings(CXFA_Node* parent,
775*3ac0a46fSAndroid Build Coastguard Worker uint32_t dwNameHash,
776*3ac0a46fSAndroid Build Coastguard Worker std::vector<CXFA_Node*>* pSiblings,
777*3ac0a46fSAndroid Build Coastguard Worker bool bIsClassName) {
778*3ac0a46fSAndroid Build Coastguard Worker DCHECK(parent);
779*3ac0a46fSAndroid Build Coastguard Worker DCHECK(pSiblings);
780*3ac0a46fSAndroid Build Coastguard Worker for (CXFA_Node* child :
781*3ac0a46fSAndroid Build Coastguard Worker parent->GetNodeListWithFilter(XFA_NodeFilter::kProperties)) {
782*3ac0a46fSAndroid Build Coastguard Worker if (bIsClassName) {
783*3ac0a46fSAndroid Build Coastguard Worker if (child->GetClassHashCode() == dwNameHash)
784*3ac0a46fSAndroid Build Coastguard Worker pSiblings->push_back(child);
785*3ac0a46fSAndroid Build Coastguard Worker } else {
786*3ac0a46fSAndroid Build Coastguard Worker if (child->GetNameHash() == dwNameHash) {
787*3ac0a46fSAndroid Build Coastguard Worker if (child->GetElementType() != XFA_Element::PageSet &&
788*3ac0a46fSAndroid Build Coastguard Worker child->GetElementType() != XFA_Element::Extras &&
789*3ac0a46fSAndroid Build Coastguard Worker child->GetElementType() != XFA_Element::Items) {
790*3ac0a46fSAndroid Build Coastguard Worker pSiblings->push_back(child);
791*3ac0a46fSAndroid Build Coastguard Worker }
792*3ac0a46fSAndroid Build Coastguard Worker }
793*3ac0a46fSAndroid Build Coastguard Worker }
794*3ac0a46fSAndroid Build Coastguard Worker if (child->IsUnnamed() && child->GetElementType() == XFA_Element::PageSet) {
795*3ac0a46fSAndroid Build Coastguard Worker TraverseSiblings(child, dwNameHash, pSiblings, bIsClassName);
796*3ac0a46fSAndroid Build Coastguard Worker }
797*3ac0a46fSAndroid Build Coastguard Worker }
798*3ac0a46fSAndroid Build Coastguard Worker if (pSiblings->empty())
799*3ac0a46fSAndroid Build Coastguard Worker TraverseSiblings(parent, dwNameHash, pSiblings, bIsClassName);
800*3ac0a46fSAndroid Build Coastguard Worker }
801*3ac0a46fSAndroid Build Coastguard Worker
802*3ac0a46fSAndroid Build Coastguard Worker } // namespace
803*3ac0a46fSAndroid Build Coastguard Worker
804*3ac0a46fSAndroid Build Coastguard Worker class CXFA_WidgetLayoutData
805*3ac0a46fSAndroid Build Coastguard Worker : public cppgc::GarbageCollected<CXFA_WidgetLayoutData> {
806*3ac0a46fSAndroid Build Coastguard Worker public:
807*3ac0a46fSAndroid Build Coastguard Worker CONSTRUCT_VIA_MAKE_GARBAGE_COLLECTED;
808*3ac0a46fSAndroid Build Coastguard Worker virtual ~CXFA_WidgetLayoutData() = default;
809*3ac0a46fSAndroid Build Coastguard Worker
Trace(cppgc::Visitor * visitor) const810*3ac0a46fSAndroid Build Coastguard Worker virtual void Trace(cppgc::Visitor* visitor) const {}
811*3ac0a46fSAndroid Build Coastguard Worker
AsFieldLayoutData()812*3ac0a46fSAndroid Build Coastguard Worker virtual CXFA_FieldLayoutData* AsFieldLayoutData() { return nullptr; }
AsImageLayoutData()813*3ac0a46fSAndroid Build Coastguard Worker virtual CXFA_ImageLayoutData* AsImageLayoutData() { return nullptr; }
AsTextLayoutData()814*3ac0a46fSAndroid Build Coastguard Worker virtual CXFA_TextLayoutData* AsTextLayoutData() { return nullptr; }
815*3ac0a46fSAndroid Build Coastguard Worker
GetWidgetHeight() const816*3ac0a46fSAndroid Build Coastguard Worker float GetWidgetHeight() const { return m_fWidgetHeight; }
SetWidgetHeight(float height)817*3ac0a46fSAndroid Build Coastguard Worker void SetWidgetHeight(float height) { m_fWidgetHeight = height; }
818*3ac0a46fSAndroid Build Coastguard Worker
819*3ac0a46fSAndroid Build Coastguard Worker protected:
820*3ac0a46fSAndroid Build Coastguard Worker CXFA_WidgetLayoutData() = default;
821*3ac0a46fSAndroid Build Coastguard Worker
822*3ac0a46fSAndroid Build Coastguard Worker private:
823*3ac0a46fSAndroid Build Coastguard Worker float m_fWidgetHeight = -1.0f;
824*3ac0a46fSAndroid Build Coastguard Worker };
825*3ac0a46fSAndroid Build Coastguard Worker
826*3ac0a46fSAndroid Build Coastguard Worker class CXFA_TextLayoutData final : public CXFA_WidgetLayoutData {
827*3ac0a46fSAndroid Build Coastguard Worker public:
828*3ac0a46fSAndroid Build Coastguard Worker CONSTRUCT_VIA_MAKE_GARBAGE_COLLECTED;
829*3ac0a46fSAndroid Build Coastguard Worker ~CXFA_TextLayoutData() override = default;
830*3ac0a46fSAndroid Build Coastguard Worker
Trace(cppgc::Visitor * visitor) const831*3ac0a46fSAndroid Build Coastguard Worker void Trace(cppgc::Visitor* visitor) const override {
832*3ac0a46fSAndroid Build Coastguard Worker CXFA_WidgetLayoutData::Trace(visitor);
833*3ac0a46fSAndroid Build Coastguard Worker visitor->Trace(m_pTextLayout);
834*3ac0a46fSAndroid Build Coastguard Worker visitor->Trace(m_pTextProvider);
835*3ac0a46fSAndroid Build Coastguard Worker }
836*3ac0a46fSAndroid Build Coastguard Worker
AsTextLayoutData()837*3ac0a46fSAndroid Build Coastguard Worker CXFA_TextLayoutData* AsTextLayoutData() override { return this; }
838*3ac0a46fSAndroid Build Coastguard Worker
GetTextLayout() const839*3ac0a46fSAndroid Build Coastguard Worker CXFA_TextLayout* GetTextLayout() const { return m_pTextLayout; }
GetTextProvider() const840*3ac0a46fSAndroid Build Coastguard Worker CXFA_TextProvider* GetTextProvider() const { return m_pTextProvider; }
841*3ac0a46fSAndroid Build Coastguard Worker
LoadText(CXFA_FFDoc * doc,CXFA_Node * pNode)842*3ac0a46fSAndroid Build Coastguard Worker void LoadText(CXFA_FFDoc* doc, CXFA_Node* pNode) {
843*3ac0a46fSAndroid Build Coastguard Worker if (m_pTextLayout)
844*3ac0a46fSAndroid Build Coastguard Worker return;
845*3ac0a46fSAndroid Build Coastguard Worker
846*3ac0a46fSAndroid Build Coastguard Worker m_pTextProvider = cppgc::MakeGarbageCollected<CXFA_TextProvider>(
847*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), pNode,
848*3ac0a46fSAndroid Build Coastguard Worker CXFA_TextProvider::Type::kText);
849*3ac0a46fSAndroid Build Coastguard Worker m_pTextLayout = cppgc::MakeGarbageCollected<CXFA_TextLayout>(
850*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, m_pTextProvider);
851*3ac0a46fSAndroid Build Coastguard Worker }
852*3ac0a46fSAndroid Build Coastguard Worker
853*3ac0a46fSAndroid Build Coastguard Worker private:
854*3ac0a46fSAndroid Build Coastguard Worker CXFA_TextLayoutData() = default;
855*3ac0a46fSAndroid Build Coastguard Worker
856*3ac0a46fSAndroid Build Coastguard Worker cppgc::Member<CXFA_TextLayout> m_pTextLayout;
857*3ac0a46fSAndroid Build Coastguard Worker cppgc::Member<CXFA_TextProvider> m_pTextProvider;
858*3ac0a46fSAndroid Build Coastguard Worker };
859*3ac0a46fSAndroid Build Coastguard Worker
860*3ac0a46fSAndroid Build Coastguard Worker class CXFA_ImageLayoutData final : public CXFA_WidgetLayoutData {
861*3ac0a46fSAndroid Build Coastguard Worker public:
862*3ac0a46fSAndroid Build Coastguard Worker CONSTRUCT_VIA_MAKE_GARBAGE_COLLECTED;
863*3ac0a46fSAndroid Build Coastguard Worker ~CXFA_ImageLayoutData() override = default;
864*3ac0a46fSAndroid Build Coastguard Worker
AsImageLayoutData()865*3ac0a46fSAndroid Build Coastguard Worker CXFA_ImageLayoutData* AsImageLayoutData() override { return this; }
866*3ac0a46fSAndroid Build Coastguard Worker
LoadImageData(CXFA_FFDoc * doc,CXFA_Node * pNode)867*3ac0a46fSAndroid Build Coastguard Worker bool LoadImageData(CXFA_FFDoc* doc, CXFA_Node* pNode) {
868*3ac0a46fSAndroid Build Coastguard Worker if (m_pDIBitmap)
869*3ac0a46fSAndroid Build Coastguard Worker return true;
870*3ac0a46fSAndroid Build Coastguard Worker
871*3ac0a46fSAndroid Build Coastguard Worker CXFA_Value* value = pNode->GetFormValueIfExists();
872*3ac0a46fSAndroid Build Coastguard Worker if (!value)
873*3ac0a46fSAndroid Build Coastguard Worker return false;
874*3ac0a46fSAndroid Build Coastguard Worker
875*3ac0a46fSAndroid Build Coastguard Worker CXFA_Image* image = value->GetImageIfExists();
876*3ac0a46fSAndroid Build Coastguard Worker if (!image)
877*3ac0a46fSAndroid Build Coastguard Worker return false;
878*3ac0a46fSAndroid Build Coastguard Worker
879*3ac0a46fSAndroid Build Coastguard Worker pNode->SetLayoutImage(XFA_LoadImageData(doc, image, m_bNamedImage,
880*3ac0a46fSAndroid Build Coastguard Worker m_iImageXDpi, m_iImageYDpi));
881*3ac0a46fSAndroid Build Coastguard Worker return !!m_pDIBitmap;
882*3ac0a46fSAndroid Build Coastguard Worker }
883*3ac0a46fSAndroid Build Coastguard Worker
GetDpi() const884*3ac0a46fSAndroid Build Coastguard Worker CFX_Size GetDpi() const { return CFX_Size(m_iImageXDpi, m_iImageYDpi); }
GetBitmap()885*3ac0a46fSAndroid Build Coastguard Worker RetainPtr<CFX_DIBitmap> GetBitmap() { return m_pDIBitmap; }
SetBitmap(RetainPtr<CFX_DIBitmap> pBitmap)886*3ac0a46fSAndroid Build Coastguard Worker void SetBitmap(RetainPtr<CFX_DIBitmap> pBitmap) {
887*3ac0a46fSAndroid Build Coastguard Worker m_pDIBitmap = std::move(pBitmap);
888*3ac0a46fSAndroid Build Coastguard Worker }
889*3ac0a46fSAndroid Build Coastguard Worker
890*3ac0a46fSAndroid Build Coastguard Worker private:
891*3ac0a46fSAndroid Build Coastguard Worker CXFA_ImageLayoutData() = default;
892*3ac0a46fSAndroid Build Coastguard Worker
893*3ac0a46fSAndroid Build Coastguard Worker bool m_bNamedImage = false;
894*3ac0a46fSAndroid Build Coastguard Worker int32_t m_iImageXDpi = 0;
895*3ac0a46fSAndroid Build Coastguard Worker int32_t m_iImageYDpi = 0;
896*3ac0a46fSAndroid Build Coastguard Worker RetainPtr<CFX_DIBitmap> m_pDIBitmap;
897*3ac0a46fSAndroid Build Coastguard Worker };
898*3ac0a46fSAndroid Build Coastguard Worker
899*3ac0a46fSAndroid Build Coastguard Worker class CXFA_FieldLayoutData : public CXFA_WidgetLayoutData {
900*3ac0a46fSAndroid Build Coastguard Worker public:
901*3ac0a46fSAndroid Build Coastguard Worker CONSTRUCT_VIA_MAKE_GARBAGE_COLLECTED;
902*3ac0a46fSAndroid Build Coastguard Worker ~CXFA_FieldLayoutData() override = default;
903*3ac0a46fSAndroid Build Coastguard Worker
Trace(cppgc::Visitor * visitor) const904*3ac0a46fSAndroid Build Coastguard Worker void Trace(cppgc::Visitor* visitor) const override {
905*3ac0a46fSAndroid Build Coastguard Worker CXFA_WidgetLayoutData::Trace(visitor);
906*3ac0a46fSAndroid Build Coastguard Worker visitor->Trace(m_pCapTextLayout);
907*3ac0a46fSAndroid Build Coastguard Worker visitor->Trace(m_pCapTextProvider);
908*3ac0a46fSAndroid Build Coastguard Worker }
AsFieldLayoutData()909*3ac0a46fSAndroid Build Coastguard Worker CXFA_FieldLayoutData* AsFieldLayoutData() override { return this; }
910*3ac0a46fSAndroid Build Coastguard Worker
AsImageEditData()911*3ac0a46fSAndroid Build Coastguard Worker virtual CXFA_ImageEditData* AsImageEditData() { return nullptr; }
AsTextEditData()912*3ac0a46fSAndroid Build Coastguard Worker virtual CXFA_TextEditData* AsTextEditData() { return nullptr; }
913*3ac0a46fSAndroid Build Coastguard Worker
LoadCaption(CXFA_FFDoc * doc,CXFA_Node * pNode)914*3ac0a46fSAndroid Build Coastguard Worker bool LoadCaption(CXFA_FFDoc* doc, CXFA_Node* pNode) {
915*3ac0a46fSAndroid Build Coastguard Worker if (m_pCapTextLayout)
916*3ac0a46fSAndroid Build Coastguard Worker return true;
917*3ac0a46fSAndroid Build Coastguard Worker CXFA_Caption* caption = pNode->GetCaptionIfExists();
918*3ac0a46fSAndroid Build Coastguard Worker if (!caption || caption->IsHidden())
919*3ac0a46fSAndroid Build Coastguard Worker return false;
920*3ac0a46fSAndroid Build Coastguard Worker
921*3ac0a46fSAndroid Build Coastguard Worker m_pCapTextProvider = cppgc::MakeGarbageCollected<CXFA_TextProvider>(
922*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), pNode,
923*3ac0a46fSAndroid Build Coastguard Worker CXFA_TextProvider::Type::kCaption);
924*3ac0a46fSAndroid Build Coastguard Worker m_pCapTextLayout = cppgc::MakeGarbageCollected<CXFA_TextLayout>(
925*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, m_pCapTextProvider);
926*3ac0a46fSAndroid Build Coastguard Worker return true;
927*3ac0a46fSAndroid Build Coastguard Worker }
928*3ac0a46fSAndroid Build Coastguard Worker
929*3ac0a46fSAndroid Build Coastguard Worker cppgc::Member<CXFA_TextLayout> m_pCapTextLayout;
930*3ac0a46fSAndroid Build Coastguard Worker cppgc::Member<CXFA_TextProvider> m_pCapTextProvider;
931*3ac0a46fSAndroid Build Coastguard Worker std::unique_ptr<CFDE_TextOut> m_pTextOut;
932*3ac0a46fSAndroid Build Coastguard Worker std::vector<float> m_FieldSplitArray;
933*3ac0a46fSAndroid Build Coastguard Worker
934*3ac0a46fSAndroid Build Coastguard Worker protected:
935*3ac0a46fSAndroid Build Coastguard Worker CXFA_FieldLayoutData() = default;
936*3ac0a46fSAndroid Build Coastguard Worker };
937*3ac0a46fSAndroid Build Coastguard Worker
938*3ac0a46fSAndroid Build Coastguard Worker class CXFA_TextEditData final : public CXFA_FieldLayoutData {
939*3ac0a46fSAndroid Build Coastguard Worker public:
940*3ac0a46fSAndroid Build Coastguard Worker CONSTRUCT_VIA_MAKE_GARBAGE_COLLECTED;
941*3ac0a46fSAndroid Build Coastguard Worker ~CXFA_TextEditData() override = default;
942*3ac0a46fSAndroid Build Coastguard Worker
AsTextEditData()943*3ac0a46fSAndroid Build Coastguard Worker CXFA_TextEditData* AsTextEditData() override { return this; }
944*3ac0a46fSAndroid Build Coastguard Worker
945*3ac0a46fSAndroid Build Coastguard Worker protected:
946*3ac0a46fSAndroid Build Coastguard Worker CXFA_TextEditData() = default;
947*3ac0a46fSAndroid Build Coastguard Worker };
948*3ac0a46fSAndroid Build Coastguard Worker
949*3ac0a46fSAndroid Build Coastguard Worker class CXFA_ImageEditData final : public CXFA_FieldLayoutData {
950*3ac0a46fSAndroid Build Coastguard Worker public:
951*3ac0a46fSAndroid Build Coastguard Worker CONSTRUCT_VIA_MAKE_GARBAGE_COLLECTED;
952*3ac0a46fSAndroid Build Coastguard Worker ~CXFA_ImageEditData() override = default;
953*3ac0a46fSAndroid Build Coastguard Worker
AsImageEditData()954*3ac0a46fSAndroid Build Coastguard Worker CXFA_ImageEditData* AsImageEditData() override { return this; }
955*3ac0a46fSAndroid Build Coastguard Worker
LoadImageData(CXFA_FFDoc * doc,CXFA_Node * pNode)956*3ac0a46fSAndroid Build Coastguard Worker bool LoadImageData(CXFA_FFDoc* doc, CXFA_Node* pNode) {
957*3ac0a46fSAndroid Build Coastguard Worker if (m_pDIBitmap)
958*3ac0a46fSAndroid Build Coastguard Worker return true;
959*3ac0a46fSAndroid Build Coastguard Worker
960*3ac0a46fSAndroid Build Coastguard Worker CXFA_Value* value = pNode->GetFormValueIfExists();
961*3ac0a46fSAndroid Build Coastguard Worker if (!value)
962*3ac0a46fSAndroid Build Coastguard Worker return false;
963*3ac0a46fSAndroid Build Coastguard Worker
964*3ac0a46fSAndroid Build Coastguard Worker CXFA_Image* image = value->GetImageIfExists();
965*3ac0a46fSAndroid Build Coastguard Worker if (!image)
966*3ac0a46fSAndroid Build Coastguard Worker return false;
967*3ac0a46fSAndroid Build Coastguard Worker
968*3ac0a46fSAndroid Build Coastguard Worker pNode->SetEditImage(XFA_LoadImageData(doc, image, m_bNamedImage,
969*3ac0a46fSAndroid Build Coastguard Worker m_iImageXDpi, m_iImageYDpi));
970*3ac0a46fSAndroid Build Coastguard Worker return !!m_pDIBitmap;
971*3ac0a46fSAndroid Build Coastguard Worker }
972*3ac0a46fSAndroid Build Coastguard Worker
GetDpi() const973*3ac0a46fSAndroid Build Coastguard Worker CFX_Size GetDpi() const { return CFX_Size(m_iImageXDpi, m_iImageYDpi); }
GetBitmap()974*3ac0a46fSAndroid Build Coastguard Worker RetainPtr<CFX_DIBitmap> GetBitmap() { return m_pDIBitmap; }
SetBitmap(RetainPtr<CFX_DIBitmap> pBitmap)975*3ac0a46fSAndroid Build Coastguard Worker void SetBitmap(RetainPtr<CFX_DIBitmap> pBitmap) {
976*3ac0a46fSAndroid Build Coastguard Worker m_pDIBitmap = std::move(pBitmap);
977*3ac0a46fSAndroid Build Coastguard Worker }
978*3ac0a46fSAndroid Build Coastguard Worker
979*3ac0a46fSAndroid Build Coastguard Worker private:
980*3ac0a46fSAndroid Build Coastguard Worker CXFA_ImageEditData() = default;
981*3ac0a46fSAndroid Build Coastguard Worker
982*3ac0a46fSAndroid Build Coastguard Worker bool m_bNamedImage = false;
983*3ac0a46fSAndroid Build Coastguard Worker int32_t m_iImageXDpi = 0;
984*3ac0a46fSAndroid Build Coastguard Worker int32_t m_iImageYDpi = 0;
985*3ac0a46fSAndroid Build Coastguard Worker RetainPtr<CFX_DIBitmap> m_pDIBitmap;
986*3ac0a46fSAndroid Build Coastguard Worker };
987*3ac0a46fSAndroid Build Coastguard Worker
CXFA_Node(CXFA_Document * pDoc,XFA_PacketType ePacket,Mask<XFA_XDPPACKET> validPackets,XFA_ObjectType oType,XFA_Element eType,pdfium::span<const PropertyData> properties,pdfium::span<const AttributeData> attributes,CJX_Object * js_object)988*3ac0a46fSAndroid Build Coastguard Worker CXFA_Node::CXFA_Node(CXFA_Document* pDoc,
989*3ac0a46fSAndroid Build Coastguard Worker XFA_PacketType ePacket,
990*3ac0a46fSAndroid Build Coastguard Worker Mask<XFA_XDPPACKET> validPackets,
991*3ac0a46fSAndroid Build Coastguard Worker XFA_ObjectType oType,
992*3ac0a46fSAndroid Build Coastguard Worker XFA_Element eType,
993*3ac0a46fSAndroid Build Coastguard Worker pdfium::span<const PropertyData> properties,
994*3ac0a46fSAndroid Build Coastguard Worker pdfium::span<const AttributeData> attributes,
995*3ac0a46fSAndroid Build Coastguard Worker CJX_Object* js_object)
996*3ac0a46fSAndroid Build Coastguard Worker : CXFA_Object(pDoc, oType, eType, js_object),
997*3ac0a46fSAndroid Build Coastguard Worker m_Properties(properties),
998*3ac0a46fSAndroid Build Coastguard Worker m_Attributes(attributes),
999*3ac0a46fSAndroid Build Coastguard Worker m_ValidPackets(validPackets),
1000*3ac0a46fSAndroid Build Coastguard Worker m_ePacket(ePacket) {
1001*3ac0a46fSAndroid Build Coastguard Worker DCHECK(m_pDocument);
1002*3ac0a46fSAndroid Build Coastguard Worker }
1003*3ac0a46fSAndroid Build Coastguard Worker
1004*3ac0a46fSAndroid Build Coastguard Worker CXFA_Node::~CXFA_Node() = default;
1005*3ac0a46fSAndroid Build Coastguard Worker
Trace(cppgc::Visitor * visitor) const1006*3ac0a46fSAndroid Build Coastguard Worker void CXFA_Node::Trace(cppgc::Visitor* visitor) const {
1007*3ac0a46fSAndroid Build Coastguard Worker CXFA_Object::Trace(visitor);
1008*3ac0a46fSAndroid Build Coastguard Worker GCedTreeNodeMixin<CXFA_Node>::Trace(visitor);
1009*3ac0a46fSAndroid Build Coastguard Worker visitor->Trace(m_pAuxNode);
1010*3ac0a46fSAndroid Build Coastguard Worker ContainerTrace(visitor, binding_nodes_);
1011*3ac0a46fSAndroid Build Coastguard Worker visitor->Trace(m_pLayoutData);
1012*3ac0a46fSAndroid Build Coastguard Worker visitor->Trace(ui_);
1013*3ac0a46fSAndroid Build Coastguard Worker }
1014*3ac0a46fSAndroid Build Coastguard Worker
Clone(bool bRecursive)1015*3ac0a46fSAndroid Build Coastguard Worker CXFA_Node* CXFA_Node::Clone(bool bRecursive) {
1016*3ac0a46fSAndroid Build Coastguard Worker CXFA_Node* pClone = m_pDocument->CreateNode(m_ePacket, m_elementType);
1017*3ac0a46fSAndroid Build Coastguard Worker if (!pClone)
1018*3ac0a46fSAndroid Build Coastguard Worker return nullptr;
1019*3ac0a46fSAndroid Build Coastguard Worker
1020*3ac0a46fSAndroid Build Coastguard Worker JSObject()->MergeAllData(pClone);
1021*3ac0a46fSAndroid Build Coastguard Worker pClone->UpdateNameHash();
1022*3ac0a46fSAndroid Build Coastguard Worker if (IsNeedSavingXMLNode()) {
1023*3ac0a46fSAndroid Build Coastguard Worker CFX_XMLNode* pCloneXML;
1024*3ac0a46fSAndroid Build Coastguard Worker if (IsAttributeInXML()) {
1025*3ac0a46fSAndroid Build Coastguard Worker WideString wsName = JSObject()
1026*3ac0a46fSAndroid Build Coastguard Worker ->TryAttribute(XFA_Attribute::Name, false)
1027*3ac0a46fSAndroid Build Coastguard Worker .value_or(WideString());
1028*3ac0a46fSAndroid Build Coastguard Worker auto* pCloneXMLElement =
1029*3ac0a46fSAndroid Build Coastguard Worker GetXMLDocument()->CreateNode<CFX_XMLElement>(wsName);
1030*3ac0a46fSAndroid Build Coastguard Worker
1031*3ac0a46fSAndroid Build Coastguard Worker WideString wsValue = JSObject()->GetCData(XFA_Attribute::Value);
1032*3ac0a46fSAndroid Build Coastguard Worker if (!wsValue.IsEmpty()) {
1033*3ac0a46fSAndroid Build Coastguard Worker auto* text = GetXMLDocument()->CreateNode<CFX_XMLText>(wsValue);
1034*3ac0a46fSAndroid Build Coastguard Worker pCloneXMLElement->AppendLastChild(text);
1035*3ac0a46fSAndroid Build Coastguard Worker }
1036*3ac0a46fSAndroid Build Coastguard Worker
1037*3ac0a46fSAndroid Build Coastguard Worker pCloneXML = pCloneXMLElement;
1038*3ac0a46fSAndroid Build Coastguard Worker pClone->JSObject()->SetEnum(XFA_Attribute::Contains,
1039*3ac0a46fSAndroid Build Coastguard Worker XFA_AttributeValue::Unknown, false);
1040*3ac0a46fSAndroid Build Coastguard Worker } else {
1041*3ac0a46fSAndroid Build Coastguard Worker pCloneXML = xml_node_->Clone(GetXMLDocument());
1042*3ac0a46fSAndroid Build Coastguard Worker }
1043*3ac0a46fSAndroid Build Coastguard Worker pClone->SetXMLMappingNode(pCloneXML);
1044*3ac0a46fSAndroid Build Coastguard Worker }
1045*3ac0a46fSAndroid Build Coastguard Worker if (bRecursive) {
1046*3ac0a46fSAndroid Build Coastguard Worker for (CXFA_Node* pChild = GetFirstChild(); pChild;
1047*3ac0a46fSAndroid Build Coastguard Worker pChild = pChild->GetNextSibling()) {
1048*3ac0a46fSAndroid Build Coastguard Worker pClone->InsertChildAndNotify(pChild->Clone(bRecursive), nullptr);
1049*3ac0a46fSAndroid Build Coastguard Worker }
1050*3ac0a46fSAndroid Build Coastguard Worker }
1051*3ac0a46fSAndroid Build Coastguard Worker pClone->SetInitializedFlagAndNotify();
1052*3ac0a46fSAndroid Build Coastguard Worker pClone->SetBindingNode(nullptr);
1053*3ac0a46fSAndroid Build Coastguard Worker return pClone;
1054*3ac0a46fSAndroid Build Coastguard Worker }
1055*3ac0a46fSAndroid Build Coastguard Worker
GetNextContainerSibling() const1056*3ac0a46fSAndroid Build Coastguard Worker CXFA_Node* CXFA_Node::GetNextContainerSibling() const {
1057*3ac0a46fSAndroid Build Coastguard Worker for (auto* pNode = GetNextSibling(); pNode; pNode = pNode->GetNextSibling()) {
1058*3ac0a46fSAndroid Build Coastguard Worker if (pNode->GetObjectType() == XFA_ObjectType::ContainerNode)
1059*3ac0a46fSAndroid Build Coastguard Worker return pNode;
1060*3ac0a46fSAndroid Build Coastguard Worker }
1061*3ac0a46fSAndroid Build Coastguard Worker return nullptr;
1062*3ac0a46fSAndroid Build Coastguard Worker }
1063*3ac0a46fSAndroid Build Coastguard Worker
GetPrevContainerSibling() const1064*3ac0a46fSAndroid Build Coastguard Worker CXFA_Node* CXFA_Node::GetPrevContainerSibling() const {
1065*3ac0a46fSAndroid Build Coastguard Worker for (auto* pNode = GetPrevSibling(); pNode; pNode = pNode->GetPrevSibling()) {
1066*3ac0a46fSAndroid Build Coastguard Worker if (pNode->GetObjectType() == XFA_ObjectType::ContainerNode)
1067*3ac0a46fSAndroid Build Coastguard Worker return pNode;
1068*3ac0a46fSAndroid Build Coastguard Worker }
1069*3ac0a46fSAndroid Build Coastguard Worker return nullptr;
1070*3ac0a46fSAndroid Build Coastguard Worker }
1071*3ac0a46fSAndroid Build Coastguard Worker
GetFirstContainerChild() const1072*3ac0a46fSAndroid Build Coastguard Worker CXFA_Node* CXFA_Node::GetFirstContainerChild() const {
1073*3ac0a46fSAndroid Build Coastguard Worker for (auto* pNode = GetFirstChild(); pNode; pNode = pNode->GetNextSibling()) {
1074*3ac0a46fSAndroid Build Coastguard Worker if (pNode->GetObjectType() == XFA_ObjectType::ContainerNode)
1075*3ac0a46fSAndroid Build Coastguard Worker return pNode;
1076*3ac0a46fSAndroid Build Coastguard Worker }
1077*3ac0a46fSAndroid Build Coastguard Worker return nullptr;
1078*3ac0a46fSAndroid Build Coastguard Worker }
1079*3ac0a46fSAndroid Build Coastguard Worker
GetContainerParent() const1080*3ac0a46fSAndroid Build Coastguard Worker CXFA_Node* CXFA_Node::GetContainerParent() const {
1081*3ac0a46fSAndroid Build Coastguard Worker for (auto* pNode = GetParent(); pNode; pNode = pNode->GetParent()) {
1082*3ac0a46fSAndroid Build Coastguard Worker if (pNode->GetObjectType() == XFA_ObjectType::ContainerNode)
1083*3ac0a46fSAndroid Build Coastguard Worker return pNode;
1084*3ac0a46fSAndroid Build Coastguard Worker }
1085*3ac0a46fSAndroid Build Coastguard Worker return nullptr;
1086*3ac0a46fSAndroid Build Coastguard Worker }
1087*3ac0a46fSAndroid Build Coastguard Worker
IsValidInPacket(XFA_PacketType packet) const1088*3ac0a46fSAndroid Build Coastguard Worker bool CXFA_Node::IsValidInPacket(XFA_PacketType packet) const {
1089*3ac0a46fSAndroid Build Coastguard Worker uint32_t bitflag = 1 << static_cast<uint8_t>(packet);
1090*3ac0a46fSAndroid Build Coastguard Worker return !!(m_ValidPackets & static_cast<XFA_XDPPACKET>(bitflag));
1091*3ac0a46fSAndroid Build Coastguard Worker }
1092*3ac0a46fSAndroid Build Coastguard Worker
GetPropertyData(XFA_Element property) const1093*3ac0a46fSAndroid Build Coastguard Worker const CXFA_Node::PropertyData* CXFA_Node::GetPropertyData(
1094*3ac0a46fSAndroid Build Coastguard Worker XFA_Element property) const {
1095*3ac0a46fSAndroid Build Coastguard Worker DCHECK(property != XFA_Element::Unknown);
1096*3ac0a46fSAndroid Build Coastguard Worker for (const auto& prop : m_Properties) {
1097*3ac0a46fSAndroid Build Coastguard Worker if (prop.property == property)
1098*3ac0a46fSAndroid Build Coastguard Worker return ∝
1099*3ac0a46fSAndroid Build Coastguard Worker }
1100*3ac0a46fSAndroid Build Coastguard Worker return nullptr;
1101*3ac0a46fSAndroid Build Coastguard Worker }
1102*3ac0a46fSAndroid Build Coastguard Worker
HasProperty(XFA_Element property) const1103*3ac0a46fSAndroid Build Coastguard Worker bool CXFA_Node::HasProperty(XFA_Element property) const {
1104*3ac0a46fSAndroid Build Coastguard Worker return !!GetPropertyData(property);
1105*3ac0a46fSAndroid Build Coastguard Worker }
1106*3ac0a46fSAndroid Build Coastguard Worker
HasPropertyFlag(XFA_Element property,XFA_PropertyFlag flag) const1107*3ac0a46fSAndroid Build Coastguard Worker bool CXFA_Node::HasPropertyFlag(XFA_Element property,
1108*3ac0a46fSAndroid Build Coastguard Worker XFA_PropertyFlag flag) const {
1109*3ac0a46fSAndroid Build Coastguard Worker const PropertyData* data = GetPropertyData(property);
1110*3ac0a46fSAndroid Build Coastguard Worker return data && !!(data->flags & flag);
1111*3ac0a46fSAndroid Build Coastguard Worker }
1112*3ac0a46fSAndroid Build Coastguard Worker
PropertyOccurrenceCount(XFA_Element property) const1113*3ac0a46fSAndroid Build Coastguard Worker uint8_t CXFA_Node::PropertyOccurrenceCount(XFA_Element property) const {
1114*3ac0a46fSAndroid Build Coastguard Worker const PropertyData* data = GetPropertyData(property);
1115*3ac0a46fSAndroid Build Coastguard Worker return data ? data->occurrence_count : 0;
1116*3ac0a46fSAndroid Build Coastguard Worker }
1117*3ac0a46fSAndroid Build Coastguard Worker
GetProperty(int32_t index,XFA_Element eProperty) const1118*3ac0a46fSAndroid Build Coastguard Worker std::pair<CXFA_Node*, int32_t> CXFA_Node::GetProperty(
1119*3ac0a46fSAndroid Build Coastguard Worker int32_t index,
1120*3ac0a46fSAndroid Build Coastguard Worker XFA_Element eProperty) const {
1121*3ac0a46fSAndroid Build Coastguard Worker if (index < 0 || index >= PropertyOccurrenceCount(eProperty))
1122*3ac0a46fSAndroid Build Coastguard Worker return {nullptr, 0};
1123*3ac0a46fSAndroid Build Coastguard Worker
1124*3ac0a46fSAndroid Build Coastguard Worker int32_t iCount = 0;
1125*3ac0a46fSAndroid Build Coastguard Worker for (CXFA_Node* pNode = GetFirstChild(); pNode;
1126*3ac0a46fSAndroid Build Coastguard Worker pNode = pNode->GetNextSibling()) {
1127*3ac0a46fSAndroid Build Coastguard Worker if (pNode->GetElementType() == eProperty) {
1128*3ac0a46fSAndroid Build Coastguard Worker iCount++;
1129*3ac0a46fSAndroid Build Coastguard Worker if (iCount > index)
1130*3ac0a46fSAndroid Build Coastguard Worker return {pNode, iCount};
1131*3ac0a46fSAndroid Build Coastguard Worker }
1132*3ac0a46fSAndroid Build Coastguard Worker }
1133*3ac0a46fSAndroid Build Coastguard Worker return {nullptr, iCount};
1134*3ac0a46fSAndroid Build Coastguard Worker }
1135*3ac0a46fSAndroid Build Coastguard Worker
GetOrCreateProperty(int32_t index,XFA_Element eProperty)1136*3ac0a46fSAndroid Build Coastguard Worker CXFA_Node* CXFA_Node::GetOrCreateProperty(int32_t index,
1137*3ac0a46fSAndroid Build Coastguard Worker XFA_Element eProperty) {
1138*3ac0a46fSAndroid Build Coastguard Worker if (index < 0 || index >= PropertyOccurrenceCount(eProperty))
1139*3ac0a46fSAndroid Build Coastguard Worker return nullptr;
1140*3ac0a46fSAndroid Build Coastguard Worker
1141*3ac0a46fSAndroid Build Coastguard Worker int32_t iCount = 0;
1142*3ac0a46fSAndroid Build Coastguard Worker CXFA_Node* node;
1143*3ac0a46fSAndroid Build Coastguard Worker std::tie(node, iCount) = GetProperty(index, eProperty);
1144*3ac0a46fSAndroid Build Coastguard Worker if (node)
1145*3ac0a46fSAndroid Build Coastguard Worker return node;
1146*3ac0a46fSAndroid Build Coastguard Worker
1147*3ac0a46fSAndroid Build Coastguard Worker if (HasPropertyFlag(eProperty, XFA_PropertyFlag::kOneOf)) {
1148*3ac0a46fSAndroid Build Coastguard Worker for (CXFA_Node* pNode = GetFirstChild(); pNode;
1149*3ac0a46fSAndroid Build Coastguard Worker pNode = pNode->GetNextSibling()) {
1150*3ac0a46fSAndroid Build Coastguard Worker if (HasPropertyFlag(pNode->GetElementType(), XFA_PropertyFlag::kOneOf)) {
1151*3ac0a46fSAndroid Build Coastguard Worker return nullptr;
1152*3ac0a46fSAndroid Build Coastguard Worker }
1153*3ac0a46fSAndroid Build Coastguard Worker }
1154*3ac0a46fSAndroid Build Coastguard Worker }
1155*3ac0a46fSAndroid Build Coastguard Worker
1156*3ac0a46fSAndroid Build Coastguard Worker CXFA_Node* pNewNode = nullptr;
1157*3ac0a46fSAndroid Build Coastguard Worker for (; iCount <= index; ++iCount) {
1158*3ac0a46fSAndroid Build Coastguard Worker pNewNode = GetDocument()->CreateNode(GetPacketType(), eProperty);
1159*3ac0a46fSAndroid Build Coastguard Worker if (!pNewNode)
1160*3ac0a46fSAndroid Build Coastguard Worker return nullptr;
1161*3ac0a46fSAndroid Build Coastguard Worker
1162*3ac0a46fSAndroid Build Coastguard Worker InsertChildAndNotify(pNewNode, nullptr);
1163*3ac0a46fSAndroid Build Coastguard Worker pNewNode->SetInitializedFlagAndNotify();
1164*3ac0a46fSAndroid Build Coastguard Worker }
1165*3ac0a46fSAndroid Build Coastguard Worker return pNewNode;
1166*3ac0a46fSAndroid Build Coastguard Worker }
1167*3ac0a46fSAndroid Build Coastguard Worker
GetFirstPropertyWithFlag(XFA_PropertyFlag flag) const1168*3ac0a46fSAndroid Build Coastguard Worker absl::optional<XFA_Element> CXFA_Node::GetFirstPropertyWithFlag(
1169*3ac0a46fSAndroid Build Coastguard Worker XFA_PropertyFlag flag) const {
1170*3ac0a46fSAndroid Build Coastguard Worker for (const auto& prop : m_Properties) {
1171*3ac0a46fSAndroid Build Coastguard Worker if (prop.flags & flag)
1172*3ac0a46fSAndroid Build Coastguard Worker return prop.property;
1173*3ac0a46fSAndroid Build Coastguard Worker }
1174*3ac0a46fSAndroid Build Coastguard Worker return absl::nullopt;
1175*3ac0a46fSAndroid Build Coastguard Worker }
1176*3ac0a46fSAndroid Build Coastguard Worker
GetAttributeData(XFA_Attribute attr) const1177*3ac0a46fSAndroid Build Coastguard Worker const CXFA_Node::AttributeData* CXFA_Node::GetAttributeData(
1178*3ac0a46fSAndroid Build Coastguard Worker XFA_Attribute attr) const {
1179*3ac0a46fSAndroid Build Coastguard Worker DCHECK(attr != XFA_Attribute::Unknown);
1180*3ac0a46fSAndroid Build Coastguard Worker for (const auto& cur_attr : m_Attributes) {
1181*3ac0a46fSAndroid Build Coastguard Worker if (cur_attr.attribute == attr)
1182*3ac0a46fSAndroid Build Coastguard Worker return &cur_attr;
1183*3ac0a46fSAndroid Build Coastguard Worker }
1184*3ac0a46fSAndroid Build Coastguard Worker return nullptr;
1185*3ac0a46fSAndroid Build Coastguard Worker }
1186*3ac0a46fSAndroid Build Coastguard Worker
HasAttribute(XFA_Attribute attr) const1187*3ac0a46fSAndroid Build Coastguard Worker bool CXFA_Node::HasAttribute(XFA_Attribute attr) const {
1188*3ac0a46fSAndroid Build Coastguard Worker return !!GetAttributeData(attr);
1189*3ac0a46fSAndroid Build Coastguard Worker }
1190*3ac0a46fSAndroid Build Coastguard Worker
GetAttribute(size_t i) const1191*3ac0a46fSAndroid Build Coastguard Worker XFA_Attribute CXFA_Node::GetAttribute(size_t i) const {
1192*3ac0a46fSAndroid Build Coastguard Worker return i < m_Attributes.size() ? m_Attributes[i].attribute
1193*3ac0a46fSAndroid Build Coastguard Worker : XFA_Attribute::Unknown;
1194*3ac0a46fSAndroid Build Coastguard Worker }
1195*3ac0a46fSAndroid Build Coastguard Worker
GetAttributeType(XFA_Attribute type) const1196*3ac0a46fSAndroid Build Coastguard Worker XFA_AttributeType CXFA_Node::GetAttributeType(XFA_Attribute type) const {
1197*3ac0a46fSAndroid Build Coastguard Worker const AttributeData* data = GetAttributeData(type);
1198*3ac0a46fSAndroid Build Coastguard Worker return data ? data->type : XFA_AttributeType::CData;
1199*3ac0a46fSAndroid Build Coastguard Worker }
1200*3ac0a46fSAndroid Build Coastguard Worker
GetNodeListForType(XFA_Element eTypeFilter)1201*3ac0a46fSAndroid Build Coastguard Worker std::vector<CXFA_Node*> CXFA_Node::GetNodeListForType(XFA_Element eTypeFilter) {
1202*3ac0a46fSAndroid Build Coastguard Worker std::vector<CXFA_Node*> nodes;
1203*3ac0a46fSAndroid Build Coastguard Worker for (CXFA_Node* pChild = GetFirstChild(); pChild;
1204*3ac0a46fSAndroid Build Coastguard Worker pChild = pChild->GetNextSibling()) {
1205*3ac0a46fSAndroid Build Coastguard Worker if (pChild->GetElementType() == eTypeFilter)
1206*3ac0a46fSAndroid Build Coastguard Worker nodes.push_back(pChild);
1207*3ac0a46fSAndroid Build Coastguard Worker }
1208*3ac0a46fSAndroid Build Coastguard Worker return nodes;
1209*3ac0a46fSAndroid Build Coastguard Worker }
1210*3ac0a46fSAndroid Build Coastguard Worker
GetNodeListWithFilter(Mask<XFA_NodeFilter> dwFilter)1211*3ac0a46fSAndroid Build Coastguard Worker std::vector<CXFA_Node*> CXFA_Node::GetNodeListWithFilter(
1212*3ac0a46fSAndroid Build Coastguard Worker Mask<XFA_NodeFilter> dwFilter) {
1213*3ac0a46fSAndroid Build Coastguard Worker if (!dwFilter)
1214*3ac0a46fSAndroid Build Coastguard Worker return std::vector<CXFA_Node*>();
1215*3ac0a46fSAndroid Build Coastguard Worker
1216*3ac0a46fSAndroid Build Coastguard Worker const bool bFilterChildren = !!(dwFilter & XFA_NodeFilter::kChildren);
1217*3ac0a46fSAndroid Build Coastguard Worker const bool bFilterProperties = !!(dwFilter & XFA_NodeFilter::kProperties);
1218*3ac0a46fSAndroid Build Coastguard Worker const bool bFilterOneOfProperties =
1219*3ac0a46fSAndroid Build Coastguard Worker !!(dwFilter & XFA_NodeFilter::kOneOfProperty);
1220*3ac0a46fSAndroid Build Coastguard Worker
1221*3ac0a46fSAndroid Build Coastguard Worker std::vector<CXFA_Node*> nodes;
1222*3ac0a46fSAndroid Build Coastguard Worker if (bFilterChildren && bFilterProperties && !bFilterOneOfProperties) {
1223*3ac0a46fSAndroid Build Coastguard Worker for (CXFA_Node* pChild = GetFirstChild(); pChild;
1224*3ac0a46fSAndroid Build Coastguard Worker pChild = pChild->GetNextSibling()) {
1225*3ac0a46fSAndroid Build Coastguard Worker nodes.push_back(pChild);
1226*3ac0a46fSAndroid Build Coastguard Worker }
1227*3ac0a46fSAndroid Build Coastguard Worker return nodes;
1228*3ac0a46fSAndroid Build Coastguard Worker }
1229*3ac0a46fSAndroid Build Coastguard Worker
1230*3ac0a46fSAndroid Build Coastguard Worker for (CXFA_Node* pChild = GetFirstChild(); pChild;
1231*3ac0a46fSAndroid Build Coastguard Worker pChild = pChild->GetNextSibling()) {
1232*3ac0a46fSAndroid Build Coastguard Worker if (HasProperty(pChild->GetElementType())) {
1233*3ac0a46fSAndroid Build Coastguard Worker if (bFilterProperties) {
1234*3ac0a46fSAndroid Build Coastguard Worker nodes.push_back(pChild);
1235*3ac0a46fSAndroid Build Coastguard Worker } else if (bFilterOneOfProperties &&
1236*3ac0a46fSAndroid Build Coastguard Worker HasPropertyFlag(pChild->GetElementType(),
1237*3ac0a46fSAndroid Build Coastguard Worker XFA_PropertyFlag::kOneOf)) {
1238*3ac0a46fSAndroid Build Coastguard Worker nodes.push_back(pChild);
1239*3ac0a46fSAndroid Build Coastguard Worker } else if (bFilterChildren &&
1240*3ac0a46fSAndroid Build Coastguard Worker (pChild->GetElementType() == XFA_Element::Variables ||
1241*3ac0a46fSAndroid Build Coastguard Worker pChild->GetElementType() == XFA_Element::PageSet)) {
1242*3ac0a46fSAndroid Build Coastguard Worker nodes.push_back(pChild);
1243*3ac0a46fSAndroid Build Coastguard Worker }
1244*3ac0a46fSAndroid Build Coastguard Worker } else if (bFilterChildren) {
1245*3ac0a46fSAndroid Build Coastguard Worker nodes.push_back(pChild);
1246*3ac0a46fSAndroid Build Coastguard Worker }
1247*3ac0a46fSAndroid Build Coastguard Worker }
1248*3ac0a46fSAndroid Build Coastguard Worker
1249*3ac0a46fSAndroid Build Coastguard Worker if (!bFilterOneOfProperties || !nodes.empty())
1250*3ac0a46fSAndroid Build Coastguard Worker return nodes;
1251*3ac0a46fSAndroid Build Coastguard Worker
1252*3ac0a46fSAndroid Build Coastguard Worker absl::optional<XFA_Element> property =
1253*3ac0a46fSAndroid Build Coastguard Worker GetFirstPropertyWithFlag(XFA_PropertyFlag::kDefaultOneOf);
1254*3ac0a46fSAndroid Build Coastguard Worker if (!property.has_value())
1255*3ac0a46fSAndroid Build Coastguard Worker return nodes;
1256*3ac0a46fSAndroid Build Coastguard Worker
1257*3ac0a46fSAndroid Build Coastguard Worker CXFA_Node* pNewNode =
1258*3ac0a46fSAndroid Build Coastguard Worker m_pDocument->CreateNode(GetPacketType(), property.value());
1259*3ac0a46fSAndroid Build Coastguard Worker if (pNewNode) {
1260*3ac0a46fSAndroid Build Coastguard Worker InsertChildAndNotify(pNewNode, nullptr);
1261*3ac0a46fSAndroid Build Coastguard Worker pNewNode->SetInitializedFlagAndNotify();
1262*3ac0a46fSAndroid Build Coastguard Worker nodes.push_back(pNewNode);
1263*3ac0a46fSAndroid Build Coastguard Worker }
1264*3ac0a46fSAndroid Build Coastguard Worker return nodes;
1265*3ac0a46fSAndroid Build Coastguard Worker }
1266*3ac0a46fSAndroid Build Coastguard Worker
CreateSamePacketNode(XFA_Element eType)1267*3ac0a46fSAndroid Build Coastguard Worker CXFA_Node* CXFA_Node::CreateSamePacketNode(XFA_Element eType) {
1268*3ac0a46fSAndroid Build Coastguard Worker CXFA_Node* pNode = m_pDocument->CreateNode(m_ePacket, eType);
1269*3ac0a46fSAndroid Build Coastguard Worker if (!pNode)
1270*3ac0a46fSAndroid Build Coastguard Worker return nullptr;
1271*3ac0a46fSAndroid Build Coastguard Worker
1272*3ac0a46fSAndroid Build Coastguard Worker pNode->SetInitializedFlagAndNotify();
1273*3ac0a46fSAndroid Build Coastguard Worker return pNode;
1274*3ac0a46fSAndroid Build Coastguard Worker }
1275*3ac0a46fSAndroid Build Coastguard Worker
CloneTemplateToForm(bool bRecursive)1276*3ac0a46fSAndroid Build Coastguard Worker CXFA_Node* CXFA_Node::CloneTemplateToForm(bool bRecursive) {
1277*3ac0a46fSAndroid Build Coastguard Worker DCHECK_EQ(m_ePacket, XFA_PacketType::Template);
1278*3ac0a46fSAndroid Build Coastguard Worker CXFA_Node* pClone =
1279*3ac0a46fSAndroid Build Coastguard Worker m_pDocument->CreateNode(XFA_PacketType::Form, m_elementType);
1280*3ac0a46fSAndroid Build Coastguard Worker if (!pClone)
1281*3ac0a46fSAndroid Build Coastguard Worker return nullptr;
1282*3ac0a46fSAndroid Build Coastguard Worker
1283*3ac0a46fSAndroid Build Coastguard Worker pClone->SetTemplateNode(this);
1284*3ac0a46fSAndroid Build Coastguard Worker pClone->UpdateNameHash();
1285*3ac0a46fSAndroid Build Coastguard Worker pClone->SetXMLMappingNode(GetXMLMappingNode());
1286*3ac0a46fSAndroid Build Coastguard Worker if (bRecursive) {
1287*3ac0a46fSAndroid Build Coastguard Worker for (CXFA_Node* pChild = GetFirstChild(); pChild;
1288*3ac0a46fSAndroid Build Coastguard Worker pChild = pChild->GetNextSibling()) {
1289*3ac0a46fSAndroid Build Coastguard Worker pClone->InsertChildAndNotify(pChild->CloneTemplateToForm(bRecursive),
1290*3ac0a46fSAndroid Build Coastguard Worker nullptr);
1291*3ac0a46fSAndroid Build Coastguard Worker }
1292*3ac0a46fSAndroid Build Coastguard Worker }
1293*3ac0a46fSAndroid Build Coastguard Worker pClone->SetInitializedFlagAndNotify();
1294*3ac0a46fSAndroid Build Coastguard Worker return pClone;
1295*3ac0a46fSAndroid Build Coastguard Worker }
1296*3ac0a46fSAndroid Build Coastguard Worker
GetTemplateNodeIfExists() const1297*3ac0a46fSAndroid Build Coastguard Worker CXFA_Node* CXFA_Node::GetTemplateNodeIfExists() const {
1298*3ac0a46fSAndroid Build Coastguard Worker return m_pAuxNode;
1299*3ac0a46fSAndroid Build Coastguard Worker }
1300*3ac0a46fSAndroid Build Coastguard Worker
SetTemplateNode(CXFA_Node * pTemplateNode)1301*3ac0a46fSAndroid Build Coastguard Worker void CXFA_Node::SetTemplateNode(CXFA_Node* pTemplateNode) {
1302*3ac0a46fSAndroid Build Coastguard Worker m_pAuxNode = pTemplateNode;
1303*3ac0a46fSAndroid Build Coastguard Worker }
1304*3ac0a46fSAndroid Build Coastguard Worker
GetBindData()1305*3ac0a46fSAndroid Build Coastguard Worker CXFA_Node* CXFA_Node::GetBindData() {
1306*3ac0a46fSAndroid Build Coastguard Worker DCHECK_EQ(GetPacketType(), XFA_PacketType::Form);
1307*3ac0a46fSAndroid Build Coastguard Worker return GetBindingNode();
1308*3ac0a46fSAndroid Build Coastguard Worker }
1309*3ac0a46fSAndroid Build Coastguard Worker
GetBindItemsCopy() const1310*3ac0a46fSAndroid Build Coastguard Worker std::vector<CXFA_Node*> CXFA_Node::GetBindItemsCopy() const {
1311*3ac0a46fSAndroid Build Coastguard Worker return std::vector<CXFA_Node*>(binding_nodes_.begin(), binding_nodes_.end());
1312*3ac0a46fSAndroid Build Coastguard Worker }
1313*3ac0a46fSAndroid Build Coastguard Worker
AddBindItem(CXFA_Node * pFormNode)1314*3ac0a46fSAndroid Build Coastguard Worker void CXFA_Node::AddBindItem(CXFA_Node* pFormNode) {
1315*3ac0a46fSAndroid Build Coastguard Worker DCHECK(pFormNode);
1316*3ac0a46fSAndroid Build Coastguard Worker
1317*3ac0a46fSAndroid Build Coastguard Worker if (BindsFormItems()) {
1318*3ac0a46fSAndroid Build Coastguard Worker if (!pdfium::Contains(binding_nodes_, pFormNode))
1319*3ac0a46fSAndroid Build Coastguard Worker binding_nodes_.emplace_back(pFormNode);
1320*3ac0a46fSAndroid Build Coastguard Worker return;
1321*3ac0a46fSAndroid Build Coastguard Worker }
1322*3ac0a46fSAndroid Build Coastguard Worker
1323*3ac0a46fSAndroid Build Coastguard Worker CXFA_Node* pOldFormItem = GetBindingNode();
1324*3ac0a46fSAndroid Build Coastguard Worker if (!pOldFormItem) {
1325*3ac0a46fSAndroid Build Coastguard Worker SetBindingNode(pFormNode);
1326*3ac0a46fSAndroid Build Coastguard Worker return;
1327*3ac0a46fSAndroid Build Coastguard Worker }
1328*3ac0a46fSAndroid Build Coastguard Worker if (pOldFormItem == pFormNode)
1329*3ac0a46fSAndroid Build Coastguard Worker return;
1330*3ac0a46fSAndroid Build Coastguard Worker
1331*3ac0a46fSAndroid Build Coastguard Worker binding_nodes_.clear();
1332*3ac0a46fSAndroid Build Coastguard Worker binding_nodes_.push_back(pOldFormItem);
1333*3ac0a46fSAndroid Build Coastguard Worker binding_nodes_.push_back(pFormNode);
1334*3ac0a46fSAndroid Build Coastguard Worker m_uNodeFlags |= XFA_NodeFlag::kBindFormItems;
1335*3ac0a46fSAndroid Build Coastguard Worker }
1336*3ac0a46fSAndroid Build Coastguard Worker
RemoveBindItem(CXFA_Node * pFormNode)1337*3ac0a46fSAndroid Build Coastguard Worker bool CXFA_Node::RemoveBindItem(CXFA_Node* pFormNode) {
1338*3ac0a46fSAndroid Build Coastguard Worker if (BindsFormItems()) {
1339*3ac0a46fSAndroid Build Coastguard Worker auto it =
1340*3ac0a46fSAndroid Build Coastguard Worker std::find(binding_nodes_.begin(), binding_nodes_.end(), pFormNode);
1341*3ac0a46fSAndroid Build Coastguard Worker if (it != binding_nodes_.end())
1342*3ac0a46fSAndroid Build Coastguard Worker binding_nodes_.erase(it);
1343*3ac0a46fSAndroid Build Coastguard Worker
1344*3ac0a46fSAndroid Build Coastguard Worker if (binding_nodes_.size() == 1) {
1345*3ac0a46fSAndroid Build Coastguard Worker m_uNodeFlags.Clear(XFA_NodeFlag::kBindFormItems);
1346*3ac0a46fSAndroid Build Coastguard Worker return true;
1347*3ac0a46fSAndroid Build Coastguard Worker }
1348*3ac0a46fSAndroid Build Coastguard Worker return !binding_nodes_.empty();
1349*3ac0a46fSAndroid Build Coastguard Worker }
1350*3ac0a46fSAndroid Build Coastguard Worker
1351*3ac0a46fSAndroid Build Coastguard Worker CXFA_Node* pOldFormItem = GetBindingNode();
1352*3ac0a46fSAndroid Build Coastguard Worker if (pOldFormItem != pFormNode)
1353*3ac0a46fSAndroid Build Coastguard Worker return !!pOldFormItem;
1354*3ac0a46fSAndroid Build Coastguard Worker
1355*3ac0a46fSAndroid Build Coastguard Worker SetBindingNode(nullptr);
1356*3ac0a46fSAndroid Build Coastguard Worker return false;
1357*3ac0a46fSAndroid Build Coastguard Worker }
1358*3ac0a46fSAndroid Build Coastguard Worker
HasBindItem() const1359*3ac0a46fSAndroid Build Coastguard Worker bool CXFA_Node::HasBindItem() const {
1360*3ac0a46fSAndroid Build Coastguard Worker return GetPacketType() == XFA_PacketType::Datasets && GetBindingNode();
1361*3ac0a46fSAndroid Build Coastguard Worker }
1362*3ac0a46fSAndroid Build Coastguard Worker
GetContainerNode()1363*3ac0a46fSAndroid Build Coastguard Worker CXFA_Node* CXFA_Node::GetContainerNode() {
1364*3ac0a46fSAndroid Build Coastguard Worker if (GetPacketType() != XFA_PacketType::Form)
1365*3ac0a46fSAndroid Build Coastguard Worker return nullptr;
1366*3ac0a46fSAndroid Build Coastguard Worker XFA_Element eType = GetElementType();
1367*3ac0a46fSAndroid Build Coastguard Worker if (eType == XFA_Element::ExclGroup)
1368*3ac0a46fSAndroid Build Coastguard Worker return nullptr;
1369*3ac0a46fSAndroid Build Coastguard Worker CXFA_Node* pParentNode = GetParent();
1370*3ac0a46fSAndroid Build Coastguard Worker if (pParentNode && pParentNode->GetElementType() == XFA_Element::ExclGroup)
1371*3ac0a46fSAndroid Build Coastguard Worker return nullptr;
1372*3ac0a46fSAndroid Build Coastguard Worker
1373*3ac0a46fSAndroid Build Coastguard Worker if (eType == XFA_Element::Field) {
1374*3ac0a46fSAndroid Build Coastguard Worker if (IsChoiceListMultiSelect())
1375*3ac0a46fSAndroid Build Coastguard Worker return nullptr;
1376*3ac0a46fSAndroid Build Coastguard Worker
1377*3ac0a46fSAndroid Build Coastguard Worker WideString wsPicture = GetPictureContent(XFA_ValuePicture::kDataBind);
1378*3ac0a46fSAndroid Build Coastguard Worker if (!wsPicture.IsEmpty())
1379*3ac0a46fSAndroid Build Coastguard Worker return this;
1380*3ac0a46fSAndroid Build Coastguard Worker
1381*3ac0a46fSAndroid Build Coastguard Worker CXFA_Node* pDataNode = GetBindData();
1382*3ac0a46fSAndroid Build Coastguard Worker if (!pDataNode)
1383*3ac0a46fSAndroid Build Coastguard Worker return nullptr;
1384*3ac0a46fSAndroid Build Coastguard Worker
1385*3ac0a46fSAndroid Build Coastguard Worker CXFA_Node* pFieldNode = nullptr;
1386*3ac0a46fSAndroid Build Coastguard Worker for (auto* pFormNode : pDataNode->GetBindItemsCopy()) {
1387*3ac0a46fSAndroid Build Coastguard Worker if (!pFormNode || pFormNode->HasRemovedChildren())
1388*3ac0a46fSAndroid Build Coastguard Worker continue;
1389*3ac0a46fSAndroid Build Coastguard Worker pFieldNode = pFormNode->IsWidgetReady() ? pFormNode : nullptr;
1390*3ac0a46fSAndroid Build Coastguard Worker if (pFieldNode)
1391*3ac0a46fSAndroid Build Coastguard Worker wsPicture = pFieldNode->GetPictureContent(XFA_ValuePicture::kDataBind);
1392*3ac0a46fSAndroid Build Coastguard Worker if (!wsPicture.IsEmpty())
1393*3ac0a46fSAndroid Build Coastguard Worker break;
1394*3ac0a46fSAndroid Build Coastguard Worker
1395*3ac0a46fSAndroid Build Coastguard Worker pFieldNode = nullptr;
1396*3ac0a46fSAndroid Build Coastguard Worker }
1397*3ac0a46fSAndroid Build Coastguard Worker return pFieldNode;
1398*3ac0a46fSAndroid Build Coastguard Worker }
1399*3ac0a46fSAndroid Build Coastguard Worker
1400*3ac0a46fSAndroid Build Coastguard Worker CXFA_Node* pGrandNode = pParentNode ? pParentNode->GetParent() : nullptr;
1401*3ac0a46fSAndroid Build Coastguard Worker CXFA_Node* pValueNode =
1402*3ac0a46fSAndroid Build Coastguard Worker (pParentNode && pParentNode->GetElementType() == XFA_Element::Value)
1403*3ac0a46fSAndroid Build Coastguard Worker ? pParentNode
1404*3ac0a46fSAndroid Build Coastguard Worker : nullptr;
1405*3ac0a46fSAndroid Build Coastguard Worker if (!pValueNode) {
1406*3ac0a46fSAndroid Build Coastguard Worker pValueNode =
1407*3ac0a46fSAndroid Build Coastguard Worker (pGrandNode && pGrandNode->GetElementType() == XFA_Element::Value)
1408*3ac0a46fSAndroid Build Coastguard Worker ? pGrandNode
1409*3ac0a46fSAndroid Build Coastguard Worker : nullptr;
1410*3ac0a46fSAndroid Build Coastguard Worker }
1411*3ac0a46fSAndroid Build Coastguard Worker CXFA_Node* pParentOfValueNode =
1412*3ac0a46fSAndroid Build Coastguard Worker pValueNode ? pValueNode->GetParent() : nullptr;
1413*3ac0a46fSAndroid Build Coastguard Worker return pParentOfValueNode ? pParentOfValueNode->GetContainerNode() : nullptr;
1414*3ac0a46fSAndroid Build Coastguard Worker }
1415*3ac0a46fSAndroid Build Coastguard Worker
GetLocale()1416*3ac0a46fSAndroid Build Coastguard Worker GCedLocaleIface* CXFA_Node::GetLocale() {
1417*3ac0a46fSAndroid Build Coastguard Worker absl::optional<WideString> localeName = GetLocaleName();
1418*3ac0a46fSAndroid Build Coastguard Worker if (!localeName.has_value())
1419*3ac0a46fSAndroid Build Coastguard Worker return nullptr;
1420*3ac0a46fSAndroid Build Coastguard Worker if (localeName.value().EqualsASCII("ambient"))
1421*3ac0a46fSAndroid Build Coastguard Worker return GetDocument()->GetLocaleMgr()->GetDefLocale();
1422*3ac0a46fSAndroid Build Coastguard Worker return GetDocument()->GetLocaleMgr()->GetLocaleByName(localeName.value());
1423*3ac0a46fSAndroid Build Coastguard Worker }
1424*3ac0a46fSAndroid Build Coastguard Worker
GetLocaleName()1425*3ac0a46fSAndroid Build Coastguard Worker absl::optional<WideString> CXFA_Node::GetLocaleName() {
1426*3ac0a46fSAndroid Build Coastguard Worker CXFA_Node* pForm = ToNode(GetDocument()->GetXFAObject(XFA_HASHCODE_Form));
1427*3ac0a46fSAndroid Build Coastguard Worker if (!pForm)
1428*3ac0a46fSAndroid Build Coastguard Worker return absl::nullopt;
1429*3ac0a46fSAndroid Build Coastguard Worker
1430*3ac0a46fSAndroid Build Coastguard Worker CXFA_Subform* pTopSubform =
1431*3ac0a46fSAndroid Build Coastguard Worker pForm->GetFirstChildByClass<CXFA_Subform>(XFA_Element::Subform);
1432*3ac0a46fSAndroid Build Coastguard Worker if (!pTopSubform)
1433*3ac0a46fSAndroid Build Coastguard Worker return absl::nullopt;
1434*3ac0a46fSAndroid Build Coastguard Worker
1435*3ac0a46fSAndroid Build Coastguard Worker absl::optional<WideString> localeName;
1436*3ac0a46fSAndroid Build Coastguard Worker CXFA_Node* pLocaleNode = this;
1437*3ac0a46fSAndroid Build Coastguard Worker do {
1438*3ac0a46fSAndroid Build Coastguard Worker localeName =
1439*3ac0a46fSAndroid Build Coastguard Worker pLocaleNode->JSObject()->TryCData(XFA_Attribute::Locale, false);
1440*3ac0a46fSAndroid Build Coastguard Worker if (localeName.has_value())
1441*3ac0a46fSAndroid Build Coastguard Worker return localeName;
1442*3ac0a46fSAndroid Build Coastguard Worker
1443*3ac0a46fSAndroid Build Coastguard Worker pLocaleNode = pLocaleNode->GetParent();
1444*3ac0a46fSAndroid Build Coastguard Worker } while (pLocaleNode && pLocaleNode != pTopSubform);
1445*3ac0a46fSAndroid Build Coastguard Worker
1446*3ac0a46fSAndroid Build Coastguard Worker CXFA_Node* pConfig = ToNode(GetDocument()->GetXFAObject(XFA_HASHCODE_Config));
1447*3ac0a46fSAndroid Build Coastguard Worker localeName = GetDocument()->GetLocaleMgr()->GetConfigLocaleName(pConfig);
1448*3ac0a46fSAndroid Build Coastguard Worker if (localeName.has_value())
1449*3ac0a46fSAndroid Build Coastguard Worker return localeName;
1450*3ac0a46fSAndroid Build Coastguard Worker
1451*3ac0a46fSAndroid Build Coastguard Worker if (pTopSubform) {
1452*3ac0a46fSAndroid Build Coastguard Worker localeName =
1453*3ac0a46fSAndroid Build Coastguard Worker pTopSubform->JSObject()->TryCData(XFA_Attribute::Locale, false);
1454*3ac0a46fSAndroid Build Coastguard Worker if (localeName.has_value())
1455*3ac0a46fSAndroid Build Coastguard Worker return localeName;
1456*3ac0a46fSAndroid Build Coastguard Worker }
1457*3ac0a46fSAndroid Build Coastguard Worker
1458*3ac0a46fSAndroid Build Coastguard Worker LocaleIface* pLocale = GetDocument()->GetLocaleMgr()->GetDefLocale();
1459*3ac0a46fSAndroid Build Coastguard Worker if (!pLocale)
1460*3ac0a46fSAndroid Build Coastguard Worker return absl::nullopt;
1461*3ac0a46fSAndroid Build Coastguard Worker
1462*3ac0a46fSAndroid Build Coastguard Worker return pLocale->GetName();
1463*3ac0a46fSAndroid Build Coastguard Worker }
1464*3ac0a46fSAndroid Build Coastguard Worker
GetIntact()1465*3ac0a46fSAndroid Build Coastguard Worker XFA_AttributeValue CXFA_Node::GetIntact() {
1466*3ac0a46fSAndroid Build Coastguard Worker CXFA_Keep* pKeep = GetFirstChildByClass<CXFA_Keep>(XFA_Element::Keep);
1467*3ac0a46fSAndroid Build Coastguard Worker auto layout = JSObject()->TryEnum(XFA_Attribute::Layout, true);
1468*3ac0a46fSAndroid Build Coastguard Worker XFA_AttributeValue eLayoutType =
1469*3ac0a46fSAndroid Build Coastguard Worker layout.value_or(XFA_AttributeValue::Position);
1470*3ac0a46fSAndroid Build Coastguard Worker if (pKeep) {
1471*3ac0a46fSAndroid Build Coastguard Worker absl::optional<XFA_AttributeValue> intact =
1472*3ac0a46fSAndroid Build Coastguard Worker GetIntactFromKeep(pKeep, eLayoutType);
1473*3ac0a46fSAndroid Build Coastguard Worker if (intact.has_value())
1474*3ac0a46fSAndroid Build Coastguard Worker return intact.value();
1475*3ac0a46fSAndroid Build Coastguard Worker }
1476*3ac0a46fSAndroid Build Coastguard Worker
1477*3ac0a46fSAndroid Build Coastguard Worker switch (GetElementType()) {
1478*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::Subform:
1479*3ac0a46fSAndroid Build Coastguard Worker switch (eLayoutType) {
1480*3ac0a46fSAndroid Build Coastguard Worker case XFA_AttributeValue::Position:
1481*3ac0a46fSAndroid Build Coastguard Worker case XFA_AttributeValue::Row:
1482*3ac0a46fSAndroid Build Coastguard Worker return XFA_AttributeValue::ContentArea;
1483*3ac0a46fSAndroid Build Coastguard Worker default:
1484*3ac0a46fSAndroid Build Coastguard Worker return XFA_AttributeValue::None;
1485*3ac0a46fSAndroid Build Coastguard Worker }
1486*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::Field: {
1487*3ac0a46fSAndroid Build Coastguard Worker CXFA_Node* parent = GetParent();
1488*3ac0a46fSAndroid Build Coastguard Worker if (!parent || parent->GetElementType() == XFA_Element::PageArea)
1489*3ac0a46fSAndroid Build Coastguard Worker return XFA_AttributeValue::ContentArea;
1490*3ac0a46fSAndroid Build Coastguard Worker if (parent->GetIntact() != XFA_AttributeValue::None)
1491*3ac0a46fSAndroid Build Coastguard Worker return XFA_AttributeValue::ContentArea;
1492*3ac0a46fSAndroid Build Coastguard Worker
1493*3ac0a46fSAndroid Build Coastguard Worker auto value = parent->JSObject()->TryEnum(XFA_Attribute::Layout, true);
1494*3ac0a46fSAndroid Build Coastguard Worker XFA_AttributeValue eParLayout =
1495*3ac0a46fSAndroid Build Coastguard Worker value.value_or(XFA_AttributeValue::Position);
1496*3ac0a46fSAndroid Build Coastguard Worker if (eParLayout == XFA_AttributeValue::Position ||
1497*3ac0a46fSAndroid Build Coastguard Worker eParLayout == XFA_AttributeValue::Row ||
1498*3ac0a46fSAndroid Build Coastguard Worker eParLayout == XFA_AttributeValue::Table) {
1499*3ac0a46fSAndroid Build Coastguard Worker return XFA_AttributeValue::None;
1500*3ac0a46fSAndroid Build Coastguard Worker }
1501*3ac0a46fSAndroid Build Coastguard Worker
1502*3ac0a46fSAndroid Build Coastguard Worker XFA_VERSION version = m_pDocument->GetCurVersionMode();
1503*3ac0a46fSAndroid Build Coastguard Worker if (eParLayout == XFA_AttributeValue::Tb && version < XFA_VERSION_208) {
1504*3ac0a46fSAndroid Build Coastguard Worker absl::optional<CXFA_Measurement> measureH =
1505*3ac0a46fSAndroid Build Coastguard Worker JSObject()->TryMeasure(XFA_Attribute::H, false);
1506*3ac0a46fSAndroid Build Coastguard Worker if (measureH.has_value())
1507*3ac0a46fSAndroid Build Coastguard Worker return XFA_AttributeValue::ContentArea;
1508*3ac0a46fSAndroid Build Coastguard Worker }
1509*3ac0a46fSAndroid Build Coastguard Worker return XFA_AttributeValue::None;
1510*3ac0a46fSAndroid Build Coastguard Worker }
1511*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::Draw:
1512*3ac0a46fSAndroid Build Coastguard Worker return XFA_AttributeValue::ContentArea;
1513*3ac0a46fSAndroid Build Coastguard Worker default:
1514*3ac0a46fSAndroid Build Coastguard Worker return XFA_AttributeValue::None;
1515*3ac0a46fSAndroid Build Coastguard Worker }
1516*3ac0a46fSAndroid Build Coastguard Worker }
1517*3ac0a46fSAndroid Build Coastguard Worker
GetNameExpression()1518*3ac0a46fSAndroid Build Coastguard Worker WideString CXFA_Node::GetNameExpression() {
1519*3ac0a46fSAndroid Build Coastguard Worker WideString wsName = GetNameExpressionSinglePath(this);
1520*3ac0a46fSAndroid Build Coastguard Worker CXFA_Node* parent = GetParent();
1521*3ac0a46fSAndroid Build Coastguard Worker while (parent) {
1522*3ac0a46fSAndroid Build Coastguard Worker WideString wsParent = GetNameExpressionSinglePath(parent);
1523*3ac0a46fSAndroid Build Coastguard Worker wsParent += L".";
1524*3ac0a46fSAndroid Build Coastguard Worker wsParent += wsName;
1525*3ac0a46fSAndroid Build Coastguard Worker wsName = std::move(wsParent);
1526*3ac0a46fSAndroid Build Coastguard Worker parent = parent->GetParent();
1527*3ac0a46fSAndroid Build Coastguard Worker }
1528*3ac0a46fSAndroid Build Coastguard Worker return wsName;
1529*3ac0a46fSAndroid Build Coastguard Worker }
1530*3ac0a46fSAndroid Build Coastguard Worker
GetDataDescriptionNode()1531*3ac0a46fSAndroid Build Coastguard Worker CXFA_Node* CXFA_Node::GetDataDescriptionNode() {
1532*3ac0a46fSAndroid Build Coastguard Worker if (m_ePacket == XFA_PacketType::Datasets)
1533*3ac0a46fSAndroid Build Coastguard Worker return m_pAuxNode;
1534*3ac0a46fSAndroid Build Coastguard Worker return nullptr;
1535*3ac0a46fSAndroid Build Coastguard Worker }
1536*3ac0a46fSAndroid Build Coastguard Worker
SetDataDescriptionNode(CXFA_Node * pDataDescriptionNode)1537*3ac0a46fSAndroid Build Coastguard Worker void CXFA_Node::SetDataDescriptionNode(CXFA_Node* pDataDescriptionNode) {
1538*3ac0a46fSAndroid Build Coastguard Worker DCHECK_EQ(m_ePacket, XFA_PacketType::Datasets);
1539*3ac0a46fSAndroid Build Coastguard Worker m_pAuxNode = pDataDescriptionNode;
1540*3ac0a46fSAndroid Build Coastguard Worker }
1541*3ac0a46fSAndroid Build Coastguard Worker
GetModelNode()1542*3ac0a46fSAndroid Build Coastguard Worker CXFA_Node* CXFA_Node::GetModelNode() {
1543*3ac0a46fSAndroid Build Coastguard Worker switch (GetPacketType()) {
1544*3ac0a46fSAndroid Build Coastguard Worker case XFA_PacketType::Xdp:
1545*3ac0a46fSAndroid Build Coastguard Worker return m_pDocument->GetRoot();
1546*3ac0a46fSAndroid Build Coastguard Worker case XFA_PacketType::Config:
1547*3ac0a46fSAndroid Build Coastguard Worker return ToNode(m_pDocument->GetXFAObject(XFA_HASHCODE_Config));
1548*3ac0a46fSAndroid Build Coastguard Worker case XFA_PacketType::Template:
1549*3ac0a46fSAndroid Build Coastguard Worker return ToNode(m_pDocument->GetXFAObject(XFA_HASHCODE_Template));
1550*3ac0a46fSAndroid Build Coastguard Worker case XFA_PacketType::Form:
1551*3ac0a46fSAndroid Build Coastguard Worker return ToNode(m_pDocument->GetXFAObject(XFA_HASHCODE_Form));
1552*3ac0a46fSAndroid Build Coastguard Worker case XFA_PacketType::Datasets:
1553*3ac0a46fSAndroid Build Coastguard Worker return ToNode(m_pDocument->GetXFAObject(XFA_HASHCODE_Datasets));
1554*3ac0a46fSAndroid Build Coastguard Worker case XFA_PacketType::LocaleSet:
1555*3ac0a46fSAndroid Build Coastguard Worker return ToNode(m_pDocument->GetXFAObject(XFA_HASHCODE_LocaleSet));
1556*3ac0a46fSAndroid Build Coastguard Worker case XFA_PacketType::ConnectionSet:
1557*3ac0a46fSAndroid Build Coastguard Worker return ToNode(m_pDocument->GetXFAObject(XFA_HASHCODE_ConnectionSet));
1558*3ac0a46fSAndroid Build Coastguard Worker case XFA_PacketType::SourceSet:
1559*3ac0a46fSAndroid Build Coastguard Worker return ToNode(m_pDocument->GetXFAObject(XFA_HASHCODE_SourceSet));
1560*3ac0a46fSAndroid Build Coastguard Worker case XFA_PacketType::Xdc:
1561*3ac0a46fSAndroid Build Coastguard Worker return ToNode(m_pDocument->GetXFAObject(XFA_HASHCODE_Xdc));
1562*3ac0a46fSAndroid Build Coastguard Worker default:
1563*3ac0a46fSAndroid Build Coastguard Worker return this;
1564*3ac0a46fSAndroid Build Coastguard Worker }
1565*3ac0a46fSAndroid Build Coastguard Worker }
1566*3ac0a46fSAndroid Build Coastguard Worker
CountChildren(XFA_Element eType,bool bOnlyChild)1567*3ac0a46fSAndroid Build Coastguard Worker size_t CXFA_Node::CountChildren(XFA_Element eType, bool bOnlyChild) {
1568*3ac0a46fSAndroid Build Coastguard Worker size_t count = 0;
1569*3ac0a46fSAndroid Build Coastguard Worker for (CXFA_Node* pNode = GetFirstChild(); pNode;
1570*3ac0a46fSAndroid Build Coastguard Worker pNode = pNode->GetNextSibling()) {
1571*3ac0a46fSAndroid Build Coastguard Worker if (pNode->GetElementType() != eType && eType != XFA_Element::Unknown)
1572*3ac0a46fSAndroid Build Coastguard Worker continue;
1573*3ac0a46fSAndroid Build Coastguard Worker if (bOnlyChild && HasProperty(pNode->GetElementType()))
1574*3ac0a46fSAndroid Build Coastguard Worker continue;
1575*3ac0a46fSAndroid Build Coastguard Worker ++count;
1576*3ac0a46fSAndroid Build Coastguard Worker }
1577*3ac0a46fSAndroid Build Coastguard Worker return count;
1578*3ac0a46fSAndroid Build Coastguard Worker }
1579*3ac0a46fSAndroid Build Coastguard Worker
GetChildInternal(size_t index,XFA_Element eType,bool bOnlyChild) const1580*3ac0a46fSAndroid Build Coastguard Worker CXFA_Node* CXFA_Node::GetChildInternal(size_t index,
1581*3ac0a46fSAndroid Build Coastguard Worker XFA_Element eType,
1582*3ac0a46fSAndroid Build Coastguard Worker bool bOnlyChild) const {
1583*3ac0a46fSAndroid Build Coastguard Worker size_t count = 0;
1584*3ac0a46fSAndroid Build Coastguard Worker for (CXFA_Node* pNode = GetFirstChild(); pNode;
1585*3ac0a46fSAndroid Build Coastguard Worker pNode = pNode->GetNextSibling()) {
1586*3ac0a46fSAndroid Build Coastguard Worker if (pNode->GetElementType() != eType && eType != XFA_Element::Unknown)
1587*3ac0a46fSAndroid Build Coastguard Worker continue;
1588*3ac0a46fSAndroid Build Coastguard Worker if (bOnlyChild && HasProperty(pNode->GetElementType()))
1589*3ac0a46fSAndroid Build Coastguard Worker continue;
1590*3ac0a46fSAndroid Build Coastguard Worker if (count == index)
1591*3ac0a46fSAndroid Build Coastguard Worker return pNode;
1592*3ac0a46fSAndroid Build Coastguard Worker
1593*3ac0a46fSAndroid Build Coastguard Worker ++count;
1594*3ac0a46fSAndroid Build Coastguard Worker }
1595*3ac0a46fSAndroid Build Coastguard Worker return nullptr;
1596*3ac0a46fSAndroid Build Coastguard Worker }
1597*3ac0a46fSAndroid Build Coastguard Worker
IsAncestorOf(const CXFA_Node * that) const1598*3ac0a46fSAndroid Build Coastguard Worker bool CXFA_Node::IsAncestorOf(const CXFA_Node* that) const {
1599*3ac0a46fSAndroid Build Coastguard Worker while (that) {
1600*3ac0a46fSAndroid Build Coastguard Worker if (this == that)
1601*3ac0a46fSAndroid Build Coastguard Worker return true;
1602*3ac0a46fSAndroid Build Coastguard Worker that = that->GetParent();
1603*3ac0a46fSAndroid Build Coastguard Worker }
1604*3ac0a46fSAndroid Build Coastguard Worker return false;
1605*3ac0a46fSAndroid Build Coastguard Worker }
1606*3ac0a46fSAndroid Build Coastguard Worker
InsertChildAndNotify(int32_t index,CXFA_Node * pNode)1607*3ac0a46fSAndroid Build Coastguard Worker void CXFA_Node::InsertChildAndNotify(int32_t index, CXFA_Node* pNode) {
1608*3ac0a46fSAndroid Build Coastguard Worker InsertChildAndNotify(pNode, GetNthChild(index));
1609*3ac0a46fSAndroid Build Coastguard Worker }
1610*3ac0a46fSAndroid Build Coastguard Worker
InsertChildAndNotify(CXFA_Node * pNode,CXFA_Node * pBeforeNode)1611*3ac0a46fSAndroid Build Coastguard Worker void CXFA_Node::InsertChildAndNotify(CXFA_Node* pNode, CXFA_Node* pBeforeNode) {
1612*3ac0a46fSAndroid Build Coastguard Worker CHECK(!pNode->GetParent());
1613*3ac0a46fSAndroid Build Coastguard Worker CHECK(!pBeforeNode || pBeforeNode->GetParent() == this);
1614*3ac0a46fSAndroid Build Coastguard Worker pNode->ClearFlag(XFA_NodeFlag::kHasRemovedChildren);
1615*3ac0a46fSAndroid Build Coastguard Worker InsertBefore(pNode, pBeforeNode);
1616*3ac0a46fSAndroid Build Coastguard Worker
1617*3ac0a46fSAndroid Build Coastguard Worker CXFA_FFNotify* pNotify = m_pDocument->GetNotify();
1618*3ac0a46fSAndroid Build Coastguard Worker if (pNotify)
1619*3ac0a46fSAndroid Build Coastguard Worker pNotify->OnChildAdded(this);
1620*3ac0a46fSAndroid Build Coastguard Worker
1621*3ac0a46fSAndroid Build Coastguard Worker if (!IsNeedSavingXMLNode() || !pNode->xml_node_)
1622*3ac0a46fSAndroid Build Coastguard Worker return;
1623*3ac0a46fSAndroid Build Coastguard Worker
1624*3ac0a46fSAndroid Build Coastguard Worker DCHECK(!pNode->xml_node_->GetParent());
1625*3ac0a46fSAndroid Build Coastguard Worker xml_node_->InsertBefore(pNode->xml_node_,
1626*3ac0a46fSAndroid Build Coastguard Worker pBeforeNode ? pBeforeNode->xml_node_ : nullptr);
1627*3ac0a46fSAndroid Build Coastguard Worker }
1628*3ac0a46fSAndroid Build Coastguard Worker
RemoveChildAndNotify(CXFA_Node * pNode,bool bNotify)1629*3ac0a46fSAndroid Build Coastguard Worker void CXFA_Node::RemoveChildAndNotify(CXFA_Node* pNode, bool bNotify) {
1630*3ac0a46fSAndroid Build Coastguard Worker CHECK(pNode);
1631*3ac0a46fSAndroid Build Coastguard Worker if (pNode->GetParent() != this)
1632*3ac0a46fSAndroid Build Coastguard Worker return;
1633*3ac0a46fSAndroid Build Coastguard Worker
1634*3ac0a46fSAndroid Build Coastguard Worker pNode->SetFlag(XFA_NodeFlag::kHasRemovedChildren);
1635*3ac0a46fSAndroid Build Coastguard Worker GCedTreeNodeMixin<CXFA_Node>::RemoveChild(pNode);
1636*3ac0a46fSAndroid Build Coastguard Worker OnRemoved(bNotify);
1637*3ac0a46fSAndroid Build Coastguard Worker
1638*3ac0a46fSAndroid Build Coastguard Worker if (!IsNeedSavingXMLNode() || !pNode->xml_node_)
1639*3ac0a46fSAndroid Build Coastguard Worker return;
1640*3ac0a46fSAndroid Build Coastguard Worker
1641*3ac0a46fSAndroid Build Coastguard Worker if (!pNode->IsAttributeInXML()) {
1642*3ac0a46fSAndroid Build Coastguard Worker xml_node_->RemoveChild(pNode->xml_node_);
1643*3ac0a46fSAndroid Build Coastguard Worker return;
1644*3ac0a46fSAndroid Build Coastguard Worker }
1645*3ac0a46fSAndroid Build Coastguard Worker
1646*3ac0a46fSAndroid Build Coastguard Worker DCHECK_EQ(pNode->xml_node_, xml_node_);
1647*3ac0a46fSAndroid Build Coastguard Worker CFX_XMLElement* pXMLElement = ToXMLElement(pNode->xml_node_);
1648*3ac0a46fSAndroid Build Coastguard Worker if (pXMLElement) {
1649*3ac0a46fSAndroid Build Coastguard Worker WideString wsAttributeName =
1650*3ac0a46fSAndroid Build Coastguard Worker pNode->JSObject()->GetCData(XFA_Attribute::QualifiedName);
1651*3ac0a46fSAndroid Build Coastguard Worker pXMLElement->RemoveAttribute(wsAttributeName);
1652*3ac0a46fSAndroid Build Coastguard Worker }
1653*3ac0a46fSAndroid Build Coastguard Worker
1654*3ac0a46fSAndroid Build Coastguard Worker WideString wsName = pNode->JSObject()
1655*3ac0a46fSAndroid Build Coastguard Worker ->TryAttribute(XFA_Attribute::Name, false)
1656*3ac0a46fSAndroid Build Coastguard Worker .value_or(WideString());
1657*3ac0a46fSAndroid Build Coastguard Worker
1658*3ac0a46fSAndroid Build Coastguard Worker auto* pNewXMLElement = GetXMLDocument()->CreateNode<CFX_XMLElement>(wsName);
1659*3ac0a46fSAndroid Build Coastguard Worker WideString wsValue = JSObject()->GetCData(XFA_Attribute::Value);
1660*3ac0a46fSAndroid Build Coastguard Worker if (!wsValue.IsEmpty()) {
1661*3ac0a46fSAndroid Build Coastguard Worker auto* text = GetXMLDocument()->CreateNode<CFX_XMLText>(wsValue);
1662*3ac0a46fSAndroid Build Coastguard Worker pNewXMLElement->AppendLastChild(text);
1663*3ac0a46fSAndroid Build Coastguard Worker }
1664*3ac0a46fSAndroid Build Coastguard Worker pNode->xml_node_ = pNewXMLElement;
1665*3ac0a46fSAndroid Build Coastguard Worker pNode->JSObject()->SetEnum(XFA_Attribute::Contains,
1666*3ac0a46fSAndroid Build Coastguard Worker XFA_AttributeValue::Unknown, false);
1667*3ac0a46fSAndroid Build Coastguard Worker }
1668*3ac0a46fSAndroid Build Coastguard Worker
GetFirstChildByName(WideStringView wsName) const1669*3ac0a46fSAndroid Build Coastguard Worker CXFA_Node* CXFA_Node::GetFirstChildByName(WideStringView wsName) const {
1670*3ac0a46fSAndroid Build Coastguard Worker return GetFirstChildByName(FX_HashCode_GetW(wsName));
1671*3ac0a46fSAndroid Build Coastguard Worker }
1672*3ac0a46fSAndroid Build Coastguard Worker
GetFirstChildByName(uint32_t dwNameHash) const1673*3ac0a46fSAndroid Build Coastguard Worker CXFA_Node* CXFA_Node::GetFirstChildByName(uint32_t dwNameHash) const {
1674*3ac0a46fSAndroid Build Coastguard Worker for (CXFA_Node* pNode = GetFirstChild(); pNode;
1675*3ac0a46fSAndroid Build Coastguard Worker pNode = pNode->GetNextSibling()) {
1676*3ac0a46fSAndroid Build Coastguard Worker if (pNode->GetNameHash() == dwNameHash)
1677*3ac0a46fSAndroid Build Coastguard Worker return pNode;
1678*3ac0a46fSAndroid Build Coastguard Worker }
1679*3ac0a46fSAndroid Build Coastguard Worker return nullptr;
1680*3ac0a46fSAndroid Build Coastguard Worker }
1681*3ac0a46fSAndroid Build Coastguard Worker
GetFirstChildByClassInternal(XFA_Element eType) const1682*3ac0a46fSAndroid Build Coastguard Worker CXFA_Node* CXFA_Node::GetFirstChildByClassInternal(XFA_Element eType) const {
1683*3ac0a46fSAndroid Build Coastguard Worker for (CXFA_Node* pNode = GetFirstChild(); pNode;
1684*3ac0a46fSAndroid Build Coastguard Worker pNode = pNode->GetNextSibling()) {
1685*3ac0a46fSAndroid Build Coastguard Worker if (pNode->GetElementType() == eType)
1686*3ac0a46fSAndroid Build Coastguard Worker return pNode;
1687*3ac0a46fSAndroid Build Coastguard Worker }
1688*3ac0a46fSAndroid Build Coastguard Worker return nullptr;
1689*3ac0a46fSAndroid Build Coastguard Worker }
1690*3ac0a46fSAndroid Build Coastguard Worker
GetNextSameNameSibling(uint32_t dwNameHash) const1691*3ac0a46fSAndroid Build Coastguard Worker CXFA_Node* CXFA_Node::GetNextSameNameSibling(uint32_t dwNameHash) const {
1692*3ac0a46fSAndroid Build Coastguard Worker for (CXFA_Node* pNode = GetNextSibling(); pNode;
1693*3ac0a46fSAndroid Build Coastguard Worker pNode = pNode->GetNextSibling()) {
1694*3ac0a46fSAndroid Build Coastguard Worker if (pNode->GetNameHash() == dwNameHash)
1695*3ac0a46fSAndroid Build Coastguard Worker return pNode;
1696*3ac0a46fSAndroid Build Coastguard Worker }
1697*3ac0a46fSAndroid Build Coastguard Worker return nullptr;
1698*3ac0a46fSAndroid Build Coastguard Worker }
1699*3ac0a46fSAndroid Build Coastguard Worker
GetNextSameNameSiblingInternal(WideStringView wsNodeName) const1700*3ac0a46fSAndroid Build Coastguard Worker CXFA_Node* CXFA_Node::GetNextSameNameSiblingInternal(
1701*3ac0a46fSAndroid Build Coastguard Worker WideStringView wsNodeName) const {
1702*3ac0a46fSAndroid Build Coastguard Worker return GetNextSameNameSibling(FX_HashCode_GetW(wsNodeName));
1703*3ac0a46fSAndroid Build Coastguard Worker }
1704*3ac0a46fSAndroid Build Coastguard Worker
GetNextSameClassSiblingInternal(XFA_Element eType) const1705*3ac0a46fSAndroid Build Coastguard Worker CXFA_Node* CXFA_Node::GetNextSameClassSiblingInternal(XFA_Element eType) const {
1706*3ac0a46fSAndroid Build Coastguard Worker for (CXFA_Node* pNode = GetNextSibling(); pNode;
1707*3ac0a46fSAndroid Build Coastguard Worker pNode = pNode->GetNextSibling()) {
1708*3ac0a46fSAndroid Build Coastguard Worker if (pNode->GetElementType() == eType)
1709*3ac0a46fSAndroid Build Coastguard Worker return pNode;
1710*3ac0a46fSAndroid Build Coastguard Worker }
1711*3ac0a46fSAndroid Build Coastguard Worker return nullptr;
1712*3ac0a46fSAndroid Build Coastguard Worker }
1713*3ac0a46fSAndroid Build Coastguard Worker
GetOneChildNamed(WideStringView wsName)1714*3ac0a46fSAndroid Build Coastguard Worker CXFA_Node* CXFA_Node::GetOneChildNamed(WideStringView wsName) {
1715*3ac0a46fSAndroid Build Coastguard Worker return FindFirstSiblingNamed(this, FX_HashCode_GetW(wsName));
1716*3ac0a46fSAndroid Build Coastguard Worker }
1717*3ac0a46fSAndroid Build Coastguard Worker
GetOneChildOfClass(WideStringView wsClass)1718*3ac0a46fSAndroid Build Coastguard Worker CXFA_Node* CXFA_Node::GetOneChildOfClass(WideStringView wsClass) {
1719*3ac0a46fSAndroid Build Coastguard Worker XFA_Element element = XFA_GetElementByName(wsClass);
1720*3ac0a46fSAndroid Build Coastguard Worker if (element == XFA_Element::Unknown)
1721*3ac0a46fSAndroid Build Coastguard Worker return nullptr;
1722*3ac0a46fSAndroid Build Coastguard Worker
1723*3ac0a46fSAndroid Build Coastguard Worker return FindFirstSiblingOfClass(this, element);
1724*3ac0a46fSAndroid Build Coastguard Worker }
1725*3ac0a46fSAndroid Build Coastguard Worker
GetSiblings(bool bIsClassName)1726*3ac0a46fSAndroid Build Coastguard Worker std::vector<CXFA_Node*> CXFA_Node::GetSiblings(bool bIsClassName) {
1727*3ac0a46fSAndroid Build Coastguard Worker std::vector<CXFA_Node*> siblings;
1728*3ac0a46fSAndroid Build Coastguard Worker CXFA_Node* parent = GetParent();
1729*3ac0a46fSAndroid Build Coastguard Worker if (!parent)
1730*3ac0a46fSAndroid Build Coastguard Worker return siblings;
1731*3ac0a46fSAndroid Build Coastguard Worker if (!parent->HasProperty(GetElementType())) {
1732*3ac0a46fSAndroid Build Coastguard Worker parent = GetTransparentParent();
1733*3ac0a46fSAndroid Build Coastguard Worker if (!parent)
1734*3ac0a46fSAndroid Build Coastguard Worker return siblings;
1735*3ac0a46fSAndroid Build Coastguard Worker }
1736*3ac0a46fSAndroid Build Coastguard Worker
1737*3ac0a46fSAndroid Build Coastguard Worker uint32_t dwNameHash = bIsClassName ? GetClassHashCode() : GetNameHash();
1738*3ac0a46fSAndroid Build Coastguard Worker TraversePropertiesOrSiblings(parent, dwNameHash, &siblings, bIsClassName);
1739*3ac0a46fSAndroid Build Coastguard Worker return siblings;
1740*3ac0a46fSAndroid Build Coastguard Worker }
1741*3ac0a46fSAndroid Build Coastguard Worker
GetIndex(bool bIsProperty,bool bIsClassIndex)1742*3ac0a46fSAndroid Build Coastguard Worker size_t CXFA_Node::GetIndex(bool bIsProperty, bool bIsClassIndex) {
1743*3ac0a46fSAndroid Build Coastguard Worker CXFA_Node* parent = GetParent();
1744*3ac0a46fSAndroid Build Coastguard Worker if (!parent)
1745*3ac0a46fSAndroid Build Coastguard Worker return 0;
1746*3ac0a46fSAndroid Build Coastguard Worker
1747*3ac0a46fSAndroid Build Coastguard Worker if (!bIsProperty) {
1748*3ac0a46fSAndroid Build Coastguard Worker parent = GetTransparentParent();
1749*3ac0a46fSAndroid Build Coastguard Worker if (!parent)
1750*3ac0a46fSAndroid Build Coastguard Worker return 0;
1751*3ac0a46fSAndroid Build Coastguard Worker }
1752*3ac0a46fSAndroid Build Coastguard Worker uint32_t dwHashName = bIsClassIndex ? GetClassHashCode() : GetNameHash();
1753*3ac0a46fSAndroid Build Coastguard Worker std::vector<CXFA_Node*> siblings;
1754*3ac0a46fSAndroid Build Coastguard Worker TraversePropertiesOrSiblings(parent, dwHashName, &siblings, bIsClassIndex);
1755*3ac0a46fSAndroid Build Coastguard Worker for (size_t i = 0; i < siblings.size(); ++i) {
1756*3ac0a46fSAndroid Build Coastguard Worker if (siblings[i] == this)
1757*3ac0a46fSAndroid Build Coastguard Worker return i;
1758*3ac0a46fSAndroid Build Coastguard Worker }
1759*3ac0a46fSAndroid Build Coastguard Worker return 0;
1760*3ac0a46fSAndroid Build Coastguard Worker }
1761*3ac0a46fSAndroid Build Coastguard Worker
GetIndexByName()1762*3ac0a46fSAndroid Build Coastguard Worker size_t CXFA_Node::GetIndexByName() {
1763*3ac0a46fSAndroid Build Coastguard Worker return GetIndex(IsProperty(), /*bIsClassIndex=*/false);
1764*3ac0a46fSAndroid Build Coastguard Worker }
1765*3ac0a46fSAndroid Build Coastguard Worker
GetIndexByClassName()1766*3ac0a46fSAndroid Build Coastguard Worker size_t CXFA_Node::GetIndexByClassName() {
1767*3ac0a46fSAndroid Build Coastguard Worker return GetIndex(IsProperty(), /*bIsClassIndex=*/true);
1768*3ac0a46fSAndroid Build Coastguard Worker }
1769*3ac0a46fSAndroid Build Coastguard Worker
GetInstanceMgrOfSubform()1770*3ac0a46fSAndroid Build Coastguard Worker CXFA_Node* CXFA_Node::GetInstanceMgrOfSubform() {
1771*3ac0a46fSAndroid Build Coastguard Worker CXFA_Node* pInstanceMgr = nullptr;
1772*3ac0a46fSAndroid Build Coastguard Worker if (m_ePacket == XFA_PacketType::Form) {
1773*3ac0a46fSAndroid Build Coastguard Worker CXFA_Node* pParentNode = GetParent();
1774*3ac0a46fSAndroid Build Coastguard Worker if (!pParentNode || pParentNode->GetElementType() == XFA_Element::Area)
1775*3ac0a46fSAndroid Build Coastguard Worker return pInstanceMgr;
1776*3ac0a46fSAndroid Build Coastguard Worker
1777*3ac0a46fSAndroid Build Coastguard Worker for (CXFA_Node* pNode = GetPrevSibling(); pNode;
1778*3ac0a46fSAndroid Build Coastguard Worker pNode = pNode->GetPrevSibling()) {
1779*3ac0a46fSAndroid Build Coastguard Worker XFA_Element eType = pNode->GetElementType();
1780*3ac0a46fSAndroid Build Coastguard Worker if ((eType == XFA_Element::Subform || eType == XFA_Element::SubformSet) &&
1781*3ac0a46fSAndroid Build Coastguard Worker pNode->m_dwNameHash != m_dwNameHash) {
1782*3ac0a46fSAndroid Build Coastguard Worker break;
1783*3ac0a46fSAndroid Build Coastguard Worker }
1784*3ac0a46fSAndroid Build Coastguard Worker if (eType == XFA_Element::InstanceManager) {
1785*3ac0a46fSAndroid Build Coastguard Worker WideString wsName = JSObject()->GetCData(XFA_Attribute::Name);
1786*3ac0a46fSAndroid Build Coastguard Worker WideString wsInstName =
1787*3ac0a46fSAndroid Build Coastguard Worker pNode->JSObject()->GetCData(XFA_Attribute::Name);
1788*3ac0a46fSAndroid Build Coastguard Worker if (wsInstName.GetLength() > 0 && wsInstName[0] == '_' &&
1789*3ac0a46fSAndroid Build Coastguard Worker wsInstName.Last(wsInstName.GetLength() - 1) == wsName) {
1790*3ac0a46fSAndroid Build Coastguard Worker pInstanceMgr = pNode;
1791*3ac0a46fSAndroid Build Coastguard Worker }
1792*3ac0a46fSAndroid Build Coastguard Worker break;
1793*3ac0a46fSAndroid Build Coastguard Worker }
1794*3ac0a46fSAndroid Build Coastguard Worker }
1795*3ac0a46fSAndroid Build Coastguard Worker }
1796*3ac0a46fSAndroid Build Coastguard Worker return pInstanceMgr;
1797*3ac0a46fSAndroid Build Coastguard Worker }
1798*3ac0a46fSAndroid Build Coastguard Worker
GetOccurIfExists()1799*3ac0a46fSAndroid Build Coastguard Worker CXFA_Occur* CXFA_Node::GetOccurIfExists() {
1800*3ac0a46fSAndroid Build Coastguard Worker return GetFirstChildByClass<CXFA_Occur>(XFA_Element::Occur);
1801*3ac0a46fSAndroid Build Coastguard Worker }
1802*3ac0a46fSAndroid Build Coastguard Worker
HasFlag(XFA_NodeFlag dwFlag) const1803*3ac0a46fSAndroid Build Coastguard Worker bool CXFA_Node::HasFlag(XFA_NodeFlag dwFlag) const {
1804*3ac0a46fSAndroid Build Coastguard Worker if (m_uNodeFlags & dwFlag)
1805*3ac0a46fSAndroid Build Coastguard Worker return true;
1806*3ac0a46fSAndroid Build Coastguard Worker if (dwFlag == XFA_NodeFlag::kHasRemovedChildren)
1807*3ac0a46fSAndroid Build Coastguard Worker return GetParent() && GetParent()->HasFlag(dwFlag);
1808*3ac0a46fSAndroid Build Coastguard Worker return false;
1809*3ac0a46fSAndroid Build Coastguard Worker }
1810*3ac0a46fSAndroid Build Coastguard Worker
SetInitializedFlagAndNotify()1811*3ac0a46fSAndroid Build Coastguard Worker void CXFA_Node::SetInitializedFlagAndNotify() {
1812*3ac0a46fSAndroid Build Coastguard Worker if (!IsInitialized()) {
1813*3ac0a46fSAndroid Build Coastguard Worker CXFA_FFNotify* pNotify = m_pDocument->GetNotify();
1814*3ac0a46fSAndroid Build Coastguard Worker if (pNotify)
1815*3ac0a46fSAndroid Build Coastguard Worker pNotify->OnNodeReady(this);
1816*3ac0a46fSAndroid Build Coastguard Worker }
1817*3ac0a46fSAndroid Build Coastguard Worker m_uNodeFlags |= XFA_NodeFlag::kInitialized;
1818*3ac0a46fSAndroid Build Coastguard Worker }
1819*3ac0a46fSAndroid Build Coastguard Worker
SetFlag(XFA_NodeFlag dwFlag)1820*3ac0a46fSAndroid Build Coastguard Worker void CXFA_Node::SetFlag(XFA_NodeFlag dwFlag) {
1821*3ac0a46fSAndroid Build Coastguard Worker m_uNodeFlags |= dwFlag;
1822*3ac0a46fSAndroid Build Coastguard Worker }
1823*3ac0a46fSAndroid Build Coastguard Worker
ClearFlag(XFA_NodeFlag dwFlag)1824*3ac0a46fSAndroid Build Coastguard Worker void CXFA_Node::ClearFlag(XFA_NodeFlag dwFlag) {
1825*3ac0a46fSAndroid Build Coastguard Worker m_uNodeFlags.Clear(dwFlag);
1826*3ac0a46fSAndroid Build Coastguard Worker }
1827*3ac0a46fSAndroid Build Coastguard Worker
IsAttributeInXML()1828*3ac0a46fSAndroid Build Coastguard Worker bool CXFA_Node::IsAttributeInXML() {
1829*3ac0a46fSAndroid Build Coastguard Worker return JSObject()->GetEnum(XFA_Attribute::Contains) ==
1830*3ac0a46fSAndroid Build Coastguard Worker XFA_AttributeValue::MetaData;
1831*3ac0a46fSAndroid Build Coastguard Worker }
1832*3ac0a46fSAndroid Build Coastguard Worker
OnRemoved(bool bNotify) const1833*3ac0a46fSAndroid Build Coastguard Worker void CXFA_Node::OnRemoved(bool bNotify) const {
1834*3ac0a46fSAndroid Build Coastguard Worker if (!bNotify)
1835*3ac0a46fSAndroid Build Coastguard Worker return;
1836*3ac0a46fSAndroid Build Coastguard Worker
1837*3ac0a46fSAndroid Build Coastguard Worker CXFA_FFNotify* pNotify = m_pDocument->GetNotify();
1838*3ac0a46fSAndroid Build Coastguard Worker if (pNotify)
1839*3ac0a46fSAndroid Build Coastguard Worker pNotify->OnChildRemoved();
1840*3ac0a46fSAndroid Build Coastguard Worker }
1841*3ac0a46fSAndroid Build Coastguard Worker
UpdateNameHash()1842*3ac0a46fSAndroid Build Coastguard Worker void CXFA_Node::UpdateNameHash() {
1843*3ac0a46fSAndroid Build Coastguard Worker WideString wsName = JSObject()->GetCData(XFA_Attribute::Name);
1844*3ac0a46fSAndroid Build Coastguard Worker m_dwNameHash = FX_HashCode_GetW(wsName.AsStringView());
1845*3ac0a46fSAndroid Build Coastguard Worker }
1846*3ac0a46fSAndroid Build Coastguard Worker
CreateXMLMappingNode()1847*3ac0a46fSAndroid Build Coastguard Worker CFX_XMLNode* CXFA_Node::CreateXMLMappingNode() {
1848*3ac0a46fSAndroid Build Coastguard Worker if (!xml_node_) {
1849*3ac0a46fSAndroid Build Coastguard Worker xml_node_ = GetXMLDocument()->CreateNode<CFX_XMLElement>(
1850*3ac0a46fSAndroid Build Coastguard Worker JSObject()->GetCData(XFA_Attribute::Name));
1851*3ac0a46fSAndroid Build Coastguard Worker }
1852*3ac0a46fSAndroid Build Coastguard Worker return xml_node_;
1853*3ac0a46fSAndroid Build Coastguard Worker }
1854*3ac0a46fSAndroid Build Coastguard Worker
IsNeedSavingXMLNode() const1855*3ac0a46fSAndroid Build Coastguard Worker bool CXFA_Node::IsNeedSavingXMLNode() const {
1856*3ac0a46fSAndroid Build Coastguard Worker return xml_node_ && (GetPacketType() == XFA_PacketType::Datasets ||
1857*3ac0a46fSAndroid Build Coastguard Worker GetElementType() == XFA_Element::Xfa);
1858*3ac0a46fSAndroid Build Coastguard Worker }
1859*3ac0a46fSAndroid Build Coastguard Worker
GetItemIfExists(int32_t iIndex)1860*3ac0a46fSAndroid Build Coastguard Worker CXFA_Node* CXFA_Node::GetItemIfExists(int32_t iIndex) {
1861*3ac0a46fSAndroid Build Coastguard Worker int32_t iCount = 0;
1862*3ac0a46fSAndroid Build Coastguard Worker uint32_t dwNameHash = 0;
1863*3ac0a46fSAndroid Build Coastguard Worker for (CXFA_Node* pNode = GetNextSibling(); pNode;
1864*3ac0a46fSAndroid Build Coastguard Worker pNode = pNode->GetNextSibling()) {
1865*3ac0a46fSAndroid Build Coastguard Worker XFA_Element eCurType = pNode->GetElementType();
1866*3ac0a46fSAndroid Build Coastguard Worker if (eCurType == XFA_Element::InstanceManager)
1867*3ac0a46fSAndroid Build Coastguard Worker break;
1868*3ac0a46fSAndroid Build Coastguard Worker if ((eCurType != XFA_Element::Subform) &&
1869*3ac0a46fSAndroid Build Coastguard Worker (eCurType != XFA_Element::SubformSet)) {
1870*3ac0a46fSAndroid Build Coastguard Worker continue;
1871*3ac0a46fSAndroid Build Coastguard Worker }
1872*3ac0a46fSAndroid Build Coastguard Worker if (iCount == 0) {
1873*3ac0a46fSAndroid Build Coastguard Worker WideString wsName = pNode->JSObject()->GetCData(XFA_Attribute::Name);
1874*3ac0a46fSAndroid Build Coastguard Worker WideString wsInstName = JSObject()->GetCData(XFA_Attribute::Name);
1875*3ac0a46fSAndroid Build Coastguard Worker if (wsInstName.GetLength() < 1 || wsInstName[0] != '_' ||
1876*3ac0a46fSAndroid Build Coastguard Worker wsInstName.Last(wsInstName.GetLength() - 1) != wsName) {
1877*3ac0a46fSAndroid Build Coastguard Worker return nullptr;
1878*3ac0a46fSAndroid Build Coastguard Worker }
1879*3ac0a46fSAndroid Build Coastguard Worker dwNameHash = pNode->GetNameHash();
1880*3ac0a46fSAndroid Build Coastguard Worker }
1881*3ac0a46fSAndroid Build Coastguard Worker if (dwNameHash != pNode->GetNameHash())
1882*3ac0a46fSAndroid Build Coastguard Worker break;
1883*3ac0a46fSAndroid Build Coastguard Worker
1884*3ac0a46fSAndroid Build Coastguard Worker iCount++;
1885*3ac0a46fSAndroid Build Coastguard Worker if (iCount > iIndex)
1886*3ac0a46fSAndroid Build Coastguard Worker return pNode;
1887*3ac0a46fSAndroid Build Coastguard Worker }
1888*3ac0a46fSAndroid Build Coastguard Worker return nullptr;
1889*3ac0a46fSAndroid Build Coastguard Worker }
1890*3ac0a46fSAndroid Build Coastguard Worker
GetCount()1891*3ac0a46fSAndroid Build Coastguard Worker int32_t CXFA_Node::GetCount() {
1892*3ac0a46fSAndroid Build Coastguard Worker int32_t iCount = 0;
1893*3ac0a46fSAndroid Build Coastguard Worker uint32_t dwNameHash = 0;
1894*3ac0a46fSAndroid Build Coastguard Worker for (CXFA_Node* pNode = GetNextSibling(); pNode;
1895*3ac0a46fSAndroid Build Coastguard Worker pNode = pNode->GetNextSibling()) {
1896*3ac0a46fSAndroid Build Coastguard Worker XFA_Element eCurType = pNode->GetElementType();
1897*3ac0a46fSAndroid Build Coastguard Worker if (eCurType == XFA_Element::InstanceManager)
1898*3ac0a46fSAndroid Build Coastguard Worker break;
1899*3ac0a46fSAndroid Build Coastguard Worker if ((eCurType != XFA_Element::Subform) &&
1900*3ac0a46fSAndroid Build Coastguard Worker (eCurType != XFA_Element::SubformSet)) {
1901*3ac0a46fSAndroid Build Coastguard Worker continue;
1902*3ac0a46fSAndroid Build Coastguard Worker }
1903*3ac0a46fSAndroid Build Coastguard Worker if (iCount == 0) {
1904*3ac0a46fSAndroid Build Coastguard Worker WideString wsName = pNode->JSObject()->GetCData(XFA_Attribute::Name);
1905*3ac0a46fSAndroid Build Coastguard Worker WideString wsInstName = JSObject()->GetCData(XFA_Attribute::Name);
1906*3ac0a46fSAndroid Build Coastguard Worker if (wsInstName.GetLength() < 1 || wsInstName[0] != '_' ||
1907*3ac0a46fSAndroid Build Coastguard Worker wsInstName.Last(wsInstName.GetLength() - 1) != wsName) {
1908*3ac0a46fSAndroid Build Coastguard Worker return iCount;
1909*3ac0a46fSAndroid Build Coastguard Worker }
1910*3ac0a46fSAndroid Build Coastguard Worker dwNameHash = pNode->GetNameHash();
1911*3ac0a46fSAndroid Build Coastguard Worker }
1912*3ac0a46fSAndroid Build Coastguard Worker if (dwNameHash != pNode->GetNameHash())
1913*3ac0a46fSAndroid Build Coastguard Worker break;
1914*3ac0a46fSAndroid Build Coastguard Worker
1915*3ac0a46fSAndroid Build Coastguard Worker iCount++;
1916*3ac0a46fSAndroid Build Coastguard Worker }
1917*3ac0a46fSAndroid Build Coastguard Worker return iCount;
1918*3ac0a46fSAndroid Build Coastguard Worker }
1919*3ac0a46fSAndroid Build Coastguard Worker
InsertItem(CXFA_Node * pNewInstance,int32_t iPos,int32_t iCount,bool bMoveDataBindingNodes)1920*3ac0a46fSAndroid Build Coastguard Worker void CXFA_Node::InsertItem(CXFA_Node* pNewInstance,
1921*3ac0a46fSAndroid Build Coastguard Worker int32_t iPos,
1922*3ac0a46fSAndroid Build Coastguard Worker int32_t iCount,
1923*3ac0a46fSAndroid Build Coastguard Worker bool bMoveDataBindingNodes) {
1924*3ac0a46fSAndroid Build Coastguard Worker if (iCount < 0)
1925*3ac0a46fSAndroid Build Coastguard Worker iCount = GetCount();
1926*3ac0a46fSAndroid Build Coastguard Worker if (iPos < 0)
1927*3ac0a46fSAndroid Build Coastguard Worker iPos = iCount;
1928*3ac0a46fSAndroid Build Coastguard Worker if (iPos == iCount) {
1929*3ac0a46fSAndroid Build Coastguard Worker CXFA_Node* item = GetItemIfExists(iCount - 1);
1930*3ac0a46fSAndroid Build Coastguard Worker if (!item)
1931*3ac0a46fSAndroid Build Coastguard Worker return;
1932*3ac0a46fSAndroid Build Coastguard Worker
1933*3ac0a46fSAndroid Build Coastguard Worker CXFA_Node* pNextSibling =
1934*3ac0a46fSAndroid Build Coastguard Worker iCount > 0 ? item->GetNextSibling() : GetNextSibling();
1935*3ac0a46fSAndroid Build Coastguard Worker GetParent()->InsertChildAndNotify(pNewInstance, pNextSibling);
1936*3ac0a46fSAndroid Build Coastguard Worker if (bMoveDataBindingNodes) {
1937*3ac0a46fSAndroid Build Coastguard Worker NodeSet sNew;
1938*3ac0a46fSAndroid Build Coastguard Worker CXFA_NodeIteratorTemplate<CXFA_Node,
1939*3ac0a46fSAndroid Build Coastguard Worker CXFA_TraverseStrategy_XFAContainerNode>
1940*3ac0a46fSAndroid Build Coastguard Worker sIteratorNew(pNewInstance);
1941*3ac0a46fSAndroid Build Coastguard Worker for (CXFA_Node* pNode = sIteratorNew.GetCurrent(); pNode;
1942*3ac0a46fSAndroid Build Coastguard Worker pNode = sIteratorNew.MoveToNext()) {
1943*3ac0a46fSAndroid Build Coastguard Worker CXFA_Node* pDataNode = pNode->GetBindData();
1944*3ac0a46fSAndroid Build Coastguard Worker if (pDataNode)
1945*3ac0a46fSAndroid Build Coastguard Worker sNew.insert(pDataNode);
1946*3ac0a46fSAndroid Build Coastguard Worker }
1947*3ac0a46fSAndroid Build Coastguard Worker NodeSet sAfter;
1948*3ac0a46fSAndroid Build Coastguard Worker CXFA_NodeIteratorTemplate<CXFA_Node,
1949*3ac0a46fSAndroid Build Coastguard Worker CXFA_TraverseStrategy_XFAContainerNode>
1950*3ac0a46fSAndroid Build Coastguard Worker sIteratorAfter(pNextSibling);
1951*3ac0a46fSAndroid Build Coastguard Worker for (CXFA_Node* pNode = sIteratorAfter.GetCurrent(); pNode;
1952*3ac0a46fSAndroid Build Coastguard Worker pNode = sIteratorAfter.MoveToNext()) {
1953*3ac0a46fSAndroid Build Coastguard Worker CXFA_Node* pDataNode = pNode->GetBindData();
1954*3ac0a46fSAndroid Build Coastguard Worker if (pDataNode)
1955*3ac0a46fSAndroid Build Coastguard Worker sAfter.insert(pDataNode);
1956*3ac0a46fSAndroid Build Coastguard Worker }
1957*3ac0a46fSAndroid Build Coastguard Worker ReorderDataNodes(sNew, sAfter, false);
1958*3ac0a46fSAndroid Build Coastguard Worker }
1959*3ac0a46fSAndroid Build Coastguard Worker } else {
1960*3ac0a46fSAndroid Build Coastguard Worker CXFA_Node* pBeforeInstance = GetItemIfExists(iPos);
1961*3ac0a46fSAndroid Build Coastguard Worker if (!pBeforeInstance) {
1962*3ac0a46fSAndroid Build Coastguard Worker // TODO(dsinclair): What should happen here?
1963*3ac0a46fSAndroid Build Coastguard Worker return;
1964*3ac0a46fSAndroid Build Coastguard Worker }
1965*3ac0a46fSAndroid Build Coastguard Worker
1966*3ac0a46fSAndroid Build Coastguard Worker GetParent()->InsertChildAndNotify(pNewInstance, pBeforeInstance);
1967*3ac0a46fSAndroid Build Coastguard Worker if (bMoveDataBindingNodes) {
1968*3ac0a46fSAndroid Build Coastguard Worker NodeSet sNew;
1969*3ac0a46fSAndroid Build Coastguard Worker CXFA_NodeIteratorTemplate<CXFA_Node,
1970*3ac0a46fSAndroid Build Coastguard Worker CXFA_TraverseStrategy_XFAContainerNode>
1971*3ac0a46fSAndroid Build Coastguard Worker sIteratorNew(pNewInstance);
1972*3ac0a46fSAndroid Build Coastguard Worker for (CXFA_Node* pNode = sIteratorNew.GetCurrent(); pNode;
1973*3ac0a46fSAndroid Build Coastguard Worker pNode = sIteratorNew.MoveToNext()) {
1974*3ac0a46fSAndroid Build Coastguard Worker CXFA_Node* pDataNode = pNode->GetBindData();
1975*3ac0a46fSAndroid Build Coastguard Worker if (pDataNode)
1976*3ac0a46fSAndroid Build Coastguard Worker sNew.insert(pDataNode);
1977*3ac0a46fSAndroid Build Coastguard Worker }
1978*3ac0a46fSAndroid Build Coastguard Worker NodeSet sBefore;
1979*3ac0a46fSAndroid Build Coastguard Worker CXFA_NodeIteratorTemplate<CXFA_Node,
1980*3ac0a46fSAndroid Build Coastguard Worker CXFA_TraverseStrategy_XFAContainerNode>
1981*3ac0a46fSAndroid Build Coastguard Worker sIteratorBefore(pBeforeInstance);
1982*3ac0a46fSAndroid Build Coastguard Worker for (CXFA_Node* pNode = sIteratorBefore.GetCurrent(); pNode;
1983*3ac0a46fSAndroid Build Coastguard Worker pNode = sIteratorBefore.MoveToNext()) {
1984*3ac0a46fSAndroid Build Coastguard Worker CXFA_Node* pDataNode = pNode->GetBindData();
1985*3ac0a46fSAndroid Build Coastguard Worker if (pDataNode)
1986*3ac0a46fSAndroid Build Coastguard Worker sBefore.insert(pDataNode);
1987*3ac0a46fSAndroid Build Coastguard Worker }
1988*3ac0a46fSAndroid Build Coastguard Worker ReorderDataNodes(sNew, sBefore, true);
1989*3ac0a46fSAndroid Build Coastguard Worker }
1990*3ac0a46fSAndroid Build Coastguard Worker }
1991*3ac0a46fSAndroid Build Coastguard Worker }
1992*3ac0a46fSAndroid Build Coastguard Worker
RemoveItem(CXFA_Node * pRemoveInstance,bool bRemoveDataBinding)1993*3ac0a46fSAndroid Build Coastguard Worker void CXFA_Node::RemoveItem(CXFA_Node* pRemoveInstance,
1994*3ac0a46fSAndroid Build Coastguard Worker bool bRemoveDataBinding) {
1995*3ac0a46fSAndroid Build Coastguard Worker GetParent()->RemoveChildAndNotify(pRemoveInstance, true);
1996*3ac0a46fSAndroid Build Coastguard Worker if (!bRemoveDataBinding)
1997*3ac0a46fSAndroid Build Coastguard Worker return;
1998*3ac0a46fSAndroid Build Coastguard Worker
1999*3ac0a46fSAndroid Build Coastguard Worker CXFA_NodeIteratorTemplate<CXFA_Node, CXFA_TraverseStrategy_XFAContainerNode>
2000*3ac0a46fSAndroid Build Coastguard Worker sIterator(pRemoveInstance);
2001*3ac0a46fSAndroid Build Coastguard Worker for (CXFA_Node* pFormNode = sIterator.GetCurrent(); pFormNode;
2002*3ac0a46fSAndroid Build Coastguard Worker pFormNode = sIterator.MoveToNext()) {
2003*3ac0a46fSAndroid Build Coastguard Worker CXFA_Node* pDataNode = pFormNode->GetBindData();
2004*3ac0a46fSAndroid Build Coastguard Worker if (!pDataNode)
2005*3ac0a46fSAndroid Build Coastguard Worker continue;
2006*3ac0a46fSAndroid Build Coastguard Worker
2007*3ac0a46fSAndroid Build Coastguard Worker if (!pDataNode->RemoveBindItem(pFormNode)) {
2008*3ac0a46fSAndroid Build Coastguard Worker if (CXFA_Node* pDataParent = pDataNode->GetParent()) {
2009*3ac0a46fSAndroid Build Coastguard Worker pDataParent->RemoveChildAndNotify(pDataNode, true);
2010*3ac0a46fSAndroid Build Coastguard Worker }
2011*3ac0a46fSAndroid Build Coastguard Worker }
2012*3ac0a46fSAndroid Build Coastguard Worker pFormNode->SetBindingNode(nullptr);
2013*3ac0a46fSAndroid Build Coastguard Worker }
2014*3ac0a46fSAndroid Build Coastguard Worker }
2015*3ac0a46fSAndroid Build Coastguard Worker
CreateInstanceIfPossible(bool bDataMerge)2016*3ac0a46fSAndroid Build Coastguard Worker CXFA_Node* CXFA_Node::CreateInstanceIfPossible(bool bDataMerge) {
2017*3ac0a46fSAndroid Build Coastguard Worker CXFA_Document* pDocument = GetDocument();
2018*3ac0a46fSAndroid Build Coastguard Worker CXFA_Node* pTemplateNode = GetTemplateNodeIfExists();
2019*3ac0a46fSAndroid Build Coastguard Worker if (!pTemplateNode)
2020*3ac0a46fSAndroid Build Coastguard Worker return nullptr;
2021*3ac0a46fSAndroid Build Coastguard Worker
2022*3ac0a46fSAndroid Build Coastguard Worker CXFA_Node* pFormParent = GetParent();
2023*3ac0a46fSAndroid Build Coastguard Worker CXFA_Node* pDataScope = nullptr;
2024*3ac0a46fSAndroid Build Coastguard Worker for (CXFA_Node* pRootBoundNode = pFormParent;
2025*3ac0a46fSAndroid Build Coastguard Worker pRootBoundNode && pRootBoundNode->IsContainerNode();
2026*3ac0a46fSAndroid Build Coastguard Worker pRootBoundNode = pRootBoundNode->GetParent()) {
2027*3ac0a46fSAndroid Build Coastguard Worker pDataScope = pRootBoundNode->GetBindData();
2028*3ac0a46fSAndroid Build Coastguard Worker if (pDataScope)
2029*3ac0a46fSAndroid Build Coastguard Worker break;
2030*3ac0a46fSAndroid Build Coastguard Worker }
2031*3ac0a46fSAndroid Build Coastguard Worker if (!pDataScope) {
2032*3ac0a46fSAndroid Build Coastguard Worker pDataScope = ToNode(pDocument->GetXFAObject(XFA_HASHCODE_Record));
2033*3ac0a46fSAndroid Build Coastguard Worker DCHECK(pDataScope);
2034*3ac0a46fSAndroid Build Coastguard Worker }
2035*3ac0a46fSAndroid Build Coastguard Worker
2036*3ac0a46fSAndroid Build Coastguard Worker CXFA_Node* pInstance = pDocument->DataMerge_CopyContainer(
2037*3ac0a46fSAndroid Build Coastguard Worker pTemplateNode, pFormParent, pDataScope, true, bDataMerge, true);
2038*3ac0a46fSAndroid Build Coastguard Worker if (pInstance) {
2039*3ac0a46fSAndroid Build Coastguard Worker pDocument->DataMerge_UpdateBindingRelations(pInstance);
2040*3ac0a46fSAndroid Build Coastguard Worker pFormParent->RemoveChildAndNotify(pInstance, true);
2041*3ac0a46fSAndroid Build Coastguard Worker }
2042*3ac0a46fSAndroid Build Coastguard Worker return pInstance;
2043*3ac0a46fSAndroid Build Coastguard Worker }
2044*3ac0a46fSAndroid Build Coastguard Worker
GetDefaultBoolean(XFA_Attribute attr) const2045*3ac0a46fSAndroid Build Coastguard Worker absl::optional<bool> CXFA_Node::GetDefaultBoolean(XFA_Attribute attr) const {
2046*3ac0a46fSAndroid Build Coastguard Worker absl::optional<void*> value =
2047*3ac0a46fSAndroid Build Coastguard Worker GetDefaultValue(attr, XFA_AttributeType::Boolean);
2048*3ac0a46fSAndroid Build Coastguard Worker if (!value.has_value())
2049*3ac0a46fSAndroid Build Coastguard Worker return absl::nullopt;
2050*3ac0a46fSAndroid Build Coastguard Worker return !!value.value();
2051*3ac0a46fSAndroid Build Coastguard Worker }
2052*3ac0a46fSAndroid Build Coastguard Worker
GetDefaultInteger(XFA_Attribute attr) const2053*3ac0a46fSAndroid Build Coastguard Worker absl::optional<int32_t> CXFA_Node::GetDefaultInteger(XFA_Attribute attr) const {
2054*3ac0a46fSAndroid Build Coastguard Worker absl::optional<void*> value =
2055*3ac0a46fSAndroid Build Coastguard Worker GetDefaultValue(attr, XFA_AttributeType::Integer);
2056*3ac0a46fSAndroid Build Coastguard Worker if (!value.has_value())
2057*3ac0a46fSAndroid Build Coastguard Worker return absl::nullopt;
2058*3ac0a46fSAndroid Build Coastguard Worker return static_cast<int32_t>(reinterpret_cast<uintptr_t>(value.value()));
2059*3ac0a46fSAndroid Build Coastguard Worker }
2060*3ac0a46fSAndroid Build Coastguard Worker
GetDefaultMeasurement(XFA_Attribute attr) const2061*3ac0a46fSAndroid Build Coastguard Worker absl::optional<CXFA_Measurement> CXFA_Node::GetDefaultMeasurement(
2062*3ac0a46fSAndroid Build Coastguard Worker XFA_Attribute attr) const {
2063*3ac0a46fSAndroid Build Coastguard Worker absl::optional<void*> value =
2064*3ac0a46fSAndroid Build Coastguard Worker GetDefaultValue(attr, XFA_AttributeType::Measure);
2065*3ac0a46fSAndroid Build Coastguard Worker if (!value.has_value())
2066*3ac0a46fSAndroid Build Coastguard Worker return absl::nullopt;
2067*3ac0a46fSAndroid Build Coastguard Worker
2068*3ac0a46fSAndroid Build Coastguard Worker WideString str = WideString(static_cast<const wchar_t*>(value.value()));
2069*3ac0a46fSAndroid Build Coastguard Worker return CXFA_Measurement(str.AsStringView());
2070*3ac0a46fSAndroid Build Coastguard Worker }
2071*3ac0a46fSAndroid Build Coastguard Worker
GetDefaultCData(XFA_Attribute attr) const2072*3ac0a46fSAndroid Build Coastguard Worker absl::optional<WideString> CXFA_Node::GetDefaultCData(
2073*3ac0a46fSAndroid Build Coastguard Worker XFA_Attribute attr) const {
2074*3ac0a46fSAndroid Build Coastguard Worker absl::optional<void*> value = GetDefaultValue(attr, XFA_AttributeType::CData);
2075*3ac0a46fSAndroid Build Coastguard Worker if (!value.has_value())
2076*3ac0a46fSAndroid Build Coastguard Worker return absl::nullopt;
2077*3ac0a46fSAndroid Build Coastguard Worker
2078*3ac0a46fSAndroid Build Coastguard Worker return WideString(static_cast<const wchar_t*>(value.value()));
2079*3ac0a46fSAndroid Build Coastguard Worker }
2080*3ac0a46fSAndroid Build Coastguard Worker
GetDefaultEnum(XFA_Attribute attr) const2081*3ac0a46fSAndroid Build Coastguard Worker absl::optional<XFA_AttributeValue> CXFA_Node::GetDefaultEnum(
2082*3ac0a46fSAndroid Build Coastguard Worker XFA_Attribute attr) const {
2083*3ac0a46fSAndroid Build Coastguard Worker absl::optional<void*> value = GetDefaultValue(attr, XFA_AttributeType::Enum);
2084*3ac0a46fSAndroid Build Coastguard Worker if (!value.has_value())
2085*3ac0a46fSAndroid Build Coastguard Worker return absl::nullopt;
2086*3ac0a46fSAndroid Build Coastguard Worker return static_cast<XFA_AttributeValue>(
2087*3ac0a46fSAndroid Build Coastguard Worker reinterpret_cast<uintptr_t>(value.value()));
2088*3ac0a46fSAndroid Build Coastguard Worker }
2089*3ac0a46fSAndroid Build Coastguard Worker
GetDefaultValue(XFA_Attribute attr,XFA_AttributeType eType) const2090*3ac0a46fSAndroid Build Coastguard Worker absl::optional<void*> CXFA_Node::GetDefaultValue(
2091*3ac0a46fSAndroid Build Coastguard Worker XFA_Attribute attr,
2092*3ac0a46fSAndroid Build Coastguard Worker XFA_AttributeType eType) const {
2093*3ac0a46fSAndroid Build Coastguard Worker const AttributeData* data = GetAttributeData(attr);
2094*3ac0a46fSAndroid Build Coastguard Worker if (!data || data->type != eType)
2095*3ac0a46fSAndroid Build Coastguard Worker return absl::nullopt;
2096*3ac0a46fSAndroid Build Coastguard Worker return data->default_value;
2097*3ac0a46fSAndroid Build Coastguard Worker }
2098*3ac0a46fSAndroid Build Coastguard Worker
SendAttributeChangeMessage(XFA_Attribute eAttribute,bool bScriptModify)2099*3ac0a46fSAndroid Build Coastguard Worker void CXFA_Node::SendAttributeChangeMessage(XFA_Attribute eAttribute,
2100*3ac0a46fSAndroid Build Coastguard Worker bool bScriptModify) {
2101*3ac0a46fSAndroid Build Coastguard Worker CXFA_FFNotify* pNotify = GetDocument()->GetNotify();
2102*3ac0a46fSAndroid Build Coastguard Worker if (!pNotify)
2103*3ac0a46fSAndroid Build Coastguard Worker return;
2104*3ac0a46fSAndroid Build Coastguard Worker
2105*3ac0a46fSAndroid Build Coastguard Worker if (GetPacketType() != XFA_PacketType::Form) {
2106*3ac0a46fSAndroid Build Coastguard Worker pNotify->OnValueChanged(this, eAttribute, this, this);
2107*3ac0a46fSAndroid Build Coastguard Worker return;
2108*3ac0a46fSAndroid Build Coastguard Worker }
2109*3ac0a46fSAndroid Build Coastguard Worker
2110*3ac0a46fSAndroid Build Coastguard Worker bool bNeedFindContainer = false;
2111*3ac0a46fSAndroid Build Coastguard Worker switch (GetElementType()) {
2112*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::Caption:
2113*3ac0a46fSAndroid Build Coastguard Worker bNeedFindContainer = true;
2114*3ac0a46fSAndroid Build Coastguard Worker pNotify->OnValueChanged(this, eAttribute, this, GetParent());
2115*3ac0a46fSAndroid Build Coastguard Worker break;
2116*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::Font:
2117*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::Para: {
2118*3ac0a46fSAndroid Build Coastguard Worker bNeedFindContainer = true;
2119*3ac0a46fSAndroid Build Coastguard Worker CXFA_Node* pParentNode = GetParent();
2120*3ac0a46fSAndroid Build Coastguard Worker if (pParentNode->GetElementType() == XFA_Element::Caption) {
2121*3ac0a46fSAndroid Build Coastguard Worker pNotify->OnValueChanged(this, eAttribute, pParentNode,
2122*3ac0a46fSAndroid Build Coastguard Worker pParentNode->GetParent());
2123*3ac0a46fSAndroid Build Coastguard Worker } else {
2124*3ac0a46fSAndroid Build Coastguard Worker pNotify->OnValueChanged(this, eAttribute, this, pParentNode);
2125*3ac0a46fSAndroid Build Coastguard Worker }
2126*3ac0a46fSAndroid Build Coastguard Worker break;
2127*3ac0a46fSAndroid Build Coastguard Worker }
2128*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::Margin: {
2129*3ac0a46fSAndroid Build Coastguard Worker bNeedFindContainer = true;
2130*3ac0a46fSAndroid Build Coastguard Worker CXFA_Node* pParentNode = GetParent();
2131*3ac0a46fSAndroid Build Coastguard Worker XFA_Element eParentType = pParentNode->GetElementType();
2132*3ac0a46fSAndroid Build Coastguard Worker if (pParentNode->IsContainerNode()) {
2133*3ac0a46fSAndroid Build Coastguard Worker pNotify->OnValueChanged(this, eAttribute, this, pParentNode);
2134*3ac0a46fSAndroid Build Coastguard Worker } else if (eParentType == XFA_Element::Caption) {
2135*3ac0a46fSAndroid Build Coastguard Worker pNotify->OnValueChanged(this, eAttribute, pParentNode,
2136*3ac0a46fSAndroid Build Coastguard Worker pParentNode->GetParent());
2137*3ac0a46fSAndroid Build Coastguard Worker } else {
2138*3ac0a46fSAndroid Build Coastguard Worker CXFA_Node* pNode = pParentNode->GetParent();
2139*3ac0a46fSAndroid Build Coastguard Worker if (pNode && pNode->GetElementType() == XFA_Element::Ui)
2140*3ac0a46fSAndroid Build Coastguard Worker pNotify->OnValueChanged(this, eAttribute, pNode, pNode->GetParent());
2141*3ac0a46fSAndroid Build Coastguard Worker }
2142*3ac0a46fSAndroid Build Coastguard Worker break;
2143*3ac0a46fSAndroid Build Coastguard Worker }
2144*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::Comb: {
2145*3ac0a46fSAndroid Build Coastguard Worker CXFA_Node* pEditNode = GetParent();
2146*3ac0a46fSAndroid Build Coastguard Worker XFA_Element eUIType = pEditNode->GetElementType();
2147*3ac0a46fSAndroid Build Coastguard Worker if (pEditNode && (eUIType == XFA_Element::DateTimeEdit ||
2148*3ac0a46fSAndroid Build Coastguard Worker eUIType == XFA_Element::NumericEdit ||
2149*3ac0a46fSAndroid Build Coastguard Worker eUIType == XFA_Element::TextEdit)) {
2150*3ac0a46fSAndroid Build Coastguard Worker CXFA_Node* pUINode = pEditNode->GetParent();
2151*3ac0a46fSAndroid Build Coastguard Worker if (pUINode) {
2152*3ac0a46fSAndroid Build Coastguard Worker pNotify->OnValueChanged(this, eAttribute, pUINode,
2153*3ac0a46fSAndroid Build Coastguard Worker pUINode->GetParent());
2154*3ac0a46fSAndroid Build Coastguard Worker }
2155*3ac0a46fSAndroid Build Coastguard Worker }
2156*3ac0a46fSAndroid Build Coastguard Worker break;
2157*3ac0a46fSAndroid Build Coastguard Worker }
2158*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::Button:
2159*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::Barcode:
2160*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::ChoiceList:
2161*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::DateTimeEdit:
2162*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::NumericEdit:
2163*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::PasswordEdit:
2164*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::TextEdit: {
2165*3ac0a46fSAndroid Build Coastguard Worker CXFA_Node* pUINode = GetParent();
2166*3ac0a46fSAndroid Build Coastguard Worker if (pUINode) {
2167*3ac0a46fSAndroid Build Coastguard Worker pNotify->OnValueChanged(this, eAttribute, pUINode,
2168*3ac0a46fSAndroid Build Coastguard Worker pUINode->GetParent());
2169*3ac0a46fSAndroid Build Coastguard Worker }
2170*3ac0a46fSAndroid Build Coastguard Worker break;
2171*3ac0a46fSAndroid Build Coastguard Worker }
2172*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::CheckButton: {
2173*3ac0a46fSAndroid Build Coastguard Worker bNeedFindContainer = true;
2174*3ac0a46fSAndroid Build Coastguard Worker CXFA_Node* pUINode = GetParent();
2175*3ac0a46fSAndroid Build Coastguard Worker if (pUINode) {
2176*3ac0a46fSAndroid Build Coastguard Worker pNotify->OnValueChanged(this, eAttribute, pUINode,
2177*3ac0a46fSAndroid Build Coastguard Worker pUINode->GetParent());
2178*3ac0a46fSAndroid Build Coastguard Worker }
2179*3ac0a46fSAndroid Build Coastguard Worker break;
2180*3ac0a46fSAndroid Build Coastguard Worker }
2181*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::Keep:
2182*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::Bookend:
2183*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::Break:
2184*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::BreakAfter:
2185*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::BreakBefore:
2186*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::Overflow:
2187*3ac0a46fSAndroid Build Coastguard Worker bNeedFindContainer = true;
2188*3ac0a46fSAndroid Build Coastguard Worker break;
2189*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::Area:
2190*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::Draw:
2191*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::ExclGroup:
2192*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::Field:
2193*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::Subform:
2194*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::SubformSet:
2195*3ac0a46fSAndroid Build Coastguard Worker pNotify->OnContainerChanged();
2196*3ac0a46fSAndroid Build Coastguard Worker pNotify->OnValueChanged(this, eAttribute, this, this);
2197*3ac0a46fSAndroid Build Coastguard Worker break;
2198*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::Sharptext:
2199*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::Sharpxml:
2200*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::SharpxHTML: {
2201*3ac0a46fSAndroid Build Coastguard Worker CXFA_Node* pTextNode = GetParent();
2202*3ac0a46fSAndroid Build Coastguard Worker if (!pTextNode)
2203*3ac0a46fSAndroid Build Coastguard Worker return;
2204*3ac0a46fSAndroid Build Coastguard Worker
2205*3ac0a46fSAndroid Build Coastguard Worker CXFA_Node* pValueNode = pTextNode->GetParent();
2206*3ac0a46fSAndroid Build Coastguard Worker if (!pValueNode)
2207*3ac0a46fSAndroid Build Coastguard Worker return;
2208*3ac0a46fSAndroid Build Coastguard Worker
2209*3ac0a46fSAndroid Build Coastguard Worker XFA_Element eType = pValueNode->GetElementType();
2210*3ac0a46fSAndroid Build Coastguard Worker if (eType == XFA_Element::Value) {
2211*3ac0a46fSAndroid Build Coastguard Worker bNeedFindContainer = true;
2212*3ac0a46fSAndroid Build Coastguard Worker CXFA_Node* pNode = pValueNode->GetParent();
2213*3ac0a46fSAndroid Build Coastguard Worker if (pNode && pNode->IsContainerNode()) {
2214*3ac0a46fSAndroid Build Coastguard Worker if (bScriptModify)
2215*3ac0a46fSAndroid Build Coastguard Worker pValueNode = pNode;
2216*3ac0a46fSAndroid Build Coastguard Worker
2217*3ac0a46fSAndroid Build Coastguard Worker pNotify->OnValueChanged(this, eAttribute, pValueNode, pNode);
2218*3ac0a46fSAndroid Build Coastguard Worker } else {
2219*3ac0a46fSAndroid Build Coastguard Worker pNotify->OnValueChanged(this, eAttribute, pNode, pNode->GetParent());
2220*3ac0a46fSAndroid Build Coastguard Worker }
2221*3ac0a46fSAndroid Build Coastguard Worker } else {
2222*3ac0a46fSAndroid Build Coastguard Worker if (eType == XFA_Element::Items) {
2223*3ac0a46fSAndroid Build Coastguard Worker CXFA_Node* pNode = pValueNode->GetParent();
2224*3ac0a46fSAndroid Build Coastguard Worker if (pNode && pNode->IsContainerNode()) {
2225*3ac0a46fSAndroid Build Coastguard Worker pNotify->OnValueChanged(this, eAttribute, pValueNode, pNode);
2226*3ac0a46fSAndroid Build Coastguard Worker }
2227*3ac0a46fSAndroid Build Coastguard Worker }
2228*3ac0a46fSAndroid Build Coastguard Worker }
2229*3ac0a46fSAndroid Build Coastguard Worker break;
2230*3ac0a46fSAndroid Build Coastguard Worker }
2231*3ac0a46fSAndroid Build Coastguard Worker default:
2232*3ac0a46fSAndroid Build Coastguard Worker break;
2233*3ac0a46fSAndroid Build Coastguard Worker }
2234*3ac0a46fSAndroid Build Coastguard Worker
2235*3ac0a46fSAndroid Build Coastguard Worker if (!bNeedFindContainer)
2236*3ac0a46fSAndroid Build Coastguard Worker return;
2237*3ac0a46fSAndroid Build Coastguard Worker
2238*3ac0a46fSAndroid Build Coastguard Worker CXFA_Node* pParent = this;
2239*3ac0a46fSAndroid Build Coastguard Worker while (pParent && !pParent->IsContainerNode())
2240*3ac0a46fSAndroid Build Coastguard Worker pParent = pParent->GetParent();
2241*3ac0a46fSAndroid Build Coastguard Worker
2242*3ac0a46fSAndroid Build Coastguard Worker if (pParent)
2243*3ac0a46fSAndroid Build Coastguard Worker pNotify->OnContainerChanged();
2244*3ac0a46fSAndroid Build Coastguard Worker }
2245*3ac0a46fSAndroid Build Coastguard Worker
SyncValue(const WideString & wsValue,bool bNotify)2246*3ac0a46fSAndroid Build Coastguard Worker void CXFA_Node::SyncValue(const WideString& wsValue, bool bNotify) {
2247*3ac0a46fSAndroid Build Coastguard Worker WideString wsFormatValue = wsValue;
2248*3ac0a46fSAndroid Build Coastguard Worker CXFA_Node* pContainerNode = GetContainerNode();
2249*3ac0a46fSAndroid Build Coastguard Worker if (pContainerNode)
2250*3ac0a46fSAndroid Build Coastguard Worker wsFormatValue = pContainerNode->GetFormatDataValue(wsValue);
2251*3ac0a46fSAndroid Build Coastguard Worker
2252*3ac0a46fSAndroid Build Coastguard Worker JSObject()->SetContent(wsValue, wsFormatValue, bNotify, false, true);
2253*3ac0a46fSAndroid Build Coastguard Worker }
2254*3ac0a46fSAndroid Build Coastguard Worker
GetRawValue() const2255*3ac0a46fSAndroid Build Coastguard Worker WideString CXFA_Node::GetRawValue() const {
2256*3ac0a46fSAndroid Build Coastguard Worker return JSObject()->GetContent(false);
2257*3ac0a46fSAndroid Build Coastguard Worker }
2258*3ac0a46fSAndroid Build Coastguard Worker
GetRotate() const2259*3ac0a46fSAndroid Build Coastguard Worker int32_t CXFA_Node::GetRotate() const {
2260*3ac0a46fSAndroid Build Coastguard Worker absl::optional<int32_t> degrees =
2261*3ac0a46fSAndroid Build Coastguard Worker JSObject()->TryInteger(XFA_Attribute::Rotate, false);
2262*3ac0a46fSAndroid Build Coastguard Worker return degrees.has_value() ? XFA_MapRotation(degrees.value()) / 90 * 90 : 0;
2263*3ac0a46fSAndroid Build Coastguard Worker }
2264*3ac0a46fSAndroid Build Coastguard Worker
GetBorderIfExists() const2265*3ac0a46fSAndroid Build Coastguard Worker CXFA_Border* CXFA_Node::GetBorderIfExists() const {
2266*3ac0a46fSAndroid Build Coastguard Worker return JSObject()->GetProperty<CXFA_Border>(0, XFA_Element::Border);
2267*3ac0a46fSAndroid Build Coastguard Worker }
2268*3ac0a46fSAndroid Build Coastguard Worker
GetOrCreateBorderIfPossible()2269*3ac0a46fSAndroid Build Coastguard Worker CXFA_Border* CXFA_Node::GetOrCreateBorderIfPossible() {
2270*3ac0a46fSAndroid Build Coastguard Worker return JSObject()->GetOrCreateProperty<CXFA_Border>(0, XFA_Element::Border);
2271*3ac0a46fSAndroid Build Coastguard Worker }
2272*3ac0a46fSAndroid Build Coastguard Worker
GetCaptionIfExists() const2273*3ac0a46fSAndroid Build Coastguard Worker CXFA_Caption* CXFA_Node::GetCaptionIfExists() const {
2274*3ac0a46fSAndroid Build Coastguard Worker return JSObject()->GetProperty<CXFA_Caption>(0, XFA_Element::Caption);
2275*3ac0a46fSAndroid Build Coastguard Worker }
2276*3ac0a46fSAndroid Build Coastguard Worker
GetOrCreateFontIfPossible()2277*3ac0a46fSAndroid Build Coastguard Worker CXFA_Font* CXFA_Node::GetOrCreateFontIfPossible() {
2278*3ac0a46fSAndroid Build Coastguard Worker return JSObject()->GetOrCreateProperty<CXFA_Font>(0, XFA_Element::Font);
2279*3ac0a46fSAndroid Build Coastguard Worker }
2280*3ac0a46fSAndroid Build Coastguard Worker
GetFontIfExists() const2281*3ac0a46fSAndroid Build Coastguard Worker CXFA_Font* CXFA_Node::GetFontIfExists() const {
2282*3ac0a46fSAndroid Build Coastguard Worker return JSObject()->GetProperty<CXFA_Font>(0, XFA_Element::Font);
2283*3ac0a46fSAndroid Build Coastguard Worker }
2284*3ac0a46fSAndroid Build Coastguard Worker
GetFontSize() const2285*3ac0a46fSAndroid Build Coastguard Worker float CXFA_Node::GetFontSize() const {
2286*3ac0a46fSAndroid Build Coastguard Worker CXFA_Font* font = GetFontIfExists();
2287*3ac0a46fSAndroid Build Coastguard Worker float fFontSize = font ? font->GetFontSize() : 10.0f;
2288*3ac0a46fSAndroid Build Coastguard Worker return fFontSize < 0.1f ? 10.0f : fFontSize;
2289*3ac0a46fSAndroid Build Coastguard Worker }
2290*3ac0a46fSAndroid Build Coastguard Worker
GetLineHeight() const2291*3ac0a46fSAndroid Build Coastguard Worker float CXFA_Node::GetLineHeight() const {
2292*3ac0a46fSAndroid Build Coastguard Worker float fLineHeight = 0;
2293*3ac0a46fSAndroid Build Coastguard Worker CXFA_Para* para = GetParaIfExists();
2294*3ac0a46fSAndroid Build Coastguard Worker if (para)
2295*3ac0a46fSAndroid Build Coastguard Worker fLineHeight = para->GetLineHeight();
2296*3ac0a46fSAndroid Build Coastguard Worker
2297*3ac0a46fSAndroid Build Coastguard Worker if (fLineHeight < 1)
2298*3ac0a46fSAndroid Build Coastguard Worker fLineHeight = GetFontSize() * 1.2f;
2299*3ac0a46fSAndroid Build Coastguard Worker return fLineHeight;
2300*3ac0a46fSAndroid Build Coastguard Worker }
2301*3ac0a46fSAndroid Build Coastguard Worker
GetTextColor() const2302*3ac0a46fSAndroid Build Coastguard Worker FX_ARGB CXFA_Node::GetTextColor() const {
2303*3ac0a46fSAndroid Build Coastguard Worker CXFA_Font* font = GetFontIfExists();
2304*3ac0a46fSAndroid Build Coastguard Worker return font ? font->GetColor() : 0xFF000000;
2305*3ac0a46fSAndroid Build Coastguard Worker }
2306*3ac0a46fSAndroid Build Coastguard Worker
GetMarginIfExists() const2307*3ac0a46fSAndroid Build Coastguard Worker CXFA_Margin* CXFA_Node::GetMarginIfExists() const {
2308*3ac0a46fSAndroid Build Coastguard Worker return JSObject()->GetProperty<CXFA_Margin>(0, XFA_Element::Margin);
2309*3ac0a46fSAndroid Build Coastguard Worker }
2310*3ac0a46fSAndroid Build Coastguard Worker
GetParaIfExists() const2311*3ac0a46fSAndroid Build Coastguard Worker CXFA_Para* CXFA_Node::GetParaIfExists() const {
2312*3ac0a46fSAndroid Build Coastguard Worker return JSObject()->GetProperty<CXFA_Para>(0, XFA_Element::Para);
2313*3ac0a46fSAndroid Build Coastguard Worker }
2314*3ac0a46fSAndroid Build Coastguard Worker
IsOpenAccess() const2315*3ac0a46fSAndroid Build Coastguard Worker bool CXFA_Node::IsOpenAccess() const {
2316*3ac0a46fSAndroid Build Coastguard Worker for (auto* pNode = this; pNode; pNode = pNode->GetContainerParent()) {
2317*3ac0a46fSAndroid Build Coastguard Worker XFA_AttributeValue iAcc = pNode->JSObject()->GetEnum(XFA_Attribute::Access);
2318*3ac0a46fSAndroid Build Coastguard Worker if (iAcc != XFA_AttributeValue::Open)
2319*3ac0a46fSAndroid Build Coastguard Worker return false;
2320*3ac0a46fSAndroid Build Coastguard Worker }
2321*3ac0a46fSAndroid Build Coastguard Worker return true;
2322*3ac0a46fSAndroid Build Coastguard Worker }
2323*3ac0a46fSAndroid Build Coastguard Worker
GetDefaultValueIfExists()2324*3ac0a46fSAndroid Build Coastguard Worker CXFA_Value* CXFA_Node::GetDefaultValueIfExists() {
2325*3ac0a46fSAndroid Build Coastguard Worker CXFA_Node* pTemNode = GetTemplateNodeIfExists();
2326*3ac0a46fSAndroid Build Coastguard Worker return pTemNode ? pTemNode->JSObject()->GetProperty<CXFA_Value>(
2327*3ac0a46fSAndroid Build Coastguard Worker 0, XFA_Element::Value)
2328*3ac0a46fSAndroid Build Coastguard Worker : nullptr;
2329*3ac0a46fSAndroid Build Coastguard Worker }
2330*3ac0a46fSAndroid Build Coastguard Worker
GetFormValueIfExists() const2331*3ac0a46fSAndroid Build Coastguard Worker CXFA_Value* CXFA_Node::GetFormValueIfExists() const {
2332*3ac0a46fSAndroid Build Coastguard Worker return JSObject()->GetProperty<CXFA_Value>(0, XFA_Element::Value);
2333*3ac0a46fSAndroid Build Coastguard Worker }
2334*3ac0a46fSAndroid Build Coastguard Worker
GetCalculateIfExists() const2335*3ac0a46fSAndroid Build Coastguard Worker CXFA_Calculate* CXFA_Node::GetCalculateIfExists() const {
2336*3ac0a46fSAndroid Build Coastguard Worker return JSObject()->GetProperty<CXFA_Calculate>(0, XFA_Element::Calculate);
2337*3ac0a46fSAndroid Build Coastguard Worker }
2338*3ac0a46fSAndroid Build Coastguard Worker
GetValidateIfExists() const2339*3ac0a46fSAndroid Build Coastguard Worker CXFA_Validate* CXFA_Node::GetValidateIfExists() const {
2340*3ac0a46fSAndroid Build Coastguard Worker return JSObject()->GetProperty<CXFA_Validate>(0, XFA_Element::Validate);
2341*3ac0a46fSAndroid Build Coastguard Worker }
2342*3ac0a46fSAndroid Build Coastguard Worker
GetOrCreateValidateIfPossible()2343*3ac0a46fSAndroid Build Coastguard Worker CXFA_Validate* CXFA_Node::GetOrCreateValidateIfPossible() {
2344*3ac0a46fSAndroid Build Coastguard Worker return JSObject()->GetOrCreateProperty<CXFA_Validate>(0,
2345*3ac0a46fSAndroid Build Coastguard Worker XFA_Element::Validate);
2346*3ac0a46fSAndroid Build Coastguard Worker }
2347*3ac0a46fSAndroid Build Coastguard Worker
GetBindIfExists() const2348*3ac0a46fSAndroid Build Coastguard Worker CXFA_Bind* CXFA_Node::GetBindIfExists() const {
2349*3ac0a46fSAndroid Build Coastguard Worker return JSObject()->GetProperty<CXFA_Bind>(0, XFA_Element::Bind);
2350*3ac0a46fSAndroid Build Coastguard Worker }
2351*3ac0a46fSAndroid Build Coastguard Worker
GetIntactFromKeep(const CXFA_Keep * pKeep,XFA_AttributeValue eLayoutType) const2352*3ac0a46fSAndroid Build Coastguard Worker absl::optional<XFA_AttributeValue> CXFA_Node::GetIntactFromKeep(
2353*3ac0a46fSAndroid Build Coastguard Worker const CXFA_Keep* pKeep,
2354*3ac0a46fSAndroid Build Coastguard Worker XFA_AttributeValue eLayoutType) const {
2355*3ac0a46fSAndroid Build Coastguard Worker absl::optional<XFA_AttributeValue> intact =
2356*3ac0a46fSAndroid Build Coastguard Worker pKeep->JSObject()->TryEnum(XFA_Attribute::Intact, false);
2357*3ac0a46fSAndroid Build Coastguard Worker if (!intact.has_value())
2358*3ac0a46fSAndroid Build Coastguard Worker return absl::nullopt;
2359*3ac0a46fSAndroid Build Coastguard Worker
2360*3ac0a46fSAndroid Build Coastguard Worker if (intact.value() != XFA_AttributeValue::None ||
2361*3ac0a46fSAndroid Build Coastguard Worker eLayoutType != XFA_AttributeValue::Row ||
2362*3ac0a46fSAndroid Build Coastguard Worker m_pDocument->GetCurVersionMode() >= XFA_VERSION_208) {
2363*3ac0a46fSAndroid Build Coastguard Worker return intact;
2364*3ac0a46fSAndroid Build Coastguard Worker }
2365*3ac0a46fSAndroid Build Coastguard Worker
2366*3ac0a46fSAndroid Build Coastguard Worker CXFA_Node* pPreviewRow = GetPrevContainerSibling();
2367*3ac0a46fSAndroid Build Coastguard Worker if (!pPreviewRow || pPreviewRow->JSObject()->GetEnum(XFA_Attribute::Layout) !=
2368*3ac0a46fSAndroid Build Coastguard Worker XFA_AttributeValue::Row) {
2369*3ac0a46fSAndroid Build Coastguard Worker return intact;
2370*3ac0a46fSAndroid Build Coastguard Worker }
2371*3ac0a46fSAndroid Build Coastguard Worker
2372*3ac0a46fSAndroid Build Coastguard Worker absl::optional<XFA_AttributeValue> value =
2373*3ac0a46fSAndroid Build Coastguard Worker pKeep->JSObject()->TryEnum(XFA_Attribute::Previous, false);
2374*3ac0a46fSAndroid Build Coastguard Worker if (value == XFA_AttributeValue::ContentArea ||
2375*3ac0a46fSAndroid Build Coastguard Worker value == XFA_AttributeValue::PageArea) {
2376*3ac0a46fSAndroid Build Coastguard Worker return XFA_AttributeValue::ContentArea;
2377*3ac0a46fSAndroid Build Coastguard Worker }
2378*3ac0a46fSAndroid Build Coastguard Worker
2379*3ac0a46fSAndroid Build Coastguard Worker CXFA_Keep* pNode =
2380*3ac0a46fSAndroid Build Coastguard Worker pPreviewRow->GetFirstChildByClass<CXFA_Keep>(XFA_Element::Keep);
2381*3ac0a46fSAndroid Build Coastguard Worker if (!pNode)
2382*3ac0a46fSAndroid Build Coastguard Worker return intact;
2383*3ac0a46fSAndroid Build Coastguard Worker
2384*3ac0a46fSAndroid Build Coastguard Worker absl::optional<XFA_AttributeValue> ret =
2385*3ac0a46fSAndroid Build Coastguard Worker pNode->JSObject()->TryEnum(XFA_Attribute::Next, false);
2386*3ac0a46fSAndroid Build Coastguard Worker if (ret == XFA_AttributeValue::ContentArea ||
2387*3ac0a46fSAndroid Build Coastguard Worker ret == XFA_AttributeValue::PageArea) {
2388*3ac0a46fSAndroid Build Coastguard Worker return XFA_AttributeValue::ContentArea;
2389*3ac0a46fSAndroid Build Coastguard Worker }
2390*3ac0a46fSAndroid Build Coastguard Worker return intact;
2391*3ac0a46fSAndroid Build Coastguard Worker }
2392*3ac0a46fSAndroid Build Coastguard Worker
TryWidth()2393*3ac0a46fSAndroid Build Coastguard Worker absl::optional<float> CXFA_Node::TryWidth() {
2394*3ac0a46fSAndroid Build Coastguard Worker return JSObject()->TryMeasureAsFloat(XFA_Attribute::W);
2395*3ac0a46fSAndroid Build Coastguard Worker }
2396*3ac0a46fSAndroid Build Coastguard Worker
TryHeight()2397*3ac0a46fSAndroid Build Coastguard Worker absl::optional<float> CXFA_Node::TryHeight() {
2398*3ac0a46fSAndroid Build Coastguard Worker return JSObject()->TryMeasureAsFloat(XFA_Attribute::H);
2399*3ac0a46fSAndroid Build Coastguard Worker }
2400*3ac0a46fSAndroid Build Coastguard Worker
TryMinWidth()2401*3ac0a46fSAndroid Build Coastguard Worker absl::optional<float> CXFA_Node::TryMinWidth() {
2402*3ac0a46fSAndroid Build Coastguard Worker return JSObject()->TryMeasureAsFloat(XFA_Attribute::MinW);
2403*3ac0a46fSAndroid Build Coastguard Worker }
2404*3ac0a46fSAndroid Build Coastguard Worker
TryMinHeight()2405*3ac0a46fSAndroid Build Coastguard Worker absl::optional<float> CXFA_Node::TryMinHeight() {
2406*3ac0a46fSAndroid Build Coastguard Worker return JSObject()->TryMeasureAsFloat(XFA_Attribute::MinH);
2407*3ac0a46fSAndroid Build Coastguard Worker }
2408*3ac0a46fSAndroid Build Coastguard Worker
TryMaxWidth()2409*3ac0a46fSAndroid Build Coastguard Worker absl::optional<float> CXFA_Node::TryMaxWidth() {
2410*3ac0a46fSAndroid Build Coastguard Worker return JSObject()->TryMeasureAsFloat(XFA_Attribute::MaxW);
2411*3ac0a46fSAndroid Build Coastguard Worker }
2412*3ac0a46fSAndroid Build Coastguard Worker
TryMaxHeight()2413*3ac0a46fSAndroid Build Coastguard Worker absl::optional<float> CXFA_Node::TryMaxHeight() {
2414*3ac0a46fSAndroid Build Coastguard Worker return JSObject()->TryMeasureAsFloat(XFA_Attribute::MaxH);
2415*3ac0a46fSAndroid Build Coastguard Worker }
2416*3ac0a46fSAndroid Build Coastguard Worker
GetExclGroupIfExists()2417*3ac0a46fSAndroid Build Coastguard Worker CXFA_Node* CXFA_Node::GetExclGroupIfExists() {
2418*3ac0a46fSAndroid Build Coastguard Worker CXFA_Node* pExcl = GetParent();
2419*3ac0a46fSAndroid Build Coastguard Worker if (!pExcl || pExcl->GetElementType() != XFA_Element::ExclGroup)
2420*3ac0a46fSAndroid Build Coastguard Worker return nullptr;
2421*3ac0a46fSAndroid Build Coastguard Worker return pExcl;
2422*3ac0a46fSAndroid Build Coastguard Worker }
2423*3ac0a46fSAndroid Build Coastguard Worker
ProcessEvent(CXFA_FFDocView * pDocView,XFA_AttributeValue iActivity,CXFA_EventParam * pEventParam)2424*3ac0a46fSAndroid Build Coastguard Worker XFA_EventError CXFA_Node::ProcessEvent(CXFA_FFDocView* pDocView,
2425*3ac0a46fSAndroid Build Coastguard Worker XFA_AttributeValue iActivity,
2426*3ac0a46fSAndroid Build Coastguard Worker CXFA_EventParam* pEventParam) {
2427*3ac0a46fSAndroid Build Coastguard Worker if (GetElementType() == XFA_Element::Draw)
2428*3ac0a46fSAndroid Build Coastguard Worker return XFA_EventError::kNotExist;
2429*3ac0a46fSAndroid Build Coastguard Worker
2430*3ac0a46fSAndroid Build Coastguard Worker std::vector<CXFA_Event*> eventArray =
2431*3ac0a46fSAndroid Build Coastguard Worker GetEventByActivity(iActivity, pEventParam->m_bIsFormReady);
2432*3ac0a46fSAndroid Build Coastguard Worker bool first = true;
2433*3ac0a46fSAndroid Build Coastguard Worker XFA_EventError iRet = XFA_EventError::kNotExist;
2434*3ac0a46fSAndroid Build Coastguard Worker for (CXFA_Event* event : eventArray) {
2435*3ac0a46fSAndroid Build Coastguard Worker XFA_EventError result =
2436*3ac0a46fSAndroid Build Coastguard Worker ProcessEventInternal(pDocView, iActivity, event, pEventParam);
2437*3ac0a46fSAndroid Build Coastguard Worker if (first || result == XFA_EventError::kSuccess)
2438*3ac0a46fSAndroid Build Coastguard Worker iRet = result;
2439*3ac0a46fSAndroid Build Coastguard Worker first = false;
2440*3ac0a46fSAndroid Build Coastguard Worker }
2441*3ac0a46fSAndroid Build Coastguard Worker return iRet;
2442*3ac0a46fSAndroid Build Coastguard Worker }
2443*3ac0a46fSAndroid Build Coastguard Worker
ProcessEventInternal(CXFA_FFDocView * pDocView,XFA_AttributeValue iActivity,CXFA_Event * event,CXFA_EventParam * pEventParam)2444*3ac0a46fSAndroid Build Coastguard Worker XFA_EventError CXFA_Node::ProcessEventInternal(CXFA_FFDocView* pDocView,
2445*3ac0a46fSAndroid Build Coastguard Worker XFA_AttributeValue iActivity,
2446*3ac0a46fSAndroid Build Coastguard Worker CXFA_Event* event,
2447*3ac0a46fSAndroid Build Coastguard Worker CXFA_EventParam* pEventParam) {
2448*3ac0a46fSAndroid Build Coastguard Worker if (!event)
2449*3ac0a46fSAndroid Build Coastguard Worker return XFA_EventError::kNotExist;
2450*3ac0a46fSAndroid Build Coastguard Worker
2451*3ac0a46fSAndroid Build Coastguard Worker switch (event->GetEventType()) {
2452*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::Execute:
2453*3ac0a46fSAndroid Build Coastguard Worker break;
2454*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::Script:
2455*3ac0a46fSAndroid Build Coastguard Worker if (iActivity == XFA_AttributeValue::DocClose) {
2456*3ac0a46fSAndroid Build Coastguard Worker // Too late, scripting engine already gone.
2457*3ac0a46fSAndroid Build Coastguard Worker return XFA_EventError::kNotExist;
2458*3ac0a46fSAndroid Build Coastguard Worker }
2459*3ac0a46fSAndroid Build Coastguard Worker return ExecuteScript(pDocView, event->GetScriptIfExists(), pEventParam);
2460*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::SignData:
2461*3ac0a46fSAndroid Build Coastguard Worker break;
2462*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::Submit: {
2463*3ac0a46fSAndroid Build Coastguard Worker // TODO(crbug.com/867485): Submit is disabled for now. Fix it and reenable this
2464*3ac0a46fSAndroid Build Coastguard Worker // code.
2465*3ac0a46fSAndroid Build Coastguard Worker #ifdef PDF_XFA_ELEMENT_SUBMIT_ENABLED
2466*3ac0a46fSAndroid Build Coastguard Worker CXFA_Submit* submit = event->GetSubmitIfExists();
2467*3ac0a46fSAndroid Build Coastguard Worker if (!submit)
2468*3ac0a46fSAndroid Build Coastguard Worker return XFA_EventError::kNotExist;
2469*3ac0a46fSAndroid Build Coastguard Worker return pDocView->GetDoc()->GetDocEnvironment()->Submit(pDocView->GetDoc(),
2470*3ac0a46fSAndroid Build Coastguard Worker submit);
2471*3ac0a46fSAndroid Build Coastguard Worker #else
2472*3ac0a46fSAndroid Build Coastguard Worker return XFA_EventError::kDisabled;
2473*3ac0a46fSAndroid Build Coastguard Worker #endif // PDF_XFA_ELEMENT_SUBMIT_ENABLED
2474*3ac0a46fSAndroid Build Coastguard Worker }
2475*3ac0a46fSAndroid Build Coastguard Worker default:
2476*3ac0a46fSAndroid Build Coastguard Worker break;
2477*3ac0a46fSAndroid Build Coastguard Worker }
2478*3ac0a46fSAndroid Build Coastguard Worker return XFA_EventError::kNotExist;
2479*3ac0a46fSAndroid Build Coastguard Worker }
2480*3ac0a46fSAndroid Build Coastguard Worker
ProcessCalculate(CXFA_FFDocView * pDocView)2481*3ac0a46fSAndroid Build Coastguard Worker XFA_EventError CXFA_Node::ProcessCalculate(CXFA_FFDocView* pDocView) {
2482*3ac0a46fSAndroid Build Coastguard Worker if (GetElementType() == XFA_Element::Draw)
2483*3ac0a46fSAndroid Build Coastguard Worker return XFA_EventError::kNotExist;
2484*3ac0a46fSAndroid Build Coastguard Worker
2485*3ac0a46fSAndroid Build Coastguard Worker CXFA_Calculate* calc = GetCalculateIfExists();
2486*3ac0a46fSAndroid Build Coastguard Worker if (!calc)
2487*3ac0a46fSAndroid Build Coastguard Worker return XFA_EventError::kNotExist;
2488*3ac0a46fSAndroid Build Coastguard Worker if (IsUserInteractive())
2489*3ac0a46fSAndroid Build Coastguard Worker return XFA_EventError::kDisabled;
2490*3ac0a46fSAndroid Build Coastguard Worker
2491*3ac0a46fSAndroid Build Coastguard Worker CXFA_EventParam EventParam;
2492*3ac0a46fSAndroid Build Coastguard Worker EventParam.m_eType = XFA_EVENT_Calculate;
2493*3ac0a46fSAndroid Build Coastguard Worker EventParam.m_bTargeted = false;
2494*3ac0a46fSAndroid Build Coastguard Worker XFA_EventError iRet =
2495*3ac0a46fSAndroid Build Coastguard Worker ExecuteScript(pDocView, calc->GetScriptIfExists(), &EventParam);
2496*3ac0a46fSAndroid Build Coastguard Worker if (iRet != XFA_EventError::kSuccess)
2497*3ac0a46fSAndroid Build Coastguard Worker return iRet;
2498*3ac0a46fSAndroid Build Coastguard Worker
2499*3ac0a46fSAndroid Build Coastguard Worker if (GetRawValue() != EventParam.m_wsResult) {
2500*3ac0a46fSAndroid Build Coastguard Worker SetValue(XFA_ValuePicture::kRaw, EventParam.m_wsResult);
2501*3ac0a46fSAndroid Build Coastguard Worker pDocView->UpdateUIDisplay(this, nullptr);
2502*3ac0a46fSAndroid Build Coastguard Worker }
2503*3ac0a46fSAndroid Build Coastguard Worker return XFA_EventError::kSuccess;
2504*3ac0a46fSAndroid Build Coastguard Worker }
2505*3ac0a46fSAndroid Build Coastguard Worker
ProcessScriptTestValidate(CXFA_FFDocView * pDocView,CXFA_Validate * validate,bool bVersionFlag)2506*3ac0a46fSAndroid Build Coastguard Worker void CXFA_Node::ProcessScriptTestValidate(CXFA_FFDocView* pDocView,
2507*3ac0a46fSAndroid Build Coastguard Worker CXFA_Validate* validate,
2508*3ac0a46fSAndroid Build Coastguard Worker bool bVersionFlag) {
2509*3ac0a46fSAndroid Build Coastguard Worker CXFA_FFApp::CallbackIface* pAppProvider =
2510*3ac0a46fSAndroid Build Coastguard Worker pDocView->GetDoc()->GetApp()->GetAppProvider();
2511*3ac0a46fSAndroid Build Coastguard Worker if (!pAppProvider)
2512*3ac0a46fSAndroid Build Coastguard Worker return;
2513*3ac0a46fSAndroid Build Coastguard Worker
2514*3ac0a46fSAndroid Build Coastguard Worker WideString wsTitle = pAppProvider->GetAppTitle();
2515*3ac0a46fSAndroid Build Coastguard Worker WideString wsScriptMsg = validate->GetScriptMessageText();
2516*3ac0a46fSAndroid Build Coastguard Worker if (validate->GetScriptTest() == XFA_AttributeValue::Warning) {
2517*3ac0a46fSAndroid Build Coastguard Worker if (IsUserInteractive())
2518*3ac0a46fSAndroid Build Coastguard Worker return;
2519*3ac0a46fSAndroid Build Coastguard Worker if (wsScriptMsg.IsEmpty())
2520*3ac0a46fSAndroid Build Coastguard Worker wsScriptMsg = GetValidateMessage(false, bVersionFlag);
2521*3ac0a46fSAndroid Build Coastguard Worker
2522*3ac0a46fSAndroid Build Coastguard Worker if (bVersionFlag) {
2523*3ac0a46fSAndroid Build Coastguard Worker pAppProvider->MsgBox(wsScriptMsg, wsTitle,
2524*3ac0a46fSAndroid Build Coastguard Worker static_cast<uint32_t>(AlertIcon::kWarning),
2525*3ac0a46fSAndroid Build Coastguard Worker static_cast<uint32_t>(AlertButton::kOK));
2526*3ac0a46fSAndroid Build Coastguard Worker return;
2527*3ac0a46fSAndroid Build Coastguard Worker }
2528*3ac0a46fSAndroid Build Coastguard Worker if (pAppProvider->MsgBox(wsScriptMsg, wsTitle,
2529*3ac0a46fSAndroid Build Coastguard Worker static_cast<uint32_t>(AlertIcon::kWarning),
2530*3ac0a46fSAndroid Build Coastguard Worker static_cast<uint32_t>(AlertButton::kYesNo)) ==
2531*3ac0a46fSAndroid Build Coastguard Worker static_cast<uint32_t>(AlertReturn::kYes)) {
2532*3ac0a46fSAndroid Build Coastguard Worker SetFlag(XFA_NodeFlag::kUserInteractive);
2533*3ac0a46fSAndroid Build Coastguard Worker }
2534*3ac0a46fSAndroid Build Coastguard Worker return;
2535*3ac0a46fSAndroid Build Coastguard Worker }
2536*3ac0a46fSAndroid Build Coastguard Worker
2537*3ac0a46fSAndroid Build Coastguard Worker if (wsScriptMsg.IsEmpty())
2538*3ac0a46fSAndroid Build Coastguard Worker wsScriptMsg = GetValidateMessage(true, bVersionFlag);
2539*3ac0a46fSAndroid Build Coastguard Worker pAppProvider->MsgBox(wsScriptMsg, wsTitle,
2540*3ac0a46fSAndroid Build Coastguard Worker static_cast<uint32_t>(AlertIcon::kError),
2541*3ac0a46fSAndroid Build Coastguard Worker static_cast<uint32_t>(AlertButton::kOK));
2542*3ac0a46fSAndroid Build Coastguard Worker }
2543*3ac0a46fSAndroid Build Coastguard Worker
ProcessFormatTestValidate(CXFA_FFDocView * pDocView,CXFA_Validate * validate,bool bVersionFlag)2544*3ac0a46fSAndroid Build Coastguard Worker XFA_EventError CXFA_Node::ProcessFormatTestValidate(CXFA_FFDocView* pDocView,
2545*3ac0a46fSAndroid Build Coastguard Worker CXFA_Validate* validate,
2546*3ac0a46fSAndroid Build Coastguard Worker bool bVersionFlag) {
2547*3ac0a46fSAndroid Build Coastguard Worker WideString wsPicture = validate->GetPicture();
2548*3ac0a46fSAndroid Build Coastguard Worker if (wsPicture.IsEmpty())
2549*3ac0a46fSAndroid Build Coastguard Worker return XFA_EventError::kNotExist;
2550*3ac0a46fSAndroid Build Coastguard Worker
2551*3ac0a46fSAndroid Build Coastguard Worker WideString wsRawValue = GetRawValue();
2552*3ac0a46fSAndroid Build Coastguard Worker if (wsRawValue.IsEmpty())
2553*3ac0a46fSAndroid Build Coastguard Worker return XFA_EventError::kError;
2554*3ac0a46fSAndroid Build Coastguard Worker
2555*3ac0a46fSAndroid Build Coastguard Worker GCedLocaleIface* pLocale = GetLocale();
2556*3ac0a46fSAndroid Build Coastguard Worker if (!pLocale)
2557*3ac0a46fSAndroid Build Coastguard Worker return XFA_EventError::kNotExist;
2558*3ac0a46fSAndroid Build Coastguard Worker
2559*3ac0a46fSAndroid Build Coastguard Worker CXFA_LocaleValue lcValue = XFA_GetLocaleValue(this);
2560*3ac0a46fSAndroid Build Coastguard Worker if (lcValue.ValidateValue(lcValue.GetValue(), wsPicture, pLocale, nullptr))
2561*3ac0a46fSAndroid Build Coastguard Worker return XFA_EventError::kSuccess;
2562*3ac0a46fSAndroid Build Coastguard Worker
2563*3ac0a46fSAndroid Build Coastguard Worker CXFA_FFApp::CallbackIface* pAppProvider =
2564*3ac0a46fSAndroid Build Coastguard Worker pDocView->GetDoc()->GetApp()->GetAppProvider();
2565*3ac0a46fSAndroid Build Coastguard Worker if (!pAppProvider)
2566*3ac0a46fSAndroid Build Coastguard Worker return XFA_EventError::kNotExist;
2567*3ac0a46fSAndroid Build Coastguard Worker
2568*3ac0a46fSAndroid Build Coastguard Worker WideString wsFormatMsg = validate->GetFormatMessageText();
2569*3ac0a46fSAndroid Build Coastguard Worker WideString wsTitle = pAppProvider->GetAppTitle();
2570*3ac0a46fSAndroid Build Coastguard Worker if (validate->GetFormatTest() == XFA_AttributeValue::Error) {
2571*3ac0a46fSAndroid Build Coastguard Worker if (wsFormatMsg.IsEmpty())
2572*3ac0a46fSAndroid Build Coastguard Worker wsFormatMsg = GetValidateMessage(true, bVersionFlag);
2573*3ac0a46fSAndroid Build Coastguard Worker pAppProvider->MsgBox(wsFormatMsg, wsTitle,
2574*3ac0a46fSAndroid Build Coastguard Worker static_cast<uint32_t>(AlertIcon::kError),
2575*3ac0a46fSAndroid Build Coastguard Worker static_cast<uint32_t>(AlertButton::kOK));
2576*3ac0a46fSAndroid Build Coastguard Worker return XFA_EventError::kError;
2577*3ac0a46fSAndroid Build Coastguard Worker }
2578*3ac0a46fSAndroid Build Coastguard Worker
2579*3ac0a46fSAndroid Build Coastguard Worker if (wsFormatMsg.IsEmpty())
2580*3ac0a46fSAndroid Build Coastguard Worker wsFormatMsg = GetValidateMessage(false, bVersionFlag);
2581*3ac0a46fSAndroid Build Coastguard Worker
2582*3ac0a46fSAndroid Build Coastguard Worker if (bVersionFlag) {
2583*3ac0a46fSAndroid Build Coastguard Worker pAppProvider->MsgBox(wsFormatMsg, wsTitle,
2584*3ac0a46fSAndroid Build Coastguard Worker static_cast<uint32_t>(AlertIcon::kWarning),
2585*3ac0a46fSAndroid Build Coastguard Worker static_cast<uint32_t>(AlertButton::kOK));
2586*3ac0a46fSAndroid Build Coastguard Worker return XFA_EventError::kError;
2587*3ac0a46fSAndroid Build Coastguard Worker }
2588*3ac0a46fSAndroid Build Coastguard Worker
2589*3ac0a46fSAndroid Build Coastguard Worker if (pAppProvider->MsgBox(wsFormatMsg, wsTitle,
2590*3ac0a46fSAndroid Build Coastguard Worker static_cast<uint32_t>(AlertIcon::kWarning),
2591*3ac0a46fSAndroid Build Coastguard Worker static_cast<uint32_t>(AlertButton::kYesNo)) ==
2592*3ac0a46fSAndroid Build Coastguard Worker static_cast<uint32_t>(AlertReturn::kYes)) {
2593*3ac0a46fSAndroid Build Coastguard Worker SetFlag(XFA_NodeFlag::kUserInteractive);
2594*3ac0a46fSAndroid Build Coastguard Worker }
2595*3ac0a46fSAndroid Build Coastguard Worker
2596*3ac0a46fSAndroid Build Coastguard Worker return XFA_EventError::kError;
2597*3ac0a46fSAndroid Build Coastguard Worker }
2598*3ac0a46fSAndroid Build Coastguard Worker
ProcessNullTestValidate(CXFA_FFDocView * pDocView,CXFA_Validate * validate,int32_t iFlags,bool bVersionFlag)2599*3ac0a46fSAndroid Build Coastguard Worker XFA_EventError CXFA_Node::ProcessNullTestValidate(CXFA_FFDocView* pDocView,
2600*3ac0a46fSAndroid Build Coastguard Worker CXFA_Validate* validate,
2601*3ac0a46fSAndroid Build Coastguard Worker int32_t iFlags,
2602*3ac0a46fSAndroid Build Coastguard Worker bool bVersionFlag) {
2603*3ac0a46fSAndroid Build Coastguard Worker if (!GetValue(XFA_ValuePicture::kRaw).IsEmpty())
2604*3ac0a46fSAndroid Build Coastguard Worker return XFA_EventError::kSuccess;
2605*3ac0a46fSAndroid Build Coastguard Worker if (m_bIsNull && m_bPreNull)
2606*3ac0a46fSAndroid Build Coastguard Worker return XFA_EventError::kSuccess;
2607*3ac0a46fSAndroid Build Coastguard Worker
2608*3ac0a46fSAndroid Build Coastguard Worker XFA_AttributeValue eNullTest = validate->GetNullTest();
2609*3ac0a46fSAndroid Build Coastguard Worker WideString wsNullMsg = validate->GetNullMessageText();
2610*3ac0a46fSAndroid Build Coastguard Worker if (iFlags & 0x01) {
2611*3ac0a46fSAndroid Build Coastguard Worker if (eNullTest == XFA_AttributeValue::Disabled)
2612*3ac0a46fSAndroid Build Coastguard Worker return XFA_EventError::kSuccess;
2613*3ac0a46fSAndroid Build Coastguard Worker
2614*3ac0a46fSAndroid Build Coastguard Worker if (!wsNullMsg.IsEmpty())
2615*3ac0a46fSAndroid Build Coastguard Worker pDocView->AddNullTestMsg(wsNullMsg);
2616*3ac0a46fSAndroid Build Coastguard Worker return XFA_EventError::kError;
2617*3ac0a46fSAndroid Build Coastguard Worker }
2618*3ac0a46fSAndroid Build Coastguard Worker if (wsNullMsg.IsEmpty() && bVersionFlag &&
2619*3ac0a46fSAndroid Build Coastguard Worker eNullTest != XFA_AttributeValue::Disabled) {
2620*3ac0a46fSAndroid Build Coastguard Worker return XFA_EventError::kError;
2621*3ac0a46fSAndroid Build Coastguard Worker }
2622*3ac0a46fSAndroid Build Coastguard Worker CXFA_FFApp::CallbackIface* pAppProvider =
2623*3ac0a46fSAndroid Build Coastguard Worker pDocView->GetDoc()->GetApp()->GetAppProvider();
2624*3ac0a46fSAndroid Build Coastguard Worker if (!pAppProvider)
2625*3ac0a46fSAndroid Build Coastguard Worker return XFA_EventError::kNotExist;
2626*3ac0a46fSAndroid Build Coastguard Worker
2627*3ac0a46fSAndroid Build Coastguard Worker WideString wsCaptionName;
2628*3ac0a46fSAndroid Build Coastguard Worker WideString wsTitle = pAppProvider->GetAppTitle();
2629*3ac0a46fSAndroid Build Coastguard Worker switch (eNullTest) {
2630*3ac0a46fSAndroid Build Coastguard Worker case XFA_AttributeValue::Error: {
2631*3ac0a46fSAndroid Build Coastguard Worker if (wsNullMsg.IsEmpty()) {
2632*3ac0a46fSAndroid Build Coastguard Worker wsCaptionName = GetValidateCaptionName(bVersionFlag);
2633*3ac0a46fSAndroid Build Coastguard Worker wsNullMsg = wsCaptionName + L" cannot be blank.";
2634*3ac0a46fSAndroid Build Coastguard Worker }
2635*3ac0a46fSAndroid Build Coastguard Worker pAppProvider->MsgBox(wsNullMsg, wsTitle,
2636*3ac0a46fSAndroid Build Coastguard Worker static_cast<uint32_t>(AlertIcon::kStatus),
2637*3ac0a46fSAndroid Build Coastguard Worker static_cast<uint32_t>(AlertButton::kOK));
2638*3ac0a46fSAndroid Build Coastguard Worker return XFA_EventError::kError;
2639*3ac0a46fSAndroid Build Coastguard Worker }
2640*3ac0a46fSAndroid Build Coastguard Worker case XFA_AttributeValue::Warning: {
2641*3ac0a46fSAndroid Build Coastguard Worker if (IsUserInteractive())
2642*3ac0a46fSAndroid Build Coastguard Worker return XFA_EventError::kSuccess;
2643*3ac0a46fSAndroid Build Coastguard Worker
2644*3ac0a46fSAndroid Build Coastguard Worker if (wsNullMsg.IsEmpty()) {
2645*3ac0a46fSAndroid Build Coastguard Worker wsCaptionName = GetValidateCaptionName(bVersionFlag);
2646*3ac0a46fSAndroid Build Coastguard Worker wsNullMsg = wsCaptionName +
2647*3ac0a46fSAndroid Build Coastguard Worker L" cannot be blank. To ignore validations for " +
2648*3ac0a46fSAndroid Build Coastguard Worker wsCaptionName + L", click Ignore.";
2649*3ac0a46fSAndroid Build Coastguard Worker }
2650*3ac0a46fSAndroid Build Coastguard Worker if (pAppProvider->MsgBox(wsNullMsg, wsTitle,
2651*3ac0a46fSAndroid Build Coastguard Worker static_cast<uint32_t>(AlertIcon::kWarning),
2652*3ac0a46fSAndroid Build Coastguard Worker static_cast<uint32_t>(AlertButton::kYesNo)) ==
2653*3ac0a46fSAndroid Build Coastguard Worker static_cast<uint32_t>(AlertReturn::kYes)) {
2654*3ac0a46fSAndroid Build Coastguard Worker SetFlag(XFA_NodeFlag::kUserInteractive);
2655*3ac0a46fSAndroid Build Coastguard Worker }
2656*3ac0a46fSAndroid Build Coastguard Worker return XFA_EventError::kError;
2657*3ac0a46fSAndroid Build Coastguard Worker }
2658*3ac0a46fSAndroid Build Coastguard Worker case XFA_AttributeValue::Disabled:
2659*3ac0a46fSAndroid Build Coastguard Worker default:
2660*3ac0a46fSAndroid Build Coastguard Worker break;
2661*3ac0a46fSAndroid Build Coastguard Worker }
2662*3ac0a46fSAndroid Build Coastguard Worker return XFA_EventError::kSuccess;
2663*3ac0a46fSAndroid Build Coastguard Worker }
2664*3ac0a46fSAndroid Build Coastguard Worker
ProcessValidate(CXFA_FFDocView * pDocView,int32_t iFlags)2665*3ac0a46fSAndroid Build Coastguard Worker XFA_EventError CXFA_Node::ProcessValidate(CXFA_FFDocView* pDocView,
2666*3ac0a46fSAndroid Build Coastguard Worker int32_t iFlags) {
2667*3ac0a46fSAndroid Build Coastguard Worker if (GetElementType() == XFA_Element::Draw)
2668*3ac0a46fSAndroid Build Coastguard Worker return XFA_EventError::kNotExist;
2669*3ac0a46fSAndroid Build Coastguard Worker
2670*3ac0a46fSAndroid Build Coastguard Worker CXFA_Validate* validate = GetValidateIfExists();
2671*3ac0a46fSAndroid Build Coastguard Worker if (!validate)
2672*3ac0a46fSAndroid Build Coastguard Worker return XFA_EventError::kNotExist;
2673*3ac0a46fSAndroid Build Coastguard Worker
2674*3ac0a46fSAndroid Build Coastguard Worker const bool bInitDoc = validate->NeedsInitApp();
2675*3ac0a46fSAndroid Build Coastguard Worker const bool bStatus =
2676*3ac0a46fSAndroid Build Coastguard Worker pDocView->GetLayoutStatus() != CXFA_FFDocView::LayoutStatus::kEnd;
2677*3ac0a46fSAndroid Build Coastguard Worker
2678*3ac0a46fSAndroid Build Coastguard Worker XFA_EventError iFormat = XFA_EventError::kNotExist;
2679*3ac0a46fSAndroid Build Coastguard Worker XFA_EventError iRet = XFA_EventError::kNotExist;
2680*3ac0a46fSAndroid Build Coastguard Worker CXFA_Script* script = validate->GetScriptIfExists();
2681*3ac0a46fSAndroid Build Coastguard Worker bool bRet = false;
2682*3ac0a46fSAndroid Build Coastguard Worker bool hasBoolResult = (bInitDoc || bStatus) && GetRawValue().IsEmpty();
2683*3ac0a46fSAndroid Build Coastguard Worker if (script) {
2684*3ac0a46fSAndroid Build Coastguard Worker CXFA_EventParam eParam;
2685*3ac0a46fSAndroid Build Coastguard Worker eParam.m_eType = XFA_EVENT_Validate;
2686*3ac0a46fSAndroid Build Coastguard Worker std::tie(iRet, bRet) = ExecuteBoolScript(pDocView, script, &eParam);
2687*3ac0a46fSAndroid Build Coastguard Worker }
2688*3ac0a46fSAndroid Build Coastguard Worker
2689*3ac0a46fSAndroid Build Coastguard Worker XFA_VERSION version = pDocView->GetDoc()->GetXFADoc()->GetCurVersionMode();
2690*3ac0a46fSAndroid Build Coastguard Worker bool bVersionFlag = version < XFA_VERSION_208;
2691*3ac0a46fSAndroid Build Coastguard Worker
2692*3ac0a46fSAndroid Build Coastguard Worker if (bInitDoc) {
2693*3ac0a46fSAndroid Build Coastguard Worker validate->ClearFlag(XFA_NodeFlag::kNeedsInitApp);
2694*3ac0a46fSAndroid Build Coastguard Worker } else {
2695*3ac0a46fSAndroid Build Coastguard Worker iFormat = ProcessFormatTestValidate(pDocView, validate, bVersionFlag);
2696*3ac0a46fSAndroid Build Coastguard Worker if (!bVersionFlag)
2697*3ac0a46fSAndroid Build Coastguard Worker bVersionFlag = pDocView->GetDoc()->GetXFADoc()->is_scripting();
2698*3ac0a46fSAndroid Build Coastguard Worker XFA_EventErrorAccumulate(
2699*3ac0a46fSAndroid Build Coastguard Worker &iRet,
2700*3ac0a46fSAndroid Build Coastguard Worker ProcessNullTestValidate(pDocView, validate, iFlags, bVersionFlag));
2701*3ac0a46fSAndroid Build Coastguard Worker }
2702*3ac0a46fSAndroid Build Coastguard Worker if (iRet == XFA_EventError::kSuccess && iFormat != XFA_EventError::kSuccess &&
2703*3ac0a46fSAndroid Build Coastguard Worker hasBoolResult && !bRet) {
2704*3ac0a46fSAndroid Build Coastguard Worker ProcessScriptTestValidate(pDocView, validate, bVersionFlag);
2705*3ac0a46fSAndroid Build Coastguard Worker }
2706*3ac0a46fSAndroid Build Coastguard Worker XFA_EventErrorAccumulate(&iRet, iFormat);
2707*3ac0a46fSAndroid Build Coastguard Worker return iRet;
2708*3ac0a46fSAndroid Build Coastguard Worker }
2709*3ac0a46fSAndroid Build Coastguard Worker
GetValidateCaptionName(bool bVersionFlag)2710*3ac0a46fSAndroid Build Coastguard Worker WideString CXFA_Node::GetValidateCaptionName(bool bVersionFlag) {
2711*3ac0a46fSAndroid Build Coastguard Worker WideString wsCaptionName;
2712*3ac0a46fSAndroid Build Coastguard Worker
2713*3ac0a46fSAndroid Build Coastguard Worker if (!bVersionFlag) {
2714*3ac0a46fSAndroid Build Coastguard Worker CXFA_Caption* caption = GetCaptionIfExists();
2715*3ac0a46fSAndroid Build Coastguard Worker if (caption) {
2716*3ac0a46fSAndroid Build Coastguard Worker CXFA_Value* capValue = caption->GetValueIfExists();
2717*3ac0a46fSAndroid Build Coastguard Worker if (capValue) {
2718*3ac0a46fSAndroid Build Coastguard Worker CXFA_Text* captionText = capValue->GetTextIfExists();
2719*3ac0a46fSAndroid Build Coastguard Worker if (captionText)
2720*3ac0a46fSAndroid Build Coastguard Worker wsCaptionName = captionText->GetContent();
2721*3ac0a46fSAndroid Build Coastguard Worker }
2722*3ac0a46fSAndroid Build Coastguard Worker }
2723*3ac0a46fSAndroid Build Coastguard Worker }
2724*3ac0a46fSAndroid Build Coastguard Worker if (!wsCaptionName.IsEmpty())
2725*3ac0a46fSAndroid Build Coastguard Worker return wsCaptionName;
2726*3ac0a46fSAndroid Build Coastguard Worker return JSObject()->GetCData(XFA_Attribute::Name);
2727*3ac0a46fSAndroid Build Coastguard Worker }
2728*3ac0a46fSAndroid Build Coastguard Worker
GetValidateMessage(bool bError,bool bVersionFlag)2729*3ac0a46fSAndroid Build Coastguard Worker WideString CXFA_Node::GetValidateMessage(bool bError, bool bVersionFlag) {
2730*3ac0a46fSAndroid Build Coastguard Worker WideString wsCaptionName = GetValidateCaptionName(bVersionFlag);
2731*3ac0a46fSAndroid Build Coastguard Worker if (bVersionFlag)
2732*3ac0a46fSAndroid Build Coastguard Worker return wsCaptionName + L" validation failed";
2733*3ac0a46fSAndroid Build Coastguard Worker WideString result =
2734*3ac0a46fSAndroid Build Coastguard Worker L"The value you entered for " + wsCaptionName + L" is invalid.";
2735*3ac0a46fSAndroid Build Coastguard Worker if (!bError) {
2736*3ac0a46fSAndroid Build Coastguard Worker result +=
2737*3ac0a46fSAndroid Build Coastguard Worker L" To ignore validations for " + wsCaptionName + L", click Ignore.";
2738*3ac0a46fSAndroid Build Coastguard Worker }
2739*3ac0a46fSAndroid Build Coastguard Worker return result;
2740*3ac0a46fSAndroid Build Coastguard Worker }
2741*3ac0a46fSAndroid Build Coastguard Worker
ExecuteScript(CXFA_FFDocView * pDocView,CXFA_Script * script,CXFA_EventParam * pEventParam)2742*3ac0a46fSAndroid Build Coastguard Worker XFA_EventError CXFA_Node::ExecuteScript(CXFA_FFDocView* pDocView,
2743*3ac0a46fSAndroid Build Coastguard Worker CXFA_Script* script,
2744*3ac0a46fSAndroid Build Coastguard Worker CXFA_EventParam* pEventParam) {
2745*3ac0a46fSAndroid Build Coastguard Worker return ExecuteBoolScript(pDocView, script, pEventParam).first;
2746*3ac0a46fSAndroid Build Coastguard Worker }
2747*3ac0a46fSAndroid Build Coastguard Worker
ExecuteBoolScript(CXFA_FFDocView * pDocView,CXFA_Script * script,CXFA_EventParam * pEventParam)2748*3ac0a46fSAndroid Build Coastguard Worker std::pair<XFA_EventError, bool> CXFA_Node::ExecuteBoolScript(
2749*3ac0a46fSAndroid Build Coastguard Worker CXFA_FFDocView* pDocView,
2750*3ac0a46fSAndroid Build Coastguard Worker CXFA_Script* script,
2751*3ac0a46fSAndroid Build Coastguard Worker CXFA_EventParam* pEventParam) {
2752*3ac0a46fSAndroid Build Coastguard Worker if (m_ExecuteRecursionDepth > kMaxExecuteRecursion)
2753*3ac0a46fSAndroid Build Coastguard Worker return {XFA_EventError::kSuccess, false};
2754*3ac0a46fSAndroid Build Coastguard Worker
2755*3ac0a46fSAndroid Build Coastguard Worker DCHECK(pEventParam);
2756*3ac0a46fSAndroid Build Coastguard Worker if (!script)
2757*3ac0a46fSAndroid Build Coastguard Worker return {XFA_EventError::kNotExist, false};
2758*3ac0a46fSAndroid Build Coastguard Worker if (script->GetRunAt() == XFA_AttributeValue::Server)
2759*3ac0a46fSAndroid Build Coastguard Worker return {XFA_EventError::kDisabled, false};
2760*3ac0a46fSAndroid Build Coastguard Worker
2761*3ac0a46fSAndroid Build Coastguard Worker WideString wsExpression = script->GetExpression();
2762*3ac0a46fSAndroid Build Coastguard Worker if (wsExpression.IsEmpty())
2763*3ac0a46fSAndroid Build Coastguard Worker return {XFA_EventError::kNotExist, false};
2764*3ac0a46fSAndroid Build Coastguard Worker
2765*3ac0a46fSAndroid Build Coastguard Worker CXFA_Script::Type eScriptType = script->GetContentType();
2766*3ac0a46fSAndroid Build Coastguard Worker if (eScriptType == CXFA_Script::Type::Unknown)
2767*3ac0a46fSAndroid Build Coastguard Worker return {XFA_EventError::kSuccess, false};
2768*3ac0a46fSAndroid Build Coastguard Worker
2769*3ac0a46fSAndroid Build Coastguard Worker CXFA_FFDoc* pDoc = pDocView->GetDoc();
2770*3ac0a46fSAndroid Build Coastguard Worker CFXJSE_Engine* pContext = pDoc->GetXFADoc()->GetScriptContext();
2771*3ac0a46fSAndroid Build Coastguard Worker CFXJSE_Engine::EventParamScope paramScope(
2772*3ac0a46fSAndroid Build Coastguard Worker pContext, pEventParam->m_bTargeted ? this : nullptr, pEventParam);
2773*3ac0a46fSAndroid Build Coastguard Worker pContext->SetRunAtType(script->GetRunAt());
2774*3ac0a46fSAndroid Build Coastguard Worker
2775*3ac0a46fSAndroid Build Coastguard Worker std::vector<cppgc::Persistent<CXFA_Node>> refNodes;
2776*3ac0a46fSAndroid Build Coastguard Worker if (pEventParam->m_eType == XFA_EVENT_InitCalculate ||
2777*3ac0a46fSAndroid Build Coastguard Worker pEventParam->m_eType == XFA_EVENT_Calculate) {
2778*3ac0a46fSAndroid Build Coastguard Worker pContext->SetNodesOfRunScript(&refNodes);
2779*3ac0a46fSAndroid Build Coastguard Worker }
2780*3ac0a46fSAndroid Build Coastguard Worker
2781*3ac0a46fSAndroid Build Coastguard Worker auto pTmpRetValue = std::make_unique<CFXJSE_Value>();
2782*3ac0a46fSAndroid Build Coastguard Worker bool bRet = false;
2783*3ac0a46fSAndroid Build Coastguard Worker {
2784*3ac0a46fSAndroid Build Coastguard Worker AutoRestorer<uint8_t> restorer(&m_ExecuteRecursionDepth);
2785*3ac0a46fSAndroid Build Coastguard Worker ++m_ExecuteRecursionDepth;
2786*3ac0a46fSAndroid Build Coastguard Worker bRet = pContext->RunScript(eScriptType, wsExpression.AsStringView(),
2787*3ac0a46fSAndroid Build Coastguard Worker pTmpRetValue.get(), this);
2788*3ac0a46fSAndroid Build Coastguard Worker }
2789*3ac0a46fSAndroid Build Coastguard Worker
2790*3ac0a46fSAndroid Build Coastguard Worker XFA_EventError iRet = XFA_EventError::kError;
2791*3ac0a46fSAndroid Build Coastguard Worker if (bRet) {
2792*3ac0a46fSAndroid Build Coastguard Worker iRet = XFA_EventError::kSuccess;
2793*3ac0a46fSAndroid Build Coastguard Worker if (pEventParam->m_eType == XFA_EVENT_Calculate ||
2794*3ac0a46fSAndroid Build Coastguard Worker pEventParam->m_eType == XFA_EVENT_InitCalculate) {
2795*3ac0a46fSAndroid Build Coastguard Worker if (!pTmpRetValue->IsUndefined(pContext->GetIsolate())) {
2796*3ac0a46fSAndroid Build Coastguard Worker if (!pTmpRetValue->IsNull(pContext->GetIsolate()))
2797*3ac0a46fSAndroid Build Coastguard Worker pEventParam->m_wsResult =
2798*3ac0a46fSAndroid Build Coastguard Worker pTmpRetValue->ToWideString(pContext->GetIsolate());
2799*3ac0a46fSAndroid Build Coastguard Worker
2800*3ac0a46fSAndroid Build Coastguard Worker iRet = XFA_EventError::kSuccess;
2801*3ac0a46fSAndroid Build Coastguard Worker } else {
2802*3ac0a46fSAndroid Build Coastguard Worker iRet = XFA_EventError::kError;
2803*3ac0a46fSAndroid Build Coastguard Worker }
2804*3ac0a46fSAndroid Build Coastguard Worker if (pEventParam->m_eType == XFA_EVENT_InitCalculate) {
2805*3ac0a46fSAndroid Build Coastguard Worker if ((iRet == XFA_EventError::kSuccess) &&
2806*3ac0a46fSAndroid Build Coastguard Worker (GetRawValue() != pEventParam->m_wsResult)) {
2807*3ac0a46fSAndroid Build Coastguard Worker SetValue(XFA_ValuePicture::kRaw, pEventParam->m_wsResult);
2808*3ac0a46fSAndroid Build Coastguard Worker pDocView->AddValidateNode(this);
2809*3ac0a46fSAndroid Build Coastguard Worker }
2810*3ac0a46fSAndroid Build Coastguard Worker }
2811*3ac0a46fSAndroid Build Coastguard Worker for (CXFA_Node* pRefNode : refNodes) {
2812*3ac0a46fSAndroid Build Coastguard Worker if (pRefNode == this)
2813*3ac0a46fSAndroid Build Coastguard Worker continue;
2814*3ac0a46fSAndroid Build Coastguard Worker
2815*3ac0a46fSAndroid Build Coastguard Worker CJX_Object::CalcData* pGlobalData =
2816*3ac0a46fSAndroid Build Coastguard Worker pRefNode->JSObject()->GetOrCreateCalcData(pDoc->GetHeap());
2817*3ac0a46fSAndroid Build Coastguard Worker if (!pdfium::Contains(pGlobalData->m_Globals, this))
2818*3ac0a46fSAndroid Build Coastguard Worker pGlobalData->m_Globals.push_back(this);
2819*3ac0a46fSAndroid Build Coastguard Worker }
2820*3ac0a46fSAndroid Build Coastguard Worker }
2821*3ac0a46fSAndroid Build Coastguard Worker }
2822*3ac0a46fSAndroid Build Coastguard Worker pContext->SetNodesOfRunScript(nullptr);
2823*3ac0a46fSAndroid Build Coastguard Worker
2824*3ac0a46fSAndroid Build Coastguard Worker return {iRet, pTmpRetValue->IsBoolean(pContext->GetIsolate()) &&
2825*3ac0a46fSAndroid Build Coastguard Worker pTmpRetValue->ToBoolean(pContext->GetIsolate())};
2826*3ac0a46fSAndroid Build Coastguard Worker }
2827*3ac0a46fSAndroid Build Coastguard Worker
2828*3ac0a46fSAndroid Build Coastguard Worker std::pair<XFA_FFWidgetType, CXFA_Ui*>
CreateChildUIAndValueNodesIfNeeded()2829*3ac0a46fSAndroid Build Coastguard Worker CXFA_Node::CreateChildUIAndValueNodesIfNeeded() {
2830*3ac0a46fSAndroid Build Coastguard Worker XFA_Element eType = GetElementType();
2831*3ac0a46fSAndroid Build Coastguard Worker DCHECK(eType == XFA_Element::Field || eType == XFA_Element::Draw);
2832*3ac0a46fSAndroid Build Coastguard Worker
2833*3ac0a46fSAndroid Build Coastguard Worker // Both Field and Draw have a UI property. We should always be able to
2834*3ac0a46fSAndroid Build Coastguard Worker // retrieve or create the UI element. If we can't something is wrong.
2835*3ac0a46fSAndroid Build Coastguard Worker CXFA_Ui* pUI = JSObject()->GetOrCreateProperty<CXFA_Ui>(0, XFA_Element::Ui);
2836*3ac0a46fSAndroid Build Coastguard Worker DCHECK(pUI);
2837*3ac0a46fSAndroid Build Coastguard Worker
2838*3ac0a46fSAndroid Build Coastguard Worker CXFA_Node* pUIChild = nullptr;
2839*3ac0a46fSAndroid Build Coastguard Worker // Search through the children of the UI node to see if we have any of our
2840*3ac0a46fSAndroid Build Coastguard Worker // One-Of entries. If so, that is the node associated with our UI.
2841*3ac0a46fSAndroid Build Coastguard Worker for (CXFA_Node* pChild = pUI->GetFirstChild(); pChild;
2842*3ac0a46fSAndroid Build Coastguard Worker pChild = pChild->GetNextSibling()) {
2843*3ac0a46fSAndroid Build Coastguard Worker if (pUI->IsAOneOfChild(pChild)) {
2844*3ac0a46fSAndroid Build Coastguard Worker pUIChild = pChild;
2845*3ac0a46fSAndroid Build Coastguard Worker break;
2846*3ac0a46fSAndroid Build Coastguard Worker }
2847*3ac0a46fSAndroid Build Coastguard Worker }
2848*3ac0a46fSAndroid Build Coastguard Worker
2849*3ac0a46fSAndroid Build Coastguard Worker XFA_FFWidgetType widget_type = XFA_FFWidgetType::kNone;
2850*3ac0a46fSAndroid Build Coastguard Worker XFA_Element expected_ui_child_type = XFA_Element::Unknown;
2851*3ac0a46fSAndroid Build Coastguard Worker
2852*3ac0a46fSAndroid Build Coastguard Worker // Both Field and Draw nodes have a Value child. So, we should either always
2853*3ac0a46fSAndroid Build Coastguard Worker // have it, or always create it. If we don't get the Value child for some
2854*3ac0a46fSAndroid Build Coastguard Worker // reason something has gone really wrong.
2855*3ac0a46fSAndroid Build Coastguard Worker CXFA_Value* value =
2856*3ac0a46fSAndroid Build Coastguard Worker JSObject()->GetOrCreateProperty<CXFA_Value>(0, XFA_Element::Value);
2857*3ac0a46fSAndroid Build Coastguard Worker DCHECK(value);
2858*3ac0a46fSAndroid Build Coastguard Worker
2859*3ac0a46fSAndroid Build Coastguard Worker // The Value nodes only have One-Of children. So, if we have a first child
2860*3ac0a46fSAndroid Build Coastguard Worker // that child must be the type we want to use.
2861*3ac0a46fSAndroid Build Coastguard Worker CXFA_Node* child = value->GetFirstChild();
2862*3ac0a46fSAndroid Build Coastguard Worker if (child) {
2863*3ac0a46fSAndroid Build Coastguard Worker switch (child->GetElementType()) {
2864*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::Boolean:
2865*3ac0a46fSAndroid Build Coastguard Worker expected_ui_child_type = XFA_Element::CheckButton;
2866*3ac0a46fSAndroid Build Coastguard Worker break;
2867*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::Integer:
2868*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::Decimal:
2869*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::Float:
2870*3ac0a46fSAndroid Build Coastguard Worker expected_ui_child_type = XFA_Element::NumericEdit;
2871*3ac0a46fSAndroid Build Coastguard Worker break;
2872*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::ExData:
2873*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::Text:
2874*3ac0a46fSAndroid Build Coastguard Worker expected_ui_child_type = XFA_Element::TextEdit;
2875*3ac0a46fSAndroid Build Coastguard Worker widget_type = XFA_FFWidgetType::kText;
2876*3ac0a46fSAndroid Build Coastguard Worker break;
2877*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::Date:
2878*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::Time:
2879*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::DateTime:
2880*3ac0a46fSAndroid Build Coastguard Worker expected_ui_child_type = XFA_Element::DateTimeEdit;
2881*3ac0a46fSAndroid Build Coastguard Worker break;
2882*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::Image:
2883*3ac0a46fSAndroid Build Coastguard Worker expected_ui_child_type = XFA_Element::ImageEdit;
2884*3ac0a46fSAndroid Build Coastguard Worker widget_type = XFA_FFWidgetType::kImage;
2885*3ac0a46fSAndroid Build Coastguard Worker break;
2886*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::Arc:
2887*3ac0a46fSAndroid Build Coastguard Worker expected_ui_child_type = XFA_Element::DefaultUi;
2888*3ac0a46fSAndroid Build Coastguard Worker widget_type = XFA_FFWidgetType::kArc;
2889*3ac0a46fSAndroid Build Coastguard Worker break;
2890*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::Line:
2891*3ac0a46fSAndroid Build Coastguard Worker expected_ui_child_type = XFA_Element::DefaultUi;
2892*3ac0a46fSAndroid Build Coastguard Worker widget_type = XFA_FFWidgetType::kLine;
2893*3ac0a46fSAndroid Build Coastguard Worker break;
2894*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::Rectangle:
2895*3ac0a46fSAndroid Build Coastguard Worker expected_ui_child_type = XFA_Element::DefaultUi;
2896*3ac0a46fSAndroid Build Coastguard Worker widget_type = XFA_FFWidgetType::kRectangle;
2897*3ac0a46fSAndroid Build Coastguard Worker break;
2898*3ac0a46fSAndroid Build Coastguard Worker default:
2899*3ac0a46fSAndroid Build Coastguard Worker break;
2900*3ac0a46fSAndroid Build Coastguard Worker }
2901*3ac0a46fSAndroid Build Coastguard Worker }
2902*3ac0a46fSAndroid Build Coastguard Worker
2903*3ac0a46fSAndroid Build Coastguard Worker if (eType == XFA_Element::Draw) {
2904*3ac0a46fSAndroid Build Coastguard Worker if (pUIChild && pUIChild->GetElementType() == XFA_Element::TextEdit) {
2905*3ac0a46fSAndroid Build Coastguard Worker widget_type = XFA_FFWidgetType::kText;
2906*3ac0a46fSAndroid Build Coastguard Worker } else if (pUIChild &&
2907*3ac0a46fSAndroid Build Coastguard Worker pUIChild->GetElementType() == XFA_Element::ImageEdit) {
2908*3ac0a46fSAndroid Build Coastguard Worker widget_type = XFA_FFWidgetType::kImage;
2909*3ac0a46fSAndroid Build Coastguard Worker } else if (widget_type == XFA_FFWidgetType::kNone) {
2910*3ac0a46fSAndroid Build Coastguard Worker widget_type = XFA_FFWidgetType::kText;
2911*3ac0a46fSAndroid Build Coastguard Worker }
2912*3ac0a46fSAndroid Build Coastguard Worker } else if (eType == XFA_Element::Field) {
2913*3ac0a46fSAndroid Build Coastguard Worker if (pUIChild && pUIChild->GetElementType() == XFA_Element::DefaultUi) {
2914*3ac0a46fSAndroid Build Coastguard Worker widget_type = XFA_FFWidgetType::kTextEdit;
2915*3ac0a46fSAndroid Build Coastguard Worker } else if (pUIChild) {
2916*3ac0a46fSAndroid Build Coastguard Worker widget_type = pUIChild->GetDefaultFFWidgetType();
2917*3ac0a46fSAndroid Build Coastguard Worker } else if (expected_ui_child_type == XFA_Element::Unknown) {
2918*3ac0a46fSAndroid Build Coastguard Worker widget_type = XFA_FFWidgetType::kTextEdit;
2919*3ac0a46fSAndroid Build Coastguard Worker }
2920*3ac0a46fSAndroid Build Coastguard Worker } else {
2921*3ac0a46fSAndroid Build Coastguard Worker NOTREACHED_NORETURN();
2922*3ac0a46fSAndroid Build Coastguard Worker }
2923*3ac0a46fSAndroid Build Coastguard Worker
2924*3ac0a46fSAndroid Build Coastguard Worker if (!pUIChild) {
2925*3ac0a46fSAndroid Build Coastguard Worker if (expected_ui_child_type == XFA_Element::Unknown)
2926*3ac0a46fSAndroid Build Coastguard Worker expected_ui_child_type = XFA_Element::TextEdit;
2927*3ac0a46fSAndroid Build Coastguard Worker pUIChild = pUI->JSObject()->GetOrCreateProperty<CXFA_Node>(
2928*3ac0a46fSAndroid Build Coastguard Worker 0, expected_ui_child_type);
2929*3ac0a46fSAndroid Build Coastguard Worker }
2930*3ac0a46fSAndroid Build Coastguard Worker
2931*3ac0a46fSAndroid Build Coastguard Worker CreateValueNodeIfNeeded(value, pUIChild);
2932*3ac0a46fSAndroid Build Coastguard Worker return {widget_type, pUI};
2933*3ac0a46fSAndroid Build Coastguard Worker }
2934*3ac0a46fSAndroid Build Coastguard Worker
GetDefaultFFWidgetType() const2935*3ac0a46fSAndroid Build Coastguard Worker XFA_FFWidgetType CXFA_Node::GetDefaultFFWidgetType() const {
2936*3ac0a46fSAndroid Build Coastguard Worker NOTREACHED_NORETURN();
2937*3ac0a46fSAndroid Build Coastguard Worker }
2938*3ac0a46fSAndroid Build Coastguard Worker
CreateUINodeIfNeeded(CXFA_Ui * ui,XFA_Element type)2939*3ac0a46fSAndroid Build Coastguard Worker CXFA_Node* CXFA_Node::CreateUINodeIfNeeded(CXFA_Ui* ui, XFA_Element type) {
2940*3ac0a46fSAndroid Build Coastguard Worker return ui->JSObject()->GetOrCreateProperty<CXFA_Node>(0, type);
2941*3ac0a46fSAndroid Build Coastguard Worker }
2942*3ac0a46fSAndroid Build Coastguard Worker
CreateValueNodeIfNeeded(CXFA_Value * value,CXFA_Node * pUIChild)2943*3ac0a46fSAndroid Build Coastguard Worker void CXFA_Node::CreateValueNodeIfNeeded(CXFA_Value* value,
2944*3ac0a46fSAndroid Build Coastguard Worker CXFA_Node* pUIChild) {
2945*3ac0a46fSAndroid Build Coastguard Worker // Value nodes only have one child. If we have one already we're done.
2946*3ac0a46fSAndroid Build Coastguard Worker if (value->GetFirstChild())
2947*3ac0a46fSAndroid Build Coastguard Worker return;
2948*3ac0a46fSAndroid Build Coastguard Worker
2949*3ac0a46fSAndroid Build Coastguard Worker // Create the Value node for our UI if needed.
2950*3ac0a46fSAndroid Build Coastguard Worker XFA_Element valueType = pUIChild->GetValueNodeType();
2951*3ac0a46fSAndroid Build Coastguard Worker if (pUIChild->GetElementType() == XFA_Element::CheckButton) {
2952*3ac0a46fSAndroid Build Coastguard Worker CXFA_Items* pItems = GetChild<CXFA_Items>(0, XFA_Element::Items, false);
2953*3ac0a46fSAndroid Build Coastguard Worker if (pItems) {
2954*3ac0a46fSAndroid Build Coastguard Worker CXFA_Node* pItem =
2955*3ac0a46fSAndroid Build Coastguard Worker pItems->GetChild<CXFA_Node>(0, XFA_Element::Unknown, false);
2956*3ac0a46fSAndroid Build Coastguard Worker if (pItem)
2957*3ac0a46fSAndroid Build Coastguard Worker valueType = pItem->GetElementType();
2958*3ac0a46fSAndroid Build Coastguard Worker }
2959*3ac0a46fSAndroid Build Coastguard Worker }
2960*3ac0a46fSAndroid Build Coastguard Worker value->JSObject()->GetOrCreateProperty<CXFA_Node>(0, valueType);
2961*3ac0a46fSAndroid Build Coastguard Worker }
2962*3ac0a46fSAndroid Build Coastguard Worker
GetValueNodeType() const2963*3ac0a46fSAndroid Build Coastguard Worker XFA_Element CXFA_Node::GetValueNodeType() const {
2964*3ac0a46fSAndroid Build Coastguard Worker return XFA_Element::Text;
2965*3ac0a46fSAndroid Build Coastguard Worker }
2966*3ac0a46fSAndroid Build Coastguard Worker
GetUIChildNode()2967*3ac0a46fSAndroid Build Coastguard Worker CXFA_Node* CXFA_Node::GetUIChildNode() {
2968*3ac0a46fSAndroid Build Coastguard Worker DCHECK(HasCreatedUIWidget());
2969*3ac0a46fSAndroid Build Coastguard Worker
2970*3ac0a46fSAndroid Build Coastguard Worker if (ff_widget_type_ != XFA_FFWidgetType::kNone)
2971*3ac0a46fSAndroid Build Coastguard Worker return ui_ ? ui_->GetFirstChild() : nullptr;
2972*3ac0a46fSAndroid Build Coastguard Worker
2973*3ac0a46fSAndroid Build Coastguard Worker XFA_Element type = GetElementType();
2974*3ac0a46fSAndroid Build Coastguard Worker if (type == XFA_Element::Field || type == XFA_Element::Draw) {
2975*3ac0a46fSAndroid Build Coastguard Worker std::tie(ff_widget_type_, ui_) = CreateChildUIAndValueNodesIfNeeded();
2976*3ac0a46fSAndroid Build Coastguard Worker } else if (type == XFA_Element::Subform) {
2977*3ac0a46fSAndroid Build Coastguard Worker ff_widget_type_ = XFA_FFWidgetType::kSubform;
2978*3ac0a46fSAndroid Build Coastguard Worker } else if (type == XFA_Element::ExclGroup) {
2979*3ac0a46fSAndroid Build Coastguard Worker ff_widget_type_ = XFA_FFWidgetType::kExclGroup;
2980*3ac0a46fSAndroid Build Coastguard Worker } else {
2981*3ac0a46fSAndroid Build Coastguard Worker NOTREACHED_NORETURN();
2982*3ac0a46fSAndroid Build Coastguard Worker }
2983*3ac0a46fSAndroid Build Coastguard Worker return ui_ ? ui_->GetFirstChild() : nullptr;
2984*3ac0a46fSAndroid Build Coastguard Worker }
2985*3ac0a46fSAndroid Build Coastguard Worker
GetFFWidgetType()2986*3ac0a46fSAndroid Build Coastguard Worker XFA_FFWidgetType CXFA_Node::GetFFWidgetType() {
2987*3ac0a46fSAndroid Build Coastguard Worker GetUIChildNode();
2988*3ac0a46fSAndroid Build Coastguard Worker return ff_widget_type_;
2989*3ac0a46fSAndroid Build Coastguard Worker }
2990*3ac0a46fSAndroid Build Coastguard Worker
GetUIBorder()2991*3ac0a46fSAndroid Build Coastguard Worker CXFA_Border* CXFA_Node::GetUIBorder() {
2992*3ac0a46fSAndroid Build Coastguard Worker CXFA_Node* pUIChild = GetUIChildNode();
2993*3ac0a46fSAndroid Build Coastguard Worker return pUIChild ? pUIChild->JSObject()->GetProperty<CXFA_Border>(
2994*3ac0a46fSAndroid Build Coastguard Worker 0, XFA_Element::Border)
2995*3ac0a46fSAndroid Build Coastguard Worker : nullptr;
2996*3ac0a46fSAndroid Build Coastguard Worker }
2997*3ac0a46fSAndroid Build Coastguard Worker
GetUIMargin()2998*3ac0a46fSAndroid Build Coastguard Worker CFX_RectF CXFA_Node::GetUIMargin() {
2999*3ac0a46fSAndroid Build Coastguard Worker CXFA_Node* pUIChild = GetUIChildNode();
3000*3ac0a46fSAndroid Build Coastguard Worker if (!pUIChild)
3001*3ac0a46fSAndroid Build Coastguard Worker return CFX_RectF();
3002*3ac0a46fSAndroid Build Coastguard Worker
3003*3ac0a46fSAndroid Build Coastguard Worker CXFA_Margin* mgUI =
3004*3ac0a46fSAndroid Build Coastguard Worker pUIChild->JSObject()->GetProperty<CXFA_Margin>(0, XFA_Element::Margin);
3005*3ac0a46fSAndroid Build Coastguard Worker if (!mgUI)
3006*3ac0a46fSAndroid Build Coastguard Worker return CFX_RectF();
3007*3ac0a46fSAndroid Build Coastguard Worker
3008*3ac0a46fSAndroid Build Coastguard Worker CXFA_Border* border = GetUIBorder();
3009*3ac0a46fSAndroid Build Coastguard Worker if (border && border->GetPresence() != XFA_AttributeValue::Visible)
3010*3ac0a46fSAndroid Build Coastguard Worker return CFX_RectF();
3011*3ac0a46fSAndroid Build Coastguard Worker
3012*3ac0a46fSAndroid Build Coastguard Worker absl::optional<float> left = mgUI->TryLeftInset();
3013*3ac0a46fSAndroid Build Coastguard Worker absl::optional<float> top = mgUI->TryTopInset();
3014*3ac0a46fSAndroid Build Coastguard Worker absl::optional<float> right = mgUI->TryRightInset();
3015*3ac0a46fSAndroid Build Coastguard Worker absl::optional<float> bottom = mgUI->TryBottomInset();
3016*3ac0a46fSAndroid Build Coastguard Worker if (border) {
3017*3ac0a46fSAndroid Build Coastguard Worker bool bVisible = false;
3018*3ac0a46fSAndroid Build Coastguard Worker float fThickness = 0;
3019*3ac0a46fSAndroid Build Coastguard Worker XFA_AttributeValue iType = XFA_AttributeValue::Unknown;
3020*3ac0a46fSAndroid Build Coastguard Worker std::tie(iType, bVisible, fThickness) = border->Get3DStyle();
3021*3ac0a46fSAndroid Build Coastguard Worker if (!left.has_value() || !top.has_value() || !right.has_value() ||
3022*3ac0a46fSAndroid Build Coastguard Worker !bottom.has_value()) {
3023*3ac0a46fSAndroid Build Coastguard Worker std::vector<CXFA_Stroke*> strokes = border->GetStrokes();
3024*3ac0a46fSAndroid Build Coastguard Worker if (!top.has_value())
3025*3ac0a46fSAndroid Build Coastguard Worker top = GetEdgeThickness(strokes, bVisible, 0);
3026*3ac0a46fSAndroid Build Coastguard Worker if (!right.has_value())
3027*3ac0a46fSAndroid Build Coastguard Worker right = GetEdgeThickness(strokes, bVisible, 1);
3028*3ac0a46fSAndroid Build Coastguard Worker if (!bottom.has_value())
3029*3ac0a46fSAndroid Build Coastguard Worker bottom = GetEdgeThickness(strokes, bVisible, 2);
3030*3ac0a46fSAndroid Build Coastguard Worker if (!left.has_value())
3031*3ac0a46fSAndroid Build Coastguard Worker left = GetEdgeThickness(strokes, bVisible, 3);
3032*3ac0a46fSAndroid Build Coastguard Worker }
3033*3ac0a46fSAndroid Build Coastguard Worker }
3034*3ac0a46fSAndroid Build Coastguard Worker return CFX_RectF(left.value_or(0.0), top.value_or(0.0), right.value_or(0.0),
3035*3ac0a46fSAndroid Build Coastguard Worker bottom.value_or(0.0));
3036*3ac0a46fSAndroid Build Coastguard Worker }
3037*3ac0a46fSAndroid Build Coastguard Worker
GetEventByActivity(XFA_AttributeValue iActivity,bool bIsFormReady)3038*3ac0a46fSAndroid Build Coastguard Worker std::vector<CXFA_Event*> CXFA_Node::GetEventByActivity(
3039*3ac0a46fSAndroid Build Coastguard Worker XFA_AttributeValue iActivity,
3040*3ac0a46fSAndroid Build Coastguard Worker bool bIsFormReady) {
3041*3ac0a46fSAndroid Build Coastguard Worker std::vector<CXFA_Event*> events;
3042*3ac0a46fSAndroid Build Coastguard Worker for (CXFA_Node* node : GetNodeListForType(XFA_Element::Event)) {
3043*3ac0a46fSAndroid Build Coastguard Worker auto* event = static_cast<CXFA_Event*>(node);
3044*3ac0a46fSAndroid Build Coastguard Worker if (event->GetActivity() != iActivity)
3045*3ac0a46fSAndroid Build Coastguard Worker continue;
3046*3ac0a46fSAndroid Build Coastguard Worker
3047*3ac0a46fSAndroid Build Coastguard Worker if (iActivity != XFA_AttributeValue::Ready) {
3048*3ac0a46fSAndroid Build Coastguard Worker events.push_back(event);
3049*3ac0a46fSAndroid Build Coastguard Worker continue;
3050*3ac0a46fSAndroid Build Coastguard Worker }
3051*3ac0a46fSAndroid Build Coastguard Worker
3052*3ac0a46fSAndroid Build Coastguard Worker WideString wsRef = event->GetRef();
3053*3ac0a46fSAndroid Build Coastguard Worker if (bIsFormReady) {
3054*3ac0a46fSAndroid Build Coastguard Worker if (wsRef == WideStringView(L"$form"))
3055*3ac0a46fSAndroid Build Coastguard Worker events.push_back(event);
3056*3ac0a46fSAndroid Build Coastguard Worker continue;
3057*3ac0a46fSAndroid Build Coastguard Worker }
3058*3ac0a46fSAndroid Build Coastguard Worker
3059*3ac0a46fSAndroid Build Coastguard Worker if (wsRef == WideStringView(L"$layout"))
3060*3ac0a46fSAndroid Build Coastguard Worker events.push_back(event);
3061*3ac0a46fSAndroid Build Coastguard Worker }
3062*3ac0a46fSAndroid Build Coastguard Worker return events;
3063*3ac0a46fSAndroid Build Coastguard Worker }
3064*3ac0a46fSAndroid Build Coastguard Worker
ResetData()3065*3ac0a46fSAndroid Build Coastguard Worker void CXFA_Node::ResetData() {
3066*3ac0a46fSAndroid Build Coastguard Worker WideString wsValue;
3067*3ac0a46fSAndroid Build Coastguard Worker switch (GetFFWidgetType()) {
3068*3ac0a46fSAndroid Build Coastguard Worker case XFA_FFWidgetType::kImageEdit: {
3069*3ac0a46fSAndroid Build Coastguard Worker CXFA_Value* imageValue = GetDefaultValueIfExists();
3070*3ac0a46fSAndroid Build Coastguard Worker CXFA_Image* image = imageValue ? imageValue->GetImageIfExists() : nullptr;
3071*3ac0a46fSAndroid Build Coastguard Worker WideString wsContentType, wsHref;
3072*3ac0a46fSAndroid Build Coastguard Worker if (image) {
3073*3ac0a46fSAndroid Build Coastguard Worker wsValue = image->GetContent();
3074*3ac0a46fSAndroid Build Coastguard Worker wsContentType = image->GetContentType();
3075*3ac0a46fSAndroid Build Coastguard Worker wsHref = image->GetHref();
3076*3ac0a46fSAndroid Build Coastguard Worker }
3077*3ac0a46fSAndroid Build Coastguard Worker SetImageEdit(wsContentType, wsHref, wsValue);
3078*3ac0a46fSAndroid Build Coastguard Worker break;
3079*3ac0a46fSAndroid Build Coastguard Worker }
3080*3ac0a46fSAndroid Build Coastguard Worker case XFA_FFWidgetType::kExclGroup: {
3081*3ac0a46fSAndroid Build Coastguard Worker CXFA_Node* pNextChild = GetFirstContainerChild();
3082*3ac0a46fSAndroid Build Coastguard Worker while (pNextChild) {
3083*3ac0a46fSAndroid Build Coastguard Worker CXFA_Node* pChild = pNextChild;
3084*3ac0a46fSAndroid Build Coastguard Worker if (!pChild->IsWidgetReady())
3085*3ac0a46fSAndroid Build Coastguard Worker continue;
3086*3ac0a46fSAndroid Build Coastguard Worker
3087*3ac0a46fSAndroid Build Coastguard Worker bool done = false;
3088*3ac0a46fSAndroid Build Coastguard Worker if (wsValue.IsEmpty()) {
3089*3ac0a46fSAndroid Build Coastguard Worker CXFA_Value* defValue = pChild->GetDefaultValueIfExists();
3090*3ac0a46fSAndroid Build Coastguard Worker if (defValue) {
3091*3ac0a46fSAndroid Build Coastguard Worker wsValue = defValue->GetChildValueContent();
3092*3ac0a46fSAndroid Build Coastguard Worker SetValue(XFA_ValuePicture::kRaw, wsValue);
3093*3ac0a46fSAndroid Build Coastguard Worker pChild->SetValue(XFA_ValuePicture::kRaw, wsValue);
3094*3ac0a46fSAndroid Build Coastguard Worker done = true;
3095*3ac0a46fSAndroid Build Coastguard Worker }
3096*3ac0a46fSAndroid Build Coastguard Worker }
3097*3ac0a46fSAndroid Build Coastguard Worker if (!done) {
3098*3ac0a46fSAndroid Build Coastguard Worker CXFA_Items* pItems =
3099*3ac0a46fSAndroid Build Coastguard Worker pChild->GetChild<CXFA_Items>(0, XFA_Element::Items, false);
3100*3ac0a46fSAndroid Build Coastguard Worker if (!pItems)
3101*3ac0a46fSAndroid Build Coastguard Worker continue;
3102*3ac0a46fSAndroid Build Coastguard Worker
3103*3ac0a46fSAndroid Build Coastguard Worker WideString itemText;
3104*3ac0a46fSAndroid Build Coastguard Worker if (pItems->CountChildren(XFA_Element::Unknown, false) > 1) {
3105*3ac0a46fSAndroid Build Coastguard Worker itemText =
3106*3ac0a46fSAndroid Build Coastguard Worker pItems->GetChild<CXFA_Node>(1, XFA_Element::Unknown, false)
3107*3ac0a46fSAndroid Build Coastguard Worker ->JSObject()
3108*3ac0a46fSAndroid Build Coastguard Worker ->GetContent(false);
3109*3ac0a46fSAndroid Build Coastguard Worker }
3110*3ac0a46fSAndroid Build Coastguard Worker pChild->SetValue(XFA_ValuePicture::kRaw, itemText);
3111*3ac0a46fSAndroid Build Coastguard Worker }
3112*3ac0a46fSAndroid Build Coastguard Worker pNextChild = pChild->GetNextContainerSibling();
3113*3ac0a46fSAndroid Build Coastguard Worker }
3114*3ac0a46fSAndroid Build Coastguard Worker break;
3115*3ac0a46fSAndroid Build Coastguard Worker }
3116*3ac0a46fSAndroid Build Coastguard Worker case XFA_FFWidgetType::kChoiceList:
3117*3ac0a46fSAndroid Build Coastguard Worker ClearAllSelections();
3118*3ac0a46fSAndroid Build Coastguard Worker [[fallthrough]];
3119*3ac0a46fSAndroid Build Coastguard Worker default: {
3120*3ac0a46fSAndroid Build Coastguard Worker CXFA_Value* defValue = GetDefaultValueIfExists();
3121*3ac0a46fSAndroid Build Coastguard Worker if (defValue)
3122*3ac0a46fSAndroid Build Coastguard Worker wsValue = defValue->GetChildValueContent();
3123*3ac0a46fSAndroid Build Coastguard Worker
3124*3ac0a46fSAndroid Build Coastguard Worker SetValue(XFA_ValuePicture::kRaw, wsValue);
3125*3ac0a46fSAndroid Build Coastguard Worker break;
3126*3ac0a46fSAndroid Build Coastguard Worker }
3127*3ac0a46fSAndroid Build Coastguard Worker }
3128*3ac0a46fSAndroid Build Coastguard Worker }
3129*3ac0a46fSAndroid Build Coastguard Worker
SetImageEdit(const WideString & wsContentType,const WideString & wsHref,const WideString & wsData)3130*3ac0a46fSAndroid Build Coastguard Worker void CXFA_Node::SetImageEdit(const WideString& wsContentType,
3131*3ac0a46fSAndroid Build Coastguard Worker const WideString& wsHref,
3132*3ac0a46fSAndroid Build Coastguard Worker const WideString& wsData) {
3133*3ac0a46fSAndroid Build Coastguard Worker CXFA_Value* formValue = GetFormValueIfExists();
3134*3ac0a46fSAndroid Build Coastguard Worker CXFA_Image* image = formValue ? formValue->GetImageIfExists() : nullptr;
3135*3ac0a46fSAndroid Build Coastguard Worker if (image) {
3136*3ac0a46fSAndroid Build Coastguard Worker image->SetContentType(WideString(wsContentType));
3137*3ac0a46fSAndroid Build Coastguard Worker image->SetHref(wsHref);
3138*3ac0a46fSAndroid Build Coastguard Worker }
3139*3ac0a46fSAndroid Build Coastguard Worker
3140*3ac0a46fSAndroid Build Coastguard Worker JSObject()->SetContent(wsData, GetFormatDataValue(wsData), true, false, true);
3141*3ac0a46fSAndroid Build Coastguard Worker
3142*3ac0a46fSAndroid Build Coastguard Worker CXFA_Node* pBind = GetBindData();
3143*3ac0a46fSAndroid Build Coastguard Worker if (!pBind) {
3144*3ac0a46fSAndroid Build Coastguard Worker if (image)
3145*3ac0a46fSAndroid Build Coastguard Worker image->SetTransferEncoding(XFA_AttributeValue::Base64);
3146*3ac0a46fSAndroid Build Coastguard Worker return;
3147*3ac0a46fSAndroid Build Coastguard Worker }
3148*3ac0a46fSAndroid Build Coastguard Worker pBind->JSObject()->SetCData(XFA_Attribute::ContentType, wsContentType);
3149*3ac0a46fSAndroid Build Coastguard Worker CXFA_Node* pHrefNode = pBind->GetFirstChild();
3150*3ac0a46fSAndroid Build Coastguard Worker if (pHrefNode) {
3151*3ac0a46fSAndroid Build Coastguard Worker pHrefNode->JSObject()->SetCData(XFA_Attribute::Value, wsHref);
3152*3ac0a46fSAndroid Build Coastguard Worker return;
3153*3ac0a46fSAndroid Build Coastguard Worker }
3154*3ac0a46fSAndroid Build Coastguard Worker CFX_XMLElement* pElement = ToXMLElement(pBind->GetXMLMappingNode());
3155*3ac0a46fSAndroid Build Coastguard Worker pElement->SetAttribute(L"href", wsHref);
3156*3ac0a46fSAndroid Build Coastguard Worker }
3157*3ac0a46fSAndroid Build Coastguard Worker
CalcCaptionSize(CXFA_FFDoc * doc,CFX_SizeF * pszCap)3158*3ac0a46fSAndroid Build Coastguard Worker void CXFA_Node::CalcCaptionSize(CXFA_FFDoc* doc, CFX_SizeF* pszCap) {
3159*3ac0a46fSAndroid Build Coastguard Worker CXFA_Caption* caption = GetCaptionIfExists();
3160*3ac0a46fSAndroid Build Coastguard Worker if (!caption || !caption->IsVisible())
3161*3ac0a46fSAndroid Build Coastguard Worker return;
3162*3ac0a46fSAndroid Build Coastguard Worker
3163*3ac0a46fSAndroid Build Coastguard Worker LoadCaption(doc);
3164*3ac0a46fSAndroid Build Coastguard Worker
3165*3ac0a46fSAndroid Build Coastguard Worker const float fCapReserve = caption->GetReserve();
3166*3ac0a46fSAndroid Build Coastguard Worker const XFA_AttributeValue iCapPlacement = caption->GetPlacementType();
3167*3ac0a46fSAndroid Build Coastguard Worker const bool bReserveExit = fCapReserve > 0.01;
3168*3ac0a46fSAndroid Build Coastguard Worker const bool bVert = iCapPlacement == XFA_AttributeValue::Top ||
3169*3ac0a46fSAndroid Build Coastguard Worker iCapPlacement == XFA_AttributeValue::Bottom;
3170*3ac0a46fSAndroid Build Coastguard Worker CXFA_TextLayout* pCapTextLayout =
3171*3ac0a46fSAndroid Build Coastguard Worker m_pLayoutData->AsFieldLayoutData()->m_pCapTextLayout;
3172*3ac0a46fSAndroid Build Coastguard Worker if (pCapTextLayout) {
3173*3ac0a46fSAndroid Build Coastguard Worker if (!bVert && GetFFWidgetType() != XFA_FFWidgetType::kButton)
3174*3ac0a46fSAndroid Build Coastguard Worker pszCap->width = fCapReserve;
3175*3ac0a46fSAndroid Build Coastguard Worker
3176*3ac0a46fSAndroid Build Coastguard Worker CFX_SizeF minSize;
3177*3ac0a46fSAndroid Build Coastguard Worker *pszCap = pCapTextLayout->CalcSize(minSize, *pszCap);
3178*3ac0a46fSAndroid Build Coastguard Worker if (bReserveExit)
3179*3ac0a46fSAndroid Build Coastguard Worker bVert ? pszCap->height = fCapReserve : pszCap->width = fCapReserve;
3180*3ac0a46fSAndroid Build Coastguard Worker } else {
3181*3ac0a46fSAndroid Build Coastguard Worker float fFontSize = 10.0f;
3182*3ac0a46fSAndroid Build Coastguard Worker CXFA_Font* font = caption->GetFontIfExists();
3183*3ac0a46fSAndroid Build Coastguard Worker if (font) {
3184*3ac0a46fSAndroid Build Coastguard Worker fFontSize = font->GetFontSize();
3185*3ac0a46fSAndroid Build Coastguard Worker } else {
3186*3ac0a46fSAndroid Build Coastguard Worker CXFA_Font* widgetfont = GetFontIfExists();
3187*3ac0a46fSAndroid Build Coastguard Worker if (widgetfont)
3188*3ac0a46fSAndroid Build Coastguard Worker fFontSize = widgetfont->GetFontSize();
3189*3ac0a46fSAndroid Build Coastguard Worker }
3190*3ac0a46fSAndroid Build Coastguard Worker
3191*3ac0a46fSAndroid Build Coastguard Worker if (bVert) {
3192*3ac0a46fSAndroid Build Coastguard Worker pszCap->height = fCapReserve > 0 ? fCapReserve : fFontSize;
3193*3ac0a46fSAndroid Build Coastguard Worker } else {
3194*3ac0a46fSAndroid Build Coastguard Worker pszCap->width = fCapReserve > 0 ? fCapReserve : 0;
3195*3ac0a46fSAndroid Build Coastguard Worker pszCap->height = fFontSize;
3196*3ac0a46fSAndroid Build Coastguard Worker }
3197*3ac0a46fSAndroid Build Coastguard Worker }
3198*3ac0a46fSAndroid Build Coastguard Worker
3199*3ac0a46fSAndroid Build Coastguard Worker CXFA_Margin* captionMargin = caption->GetMarginIfExists();
3200*3ac0a46fSAndroid Build Coastguard Worker if (!captionMargin)
3201*3ac0a46fSAndroid Build Coastguard Worker return;
3202*3ac0a46fSAndroid Build Coastguard Worker
3203*3ac0a46fSAndroid Build Coastguard Worker float fLeftInset = captionMargin->GetLeftInset();
3204*3ac0a46fSAndroid Build Coastguard Worker float fTopInset = captionMargin->GetTopInset();
3205*3ac0a46fSAndroid Build Coastguard Worker float fRightInset = captionMargin->GetRightInset();
3206*3ac0a46fSAndroid Build Coastguard Worker float fBottomInset = captionMargin->GetBottomInset();
3207*3ac0a46fSAndroid Build Coastguard Worker if (bReserveExit) {
3208*3ac0a46fSAndroid Build Coastguard Worker bVert ? (pszCap->width += fLeftInset + fRightInset)
3209*3ac0a46fSAndroid Build Coastguard Worker : (pszCap->height += fTopInset + fBottomInset);
3210*3ac0a46fSAndroid Build Coastguard Worker } else {
3211*3ac0a46fSAndroid Build Coastguard Worker pszCap->width += fLeftInset + fRightInset;
3212*3ac0a46fSAndroid Build Coastguard Worker pszCap->height += fTopInset + fBottomInset;
3213*3ac0a46fSAndroid Build Coastguard Worker }
3214*3ac0a46fSAndroid Build Coastguard Worker }
3215*3ac0a46fSAndroid Build Coastguard Worker
CalculateFieldAutoSize(CXFA_FFDoc * doc,CFX_SizeF * pSize)3216*3ac0a46fSAndroid Build Coastguard Worker bool CXFA_Node::CalculateFieldAutoSize(CXFA_FFDoc* doc, CFX_SizeF* pSize) {
3217*3ac0a46fSAndroid Build Coastguard Worker CFX_SizeF szCap;
3218*3ac0a46fSAndroid Build Coastguard Worker CalcCaptionSize(doc, &szCap);
3219*3ac0a46fSAndroid Build Coastguard Worker
3220*3ac0a46fSAndroid Build Coastguard Worker CFX_RectF rtUIMargin = GetUIMargin();
3221*3ac0a46fSAndroid Build Coastguard Worker pSize->width += rtUIMargin.left + rtUIMargin.width;
3222*3ac0a46fSAndroid Build Coastguard Worker pSize->height += rtUIMargin.top + rtUIMargin.height;
3223*3ac0a46fSAndroid Build Coastguard Worker if (szCap.width > 0 && szCap.height > 0) {
3224*3ac0a46fSAndroid Build Coastguard Worker CXFA_Caption* caption = GetCaptionIfExists();
3225*3ac0a46fSAndroid Build Coastguard Worker XFA_AttributeValue placement = caption
3226*3ac0a46fSAndroid Build Coastguard Worker ? caption->GetPlacementType()
3227*3ac0a46fSAndroid Build Coastguard Worker : CXFA_Caption::kDefaultPlacementType;
3228*3ac0a46fSAndroid Build Coastguard Worker switch (placement) {
3229*3ac0a46fSAndroid Build Coastguard Worker case XFA_AttributeValue::Left:
3230*3ac0a46fSAndroid Build Coastguard Worker case XFA_AttributeValue::Right:
3231*3ac0a46fSAndroid Build Coastguard Worker case XFA_AttributeValue::Inline: {
3232*3ac0a46fSAndroid Build Coastguard Worker pSize->width += szCap.width;
3233*3ac0a46fSAndroid Build Coastguard Worker pSize->height = std::max(pSize->height, szCap.height);
3234*3ac0a46fSAndroid Build Coastguard Worker } break;
3235*3ac0a46fSAndroid Build Coastguard Worker case XFA_AttributeValue::Top:
3236*3ac0a46fSAndroid Build Coastguard Worker case XFA_AttributeValue::Bottom: {
3237*3ac0a46fSAndroid Build Coastguard Worker pSize->height += szCap.height;
3238*3ac0a46fSAndroid Build Coastguard Worker pSize->width = std::max(pSize->width, szCap.width);
3239*3ac0a46fSAndroid Build Coastguard Worker break;
3240*3ac0a46fSAndroid Build Coastguard Worker }
3241*3ac0a46fSAndroid Build Coastguard Worker default:
3242*3ac0a46fSAndroid Build Coastguard Worker break;
3243*3ac0a46fSAndroid Build Coastguard Worker }
3244*3ac0a46fSAndroid Build Coastguard Worker }
3245*3ac0a46fSAndroid Build Coastguard Worker return CalculateWidgetAutoSize(pSize);
3246*3ac0a46fSAndroid Build Coastguard Worker }
3247*3ac0a46fSAndroid Build Coastguard Worker
CalculateWidgetAutoSize(CFX_SizeF * pSize)3248*3ac0a46fSAndroid Build Coastguard Worker bool CXFA_Node::CalculateWidgetAutoSize(CFX_SizeF* pSize) {
3249*3ac0a46fSAndroid Build Coastguard Worker CXFA_Margin* margin = GetMarginIfExists();
3250*3ac0a46fSAndroid Build Coastguard Worker if (margin) {
3251*3ac0a46fSAndroid Build Coastguard Worker pSize->width += margin->GetLeftInset() + margin->GetRightInset();
3252*3ac0a46fSAndroid Build Coastguard Worker pSize->height += margin->GetTopInset() + margin->GetBottomInset();
3253*3ac0a46fSAndroid Build Coastguard Worker }
3254*3ac0a46fSAndroid Build Coastguard Worker
3255*3ac0a46fSAndroid Build Coastguard Worker CXFA_Para* para = GetParaIfExists();
3256*3ac0a46fSAndroid Build Coastguard Worker if (para)
3257*3ac0a46fSAndroid Build Coastguard Worker pSize->width += para->GetMarginLeft() + para->GetTextIndent();
3258*3ac0a46fSAndroid Build Coastguard Worker
3259*3ac0a46fSAndroid Build Coastguard Worker absl::optional<float> width = TryWidth();
3260*3ac0a46fSAndroid Build Coastguard Worker if (width.has_value()) {
3261*3ac0a46fSAndroid Build Coastguard Worker pSize->width = width.value();
3262*3ac0a46fSAndroid Build Coastguard Worker } else {
3263*3ac0a46fSAndroid Build Coastguard Worker absl::optional<float> min = TryMinWidth();
3264*3ac0a46fSAndroid Build Coastguard Worker if (min.has_value())
3265*3ac0a46fSAndroid Build Coastguard Worker pSize->width = std::max(pSize->width, min.value());
3266*3ac0a46fSAndroid Build Coastguard Worker
3267*3ac0a46fSAndroid Build Coastguard Worker absl::optional<float> max = TryMaxWidth();
3268*3ac0a46fSAndroid Build Coastguard Worker if (max.has_value() && max.value() > 0)
3269*3ac0a46fSAndroid Build Coastguard Worker pSize->width = std::min(pSize->width, max.value());
3270*3ac0a46fSAndroid Build Coastguard Worker }
3271*3ac0a46fSAndroid Build Coastguard Worker
3272*3ac0a46fSAndroid Build Coastguard Worker absl::optional<float> height = TryHeight();
3273*3ac0a46fSAndroid Build Coastguard Worker if (height.has_value()) {
3274*3ac0a46fSAndroid Build Coastguard Worker pSize->height = height.value();
3275*3ac0a46fSAndroid Build Coastguard Worker } else {
3276*3ac0a46fSAndroid Build Coastguard Worker absl::optional<float> min = TryMinHeight();
3277*3ac0a46fSAndroid Build Coastguard Worker if (min.has_value())
3278*3ac0a46fSAndroid Build Coastguard Worker pSize->height = std::max(pSize->height, min.value());
3279*3ac0a46fSAndroid Build Coastguard Worker
3280*3ac0a46fSAndroid Build Coastguard Worker absl::optional<float> max = TryMaxHeight();
3281*3ac0a46fSAndroid Build Coastguard Worker if (max.has_value() && max.value() > 0)
3282*3ac0a46fSAndroid Build Coastguard Worker pSize->height = std::min(pSize->height, max.value());
3283*3ac0a46fSAndroid Build Coastguard Worker }
3284*3ac0a46fSAndroid Build Coastguard Worker return true;
3285*3ac0a46fSAndroid Build Coastguard Worker }
3286*3ac0a46fSAndroid Build Coastguard Worker
CalculateTextContentSize(CXFA_FFDoc * doc,CFX_SizeF * pSize)3287*3ac0a46fSAndroid Build Coastguard Worker void CXFA_Node::CalculateTextContentSize(CXFA_FFDoc* doc, CFX_SizeF* pSize) {
3288*3ac0a46fSAndroid Build Coastguard Worker float fFontSize = GetFontSize();
3289*3ac0a46fSAndroid Build Coastguard Worker WideString wsText = GetValue(XFA_ValuePicture::kDisplay);
3290*3ac0a46fSAndroid Build Coastguard Worker if (wsText.IsEmpty()) {
3291*3ac0a46fSAndroid Build Coastguard Worker pSize->height += fFontSize;
3292*3ac0a46fSAndroid Build Coastguard Worker return;
3293*3ac0a46fSAndroid Build Coastguard Worker }
3294*3ac0a46fSAndroid Build Coastguard Worker
3295*3ac0a46fSAndroid Build Coastguard Worker if (wsText.Back() == L'\n')
3296*3ac0a46fSAndroid Build Coastguard Worker wsText += L'\n';
3297*3ac0a46fSAndroid Build Coastguard Worker
3298*3ac0a46fSAndroid Build Coastguard Worker CXFA_FieldLayoutData* layoutData = m_pLayoutData->AsFieldLayoutData();
3299*3ac0a46fSAndroid Build Coastguard Worker if (!layoutData->m_pTextOut) {
3300*3ac0a46fSAndroid Build Coastguard Worker layoutData->m_pTextOut = std::make_unique<CFDE_TextOut>();
3301*3ac0a46fSAndroid Build Coastguard Worker CFDE_TextOut* pTextOut = layoutData->m_pTextOut.get();
3302*3ac0a46fSAndroid Build Coastguard Worker pTextOut->SetFont(GetFGASFont(doc));
3303*3ac0a46fSAndroid Build Coastguard Worker pTextOut->SetFontSize(fFontSize);
3304*3ac0a46fSAndroid Build Coastguard Worker pTextOut->SetLineBreakTolerance(fFontSize * 0.2f);
3305*3ac0a46fSAndroid Build Coastguard Worker pTextOut->SetLineSpace(GetLineHeight());
3306*3ac0a46fSAndroid Build Coastguard Worker
3307*3ac0a46fSAndroid Build Coastguard Worker FDE_TextStyle dwStyles;
3308*3ac0a46fSAndroid Build Coastguard Worker dwStyles.last_line_height_ = true;
3309*3ac0a46fSAndroid Build Coastguard Worker if (GetFFWidgetType() == XFA_FFWidgetType::kTextEdit && IsMultiLine())
3310*3ac0a46fSAndroid Build Coastguard Worker dwStyles.line_wrap_ = true;
3311*3ac0a46fSAndroid Build Coastguard Worker
3312*3ac0a46fSAndroid Build Coastguard Worker pTextOut->SetStyles(dwStyles);
3313*3ac0a46fSAndroid Build Coastguard Worker }
3314*3ac0a46fSAndroid Build Coastguard Worker layoutData->m_pTextOut->CalcLogicSize(wsText.AsStringView(), pSize);
3315*3ac0a46fSAndroid Build Coastguard Worker }
3316*3ac0a46fSAndroid Build Coastguard Worker
CalculateTextEditAutoSize(CXFA_FFDoc * doc,CFX_SizeF * pSize)3317*3ac0a46fSAndroid Build Coastguard Worker bool CXFA_Node::CalculateTextEditAutoSize(CXFA_FFDoc* doc, CFX_SizeF* pSize) {
3318*3ac0a46fSAndroid Build Coastguard Worker if (pSize->width > 0) {
3319*3ac0a46fSAndroid Build Coastguard Worker CFX_SizeF szOrz = *pSize;
3320*3ac0a46fSAndroid Build Coastguard Worker CFX_SizeF szCap;
3321*3ac0a46fSAndroid Build Coastguard Worker CalcCaptionSize(doc, &szCap);
3322*3ac0a46fSAndroid Build Coastguard Worker bool bCapExit = szCap.width > 0.01 && szCap.height > 0.01;
3323*3ac0a46fSAndroid Build Coastguard Worker XFA_AttributeValue iCapPlacement = XFA_AttributeValue::Unknown;
3324*3ac0a46fSAndroid Build Coastguard Worker if (bCapExit) {
3325*3ac0a46fSAndroid Build Coastguard Worker CXFA_Caption* caption = GetCaptionIfExists();
3326*3ac0a46fSAndroid Build Coastguard Worker iCapPlacement = caption ? caption->GetPlacementType()
3327*3ac0a46fSAndroid Build Coastguard Worker : CXFA_Caption::kDefaultPlacementType;
3328*3ac0a46fSAndroid Build Coastguard Worker switch (iCapPlacement) {
3329*3ac0a46fSAndroid Build Coastguard Worker case XFA_AttributeValue::Left:
3330*3ac0a46fSAndroid Build Coastguard Worker case XFA_AttributeValue::Right:
3331*3ac0a46fSAndroid Build Coastguard Worker case XFA_AttributeValue::Inline: {
3332*3ac0a46fSAndroid Build Coastguard Worker pSize->width -= szCap.width;
3333*3ac0a46fSAndroid Build Coastguard Worker break;
3334*3ac0a46fSAndroid Build Coastguard Worker }
3335*3ac0a46fSAndroid Build Coastguard Worker default:
3336*3ac0a46fSAndroid Build Coastguard Worker break;
3337*3ac0a46fSAndroid Build Coastguard Worker }
3338*3ac0a46fSAndroid Build Coastguard Worker }
3339*3ac0a46fSAndroid Build Coastguard Worker CFX_RectF rtUIMargin = GetUIMargin();
3340*3ac0a46fSAndroid Build Coastguard Worker pSize->width -= rtUIMargin.left + rtUIMargin.width;
3341*3ac0a46fSAndroid Build Coastguard Worker CXFA_Margin* margin = GetMarginIfExists();
3342*3ac0a46fSAndroid Build Coastguard Worker if (margin)
3343*3ac0a46fSAndroid Build Coastguard Worker pSize->width -= margin->GetLeftInset() + margin->GetRightInset();
3344*3ac0a46fSAndroid Build Coastguard Worker
3345*3ac0a46fSAndroid Build Coastguard Worker CalculateTextContentSize(doc, pSize);
3346*3ac0a46fSAndroid Build Coastguard Worker pSize->height += rtUIMargin.top + rtUIMargin.height;
3347*3ac0a46fSAndroid Build Coastguard Worker if (bCapExit) {
3348*3ac0a46fSAndroid Build Coastguard Worker switch (iCapPlacement) {
3349*3ac0a46fSAndroid Build Coastguard Worker case XFA_AttributeValue::Left:
3350*3ac0a46fSAndroid Build Coastguard Worker case XFA_AttributeValue::Right:
3351*3ac0a46fSAndroid Build Coastguard Worker case XFA_AttributeValue::Inline: {
3352*3ac0a46fSAndroid Build Coastguard Worker pSize->height = std::max(pSize->height, szCap.height);
3353*3ac0a46fSAndroid Build Coastguard Worker } break;
3354*3ac0a46fSAndroid Build Coastguard Worker case XFA_AttributeValue::Top:
3355*3ac0a46fSAndroid Build Coastguard Worker case XFA_AttributeValue::Bottom: {
3356*3ac0a46fSAndroid Build Coastguard Worker pSize->height += szCap.height;
3357*3ac0a46fSAndroid Build Coastguard Worker break;
3358*3ac0a46fSAndroid Build Coastguard Worker }
3359*3ac0a46fSAndroid Build Coastguard Worker default:
3360*3ac0a46fSAndroid Build Coastguard Worker break;
3361*3ac0a46fSAndroid Build Coastguard Worker }
3362*3ac0a46fSAndroid Build Coastguard Worker }
3363*3ac0a46fSAndroid Build Coastguard Worker pSize->width = szOrz.width;
3364*3ac0a46fSAndroid Build Coastguard Worker return CalculateWidgetAutoSize(pSize);
3365*3ac0a46fSAndroid Build Coastguard Worker }
3366*3ac0a46fSAndroid Build Coastguard Worker CalculateTextContentSize(doc, pSize);
3367*3ac0a46fSAndroid Build Coastguard Worker return CalculateFieldAutoSize(doc, pSize);
3368*3ac0a46fSAndroid Build Coastguard Worker }
3369*3ac0a46fSAndroid Build Coastguard Worker
CalculateCheckButtonAutoSize(CXFA_FFDoc * doc,CFX_SizeF * pSize)3370*3ac0a46fSAndroid Build Coastguard Worker bool CXFA_Node::CalculateCheckButtonAutoSize(CXFA_FFDoc* doc,
3371*3ac0a46fSAndroid Build Coastguard Worker CFX_SizeF* pSize) {
3372*3ac0a46fSAndroid Build Coastguard Worker float fCheckSize = GetCheckButtonSize();
3373*3ac0a46fSAndroid Build Coastguard Worker *pSize = CFX_SizeF(fCheckSize, fCheckSize);
3374*3ac0a46fSAndroid Build Coastguard Worker return CalculateFieldAutoSize(doc, pSize);
3375*3ac0a46fSAndroid Build Coastguard Worker }
3376*3ac0a46fSAndroid Build Coastguard Worker
CalculatePushButtonAutoSize(CXFA_FFDoc * doc,CFX_SizeF * pSize)3377*3ac0a46fSAndroid Build Coastguard Worker bool CXFA_Node::CalculatePushButtonAutoSize(CXFA_FFDoc* doc, CFX_SizeF* pSize) {
3378*3ac0a46fSAndroid Build Coastguard Worker CalcCaptionSize(doc, pSize);
3379*3ac0a46fSAndroid Build Coastguard Worker return CalculateWidgetAutoSize(pSize);
3380*3ac0a46fSAndroid Build Coastguard Worker }
3381*3ac0a46fSAndroid Build Coastguard Worker
CalculateImageSize(float img_width,float img_height,const CFX_Size & dpi)3382*3ac0a46fSAndroid Build Coastguard Worker CFX_SizeF CXFA_Node::CalculateImageSize(float img_width,
3383*3ac0a46fSAndroid Build Coastguard Worker float img_height,
3384*3ac0a46fSAndroid Build Coastguard Worker const CFX_Size& dpi) {
3385*3ac0a46fSAndroid Build Coastguard Worker CFX_RectF rtImage(0, 0, XFA_UnitPx2Pt(img_width, dpi.width),
3386*3ac0a46fSAndroid Build Coastguard Worker XFA_UnitPx2Pt(img_height, dpi.height));
3387*3ac0a46fSAndroid Build Coastguard Worker
3388*3ac0a46fSAndroid Build Coastguard Worker CFX_RectF rtFit;
3389*3ac0a46fSAndroid Build Coastguard Worker absl::optional<float> width = TryWidth();
3390*3ac0a46fSAndroid Build Coastguard Worker if (width.has_value()) {
3391*3ac0a46fSAndroid Build Coastguard Worker rtFit.width = width.value();
3392*3ac0a46fSAndroid Build Coastguard Worker GetWidthWithoutMargin(rtFit.width);
3393*3ac0a46fSAndroid Build Coastguard Worker } else {
3394*3ac0a46fSAndroid Build Coastguard Worker rtFit.width = rtImage.width;
3395*3ac0a46fSAndroid Build Coastguard Worker }
3396*3ac0a46fSAndroid Build Coastguard Worker
3397*3ac0a46fSAndroid Build Coastguard Worker absl::optional<float> height = TryHeight();
3398*3ac0a46fSAndroid Build Coastguard Worker if (height.has_value()) {
3399*3ac0a46fSAndroid Build Coastguard Worker rtFit.height = height.value();
3400*3ac0a46fSAndroid Build Coastguard Worker GetHeightWithoutMargin(rtFit.height);
3401*3ac0a46fSAndroid Build Coastguard Worker } else {
3402*3ac0a46fSAndroid Build Coastguard Worker rtFit.height = rtImage.height;
3403*3ac0a46fSAndroid Build Coastguard Worker }
3404*3ac0a46fSAndroid Build Coastguard Worker
3405*3ac0a46fSAndroid Build Coastguard Worker return rtFit.Size();
3406*3ac0a46fSAndroid Build Coastguard Worker }
3407*3ac0a46fSAndroid Build Coastguard Worker
CalculateImageAutoSize(CXFA_FFDoc * doc,CFX_SizeF * pSize)3408*3ac0a46fSAndroid Build Coastguard Worker bool CXFA_Node::CalculateImageAutoSize(CXFA_FFDoc* doc, CFX_SizeF* pSize) {
3409*3ac0a46fSAndroid Build Coastguard Worker if (!GetLayoutImage())
3410*3ac0a46fSAndroid Build Coastguard Worker LoadLayoutImage(doc);
3411*3ac0a46fSAndroid Build Coastguard Worker
3412*3ac0a46fSAndroid Build Coastguard Worker pSize->clear();
3413*3ac0a46fSAndroid Build Coastguard Worker RetainPtr<CFX_DIBitmap> pBitmap = GetLayoutImage();
3414*3ac0a46fSAndroid Build Coastguard Worker if (!pBitmap)
3415*3ac0a46fSAndroid Build Coastguard Worker return CalculateWidgetAutoSize(pSize);
3416*3ac0a46fSAndroid Build Coastguard Worker
3417*3ac0a46fSAndroid Build Coastguard Worker *pSize = CalculateImageSize(pBitmap->GetWidth(), pBitmap->GetHeight(),
3418*3ac0a46fSAndroid Build Coastguard Worker GetLayoutImageDpi());
3419*3ac0a46fSAndroid Build Coastguard Worker return CalculateWidgetAutoSize(pSize);
3420*3ac0a46fSAndroid Build Coastguard Worker }
3421*3ac0a46fSAndroid Build Coastguard Worker
CalculateImageEditAutoSize(CXFA_FFDoc * doc,CFX_SizeF * pSize)3422*3ac0a46fSAndroid Build Coastguard Worker bool CXFA_Node::CalculateImageEditAutoSize(CXFA_FFDoc* doc, CFX_SizeF* pSize) {
3423*3ac0a46fSAndroid Build Coastguard Worker if (!GetEditImage())
3424*3ac0a46fSAndroid Build Coastguard Worker LoadEditImage(doc);
3425*3ac0a46fSAndroid Build Coastguard Worker
3426*3ac0a46fSAndroid Build Coastguard Worker pSize->clear();
3427*3ac0a46fSAndroid Build Coastguard Worker RetainPtr<CFX_DIBitmap> pBitmap = GetEditImage();
3428*3ac0a46fSAndroid Build Coastguard Worker if (!pBitmap)
3429*3ac0a46fSAndroid Build Coastguard Worker return CalculateFieldAutoSize(doc, pSize);
3430*3ac0a46fSAndroid Build Coastguard Worker
3431*3ac0a46fSAndroid Build Coastguard Worker *pSize = CalculateImageSize(pBitmap->GetWidth(), pBitmap->GetHeight(),
3432*3ac0a46fSAndroid Build Coastguard Worker GetEditImageDpi());
3433*3ac0a46fSAndroid Build Coastguard Worker return CalculateFieldAutoSize(doc, pSize);
3434*3ac0a46fSAndroid Build Coastguard Worker }
3435*3ac0a46fSAndroid Build Coastguard Worker
LoadLayoutImage(CXFA_FFDoc * doc)3436*3ac0a46fSAndroid Build Coastguard Worker bool CXFA_Node::LoadLayoutImage(CXFA_FFDoc* doc) {
3437*3ac0a46fSAndroid Build Coastguard Worker InitLayoutData(doc);
3438*3ac0a46fSAndroid Build Coastguard Worker return m_pLayoutData->AsImageLayoutData()->LoadImageData(doc, this);
3439*3ac0a46fSAndroid Build Coastguard Worker }
3440*3ac0a46fSAndroid Build Coastguard Worker
LoadEditImage(CXFA_FFDoc * doc)3441*3ac0a46fSAndroid Build Coastguard Worker bool CXFA_Node::LoadEditImage(CXFA_FFDoc* doc) {
3442*3ac0a46fSAndroid Build Coastguard Worker InitLayoutData(doc);
3443*3ac0a46fSAndroid Build Coastguard Worker return m_pLayoutData->AsFieldLayoutData()->AsImageEditData()->LoadImageData(
3444*3ac0a46fSAndroid Build Coastguard Worker doc, this);
3445*3ac0a46fSAndroid Build Coastguard Worker }
3446*3ac0a46fSAndroid Build Coastguard Worker
GetLayoutImageDpi() const3447*3ac0a46fSAndroid Build Coastguard Worker CFX_Size CXFA_Node::GetLayoutImageDpi() const {
3448*3ac0a46fSAndroid Build Coastguard Worker return m_pLayoutData->AsImageLayoutData()->GetDpi();
3449*3ac0a46fSAndroid Build Coastguard Worker }
3450*3ac0a46fSAndroid Build Coastguard Worker
GetEditImageDpi() const3451*3ac0a46fSAndroid Build Coastguard Worker CFX_Size CXFA_Node::GetEditImageDpi() const {
3452*3ac0a46fSAndroid Build Coastguard Worker CXFA_ImageEditData* pData =
3453*3ac0a46fSAndroid Build Coastguard Worker m_pLayoutData->AsFieldLayoutData()->AsImageEditData();
3454*3ac0a46fSAndroid Build Coastguard Worker return pData->GetDpi();
3455*3ac0a46fSAndroid Build Coastguard Worker }
3456*3ac0a46fSAndroid Build Coastguard Worker
CalculateWidgetAutoWidth(float fWidthCalc)3457*3ac0a46fSAndroid Build Coastguard Worker float CXFA_Node::CalculateWidgetAutoWidth(float fWidthCalc) {
3458*3ac0a46fSAndroid Build Coastguard Worker CXFA_Margin* margin = GetMarginIfExists();
3459*3ac0a46fSAndroid Build Coastguard Worker if (margin)
3460*3ac0a46fSAndroid Build Coastguard Worker fWidthCalc += margin->GetLeftInset() + margin->GetRightInset();
3461*3ac0a46fSAndroid Build Coastguard Worker
3462*3ac0a46fSAndroid Build Coastguard Worker absl::optional<float> min = TryMinWidth();
3463*3ac0a46fSAndroid Build Coastguard Worker if (min.has_value())
3464*3ac0a46fSAndroid Build Coastguard Worker fWidthCalc = std::max(fWidthCalc, min.value());
3465*3ac0a46fSAndroid Build Coastguard Worker
3466*3ac0a46fSAndroid Build Coastguard Worker absl::optional<float> max = TryMaxWidth();
3467*3ac0a46fSAndroid Build Coastguard Worker if (max.has_value() && max.value() > 0)
3468*3ac0a46fSAndroid Build Coastguard Worker fWidthCalc = std::min(fWidthCalc, max.value());
3469*3ac0a46fSAndroid Build Coastguard Worker
3470*3ac0a46fSAndroid Build Coastguard Worker return fWidthCalc;
3471*3ac0a46fSAndroid Build Coastguard Worker }
3472*3ac0a46fSAndroid Build Coastguard Worker
GetWidthWithoutMargin(float fWidthCalc) const3473*3ac0a46fSAndroid Build Coastguard Worker float CXFA_Node::GetWidthWithoutMargin(float fWidthCalc) const {
3474*3ac0a46fSAndroid Build Coastguard Worker CXFA_Margin* margin = GetMarginIfExists();
3475*3ac0a46fSAndroid Build Coastguard Worker if (margin)
3476*3ac0a46fSAndroid Build Coastguard Worker fWidthCalc -= margin->GetLeftInset() + margin->GetRightInset();
3477*3ac0a46fSAndroid Build Coastguard Worker return fWidthCalc;
3478*3ac0a46fSAndroid Build Coastguard Worker }
3479*3ac0a46fSAndroid Build Coastguard Worker
CalculateWidgetAutoHeight(float fHeightCalc)3480*3ac0a46fSAndroid Build Coastguard Worker float CXFA_Node::CalculateWidgetAutoHeight(float fHeightCalc) {
3481*3ac0a46fSAndroid Build Coastguard Worker CXFA_Margin* margin = GetMarginIfExists();
3482*3ac0a46fSAndroid Build Coastguard Worker if (margin)
3483*3ac0a46fSAndroid Build Coastguard Worker fHeightCalc += margin->GetTopInset() + margin->GetBottomInset();
3484*3ac0a46fSAndroid Build Coastguard Worker
3485*3ac0a46fSAndroid Build Coastguard Worker absl::optional<float> min = TryMinHeight();
3486*3ac0a46fSAndroid Build Coastguard Worker if (min.has_value())
3487*3ac0a46fSAndroid Build Coastguard Worker fHeightCalc = std::max(fHeightCalc, min.value());
3488*3ac0a46fSAndroid Build Coastguard Worker
3489*3ac0a46fSAndroid Build Coastguard Worker absl::optional<float> max = TryMaxHeight();
3490*3ac0a46fSAndroid Build Coastguard Worker if (max.has_value() && max.value() > 0)
3491*3ac0a46fSAndroid Build Coastguard Worker fHeightCalc = std::min(fHeightCalc, max.value());
3492*3ac0a46fSAndroid Build Coastguard Worker
3493*3ac0a46fSAndroid Build Coastguard Worker return fHeightCalc;
3494*3ac0a46fSAndroid Build Coastguard Worker }
3495*3ac0a46fSAndroid Build Coastguard Worker
GetHeightWithoutMargin(float fHeightCalc) const3496*3ac0a46fSAndroid Build Coastguard Worker float CXFA_Node::GetHeightWithoutMargin(float fHeightCalc) const {
3497*3ac0a46fSAndroid Build Coastguard Worker CXFA_Margin* margin = GetMarginIfExists();
3498*3ac0a46fSAndroid Build Coastguard Worker if (margin)
3499*3ac0a46fSAndroid Build Coastguard Worker fHeightCalc -= margin->GetTopInset() + margin->GetBottomInset();
3500*3ac0a46fSAndroid Build Coastguard Worker return fHeightCalc;
3501*3ac0a46fSAndroid Build Coastguard Worker }
3502*3ac0a46fSAndroid Build Coastguard Worker
StartWidgetLayout(CXFA_FFDoc * doc,float * pCalcWidth,float * pCalcHeight)3503*3ac0a46fSAndroid Build Coastguard Worker void CXFA_Node::StartWidgetLayout(CXFA_FFDoc* doc,
3504*3ac0a46fSAndroid Build Coastguard Worker float* pCalcWidth,
3505*3ac0a46fSAndroid Build Coastguard Worker float* pCalcHeight) {
3506*3ac0a46fSAndroid Build Coastguard Worker InitLayoutData(doc);
3507*3ac0a46fSAndroid Build Coastguard Worker
3508*3ac0a46fSAndroid Build Coastguard Worker if (GetFFWidgetType() == XFA_FFWidgetType::kText) {
3509*3ac0a46fSAndroid Build Coastguard Worker m_pLayoutData->SetWidgetHeight(TryHeight().value_or(-1));
3510*3ac0a46fSAndroid Build Coastguard Worker StartTextLayout(doc, pCalcWidth, pCalcHeight);
3511*3ac0a46fSAndroid Build Coastguard Worker return;
3512*3ac0a46fSAndroid Build Coastguard Worker }
3513*3ac0a46fSAndroid Build Coastguard Worker if (*pCalcWidth > 0 && *pCalcHeight > 0)
3514*3ac0a46fSAndroid Build Coastguard Worker return;
3515*3ac0a46fSAndroid Build Coastguard Worker
3516*3ac0a46fSAndroid Build Coastguard Worker m_pLayoutData->SetWidgetHeight(-1.0f);
3517*3ac0a46fSAndroid Build Coastguard Worker float fWidth = 0;
3518*3ac0a46fSAndroid Build Coastguard Worker if (*pCalcWidth > 0 && *pCalcHeight < 0) {
3519*3ac0a46fSAndroid Build Coastguard Worker absl::optional<float> height = TryHeight();
3520*3ac0a46fSAndroid Build Coastguard Worker if (height.has_value()) {
3521*3ac0a46fSAndroid Build Coastguard Worker *pCalcHeight = height.value();
3522*3ac0a46fSAndroid Build Coastguard Worker } else {
3523*3ac0a46fSAndroid Build Coastguard Worker CFX_SizeF size = CalculateAccWidthAndHeight(doc, *pCalcWidth);
3524*3ac0a46fSAndroid Build Coastguard Worker *pCalcWidth = size.width;
3525*3ac0a46fSAndroid Build Coastguard Worker *pCalcHeight = size.height;
3526*3ac0a46fSAndroid Build Coastguard Worker }
3527*3ac0a46fSAndroid Build Coastguard Worker m_pLayoutData->SetWidgetHeight(*pCalcHeight);
3528*3ac0a46fSAndroid Build Coastguard Worker return;
3529*3ac0a46fSAndroid Build Coastguard Worker }
3530*3ac0a46fSAndroid Build Coastguard Worker if (*pCalcWidth < 0 && *pCalcHeight < 0) {
3531*3ac0a46fSAndroid Build Coastguard Worker absl::optional<float> height;
3532*3ac0a46fSAndroid Build Coastguard Worker absl::optional<float> width = TryWidth();
3533*3ac0a46fSAndroid Build Coastguard Worker if (width.has_value()) {
3534*3ac0a46fSAndroid Build Coastguard Worker fWidth = width.value();
3535*3ac0a46fSAndroid Build Coastguard Worker height = TryHeight();
3536*3ac0a46fSAndroid Build Coastguard Worker if (height.has_value())
3537*3ac0a46fSAndroid Build Coastguard Worker *pCalcHeight = height.value();
3538*3ac0a46fSAndroid Build Coastguard Worker }
3539*3ac0a46fSAndroid Build Coastguard Worker if (!width.has_value() || !height.has_value()) {
3540*3ac0a46fSAndroid Build Coastguard Worker CFX_SizeF size = CalculateAccWidthAndHeight(doc, fWidth);
3541*3ac0a46fSAndroid Build Coastguard Worker *pCalcWidth = size.width;
3542*3ac0a46fSAndroid Build Coastguard Worker *pCalcHeight = size.height;
3543*3ac0a46fSAndroid Build Coastguard Worker } else {
3544*3ac0a46fSAndroid Build Coastguard Worker *pCalcWidth = fWidth;
3545*3ac0a46fSAndroid Build Coastguard Worker }
3546*3ac0a46fSAndroid Build Coastguard Worker }
3547*3ac0a46fSAndroid Build Coastguard Worker m_pLayoutData->SetWidgetHeight(*pCalcHeight);
3548*3ac0a46fSAndroid Build Coastguard Worker }
3549*3ac0a46fSAndroid Build Coastguard Worker
CalculateAccWidthAndHeight(CXFA_FFDoc * doc,float fWidth)3550*3ac0a46fSAndroid Build Coastguard Worker CFX_SizeF CXFA_Node::CalculateAccWidthAndHeight(CXFA_FFDoc* doc, float fWidth) {
3551*3ac0a46fSAndroid Build Coastguard Worker CFX_SizeF sz(fWidth, m_pLayoutData->GetWidgetHeight());
3552*3ac0a46fSAndroid Build Coastguard Worker switch (GetFFWidgetType()) {
3553*3ac0a46fSAndroid Build Coastguard Worker case XFA_FFWidgetType::kBarcode:
3554*3ac0a46fSAndroid Build Coastguard Worker case XFA_FFWidgetType::kChoiceList:
3555*3ac0a46fSAndroid Build Coastguard Worker case XFA_FFWidgetType::kSignature:
3556*3ac0a46fSAndroid Build Coastguard Worker CalculateFieldAutoSize(doc, &sz);
3557*3ac0a46fSAndroid Build Coastguard Worker break;
3558*3ac0a46fSAndroid Build Coastguard Worker case XFA_FFWidgetType::kImageEdit:
3559*3ac0a46fSAndroid Build Coastguard Worker CalculateImageEditAutoSize(doc, &sz);
3560*3ac0a46fSAndroid Build Coastguard Worker break;
3561*3ac0a46fSAndroid Build Coastguard Worker case XFA_FFWidgetType::kButton:
3562*3ac0a46fSAndroid Build Coastguard Worker CalculatePushButtonAutoSize(doc, &sz);
3563*3ac0a46fSAndroid Build Coastguard Worker break;
3564*3ac0a46fSAndroid Build Coastguard Worker case XFA_FFWidgetType::kCheckButton:
3565*3ac0a46fSAndroid Build Coastguard Worker CalculateCheckButtonAutoSize(doc, &sz);
3566*3ac0a46fSAndroid Build Coastguard Worker break;
3567*3ac0a46fSAndroid Build Coastguard Worker case XFA_FFWidgetType::kDateTimeEdit:
3568*3ac0a46fSAndroid Build Coastguard Worker case XFA_FFWidgetType::kNumericEdit:
3569*3ac0a46fSAndroid Build Coastguard Worker case XFA_FFWidgetType::kPasswordEdit:
3570*3ac0a46fSAndroid Build Coastguard Worker case XFA_FFWidgetType::kTextEdit:
3571*3ac0a46fSAndroid Build Coastguard Worker CalculateTextEditAutoSize(doc, &sz);
3572*3ac0a46fSAndroid Build Coastguard Worker break;
3573*3ac0a46fSAndroid Build Coastguard Worker case XFA_FFWidgetType::kImage:
3574*3ac0a46fSAndroid Build Coastguard Worker CalculateImageAutoSize(doc, &sz);
3575*3ac0a46fSAndroid Build Coastguard Worker break;
3576*3ac0a46fSAndroid Build Coastguard Worker case XFA_FFWidgetType::kArc:
3577*3ac0a46fSAndroid Build Coastguard Worker case XFA_FFWidgetType::kLine:
3578*3ac0a46fSAndroid Build Coastguard Worker case XFA_FFWidgetType::kRectangle:
3579*3ac0a46fSAndroid Build Coastguard Worker case XFA_FFWidgetType::kSubform:
3580*3ac0a46fSAndroid Build Coastguard Worker case XFA_FFWidgetType::kExclGroup:
3581*3ac0a46fSAndroid Build Coastguard Worker CalculateWidgetAutoSize(&sz);
3582*3ac0a46fSAndroid Build Coastguard Worker break;
3583*3ac0a46fSAndroid Build Coastguard Worker case XFA_FFWidgetType::kText:
3584*3ac0a46fSAndroid Build Coastguard Worker case XFA_FFWidgetType::kNone:
3585*3ac0a46fSAndroid Build Coastguard Worker break;
3586*3ac0a46fSAndroid Build Coastguard Worker }
3587*3ac0a46fSAndroid Build Coastguard Worker m_pLayoutData->SetWidgetHeight(sz.height);
3588*3ac0a46fSAndroid Build Coastguard Worker return sz;
3589*3ac0a46fSAndroid Build Coastguard Worker }
3590*3ac0a46fSAndroid Build Coastguard Worker
FindSplitPos(CXFA_FFDocView * pDocView,size_t szBlockIndex,float fCalcHeight)3591*3ac0a46fSAndroid Build Coastguard Worker absl::optional<float> CXFA_Node::FindSplitPos(CXFA_FFDocView* pDocView,
3592*3ac0a46fSAndroid Build Coastguard Worker size_t szBlockIndex,
3593*3ac0a46fSAndroid Build Coastguard Worker float fCalcHeight) {
3594*3ac0a46fSAndroid Build Coastguard Worker if (!HasCreatedUIWidget())
3595*3ac0a46fSAndroid Build Coastguard Worker return absl::nullopt;
3596*3ac0a46fSAndroid Build Coastguard Worker
3597*3ac0a46fSAndroid Build Coastguard Worker if (GetFFWidgetType() == XFA_FFWidgetType::kSubform)
3598*3ac0a46fSAndroid Build Coastguard Worker return absl::nullopt;
3599*3ac0a46fSAndroid Build Coastguard Worker
3600*3ac0a46fSAndroid Build Coastguard Worker switch (GetFFWidgetType()) {
3601*3ac0a46fSAndroid Build Coastguard Worker case XFA_FFWidgetType::kText:
3602*3ac0a46fSAndroid Build Coastguard Worker case XFA_FFWidgetType::kTextEdit:
3603*3ac0a46fSAndroid Build Coastguard Worker case XFA_FFWidgetType::kNumericEdit:
3604*3ac0a46fSAndroid Build Coastguard Worker case XFA_FFWidgetType::kPasswordEdit:
3605*3ac0a46fSAndroid Build Coastguard Worker break;
3606*3ac0a46fSAndroid Build Coastguard Worker default:
3607*3ac0a46fSAndroid Build Coastguard Worker return 0.0f;
3608*3ac0a46fSAndroid Build Coastguard Worker }
3609*3ac0a46fSAndroid Build Coastguard Worker
3610*3ac0a46fSAndroid Build Coastguard Worker float fTopInset = 0;
3611*3ac0a46fSAndroid Build Coastguard Worker float fBottomInset = 0;
3612*3ac0a46fSAndroid Build Coastguard Worker if (szBlockIndex == 0) {
3613*3ac0a46fSAndroid Build Coastguard Worker CXFA_Margin* margin = GetMarginIfExists();
3614*3ac0a46fSAndroid Build Coastguard Worker if (margin) {
3615*3ac0a46fSAndroid Build Coastguard Worker fTopInset = margin->GetTopInset();
3616*3ac0a46fSAndroid Build Coastguard Worker fBottomInset = margin->GetBottomInset();
3617*3ac0a46fSAndroid Build Coastguard Worker }
3618*3ac0a46fSAndroid Build Coastguard Worker
3619*3ac0a46fSAndroid Build Coastguard Worker CFX_RectF rtUIMargin = GetUIMargin();
3620*3ac0a46fSAndroid Build Coastguard Worker fTopInset += rtUIMargin.top;
3621*3ac0a46fSAndroid Build Coastguard Worker fBottomInset += rtUIMargin.width;
3622*3ac0a46fSAndroid Build Coastguard Worker }
3623*3ac0a46fSAndroid Build Coastguard Worker if (GetFFWidgetType() == XFA_FFWidgetType::kText) {
3624*3ac0a46fSAndroid Build Coastguard Worker float fHeight = fCalcHeight;
3625*3ac0a46fSAndroid Build Coastguard Worker if (szBlockIndex == 0) {
3626*3ac0a46fSAndroid Build Coastguard Worker fCalcHeight -= fTopInset;
3627*3ac0a46fSAndroid Build Coastguard Worker fCalcHeight = std::max(fCalcHeight, 0.0f);
3628*3ac0a46fSAndroid Build Coastguard Worker }
3629*3ac0a46fSAndroid Build Coastguard Worker CXFA_TextLayout* pTextLayout =
3630*3ac0a46fSAndroid Build Coastguard Worker m_pLayoutData->AsTextLayoutData()->GetTextLayout();
3631*3ac0a46fSAndroid Build Coastguard Worker fCalcHeight = pTextLayout->DoSplitLayout(
3632*3ac0a46fSAndroid Build Coastguard Worker szBlockIndex, fCalcHeight,
3633*3ac0a46fSAndroid Build Coastguard Worker m_pLayoutData->GetWidgetHeight() - fTopInset);
3634*3ac0a46fSAndroid Build Coastguard Worker if (fCalcHeight != 0) {
3635*3ac0a46fSAndroid Build Coastguard Worker if (szBlockIndex == 0)
3636*3ac0a46fSAndroid Build Coastguard Worker fCalcHeight += fTopInset;
3637*3ac0a46fSAndroid Build Coastguard Worker if (fabs(fHeight - fCalcHeight) < kXFAWidgetPrecision)
3638*3ac0a46fSAndroid Build Coastguard Worker return absl::nullopt;
3639*3ac0a46fSAndroid Build Coastguard Worker }
3640*3ac0a46fSAndroid Build Coastguard Worker return fCalcHeight;
3641*3ac0a46fSAndroid Build Coastguard Worker }
3642*3ac0a46fSAndroid Build Coastguard Worker
3643*3ac0a46fSAndroid Build Coastguard Worker XFA_AttributeValue iCapPlacement = XFA_AttributeValue::Unknown;
3644*3ac0a46fSAndroid Build Coastguard Worker float fCapReserve = 0;
3645*3ac0a46fSAndroid Build Coastguard Worker if (szBlockIndex == 0) {
3646*3ac0a46fSAndroid Build Coastguard Worker CXFA_Caption* caption = GetCaptionIfExists();
3647*3ac0a46fSAndroid Build Coastguard Worker if (caption && !caption->IsHidden()) {
3648*3ac0a46fSAndroid Build Coastguard Worker iCapPlacement = caption->GetPlacementType();
3649*3ac0a46fSAndroid Build Coastguard Worker fCapReserve = caption->GetReserve();
3650*3ac0a46fSAndroid Build Coastguard Worker }
3651*3ac0a46fSAndroid Build Coastguard Worker if (iCapPlacement == XFA_AttributeValue::Top &&
3652*3ac0a46fSAndroid Build Coastguard Worker fCalcHeight < fCapReserve + fTopInset) {
3653*3ac0a46fSAndroid Build Coastguard Worker return 0.0f;
3654*3ac0a46fSAndroid Build Coastguard Worker }
3655*3ac0a46fSAndroid Build Coastguard Worker if (iCapPlacement == XFA_AttributeValue::Bottom &&
3656*3ac0a46fSAndroid Build Coastguard Worker m_pLayoutData->GetWidgetHeight() - fCapReserve - fBottomInset) {
3657*3ac0a46fSAndroid Build Coastguard Worker return 0.0f;
3658*3ac0a46fSAndroid Build Coastguard Worker }
3659*3ac0a46fSAndroid Build Coastguard Worker if (iCapPlacement != XFA_AttributeValue::Top)
3660*3ac0a46fSAndroid Build Coastguard Worker fCapReserve = 0;
3661*3ac0a46fSAndroid Build Coastguard Worker }
3662*3ac0a46fSAndroid Build Coastguard Worker CXFA_FieldLayoutData* pFieldData = m_pLayoutData->AsFieldLayoutData();
3663*3ac0a46fSAndroid Build Coastguard Worker int32_t iLinesCount = 0;
3664*3ac0a46fSAndroid Build Coastguard Worker float fHeight = m_pLayoutData->GetWidgetHeight();
3665*3ac0a46fSAndroid Build Coastguard Worker if (GetValue(XFA_ValuePicture::kDisplay).IsEmpty()) {
3666*3ac0a46fSAndroid Build Coastguard Worker iLinesCount = 1;
3667*3ac0a46fSAndroid Build Coastguard Worker } else {
3668*3ac0a46fSAndroid Build Coastguard Worker if (!pFieldData->m_pTextOut) {
3669*3ac0a46fSAndroid Build Coastguard Worker CFX_SizeF size = CalculateAccWidthAndHeight(pDocView->GetDoc(),
3670*3ac0a46fSAndroid Build Coastguard Worker TryWidth().value_or(0));
3671*3ac0a46fSAndroid Build Coastguard Worker fHeight = size.height;
3672*3ac0a46fSAndroid Build Coastguard Worker }
3673*3ac0a46fSAndroid Build Coastguard Worker
3674*3ac0a46fSAndroid Build Coastguard Worker iLinesCount = pFieldData->m_pTextOut->GetTotalLines();
3675*3ac0a46fSAndroid Build Coastguard Worker }
3676*3ac0a46fSAndroid Build Coastguard Worker std::vector<float>* pFieldArray = &pFieldData->m_FieldSplitArray;
3677*3ac0a46fSAndroid Build Coastguard Worker size_t szFieldSplitCount = pFieldArray->size();
3678*3ac0a46fSAndroid Build Coastguard Worker if (szFieldSplitCount < szBlockIndex * 3)
3679*3ac0a46fSAndroid Build Coastguard Worker return absl::nullopt;
3680*3ac0a46fSAndroid Build Coastguard Worker
3681*3ac0a46fSAndroid Build Coastguard Worker for (size_t i = 0; i < szBlockIndex * 3; i += 3) {
3682*3ac0a46fSAndroid Build Coastguard Worker iLinesCount -= static_cast<int32_t>((*pFieldArray)[i + 1]);
3683*3ac0a46fSAndroid Build Coastguard Worker fHeight -= (*pFieldArray)[i + 2];
3684*3ac0a46fSAndroid Build Coastguard Worker }
3685*3ac0a46fSAndroid Build Coastguard Worker if (iLinesCount == 0)
3686*3ac0a46fSAndroid Build Coastguard Worker return absl::nullopt;
3687*3ac0a46fSAndroid Build Coastguard Worker
3688*3ac0a46fSAndroid Build Coastguard Worker float fLineHeight = GetLineHeight();
3689*3ac0a46fSAndroid Build Coastguard Worker float fFontSize = GetFontSize();
3690*3ac0a46fSAndroid Build Coastguard Worker float fTextHeight = iLinesCount * fLineHeight - fLineHeight + fFontSize;
3691*3ac0a46fSAndroid Build Coastguard Worker float fSpaceAbove = 0;
3692*3ac0a46fSAndroid Build Coastguard Worker float fStartOffset = 0;
3693*3ac0a46fSAndroid Build Coastguard Worker if (fHeight > 0.1f && szBlockIndex == 0) {
3694*3ac0a46fSAndroid Build Coastguard Worker fStartOffset = fTopInset;
3695*3ac0a46fSAndroid Build Coastguard Worker fHeight -= (fTopInset + fBottomInset);
3696*3ac0a46fSAndroid Build Coastguard Worker CXFA_Para* para = GetParaIfExists();
3697*3ac0a46fSAndroid Build Coastguard Worker if (para) {
3698*3ac0a46fSAndroid Build Coastguard Worker fSpaceAbove = para->GetSpaceAbove();
3699*3ac0a46fSAndroid Build Coastguard Worker float fSpaceBelow = para->GetSpaceBelow();
3700*3ac0a46fSAndroid Build Coastguard Worker fHeight -= (fSpaceAbove + fSpaceBelow);
3701*3ac0a46fSAndroid Build Coastguard Worker switch (para->GetVerticalAlign()) {
3702*3ac0a46fSAndroid Build Coastguard Worker case XFA_AttributeValue::Top:
3703*3ac0a46fSAndroid Build Coastguard Worker fStartOffset += fSpaceAbove;
3704*3ac0a46fSAndroid Build Coastguard Worker break;
3705*3ac0a46fSAndroid Build Coastguard Worker case XFA_AttributeValue::Middle:
3706*3ac0a46fSAndroid Build Coastguard Worker fStartOffset += ((fHeight - fTextHeight) / 2 + fSpaceAbove);
3707*3ac0a46fSAndroid Build Coastguard Worker break;
3708*3ac0a46fSAndroid Build Coastguard Worker case XFA_AttributeValue::Bottom:
3709*3ac0a46fSAndroid Build Coastguard Worker fStartOffset += (fHeight - fTextHeight + fSpaceAbove);
3710*3ac0a46fSAndroid Build Coastguard Worker break;
3711*3ac0a46fSAndroid Build Coastguard Worker default:
3712*3ac0a46fSAndroid Build Coastguard Worker NOTREACHED_NORETURN();
3713*3ac0a46fSAndroid Build Coastguard Worker }
3714*3ac0a46fSAndroid Build Coastguard Worker }
3715*3ac0a46fSAndroid Build Coastguard Worker if (fStartOffset < 0.1f)
3716*3ac0a46fSAndroid Build Coastguard Worker fStartOffset = 0;
3717*3ac0a46fSAndroid Build Coastguard Worker }
3718*3ac0a46fSAndroid Build Coastguard Worker if (szBlockIndex > 0) {
3719*3ac0a46fSAndroid Build Coastguard Worker size_t i = szBlockIndex - 1;
3720*3ac0a46fSAndroid Build Coastguard Worker fStartOffset = (*pFieldArray)[i * 3] - (*pFieldArray)[i * 3 + 2];
3721*3ac0a46fSAndroid Build Coastguard Worker if (fStartOffset < 0.1f)
3722*3ac0a46fSAndroid Build Coastguard Worker fStartOffset = 0;
3723*3ac0a46fSAndroid Build Coastguard Worker }
3724*3ac0a46fSAndroid Build Coastguard Worker if (szFieldSplitCount / 3 == (szBlockIndex + 1))
3725*3ac0a46fSAndroid Build Coastguard Worker (*pFieldArray)[0] = fStartOffset;
3726*3ac0a46fSAndroid Build Coastguard Worker else
3727*3ac0a46fSAndroid Build Coastguard Worker pFieldArray->push_back(fStartOffset);
3728*3ac0a46fSAndroid Build Coastguard Worker
3729*3ac0a46fSAndroid Build Coastguard Worker XFA_VERSION version = pDocView->GetDoc()->GetXFADoc()->GetCurVersionMode();
3730*3ac0a46fSAndroid Build Coastguard Worker bool bCanSplitNoContent = false;
3731*3ac0a46fSAndroid Build Coastguard Worker auto value = GetParent()->JSObject()->TryEnum(XFA_Attribute::Layout, true);
3732*3ac0a46fSAndroid Build Coastguard Worker XFA_AttributeValue eLayoutMode = value.value_or(XFA_AttributeValue::Position);
3733*3ac0a46fSAndroid Build Coastguard Worker if ((eLayoutMode == XFA_AttributeValue::Position ||
3734*3ac0a46fSAndroid Build Coastguard Worker eLayoutMode == XFA_AttributeValue::Tb ||
3735*3ac0a46fSAndroid Build Coastguard Worker eLayoutMode == XFA_AttributeValue::Row ||
3736*3ac0a46fSAndroid Build Coastguard Worker eLayoutMode == XFA_AttributeValue::Table) &&
3737*3ac0a46fSAndroid Build Coastguard Worker version > XFA_VERSION_208) {
3738*3ac0a46fSAndroid Build Coastguard Worker bCanSplitNoContent = true;
3739*3ac0a46fSAndroid Build Coastguard Worker }
3740*3ac0a46fSAndroid Build Coastguard Worker if ((eLayoutMode == XFA_AttributeValue::Tb ||
3741*3ac0a46fSAndroid Build Coastguard Worker eLayoutMode == XFA_AttributeValue::Row ||
3742*3ac0a46fSAndroid Build Coastguard Worker eLayoutMode == XFA_AttributeValue::Table) &&
3743*3ac0a46fSAndroid Build Coastguard Worker version <= XFA_VERSION_208) {
3744*3ac0a46fSAndroid Build Coastguard Worker if (fStartOffset >= fCalcHeight)
3745*3ac0a46fSAndroid Build Coastguard Worker return 0.0f;
3746*3ac0a46fSAndroid Build Coastguard Worker
3747*3ac0a46fSAndroid Build Coastguard Worker bCanSplitNoContent = true;
3748*3ac0a46fSAndroid Build Coastguard Worker }
3749*3ac0a46fSAndroid Build Coastguard Worker if (!bCanSplitNoContent ||
3750*3ac0a46fSAndroid Build Coastguard Worker fCalcHeight - fTopInset - fSpaceAbove < fLineHeight) {
3751*3ac0a46fSAndroid Build Coastguard Worker return 0.0f;
3752*3ac0a46fSAndroid Build Coastguard Worker }
3753*3ac0a46fSAndroid Build Coastguard Worker
3754*3ac0a46fSAndroid Build Coastguard Worker if (fStartOffset + kXFAWidgetPrecision >= fCalcHeight) {
3755*3ac0a46fSAndroid Build Coastguard Worker if (szFieldSplitCount / 3 == (szBlockIndex + 1)) {
3756*3ac0a46fSAndroid Build Coastguard Worker (*pFieldArray)[szBlockIndex * 3 + 1] = 0;
3757*3ac0a46fSAndroid Build Coastguard Worker (*pFieldArray)[szBlockIndex * 3 + 2] = fCalcHeight;
3758*3ac0a46fSAndroid Build Coastguard Worker } else {
3759*3ac0a46fSAndroid Build Coastguard Worker pFieldArray->push_back(0);
3760*3ac0a46fSAndroid Build Coastguard Worker pFieldArray->push_back(fCalcHeight);
3761*3ac0a46fSAndroid Build Coastguard Worker }
3762*3ac0a46fSAndroid Build Coastguard Worker return absl::nullopt;
3763*3ac0a46fSAndroid Build Coastguard Worker }
3764*3ac0a46fSAndroid Build Coastguard Worker
3765*3ac0a46fSAndroid Build Coastguard Worker if (fCalcHeight - fStartOffset < fLineHeight) {
3766*3ac0a46fSAndroid Build Coastguard Worker fCalcHeight = fStartOffset;
3767*3ac0a46fSAndroid Build Coastguard Worker if (szFieldSplitCount / 3 == (szBlockIndex + 1)) {
3768*3ac0a46fSAndroid Build Coastguard Worker (*pFieldArray)[szBlockIndex * 3 + 1] = 0;
3769*3ac0a46fSAndroid Build Coastguard Worker (*pFieldArray)[szBlockIndex * 3 + 2] = fCalcHeight;
3770*3ac0a46fSAndroid Build Coastguard Worker } else {
3771*3ac0a46fSAndroid Build Coastguard Worker pFieldArray->push_back(0);
3772*3ac0a46fSAndroid Build Coastguard Worker pFieldArray->push_back(fCalcHeight);
3773*3ac0a46fSAndroid Build Coastguard Worker }
3774*3ac0a46fSAndroid Build Coastguard Worker return fCalcHeight;
3775*3ac0a46fSAndroid Build Coastguard Worker }
3776*3ac0a46fSAndroid Build Coastguard Worker
3777*3ac0a46fSAndroid Build Coastguard Worker float fTextNum =
3778*3ac0a46fSAndroid Build Coastguard Worker fCalcHeight + kXFAWidgetPrecision - fCapReserve - fStartOffset;
3779*3ac0a46fSAndroid Build Coastguard Worker int32_t iLineNum = static_cast<int32_t>(
3780*3ac0a46fSAndroid Build Coastguard Worker (fTextNum + (fLineHeight - fFontSize)) / fLineHeight);
3781*3ac0a46fSAndroid Build Coastguard Worker if (iLineNum >= iLinesCount) {
3782*3ac0a46fSAndroid Build Coastguard Worker if (fCalcHeight - fStartOffset - fTextHeight >= fFontSize) {
3783*3ac0a46fSAndroid Build Coastguard Worker if (szFieldSplitCount / 3 == (szBlockIndex + 1)) {
3784*3ac0a46fSAndroid Build Coastguard Worker (*pFieldArray)[szBlockIndex * 3 + 1] = iLinesCount;
3785*3ac0a46fSAndroid Build Coastguard Worker (*pFieldArray)[szBlockIndex * 3 + 2] = fCalcHeight;
3786*3ac0a46fSAndroid Build Coastguard Worker } else {
3787*3ac0a46fSAndroid Build Coastguard Worker pFieldArray->push_back(iLinesCount);
3788*3ac0a46fSAndroid Build Coastguard Worker pFieldArray->push_back(fCalcHeight);
3789*3ac0a46fSAndroid Build Coastguard Worker }
3790*3ac0a46fSAndroid Build Coastguard Worker return absl::nullopt;
3791*3ac0a46fSAndroid Build Coastguard Worker }
3792*3ac0a46fSAndroid Build Coastguard Worker if (fHeight - fStartOffset - fTextHeight < fFontSize) {
3793*3ac0a46fSAndroid Build Coastguard Worker iLineNum -= 1;
3794*3ac0a46fSAndroid Build Coastguard Worker if (iLineNum == 0)
3795*3ac0a46fSAndroid Build Coastguard Worker return 0.0f;
3796*3ac0a46fSAndroid Build Coastguard Worker } else {
3797*3ac0a46fSAndroid Build Coastguard Worker iLineNum = static_cast<int32_t>(fTextNum / fLineHeight);
3798*3ac0a46fSAndroid Build Coastguard Worker }
3799*3ac0a46fSAndroid Build Coastguard Worker }
3800*3ac0a46fSAndroid Build Coastguard Worker if (iLineNum <= 0)
3801*3ac0a46fSAndroid Build Coastguard Worker return 0.0f;
3802*3ac0a46fSAndroid Build Coastguard Worker
3803*3ac0a46fSAndroid Build Coastguard Worker float fSplitHeight = iLineNum * fLineHeight + fCapReserve + fStartOffset;
3804*3ac0a46fSAndroid Build Coastguard Worker if (szFieldSplitCount / 3 == (szBlockIndex + 1)) {
3805*3ac0a46fSAndroid Build Coastguard Worker (*pFieldArray)[szBlockIndex * 3 + 1] = iLineNum;
3806*3ac0a46fSAndroid Build Coastguard Worker (*pFieldArray)[szBlockIndex * 3 + 2] = fSplitHeight;
3807*3ac0a46fSAndroid Build Coastguard Worker } else {
3808*3ac0a46fSAndroid Build Coastguard Worker pFieldArray->push_back(iLineNum);
3809*3ac0a46fSAndroid Build Coastguard Worker pFieldArray->push_back(fSplitHeight);
3810*3ac0a46fSAndroid Build Coastguard Worker }
3811*3ac0a46fSAndroid Build Coastguard Worker if (fabs(fSplitHeight - fCalcHeight) < kXFAWidgetPrecision)
3812*3ac0a46fSAndroid Build Coastguard Worker return absl::nullopt;
3813*3ac0a46fSAndroid Build Coastguard Worker return fSplitHeight;
3814*3ac0a46fSAndroid Build Coastguard Worker }
3815*3ac0a46fSAndroid Build Coastguard Worker
InitLayoutData(CXFA_FFDoc * doc)3816*3ac0a46fSAndroid Build Coastguard Worker void CXFA_Node::InitLayoutData(CXFA_FFDoc* doc) {
3817*3ac0a46fSAndroid Build Coastguard Worker if (m_pLayoutData)
3818*3ac0a46fSAndroid Build Coastguard Worker return;
3819*3ac0a46fSAndroid Build Coastguard Worker
3820*3ac0a46fSAndroid Build Coastguard Worker switch (GetFFWidgetType()) {
3821*3ac0a46fSAndroid Build Coastguard Worker case XFA_FFWidgetType::kText:
3822*3ac0a46fSAndroid Build Coastguard Worker m_pLayoutData = cppgc::MakeGarbageCollected<CXFA_TextLayoutData>(
3823*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle());
3824*3ac0a46fSAndroid Build Coastguard Worker return;
3825*3ac0a46fSAndroid Build Coastguard Worker case XFA_FFWidgetType::kTextEdit:
3826*3ac0a46fSAndroid Build Coastguard Worker m_pLayoutData = cppgc::MakeGarbageCollected<CXFA_TextEditData>(
3827*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle());
3828*3ac0a46fSAndroid Build Coastguard Worker return;
3829*3ac0a46fSAndroid Build Coastguard Worker case XFA_FFWidgetType::kImage:
3830*3ac0a46fSAndroid Build Coastguard Worker m_pLayoutData = cppgc::MakeGarbageCollected<CXFA_ImageLayoutData>(
3831*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle());
3832*3ac0a46fSAndroid Build Coastguard Worker return;
3833*3ac0a46fSAndroid Build Coastguard Worker case XFA_FFWidgetType::kImageEdit:
3834*3ac0a46fSAndroid Build Coastguard Worker m_pLayoutData = cppgc::MakeGarbageCollected<CXFA_ImageEditData>(
3835*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle());
3836*3ac0a46fSAndroid Build Coastguard Worker return;
3837*3ac0a46fSAndroid Build Coastguard Worker default:
3838*3ac0a46fSAndroid Build Coastguard Worker break;
3839*3ac0a46fSAndroid Build Coastguard Worker }
3840*3ac0a46fSAndroid Build Coastguard Worker if (GetElementType() == XFA_Element::Field) {
3841*3ac0a46fSAndroid Build Coastguard Worker m_pLayoutData = cppgc::MakeGarbageCollected<CXFA_FieldLayoutData>(
3842*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle());
3843*3ac0a46fSAndroid Build Coastguard Worker return;
3844*3ac0a46fSAndroid Build Coastguard Worker }
3845*3ac0a46fSAndroid Build Coastguard Worker m_pLayoutData = cppgc::MakeGarbageCollected<CXFA_WidgetLayoutData>(
3846*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle());
3847*3ac0a46fSAndroid Build Coastguard Worker }
3848*3ac0a46fSAndroid Build Coastguard Worker
StartTextLayout(CXFA_FFDoc * doc,float * pCalcWidth,float * pCalcHeight)3849*3ac0a46fSAndroid Build Coastguard Worker void CXFA_Node::StartTextLayout(CXFA_FFDoc* doc,
3850*3ac0a46fSAndroid Build Coastguard Worker float* pCalcWidth,
3851*3ac0a46fSAndroid Build Coastguard Worker float* pCalcHeight) {
3852*3ac0a46fSAndroid Build Coastguard Worker InitLayoutData(doc);
3853*3ac0a46fSAndroid Build Coastguard Worker
3854*3ac0a46fSAndroid Build Coastguard Worker CXFA_TextLayoutData* pTextLayoutData = m_pLayoutData->AsTextLayoutData();
3855*3ac0a46fSAndroid Build Coastguard Worker pTextLayoutData->LoadText(doc, this);
3856*3ac0a46fSAndroid Build Coastguard Worker
3857*3ac0a46fSAndroid Build Coastguard Worker CXFA_TextLayout* pTextLayout = pTextLayoutData->GetTextLayout();
3858*3ac0a46fSAndroid Build Coastguard Worker float fTextHeight = 0;
3859*3ac0a46fSAndroid Build Coastguard Worker if (*pCalcWidth > 0 && *pCalcHeight > 0) {
3860*3ac0a46fSAndroid Build Coastguard Worker float fWidth = GetWidthWithoutMargin(*pCalcWidth);
3861*3ac0a46fSAndroid Build Coastguard Worker pTextLayout->StartLayout(fWidth);
3862*3ac0a46fSAndroid Build Coastguard Worker fTextHeight = *pCalcHeight;
3863*3ac0a46fSAndroid Build Coastguard Worker fTextHeight = GetHeightWithoutMargin(fTextHeight);
3864*3ac0a46fSAndroid Build Coastguard Worker pTextLayout->DoLayout(fTextHeight);
3865*3ac0a46fSAndroid Build Coastguard Worker return;
3866*3ac0a46fSAndroid Build Coastguard Worker }
3867*3ac0a46fSAndroid Build Coastguard Worker if (*pCalcWidth > 0 && *pCalcHeight < 0) {
3868*3ac0a46fSAndroid Build Coastguard Worker float fWidth = GetWidthWithoutMargin(*pCalcWidth);
3869*3ac0a46fSAndroid Build Coastguard Worker pTextLayout->StartLayout(fWidth);
3870*3ac0a46fSAndroid Build Coastguard Worker }
3871*3ac0a46fSAndroid Build Coastguard Worker if (*pCalcWidth < 0 && *pCalcHeight < 0) {
3872*3ac0a46fSAndroid Build Coastguard Worker absl::optional<float> width = TryWidth();
3873*3ac0a46fSAndroid Build Coastguard Worker if (width.has_value()) {
3874*3ac0a46fSAndroid Build Coastguard Worker pTextLayout->StartLayout(GetWidthWithoutMargin(width.value()));
3875*3ac0a46fSAndroid Build Coastguard Worker *pCalcWidth = width.value();
3876*3ac0a46fSAndroid Build Coastguard Worker } else {
3877*3ac0a46fSAndroid Build Coastguard Worker float fMaxWidth = CalculateWidgetAutoWidth(pTextLayout->StartLayout(-1));
3878*3ac0a46fSAndroid Build Coastguard Worker pTextLayout->StartLayout(GetWidthWithoutMargin(fMaxWidth));
3879*3ac0a46fSAndroid Build Coastguard Worker *pCalcWidth = fMaxWidth;
3880*3ac0a46fSAndroid Build Coastguard Worker }
3881*3ac0a46fSAndroid Build Coastguard Worker }
3882*3ac0a46fSAndroid Build Coastguard Worker if (m_pLayoutData->GetWidgetHeight() < 0) {
3883*3ac0a46fSAndroid Build Coastguard Worker m_pLayoutData->SetWidgetHeight(
3884*3ac0a46fSAndroid Build Coastguard Worker CalculateWidgetAutoHeight(pTextLayout->GetLayoutHeight()));
3885*3ac0a46fSAndroid Build Coastguard Worker }
3886*3ac0a46fSAndroid Build Coastguard Worker fTextHeight = m_pLayoutData->GetWidgetHeight();
3887*3ac0a46fSAndroid Build Coastguard Worker fTextHeight = GetHeightWithoutMargin(fTextHeight);
3888*3ac0a46fSAndroid Build Coastguard Worker pTextLayout->DoLayout(fTextHeight);
3889*3ac0a46fSAndroid Build Coastguard Worker *pCalcHeight = m_pLayoutData->GetWidgetHeight();
3890*3ac0a46fSAndroid Build Coastguard Worker }
3891*3ac0a46fSAndroid Build Coastguard Worker
LoadCaption(CXFA_FFDoc * doc)3892*3ac0a46fSAndroid Build Coastguard Worker bool CXFA_Node::LoadCaption(CXFA_FFDoc* doc) {
3893*3ac0a46fSAndroid Build Coastguard Worker InitLayoutData(doc);
3894*3ac0a46fSAndroid Build Coastguard Worker return m_pLayoutData->AsFieldLayoutData()->LoadCaption(doc, this);
3895*3ac0a46fSAndroid Build Coastguard Worker }
3896*3ac0a46fSAndroid Build Coastguard Worker
GetCaptionTextLayout()3897*3ac0a46fSAndroid Build Coastguard Worker CXFA_TextLayout* CXFA_Node::GetCaptionTextLayout() {
3898*3ac0a46fSAndroid Build Coastguard Worker return m_pLayoutData ? m_pLayoutData->AsFieldLayoutData()->m_pCapTextLayout
3899*3ac0a46fSAndroid Build Coastguard Worker : nullptr;
3900*3ac0a46fSAndroid Build Coastguard Worker }
3901*3ac0a46fSAndroid Build Coastguard Worker
GetTextLayout()3902*3ac0a46fSAndroid Build Coastguard Worker CXFA_TextLayout* CXFA_Node::GetTextLayout() {
3903*3ac0a46fSAndroid Build Coastguard Worker return m_pLayoutData ? m_pLayoutData->AsTextLayoutData()->GetTextLayout()
3904*3ac0a46fSAndroid Build Coastguard Worker : nullptr;
3905*3ac0a46fSAndroid Build Coastguard Worker }
3906*3ac0a46fSAndroid Build Coastguard Worker
GetLayoutImage()3907*3ac0a46fSAndroid Build Coastguard Worker RetainPtr<CFX_DIBitmap> CXFA_Node::GetLayoutImage() {
3908*3ac0a46fSAndroid Build Coastguard Worker return m_pLayoutData ? m_pLayoutData->AsImageLayoutData()->GetBitmap()
3909*3ac0a46fSAndroid Build Coastguard Worker : nullptr;
3910*3ac0a46fSAndroid Build Coastguard Worker }
3911*3ac0a46fSAndroid Build Coastguard Worker
GetEditImage()3912*3ac0a46fSAndroid Build Coastguard Worker RetainPtr<CFX_DIBitmap> CXFA_Node::GetEditImage() {
3913*3ac0a46fSAndroid Build Coastguard Worker return m_pLayoutData ? m_pLayoutData->AsFieldLayoutData()
3914*3ac0a46fSAndroid Build Coastguard Worker ->AsImageEditData()
3915*3ac0a46fSAndroid Build Coastguard Worker ->GetBitmap()
3916*3ac0a46fSAndroid Build Coastguard Worker : nullptr;
3917*3ac0a46fSAndroid Build Coastguard Worker }
3918*3ac0a46fSAndroid Build Coastguard Worker
SetLayoutImage(RetainPtr<CFX_DIBitmap> newImage)3919*3ac0a46fSAndroid Build Coastguard Worker void CXFA_Node::SetLayoutImage(RetainPtr<CFX_DIBitmap> newImage) {
3920*3ac0a46fSAndroid Build Coastguard Worker CXFA_ImageLayoutData* pData = m_pLayoutData->AsImageLayoutData();
3921*3ac0a46fSAndroid Build Coastguard Worker if (pData->GetBitmap() != newImage)
3922*3ac0a46fSAndroid Build Coastguard Worker pData->SetBitmap(std::move(newImage));
3923*3ac0a46fSAndroid Build Coastguard Worker }
3924*3ac0a46fSAndroid Build Coastguard Worker
SetEditImage(RetainPtr<CFX_DIBitmap> newImage)3925*3ac0a46fSAndroid Build Coastguard Worker void CXFA_Node::SetEditImage(RetainPtr<CFX_DIBitmap> newImage) {
3926*3ac0a46fSAndroid Build Coastguard Worker CXFA_ImageEditData* pData =
3927*3ac0a46fSAndroid Build Coastguard Worker m_pLayoutData->AsFieldLayoutData()->AsImageEditData();
3928*3ac0a46fSAndroid Build Coastguard Worker if (pData->GetBitmap() != newImage)
3929*3ac0a46fSAndroid Build Coastguard Worker pData->SetBitmap(std::move(newImage));
3930*3ac0a46fSAndroid Build Coastguard Worker }
3931*3ac0a46fSAndroid Build Coastguard Worker
GetFGASFont(CXFA_FFDoc * doc)3932*3ac0a46fSAndroid Build Coastguard Worker RetainPtr<CFGAS_GEFont> CXFA_Node::GetFGASFont(CXFA_FFDoc* doc) {
3933*3ac0a46fSAndroid Build Coastguard Worker WideString wsFontName = L"Courier";
3934*3ac0a46fSAndroid Build Coastguard Worker uint32_t dwFontStyle = 0;
3935*3ac0a46fSAndroid Build Coastguard Worker CXFA_Font* font = GetFontIfExists();
3936*3ac0a46fSAndroid Build Coastguard Worker if (font) {
3937*3ac0a46fSAndroid Build Coastguard Worker if (font->IsBold())
3938*3ac0a46fSAndroid Build Coastguard Worker dwFontStyle |= FXFONT_FORCE_BOLD;
3939*3ac0a46fSAndroid Build Coastguard Worker if (font->IsItalic())
3940*3ac0a46fSAndroid Build Coastguard Worker dwFontStyle |= FXFONT_ITALIC;
3941*3ac0a46fSAndroid Build Coastguard Worker
3942*3ac0a46fSAndroid Build Coastguard Worker wsFontName = font->GetTypeface();
3943*3ac0a46fSAndroid Build Coastguard Worker }
3944*3ac0a46fSAndroid Build Coastguard Worker return doc->GetApp()->GetXFAFontMgr()->GetFont(doc, wsFontName, dwFontStyle);
3945*3ac0a46fSAndroid Build Coastguard Worker }
3946*3ac0a46fSAndroid Build Coastguard Worker
HasButtonRollover() const3947*3ac0a46fSAndroid Build Coastguard Worker bool CXFA_Node::HasButtonRollover() const {
3948*3ac0a46fSAndroid Build Coastguard Worker const auto* pItems = GetChild<CXFA_Items>(0, XFA_Element::Items, false);
3949*3ac0a46fSAndroid Build Coastguard Worker if (!pItems)
3950*3ac0a46fSAndroid Build Coastguard Worker return false;
3951*3ac0a46fSAndroid Build Coastguard Worker
3952*3ac0a46fSAndroid Build Coastguard Worker for (CXFA_Node* pText = pItems->GetFirstChild(); pText;
3953*3ac0a46fSAndroid Build Coastguard Worker pText = pText->GetNextSibling()) {
3954*3ac0a46fSAndroid Build Coastguard Worker if (pText->JSObject()
3955*3ac0a46fSAndroid Build Coastguard Worker ->GetCData(XFA_Attribute::Name)
3956*3ac0a46fSAndroid Build Coastguard Worker .EqualsASCII("rollover")) {
3957*3ac0a46fSAndroid Build Coastguard Worker return !pText->JSObject()->GetContent(false).IsEmpty();
3958*3ac0a46fSAndroid Build Coastguard Worker }
3959*3ac0a46fSAndroid Build Coastguard Worker }
3960*3ac0a46fSAndroid Build Coastguard Worker return false;
3961*3ac0a46fSAndroid Build Coastguard Worker }
3962*3ac0a46fSAndroid Build Coastguard Worker
HasButtonDown() const3963*3ac0a46fSAndroid Build Coastguard Worker bool CXFA_Node::HasButtonDown() const {
3964*3ac0a46fSAndroid Build Coastguard Worker const auto* pItems = GetChild<CXFA_Items>(0, XFA_Element::Items, false);
3965*3ac0a46fSAndroid Build Coastguard Worker if (!pItems)
3966*3ac0a46fSAndroid Build Coastguard Worker return false;
3967*3ac0a46fSAndroid Build Coastguard Worker
3968*3ac0a46fSAndroid Build Coastguard Worker for (CXFA_Node* pText = pItems->GetFirstChild(); pText;
3969*3ac0a46fSAndroid Build Coastguard Worker pText = pText->GetNextSibling()) {
3970*3ac0a46fSAndroid Build Coastguard Worker if (pText->JSObject()->GetCData(XFA_Attribute::Name).EqualsASCII("down")) {
3971*3ac0a46fSAndroid Build Coastguard Worker return !pText->JSObject()->GetContent(false).IsEmpty();
3972*3ac0a46fSAndroid Build Coastguard Worker }
3973*3ac0a46fSAndroid Build Coastguard Worker }
3974*3ac0a46fSAndroid Build Coastguard Worker return false;
3975*3ac0a46fSAndroid Build Coastguard Worker }
3976*3ac0a46fSAndroid Build Coastguard Worker
IsRadioButton()3977*3ac0a46fSAndroid Build Coastguard Worker bool CXFA_Node::IsRadioButton() {
3978*3ac0a46fSAndroid Build Coastguard Worker CXFA_Node* pParent = GetParent();
3979*3ac0a46fSAndroid Build Coastguard Worker return pParent && pParent->GetElementType() == XFA_Element::ExclGroup;
3980*3ac0a46fSAndroid Build Coastguard Worker }
3981*3ac0a46fSAndroid Build Coastguard Worker
GetCheckButtonSize()3982*3ac0a46fSAndroid Build Coastguard Worker float CXFA_Node::GetCheckButtonSize() {
3983*3ac0a46fSAndroid Build Coastguard Worker CXFA_Node* pUIChild = GetUIChildNode();
3984*3ac0a46fSAndroid Build Coastguard Worker if (pUIChild) {
3985*3ac0a46fSAndroid Build Coastguard Worker return pUIChild->JSObject()->GetMeasureInUnit(XFA_Attribute::Size,
3986*3ac0a46fSAndroid Build Coastguard Worker XFA_Unit::Pt);
3987*3ac0a46fSAndroid Build Coastguard Worker }
3988*3ac0a46fSAndroid Build Coastguard Worker return CXFA_Measurement(10, XFA_Unit::Pt).ToUnit(XFA_Unit::Pt);
3989*3ac0a46fSAndroid Build Coastguard Worker }
3990*3ac0a46fSAndroid Build Coastguard Worker
GetCheckState()3991*3ac0a46fSAndroid Build Coastguard Worker XFA_CheckState CXFA_Node::GetCheckState() {
3992*3ac0a46fSAndroid Build Coastguard Worker WideString wsValue = GetRawValue();
3993*3ac0a46fSAndroid Build Coastguard Worker if (wsValue.IsEmpty())
3994*3ac0a46fSAndroid Build Coastguard Worker return XFA_CheckState::kOff;
3995*3ac0a46fSAndroid Build Coastguard Worker
3996*3ac0a46fSAndroid Build Coastguard Worker auto* pItems = GetChild<CXFA_Items>(0, XFA_Element::Items, false);
3997*3ac0a46fSAndroid Build Coastguard Worker if (!pItems)
3998*3ac0a46fSAndroid Build Coastguard Worker return XFA_CheckState::kOff;
3999*3ac0a46fSAndroid Build Coastguard Worker
4000*3ac0a46fSAndroid Build Coastguard Worker CXFA_Node* pText = pItems->GetFirstChild();
4001*3ac0a46fSAndroid Build Coastguard Worker int32_t i = 0;
4002*3ac0a46fSAndroid Build Coastguard Worker while (pText) {
4003*3ac0a46fSAndroid Build Coastguard Worker absl::optional<WideString> wsContent =
4004*3ac0a46fSAndroid Build Coastguard Worker pText->JSObject()->TryContent(false, true);
4005*3ac0a46fSAndroid Build Coastguard Worker if (wsContent == wsValue)
4006*3ac0a46fSAndroid Build Coastguard Worker return static_cast<XFA_CheckState>(i);
4007*3ac0a46fSAndroid Build Coastguard Worker
4008*3ac0a46fSAndroid Build Coastguard Worker i++;
4009*3ac0a46fSAndroid Build Coastguard Worker pText = pText->GetNextSibling();
4010*3ac0a46fSAndroid Build Coastguard Worker }
4011*3ac0a46fSAndroid Build Coastguard Worker return XFA_CheckState::kOff;
4012*3ac0a46fSAndroid Build Coastguard Worker }
4013*3ac0a46fSAndroid Build Coastguard Worker
SetCheckState(XFA_CheckState eCheckState)4014*3ac0a46fSAndroid Build Coastguard Worker void CXFA_Node::SetCheckState(XFA_CheckState eCheckState) {
4015*3ac0a46fSAndroid Build Coastguard Worker CXFA_Node* node = GetExclGroupIfExists();
4016*3ac0a46fSAndroid Build Coastguard Worker if (!node) {
4017*3ac0a46fSAndroid Build Coastguard Worker CXFA_Items* pItems = GetChild<CXFA_Items>(0, XFA_Element::Items, false);
4018*3ac0a46fSAndroid Build Coastguard Worker if (!pItems)
4019*3ac0a46fSAndroid Build Coastguard Worker return;
4020*3ac0a46fSAndroid Build Coastguard Worker
4021*3ac0a46fSAndroid Build Coastguard Worker int32_t i = -1;
4022*3ac0a46fSAndroid Build Coastguard Worker CXFA_Node* pText = pItems->GetFirstChild();
4023*3ac0a46fSAndroid Build Coastguard Worker WideString wsContent;
4024*3ac0a46fSAndroid Build Coastguard Worker while (pText) {
4025*3ac0a46fSAndroid Build Coastguard Worker i++;
4026*3ac0a46fSAndroid Build Coastguard Worker if (i == static_cast<int32_t>(eCheckState)) {
4027*3ac0a46fSAndroid Build Coastguard Worker wsContent = pText->JSObject()->GetContent(false);
4028*3ac0a46fSAndroid Build Coastguard Worker break;
4029*3ac0a46fSAndroid Build Coastguard Worker }
4030*3ac0a46fSAndroid Build Coastguard Worker pText = pText->GetNextSibling();
4031*3ac0a46fSAndroid Build Coastguard Worker }
4032*3ac0a46fSAndroid Build Coastguard Worker SyncValue(wsContent, true);
4033*3ac0a46fSAndroid Build Coastguard Worker
4034*3ac0a46fSAndroid Build Coastguard Worker return;
4035*3ac0a46fSAndroid Build Coastguard Worker }
4036*3ac0a46fSAndroid Build Coastguard Worker
4037*3ac0a46fSAndroid Build Coastguard Worker WideString wsValue;
4038*3ac0a46fSAndroid Build Coastguard Worker if (eCheckState != XFA_CheckState::kOff) {
4039*3ac0a46fSAndroid Build Coastguard Worker if (CXFA_Items* pItems =
4040*3ac0a46fSAndroid Build Coastguard Worker GetChild<CXFA_Items>(0, XFA_Element::Items, false)) {
4041*3ac0a46fSAndroid Build Coastguard Worker CXFA_Node* pText = pItems->GetFirstChild();
4042*3ac0a46fSAndroid Build Coastguard Worker if (pText)
4043*3ac0a46fSAndroid Build Coastguard Worker wsValue = pText->JSObject()->GetContent(false);
4044*3ac0a46fSAndroid Build Coastguard Worker }
4045*3ac0a46fSAndroid Build Coastguard Worker }
4046*3ac0a46fSAndroid Build Coastguard Worker CXFA_Node* pChild = node->GetFirstChild();
4047*3ac0a46fSAndroid Build Coastguard Worker for (; pChild; pChild = pChild->GetNextSibling()) {
4048*3ac0a46fSAndroid Build Coastguard Worker if (pChild->GetElementType() != XFA_Element::Field)
4049*3ac0a46fSAndroid Build Coastguard Worker continue;
4050*3ac0a46fSAndroid Build Coastguard Worker
4051*3ac0a46fSAndroid Build Coastguard Worker CXFA_Items* pItem =
4052*3ac0a46fSAndroid Build Coastguard Worker pChild->GetChild<CXFA_Items>(0, XFA_Element::Items, false);
4053*3ac0a46fSAndroid Build Coastguard Worker if (!pItem)
4054*3ac0a46fSAndroid Build Coastguard Worker continue;
4055*3ac0a46fSAndroid Build Coastguard Worker
4056*3ac0a46fSAndroid Build Coastguard Worker CXFA_Node* pItemchild = pItem->GetFirstChild();
4057*3ac0a46fSAndroid Build Coastguard Worker if (!pItemchild)
4058*3ac0a46fSAndroid Build Coastguard Worker continue;
4059*3ac0a46fSAndroid Build Coastguard Worker
4060*3ac0a46fSAndroid Build Coastguard Worker WideString text = pItemchild->JSObject()->GetContent(false);
4061*3ac0a46fSAndroid Build Coastguard Worker WideString wsChildValue = text;
4062*3ac0a46fSAndroid Build Coastguard Worker if (wsValue != text) {
4063*3ac0a46fSAndroid Build Coastguard Worker pItemchild = pItemchild->GetNextSibling();
4064*3ac0a46fSAndroid Build Coastguard Worker if (pItemchild)
4065*3ac0a46fSAndroid Build Coastguard Worker wsChildValue = pItemchild->JSObject()->GetContent(false);
4066*3ac0a46fSAndroid Build Coastguard Worker else
4067*3ac0a46fSAndroid Build Coastguard Worker wsChildValue.clear();
4068*3ac0a46fSAndroid Build Coastguard Worker }
4069*3ac0a46fSAndroid Build Coastguard Worker pChild->SyncValue(wsChildValue, true);
4070*3ac0a46fSAndroid Build Coastguard Worker }
4071*3ac0a46fSAndroid Build Coastguard Worker node->SyncValue(wsValue, true);
4072*3ac0a46fSAndroid Build Coastguard Worker }
4073*3ac0a46fSAndroid Build Coastguard Worker
GetSelectedMember()4074*3ac0a46fSAndroid Build Coastguard Worker CXFA_Node* CXFA_Node::GetSelectedMember() {
4075*3ac0a46fSAndroid Build Coastguard Worker CXFA_Node* pSelectedMember = nullptr;
4076*3ac0a46fSAndroid Build Coastguard Worker WideString wsState = GetRawValue();
4077*3ac0a46fSAndroid Build Coastguard Worker if (wsState.IsEmpty())
4078*3ac0a46fSAndroid Build Coastguard Worker return pSelectedMember;
4079*3ac0a46fSAndroid Build Coastguard Worker
4080*3ac0a46fSAndroid Build Coastguard Worker for (CXFA_Node* pNode = ToNode(GetFirstChild()); pNode;
4081*3ac0a46fSAndroid Build Coastguard Worker pNode = pNode->GetNextSibling()) {
4082*3ac0a46fSAndroid Build Coastguard Worker if (pNode->GetCheckState() == XFA_CheckState::kOn) {
4083*3ac0a46fSAndroid Build Coastguard Worker pSelectedMember = pNode;
4084*3ac0a46fSAndroid Build Coastguard Worker break;
4085*3ac0a46fSAndroid Build Coastguard Worker }
4086*3ac0a46fSAndroid Build Coastguard Worker }
4087*3ac0a46fSAndroid Build Coastguard Worker return pSelectedMember;
4088*3ac0a46fSAndroid Build Coastguard Worker }
4089*3ac0a46fSAndroid Build Coastguard Worker
SetSelectedMember(WideStringView wsName)4090*3ac0a46fSAndroid Build Coastguard Worker CXFA_Node* CXFA_Node::SetSelectedMember(WideStringView wsName) {
4091*3ac0a46fSAndroid Build Coastguard Worker uint32_t nameHash = FX_HashCode_GetW(wsName);
4092*3ac0a46fSAndroid Build Coastguard Worker for (CXFA_Node* pNode = ToNode(GetFirstChild()); pNode;
4093*3ac0a46fSAndroid Build Coastguard Worker pNode = pNode->GetNextSibling()) {
4094*3ac0a46fSAndroid Build Coastguard Worker if (pNode->GetNameHash() == nameHash) {
4095*3ac0a46fSAndroid Build Coastguard Worker pNode->SetCheckState(XFA_CheckState::kOn);
4096*3ac0a46fSAndroid Build Coastguard Worker return pNode;
4097*3ac0a46fSAndroid Build Coastguard Worker }
4098*3ac0a46fSAndroid Build Coastguard Worker }
4099*3ac0a46fSAndroid Build Coastguard Worker return nullptr;
4100*3ac0a46fSAndroid Build Coastguard Worker }
4101*3ac0a46fSAndroid Build Coastguard Worker
SetSelectedMemberByValue(WideStringView wsValue,bool bNotify,bool bScriptModify,bool bSyncData)4102*3ac0a46fSAndroid Build Coastguard Worker void CXFA_Node::SetSelectedMemberByValue(WideStringView wsValue,
4103*3ac0a46fSAndroid Build Coastguard Worker bool bNotify,
4104*3ac0a46fSAndroid Build Coastguard Worker bool bScriptModify,
4105*3ac0a46fSAndroid Build Coastguard Worker bool bSyncData) {
4106*3ac0a46fSAndroid Build Coastguard Worker WideString wsExclGroup;
4107*3ac0a46fSAndroid Build Coastguard Worker for (CXFA_Node* pNode = GetFirstChild(); pNode;
4108*3ac0a46fSAndroid Build Coastguard Worker pNode = pNode->GetNextSibling()) {
4109*3ac0a46fSAndroid Build Coastguard Worker if (pNode->GetElementType() != XFA_Element::Field)
4110*3ac0a46fSAndroid Build Coastguard Worker continue;
4111*3ac0a46fSAndroid Build Coastguard Worker
4112*3ac0a46fSAndroid Build Coastguard Worker CXFA_Items* pItem =
4113*3ac0a46fSAndroid Build Coastguard Worker pNode->GetChild<CXFA_Items>(0, XFA_Element::Items, false);
4114*3ac0a46fSAndroid Build Coastguard Worker if (!pItem)
4115*3ac0a46fSAndroid Build Coastguard Worker continue;
4116*3ac0a46fSAndroid Build Coastguard Worker
4117*3ac0a46fSAndroid Build Coastguard Worker CXFA_Node* pItemchild = pItem->GetFirstChild();
4118*3ac0a46fSAndroid Build Coastguard Worker if (!pItemchild)
4119*3ac0a46fSAndroid Build Coastguard Worker continue;
4120*3ac0a46fSAndroid Build Coastguard Worker
4121*3ac0a46fSAndroid Build Coastguard Worker WideString wsChildValue = pItemchild->JSObject()->GetContent(false);
4122*3ac0a46fSAndroid Build Coastguard Worker if (wsValue != wsChildValue) {
4123*3ac0a46fSAndroid Build Coastguard Worker pItemchild = pItemchild->GetNextSibling();
4124*3ac0a46fSAndroid Build Coastguard Worker if (pItemchild)
4125*3ac0a46fSAndroid Build Coastguard Worker wsChildValue = pItemchild->JSObject()->GetContent(false);
4126*3ac0a46fSAndroid Build Coastguard Worker else
4127*3ac0a46fSAndroid Build Coastguard Worker wsChildValue.clear();
4128*3ac0a46fSAndroid Build Coastguard Worker } else {
4129*3ac0a46fSAndroid Build Coastguard Worker wsExclGroup = wsValue;
4130*3ac0a46fSAndroid Build Coastguard Worker }
4131*3ac0a46fSAndroid Build Coastguard Worker pNode->JSObject()->SetContent(wsChildValue, wsChildValue, bNotify,
4132*3ac0a46fSAndroid Build Coastguard Worker bScriptModify, false);
4133*3ac0a46fSAndroid Build Coastguard Worker }
4134*3ac0a46fSAndroid Build Coastguard Worker JSObject()->SetContent(wsExclGroup, wsExclGroup, bNotify, bScriptModify,
4135*3ac0a46fSAndroid Build Coastguard Worker bSyncData);
4136*3ac0a46fSAndroid Build Coastguard Worker }
4137*3ac0a46fSAndroid Build Coastguard Worker
GetExclGroupFirstMember()4138*3ac0a46fSAndroid Build Coastguard Worker CXFA_Node* CXFA_Node::GetExclGroupFirstMember() {
4139*3ac0a46fSAndroid Build Coastguard Worker CXFA_Node* pNode = GetFirstChild();
4140*3ac0a46fSAndroid Build Coastguard Worker while (pNode) {
4141*3ac0a46fSAndroid Build Coastguard Worker if (pNode->GetElementType() == XFA_Element::Field)
4142*3ac0a46fSAndroid Build Coastguard Worker return pNode;
4143*3ac0a46fSAndroid Build Coastguard Worker
4144*3ac0a46fSAndroid Build Coastguard Worker pNode = pNode->GetNextSibling();
4145*3ac0a46fSAndroid Build Coastguard Worker }
4146*3ac0a46fSAndroid Build Coastguard Worker return nullptr;
4147*3ac0a46fSAndroid Build Coastguard Worker }
4148*3ac0a46fSAndroid Build Coastguard Worker
GetExclGroupNextMember(CXFA_Node * pNode)4149*3ac0a46fSAndroid Build Coastguard Worker CXFA_Node* CXFA_Node::GetExclGroupNextMember(CXFA_Node* pNode) {
4150*3ac0a46fSAndroid Build Coastguard Worker if (!pNode)
4151*3ac0a46fSAndroid Build Coastguard Worker return nullptr;
4152*3ac0a46fSAndroid Build Coastguard Worker
4153*3ac0a46fSAndroid Build Coastguard Worker CXFA_Node* pNodeField = pNode->GetNextSibling();
4154*3ac0a46fSAndroid Build Coastguard Worker while (pNodeField) {
4155*3ac0a46fSAndroid Build Coastguard Worker if (pNodeField->GetElementType() == XFA_Element::Field)
4156*3ac0a46fSAndroid Build Coastguard Worker return pNodeField;
4157*3ac0a46fSAndroid Build Coastguard Worker
4158*3ac0a46fSAndroid Build Coastguard Worker pNodeField = pNodeField->GetNextSibling();
4159*3ac0a46fSAndroid Build Coastguard Worker }
4160*3ac0a46fSAndroid Build Coastguard Worker return nullptr;
4161*3ac0a46fSAndroid Build Coastguard Worker }
4162*3ac0a46fSAndroid Build Coastguard Worker
IsChoiceListCommitOnSelect()4163*3ac0a46fSAndroid Build Coastguard Worker bool CXFA_Node::IsChoiceListCommitOnSelect() {
4164*3ac0a46fSAndroid Build Coastguard Worker CXFA_Node* pUIChild = GetUIChildNode();
4165*3ac0a46fSAndroid Build Coastguard Worker if (pUIChild) {
4166*3ac0a46fSAndroid Build Coastguard Worker return pUIChild->JSObject()->GetEnum(XFA_Attribute::CommitOn) ==
4167*3ac0a46fSAndroid Build Coastguard Worker XFA_AttributeValue::Select;
4168*3ac0a46fSAndroid Build Coastguard Worker }
4169*3ac0a46fSAndroid Build Coastguard Worker return true;
4170*3ac0a46fSAndroid Build Coastguard Worker }
4171*3ac0a46fSAndroid Build Coastguard Worker
IsChoiceListAllowTextEntry()4172*3ac0a46fSAndroid Build Coastguard Worker bool CXFA_Node::IsChoiceListAllowTextEntry() {
4173*3ac0a46fSAndroid Build Coastguard Worker CXFA_Node* pUIChild = GetUIChildNode();
4174*3ac0a46fSAndroid Build Coastguard Worker return pUIChild && pUIChild->JSObject()->GetBoolean(XFA_Attribute::TextEntry);
4175*3ac0a46fSAndroid Build Coastguard Worker }
4176*3ac0a46fSAndroid Build Coastguard Worker
IsChoiceListMultiSelect()4177*3ac0a46fSAndroid Build Coastguard Worker bool CXFA_Node::IsChoiceListMultiSelect() {
4178*3ac0a46fSAndroid Build Coastguard Worker CXFA_Node* pUIChild = GetUIChildNode();
4179*3ac0a46fSAndroid Build Coastguard Worker if (pUIChild) {
4180*3ac0a46fSAndroid Build Coastguard Worker return pUIChild->JSObject()->GetEnum(XFA_Attribute::Open) ==
4181*3ac0a46fSAndroid Build Coastguard Worker XFA_AttributeValue::MultiSelect;
4182*3ac0a46fSAndroid Build Coastguard Worker }
4183*3ac0a46fSAndroid Build Coastguard Worker return false;
4184*3ac0a46fSAndroid Build Coastguard Worker }
4185*3ac0a46fSAndroid Build Coastguard Worker
IsListBox()4186*3ac0a46fSAndroid Build Coastguard Worker bool CXFA_Node::IsListBox() {
4187*3ac0a46fSAndroid Build Coastguard Worker CXFA_Node* pUIChild = GetUIChildNode();
4188*3ac0a46fSAndroid Build Coastguard Worker if (!pUIChild)
4189*3ac0a46fSAndroid Build Coastguard Worker return false;
4190*3ac0a46fSAndroid Build Coastguard Worker
4191*3ac0a46fSAndroid Build Coastguard Worker XFA_AttributeValue attr = pUIChild->JSObject()->GetEnum(XFA_Attribute::Open);
4192*3ac0a46fSAndroid Build Coastguard Worker return attr == XFA_AttributeValue::Always ||
4193*3ac0a46fSAndroid Build Coastguard Worker attr == XFA_AttributeValue::MultiSelect;
4194*3ac0a46fSAndroid Build Coastguard Worker }
4195*3ac0a46fSAndroid Build Coastguard Worker
CountChoiceListItems(bool bSaveValue)4196*3ac0a46fSAndroid Build Coastguard Worker size_t CXFA_Node::CountChoiceListItems(bool bSaveValue) {
4197*3ac0a46fSAndroid Build Coastguard Worker std::vector<CXFA_Node*> pItems;
4198*3ac0a46fSAndroid Build Coastguard Worker int32_t iCount = 0;
4199*3ac0a46fSAndroid Build Coastguard Worker for (CXFA_Node* pNode = GetFirstChild(); pNode;
4200*3ac0a46fSAndroid Build Coastguard Worker pNode = pNode->GetNextSibling()) {
4201*3ac0a46fSAndroid Build Coastguard Worker if (pNode->GetElementType() != XFA_Element::Items)
4202*3ac0a46fSAndroid Build Coastguard Worker continue;
4203*3ac0a46fSAndroid Build Coastguard Worker iCount++;
4204*3ac0a46fSAndroid Build Coastguard Worker pItems.push_back(pNode);
4205*3ac0a46fSAndroid Build Coastguard Worker if (iCount == 2)
4206*3ac0a46fSAndroid Build Coastguard Worker break;
4207*3ac0a46fSAndroid Build Coastguard Worker }
4208*3ac0a46fSAndroid Build Coastguard Worker if (iCount == 0)
4209*3ac0a46fSAndroid Build Coastguard Worker return 0;
4210*3ac0a46fSAndroid Build Coastguard Worker
4211*3ac0a46fSAndroid Build Coastguard Worker CXFA_Node* pItem = pItems[0];
4212*3ac0a46fSAndroid Build Coastguard Worker if (iCount > 1) {
4213*3ac0a46fSAndroid Build Coastguard Worker bool bItemOneHasSave =
4214*3ac0a46fSAndroid Build Coastguard Worker pItems[0]->JSObject()->GetBoolean(XFA_Attribute::Save);
4215*3ac0a46fSAndroid Build Coastguard Worker bool bItemTwoHasSave =
4216*3ac0a46fSAndroid Build Coastguard Worker pItems[1]->JSObject()->GetBoolean(XFA_Attribute::Save);
4217*3ac0a46fSAndroid Build Coastguard Worker if (bItemOneHasSave != bItemTwoHasSave && bSaveValue == bItemTwoHasSave)
4218*3ac0a46fSAndroid Build Coastguard Worker pItem = pItems[1];
4219*3ac0a46fSAndroid Build Coastguard Worker }
4220*3ac0a46fSAndroid Build Coastguard Worker return pItem->CountChildren(XFA_Element::Unknown, false);
4221*3ac0a46fSAndroid Build Coastguard Worker }
4222*3ac0a46fSAndroid Build Coastguard Worker
GetChoiceListItem(int32_t nIndex,bool bSaveValue)4223*3ac0a46fSAndroid Build Coastguard Worker absl::optional<WideString> CXFA_Node::GetChoiceListItem(int32_t nIndex,
4224*3ac0a46fSAndroid Build Coastguard Worker bool bSaveValue) {
4225*3ac0a46fSAndroid Build Coastguard Worker std::vector<CXFA_Node*> pItemsArray;
4226*3ac0a46fSAndroid Build Coastguard Worker int32_t iCount = 0;
4227*3ac0a46fSAndroid Build Coastguard Worker for (CXFA_Node* pNode = GetFirstChild(); pNode;
4228*3ac0a46fSAndroid Build Coastguard Worker pNode = pNode->GetNextSibling()) {
4229*3ac0a46fSAndroid Build Coastguard Worker if (pNode->GetElementType() != XFA_Element::Items)
4230*3ac0a46fSAndroid Build Coastguard Worker continue;
4231*3ac0a46fSAndroid Build Coastguard Worker
4232*3ac0a46fSAndroid Build Coastguard Worker ++iCount;
4233*3ac0a46fSAndroid Build Coastguard Worker pItemsArray.push_back(pNode);
4234*3ac0a46fSAndroid Build Coastguard Worker if (iCount == 2)
4235*3ac0a46fSAndroid Build Coastguard Worker break;
4236*3ac0a46fSAndroid Build Coastguard Worker }
4237*3ac0a46fSAndroid Build Coastguard Worker if (iCount == 0)
4238*3ac0a46fSAndroid Build Coastguard Worker return absl::nullopt;
4239*3ac0a46fSAndroid Build Coastguard Worker
4240*3ac0a46fSAndroid Build Coastguard Worker CXFA_Node* pItems = pItemsArray[0];
4241*3ac0a46fSAndroid Build Coastguard Worker if (iCount > 1) {
4242*3ac0a46fSAndroid Build Coastguard Worker bool bItemOneHasSave =
4243*3ac0a46fSAndroid Build Coastguard Worker pItemsArray[0]->JSObject()->GetBoolean(XFA_Attribute::Save);
4244*3ac0a46fSAndroid Build Coastguard Worker bool bItemTwoHasSave =
4245*3ac0a46fSAndroid Build Coastguard Worker pItemsArray[1]->JSObject()->GetBoolean(XFA_Attribute::Save);
4246*3ac0a46fSAndroid Build Coastguard Worker if (bItemOneHasSave != bItemTwoHasSave && bSaveValue == bItemTwoHasSave)
4247*3ac0a46fSAndroid Build Coastguard Worker pItems = pItemsArray[1];
4248*3ac0a46fSAndroid Build Coastguard Worker }
4249*3ac0a46fSAndroid Build Coastguard Worker if (!pItems)
4250*3ac0a46fSAndroid Build Coastguard Worker return absl::nullopt;
4251*3ac0a46fSAndroid Build Coastguard Worker
4252*3ac0a46fSAndroid Build Coastguard Worker CXFA_Node* pItem =
4253*3ac0a46fSAndroid Build Coastguard Worker pItems->GetChild<CXFA_Node>(nIndex, XFA_Element::Unknown, false);
4254*3ac0a46fSAndroid Build Coastguard Worker if (!pItem)
4255*3ac0a46fSAndroid Build Coastguard Worker return absl::nullopt;
4256*3ac0a46fSAndroid Build Coastguard Worker
4257*3ac0a46fSAndroid Build Coastguard Worker return pItem->JSObject()->GetContent(false);
4258*3ac0a46fSAndroid Build Coastguard Worker }
4259*3ac0a46fSAndroid Build Coastguard Worker
GetChoiceListItems(bool bSaveValue)4260*3ac0a46fSAndroid Build Coastguard Worker std::vector<WideString> CXFA_Node::GetChoiceListItems(bool bSaveValue) {
4261*3ac0a46fSAndroid Build Coastguard Worker std::vector<CXFA_Node*> items;
4262*3ac0a46fSAndroid Build Coastguard Worker for (CXFA_Node* pNode = GetFirstChild(); pNode && items.size() < 2;
4263*3ac0a46fSAndroid Build Coastguard Worker pNode = pNode->GetNextSibling()) {
4264*3ac0a46fSAndroid Build Coastguard Worker if (pNode->GetElementType() == XFA_Element::Items)
4265*3ac0a46fSAndroid Build Coastguard Worker items.push_back(pNode);
4266*3ac0a46fSAndroid Build Coastguard Worker }
4267*3ac0a46fSAndroid Build Coastguard Worker if (items.empty())
4268*3ac0a46fSAndroid Build Coastguard Worker return std::vector<WideString>();
4269*3ac0a46fSAndroid Build Coastguard Worker
4270*3ac0a46fSAndroid Build Coastguard Worker CXFA_Node* pItem = items.front();
4271*3ac0a46fSAndroid Build Coastguard Worker if (items.size() > 1) {
4272*3ac0a46fSAndroid Build Coastguard Worker bool bItemOneHasSave =
4273*3ac0a46fSAndroid Build Coastguard Worker items[0]->JSObject()->GetBoolean(XFA_Attribute::Save);
4274*3ac0a46fSAndroid Build Coastguard Worker bool bItemTwoHasSave =
4275*3ac0a46fSAndroid Build Coastguard Worker items[1]->JSObject()->GetBoolean(XFA_Attribute::Save);
4276*3ac0a46fSAndroid Build Coastguard Worker if (bItemOneHasSave != bItemTwoHasSave && bSaveValue == bItemTwoHasSave)
4277*3ac0a46fSAndroid Build Coastguard Worker pItem = items[1];
4278*3ac0a46fSAndroid Build Coastguard Worker }
4279*3ac0a46fSAndroid Build Coastguard Worker
4280*3ac0a46fSAndroid Build Coastguard Worker std::vector<WideString> wsTextArray;
4281*3ac0a46fSAndroid Build Coastguard Worker for (CXFA_Node* pNode = pItem->GetFirstChild(); pNode;
4282*3ac0a46fSAndroid Build Coastguard Worker pNode = pNode->GetNextSibling()) {
4283*3ac0a46fSAndroid Build Coastguard Worker wsTextArray.emplace_back(pNode->JSObject()->GetContent(false));
4284*3ac0a46fSAndroid Build Coastguard Worker }
4285*3ac0a46fSAndroid Build Coastguard Worker return wsTextArray;
4286*3ac0a46fSAndroid Build Coastguard Worker }
4287*3ac0a46fSAndroid Build Coastguard Worker
CountSelectedItems()4288*3ac0a46fSAndroid Build Coastguard Worker int32_t CXFA_Node::CountSelectedItems() {
4289*3ac0a46fSAndroid Build Coastguard Worker std::vector<WideString> wsValueArray = GetSelectedItemsValue();
4290*3ac0a46fSAndroid Build Coastguard Worker if (IsListBox() || !IsChoiceListAllowTextEntry())
4291*3ac0a46fSAndroid Build Coastguard Worker return fxcrt::CollectionSize<int32_t>(wsValueArray);
4292*3ac0a46fSAndroid Build Coastguard Worker
4293*3ac0a46fSAndroid Build Coastguard Worker int32_t iSelected = 0;
4294*3ac0a46fSAndroid Build Coastguard Worker std::vector<WideString> wsSaveTextArray = GetChoiceListItems(true);
4295*3ac0a46fSAndroid Build Coastguard Worker for (const auto& value : wsValueArray) {
4296*3ac0a46fSAndroid Build Coastguard Worker if (pdfium::Contains(wsSaveTextArray, value))
4297*3ac0a46fSAndroid Build Coastguard Worker iSelected++;
4298*3ac0a46fSAndroid Build Coastguard Worker }
4299*3ac0a46fSAndroid Build Coastguard Worker return iSelected;
4300*3ac0a46fSAndroid Build Coastguard Worker }
4301*3ac0a46fSAndroid Build Coastguard Worker
GetSelectedItem(int32_t nIndex)4302*3ac0a46fSAndroid Build Coastguard Worker int32_t CXFA_Node::GetSelectedItem(int32_t nIndex) {
4303*3ac0a46fSAndroid Build Coastguard Worker std::vector<WideString> wsValueArray = GetSelectedItemsValue();
4304*3ac0a46fSAndroid Build Coastguard Worker if (!fxcrt::IndexInBounds(wsValueArray, nIndex))
4305*3ac0a46fSAndroid Build Coastguard Worker return -1;
4306*3ac0a46fSAndroid Build Coastguard Worker
4307*3ac0a46fSAndroid Build Coastguard Worker std::vector<WideString> wsSaveTextArray = GetChoiceListItems(true);
4308*3ac0a46fSAndroid Build Coastguard Worker auto it = std::find(wsSaveTextArray.begin(), wsSaveTextArray.end(),
4309*3ac0a46fSAndroid Build Coastguard Worker wsValueArray[nIndex]);
4310*3ac0a46fSAndroid Build Coastguard Worker return it != wsSaveTextArray.end()
4311*3ac0a46fSAndroid Build Coastguard Worker ? pdfium::base::checked_cast<int32_t>(it - wsSaveTextArray.begin())
4312*3ac0a46fSAndroid Build Coastguard Worker : -1;
4313*3ac0a46fSAndroid Build Coastguard Worker }
4314*3ac0a46fSAndroid Build Coastguard Worker
GetSelectedItems()4315*3ac0a46fSAndroid Build Coastguard Worker std::vector<int32_t> CXFA_Node::GetSelectedItems() {
4316*3ac0a46fSAndroid Build Coastguard Worker std::vector<int32_t> iSelArray;
4317*3ac0a46fSAndroid Build Coastguard Worker std::vector<WideString> wsValueArray = GetSelectedItemsValue();
4318*3ac0a46fSAndroid Build Coastguard Worker std::vector<WideString> wsSaveTextArray = GetChoiceListItems(true);
4319*3ac0a46fSAndroid Build Coastguard Worker for (const auto& value : wsValueArray) {
4320*3ac0a46fSAndroid Build Coastguard Worker auto it = std::find(wsSaveTextArray.begin(), wsSaveTextArray.end(), value);
4321*3ac0a46fSAndroid Build Coastguard Worker if (it != wsSaveTextArray.end()) {
4322*3ac0a46fSAndroid Build Coastguard Worker iSelArray.push_back(
4323*3ac0a46fSAndroid Build Coastguard Worker pdfium::base::checked_cast<int32_t>(it - wsSaveTextArray.begin()));
4324*3ac0a46fSAndroid Build Coastguard Worker }
4325*3ac0a46fSAndroid Build Coastguard Worker }
4326*3ac0a46fSAndroid Build Coastguard Worker return iSelArray;
4327*3ac0a46fSAndroid Build Coastguard Worker }
4328*3ac0a46fSAndroid Build Coastguard Worker
GetSelectedItemsValue()4329*3ac0a46fSAndroid Build Coastguard Worker std::vector<WideString> CXFA_Node::GetSelectedItemsValue() {
4330*3ac0a46fSAndroid Build Coastguard Worker WideString wsValue = GetRawValue();
4331*3ac0a46fSAndroid Build Coastguard Worker if (IsChoiceListMultiSelect())
4332*3ac0a46fSAndroid Build Coastguard Worker return fxcrt::Split(wsValue, L'\n');
4333*3ac0a46fSAndroid Build Coastguard Worker
4334*3ac0a46fSAndroid Build Coastguard Worker std::vector<WideString> wsSelTextArray;
4335*3ac0a46fSAndroid Build Coastguard Worker wsSelTextArray.push_back(wsValue);
4336*3ac0a46fSAndroid Build Coastguard Worker return wsSelTextArray;
4337*3ac0a46fSAndroid Build Coastguard Worker }
4338*3ac0a46fSAndroid Build Coastguard Worker
GetItemState(int32_t nIndex)4339*3ac0a46fSAndroid Build Coastguard Worker bool CXFA_Node::GetItemState(int32_t nIndex) {
4340*3ac0a46fSAndroid Build Coastguard Worker std::vector<WideString> wsSaveTextArray = GetChoiceListItems(true);
4341*3ac0a46fSAndroid Build Coastguard Worker return fxcrt::IndexInBounds(wsSaveTextArray, nIndex) &&
4342*3ac0a46fSAndroid Build Coastguard Worker pdfium::Contains(GetSelectedItemsValue(), wsSaveTextArray[nIndex]);
4343*3ac0a46fSAndroid Build Coastguard Worker }
4344*3ac0a46fSAndroid Build Coastguard Worker
SetItemState(int32_t nIndex,bool bSelected,bool bNotify,bool bScriptModify)4345*3ac0a46fSAndroid Build Coastguard Worker void CXFA_Node::SetItemState(int32_t nIndex,
4346*3ac0a46fSAndroid Build Coastguard Worker bool bSelected,
4347*3ac0a46fSAndroid Build Coastguard Worker bool bNotify,
4348*3ac0a46fSAndroid Build Coastguard Worker bool bScriptModify) {
4349*3ac0a46fSAndroid Build Coastguard Worker std::vector<WideString> wsSaveTextArray = GetChoiceListItems(true);
4350*3ac0a46fSAndroid Build Coastguard Worker if (!fxcrt::IndexInBounds(wsSaveTextArray, nIndex))
4351*3ac0a46fSAndroid Build Coastguard Worker return;
4352*3ac0a46fSAndroid Build Coastguard Worker
4353*3ac0a46fSAndroid Build Coastguard Worker int32_t iSel = -1;
4354*3ac0a46fSAndroid Build Coastguard Worker std::vector<WideString> wsValueArray = GetSelectedItemsValue();
4355*3ac0a46fSAndroid Build Coastguard Worker auto value_iter = std::find(wsValueArray.begin(), wsValueArray.end(),
4356*3ac0a46fSAndroid Build Coastguard Worker wsSaveTextArray[nIndex]);
4357*3ac0a46fSAndroid Build Coastguard Worker if (value_iter != wsValueArray.end()) {
4358*3ac0a46fSAndroid Build Coastguard Worker iSel =
4359*3ac0a46fSAndroid Build Coastguard Worker pdfium::base::checked_cast<int32_t>(value_iter - wsValueArray.begin());
4360*3ac0a46fSAndroid Build Coastguard Worker }
4361*3ac0a46fSAndroid Build Coastguard Worker if (IsChoiceListMultiSelect()) {
4362*3ac0a46fSAndroid Build Coastguard Worker if (bSelected) {
4363*3ac0a46fSAndroid Build Coastguard Worker if (iSel < 0) {
4364*3ac0a46fSAndroid Build Coastguard Worker WideString wsValue = GetRawValue();
4365*3ac0a46fSAndroid Build Coastguard Worker if (!wsValue.IsEmpty()) {
4366*3ac0a46fSAndroid Build Coastguard Worker wsValue += L"\n";
4367*3ac0a46fSAndroid Build Coastguard Worker }
4368*3ac0a46fSAndroid Build Coastguard Worker wsValue += wsSaveTextArray[nIndex];
4369*3ac0a46fSAndroid Build Coastguard Worker JSObject()->SetContent(wsValue, wsValue, bNotify, bScriptModify, true);
4370*3ac0a46fSAndroid Build Coastguard Worker }
4371*3ac0a46fSAndroid Build Coastguard Worker } else if (iSel >= 0) {
4372*3ac0a46fSAndroid Build Coastguard Worker std::vector<int32_t> iSelArray = GetSelectedItems();
4373*3ac0a46fSAndroid Build Coastguard Worker auto selected_iter =
4374*3ac0a46fSAndroid Build Coastguard Worker std::find(iSelArray.begin(), iSelArray.end(), nIndex);
4375*3ac0a46fSAndroid Build Coastguard Worker if (selected_iter != iSelArray.end())
4376*3ac0a46fSAndroid Build Coastguard Worker iSelArray.erase(selected_iter);
4377*3ac0a46fSAndroid Build Coastguard Worker SetSelectedItems(iSelArray, bNotify, bScriptModify, true);
4378*3ac0a46fSAndroid Build Coastguard Worker }
4379*3ac0a46fSAndroid Build Coastguard Worker } else {
4380*3ac0a46fSAndroid Build Coastguard Worker if (bSelected) {
4381*3ac0a46fSAndroid Build Coastguard Worker if (iSel < 0) {
4382*3ac0a46fSAndroid Build Coastguard Worker WideString wsSaveText = wsSaveTextArray[nIndex];
4383*3ac0a46fSAndroid Build Coastguard Worker JSObject()->SetContent(wsSaveText, GetFormatDataValue(wsSaveText),
4384*3ac0a46fSAndroid Build Coastguard Worker bNotify, bScriptModify, true);
4385*3ac0a46fSAndroid Build Coastguard Worker }
4386*3ac0a46fSAndroid Build Coastguard Worker } else if (iSel >= 0) {
4387*3ac0a46fSAndroid Build Coastguard Worker JSObject()->SetContent(WideString(), WideString(), bNotify, bScriptModify,
4388*3ac0a46fSAndroid Build Coastguard Worker true);
4389*3ac0a46fSAndroid Build Coastguard Worker }
4390*3ac0a46fSAndroid Build Coastguard Worker }
4391*3ac0a46fSAndroid Build Coastguard Worker }
4392*3ac0a46fSAndroid Build Coastguard Worker
SetSelectedItems(const std::vector<int32_t> & iSelArray,bool bNotify,bool bScriptModify,bool bSyncData)4393*3ac0a46fSAndroid Build Coastguard Worker void CXFA_Node::SetSelectedItems(const std::vector<int32_t>& iSelArray,
4394*3ac0a46fSAndroid Build Coastguard Worker bool bNotify,
4395*3ac0a46fSAndroid Build Coastguard Worker bool bScriptModify,
4396*3ac0a46fSAndroid Build Coastguard Worker bool bSyncData) {
4397*3ac0a46fSAndroid Build Coastguard Worker WideString wsValue;
4398*3ac0a46fSAndroid Build Coastguard Worker int32_t iSize = fxcrt::CollectionSize<int32_t>(iSelArray);
4399*3ac0a46fSAndroid Build Coastguard Worker if (iSize >= 1) {
4400*3ac0a46fSAndroid Build Coastguard Worker std::vector<WideString> wsSaveTextArray = GetChoiceListItems(true);
4401*3ac0a46fSAndroid Build Coastguard Worker WideString wsItemValue;
4402*3ac0a46fSAndroid Build Coastguard Worker for (int32_t i = 0; i < iSize; i++) {
4403*3ac0a46fSAndroid Build Coastguard Worker wsItemValue = (iSize == 1) ? wsSaveTextArray[iSelArray[i]]
4404*3ac0a46fSAndroid Build Coastguard Worker : wsSaveTextArray[iSelArray[i]] + L"\n";
4405*3ac0a46fSAndroid Build Coastguard Worker wsValue += wsItemValue;
4406*3ac0a46fSAndroid Build Coastguard Worker }
4407*3ac0a46fSAndroid Build Coastguard Worker }
4408*3ac0a46fSAndroid Build Coastguard Worker WideString wsFormat(wsValue);
4409*3ac0a46fSAndroid Build Coastguard Worker if (!IsChoiceListMultiSelect())
4410*3ac0a46fSAndroid Build Coastguard Worker wsFormat = GetFormatDataValue(wsValue);
4411*3ac0a46fSAndroid Build Coastguard Worker
4412*3ac0a46fSAndroid Build Coastguard Worker JSObject()->SetContent(wsValue, wsFormat, bNotify, bScriptModify, bSyncData);
4413*3ac0a46fSAndroid Build Coastguard Worker }
4414*3ac0a46fSAndroid Build Coastguard Worker
ClearAllSelections()4415*3ac0a46fSAndroid Build Coastguard Worker void CXFA_Node::ClearAllSelections() {
4416*3ac0a46fSAndroid Build Coastguard Worker CXFA_Node* pBind = GetBindData();
4417*3ac0a46fSAndroid Build Coastguard Worker if (!pBind || !IsChoiceListMultiSelect()) {
4418*3ac0a46fSAndroid Build Coastguard Worker SyncValue(WideString(), false);
4419*3ac0a46fSAndroid Build Coastguard Worker return;
4420*3ac0a46fSAndroid Build Coastguard Worker }
4421*3ac0a46fSAndroid Build Coastguard Worker
4422*3ac0a46fSAndroid Build Coastguard Worker while (CXFA_Node* pChildNode = pBind->GetFirstChild())
4423*3ac0a46fSAndroid Build Coastguard Worker pBind->RemoveChildAndNotify(pChildNode, true);
4424*3ac0a46fSAndroid Build Coastguard Worker }
4425*3ac0a46fSAndroid Build Coastguard Worker
InsertItem(const WideString & wsLabel,const WideString & wsValue,bool bNotify)4426*3ac0a46fSAndroid Build Coastguard Worker void CXFA_Node::InsertItem(const WideString& wsLabel,
4427*3ac0a46fSAndroid Build Coastguard Worker const WideString& wsValue,
4428*3ac0a46fSAndroid Build Coastguard Worker bool bNotify) {
4429*3ac0a46fSAndroid Build Coastguard Worker int32_t nIndex = -1;
4430*3ac0a46fSAndroid Build Coastguard Worker WideString wsNewValue(wsValue);
4431*3ac0a46fSAndroid Build Coastguard Worker if (wsNewValue.IsEmpty())
4432*3ac0a46fSAndroid Build Coastguard Worker wsNewValue = wsLabel;
4433*3ac0a46fSAndroid Build Coastguard Worker
4434*3ac0a46fSAndroid Build Coastguard Worker std::vector<CXFA_Node*> listitems;
4435*3ac0a46fSAndroid Build Coastguard Worker for (CXFA_Node* pItem = GetFirstChild(); pItem;
4436*3ac0a46fSAndroid Build Coastguard Worker pItem = pItem->GetNextSibling()) {
4437*3ac0a46fSAndroid Build Coastguard Worker if (pItem->GetElementType() == XFA_Element::Items)
4438*3ac0a46fSAndroid Build Coastguard Worker listitems.push_back(pItem);
4439*3ac0a46fSAndroid Build Coastguard Worker }
4440*3ac0a46fSAndroid Build Coastguard Worker if (listitems.empty()) {
4441*3ac0a46fSAndroid Build Coastguard Worker CXFA_Node* pItems = CreateSamePacketNode(XFA_Element::Items);
4442*3ac0a46fSAndroid Build Coastguard Worker InsertChildAndNotify(-1, pItems);
4443*3ac0a46fSAndroid Build Coastguard Worker InsertListTextItem(pItems, wsLabel, nIndex);
4444*3ac0a46fSAndroid Build Coastguard Worker CXFA_Node* pSaveItems = CreateSamePacketNode(XFA_Element::Items);
4445*3ac0a46fSAndroid Build Coastguard Worker InsertChildAndNotify(-1, pSaveItems);
4446*3ac0a46fSAndroid Build Coastguard Worker pSaveItems->JSObject()->SetBoolean(XFA_Attribute::Save, true, false);
4447*3ac0a46fSAndroid Build Coastguard Worker InsertListTextItem(pSaveItems, wsNewValue, nIndex);
4448*3ac0a46fSAndroid Build Coastguard Worker } else if (listitems.size() > 1) {
4449*3ac0a46fSAndroid Build Coastguard Worker for (int32_t i = 0; i < 2; i++) {
4450*3ac0a46fSAndroid Build Coastguard Worker CXFA_Node* pNode = listitems[i];
4451*3ac0a46fSAndroid Build Coastguard Worker bool bHasSave = pNode->JSObject()->GetBoolean(XFA_Attribute::Save);
4452*3ac0a46fSAndroid Build Coastguard Worker if (bHasSave)
4453*3ac0a46fSAndroid Build Coastguard Worker InsertListTextItem(pNode, wsNewValue, nIndex);
4454*3ac0a46fSAndroid Build Coastguard Worker else
4455*3ac0a46fSAndroid Build Coastguard Worker InsertListTextItem(pNode, wsLabel, nIndex);
4456*3ac0a46fSAndroid Build Coastguard Worker }
4457*3ac0a46fSAndroid Build Coastguard Worker } else {
4458*3ac0a46fSAndroid Build Coastguard Worker CXFA_Node* pNode = listitems[0];
4459*3ac0a46fSAndroid Build Coastguard Worker pNode->JSObject()->SetBoolean(XFA_Attribute::Save, false, false);
4460*3ac0a46fSAndroid Build Coastguard Worker pNode->JSObject()->SetEnum(XFA_Attribute::Presence,
4461*3ac0a46fSAndroid Build Coastguard Worker XFA_AttributeValue::Visible, false);
4462*3ac0a46fSAndroid Build Coastguard Worker CXFA_Node* pSaveItems = CreateSamePacketNode(XFA_Element::Items);
4463*3ac0a46fSAndroid Build Coastguard Worker InsertChildAndNotify(-1, pSaveItems);
4464*3ac0a46fSAndroid Build Coastguard Worker pSaveItems->JSObject()->SetBoolean(XFA_Attribute::Save, true, false);
4465*3ac0a46fSAndroid Build Coastguard Worker pSaveItems->JSObject()->SetEnum(XFA_Attribute::Presence,
4466*3ac0a46fSAndroid Build Coastguard Worker XFA_AttributeValue::Hidden, false);
4467*3ac0a46fSAndroid Build Coastguard Worker CXFA_Node* pListNode = pNode->GetFirstChild();
4468*3ac0a46fSAndroid Build Coastguard Worker int32_t i = 0;
4469*3ac0a46fSAndroid Build Coastguard Worker while (pListNode) {
4470*3ac0a46fSAndroid Build Coastguard Worker InsertListTextItem(pSaveItems, pListNode->JSObject()->GetContent(false),
4471*3ac0a46fSAndroid Build Coastguard Worker i);
4472*3ac0a46fSAndroid Build Coastguard Worker ++i;
4473*3ac0a46fSAndroid Build Coastguard Worker
4474*3ac0a46fSAndroid Build Coastguard Worker pListNode = pListNode->GetNextSibling();
4475*3ac0a46fSAndroid Build Coastguard Worker }
4476*3ac0a46fSAndroid Build Coastguard Worker InsertListTextItem(pNode, wsLabel, nIndex);
4477*3ac0a46fSAndroid Build Coastguard Worker InsertListTextItem(pSaveItems, wsNewValue, nIndex);
4478*3ac0a46fSAndroid Build Coastguard Worker }
4479*3ac0a46fSAndroid Build Coastguard Worker if (bNotify)
4480*3ac0a46fSAndroid Build Coastguard Worker GetDocument()->GetNotify()->OnWidgetListItemAdded(this, wsLabel, nIndex);
4481*3ac0a46fSAndroid Build Coastguard Worker }
4482*3ac0a46fSAndroid Build Coastguard Worker
GetItemLabel(WideStringView wsValue) const4483*3ac0a46fSAndroid Build Coastguard Worker WideString CXFA_Node::GetItemLabel(WideStringView wsValue) const {
4484*3ac0a46fSAndroid Build Coastguard Worker std::vector<CXFA_Node*> listitems;
4485*3ac0a46fSAndroid Build Coastguard Worker CXFA_Node* pItems = GetFirstChild();
4486*3ac0a46fSAndroid Build Coastguard Worker for (; pItems; pItems = pItems->GetNextSibling()) {
4487*3ac0a46fSAndroid Build Coastguard Worker if (pItems->GetElementType() != XFA_Element::Items)
4488*3ac0a46fSAndroid Build Coastguard Worker continue;
4489*3ac0a46fSAndroid Build Coastguard Worker listitems.push_back(pItems);
4490*3ac0a46fSAndroid Build Coastguard Worker }
4491*3ac0a46fSAndroid Build Coastguard Worker
4492*3ac0a46fSAndroid Build Coastguard Worker if (listitems.size() <= 1)
4493*3ac0a46fSAndroid Build Coastguard Worker return WideString(wsValue);
4494*3ac0a46fSAndroid Build Coastguard Worker
4495*3ac0a46fSAndroid Build Coastguard Worker CXFA_Node* pLabelItems = listitems[0];
4496*3ac0a46fSAndroid Build Coastguard Worker bool bSave = pLabelItems->JSObject()->GetBoolean(XFA_Attribute::Save);
4497*3ac0a46fSAndroid Build Coastguard Worker CXFA_Node* pSaveItems = nullptr;
4498*3ac0a46fSAndroid Build Coastguard Worker if (bSave) {
4499*3ac0a46fSAndroid Build Coastguard Worker pSaveItems = pLabelItems;
4500*3ac0a46fSAndroid Build Coastguard Worker pLabelItems = listitems[1];
4501*3ac0a46fSAndroid Build Coastguard Worker } else {
4502*3ac0a46fSAndroid Build Coastguard Worker pSaveItems = listitems[1];
4503*3ac0a46fSAndroid Build Coastguard Worker }
4504*3ac0a46fSAndroid Build Coastguard Worker
4505*3ac0a46fSAndroid Build Coastguard Worker int32_t iCount = 0;
4506*3ac0a46fSAndroid Build Coastguard Worker int32_t iSearch = -1;
4507*3ac0a46fSAndroid Build Coastguard Worker for (CXFA_Node* pChildItem = pSaveItems->GetFirstChild(); pChildItem;
4508*3ac0a46fSAndroid Build Coastguard Worker pChildItem = pChildItem->GetNextSibling()) {
4509*3ac0a46fSAndroid Build Coastguard Worker if (pChildItem->JSObject()->GetContent(false) == wsValue) {
4510*3ac0a46fSAndroid Build Coastguard Worker iSearch = iCount;
4511*3ac0a46fSAndroid Build Coastguard Worker break;
4512*3ac0a46fSAndroid Build Coastguard Worker }
4513*3ac0a46fSAndroid Build Coastguard Worker iCount++;
4514*3ac0a46fSAndroid Build Coastguard Worker }
4515*3ac0a46fSAndroid Build Coastguard Worker if (iSearch < 0)
4516*3ac0a46fSAndroid Build Coastguard Worker return WideString();
4517*3ac0a46fSAndroid Build Coastguard Worker
4518*3ac0a46fSAndroid Build Coastguard Worker CXFA_Node* pText =
4519*3ac0a46fSAndroid Build Coastguard Worker pLabelItems->GetChild<CXFA_Node>(iSearch, XFA_Element::Unknown, false);
4520*3ac0a46fSAndroid Build Coastguard Worker return pText ? pText->JSObject()->GetContent(false) : WideString();
4521*3ac0a46fSAndroid Build Coastguard Worker }
4522*3ac0a46fSAndroid Build Coastguard Worker
GetItemValue(WideStringView wsLabel)4523*3ac0a46fSAndroid Build Coastguard Worker WideString CXFA_Node::GetItemValue(WideStringView wsLabel) {
4524*3ac0a46fSAndroid Build Coastguard Worker int32_t iCount = 0;
4525*3ac0a46fSAndroid Build Coastguard Worker std::vector<CXFA_Node*> listitems;
4526*3ac0a46fSAndroid Build Coastguard Worker for (CXFA_Node* pItems = GetFirstChild(); pItems;
4527*3ac0a46fSAndroid Build Coastguard Worker pItems = pItems->GetNextSibling()) {
4528*3ac0a46fSAndroid Build Coastguard Worker if (pItems->GetElementType() != XFA_Element::Items)
4529*3ac0a46fSAndroid Build Coastguard Worker continue;
4530*3ac0a46fSAndroid Build Coastguard Worker iCount++;
4531*3ac0a46fSAndroid Build Coastguard Worker listitems.push_back(pItems);
4532*3ac0a46fSAndroid Build Coastguard Worker }
4533*3ac0a46fSAndroid Build Coastguard Worker if (iCount <= 1)
4534*3ac0a46fSAndroid Build Coastguard Worker return WideString(wsLabel);
4535*3ac0a46fSAndroid Build Coastguard Worker
4536*3ac0a46fSAndroid Build Coastguard Worker CXFA_Node* pLabelItems = listitems[0];
4537*3ac0a46fSAndroid Build Coastguard Worker bool bSave = pLabelItems->JSObject()->GetBoolean(XFA_Attribute::Save);
4538*3ac0a46fSAndroid Build Coastguard Worker CXFA_Node* pSaveItems = nullptr;
4539*3ac0a46fSAndroid Build Coastguard Worker if (bSave) {
4540*3ac0a46fSAndroid Build Coastguard Worker pSaveItems = pLabelItems;
4541*3ac0a46fSAndroid Build Coastguard Worker pLabelItems = listitems[1];
4542*3ac0a46fSAndroid Build Coastguard Worker } else {
4543*3ac0a46fSAndroid Build Coastguard Worker pSaveItems = listitems[1];
4544*3ac0a46fSAndroid Build Coastguard Worker }
4545*3ac0a46fSAndroid Build Coastguard Worker iCount = 0;
4546*3ac0a46fSAndroid Build Coastguard Worker
4547*3ac0a46fSAndroid Build Coastguard Worker int32_t iSearch = -1;
4548*3ac0a46fSAndroid Build Coastguard Worker WideString wsContent;
4549*3ac0a46fSAndroid Build Coastguard Worker CXFA_Node* pChildItem = pLabelItems->GetFirstChild();
4550*3ac0a46fSAndroid Build Coastguard Worker for (; pChildItem; pChildItem = pChildItem->GetNextSibling()) {
4551*3ac0a46fSAndroid Build Coastguard Worker if (pChildItem->JSObject()->GetContent(false) == wsLabel) {
4552*3ac0a46fSAndroid Build Coastguard Worker iSearch = iCount;
4553*3ac0a46fSAndroid Build Coastguard Worker break;
4554*3ac0a46fSAndroid Build Coastguard Worker }
4555*3ac0a46fSAndroid Build Coastguard Worker iCount++;
4556*3ac0a46fSAndroid Build Coastguard Worker }
4557*3ac0a46fSAndroid Build Coastguard Worker if (iSearch < 0)
4558*3ac0a46fSAndroid Build Coastguard Worker return WideString();
4559*3ac0a46fSAndroid Build Coastguard Worker
4560*3ac0a46fSAndroid Build Coastguard Worker CXFA_Node* pText =
4561*3ac0a46fSAndroid Build Coastguard Worker pSaveItems->GetChild<CXFA_Node>(iSearch, XFA_Element::Unknown, false);
4562*3ac0a46fSAndroid Build Coastguard Worker return pText ? pText->JSObject()->GetContent(false) : WideString();
4563*3ac0a46fSAndroid Build Coastguard Worker }
4564*3ac0a46fSAndroid Build Coastguard Worker
DeleteItem(int32_t nIndex,bool bNotify,bool bScriptModify)4565*3ac0a46fSAndroid Build Coastguard Worker bool CXFA_Node::DeleteItem(int32_t nIndex, bool bNotify, bool bScriptModify) {
4566*3ac0a46fSAndroid Build Coastguard Worker bool bSetValue = false;
4567*3ac0a46fSAndroid Build Coastguard Worker CXFA_Node* pItems = GetFirstChild();
4568*3ac0a46fSAndroid Build Coastguard Worker for (; pItems; pItems = pItems->GetNextSibling()) {
4569*3ac0a46fSAndroid Build Coastguard Worker if (pItems->GetElementType() != XFA_Element::Items)
4570*3ac0a46fSAndroid Build Coastguard Worker continue;
4571*3ac0a46fSAndroid Build Coastguard Worker
4572*3ac0a46fSAndroid Build Coastguard Worker if (nIndex < 0) {
4573*3ac0a46fSAndroid Build Coastguard Worker while (CXFA_Node* pNode = pItems->GetFirstChild()) {
4574*3ac0a46fSAndroid Build Coastguard Worker pItems->RemoveChildAndNotify(pNode, true);
4575*3ac0a46fSAndroid Build Coastguard Worker }
4576*3ac0a46fSAndroid Build Coastguard Worker } else {
4577*3ac0a46fSAndroid Build Coastguard Worker if (!bSetValue && pItems->JSObject()->GetBoolean(XFA_Attribute::Save)) {
4578*3ac0a46fSAndroid Build Coastguard Worker SetItemState(nIndex, false, true, bScriptModify);
4579*3ac0a46fSAndroid Build Coastguard Worker bSetValue = true;
4580*3ac0a46fSAndroid Build Coastguard Worker }
4581*3ac0a46fSAndroid Build Coastguard Worker int32_t i = 0;
4582*3ac0a46fSAndroid Build Coastguard Worker CXFA_Node* pNode = pItems->GetFirstChild();
4583*3ac0a46fSAndroid Build Coastguard Worker while (pNode) {
4584*3ac0a46fSAndroid Build Coastguard Worker if (i == nIndex) {
4585*3ac0a46fSAndroid Build Coastguard Worker pItems->RemoveChildAndNotify(pNode, true);
4586*3ac0a46fSAndroid Build Coastguard Worker break;
4587*3ac0a46fSAndroid Build Coastguard Worker }
4588*3ac0a46fSAndroid Build Coastguard Worker i++;
4589*3ac0a46fSAndroid Build Coastguard Worker pNode = pNode->GetNextSibling();
4590*3ac0a46fSAndroid Build Coastguard Worker }
4591*3ac0a46fSAndroid Build Coastguard Worker }
4592*3ac0a46fSAndroid Build Coastguard Worker }
4593*3ac0a46fSAndroid Build Coastguard Worker if (bNotify)
4594*3ac0a46fSAndroid Build Coastguard Worker GetDocument()->GetNotify()->OnWidgetListItemRemoved(this, nIndex);
4595*3ac0a46fSAndroid Build Coastguard Worker return true;
4596*3ac0a46fSAndroid Build Coastguard Worker }
4597*3ac0a46fSAndroid Build Coastguard Worker
IsHorizontalScrollPolicyOff()4598*3ac0a46fSAndroid Build Coastguard Worker bool CXFA_Node::IsHorizontalScrollPolicyOff() {
4599*3ac0a46fSAndroid Build Coastguard Worker CXFA_Node* pUIChild = GetUIChildNode();
4600*3ac0a46fSAndroid Build Coastguard Worker if (pUIChild) {
4601*3ac0a46fSAndroid Build Coastguard Worker return pUIChild->JSObject()->GetEnum(XFA_Attribute::HScrollPolicy) ==
4602*3ac0a46fSAndroid Build Coastguard Worker XFA_AttributeValue::Off;
4603*3ac0a46fSAndroid Build Coastguard Worker }
4604*3ac0a46fSAndroid Build Coastguard Worker return false;
4605*3ac0a46fSAndroid Build Coastguard Worker }
4606*3ac0a46fSAndroid Build Coastguard Worker
IsVerticalScrollPolicyOff()4607*3ac0a46fSAndroid Build Coastguard Worker bool CXFA_Node::IsVerticalScrollPolicyOff() {
4608*3ac0a46fSAndroid Build Coastguard Worker CXFA_Node* pUIChild = GetUIChildNode();
4609*3ac0a46fSAndroid Build Coastguard Worker if (pUIChild) {
4610*3ac0a46fSAndroid Build Coastguard Worker return pUIChild->JSObject()->GetEnum(XFA_Attribute::VScrollPolicy) ==
4611*3ac0a46fSAndroid Build Coastguard Worker XFA_AttributeValue::Off;
4612*3ac0a46fSAndroid Build Coastguard Worker }
4613*3ac0a46fSAndroid Build Coastguard Worker return false;
4614*3ac0a46fSAndroid Build Coastguard Worker }
4615*3ac0a46fSAndroid Build Coastguard Worker
GetNumberOfCells()4616*3ac0a46fSAndroid Build Coastguard Worker absl::optional<int32_t> CXFA_Node::GetNumberOfCells() {
4617*3ac0a46fSAndroid Build Coastguard Worker CXFA_Node* pUIChild = GetUIChildNode();
4618*3ac0a46fSAndroid Build Coastguard Worker if (!pUIChild)
4619*3ac0a46fSAndroid Build Coastguard Worker return absl::nullopt;
4620*3ac0a46fSAndroid Build Coastguard Worker
4621*3ac0a46fSAndroid Build Coastguard Worker CXFA_Comb* pNode = pUIChild->GetChild<CXFA_Comb>(0, XFA_Element::Comb, false);
4622*3ac0a46fSAndroid Build Coastguard Worker if (!pNode)
4623*3ac0a46fSAndroid Build Coastguard Worker return absl::nullopt;
4624*3ac0a46fSAndroid Build Coastguard Worker
4625*3ac0a46fSAndroid Build Coastguard Worker return pNode->JSObject()->GetInteger(XFA_Attribute::NumberOfCells);
4626*3ac0a46fSAndroid Build Coastguard Worker }
4627*3ac0a46fSAndroid Build Coastguard Worker
IsMultiLine()4628*3ac0a46fSAndroid Build Coastguard Worker bool CXFA_Node::IsMultiLine() {
4629*3ac0a46fSAndroid Build Coastguard Worker CXFA_Node* pUIChild = GetUIChildNode();
4630*3ac0a46fSAndroid Build Coastguard Worker return pUIChild && pUIChild->JSObject()->GetBoolean(XFA_Attribute::MultiLine);
4631*3ac0a46fSAndroid Build Coastguard Worker }
4632*3ac0a46fSAndroid Build Coastguard Worker
GetMaxChars() const4633*3ac0a46fSAndroid Build Coastguard Worker std::pair<XFA_Element, int32_t> CXFA_Node::GetMaxChars() const {
4634*3ac0a46fSAndroid Build Coastguard Worker const auto* pNode = GetChild<CXFA_Value>(0, XFA_Element::Value, false);
4635*3ac0a46fSAndroid Build Coastguard Worker if (pNode) {
4636*3ac0a46fSAndroid Build Coastguard Worker if (CXFA_Node* pChild = pNode->GetFirstChild()) {
4637*3ac0a46fSAndroid Build Coastguard Worker switch (pChild->GetElementType()) {
4638*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::Text:
4639*3ac0a46fSAndroid Build Coastguard Worker return {XFA_Element::Text,
4640*3ac0a46fSAndroid Build Coastguard Worker pChild->JSObject()->GetInteger(XFA_Attribute::MaxChars)};
4641*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::ExData: {
4642*3ac0a46fSAndroid Build Coastguard Worker int32_t iMax =
4643*3ac0a46fSAndroid Build Coastguard Worker pChild->JSObject()->GetInteger(XFA_Attribute::MaxLength);
4644*3ac0a46fSAndroid Build Coastguard Worker return {XFA_Element::ExData, iMax < 0 ? 0 : iMax};
4645*3ac0a46fSAndroid Build Coastguard Worker }
4646*3ac0a46fSAndroid Build Coastguard Worker default:
4647*3ac0a46fSAndroid Build Coastguard Worker break;
4648*3ac0a46fSAndroid Build Coastguard Worker }
4649*3ac0a46fSAndroid Build Coastguard Worker }
4650*3ac0a46fSAndroid Build Coastguard Worker }
4651*3ac0a46fSAndroid Build Coastguard Worker return {XFA_Element::Unknown, 0};
4652*3ac0a46fSAndroid Build Coastguard Worker }
4653*3ac0a46fSAndroid Build Coastguard Worker
GetFracDigits() const4654*3ac0a46fSAndroid Build Coastguard Worker int32_t CXFA_Node::GetFracDigits() const {
4655*3ac0a46fSAndroid Build Coastguard Worker const auto* pNode = GetChild<CXFA_Value>(0, XFA_Element::Value, false);
4656*3ac0a46fSAndroid Build Coastguard Worker if (!pNode)
4657*3ac0a46fSAndroid Build Coastguard Worker return -1;
4658*3ac0a46fSAndroid Build Coastguard Worker
4659*3ac0a46fSAndroid Build Coastguard Worker const auto* pChild =
4660*3ac0a46fSAndroid Build Coastguard Worker pNode->GetChild<CXFA_Decimal>(0, XFA_Element::Decimal, false);
4661*3ac0a46fSAndroid Build Coastguard Worker if (!pChild)
4662*3ac0a46fSAndroid Build Coastguard Worker return -1;
4663*3ac0a46fSAndroid Build Coastguard Worker
4664*3ac0a46fSAndroid Build Coastguard Worker return pChild->JSObject()
4665*3ac0a46fSAndroid Build Coastguard Worker ->TryInteger(XFA_Attribute::FracDigits, true)
4666*3ac0a46fSAndroid Build Coastguard Worker .value_or(-1);
4667*3ac0a46fSAndroid Build Coastguard Worker }
4668*3ac0a46fSAndroid Build Coastguard Worker
GetLeadDigits() const4669*3ac0a46fSAndroid Build Coastguard Worker int32_t CXFA_Node::GetLeadDigits() const {
4670*3ac0a46fSAndroid Build Coastguard Worker const auto* pNode = GetChild<CXFA_Value>(0, XFA_Element::Value, false);
4671*3ac0a46fSAndroid Build Coastguard Worker if (!pNode)
4672*3ac0a46fSAndroid Build Coastguard Worker return -1;
4673*3ac0a46fSAndroid Build Coastguard Worker
4674*3ac0a46fSAndroid Build Coastguard Worker const auto* pChild =
4675*3ac0a46fSAndroid Build Coastguard Worker pNode->GetChild<CXFA_Decimal>(0, XFA_Element::Decimal, false);
4676*3ac0a46fSAndroid Build Coastguard Worker if (!pChild)
4677*3ac0a46fSAndroid Build Coastguard Worker return -1;
4678*3ac0a46fSAndroid Build Coastguard Worker
4679*3ac0a46fSAndroid Build Coastguard Worker return pChild->JSObject()
4680*3ac0a46fSAndroid Build Coastguard Worker ->TryInteger(XFA_Attribute::LeadDigits, true)
4681*3ac0a46fSAndroid Build Coastguard Worker .value_or(-1);
4682*3ac0a46fSAndroid Build Coastguard Worker }
4683*3ac0a46fSAndroid Build Coastguard Worker
SetValue(XFA_ValuePicture eValueType,const WideString & wsValue)4684*3ac0a46fSAndroid Build Coastguard Worker bool CXFA_Node::SetValue(XFA_ValuePicture eValueType,
4685*3ac0a46fSAndroid Build Coastguard Worker const WideString& wsValue) {
4686*3ac0a46fSAndroid Build Coastguard Worker if (wsValue.IsEmpty()) {
4687*3ac0a46fSAndroid Build Coastguard Worker SyncValue(wsValue, true);
4688*3ac0a46fSAndroid Build Coastguard Worker return true;
4689*3ac0a46fSAndroid Build Coastguard Worker }
4690*3ac0a46fSAndroid Build Coastguard Worker
4691*3ac0a46fSAndroid Build Coastguard Worker SetPreNull(IsNull());
4692*3ac0a46fSAndroid Build Coastguard Worker SetIsNull(false);
4693*3ac0a46fSAndroid Build Coastguard Worker
4694*3ac0a46fSAndroid Build Coastguard Worker WideString wsNewText(wsValue);
4695*3ac0a46fSAndroid Build Coastguard Worker WideString wsPicture = GetPictureContent(eValueType);
4696*3ac0a46fSAndroid Build Coastguard Worker bool bValidate = true;
4697*3ac0a46fSAndroid Build Coastguard Worker bool bSyncData = false;
4698*3ac0a46fSAndroid Build Coastguard Worker CXFA_Node* pNode = GetUIChildNode();
4699*3ac0a46fSAndroid Build Coastguard Worker if (!pNode)
4700*3ac0a46fSAndroid Build Coastguard Worker return true;
4701*3ac0a46fSAndroid Build Coastguard Worker
4702*3ac0a46fSAndroid Build Coastguard Worker XFA_Element eType = pNode->GetElementType();
4703*3ac0a46fSAndroid Build Coastguard Worker if (!wsPicture.IsEmpty()) {
4704*3ac0a46fSAndroid Build Coastguard Worker CXFA_LocaleMgr* pLocaleMgr = GetDocument()->GetLocaleMgr();
4705*3ac0a46fSAndroid Build Coastguard Worker GCedLocaleIface* pLocale = GetLocale();
4706*3ac0a46fSAndroid Build Coastguard Worker CXFA_LocaleValue widgetValue = XFA_GetLocaleValue(this);
4707*3ac0a46fSAndroid Build Coastguard Worker bValidate =
4708*3ac0a46fSAndroid Build Coastguard Worker widgetValue.ValidateValue(wsValue, wsPicture, pLocale, &wsPicture);
4709*3ac0a46fSAndroid Build Coastguard Worker if (bValidate) {
4710*3ac0a46fSAndroid Build Coastguard Worker widgetValue = CXFA_LocaleValue(widgetValue.GetType(), wsNewText,
4711*3ac0a46fSAndroid Build Coastguard Worker wsPicture, pLocale, pLocaleMgr);
4712*3ac0a46fSAndroid Build Coastguard Worker wsNewText = widgetValue.GetValue();
4713*3ac0a46fSAndroid Build Coastguard Worker if (eType == XFA_Element::NumericEdit)
4714*3ac0a46fSAndroid Build Coastguard Worker wsNewText = NumericLimit(wsNewText);
4715*3ac0a46fSAndroid Build Coastguard Worker
4716*3ac0a46fSAndroid Build Coastguard Worker bSyncData = true;
4717*3ac0a46fSAndroid Build Coastguard Worker }
4718*3ac0a46fSAndroid Build Coastguard Worker } else if (eType == XFA_Element::NumericEdit) {
4719*3ac0a46fSAndroid Build Coastguard Worker if (!wsNewText.EqualsASCII("0"))
4720*3ac0a46fSAndroid Build Coastguard Worker wsNewText = NumericLimit(wsNewText);
4721*3ac0a46fSAndroid Build Coastguard Worker
4722*3ac0a46fSAndroid Build Coastguard Worker bSyncData = true;
4723*3ac0a46fSAndroid Build Coastguard Worker }
4724*3ac0a46fSAndroid Build Coastguard Worker if (eType != XFA_Element::NumericEdit || bSyncData)
4725*3ac0a46fSAndroid Build Coastguard Worker SyncValue(wsNewText, true);
4726*3ac0a46fSAndroid Build Coastguard Worker
4727*3ac0a46fSAndroid Build Coastguard Worker return bValidate;
4728*3ac0a46fSAndroid Build Coastguard Worker }
4729*3ac0a46fSAndroid Build Coastguard Worker
GetPictureContent(XFA_ValuePicture ePicture)4730*3ac0a46fSAndroid Build Coastguard Worker WideString CXFA_Node::GetPictureContent(XFA_ValuePicture ePicture) {
4731*3ac0a46fSAndroid Build Coastguard Worker if (ePicture == XFA_ValuePicture::kRaw)
4732*3ac0a46fSAndroid Build Coastguard Worker return WideString();
4733*3ac0a46fSAndroid Build Coastguard Worker
4734*3ac0a46fSAndroid Build Coastguard Worker CXFA_LocaleValue widgetValue = XFA_GetLocaleValue(this);
4735*3ac0a46fSAndroid Build Coastguard Worker switch (ePicture) {
4736*3ac0a46fSAndroid Build Coastguard Worker case XFA_ValuePicture::kDisplay: {
4737*3ac0a46fSAndroid Build Coastguard Worker auto* pFormat = GetChild<CXFA_Format>(0, XFA_Element::Format, false);
4738*3ac0a46fSAndroid Build Coastguard Worker if (pFormat) {
4739*3ac0a46fSAndroid Build Coastguard Worker auto* pPicture =
4740*3ac0a46fSAndroid Build Coastguard Worker pFormat->GetChild<CXFA_Picture>(0, XFA_Element::Picture, false);
4741*3ac0a46fSAndroid Build Coastguard Worker if (pPicture) {
4742*3ac0a46fSAndroid Build Coastguard Worker absl::optional<WideString> picture =
4743*3ac0a46fSAndroid Build Coastguard Worker pPicture->JSObject()->TryContent(false, true);
4744*3ac0a46fSAndroid Build Coastguard Worker if (picture.has_value())
4745*3ac0a46fSAndroid Build Coastguard Worker return picture.value();
4746*3ac0a46fSAndroid Build Coastguard Worker }
4747*3ac0a46fSAndroid Build Coastguard Worker }
4748*3ac0a46fSAndroid Build Coastguard Worker
4749*3ac0a46fSAndroid Build Coastguard Worker LocaleIface* pLocale = GetLocale();
4750*3ac0a46fSAndroid Build Coastguard Worker if (!pLocale)
4751*3ac0a46fSAndroid Build Coastguard Worker return WideString();
4752*3ac0a46fSAndroid Build Coastguard Worker
4753*3ac0a46fSAndroid Build Coastguard Worker switch (widgetValue.GetType()) {
4754*3ac0a46fSAndroid Build Coastguard Worker case CXFA_LocaleValue::ValueType::kDate:
4755*3ac0a46fSAndroid Build Coastguard Worker return pLocale->GetDatePattern(
4756*3ac0a46fSAndroid Build Coastguard Worker LocaleIface::DateTimeSubcategory::kMedium);
4757*3ac0a46fSAndroid Build Coastguard Worker case CXFA_LocaleValue::ValueType::kTime:
4758*3ac0a46fSAndroid Build Coastguard Worker return pLocale->GetTimePattern(
4759*3ac0a46fSAndroid Build Coastguard Worker LocaleIface::DateTimeSubcategory::kMedium);
4760*3ac0a46fSAndroid Build Coastguard Worker case CXFA_LocaleValue::ValueType::kDateTime:
4761*3ac0a46fSAndroid Build Coastguard Worker return pLocale->GetDatePattern(
4762*3ac0a46fSAndroid Build Coastguard Worker LocaleIface::DateTimeSubcategory::kMedium) +
4763*3ac0a46fSAndroid Build Coastguard Worker L"T" +
4764*3ac0a46fSAndroid Build Coastguard Worker pLocale->GetTimePattern(
4765*3ac0a46fSAndroid Build Coastguard Worker LocaleIface::DateTimeSubcategory::kMedium);
4766*3ac0a46fSAndroid Build Coastguard Worker case CXFA_LocaleValue::ValueType::kDecimal:
4767*3ac0a46fSAndroid Build Coastguard Worker case CXFA_LocaleValue::ValueType::kFloat:
4768*3ac0a46fSAndroid Build Coastguard Worker default:
4769*3ac0a46fSAndroid Build Coastguard Worker return WideString();
4770*3ac0a46fSAndroid Build Coastguard Worker }
4771*3ac0a46fSAndroid Build Coastguard Worker }
4772*3ac0a46fSAndroid Build Coastguard Worker case XFA_ValuePicture::kEdit: {
4773*3ac0a46fSAndroid Build Coastguard Worker CXFA_Ui* pUI = GetChild<CXFA_Ui>(0, XFA_Element::Ui, false);
4774*3ac0a46fSAndroid Build Coastguard Worker if (pUI) {
4775*3ac0a46fSAndroid Build Coastguard Worker if (CXFA_Picture* pPicture =
4776*3ac0a46fSAndroid Build Coastguard Worker pUI->GetChild<CXFA_Picture>(0, XFA_Element::Picture, false)) {
4777*3ac0a46fSAndroid Build Coastguard Worker absl::optional<WideString> picture =
4778*3ac0a46fSAndroid Build Coastguard Worker pPicture->JSObject()->TryContent(false, true);
4779*3ac0a46fSAndroid Build Coastguard Worker if (picture.has_value())
4780*3ac0a46fSAndroid Build Coastguard Worker return picture.value();
4781*3ac0a46fSAndroid Build Coastguard Worker }
4782*3ac0a46fSAndroid Build Coastguard Worker }
4783*3ac0a46fSAndroid Build Coastguard Worker
4784*3ac0a46fSAndroid Build Coastguard Worker LocaleIface* pLocale = GetLocale();
4785*3ac0a46fSAndroid Build Coastguard Worker if (!pLocale)
4786*3ac0a46fSAndroid Build Coastguard Worker return WideString();
4787*3ac0a46fSAndroid Build Coastguard Worker
4788*3ac0a46fSAndroid Build Coastguard Worker switch (widgetValue.GetType()) {
4789*3ac0a46fSAndroid Build Coastguard Worker case CXFA_LocaleValue::ValueType::kDate:
4790*3ac0a46fSAndroid Build Coastguard Worker return pLocale->GetDatePattern(
4791*3ac0a46fSAndroid Build Coastguard Worker LocaleIface::DateTimeSubcategory::kShort);
4792*3ac0a46fSAndroid Build Coastguard Worker case CXFA_LocaleValue::ValueType::kTime:
4793*3ac0a46fSAndroid Build Coastguard Worker return pLocale->GetTimePattern(
4794*3ac0a46fSAndroid Build Coastguard Worker LocaleIface::DateTimeSubcategory::kShort);
4795*3ac0a46fSAndroid Build Coastguard Worker case CXFA_LocaleValue::ValueType::kDateTime:
4796*3ac0a46fSAndroid Build Coastguard Worker return pLocale->GetDatePattern(
4797*3ac0a46fSAndroid Build Coastguard Worker LocaleIface::DateTimeSubcategory::kShort) +
4798*3ac0a46fSAndroid Build Coastguard Worker L"T" +
4799*3ac0a46fSAndroid Build Coastguard Worker pLocale->GetTimePattern(
4800*3ac0a46fSAndroid Build Coastguard Worker LocaleIface::DateTimeSubcategory::kShort);
4801*3ac0a46fSAndroid Build Coastguard Worker default:
4802*3ac0a46fSAndroid Build Coastguard Worker return WideString();
4803*3ac0a46fSAndroid Build Coastguard Worker }
4804*3ac0a46fSAndroid Build Coastguard Worker }
4805*3ac0a46fSAndroid Build Coastguard Worker case XFA_ValuePicture::kDataBind: {
4806*3ac0a46fSAndroid Build Coastguard Worker CXFA_Bind* bind = GetBindIfExists();
4807*3ac0a46fSAndroid Build Coastguard Worker if (bind)
4808*3ac0a46fSAndroid Build Coastguard Worker return bind->GetPicture();
4809*3ac0a46fSAndroid Build Coastguard Worker break;
4810*3ac0a46fSAndroid Build Coastguard Worker }
4811*3ac0a46fSAndroid Build Coastguard Worker default:
4812*3ac0a46fSAndroid Build Coastguard Worker break;
4813*3ac0a46fSAndroid Build Coastguard Worker }
4814*3ac0a46fSAndroid Build Coastguard Worker return WideString();
4815*3ac0a46fSAndroid Build Coastguard Worker }
4816*3ac0a46fSAndroid Build Coastguard Worker
GetValue(XFA_ValuePicture eValueType)4817*3ac0a46fSAndroid Build Coastguard Worker WideString CXFA_Node::GetValue(XFA_ValuePicture eValueType) {
4818*3ac0a46fSAndroid Build Coastguard Worker WideString wsValue = JSObject()->GetContent(false);
4819*3ac0a46fSAndroid Build Coastguard Worker
4820*3ac0a46fSAndroid Build Coastguard Worker if (eValueType == XFA_ValuePicture::kDisplay)
4821*3ac0a46fSAndroid Build Coastguard Worker wsValue = GetItemLabel(wsValue.AsStringView());
4822*3ac0a46fSAndroid Build Coastguard Worker
4823*3ac0a46fSAndroid Build Coastguard Worker WideString wsPicture = GetPictureContent(eValueType);
4824*3ac0a46fSAndroid Build Coastguard Worker CXFA_Node* pNode = GetUIChildNode();
4825*3ac0a46fSAndroid Build Coastguard Worker if (!pNode)
4826*3ac0a46fSAndroid Build Coastguard Worker return wsValue;
4827*3ac0a46fSAndroid Build Coastguard Worker
4828*3ac0a46fSAndroid Build Coastguard Worker switch (pNode->GetElementType()) {
4829*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::ChoiceList: {
4830*3ac0a46fSAndroid Build Coastguard Worker if (eValueType == XFA_ValuePicture::kDisplay) {
4831*3ac0a46fSAndroid Build Coastguard Worker int32_t iSelItemIndex = GetSelectedItem(0);
4832*3ac0a46fSAndroid Build Coastguard Worker if (iSelItemIndex >= 0) {
4833*3ac0a46fSAndroid Build Coastguard Worker wsValue =
4834*3ac0a46fSAndroid Build Coastguard Worker GetChoiceListItem(iSelItemIndex, false).value_or(WideString());
4835*3ac0a46fSAndroid Build Coastguard Worker wsPicture.clear();
4836*3ac0a46fSAndroid Build Coastguard Worker }
4837*3ac0a46fSAndroid Build Coastguard Worker }
4838*3ac0a46fSAndroid Build Coastguard Worker break;
4839*3ac0a46fSAndroid Build Coastguard Worker }
4840*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::NumericEdit:
4841*3ac0a46fSAndroid Build Coastguard Worker if (eValueType != XFA_ValuePicture::kRaw && wsPicture.IsEmpty()) {
4842*3ac0a46fSAndroid Build Coastguard Worker LocaleIface* pLocale = GetLocale();
4843*3ac0a46fSAndroid Build Coastguard Worker if (eValueType == XFA_ValuePicture::kDisplay && pLocale)
4844*3ac0a46fSAndroid Build Coastguard Worker wsValue = FormatNumStr(NormalizeNumStr(wsValue), pLocale);
4845*3ac0a46fSAndroid Build Coastguard Worker }
4846*3ac0a46fSAndroid Build Coastguard Worker break;
4847*3ac0a46fSAndroid Build Coastguard Worker default:
4848*3ac0a46fSAndroid Build Coastguard Worker break;
4849*3ac0a46fSAndroid Build Coastguard Worker }
4850*3ac0a46fSAndroid Build Coastguard Worker if (wsPicture.IsEmpty())
4851*3ac0a46fSAndroid Build Coastguard Worker return wsValue;
4852*3ac0a46fSAndroid Build Coastguard Worker
4853*3ac0a46fSAndroid Build Coastguard Worker GCedLocaleIface* pLocale = GetLocale();
4854*3ac0a46fSAndroid Build Coastguard Worker if (pLocale) {
4855*3ac0a46fSAndroid Build Coastguard Worker CXFA_LocaleValue widgetValue = XFA_GetLocaleValue(this);
4856*3ac0a46fSAndroid Build Coastguard Worker CXFA_LocaleMgr* pLocaleMgr = GetDocument()->GetLocaleMgr();
4857*3ac0a46fSAndroid Build Coastguard Worker switch (widgetValue.GetType()) {
4858*3ac0a46fSAndroid Build Coastguard Worker case CXFA_LocaleValue::ValueType::kDate: {
4859*3ac0a46fSAndroid Build Coastguard Worker WideString wsDate, wsTime;
4860*3ac0a46fSAndroid Build Coastguard Worker if (SplitDateTime(wsValue, wsDate, wsTime)) {
4861*3ac0a46fSAndroid Build Coastguard Worker CXFA_LocaleValue date(CXFA_LocaleValue::ValueType::kDate, wsDate,
4862*3ac0a46fSAndroid Build Coastguard Worker pLocaleMgr);
4863*3ac0a46fSAndroid Build Coastguard Worker if (date.FormatPatterns(wsValue, wsPicture, pLocale, eValueType))
4864*3ac0a46fSAndroid Build Coastguard Worker return wsValue;
4865*3ac0a46fSAndroid Build Coastguard Worker }
4866*3ac0a46fSAndroid Build Coastguard Worker break;
4867*3ac0a46fSAndroid Build Coastguard Worker }
4868*3ac0a46fSAndroid Build Coastguard Worker case CXFA_LocaleValue::ValueType::kTime: {
4869*3ac0a46fSAndroid Build Coastguard Worker WideString wsDate, wsTime;
4870*3ac0a46fSAndroid Build Coastguard Worker if (SplitDateTime(wsValue, wsDate, wsTime)) {
4871*3ac0a46fSAndroid Build Coastguard Worker CXFA_LocaleValue time(CXFA_LocaleValue::ValueType::kTime, wsTime,
4872*3ac0a46fSAndroid Build Coastguard Worker pLocaleMgr);
4873*3ac0a46fSAndroid Build Coastguard Worker if (time.FormatPatterns(wsValue, wsPicture, pLocale, eValueType))
4874*3ac0a46fSAndroid Build Coastguard Worker return wsValue;
4875*3ac0a46fSAndroid Build Coastguard Worker }
4876*3ac0a46fSAndroid Build Coastguard Worker break;
4877*3ac0a46fSAndroid Build Coastguard Worker }
4878*3ac0a46fSAndroid Build Coastguard Worker default:
4879*3ac0a46fSAndroid Build Coastguard Worker break;
4880*3ac0a46fSAndroid Build Coastguard Worker }
4881*3ac0a46fSAndroid Build Coastguard Worker widgetValue.FormatPatterns(wsValue, wsPicture, pLocale, eValueType);
4882*3ac0a46fSAndroid Build Coastguard Worker }
4883*3ac0a46fSAndroid Build Coastguard Worker return wsValue;
4884*3ac0a46fSAndroid Build Coastguard Worker }
4885*3ac0a46fSAndroid Build Coastguard Worker
GetNormalizeDataValue(const WideString & wsValue)4886*3ac0a46fSAndroid Build Coastguard Worker WideString CXFA_Node::GetNormalizeDataValue(const WideString& wsValue) {
4887*3ac0a46fSAndroid Build Coastguard Worker if (wsValue.IsEmpty())
4888*3ac0a46fSAndroid Build Coastguard Worker return WideString();
4889*3ac0a46fSAndroid Build Coastguard Worker
4890*3ac0a46fSAndroid Build Coastguard Worker WideString wsPicture = GetPictureContent(XFA_ValuePicture::kDataBind);
4891*3ac0a46fSAndroid Build Coastguard Worker if (wsPicture.IsEmpty())
4892*3ac0a46fSAndroid Build Coastguard Worker return wsValue;
4893*3ac0a46fSAndroid Build Coastguard Worker
4894*3ac0a46fSAndroid Build Coastguard Worker CXFA_LocaleMgr* pLocaleMgr = GetDocument()->GetLocaleMgr();
4895*3ac0a46fSAndroid Build Coastguard Worker GCedLocaleIface* pLocale = GetLocale();
4896*3ac0a46fSAndroid Build Coastguard Worker CXFA_LocaleValue widgetValue = XFA_GetLocaleValue(this);
4897*3ac0a46fSAndroid Build Coastguard Worker if (widgetValue.ValidateValue(wsValue, wsPicture, pLocale, &wsPicture)) {
4898*3ac0a46fSAndroid Build Coastguard Worker widgetValue = CXFA_LocaleValue(widgetValue.GetType(), wsValue, wsPicture,
4899*3ac0a46fSAndroid Build Coastguard Worker pLocale, pLocaleMgr);
4900*3ac0a46fSAndroid Build Coastguard Worker return widgetValue.GetValue();
4901*3ac0a46fSAndroid Build Coastguard Worker }
4902*3ac0a46fSAndroid Build Coastguard Worker return wsValue;
4903*3ac0a46fSAndroid Build Coastguard Worker }
4904*3ac0a46fSAndroid Build Coastguard Worker
GetFormatDataValue(const WideString & wsValue)4905*3ac0a46fSAndroid Build Coastguard Worker WideString CXFA_Node::GetFormatDataValue(const WideString& wsValue) {
4906*3ac0a46fSAndroid Build Coastguard Worker if (wsValue.IsEmpty())
4907*3ac0a46fSAndroid Build Coastguard Worker return WideString();
4908*3ac0a46fSAndroid Build Coastguard Worker
4909*3ac0a46fSAndroid Build Coastguard Worker WideString wsPicture = GetPictureContent(XFA_ValuePicture::kDataBind);
4910*3ac0a46fSAndroid Build Coastguard Worker if (wsPicture.IsEmpty())
4911*3ac0a46fSAndroid Build Coastguard Worker return wsValue;
4912*3ac0a46fSAndroid Build Coastguard Worker
4913*3ac0a46fSAndroid Build Coastguard Worker WideString wsFormattedValue = wsValue;
4914*3ac0a46fSAndroid Build Coastguard Worker GCedLocaleIface* pLocale = GetLocale();
4915*3ac0a46fSAndroid Build Coastguard Worker if (pLocale) {
4916*3ac0a46fSAndroid Build Coastguard Worker CXFA_Value* pNodeValue = GetChild<CXFA_Value>(0, XFA_Element::Value, false);
4917*3ac0a46fSAndroid Build Coastguard Worker if (!pNodeValue)
4918*3ac0a46fSAndroid Build Coastguard Worker return wsValue;
4919*3ac0a46fSAndroid Build Coastguard Worker
4920*3ac0a46fSAndroid Build Coastguard Worker CXFA_Node* pValueChild = pNodeValue->GetFirstChild();
4921*3ac0a46fSAndroid Build Coastguard Worker if (!pValueChild)
4922*3ac0a46fSAndroid Build Coastguard Worker return wsValue;
4923*3ac0a46fSAndroid Build Coastguard Worker
4924*3ac0a46fSAndroid Build Coastguard Worker CXFA_LocaleValue::ValueType iVTType =
4925*3ac0a46fSAndroid Build Coastguard Worker XFA_GetLocaleValueType(pValueChild->GetElementType());
4926*3ac0a46fSAndroid Build Coastguard Worker CXFA_LocaleMgr* pLocaleMgr = GetDocument()->GetLocaleMgr();
4927*3ac0a46fSAndroid Build Coastguard Worker CXFA_LocaleValue widgetValue(iVTType, wsValue, pLocaleMgr);
4928*3ac0a46fSAndroid Build Coastguard Worker switch (widgetValue.GetType()) {
4929*3ac0a46fSAndroid Build Coastguard Worker case CXFA_LocaleValue::ValueType::kDate: {
4930*3ac0a46fSAndroid Build Coastguard Worker WideString wsDate, wsTime;
4931*3ac0a46fSAndroid Build Coastguard Worker if (SplitDateTime(wsValue, wsDate, wsTime)) {
4932*3ac0a46fSAndroid Build Coastguard Worker CXFA_LocaleValue date(CXFA_LocaleValue::ValueType::kDate, wsDate,
4933*3ac0a46fSAndroid Build Coastguard Worker pLocaleMgr);
4934*3ac0a46fSAndroid Build Coastguard Worker if (date.FormatPatterns(wsFormattedValue, wsPicture, pLocale,
4935*3ac0a46fSAndroid Build Coastguard Worker XFA_ValuePicture::kDataBind)) {
4936*3ac0a46fSAndroid Build Coastguard Worker return wsFormattedValue;
4937*3ac0a46fSAndroid Build Coastguard Worker }
4938*3ac0a46fSAndroid Build Coastguard Worker }
4939*3ac0a46fSAndroid Build Coastguard Worker break;
4940*3ac0a46fSAndroid Build Coastguard Worker }
4941*3ac0a46fSAndroid Build Coastguard Worker case CXFA_LocaleValue::ValueType::kTime: {
4942*3ac0a46fSAndroid Build Coastguard Worker WideString wsDate, wsTime;
4943*3ac0a46fSAndroid Build Coastguard Worker if (SplitDateTime(wsValue, wsDate, wsTime)) {
4944*3ac0a46fSAndroid Build Coastguard Worker CXFA_LocaleValue time(CXFA_LocaleValue::ValueType::kTime, wsTime,
4945*3ac0a46fSAndroid Build Coastguard Worker pLocaleMgr);
4946*3ac0a46fSAndroid Build Coastguard Worker if (time.FormatPatterns(wsFormattedValue, wsPicture, pLocale,
4947*3ac0a46fSAndroid Build Coastguard Worker XFA_ValuePicture::kDataBind)) {
4948*3ac0a46fSAndroid Build Coastguard Worker return wsFormattedValue;
4949*3ac0a46fSAndroid Build Coastguard Worker }
4950*3ac0a46fSAndroid Build Coastguard Worker }
4951*3ac0a46fSAndroid Build Coastguard Worker break;
4952*3ac0a46fSAndroid Build Coastguard Worker }
4953*3ac0a46fSAndroid Build Coastguard Worker default:
4954*3ac0a46fSAndroid Build Coastguard Worker break;
4955*3ac0a46fSAndroid Build Coastguard Worker }
4956*3ac0a46fSAndroid Build Coastguard Worker widgetValue.FormatPatterns(wsFormattedValue, wsPicture, pLocale,
4957*3ac0a46fSAndroid Build Coastguard Worker XFA_ValuePicture::kDataBind);
4958*3ac0a46fSAndroid Build Coastguard Worker }
4959*3ac0a46fSAndroid Build Coastguard Worker return wsFormattedValue;
4960*3ac0a46fSAndroid Build Coastguard Worker }
4961*3ac0a46fSAndroid Build Coastguard Worker
NormalizeNumStr(const WideString & wsValue)4962*3ac0a46fSAndroid Build Coastguard Worker WideString CXFA_Node::NormalizeNumStr(const WideString& wsValue) {
4963*3ac0a46fSAndroid Build Coastguard Worker if (wsValue.IsEmpty())
4964*3ac0a46fSAndroid Build Coastguard Worker return WideString();
4965*3ac0a46fSAndroid Build Coastguard Worker
4966*3ac0a46fSAndroid Build Coastguard Worker WideString wsOutput = wsValue;
4967*3ac0a46fSAndroid Build Coastguard Worker wsOutput.TrimLeft('0');
4968*3ac0a46fSAndroid Build Coastguard Worker
4969*3ac0a46fSAndroid Build Coastguard Worker if (!wsOutput.IsEmpty() && wsOutput.Contains('.') && GetFracDigits() != -1) {
4970*3ac0a46fSAndroid Build Coastguard Worker wsOutput.TrimRight(L"0");
4971*3ac0a46fSAndroid Build Coastguard Worker wsOutput.TrimRight(L".");
4972*3ac0a46fSAndroid Build Coastguard Worker }
4973*3ac0a46fSAndroid Build Coastguard Worker if (wsOutput.IsEmpty() || wsOutput[0] == '.')
4974*3ac0a46fSAndroid Build Coastguard Worker wsOutput.InsertAtFront('0');
4975*3ac0a46fSAndroid Build Coastguard Worker
4976*3ac0a46fSAndroid Build Coastguard Worker return wsOutput;
4977*3ac0a46fSAndroid Build Coastguard Worker }
4978*3ac0a46fSAndroid Build Coastguard Worker
InsertListTextItem(CXFA_Node * pItems,const WideString & wsText,int32_t nIndex)4979*3ac0a46fSAndroid Build Coastguard Worker void CXFA_Node::InsertListTextItem(CXFA_Node* pItems,
4980*3ac0a46fSAndroid Build Coastguard Worker const WideString& wsText,
4981*3ac0a46fSAndroid Build Coastguard Worker int32_t nIndex) {
4982*3ac0a46fSAndroid Build Coastguard Worker CXFA_Node* pText = pItems->CreateSamePacketNode(XFA_Element::Text);
4983*3ac0a46fSAndroid Build Coastguard Worker pItems->InsertChildAndNotify(nIndex, pText);
4984*3ac0a46fSAndroid Build Coastguard Worker pText->JSObject()->SetContent(wsText, wsText, false, false, false);
4985*3ac0a46fSAndroid Build Coastguard Worker }
4986*3ac0a46fSAndroid Build Coastguard Worker
NumericLimit(const WideString & wsValue)4987*3ac0a46fSAndroid Build Coastguard Worker WideString CXFA_Node::NumericLimit(const WideString& wsValue) {
4988*3ac0a46fSAndroid Build Coastguard Worker int32_t iLead = GetLeadDigits();
4989*3ac0a46fSAndroid Build Coastguard Worker int32_t iTread = GetFracDigits();
4990*3ac0a46fSAndroid Build Coastguard Worker if (iLead == -1 && iTread == -1)
4991*3ac0a46fSAndroid Build Coastguard Worker return wsValue;
4992*3ac0a46fSAndroid Build Coastguard Worker
4993*3ac0a46fSAndroid Build Coastguard Worker int32_t iCount = pdfium::base::checked_cast<int32_t>(wsValue.GetLength());
4994*3ac0a46fSAndroid Build Coastguard Worker if (iCount == 0)
4995*3ac0a46fSAndroid Build Coastguard Worker return wsValue;
4996*3ac0a46fSAndroid Build Coastguard Worker
4997*3ac0a46fSAndroid Build Coastguard Worker WideString wsRet;
4998*3ac0a46fSAndroid Build Coastguard Worker int32_t i = 0;
4999*3ac0a46fSAndroid Build Coastguard Worker if (wsValue[i] == L'-') {
5000*3ac0a46fSAndroid Build Coastguard Worker wsRet += L'-';
5001*3ac0a46fSAndroid Build Coastguard Worker i++;
5002*3ac0a46fSAndroid Build Coastguard Worker }
5003*3ac0a46fSAndroid Build Coastguard Worker
5004*3ac0a46fSAndroid Build Coastguard Worker int32_t iLead2 = 0;
5005*3ac0a46fSAndroid Build Coastguard Worker int32_t iTread2 = -1;
5006*3ac0a46fSAndroid Build Coastguard Worker for (; i < iCount; i++) {
5007*3ac0a46fSAndroid Build Coastguard Worker wchar_t wc = wsValue[i];
5008*3ac0a46fSAndroid Build Coastguard Worker if (FXSYS_IsDecimalDigit(wc)) {
5009*3ac0a46fSAndroid Build Coastguard Worker if (iLead >= 0) {
5010*3ac0a46fSAndroid Build Coastguard Worker iLead2++;
5011*3ac0a46fSAndroid Build Coastguard Worker if (iLead2 > iLead)
5012*3ac0a46fSAndroid Build Coastguard Worker return L"0";
5013*3ac0a46fSAndroid Build Coastguard Worker } else if (iTread2 >= 0) {
5014*3ac0a46fSAndroid Build Coastguard Worker iTread2++;
5015*3ac0a46fSAndroid Build Coastguard Worker if (iTread2 > iTread) {
5016*3ac0a46fSAndroid Build Coastguard Worker if (iTread != -1) {
5017*3ac0a46fSAndroid Build Coastguard Worker CFGAS_Decimal wsDeci = CFGAS_Decimal(wsValue.AsStringView());
5018*3ac0a46fSAndroid Build Coastguard Worker wsDeci.SetScale(iTread);
5019*3ac0a46fSAndroid Build Coastguard Worker wsRet = wsDeci.ToWideString();
5020*3ac0a46fSAndroid Build Coastguard Worker }
5021*3ac0a46fSAndroid Build Coastguard Worker return wsRet;
5022*3ac0a46fSAndroid Build Coastguard Worker }
5023*3ac0a46fSAndroid Build Coastguard Worker }
5024*3ac0a46fSAndroid Build Coastguard Worker } else if (wc == L'.') {
5025*3ac0a46fSAndroid Build Coastguard Worker iTread2 = 0;
5026*3ac0a46fSAndroid Build Coastguard Worker iLead = -1;
5027*3ac0a46fSAndroid Build Coastguard Worker }
5028*3ac0a46fSAndroid Build Coastguard Worker wsRet += wc;
5029*3ac0a46fSAndroid Build Coastguard Worker }
5030*3ac0a46fSAndroid Build Coastguard Worker return wsRet;
5031*3ac0a46fSAndroid Build Coastguard Worker }
5032*3ac0a46fSAndroid Build Coastguard Worker
IsTransparent() const5033*3ac0a46fSAndroid Build Coastguard Worker bool CXFA_Node::IsTransparent() const {
5034*3ac0a46fSAndroid Build Coastguard Worker XFA_Element type = GetElementType();
5035*3ac0a46fSAndroid Build Coastguard Worker return type == XFA_Element::SubformSet || type == XFA_Element::Area ||
5036*3ac0a46fSAndroid Build Coastguard Worker type == XFA_Element::Proto || (IsUnnamed() && IsContainerNode());
5037*3ac0a46fSAndroid Build Coastguard Worker }
5038*3ac0a46fSAndroid Build Coastguard Worker
IsProperty() const5039*3ac0a46fSAndroid Build Coastguard Worker bool CXFA_Node::IsProperty() const {
5040*3ac0a46fSAndroid Build Coastguard Worker CXFA_Node* parent = GetParent();
5041*3ac0a46fSAndroid Build Coastguard Worker return parent && parent->HasProperty(GetElementType());
5042*3ac0a46fSAndroid Build Coastguard Worker }
5043*3ac0a46fSAndroid Build Coastguard Worker
PresenceRequiresSpace() const5044*3ac0a46fSAndroid Build Coastguard Worker bool CXFA_Node::PresenceRequiresSpace() const {
5045*3ac0a46fSAndroid Build Coastguard Worker auto value = JSObject()->TryEnum(XFA_Attribute::Presence, true);
5046*3ac0a46fSAndroid Build Coastguard Worker XFA_AttributeValue ePresence = value.value_or(XFA_AttributeValue::Visible);
5047*3ac0a46fSAndroid Build Coastguard Worker return ePresence == XFA_AttributeValue::Visible ||
5048*3ac0a46fSAndroid Build Coastguard Worker ePresence == XFA_AttributeValue::Invisible;
5049*3ac0a46fSAndroid Build Coastguard Worker }
5050*3ac0a46fSAndroid Build Coastguard Worker
SetBindingNode(CXFA_Node * node)5051*3ac0a46fSAndroid Build Coastguard Worker void CXFA_Node::SetBindingNode(CXFA_Node* node) {
5052*3ac0a46fSAndroid Build Coastguard Worker binding_nodes_.clear();
5053*3ac0a46fSAndroid Build Coastguard Worker if (node)
5054*3ac0a46fSAndroid Build Coastguard Worker binding_nodes_.emplace_back(node);
5055*3ac0a46fSAndroid Build Coastguard Worker }
5056*3ac0a46fSAndroid Build Coastguard Worker
SetNodeAndDescendantsUnused()5057*3ac0a46fSAndroid Build Coastguard Worker void CXFA_Node::SetNodeAndDescendantsUnused() {
5058*3ac0a46fSAndroid Build Coastguard Worker CXFA_NodeIterator sIterator(this);
5059*3ac0a46fSAndroid Build Coastguard Worker for (CXFA_Node* pNode = sIterator.GetCurrent(); pNode;
5060*3ac0a46fSAndroid Build Coastguard Worker pNode = sIterator.MoveToNext()) {
5061*3ac0a46fSAndroid Build Coastguard Worker pNode->SetFlag(XFA_NodeFlag::kUnusedNode);
5062*3ac0a46fSAndroid Build Coastguard Worker }
5063*3ac0a46fSAndroid Build Coastguard Worker }
5064*3ac0a46fSAndroid Build Coastguard Worker
SetToXML(const WideString & value)5065*3ac0a46fSAndroid Build Coastguard Worker void CXFA_Node::SetToXML(const WideString& value) {
5066*3ac0a46fSAndroid Build Coastguard Worker auto* pNode = GetXMLMappingNode();
5067*3ac0a46fSAndroid Build Coastguard Worker switch (pNode->GetType()) {
5068*3ac0a46fSAndroid Build Coastguard Worker case CFX_XMLNode::Type::kElement: {
5069*3ac0a46fSAndroid Build Coastguard Worker auto* elem = static_cast<CFX_XMLElement*>(pNode);
5070*3ac0a46fSAndroid Build Coastguard Worker if (IsAttributeInXML()) {
5071*3ac0a46fSAndroid Build Coastguard Worker elem->SetAttribute(JSObject()->GetCData(XFA_Attribute::QualifiedName),
5072*3ac0a46fSAndroid Build Coastguard Worker value);
5073*3ac0a46fSAndroid Build Coastguard Worker return;
5074*3ac0a46fSAndroid Build Coastguard Worker }
5075*3ac0a46fSAndroid Build Coastguard Worker
5076*3ac0a46fSAndroid Build Coastguard Worker bool bDeleteChildren = true;
5077*3ac0a46fSAndroid Build Coastguard Worker if (GetPacketType() == XFA_PacketType::Datasets) {
5078*3ac0a46fSAndroid Build Coastguard Worker for (CXFA_Node* pChildDataNode = GetFirstChild(); pChildDataNode;
5079*3ac0a46fSAndroid Build Coastguard Worker pChildDataNode = pChildDataNode->GetNextSibling()) {
5080*3ac0a46fSAndroid Build Coastguard Worker if (pChildDataNode->HasBindItems()) {
5081*3ac0a46fSAndroid Build Coastguard Worker bDeleteChildren = false;
5082*3ac0a46fSAndroid Build Coastguard Worker break;
5083*3ac0a46fSAndroid Build Coastguard Worker }
5084*3ac0a46fSAndroid Build Coastguard Worker }
5085*3ac0a46fSAndroid Build Coastguard Worker }
5086*3ac0a46fSAndroid Build Coastguard Worker if (bDeleteChildren)
5087*3ac0a46fSAndroid Build Coastguard Worker elem->RemoveAllChildren();
5088*3ac0a46fSAndroid Build Coastguard Worker
5089*3ac0a46fSAndroid Build Coastguard Worker auto* text = GetXMLDocument()->CreateNode<CFX_XMLText>(value);
5090*3ac0a46fSAndroid Build Coastguard Worker elem->AppendLastChild(text);
5091*3ac0a46fSAndroid Build Coastguard Worker break;
5092*3ac0a46fSAndroid Build Coastguard Worker }
5093*3ac0a46fSAndroid Build Coastguard Worker case CFX_XMLNode::Type::kText:
5094*3ac0a46fSAndroid Build Coastguard Worker ToXMLText(GetXMLMappingNode())->SetText(value);
5095*3ac0a46fSAndroid Build Coastguard Worker break;
5096*3ac0a46fSAndroid Build Coastguard Worker default:
5097*3ac0a46fSAndroid Build Coastguard Worker NOTREACHED_NORETURN();
5098*3ac0a46fSAndroid Build Coastguard Worker }
5099*3ac0a46fSAndroid Build Coastguard Worker }
5100*3ac0a46fSAndroid Build Coastguard Worker
GetTransparentParent()5101*3ac0a46fSAndroid Build Coastguard Worker CXFA_Node* CXFA_Node::GetTransparentParent() {
5102*3ac0a46fSAndroid Build Coastguard Worker CXFA_Node* parent = GetParent();
5103*3ac0a46fSAndroid Build Coastguard Worker while (parent) {
5104*3ac0a46fSAndroid Build Coastguard Worker XFA_Element type = parent->GetElementType();
5105*3ac0a46fSAndroid Build Coastguard Worker if (type == XFA_Element::Variables ||
5106*3ac0a46fSAndroid Build Coastguard Worker (type != XFA_Element::SubformSet && !parent->IsUnnamed())) {
5107*3ac0a46fSAndroid Build Coastguard Worker return parent;
5108*3ac0a46fSAndroid Build Coastguard Worker }
5109*3ac0a46fSAndroid Build Coastguard Worker parent = parent->GetParent();
5110*3ac0a46fSAndroid Build Coastguard Worker }
5111*3ac0a46fSAndroid Build Coastguard Worker return nullptr;
5112*3ac0a46fSAndroid Build Coastguard Worker }
5113*3ac0a46fSAndroid Build Coastguard Worker
GetXMLDocument() const5114*3ac0a46fSAndroid Build Coastguard Worker CFX_XMLDocument* CXFA_Node::GetXMLDocument() const {
5115*3ac0a46fSAndroid Build Coastguard Worker return GetDocument()->GetNotify()->GetFFDoc()->GetXMLDocument();
5116*3ac0a46fSAndroid Build Coastguard Worker }
5117*3ac0a46fSAndroid Build Coastguard Worker
5118*3ac0a46fSAndroid Build Coastguard Worker // static
Create(CXFA_Document * doc,XFA_Element element,XFA_PacketType packet)5119*3ac0a46fSAndroid Build Coastguard Worker CXFA_Node* CXFA_Node::Create(CXFA_Document* doc,
5120*3ac0a46fSAndroid Build Coastguard Worker XFA_Element element,
5121*3ac0a46fSAndroid Build Coastguard Worker XFA_PacketType packet) {
5122*3ac0a46fSAndroid Build Coastguard Worker CXFA_Node* node = nullptr;
5123*3ac0a46fSAndroid Build Coastguard Worker switch (element) {
5124*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::Ps:
5125*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_Ps>(
5126*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
5127*3ac0a46fSAndroid Build Coastguard Worker break;
5128*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::To:
5129*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_To>(
5130*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
5131*3ac0a46fSAndroid Build Coastguard Worker break;
5132*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::Ui:
5133*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_Ui>(
5134*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
5135*3ac0a46fSAndroid Build Coastguard Worker break;
5136*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::RecordSet:
5137*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_RecordSet>(
5138*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
5139*3ac0a46fSAndroid Build Coastguard Worker break;
5140*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::SubsetBelow:
5141*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_SubsetBelow>(
5142*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
5143*3ac0a46fSAndroid Build Coastguard Worker break;
5144*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::SubformSet:
5145*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_SubformSet>(
5146*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
5147*3ac0a46fSAndroid Build Coastguard Worker break;
5148*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::AdobeExtensionLevel:
5149*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_AdobeExtensionLevel>(
5150*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
5151*3ac0a46fSAndroid Build Coastguard Worker break;
5152*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::Typeface:
5153*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_Typeface>(
5154*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
5155*3ac0a46fSAndroid Build Coastguard Worker break;
5156*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::Break:
5157*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_Break>(
5158*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
5159*3ac0a46fSAndroid Build Coastguard Worker break;
5160*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::FontInfo:
5161*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_FontInfo>(
5162*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
5163*3ac0a46fSAndroid Build Coastguard Worker break;
5164*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::NumberPattern:
5165*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_NumberPattern>(
5166*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
5167*3ac0a46fSAndroid Build Coastguard Worker break;
5168*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::DynamicRender:
5169*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_DynamicRender>(
5170*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
5171*3ac0a46fSAndroid Build Coastguard Worker break;
5172*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::PrintScaling:
5173*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_PrintScaling>(
5174*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
5175*3ac0a46fSAndroid Build Coastguard Worker break;
5176*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::CheckButton:
5177*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_CheckButton>(
5178*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
5179*3ac0a46fSAndroid Build Coastguard Worker break;
5180*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::DatePatterns:
5181*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_DatePatterns>(
5182*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
5183*3ac0a46fSAndroid Build Coastguard Worker break;
5184*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::SourceSet:
5185*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_SourceSet>(
5186*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
5187*3ac0a46fSAndroid Build Coastguard Worker break;
5188*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::Amd:
5189*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_Amd>(
5190*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
5191*3ac0a46fSAndroid Build Coastguard Worker break;
5192*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::Arc:
5193*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_Arc>(
5194*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
5195*3ac0a46fSAndroid Build Coastguard Worker break;
5196*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::Day:
5197*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_Day>(
5198*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
5199*3ac0a46fSAndroid Build Coastguard Worker break;
5200*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::Era:
5201*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_Era>(
5202*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
5203*3ac0a46fSAndroid Build Coastguard Worker break;
5204*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::Jog:
5205*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_Jog>(
5206*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
5207*3ac0a46fSAndroid Build Coastguard Worker break;
5208*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::Log:
5209*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_Log>(
5210*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
5211*3ac0a46fSAndroid Build Coastguard Worker break;
5212*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::Map:
5213*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_Map>(
5214*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
5215*3ac0a46fSAndroid Build Coastguard Worker break;
5216*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::Mdp:
5217*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_Mdp>(
5218*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
5219*3ac0a46fSAndroid Build Coastguard Worker break;
5220*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::BreakBefore:
5221*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_BreakBefore>(
5222*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
5223*3ac0a46fSAndroid Build Coastguard Worker break;
5224*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::Oid:
5225*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_Oid>(
5226*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
5227*3ac0a46fSAndroid Build Coastguard Worker break;
5228*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::Pcl:
5229*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_Pcl>(
5230*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
5231*3ac0a46fSAndroid Build Coastguard Worker break;
5232*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::Pdf:
5233*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_Pdf>(
5234*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
5235*3ac0a46fSAndroid Build Coastguard Worker break;
5236*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::Ref:
5237*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_Ref>(
5238*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
5239*3ac0a46fSAndroid Build Coastguard Worker break;
5240*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::Uri:
5241*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_Uri>(
5242*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
5243*3ac0a46fSAndroid Build Coastguard Worker break;
5244*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::Xdc:
5245*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_Xdc>(
5246*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
5247*3ac0a46fSAndroid Build Coastguard Worker break;
5248*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::Xdp:
5249*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_Xdp>(
5250*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
5251*3ac0a46fSAndroid Build Coastguard Worker break;
5252*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::Xfa:
5253*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_Xfa>(
5254*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
5255*3ac0a46fSAndroid Build Coastguard Worker break;
5256*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::Xsl:
5257*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_Xsl>(
5258*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
5259*3ac0a46fSAndroid Build Coastguard Worker break;
5260*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::Zpl:
5261*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_Zpl>(
5262*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
5263*3ac0a46fSAndroid Build Coastguard Worker break;
5264*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::Cache:
5265*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_Cache>(
5266*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
5267*3ac0a46fSAndroid Build Coastguard Worker break;
5268*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::Margin:
5269*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_Margin>(
5270*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
5271*3ac0a46fSAndroid Build Coastguard Worker break;
5272*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::KeyUsage:
5273*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_KeyUsage>(
5274*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
5275*3ac0a46fSAndroid Build Coastguard Worker break;
5276*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::Exclude:
5277*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_Exclude>(
5278*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
5279*3ac0a46fSAndroid Build Coastguard Worker break;
5280*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::ChoiceList:
5281*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_ChoiceList>(
5282*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
5283*3ac0a46fSAndroid Build Coastguard Worker break;
5284*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::Level:
5285*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_Level>(
5286*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
5287*3ac0a46fSAndroid Build Coastguard Worker break;
5288*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::LabelPrinter:
5289*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_LabelPrinter>(
5290*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
5291*3ac0a46fSAndroid Build Coastguard Worker break;
5292*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::CalendarSymbols:
5293*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_CalendarSymbols>(
5294*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
5295*3ac0a46fSAndroid Build Coastguard Worker break;
5296*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::Para:
5297*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_Para>(
5298*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
5299*3ac0a46fSAndroid Build Coastguard Worker break;
5300*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::Part:
5301*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_Part>(
5302*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
5303*3ac0a46fSAndroid Build Coastguard Worker break;
5304*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::Pdfa:
5305*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_Pdfa>(
5306*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
5307*3ac0a46fSAndroid Build Coastguard Worker break;
5308*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::Filter:
5309*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_Filter>(
5310*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
5311*3ac0a46fSAndroid Build Coastguard Worker break;
5312*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::Present:
5313*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_Present>(
5314*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
5315*3ac0a46fSAndroid Build Coastguard Worker break;
5316*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::Pagination:
5317*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_Pagination>(
5318*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
5319*3ac0a46fSAndroid Build Coastguard Worker break;
5320*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::Encoding:
5321*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_Encoding>(
5322*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
5323*3ac0a46fSAndroid Build Coastguard Worker break;
5324*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::Event:
5325*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_Event>(
5326*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
5327*3ac0a46fSAndroid Build Coastguard Worker break;
5328*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::Whitespace:
5329*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_Whitespace>(
5330*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
5331*3ac0a46fSAndroid Build Coastguard Worker break;
5332*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::DefaultUi:
5333*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_DefaultUi>(
5334*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
5335*3ac0a46fSAndroid Build Coastguard Worker break;
5336*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::DataModel:
5337*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_DataModel>(
5338*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
5339*3ac0a46fSAndroid Build Coastguard Worker break;
5340*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::Barcode:
5341*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_Barcode>(
5342*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
5343*3ac0a46fSAndroid Build Coastguard Worker break;
5344*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::TimePattern:
5345*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_TimePattern>(
5346*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
5347*3ac0a46fSAndroid Build Coastguard Worker break;
5348*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::BatchOutput:
5349*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_BatchOutput>(
5350*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
5351*3ac0a46fSAndroid Build Coastguard Worker break;
5352*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::Enforce:
5353*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_Enforce>(
5354*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
5355*3ac0a46fSAndroid Build Coastguard Worker break;
5356*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::CurrencySymbols:
5357*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_CurrencySymbols>(
5358*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
5359*3ac0a46fSAndroid Build Coastguard Worker break;
5360*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::AddSilentPrint:
5361*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_AddSilentPrint>(
5362*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
5363*3ac0a46fSAndroid Build Coastguard Worker break;
5364*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::Rename:
5365*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_Rename>(
5366*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
5367*3ac0a46fSAndroid Build Coastguard Worker break;
5368*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::Operation:
5369*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_Operation>(
5370*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
5371*3ac0a46fSAndroid Build Coastguard Worker break;
5372*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::Typefaces:
5373*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_Typefaces>(
5374*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
5375*3ac0a46fSAndroid Build Coastguard Worker break;
5376*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::SubjectDNs:
5377*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_SubjectDNs>(
5378*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
5379*3ac0a46fSAndroid Build Coastguard Worker break;
5380*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::Issuers:
5381*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_Issuers>(
5382*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
5383*3ac0a46fSAndroid Build Coastguard Worker break;
5384*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::WsdlConnection:
5385*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_WsdlConnection>(
5386*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
5387*3ac0a46fSAndroid Build Coastguard Worker break;
5388*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::Debug:
5389*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_Debug>(
5390*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
5391*3ac0a46fSAndroid Build Coastguard Worker break;
5392*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::Delta:
5393*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_Delta>(
5394*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
5395*3ac0a46fSAndroid Build Coastguard Worker break;
5396*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::EraNames:
5397*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_EraNames>(
5398*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
5399*3ac0a46fSAndroid Build Coastguard Worker break;
5400*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::ModifyAnnots:
5401*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_ModifyAnnots>(
5402*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
5403*3ac0a46fSAndroid Build Coastguard Worker break;
5404*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::StartNode:
5405*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_StartNode>(
5406*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
5407*3ac0a46fSAndroid Build Coastguard Worker break;
5408*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::Button:
5409*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_Button>(
5410*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
5411*3ac0a46fSAndroid Build Coastguard Worker break;
5412*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::Format:
5413*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_Format>(
5414*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
5415*3ac0a46fSAndroid Build Coastguard Worker break;
5416*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::Border:
5417*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_Border>(
5418*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
5419*3ac0a46fSAndroid Build Coastguard Worker break;
5420*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::Area:
5421*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_Area>(
5422*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
5423*3ac0a46fSAndroid Build Coastguard Worker break;
5424*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::Hyphenation:
5425*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_Hyphenation>(
5426*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
5427*3ac0a46fSAndroid Build Coastguard Worker break;
5428*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::Text:
5429*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_Text>(
5430*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
5431*3ac0a46fSAndroid Build Coastguard Worker break;
5432*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::Time:
5433*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_Time>(
5434*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
5435*3ac0a46fSAndroid Build Coastguard Worker break;
5436*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::Type:
5437*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_Type>(
5438*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
5439*3ac0a46fSAndroid Build Coastguard Worker break;
5440*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::Overprint:
5441*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_Overprint>(
5442*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
5443*3ac0a46fSAndroid Build Coastguard Worker break;
5444*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::Certificates:
5445*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_Certificates>(
5446*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
5447*3ac0a46fSAndroid Build Coastguard Worker break;
5448*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::EncryptionMethods:
5449*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_EncryptionMethods>(
5450*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
5451*3ac0a46fSAndroid Build Coastguard Worker break;
5452*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::SetProperty:
5453*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_SetProperty>(
5454*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
5455*3ac0a46fSAndroid Build Coastguard Worker break;
5456*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::PrinterName:
5457*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_PrinterName>(
5458*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
5459*3ac0a46fSAndroid Build Coastguard Worker break;
5460*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::StartPage:
5461*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_StartPage>(
5462*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
5463*3ac0a46fSAndroid Build Coastguard Worker break;
5464*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::PageOffset:
5465*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_PageOffset>(
5466*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
5467*3ac0a46fSAndroid Build Coastguard Worker break;
5468*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::DateTime:
5469*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_DateTime>(
5470*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
5471*3ac0a46fSAndroid Build Coastguard Worker break;
5472*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::Comb:
5473*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_Comb>(
5474*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
5475*3ac0a46fSAndroid Build Coastguard Worker break;
5476*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::Pattern:
5477*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_Pattern>(
5478*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
5479*3ac0a46fSAndroid Build Coastguard Worker break;
5480*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::IfEmpty:
5481*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_IfEmpty>(
5482*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
5483*3ac0a46fSAndroid Build Coastguard Worker break;
5484*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::SuppressBanner:
5485*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_SuppressBanner>(
5486*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
5487*3ac0a46fSAndroid Build Coastguard Worker break;
5488*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::OutputBin:
5489*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_OutputBin>(
5490*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
5491*3ac0a46fSAndroid Build Coastguard Worker break;
5492*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::Field:
5493*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_Field>(
5494*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
5495*3ac0a46fSAndroid Build Coastguard Worker break;
5496*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::Agent:
5497*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_Agent>(
5498*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
5499*3ac0a46fSAndroid Build Coastguard Worker break;
5500*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::OutputXSL:
5501*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_OutputXSL>(
5502*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
5503*3ac0a46fSAndroid Build Coastguard Worker break;
5504*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::AdjustData:
5505*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_AdjustData>(
5506*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
5507*3ac0a46fSAndroid Build Coastguard Worker break;
5508*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::AutoSave:
5509*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_AutoSave>(
5510*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
5511*3ac0a46fSAndroid Build Coastguard Worker break;
5512*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::ContentArea:
5513*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_ContentArea>(
5514*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
5515*3ac0a46fSAndroid Build Coastguard Worker break;
5516*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::WsdlAddress:
5517*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_WsdlAddress>(
5518*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
5519*3ac0a46fSAndroid Build Coastguard Worker break;
5520*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::Solid:
5521*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_Solid>(
5522*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
5523*3ac0a46fSAndroid Build Coastguard Worker break;
5524*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::DateTimeSymbols:
5525*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_DateTimeSymbols>(
5526*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
5527*3ac0a46fSAndroid Build Coastguard Worker break;
5528*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::EncryptionLevel:
5529*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_EncryptionLevel>(
5530*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
5531*3ac0a46fSAndroid Build Coastguard Worker break;
5532*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::Edge:
5533*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_Edge>(
5534*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
5535*3ac0a46fSAndroid Build Coastguard Worker break;
5536*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::Stipple:
5537*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_Stipple>(
5538*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
5539*3ac0a46fSAndroid Build Coastguard Worker break;
5540*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::Attributes:
5541*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_Attributes>(
5542*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
5543*3ac0a46fSAndroid Build Coastguard Worker break;
5544*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::VersionControl:
5545*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_VersionControl>(
5546*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
5547*3ac0a46fSAndroid Build Coastguard Worker break;
5548*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::Meridiem:
5549*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_Meridiem>(
5550*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
5551*3ac0a46fSAndroid Build Coastguard Worker break;
5552*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::ExclGroup:
5553*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_ExclGroup>(
5554*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
5555*3ac0a46fSAndroid Build Coastguard Worker break;
5556*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::ToolTip:
5557*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_ToolTip>(
5558*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
5559*3ac0a46fSAndroid Build Coastguard Worker break;
5560*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::Compress:
5561*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_Compress>(
5562*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
5563*3ac0a46fSAndroid Build Coastguard Worker break;
5564*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::Reason:
5565*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_Reason>(
5566*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
5567*3ac0a46fSAndroid Build Coastguard Worker break;
5568*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::Execute:
5569*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_Execute>(
5570*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
5571*3ac0a46fSAndroid Build Coastguard Worker break;
5572*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::ContentCopy:
5573*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_ContentCopy>(
5574*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
5575*3ac0a46fSAndroid Build Coastguard Worker break;
5576*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::DateTimeEdit:
5577*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_DateTimeEdit>(
5578*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
5579*3ac0a46fSAndroid Build Coastguard Worker break;
5580*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::Config:
5581*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_Config>(
5582*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
5583*3ac0a46fSAndroid Build Coastguard Worker break;
5584*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::Image:
5585*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_Image>(
5586*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
5587*3ac0a46fSAndroid Build Coastguard Worker break;
5588*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::SharpxHTML:
5589*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_SharpxHTML>(
5590*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
5591*3ac0a46fSAndroid Build Coastguard Worker break;
5592*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::NumberOfCopies:
5593*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_NumberOfCopies>(
5594*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
5595*3ac0a46fSAndroid Build Coastguard Worker break;
5596*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::BehaviorOverride:
5597*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_BehaviorOverride>(
5598*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
5599*3ac0a46fSAndroid Build Coastguard Worker break;
5600*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::TimeStamp:
5601*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_TimeStamp>(
5602*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
5603*3ac0a46fSAndroid Build Coastguard Worker break;
5604*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::Month:
5605*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_Month>(
5606*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
5607*3ac0a46fSAndroid Build Coastguard Worker break;
5608*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::ViewerPreferences:
5609*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_ViewerPreferences>(
5610*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
5611*3ac0a46fSAndroid Build Coastguard Worker break;
5612*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::ScriptModel:
5613*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_ScriptModel>(
5614*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
5615*3ac0a46fSAndroid Build Coastguard Worker break;
5616*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::Decimal:
5617*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_Decimal>(
5618*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
5619*3ac0a46fSAndroid Build Coastguard Worker break;
5620*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::Subform:
5621*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_Subform>(
5622*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
5623*3ac0a46fSAndroid Build Coastguard Worker break;
5624*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::Select:
5625*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_Select>(
5626*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
5627*3ac0a46fSAndroid Build Coastguard Worker break;
5628*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::Window:
5629*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_Window>(
5630*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
5631*3ac0a46fSAndroid Build Coastguard Worker break;
5632*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::LocaleSet:
5633*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_LocaleSet>(
5634*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
5635*3ac0a46fSAndroid Build Coastguard Worker break;
5636*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::Handler:
5637*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_Handler>(
5638*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
5639*3ac0a46fSAndroid Build Coastguard Worker break;
5640*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::Presence:
5641*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_Presence>(
5642*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
5643*3ac0a46fSAndroid Build Coastguard Worker break;
5644*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::Record:
5645*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_Record>(
5646*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
5647*3ac0a46fSAndroid Build Coastguard Worker break;
5648*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::Embed:
5649*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_Embed>(
5650*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
5651*3ac0a46fSAndroid Build Coastguard Worker break;
5652*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::Version:
5653*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_Version>(
5654*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
5655*3ac0a46fSAndroid Build Coastguard Worker break;
5656*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::Command:
5657*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_Command>(
5658*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
5659*3ac0a46fSAndroid Build Coastguard Worker break;
5660*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::Copies:
5661*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_Copies>(
5662*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
5663*3ac0a46fSAndroid Build Coastguard Worker break;
5664*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::Staple:
5665*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_Staple>(
5666*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
5667*3ac0a46fSAndroid Build Coastguard Worker break;
5668*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::SubmitFormat:
5669*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_SubmitFormat>(
5670*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
5671*3ac0a46fSAndroid Build Coastguard Worker break;
5672*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::Boolean:
5673*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_Boolean>(
5674*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
5675*3ac0a46fSAndroid Build Coastguard Worker break;
5676*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::Message:
5677*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_Message>(
5678*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
5679*3ac0a46fSAndroid Build Coastguard Worker break;
5680*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::Output:
5681*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_Output>(
5682*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
5683*3ac0a46fSAndroid Build Coastguard Worker break;
5684*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::PsMap:
5685*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_PsMap>(
5686*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
5687*3ac0a46fSAndroid Build Coastguard Worker break;
5688*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::ExcludeNS:
5689*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_ExcludeNS>(
5690*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
5691*3ac0a46fSAndroid Build Coastguard Worker break;
5692*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::Assist:
5693*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_Assist>(
5694*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
5695*3ac0a46fSAndroid Build Coastguard Worker break;
5696*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::Picture:
5697*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_Picture>(
5698*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
5699*3ac0a46fSAndroid Build Coastguard Worker break;
5700*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::Traversal:
5701*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_Traversal>(
5702*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
5703*3ac0a46fSAndroid Build Coastguard Worker break;
5704*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::SilentPrint:
5705*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_SilentPrint>(
5706*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
5707*3ac0a46fSAndroid Build Coastguard Worker break;
5708*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::WebClient:
5709*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_WebClient>(
5710*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
5711*3ac0a46fSAndroid Build Coastguard Worker break;
5712*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::Producer:
5713*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_Producer>(
5714*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
5715*3ac0a46fSAndroid Build Coastguard Worker break;
5716*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::Corner:
5717*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_Corner>(
5718*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
5719*3ac0a46fSAndroid Build Coastguard Worker break;
5720*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::MsgId:
5721*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_MsgId>(
5722*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
5723*3ac0a46fSAndroid Build Coastguard Worker break;
5724*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::Color:
5725*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_Color>(
5726*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
5727*3ac0a46fSAndroid Build Coastguard Worker break;
5728*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::Keep:
5729*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_Keep>(
5730*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
5731*3ac0a46fSAndroid Build Coastguard Worker break;
5732*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::Query:
5733*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_Query>(
5734*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
5735*3ac0a46fSAndroid Build Coastguard Worker break;
5736*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::Insert:
5737*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_Insert>(
5738*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
5739*3ac0a46fSAndroid Build Coastguard Worker break;
5740*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::ImageEdit:
5741*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_ImageEdit>(
5742*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
5743*3ac0a46fSAndroid Build Coastguard Worker break;
5744*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::Validate:
5745*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_Validate>(
5746*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
5747*3ac0a46fSAndroid Build Coastguard Worker break;
5748*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::DigestMethods:
5749*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_DigestMethods>(
5750*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
5751*3ac0a46fSAndroid Build Coastguard Worker break;
5752*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::NumberPatterns:
5753*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_NumberPatterns>(
5754*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
5755*3ac0a46fSAndroid Build Coastguard Worker break;
5756*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::PageSet:
5757*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_PageSet>(
5758*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
5759*3ac0a46fSAndroid Build Coastguard Worker break;
5760*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::Integer:
5761*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_Integer>(
5762*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
5763*3ac0a46fSAndroid Build Coastguard Worker break;
5764*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::SoapAddress:
5765*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_SoapAddress>(
5766*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
5767*3ac0a46fSAndroid Build Coastguard Worker break;
5768*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::Equate:
5769*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_Equate>(
5770*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
5771*3ac0a46fSAndroid Build Coastguard Worker break;
5772*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::FormFieldFilling:
5773*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_FormFieldFilling>(
5774*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
5775*3ac0a46fSAndroid Build Coastguard Worker break;
5776*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::PageRange:
5777*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_PageRange>(
5778*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
5779*3ac0a46fSAndroid Build Coastguard Worker break;
5780*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::Update:
5781*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_Update>(
5782*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
5783*3ac0a46fSAndroid Build Coastguard Worker break;
5784*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::ConnectString:
5785*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_ConnectString>(
5786*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
5787*3ac0a46fSAndroid Build Coastguard Worker break;
5788*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::Mode:
5789*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_Mode>(
5790*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
5791*3ac0a46fSAndroid Build Coastguard Worker break;
5792*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::Layout:
5793*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_Layout>(
5794*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
5795*3ac0a46fSAndroid Build Coastguard Worker break;
5796*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::Sharpxml:
5797*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_Sharpxml>(
5798*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
5799*3ac0a46fSAndroid Build Coastguard Worker break;
5800*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::XsdConnection:
5801*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_XsdConnection>(
5802*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
5803*3ac0a46fSAndroid Build Coastguard Worker break;
5804*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::Traverse:
5805*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_Traverse>(
5806*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
5807*3ac0a46fSAndroid Build Coastguard Worker break;
5808*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::Encodings:
5809*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_Encodings>(
5810*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
5811*3ac0a46fSAndroid Build Coastguard Worker break;
5812*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::Template:
5813*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_Template>(
5814*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
5815*3ac0a46fSAndroid Build Coastguard Worker break;
5816*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::Acrobat:
5817*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_Acrobat>(
5818*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
5819*3ac0a46fSAndroid Build Coastguard Worker break;
5820*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::ValidationMessaging:
5821*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_ValidationMessaging>(
5822*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
5823*3ac0a46fSAndroid Build Coastguard Worker break;
5824*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::Signing:
5825*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_Signing>(
5826*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
5827*3ac0a46fSAndroid Build Coastguard Worker break;
5828*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::Script:
5829*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_Script>(
5830*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
5831*3ac0a46fSAndroid Build Coastguard Worker break;
5832*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::AddViewerPreferences:
5833*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_AddViewerPreferences>(
5834*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
5835*3ac0a46fSAndroid Build Coastguard Worker break;
5836*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::AlwaysEmbed:
5837*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_AlwaysEmbed>(
5838*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
5839*3ac0a46fSAndroid Build Coastguard Worker break;
5840*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::PasswordEdit:
5841*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_PasswordEdit>(
5842*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
5843*3ac0a46fSAndroid Build Coastguard Worker break;
5844*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::NumericEdit:
5845*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_NumericEdit>(
5846*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
5847*3ac0a46fSAndroid Build Coastguard Worker break;
5848*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::EncryptionMethod:
5849*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_EncryptionMethod>(
5850*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
5851*3ac0a46fSAndroid Build Coastguard Worker break;
5852*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::Change:
5853*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_Change>(
5854*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
5855*3ac0a46fSAndroid Build Coastguard Worker break;
5856*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::PageArea:
5857*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_PageArea>(
5858*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
5859*3ac0a46fSAndroid Build Coastguard Worker break;
5860*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::SubmitUrl:
5861*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_SubmitUrl>(
5862*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
5863*3ac0a46fSAndroid Build Coastguard Worker break;
5864*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::Oids:
5865*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_Oids>(
5866*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
5867*3ac0a46fSAndroid Build Coastguard Worker break;
5868*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::Signature:
5869*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_Signature>(
5870*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
5871*3ac0a46fSAndroid Build Coastguard Worker break;
5872*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::ADBE_JSConsole:
5873*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_ADBE_JSConsole>(
5874*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
5875*3ac0a46fSAndroid Build Coastguard Worker break;
5876*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::Caption:
5877*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_Caption>(
5878*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
5879*3ac0a46fSAndroid Build Coastguard Worker break;
5880*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::Relevant:
5881*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_Relevant>(
5882*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
5883*3ac0a46fSAndroid Build Coastguard Worker break;
5884*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::FlipLabel:
5885*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_FlipLabel>(
5886*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
5887*3ac0a46fSAndroid Build Coastguard Worker break;
5888*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::ExData:
5889*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_ExData>(
5890*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
5891*3ac0a46fSAndroid Build Coastguard Worker break;
5892*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::DayNames:
5893*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_DayNames>(
5894*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
5895*3ac0a46fSAndroid Build Coastguard Worker break;
5896*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::SoapAction:
5897*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_SoapAction>(
5898*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
5899*3ac0a46fSAndroid Build Coastguard Worker break;
5900*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::DefaultTypeface:
5901*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_DefaultTypeface>(
5902*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
5903*3ac0a46fSAndroid Build Coastguard Worker break;
5904*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::Manifest:
5905*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_Manifest>(
5906*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
5907*3ac0a46fSAndroid Build Coastguard Worker break;
5908*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::Overflow:
5909*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_Overflow>(
5910*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
5911*3ac0a46fSAndroid Build Coastguard Worker break;
5912*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::Linear:
5913*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_Linear>(
5914*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
5915*3ac0a46fSAndroid Build Coastguard Worker break;
5916*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::CurrencySymbol:
5917*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_CurrencySymbol>(
5918*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
5919*3ac0a46fSAndroid Build Coastguard Worker break;
5920*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::Delete:
5921*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_Delete>(
5922*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
5923*3ac0a46fSAndroid Build Coastguard Worker break;
5924*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::DigestMethod:
5925*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_DigestMethod>(
5926*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
5927*3ac0a46fSAndroid Build Coastguard Worker break;
5928*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::InstanceManager:
5929*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_InstanceManager>(
5930*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
5931*3ac0a46fSAndroid Build Coastguard Worker break;
5932*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::EquateRange:
5933*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_EquateRange>(
5934*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
5935*3ac0a46fSAndroid Build Coastguard Worker break;
5936*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::Medium:
5937*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_Medium>(
5938*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
5939*3ac0a46fSAndroid Build Coastguard Worker break;
5940*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::TextEdit:
5941*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_TextEdit>(
5942*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
5943*3ac0a46fSAndroid Build Coastguard Worker break;
5944*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::TemplateCache:
5945*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_TemplateCache>(
5946*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
5947*3ac0a46fSAndroid Build Coastguard Worker break;
5948*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::CompressObjectStream:
5949*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_CompressObjectStream>(
5950*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
5951*3ac0a46fSAndroid Build Coastguard Worker break;
5952*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::DataValue:
5953*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_DataValue>(
5954*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
5955*3ac0a46fSAndroid Build Coastguard Worker break;
5956*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::AccessibleContent:
5957*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_AccessibleContent>(
5958*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
5959*3ac0a46fSAndroid Build Coastguard Worker break;
5960*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::IncludeXDPContent:
5961*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_IncludeXDPContent>(
5962*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
5963*3ac0a46fSAndroid Build Coastguard Worker break;
5964*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::XmlConnection:
5965*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_XmlConnection>(
5966*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
5967*3ac0a46fSAndroid Build Coastguard Worker break;
5968*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::ValidateApprovalSignatures:
5969*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_ValidateApprovalSignatures>(
5970*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
5971*3ac0a46fSAndroid Build Coastguard Worker break;
5972*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::SignData:
5973*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_SignData>(
5974*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
5975*3ac0a46fSAndroid Build Coastguard Worker break;
5976*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::Packets:
5977*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_Packets>(
5978*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
5979*3ac0a46fSAndroid Build Coastguard Worker break;
5980*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::DatePattern:
5981*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_DatePattern>(
5982*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
5983*3ac0a46fSAndroid Build Coastguard Worker break;
5984*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::DuplexOption:
5985*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_DuplexOption>(
5986*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
5987*3ac0a46fSAndroid Build Coastguard Worker break;
5988*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::Base:
5989*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_Base>(
5990*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
5991*3ac0a46fSAndroid Build Coastguard Worker break;
5992*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::Bind:
5993*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_Bind>(
5994*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
5995*3ac0a46fSAndroid Build Coastguard Worker break;
5996*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::Compression:
5997*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_Compression>(
5998*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
5999*3ac0a46fSAndroid Build Coastguard Worker break;
6000*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::User:
6001*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_User>(
6002*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
6003*3ac0a46fSAndroid Build Coastguard Worker break;
6004*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::Rectangle:
6005*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_Rectangle>(
6006*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
6007*3ac0a46fSAndroid Build Coastguard Worker break;
6008*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::EffectiveOutputPolicy:
6009*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_EffectiveOutputPolicy>(
6010*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
6011*3ac0a46fSAndroid Build Coastguard Worker break;
6012*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::ADBE_JSDebugger:
6013*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_ADBE_JSDebugger>(
6014*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
6015*3ac0a46fSAndroid Build Coastguard Worker break;
6016*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::Acrobat7:
6017*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_Acrobat7>(
6018*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
6019*3ac0a46fSAndroid Build Coastguard Worker break;
6020*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::Interactive:
6021*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_Interactive>(
6022*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
6023*3ac0a46fSAndroid Build Coastguard Worker break;
6024*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::Locale:
6025*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_Locale>(
6026*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
6027*3ac0a46fSAndroid Build Coastguard Worker break;
6028*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::CurrentPage:
6029*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_CurrentPage>(
6030*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
6031*3ac0a46fSAndroid Build Coastguard Worker break;
6032*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::Data:
6033*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_Data>(
6034*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
6035*3ac0a46fSAndroid Build Coastguard Worker break;
6036*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::Date:
6037*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_Date>(
6038*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
6039*3ac0a46fSAndroid Build Coastguard Worker break;
6040*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::Desc:
6041*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_Desc>(
6042*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
6043*3ac0a46fSAndroid Build Coastguard Worker break;
6044*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::Encrypt:
6045*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_Encrypt>(
6046*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
6047*3ac0a46fSAndroid Build Coastguard Worker break;
6048*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::Draw:
6049*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_Draw>(
6050*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
6051*3ac0a46fSAndroid Build Coastguard Worker break;
6052*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::Encryption:
6053*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_Encryption>(
6054*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
6055*3ac0a46fSAndroid Build Coastguard Worker break;
6056*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::MeridiemNames:
6057*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_MeridiemNames>(
6058*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
6059*3ac0a46fSAndroid Build Coastguard Worker break;
6060*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::Messaging:
6061*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_Messaging>(
6062*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
6063*3ac0a46fSAndroid Build Coastguard Worker break;
6064*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::Speak:
6065*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_Speak>(
6066*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
6067*3ac0a46fSAndroid Build Coastguard Worker break;
6068*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::DataGroup:
6069*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_DataGroup>(
6070*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
6071*3ac0a46fSAndroid Build Coastguard Worker break;
6072*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::Common:
6073*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_Common>(
6074*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
6075*3ac0a46fSAndroid Build Coastguard Worker break;
6076*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::Sharptext:
6077*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_Sharptext>(
6078*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
6079*3ac0a46fSAndroid Build Coastguard Worker break;
6080*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::PaginationOverride:
6081*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_PaginationOverride>(
6082*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
6083*3ac0a46fSAndroid Build Coastguard Worker break;
6084*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::Reasons:
6085*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_Reasons>(
6086*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
6087*3ac0a46fSAndroid Build Coastguard Worker break;
6088*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::SignatureProperties:
6089*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_SignatureProperties>(
6090*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
6091*3ac0a46fSAndroid Build Coastguard Worker break;
6092*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::Threshold:
6093*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_Threshold>(
6094*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
6095*3ac0a46fSAndroid Build Coastguard Worker break;
6096*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::AppearanceFilter:
6097*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_AppearanceFilter>(
6098*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
6099*3ac0a46fSAndroid Build Coastguard Worker break;
6100*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::Fill:
6101*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_Fill>(
6102*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
6103*3ac0a46fSAndroid Build Coastguard Worker break;
6104*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::Font:
6105*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_Font>(
6106*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
6107*3ac0a46fSAndroid Build Coastguard Worker break;
6108*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::Form:
6109*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_Form>(
6110*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
6111*3ac0a46fSAndroid Build Coastguard Worker break;
6112*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::MediumInfo:
6113*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_MediumInfo>(
6114*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
6115*3ac0a46fSAndroid Build Coastguard Worker break;
6116*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::Certificate:
6117*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_Certificate>(
6118*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
6119*3ac0a46fSAndroid Build Coastguard Worker break;
6120*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::Password:
6121*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_Password>(
6122*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
6123*3ac0a46fSAndroid Build Coastguard Worker break;
6124*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::RunScripts:
6125*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_RunScripts>(
6126*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
6127*3ac0a46fSAndroid Build Coastguard Worker break;
6128*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::Trace:
6129*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_Trace>(
6130*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
6131*3ac0a46fSAndroid Build Coastguard Worker break;
6132*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::Float:
6133*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_Float>(
6134*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
6135*3ac0a46fSAndroid Build Coastguard Worker break;
6136*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::RenderPolicy:
6137*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_RenderPolicy>(
6138*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
6139*3ac0a46fSAndroid Build Coastguard Worker break;
6140*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::Destination:
6141*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_Destination>(
6142*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
6143*3ac0a46fSAndroid Build Coastguard Worker break;
6144*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::Value:
6145*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_Value>(
6146*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
6147*3ac0a46fSAndroid Build Coastguard Worker break;
6148*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::Bookend:
6149*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_Bookend>(
6150*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
6151*3ac0a46fSAndroid Build Coastguard Worker break;
6152*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::ExObject:
6153*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_ExObject>(
6154*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
6155*3ac0a46fSAndroid Build Coastguard Worker break;
6156*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::OpenAction:
6157*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_OpenAction>(
6158*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
6159*3ac0a46fSAndroid Build Coastguard Worker break;
6160*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::NeverEmbed:
6161*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_NeverEmbed>(
6162*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
6163*3ac0a46fSAndroid Build Coastguard Worker break;
6164*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::BindItems:
6165*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_BindItems>(
6166*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
6167*3ac0a46fSAndroid Build Coastguard Worker break;
6168*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::Calculate:
6169*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_Calculate>(
6170*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
6171*3ac0a46fSAndroid Build Coastguard Worker break;
6172*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::Print:
6173*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_Print>(
6174*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
6175*3ac0a46fSAndroid Build Coastguard Worker break;
6176*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::Extras:
6177*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_Extras>(
6178*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
6179*3ac0a46fSAndroid Build Coastguard Worker break;
6180*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::Proto:
6181*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_Proto>(
6182*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
6183*3ac0a46fSAndroid Build Coastguard Worker break;
6184*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::DSigData:
6185*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_DSigData>(
6186*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
6187*3ac0a46fSAndroid Build Coastguard Worker break;
6188*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::Creator:
6189*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_Creator>(
6190*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
6191*3ac0a46fSAndroid Build Coastguard Worker break;
6192*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::Connect:
6193*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_Connect>(
6194*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
6195*3ac0a46fSAndroid Build Coastguard Worker break;
6196*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::Permissions:
6197*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_Permissions>(
6198*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
6199*3ac0a46fSAndroid Build Coastguard Worker break;
6200*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::ConnectionSet:
6201*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_ConnectionSet>(
6202*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
6203*3ac0a46fSAndroid Build Coastguard Worker break;
6204*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::Submit:
6205*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_Submit>(
6206*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
6207*3ac0a46fSAndroid Build Coastguard Worker break;
6208*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::Range:
6209*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_Range>(
6210*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
6211*3ac0a46fSAndroid Build Coastguard Worker break;
6212*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::Linearized:
6213*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_Linearized>(
6214*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
6215*3ac0a46fSAndroid Build Coastguard Worker break;
6216*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::Packet:
6217*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_Packet>(
6218*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
6219*3ac0a46fSAndroid Build Coastguard Worker break;
6220*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::RootElement:
6221*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_RootElement>(
6222*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
6223*3ac0a46fSAndroid Build Coastguard Worker break;
6224*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::PlaintextMetadata:
6225*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_PlaintextMetadata>(
6226*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
6227*3ac0a46fSAndroid Build Coastguard Worker break;
6228*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::NumberSymbols:
6229*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_NumberSymbols>(
6230*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
6231*3ac0a46fSAndroid Build Coastguard Worker break;
6232*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::PrintHighQuality:
6233*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_PrintHighQuality>(
6234*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
6235*3ac0a46fSAndroid Build Coastguard Worker break;
6236*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::Driver:
6237*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_Driver>(
6238*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
6239*3ac0a46fSAndroid Build Coastguard Worker break;
6240*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::IncrementalLoad:
6241*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_IncrementalLoad>(
6242*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
6243*3ac0a46fSAndroid Build Coastguard Worker break;
6244*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::SubjectDN:
6245*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_SubjectDN>(
6246*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
6247*3ac0a46fSAndroid Build Coastguard Worker break;
6248*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::CompressLogicalStructure:
6249*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_CompressLogicalStructure>(
6250*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
6251*3ac0a46fSAndroid Build Coastguard Worker break;
6252*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::IncrementalMerge:
6253*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_IncrementalMerge>(
6254*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
6255*3ac0a46fSAndroid Build Coastguard Worker break;
6256*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::Radial:
6257*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_Radial>(
6258*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
6259*3ac0a46fSAndroid Build Coastguard Worker break;
6260*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::Variables:
6261*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_Variables>(
6262*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
6263*3ac0a46fSAndroid Build Coastguard Worker break;
6264*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::TimePatterns:
6265*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_TimePatterns>(
6266*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
6267*3ac0a46fSAndroid Build Coastguard Worker break;
6268*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::EffectiveInputPolicy:
6269*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_EffectiveInputPolicy>(
6270*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
6271*3ac0a46fSAndroid Build Coastguard Worker break;
6272*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::NameAttr:
6273*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_NameAttr>(
6274*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
6275*3ac0a46fSAndroid Build Coastguard Worker break;
6276*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::Conformance:
6277*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_Conformance>(
6278*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
6279*3ac0a46fSAndroid Build Coastguard Worker break;
6280*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::Transform:
6281*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_Transform>(
6282*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
6283*3ac0a46fSAndroid Build Coastguard Worker break;
6284*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::LockDocument:
6285*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_LockDocument>(
6286*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
6287*3ac0a46fSAndroid Build Coastguard Worker break;
6288*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::BreakAfter:
6289*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_BreakAfter>(
6290*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
6291*3ac0a46fSAndroid Build Coastguard Worker break;
6292*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::Line:
6293*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_Line>(
6294*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
6295*3ac0a46fSAndroid Build Coastguard Worker break;
6296*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::Source:
6297*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_Source>(
6298*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
6299*3ac0a46fSAndroid Build Coastguard Worker break;
6300*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::Occur:
6301*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_Occur>(
6302*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
6303*3ac0a46fSAndroid Build Coastguard Worker break;
6304*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::PickTrayByPDFSize:
6305*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_PickTrayByPDFSize>(
6306*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
6307*3ac0a46fSAndroid Build Coastguard Worker break;
6308*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::MonthNames:
6309*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_MonthNames>(
6310*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
6311*3ac0a46fSAndroid Build Coastguard Worker break;
6312*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::Severity:
6313*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_Severity>(
6314*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
6315*3ac0a46fSAndroid Build Coastguard Worker break;
6316*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::GroupParent:
6317*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_GroupParent>(
6318*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
6319*3ac0a46fSAndroid Build Coastguard Worker break;
6320*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::DocumentAssembly:
6321*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_DocumentAssembly>(
6322*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
6323*3ac0a46fSAndroid Build Coastguard Worker break;
6324*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::NumberSymbol:
6325*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_NumberSymbol>(
6326*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
6327*3ac0a46fSAndroid Build Coastguard Worker break;
6328*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::Tagged:
6329*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_Tagged>(
6330*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
6331*3ac0a46fSAndroid Build Coastguard Worker break;
6332*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::Items:
6333*3ac0a46fSAndroid Build Coastguard Worker node = cppgc::MakeGarbageCollected<CXFA_Items>(
6334*3ac0a46fSAndroid Build Coastguard Worker doc->GetHeap()->GetAllocationHandle(), doc, packet);
6335*3ac0a46fSAndroid Build Coastguard Worker break;
6336*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::DataWindow:
6337*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::Deltas:
6338*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::EventPseudoModel:
6339*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::HostPseudoModel:
6340*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::LayoutPseudoModel:
6341*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::List:
6342*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::ListDuplicate:
6343*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::LogPseudoModel:
6344*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::Model:
6345*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::Node:
6346*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::NodeWithDesc:
6347*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::NodeWithUse:
6348*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::NodeWithValue:
6349*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::Object:
6350*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::SignaturePseudoModel:
6351*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::Tree:
6352*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::TreeList:
6353*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::Unknown:
6354*3ac0a46fSAndroid Build Coastguard Worker // These defined elements can not be made from an XML parse. Some are
6355*3ac0a46fSAndroid Build Coastguard Worker // not CXFA_Node sub-classes, some are only used as intermediate classes,
6356*3ac0a46fSAndroid Build Coastguard Worker // and so forth.
6357*3ac0a46fSAndroid Build Coastguard Worker return nullptr;
6358*3ac0a46fSAndroid Build Coastguard Worker }
6359*3ac0a46fSAndroid Build Coastguard Worker if (!node || !node->IsValidInPacket(packet))
6360*3ac0a46fSAndroid Build Coastguard Worker return nullptr;
6361*3ac0a46fSAndroid Build Coastguard Worker return node;
6362*3ac0a46fSAndroid Build Coastguard Worker }
6363