blob: 72b8970022bf35eedd969650c6475d3c33cb610f [file] [log] [blame]
dsinclaira440bb32016-09-14 07:01:54 -07001// Copyright 2016 PDFium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
6
dsinclairbec76922016-09-29 16:52:30 -07007#include "fpdfsdk/fpdfxfa/cpdfxfa_docenvironment.h"
dsinclaira440bb32016-09-14 07:01:54 -07008
tsepez0e606b52016-11-18 16:22:41 -08009#include <memory>
10
dsinclair488b7ad2016-10-04 11:55:50 -070011#include "core/fpdfapi/parser/cpdf_array.h"
12#include "core/fpdfapi/parser/cpdf_stream_acc.h"
13#include "core/fpdfapi/parser/cpdf_string.h"
Dan Sinclair0b950422017-09-21 15:49:49 -040014#include "core/fxcrt/retain_ptr.h"
dsinclair735606d2016-10-05 15:47:02 -070015#include "fpdfsdk/cpdfsdk_formfillenvironment.h"
dsinclair114e46a2016-09-29 17:18:21 -070016#include "fpdfsdk/cpdfsdk_interform.h"
17#include "fpdfsdk/cpdfsdk_pageview.h"
dsinclair521b7502016-11-02 13:02:28 -070018#include "fpdfsdk/fpdfxfa/cpdfxfa_context.h"
dsinclair4d29e782016-10-04 14:02:47 -070019#include "fpdfsdk/fpdfxfa/cpdfxfa_page.h"
Dan Sinclaire0345a42017-10-30 20:20:42 +000020#include "fxjs/ijs_runtime.h"
Dan Sinclair80c48782017-03-23 12:11:20 -040021#include "xfa/fxfa/cxfa_ffdocview.h"
22#include "xfa/fxfa/cxfa_ffwidget.h"
23#include "xfa/fxfa/cxfa_ffwidgethandler.h"
24#include "xfa/fxfa/cxfa_widgetacciterator.h"
dsinclaira440bb32016-09-14 07:01:54 -070025
26#define IDS_XFA_Validate_Input \
27 "At least one required field was empty. Please fill in the required " \
28 "fields\r\n(highlighted) before continuing."
29
30// submit
31#define FXFA_CONFIG 0x00000001
32#define FXFA_TEMPLATE 0x00000010
33#define FXFA_LOCALESET 0x00000100
34#define FXFA_DATASETS 0x00001000
35#define FXFA_XMPMETA 0x00010000
36#define FXFA_XFDF 0x00100000
37#define FXFA_FORM 0x01000000
38#define FXFA_PDF 0x10000000
39#define FXFA_XFA_ALL 0x01111111
40
dsinclair521b7502016-11-02 13:02:28 -070041CPDFXFA_DocEnvironment::CPDFXFA_DocEnvironment(CPDFXFA_Context* pContext)
Tom Sepez7dc9fe52017-05-18 09:51:57 -070042 : m_pContext(pContext) {
dsinclair521b7502016-11-02 13:02:28 -070043 ASSERT(m_pContext);
dsinclaira440bb32016-09-14 07:01:54 -070044}
45
Tom Sepez7dc9fe52017-05-18 09:51:57 -070046CPDFXFA_DocEnvironment::~CPDFXFA_DocEnvironment() {}
dsinclaira440bb32016-09-14 07:01:54 -070047
48void CPDFXFA_DocEnvironment::SetChangeMark(CXFA_FFDoc* hDoc) {
dsinclair521b7502016-11-02 13:02:28 -070049 if (hDoc == m_pContext->GetXFADoc() && m_pContext->GetFormFillEnv())
50 m_pContext->GetFormFillEnv()->SetChangeMark();
dsinclaira440bb32016-09-14 07:01:54 -070051}
52
53void CPDFXFA_DocEnvironment::InvalidateRect(CXFA_FFPageView* pPageView,
Dan Sinclaire3978d02017-03-23 09:12:10 -040054 const CFX_RectF& rt) {
dsinclair521b7502016-11-02 13:02:28 -070055 if (!m_pContext->GetXFADoc() || !m_pContext->GetFormFillEnv())
dsinclaira440bb32016-09-14 07:01:54 -070056 return;
57
Ryan Harrison854d71c2017-10-18 12:28:14 -040058 if (m_pContext->GetFormType() != FormType::kXFAFull)
dsinclaira440bb32016-09-14 07:01:54 -070059 return;
60
Dan Sinclair0b950422017-09-21 15:49:49 -040061 RetainPtr<CPDFXFA_Page> pPage = m_pContext->GetXFAPage(pPageView);
dsinclaira440bb32016-09-14 07:01:54 -070062 if (!pPage)
63 return;
64
dsinclair521b7502016-11-02 13:02:28 -070065 CPDFSDK_FormFillEnvironment* pFormFillEnv = m_pContext->GetFormFillEnv();
dsinclair655fcca2016-10-11 13:53:37 -070066 if (!pFormFillEnv)
dsinclaira440bb32016-09-14 07:01:54 -070067 return;
68
Dan Sinclair6ba39e82017-07-26 17:19:40 -040069 pFormFillEnv->Invalidate(pPage.Get(), rt.ToFloatRect().ToFxRect());
dsinclaira440bb32016-09-14 07:01:54 -070070}
71
72void CPDFXFA_DocEnvironment::DisplayCaret(CXFA_FFWidget* hWidget,
tsepez4cf55152016-11-02 14:37:54 -070073 bool bVisible,
dsinclaira440bb32016-09-14 07:01:54 -070074 const CFX_RectF* pRtAnchor) {
dsinclair521b7502016-11-02 13:02:28 -070075 if (!hWidget || !pRtAnchor || !m_pContext->GetXFADoc() ||
76 !m_pContext->GetFormFillEnv() || !m_pContext->GetXFADocView())
dsinclaira440bb32016-09-14 07:01:54 -070077 return;
78
Ryan Harrison854d71c2017-10-18 12:28:14 -040079 if (m_pContext->GetFormType() != FormType::kXFAFull)
dsinclaira440bb32016-09-14 07:01:54 -070080 return;
81
82 CXFA_FFWidgetHandler* pWidgetHandler =
dsinclair521b7502016-11-02 13:02:28 -070083 m_pContext->GetXFADocView()->GetWidgetHandler();
dsinclaira440bb32016-09-14 07:01:54 -070084 if (!pWidgetHandler)
85 return;
86
87 CXFA_FFPageView* pPageView = hWidget->GetPageView();
88 if (!pPageView)
89 return;
90
Dan Sinclair0b950422017-09-21 15:49:49 -040091 RetainPtr<CPDFXFA_Page> pPage = m_pContext->GetXFAPage(pPageView);
dsinclaira440bb32016-09-14 07:01:54 -070092 if (!pPage)
93 return;
94
dsinclair521b7502016-11-02 13:02:28 -070095 CPDFSDK_FormFillEnvironment* pFormFillEnv = m_pContext->GetFormFillEnv();
dsinclair655fcca2016-10-11 13:53:37 -070096 if (!pFormFillEnv)
dsinclaira440bb32016-09-14 07:01:54 -070097 return;
98
Dan Sinclair6ba39e82017-07-26 17:19:40 -040099 CFX_FloatRect rcCaret = pRtAnchor->ToFloatRect();
Lei Zhang671630e2017-05-19 19:25:16 -0700100 pFormFillEnv->DisplayCaret(pPage.Get(), bVisible, rcCaret.left, rcCaret.top,
101 rcCaret.right, rcCaret.bottom);
dsinclaira440bb32016-09-14 07:01:54 -0700102}
103
tsepez4cf55152016-11-02 14:37:54 -0700104bool CPDFXFA_DocEnvironment::GetPopupPos(CXFA_FFWidget* hWidget,
Dan Sinclair05df0752017-03-14 14:43:42 -0400105 float fMinPopup,
106 float fMaxPopup,
tsepez4cf55152016-11-02 14:37:54 -0700107 const CFX_RectF& rtAnchor,
108 CFX_RectF& rtPopup) {
dsinclaira440bb32016-09-14 07:01:54 -0700109 if (!hWidget)
tsepez4cf55152016-11-02 14:37:54 -0700110 return false;
dsinclaira440bb32016-09-14 07:01:54 -0700111
112 CXFA_FFPageView* pXFAPageView = hWidget->GetPageView();
113 if (!pXFAPageView)
tsepez4cf55152016-11-02 14:37:54 -0700114 return false;
dsinclaira440bb32016-09-14 07:01:54 -0700115
Dan Sinclair0b950422017-09-21 15:49:49 -0400116 RetainPtr<CPDFXFA_Page> pPage = m_pContext->GetXFAPage(pXFAPageView);
dsinclaira440bb32016-09-14 07:01:54 -0700117 if (!pPage)
tsepez4cf55152016-11-02 14:37:54 -0700118 return false;
dsinclaira440bb32016-09-14 07:01:54 -0700119
dsinclair521b7502016-11-02 13:02:28 -0700120 CPDFSDK_FormFillEnvironment* pFormFillEnv = m_pContext->GetFormFillEnv();
dsinclair655fcca2016-10-11 13:53:37 -0700121 if (!pFormFillEnv)
tsepez4cf55152016-11-02 14:37:54 -0700122 return false;
dsinclaira440bb32016-09-14 07:01:54 -0700123
124 FS_RECTF pageViewRect = {0.0f, 0.0f, 0.0f, 0.0f};
Tom Sepez9792f162017-05-16 14:11:30 -0700125 pFormFillEnv->GetPageViewRect(pPage.Get(), pageViewRect);
dsinclaira440bb32016-09-14 07:01:54 -0700126
127 int t1;
128 int t2;
Dan Sinclair6ba39e82017-07-26 17:19:40 -0400129 CFX_FloatRect rcAnchor = rtAnchor.ToFloatRect();
Tom Sepez9792f162017-05-16 14:11:30 -0700130 int nRotate = hWidget->GetDataAcc()->GetRotate();
dsinclaira440bb32016-09-14 07:01:54 -0700131 switch (nRotate) {
132 case 90: {
133 t1 = (int)(pageViewRect.right - rcAnchor.right);
134 t2 = (int)(rcAnchor.left - pageViewRect.left);
135 if (rcAnchor.bottom < pageViewRect.bottom)
136 rtPopup.left += rcAnchor.bottom - pageViewRect.bottom;
137 break;
138 }
139 case 180: {
140 t2 = (int)(pageViewRect.top - rcAnchor.top);
141 t1 = (int)(rcAnchor.bottom - pageViewRect.bottom);
142 if (rcAnchor.left < pageViewRect.left)
143 rtPopup.left += rcAnchor.left - pageViewRect.left;
144 break;
145 }
146 case 270: {
147 t1 = (int)(rcAnchor.left - pageViewRect.left);
148 t2 = (int)(pageViewRect.right - rcAnchor.right);
149 if (rcAnchor.top > pageViewRect.top)
150 rtPopup.left -= rcAnchor.top - pageViewRect.top;
151 break;
152 }
153 case 0:
154 default: {
155 t1 = (int)(pageViewRect.top - rcAnchor.top);
156 t2 = (int)(rcAnchor.bottom - pageViewRect.bottom);
157 if (rcAnchor.right > pageViewRect.right)
158 rtPopup.left -= rcAnchor.right - pageViewRect.right;
159 break;
160 }
161 }
162
163 int t;
164 uint32_t dwPos;
165 if (t1 <= 0 && t2 <= 0)
tsepez4cf55152016-11-02 14:37:54 -0700166 return false;
dsinclaira440bb32016-09-14 07:01:54 -0700167 if (t1 <= 0) {
168 t = t2;
169 dwPos = 1;
170 } else if (t2 <= 0) {
171 t = t1;
172 dwPos = 0;
173 } else if (t1 > t2) {
174 t = t1;
175 dwPos = 0;
176 } else {
177 t = t2;
178 dwPos = 1;
179 }
180
Dan Sinclair05df0752017-03-14 14:43:42 -0400181 float fPopupHeight;
dsinclaira440bb32016-09-14 07:01:54 -0700182 if (t < fMinPopup)
183 fPopupHeight = fMinPopup;
184 else if (t > fMaxPopup)
185 fPopupHeight = fMaxPopup;
186 else
Dan Sinclair05df0752017-03-14 14:43:42 -0400187 fPopupHeight = static_cast<float>(t);
dsinclaira440bb32016-09-14 07:01:54 -0700188
189 switch (nRotate) {
190 case 0:
191 case 180: {
192 if (dwPos == 0) {
193 rtPopup.top = rtAnchor.height;
194 rtPopup.height = fPopupHeight;
195 } else {
196 rtPopup.top = -fPopupHeight;
197 rtPopup.height = fPopupHeight;
198 }
199 break;
200 }
201 case 90:
202 case 270: {
203 if (dwPos == 0) {
204 rtPopup.top = rtAnchor.width;
205 rtPopup.height = fPopupHeight;
206 } else {
207 rtPopup.top = -fPopupHeight;
208 rtPopup.height = fPopupHeight;
209 }
210 break;
211 }
212 default:
213 break;
214 }
215
tsepez4cf55152016-11-02 14:37:54 -0700216 return true;
dsinclaira440bb32016-09-14 07:01:54 -0700217}
218
tsepez4cf55152016-11-02 14:37:54 -0700219bool CPDFXFA_DocEnvironment::PopupMenu(CXFA_FFWidget* hWidget,
220 CFX_PointF ptPopup) {
dsinclaira440bb32016-09-14 07:01:54 -0700221 if (!hWidget)
tsepez4cf55152016-11-02 14:37:54 -0700222 return false;
dsinclaira440bb32016-09-14 07:01:54 -0700223
224 CXFA_FFPageView* pXFAPageView = hWidget->GetPageView();
225 if (!pXFAPageView)
tsepez4cf55152016-11-02 14:37:54 -0700226 return false;
dsinclaira440bb32016-09-14 07:01:54 -0700227
Dan Sinclair0b950422017-09-21 15:49:49 -0400228 RetainPtr<CPDFXFA_Page> pPage = m_pContext->GetXFAPage(pXFAPageView);
dsinclaira440bb32016-09-14 07:01:54 -0700229 if (!pPage)
tsepez4cf55152016-11-02 14:37:54 -0700230 return false;
dsinclaira440bb32016-09-14 07:01:54 -0700231
dsinclair521b7502016-11-02 13:02:28 -0700232 CPDFSDK_FormFillEnvironment* pFormFillEnv = m_pContext->GetFormFillEnv();
dsinclair655fcca2016-10-11 13:53:37 -0700233 if (!pFormFillEnv)
tsepez4cf55152016-11-02 14:37:54 -0700234 return false;
dsinclaira440bb32016-09-14 07:01:54 -0700235
236 int menuFlag = 0;
237 if (hWidget->CanUndo())
238 menuFlag |= FXFA_MENU_UNDO;
239 if (hWidget->CanRedo())
240 menuFlag |= FXFA_MENU_REDO;
241 if (hWidget->CanPaste())
242 menuFlag |= FXFA_MENU_PASTE;
243 if (hWidget->CanCopy())
244 menuFlag |= FXFA_MENU_COPY;
245 if (hWidget->CanCut())
246 menuFlag |= FXFA_MENU_CUT;
247 if (hWidget->CanSelectAll())
248 menuFlag |= FXFA_MENU_SELECTALL;
249
Tom Sepez9792f162017-05-16 14:11:30 -0700250 return pFormFillEnv->PopupMenu(pPage.Get(), hWidget, menuFlag, ptPopup);
dsinclaira440bb32016-09-14 07:01:54 -0700251}
252
253void CPDFXFA_DocEnvironment::PageViewEvent(CXFA_FFPageView* pPageView,
254 uint32_t dwFlags) {
dsinclair521b7502016-11-02 13:02:28 -0700255 CPDFSDK_FormFillEnvironment* pFormFillEnv = m_pContext->GetFormFillEnv();
dsinclair655fcca2016-10-11 13:53:37 -0700256 if (!pFormFillEnv)
dsinclaira440bb32016-09-14 07:01:54 -0700257 return;
258
dsinclair521b7502016-11-02 13:02:28 -0700259 if (m_pContext->GetLoadStatus() == FXFA_LOADSTATUS_LOADING ||
260 m_pContext->GetLoadStatus() == FXFA_LOADSTATUS_CLOSING ||
dsinclaira440bb32016-09-14 07:01:54 -0700261 XFA_PAGEVIEWEVENT_StopLayout != dwFlags)
262 return;
263
dsinclair521b7502016-11-02 13:02:28 -0700264 int nNewCount = m_pContext->GetPageCount();
265 if (nNewCount == m_pContext->GetOriginalPageCount())
dsinclaira440bb32016-09-14 07:01:54 -0700266 return;
267
dsinclair521b7502016-11-02 13:02:28 -0700268 CXFA_FFDocView* pXFADocView = m_pContext->GetXFADocView();
dsinclaira440bb32016-09-14 07:01:54 -0700269 if (!pXFADocView)
270 return;
271
dsinclair521b7502016-11-02 13:02:28 -0700272 for (int iPageIter = 0; iPageIter < m_pContext->GetOriginalPageCount();
dsinclaira440bb32016-09-14 07:01:54 -0700273 iPageIter++) {
Dan Sinclair0b950422017-09-21 15:49:49 -0400274 RetainPtr<CPDFXFA_Page> pPage = (*m_pContext->GetXFAPageList())[iPageIter];
dsinclaira440bb32016-09-14 07:01:54 -0700275 if (!pPage)
276 continue;
277
Tom Sepez9792f162017-05-16 14:11:30 -0700278 m_pContext->GetFormFillEnv()->RemovePageView(pPage.Get());
dsinclaira440bb32016-09-14 07:01:54 -0700279 pPage->SetXFAPageView(pXFADocView->GetPageView(iPageIter));
280 }
281
dsinclair521b7502016-11-02 13:02:28 -0700282 int flag = (nNewCount < m_pContext->GetOriginalPageCount())
dsinclaira440bb32016-09-14 07:01:54 -0700283 ? FXFA_PAGEVIEWEVENT_POSTREMOVED
284 : FXFA_PAGEVIEWEVENT_POSTADDED;
Dan Sinclair669a4182017-04-03 14:51:45 -0400285 int count = abs(nNewCount - m_pContext->GetOriginalPageCount());
dsinclair521b7502016-11-02 13:02:28 -0700286 m_pContext->SetOriginalPageCount(nNewCount);
dsinclair655fcca2016-10-11 13:53:37 -0700287 pFormFillEnv->PageEvent(count, flag);
dsinclaira440bb32016-09-14 07:01:54 -0700288}
289
290void CPDFXFA_DocEnvironment::WidgetPostAdd(CXFA_FFWidget* hWidget,
291 CXFA_WidgetAcc* pWidgetData) {
Ryan Harrison854d71c2017-10-18 12:28:14 -0400292 if (m_pContext->GetFormType() != FormType::kXFAFull || !hWidget)
dsinclaira440bb32016-09-14 07:01:54 -0700293 return;
294
295 CXFA_FFPageView* pPageView = hWidget->GetPageView();
296 if (!pPageView)
297 return;
298
Dan Sinclair0b950422017-09-21 15:49:49 -0400299 RetainPtr<CPDFXFA_Page> pXFAPage = m_pContext->GetXFAPage(pPageView);
dsinclaira440bb32016-09-14 07:01:54 -0700300 if (!pXFAPage)
301 return;
302
Tom Sepez9792f162017-05-16 14:11:30 -0700303 m_pContext->GetFormFillEnv()
304 ->GetPageView(pXFAPage.Get(), true)
305 ->AddAnnot(hWidget);
dsinclaira440bb32016-09-14 07:01:54 -0700306}
307
308void CPDFXFA_DocEnvironment::WidgetPreRemove(CXFA_FFWidget* hWidget,
309 CXFA_WidgetAcc* pWidgetData) {
Ryan Harrison854d71c2017-10-18 12:28:14 -0400310 if (m_pContext->GetFormType() != FormType::kXFAFull || !hWidget)
dsinclaira440bb32016-09-14 07:01:54 -0700311 return;
312
313 CXFA_FFPageView* pPageView = hWidget->GetPageView();
314 if (!pPageView)
315 return;
316
Dan Sinclair0b950422017-09-21 15:49:49 -0400317 RetainPtr<CPDFXFA_Page> pXFAPage = m_pContext->GetXFAPage(pPageView);
dsinclaira440bb32016-09-14 07:01:54 -0700318 if (!pXFAPage)
319 return;
320
321 CPDFSDK_PageView* pSdkPageView =
Tom Sepez9792f162017-05-16 14:11:30 -0700322 m_pContext->GetFormFillEnv()->GetPageView(pXFAPage.Get(), true);
323 CPDFSDK_Annot* pAnnot = pSdkPageView->GetAnnotByXFAWidget(hWidget);
324 if (pAnnot)
dsinclaira440bb32016-09-14 07:01:54 -0700325 pSdkPageView->DeleteAnnot(pAnnot);
326}
327
328int32_t CPDFXFA_DocEnvironment::CountPages(CXFA_FFDoc* hDoc) {
dsinclair521b7502016-11-02 13:02:28 -0700329 if (hDoc == m_pContext->GetXFADoc() && m_pContext->GetFormFillEnv())
330 return m_pContext->GetPageCount();
dsinclaira440bb32016-09-14 07:01:54 -0700331 return 0;
332}
333
334int32_t CPDFXFA_DocEnvironment::GetCurrentPage(CXFA_FFDoc* hDoc) {
dsinclair521b7502016-11-02 13:02:28 -0700335 if (hDoc != m_pContext->GetXFADoc() || !m_pContext->GetFormFillEnv())
dsinclaira440bb32016-09-14 07:01:54 -0700336 return -1;
Ryan Harrison854d71c2017-10-18 12:28:14 -0400337 if (m_pContext->GetFormType() != FormType::kXFAFull)
dsinclaira440bb32016-09-14 07:01:54 -0700338 return -1;
339
dsinclair521b7502016-11-02 13:02:28 -0700340 CPDFSDK_FormFillEnvironment* pFormFillEnv = m_pContext->GetFormFillEnv();
dsinclair655fcca2016-10-11 13:53:37 -0700341 if (!pFormFillEnv)
dsinclaira440bb32016-09-14 07:01:54 -0700342 return -1;
343
Lei Zhang671630e2017-05-19 19:25:16 -0700344 return pFormFillEnv->GetCurrentPageIndex(m_pContext.Get());
dsinclaira440bb32016-09-14 07:01:54 -0700345}
346
347void CPDFXFA_DocEnvironment::SetCurrentPage(CXFA_FFDoc* hDoc,
348 int32_t iCurPage) {
dsinclair521b7502016-11-02 13:02:28 -0700349 if (hDoc != m_pContext->GetXFADoc() || !m_pContext->GetFormFillEnv() ||
Ryan Harrison854d71c2017-10-18 12:28:14 -0400350 m_pContext->GetFormType() != FormType::kXFAFull || iCurPage < 0 ||
dsinclair521b7502016-11-02 13:02:28 -0700351 iCurPage >= m_pContext->GetFormFillEnv()->GetPageCount()) {
dsinclaira440bb32016-09-14 07:01:54 -0700352 return;
353 }
354
dsinclair521b7502016-11-02 13:02:28 -0700355 CPDFSDK_FormFillEnvironment* pFormFillEnv = m_pContext->GetFormFillEnv();
dsinclair655fcca2016-10-11 13:53:37 -0700356 if (!pFormFillEnv)
dsinclaira440bb32016-09-14 07:01:54 -0700357 return;
Lei Zhang671630e2017-05-19 19:25:16 -0700358 pFormFillEnv->SetCurrentPage(m_pContext.Get(), iCurPage);
dsinclaira440bb32016-09-14 07:01:54 -0700359}
360
tsepez4cf55152016-11-02 14:37:54 -0700361bool CPDFXFA_DocEnvironment::IsCalculationsEnabled(CXFA_FFDoc* hDoc) {
dsinclair521b7502016-11-02 13:02:28 -0700362 if (hDoc != m_pContext->GetXFADoc() || !m_pContext->GetFormFillEnv())
tsepez4cf55152016-11-02 14:37:54 -0700363 return false;
dsinclair521b7502016-11-02 13:02:28 -0700364 if (m_pContext->GetFormFillEnv()->GetInterForm()) {
365 return m_pContext->GetFormFillEnv()
dsinclair655fcca2016-10-11 13:53:37 -0700366 ->GetInterForm()
367 ->IsXfaCalculateEnabled();
dsinclair7cbe68e2016-10-12 11:56:23 -0700368 }
tsepez4cf55152016-11-02 14:37:54 -0700369 return false;
dsinclaira440bb32016-09-14 07:01:54 -0700370}
371
372void CPDFXFA_DocEnvironment::SetCalculationsEnabled(CXFA_FFDoc* hDoc,
tsepez4cf55152016-11-02 14:37:54 -0700373 bool bEnabled) {
dsinclair521b7502016-11-02 13:02:28 -0700374 if (hDoc != m_pContext->GetXFADoc() || !m_pContext->GetFormFillEnv())
dsinclaira440bb32016-09-14 07:01:54 -0700375 return;
dsinclair521b7502016-11-02 13:02:28 -0700376 if (m_pContext->GetFormFillEnv()->GetInterForm()) {
377 m_pContext->GetFormFillEnv()->GetInterForm()->XfaEnableCalculate(bEnabled);
dsinclair7cbe68e2016-10-12 11:56:23 -0700378 }
dsinclaira440bb32016-09-14 07:01:54 -0700379}
380
Ryan Harrison275e2602017-09-18 14:23:18 -0400381void CPDFXFA_DocEnvironment::GetTitle(CXFA_FFDoc* hDoc, WideString& wsTitle) {
dsinclair521b7502016-11-02 13:02:28 -0700382 if (hDoc != m_pContext->GetXFADoc() || !m_pContext->GetPDFDoc())
dsinclaira440bb32016-09-14 07:01:54 -0700383 return;
384
Lei Zhang01581062017-08-30 14:19:26 -0700385 const CPDF_Dictionary* pInfoDict = m_pContext->GetPDFDoc()->GetInfo();
dsinclaira440bb32016-09-14 07:01:54 -0700386 if (!pInfoDict)
387 return;
388
Ryan Harrison275e2602017-09-18 14:23:18 -0400389 ByteString csTitle = pInfoDict->GetStringFor("Title");
dsinclaira440bb32016-09-14 07:01:54 -0700390 wsTitle = wsTitle.FromLocal(csTitle.GetBuffer(csTitle.GetLength()));
391 csTitle.ReleaseBuffer(csTitle.GetLength());
392}
393
394void CPDFXFA_DocEnvironment::SetTitle(CXFA_FFDoc* hDoc,
Ryan Harrison275e2602017-09-18 14:23:18 -0400395 const WideString& wsTitle) {
dsinclair521b7502016-11-02 13:02:28 -0700396 if (hDoc != m_pContext->GetXFADoc() || !m_pContext->GetPDFDoc())
dsinclaira440bb32016-09-14 07:01:54 -0700397 return;
398
Lei Zhang01581062017-08-30 14:19:26 -0700399 CPDF_Dictionary* pInfoDict = m_pContext->GetPDFDoc()->GetInfo();
400 if (pInfoDict)
tsepez0e606b52016-11-18 16:22:41 -0800401 pInfoDict->SetNewFor<CPDF_String>("Title", wsTitle);
dsinclaira440bb32016-09-14 07:01:54 -0700402}
403
404void CPDFXFA_DocEnvironment::ExportData(CXFA_FFDoc* hDoc,
Ryan Harrison275e2602017-09-18 14:23:18 -0400405 const WideString& wsFilePath,
tsepez4cf55152016-11-02 14:37:54 -0700406 bool bXDP) {
dsinclair521b7502016-11-02 13:02:28 -0700407 if (hDoc != m_pContext->GetXFADoc())
dsinclaira440bb32016-09-14 07:01:54 -0700408 return;
409
Ryan Harrison854d71c2017-10-18 12:28:14 -0400410 if (!m_pContext->ContainsXFAForm())
dsinclaira440bb32016-09-14 07:01:54 -0700411 return;
412
dsinclair521b7502016-11-02 13:02:28 -0700413 CPDFSDK_FormFillEnvironment* pFormFillEnv = m_pContext->GetFormFillEnv();
dsinclair655fcca2016-10-11 13:53:37 -0700414 if (!pFormFillEnv)
dsinclaira440bb32016-09-14 07:01:54 -0700415 return;
416
417 int fileType = bXDP ? FXFA_SAVEAS_XDP : FXFA_SAVEAS_XML;
Ryan Harrison275e2602017-09-18 14:23:18 -0400418 ByteString bs = wsFilePath.UTF16LE_Encode();
dsinclaira440bb32016-09-14 07:01:54 -0700419 if (wsFilePath.IsEmpty()) {
dsinclair655fcca2016-10-11 13:53:37 -0700420 if (!pFormFillEnv->GetFormFillInfo() ||
dsinclair7cbe68e2016-10-12 11:56:23 -0700421 !pFormFillEnv->GetFormFillInfo()->m_pJsPlatform) {
dsinclaira440bb32016-09-14 07:01:54 -0700422 return;
dsinclair7cbe68e2016-10-12 11:56:23 -0700423 }
dsinclaira440bb32016-09-14 07:01:54 -0700424
Ryan Harrison275e2602017-09-18 14:23:18 -0400425 WideString filepath = pFormFillEnv->JS_fieldBrowse();
dsinclaira440bb32016-09-14 07:01:54 -0700426 bs = filepath.UTF16LE_Encode();
427 }
428 int len = bs.GetLength();
429 FPDF_FILEHANDLER* pFileHandler =
dsinclair655fcca2016-10-11 13:53:37 -0700430 pFormFillEnv->OpenFile(bXDP ? FXFA_SAVEAS_XDP : FXFA_SAVEAS_XML,
431 (FPDF_WIDESTRING)bs.GetBuffer(len), "wb");
dsinclaira440bb32016-09-14 07:01:54 -0700432 bs.ReleaseBuffer(len);
433 if (!pFileHandler)
434 return;
435
Dan Sinclair0b950422017-09-21 15:49:49 -0400436 RetainPtr<IFX_SeekableStream> fileWrite = MakeSeekableStream(pFileHandler);
Ryan Harrison275e2602017-09-18 14:23:18 -0400437 ByteString content;
dsinclaira440bb32016-09-14 07:01:54 -0700438 if (fileType == FXFA_SAVEAS_XML) {
439 content = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n";
tsepezfa89a202016-12-02 09:48:30 -0800440 fileWrite->WriteBlock(content.c_str(), fileWrite->GetSize(),
441 content.GetLength());
Dan Sinclairf96dfed2017-11-08 19:57:00 +0000442 CXFA_FFDoc* ffdoc = m_pContext->GetXFADocView()->GetDoc();
443 ffdoc->SavePackage(
444 ToNode(ffdoc->GetXFADoc()->GetXFAObject(XFA_HASHCODE_Data)), fileWrite,
445 nullptr);
dsinclaira440bb32016-09-14 07:01:54 -0700446 } else if (fileType == FXFA_SAVEAS_XDP) {
dsinclair521b7502016-11-02 13:02:28 -0700447 if (!m_pContext->GetPDFDoc())
dsinclaira440bb32016-09-14 07:01:54 -0700448 return;
449
Lei Zhang01581062017-08-30 14:19:26 -0700450 const CPDF_Dictionary* pRoot = m_pContext->GetPDFDoc()->GetRoot();
dsinclaira440bb32016-09-14 07:01:54 -0700451 if (!pRoot)
452 return;
453
dsinclair38fd8442016-09-15 10:15:32 -0700454 CPDF_Dictionary* pAcroForm = pRoot->GetDictFor("AcroForm");
dsinclaira440bb32016-09-14 07:01:54 -0700455 if (!pAcroForm)
456 return;
457
dsinclair38fd8442016-09-15 10:15:32 -0700458 CPDF_Array* pArray = ToArray(pAcroForm->GetObjectFor("XFA"));
dsinclaira440bb32016-09-14 07:01:54 -0700459 if (!pArray)
460 return;
461
462 int size = pArray->GetCount();
463 for (int i = 1; i < size; i += 2) {
464 CPDF_Object* pPDFObj = pArray->GetObjectAt(i);
465 CPDF_Object* pPrePDFObj = pArray->GetObjectAt(i - 1);
466 if (!pPrePDFObj->IsString())
467 continue;
468 if (!pPDFObj->IsReference())
469 continue;
470
471 CPDF_Stream* pStream = ToStream(pPDFObj->GetDirect());
472 if (!pStream)
473 continue;
474 if (pPrePDFObj->GetString() == "form") {
Dan Sinclairf96dfed2017-11-08 19:57:00 +0000475 CXFA_FFDoc* ffdoc = m_pContext->GetXFADocView()->GetDoc();
476 ffdoc->SavePackage(
477 ToNode(ffdoc->GetXFADoc()->GetXFAObject(XFA_HASHCODE_Form)),
478 fileWrite, nullptr);
dsinclaira440bb32016-09-14 07:01:54 -0700479 continue;
480 }
481 if (pPrePDFObj->GetString() == "datasets") {
Dan Sinclairf96dfed2017-11-08 19:57:00 +0000482 CXFA_FFDoc* ffdoc = m_pContext->GetXFADocView()->GetDoc();
483 ffdoc->SavePackage(
484 ToNode(ffdoc->GetXFADoc()->GetXFAObject(XFA_HASHCODE_Datasets)),
485 fileWrite, nullptr);
dsinclaira440bb32016-09-14 07:01:54 -0700486 continue;
487 }
488 if (i == size - 1) {
Ryan Harrison275e2602017-09-18 14:23:18 -0400489 WideString wPath = WideString::FromUTF16LE(
dsinclaira440bb32016-09-14 07:01:54 -0700490 reinterpret_cast<const unsigned short*>(bs.c_str()),
491 bs.GetLength() / sizeof(unsigned short));
Ryan Harrison275e2602017-09-18 14:23:18 -0400492 ByteString bPath = wPath.UTF8Encode();
dsinclaira440bb32016-09-14 07:01:54 -0700493 const char* szFormat =
494 "\n<pdf href=\"%s\" xmlns=\"http://ns.adobe.com/xdp/pdf/\"/>";
495 content.Format(szFormat, bPath.c_str());
tsepezfa89a202016-12-02 09:48:30 -0800496 fileWrite->WriteBlock(content.c_str(), fileWrite->GetSize(),
497 content.GetLength());
dsinclaira440bb32016-09-14 07:01:54 -0700498 }
Tom Sepezafd0d1f2017-04-04 14:37:18 -0700499 auto pAcc = pdfium::MakeRetain<CPDF_StreamAcc>(pStream);
500 pAcc->LoadAllData();
tsepezfa89a202016-12-02 09:48:30 -0800501 fileWrite->WriteBlock(pAcc->GetData(), fileWrite->GetSize(),
502 pAcc->GetSize());
dsinclaira440bb32016-09-14 07:01:54 -0700503 }
504 }
tsepezfa89a202016-12-02 09:48:30 -0800505 fileWrite->Flush();
dsinclaira440bb32016-09-14 07:01:54 -0700506}
507
508void CPDFXFA_DocEnvironment::GotoURL(CXFA_FFDoc* hDoc,
Ryan Harrison275e2602017-09-18 14:23:18 -0400509 const WideString& bsURL) {
dsinclair521b7502016-11-02 13:02:28 -0700510 if (hDoc != m_pContext->GetXFADoc())
dsinclaira440bb32016-09-14 07:01:54 -0700511 return;
512
Ryan Harrison854d71c2017-10-18 12:28:14 -0400513 if (m_pContext->GetFormType() != FormType::kXFAFull)
dsinclaira440bb32016-09-14 07:01:54 -0700514 return;
515
dsinclair521b7502016-11-02 13:02:28 -0700516 CPDFSDK_FormFillEnvironment* pFormFillEnv = m_pContext->GetFormFillEnv();
dsinclair655fcca2016-10-11 13:53:37 -0700517 if (!pFormFillEnv)
dsinclaira440bb32016-09-14 07:01:54 -0700518 return;
519
Ryan Harrison275e2602017-09-18 14:23:18 -0400520 WideStringView str(bsURL.c_str());
Lei Zhang671630e2017-05-19 19:25:16 -0700521 pFormFillEnv->GotoURL(m_pContext.Get(), str);
dsinclaira440bb32016-09-14 07:01:54 -0700522}
523
tsepez4cf55152016-11-02 14:37:54 -0700524bool CPDFXFA_DocEnvironment::IsValidationsEnabled(CXFA_FFDoc* hDoc) {
dsinclair521b7502016-11-02 13:02:28 -0700525 if (hDoc != m_pContext->GetXFADoc() || !m_pContext->GetFormFillEnv())
tsepez4cf55152016-11-02 14:37:54 -0700526 return false;
dsinclair521b7502016-11-02 13:02:28 -0700527 if (m_pContext->GetFormFillEnv()->GetInterForm()) {
528 return m_pContext->GetFormFillEnv()
dsinclair655fcca2016-10-11 13:53:37 -0700529 ->GetInterForm()
530 ->IsXfaValidationsEnabled();
dsinclair7cbe68e2016-10-12 11:56:23 -0700531 }
tsepez4cf55152016-11-02 14:37:54 -0700532 return true;
dsinclaira440bb32016-09-14 07:01:54 -0700533}
534
535void CPDFXFA_DocEnvironment::SetValidationsEnabled(CXFA_FFDoc* hDoc,
tsepez4cf55152016-11-02 14:37:54 -0700536 bool bEnabled) {
dsinclair521b7502016-11-02 13:02:28 -0700537 if (hDoc != m_pContext->GetXFADoc() || !m_pContext->GetFormFillEnv())
dsinclaira440bb32016-09-14 07:01:54 -0700538 return;
dsinclair521b7502016-11-02 13:02:28 -0700539 if (m_pContext->GetFormFillEnv()->GetInterForm()) {
540 m_pContext->GetFormFillEnv()->GetInterForm()->XfaSetValidationsEnabled(
541 bEnabled);
dsinclair7cbe68e2016-10-12 11:56:23 -0700542 }
dsinclaira440bb32016-09-14 07:01:54 -0700543}
544
545void CPDFXFA_DocEnvironment::SetFocusWidget(CXFA_FFDoc* hDoc,
546 CXFA_FFWidget* hWidget) {
dsinclair521b7502016-11-02 13:02:28 -0700547 if (hDoc != m_pContext->GetXFADoc())
dsinclaira440bb32016-09-14 07:01:54 -0700548 return;
549
550 if (!hWidget) {
tsepezf8074ce2016-09-27 14:29:57 -0700551 CPDFSDK_Annot::ObservedPtr pNull;
dsinclair521b7502016-11-02 13:02:28 -0700552 m_pContext->GetFormFillEnv()->SetFocusAnnot(&pNull);
dsinclaira440bb32016-09-14 07:01:54 -0700553 return;
554 }
555
dsinclair521b7502016-11-02 13:02:28 -0700556 int pageViewCount = m_pContext->GetFormFillEnv()->GetPageViewCount();
dsinclaira440bb32016-09-14 07:01:54 -0700557 for (int i = 0; i < pageViewCount; i++) {
dsinclair521b7502016-11-02 13:02:28 -0700558 CPDFSDK_PageView* pPageView = m_pContext->GetFormFillEnv()->GetPageView(i);
dsinclaira440bb32016-09-14 07:01:54 -0700559 if (!pPageView)
560 continue;
561
tsepezf8074ce2016-09-27 14:29:57 -0700562 CPDFSDK_Annot::ObservedPtr pAnnot(pPageView->GetAnnotByXFAWidget(hWidget));
dsinclaira440bb32016-09-14 07:01:54 -0700563 if (pAnnot) {
dsinclair521b7502016-11-02 13:02:28 -0700564 m_pContext->GetFormFillEnv()->SetFocusAnnot(&pAnnot);
dsinclaira440bb32016-09-14 07:01:54 -0700565 break;
566 }
567 }
568}
569
570void CPDFXFA_DocEnvironment::Print(CXFA_FFDoc* hDoc,
571 int32_t nStartPage,
572 int32_t nEndPage,
573 uint32_t dwOptions) {
dsinclair521b7502016-11-02 13:02:28 -0700574 if (hDoc != m_pContext->GetXFADoc())
dsinclaira440bb32016-09-14 07:01:54 -0700575 return;
576
dsinclair521b7502016-11-02 13:02:28 -0700577 CPDFSDK_FormFillEnvironment* pFormFillEnv = m_pContext->GetFormFillEnv();
dsinclair655fcca2016-10-11 13:53:37 -0700578 if (!pFormFillEnv || !pFormFillEnv->GetFormFillInfo() ||
579 !pFormFillEnv->GetFormFillInfo()->m_pJsPlatform ||
580 !pFormFillEnv->GetFormFillInfo()->m_pJsPlatform->Doc_print) {
dsinclaira440bb32016-09-14 07:01:54 -0700581 return;
582 }
583
dsinclair655fcca2016-10-11 13:53:37 -0700584 pFormFillEnv->GetFormFillInfo()->m_pJsPlatform->Doc_print(
585 pFormFillEnv->GetFormFillInfo()->m_pJsPlatform,
dsinclaira440bb32016-09-14 07:01:54 -0700586 dwOptions & XFA_PRINTOPT_ShowDialog, nStartPage, nEndPage,
587 dwOptions & XFA_PRINTOPT_CanCancel, dwOptions & XFA_PRINTOPT_ShrinkPage,
588 dwOptions & XFA_PRINTOPT_AsImage, dwOptions & XFA_PRINTOPT_ReverseOrder,
589 dwOptions & XFA_PRINTOPT_PrintAnnot);
590}
591
592FX_ARGB CPDFXFA_DocEnvironment::GetHighlightColor(CXFA_FFDoc* hDoc) {
dsinclair521b7502016-11-02 13:02:28 -0700593 if (hDoc != m_pContext->GetXFADoc() || !m_pContext->GetFormFillEnv())
dsinclaira440bb32016-09-14 07:01:54 -0700594 return 0;
595
dsinclair521b7502016-11-02 13:02:28 -0700596 CPDFSDK_InterForm* pInterForm = m_pContext->GetFormFillEnv()->GetInterForm();
dsinclaira440bb32016-09-14 07:01:54 -0700597 if (!pInterForm)
598 return 0;
599
600 return ArgbEncode(pInterForm->GetHighlightAlpha(),
601 pInterForm->GetHighlightColor(FPDF_FORMFIELD_XFA));
602}
603
tsepez4cf55152016-11-02 14:37:54 -0700604bool CPDFXFA_DocEnvironment::NotifySubmit(bool bPrevOrPost) {
dsinclaira440bb32016-09-14 07:01:54 -0700605 if (bPrevOrPost)
606 return OnBeforeNotifySubmit();
607
608 OnAfterNotifySubmit();
tsepez4cf55152016-11-02 14:37:54 -0700609 return true;
dsinclaira440bb32016-09-14 07:01:54 -0700610}
611
tsepez4cf55152016-11-02 14:37:54 -0700612bool CPDFXFA_DocEnvironment::OnBeforeNotifySubmit() {
Ryan Harrison854d71c2017-10-18 12:28:14 -0400613 if (!m_pContext->ContainsXFAForm())
tsepez4cf55152016-11-02 14:37:54 -0700614 return true;
dsinclaira440bb32016-09-14 07:01:54 -0700615
dsinclair521b7502016-11-02 13:02:28 -0700616 if (!m_pContext->GetXFADocView())
tsepez4cf55152016-11-02 14:37:54 -0700617 return true;
dsinclaira440bb32016-09-14 07:01:54 -0700618
619 CXFA_FFWidgetHandler* pWidgetHandler =
dsinclair521b7502016-11-02 13:02:28 -0700620 m_pContext->GetXFADocView()->GetWidgetHandler();
dsinclaira440bb32016-09-14 07:01:54 -0700621 if (!pWidgetHandler)
tsepez4cf55152016-11-02 14:37:54 -0700622 return true;
dsinclaira440bb32016-09-14 07:01:54 -0700623
Tom Sepez40badde2017-05-01 13:21:39 -0700624 std::unique_ptr<CXFA_WidgetAccIterator> pWidgetAccIterator =
625 m_pContext->GetXFADocView()->CreateWidgetAccIterator();
dsinclaira440bb32016-09-14 07:01:54 -0700626 if (pWidgetAccIterator) {
627 CXFA_EventParam Param;
628 Param.m_eType = XFA_EVENT_PreSubmit;
629 while (CXFA_WidgetAcc* pWidgetAcc = pWidgetAccIterator->MoveToNext())
630 pWidgetHandler->ProcessEvent(pWidgetAcc, &Param);
631 }
632
Tom Sepez40badde2017-05-01 13:21:39 -0700633 pWidgetAccIterator = m_pContext->GetXFADocView()->CreateWidgetAccIterator();
dsinclaira440bb32016-09-14 07:01:54 -0700634 if (!pWidgetAccIterator)
tsepez4cf55152016-11-02 14:37:54 -0700635 return true;
dsinclaira440bb32016-09-14 07:01:54 -0700636
637 CXFA_WidgetAcc* pWidgetAcc = pWidgetAccIterator->MoveToNext();
638 pWidgetAcc = pWidgetAccIterator->MoveToNext();
639 while (pWidgetAcc) {
640 int fRet = pWidgetAcc->ProcessValidate(-1);
641 if (fRet == XFA_EVENTERROR_Error) {
dsinclair521b7502016-11-02 13:02:28 -0700642 CPDFSDK_FormFillEnvironment* pFormFillEnv = m_pContext->GetFormFillEnv();
dsinclair655fcca2016-10-11 13:53:37 -0700643 if (!pFormFillEnv)
tsepez4cf55152016-11-02 14:37:54 -0700644 return false;
dsinclaira440bb32016-09-14 07:01:54 -0700645
Ryan Harrison275e2602017-09-18 14:23:18 -0400646 WideString ws;
dsinclaira440bb32016-09-14 07:01:54 -0700647 ws.FromLocal(IDS_XFA_Validate_Input);
Ryan Harrison275e2602017-09-18 14:23:18 -0400648 ByteString bs = ws.UTF16LE_Encode();
dsinclaira440bb32016-09-14 07:01:54 -0700649 int len = bs.GetLength();
dsinclair655fcca2016-10-11 13:53:37 -0700650 pFormFillEnv->Alert((FPDF_WIDESTRING)bs.GetBuffer(len),
651 (FPDF_WIDESTRING)L"", 0, 1);
dsinclaira440bb32016-09-14 07:01:54 -0700652 bs.ReleaseBuffer(len);
tsepez4cf55152016-11-02 14:37:54 -0700653 return false;
dsinclaira440bb32016-09-14 07:01:54 -0700654 }
655 pWidgetAcc = pWidgetAccIterator->MoveToNext();
656 }
dsinclair521b7502016-11-02 13:02:28 -0700657 m_pContext->GetXFADocView()->UpdateDocView();
dsinclaira440bb32016-09-14 07:01:54 -0700658
tsepez4cf55152016-11-02 14:37:54 -0700659 return true;
dsinclaira440bb32016-09-14 07:01:54 -0700660}
661
662void CPDFXFA_DocEnvironment::OnAfterNotifySubmit() {
Ryan Harrison854d71c2017-10-18 12:28:14 -0400663 if (!m_pContext->ContainsXFAForm())
dsinclaira440bb32016-09-14 07:01:54 -0700664 return;
665
dsinclair521b7502016-11-02 13:02:28 -0700666 if (!m_pContext->GetXFADocView())
dsinclaira440bb32016-09-14 07:01:54 -0700667 return;
668
669 CXFA_FFWidgetHandler* pWidgetHandler =
dsinclair521b7502016-11-02 13:02:28 -0700670 m_pContext->GetXFADocView()->GetWidgetHandler();
dsinclaira440bb32016-09-14 07:01:54 -0700671 if (!pWidgetHandler)
672 return;
673
Tom Sepez40badde2017-05-01 13:21:39 -0700674 std::unique_ptr<CXFA_WidgetAccIterator> pWidgetAccIterator =
675 m_pContext->GetXFADocView()->CreateWidgetAccIterator();
dsinclaira440bb32016-09-14 07:01:54 -0700676 if (!pWidgetAccIterator)
677 return;
678
679 CXFA_EventParam Param;
680 Param.m_eType = XFA_EVENT_PostSubmit;
681 CXFA_WidgetAcc* pWidgetAcc = pWidgetAccIterator->MoveToNext();
682 while (pWidgetAcc) {
683 pWidgetHandler->ProcessEvent(pWidgetAcc, &Param);
684 pWidgetAcc = pWidgetAccIterator->MoveToNext();
685 }
dsinclair521b7502016-11-02 13:02:28 -0700686 m_pContext->GetXFADocView()->UpdateDocView();
dsinclaira440bb32016-09-14 07:01:54 -0700687}
688
Dan Sinclairb8656252017-11-07 21:34:30 +0000689bool CPDFXFA_DocEnvironment::SubmitData(CXFA_FFDoc* hDoc,
690 CXFA_SubmitData submitData) {
tsepez4cf55152016-11-02 14:37:54 -0700691 if (!NotifySubmit(true) || !m_pContext->GetXFADocView())
692 return false;
dsinclaira440bb32016-09-14 07:01:54 -0700693
dsinclair521b7502016-11-02 13:02:28 -0700694 m_pContext->GetXFADocView()->UpdateDocView();
Dan Sinclairb8656252017-11-07 21:34:30 +0000695 bool ret = SubmitDataInternal(hDoc, submitData);
tsepez4cf55152016-11-02 14:37:54 -0700696 NotifySubmit(false);
dsinclaira440bb32016-09-14 07:01:54 -0700697 return ret;
698}
699
Dan Sinclair0b950422017-09-21 15:49:49 -0400700RetainPtr<IFX_SeekableReadStream> CPDFXFA_DocEnvironment::OpenLinkedFile(
dsinclaira440bb32016-09-14 07:01:54 -0700701 CXFA_FFDoc* hDoc,
Ryan Harrison275e2602017-09-18 14:23:18 -0400702 const WideString& wsLink) {
dsinclair521b7502016-11-02 13:02:28 -0700703 CPDFSDK_FormFillEnvironment* pFormFillEnv = m_pContext->GetFormFillEnv();
dsinclair655fcca2016-10-11 13:53:37 -0700704 if (!pFormFillEnv)
tsepez04c10092016-10-25 15:16:40 -0700705 return nullptr;
dsinclaira440bb32016-09-14 07:01:54 -0700706
Ryan Harrison275e2602017-09-18 14:23:18 -0400707 ByteString bs = wsLink.UTF16LE_Encode();
dsinclaira440bb32016-09-14 07:01:54 -0700708 int len = bs.GetLength();
709 FPDF_FILEHANDLER* pFileHandler =
dsinclair655fcca2016-10-11 13:53:37 -0700710 pFormFillEnv->OpenFile(0, (FPDF_WIDESTRING)bs.GetBuffer(len), "rb");
dsinclaira440bb32016-09-14 07:01:54 -0700711 bs.ReleaseBuffer(len);
dsinclaira440bb32016-09-14 07:01:54 -0700712 if (!pFileHandler)
713 return nullptr;
tsepez04c10092016-10-25 15:16:40 -0700714
tsepezfa89a202016-12-02 09:48:30 -0800715 return MakeSeekableStream(pFileHandler);
dsinclaira440bb32016-09-14 07:01:54 -0700716}
717
tsepez4cf55152016-11-02 14:37:54 -0700718bool CPDFXFA_DocEnvironment::ExportSubmitFile(FPDF_FILEHANDLER* pFileHandler,
719 int fileType,
720 FPDF_DWORD encodeType,
721 FPDF_DWORD flag) {
dsinclair521b7502016-11-02 13:02:28 -0700722 if (!m_pContext->GetXFADocView())
tsepez4cf55152016-11-02 14:37:54 -0700723 return false;
dsinclaira440bb32016-09-14 07:01:54 -0700724
dsinclair521b7502016-11-02 13:02:28 -0700725 CPDFSDK_FormFillEnvironment* pFormFillEnv = m_pContext->GetFormFillEnv();
dsinclair655fcca2016-10-11 13:53:37 -0700726 if (!pFormFillEnv)
tsepez4cf55152016-11-02 14:37:54 -0700727 return false;
dsinclaira440bb32016-09-14 07:01:54 -0700728
Dan Sinclairf96dfed2017-11-08 19:57:00 +0000729 CXFA_FFDoc* ffdoc = m_pContext->GetXFADocView()->GetDoc();
Dan Sinclair0b950422017-09-21 15:49:49 -0400730 RetainPtr<IFX_SeekableStream> fileStream = MakeSeekableStream(pFileHandler);
dsinclaira440bb32016-09-14 07:01:54 -0700731 if (fileType == FXFA_SAVEAS_XML) {
Dan Sinclairf96dfed2017-11-08 19:57:00 +0000732 static constexpr char kContent[] =
733 "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n";
tsepezfa89a202016-12-02 09:48:30 -0800734 fileStream->WriteBlock(kContent, 0, strlen(kContent));
Dan Sinclairf96dfed2017-11-08 19:57:00 +0000735
736 ffdoc->SavePackage(
737 ToNode(ffdoc->GetXFADoc()->GetXFAObject(XFA_HASHCODE_Data)), fileStream,
738 nullptr);
tsepez4cf55152016-11-02 14:37:54 -0700739 return true;
dsinclaira440bb32016-09-14 07:01:54 -0700740 }
741
742 if (fileType != FXFA_SAVEAS_XDP)
tsepez4cf55152016-11-02 14:37:54 -0700743 return true;
dsinclaira440bb32016-09-14 07:01:54 -0700744
745 if (!flag) {
746 flag = FXFA_CONFIG | FXFA_TEMPLATE | FXFA_LOCALESET | FXFA_DATASETS |
747 FXFA_XMPMETA | FXFA_XFDF | FXFA_FORM;
748 }
dsinclair521b7502016-11-02 13:02:28 -0700749 if (!m_pContext->GetPDFDoc()) {
tsepezfa89a202016-12-02 09:48:30 -0800750 fileStream->Flush();
tsepez4cf55152016-11-02 14:37:54 -0700751 return false;
dsinclaira440bb32016-09-14 07:01:54 -0700752 }
753
Lei Zhang01581062017-08-30 14:19:26 -0700754 const CPDF_Dictionary* pRoot = m_pContext->GetPDFDoc()->GetRoot();
dsinclaira440bb32016-09-14 07:01:54 -0700755 if (!pRoot) {
tsepezfa89a202016-12-02 09:48:30 -0800756 fileStream->Flush();
tsepez4cf55152016-11-02 14:37:54 -0700757 return false;
dsinclaira440bb32016-09-14 07:01:54 -0700758 }
759
dsinclair38fd8442016-09-15 10:15:32 -0700760 CPDF_Dictionary* pAcroForm = pRoot->GetDictFor("AcroForm");
dsinclaira440bb32016-09-14 07:01:54 -0700761 if (!pAcroForm) {
tsepezfa89a202016-12-02 09:48:30 -0800762 fileStream->Flush();
tsepez4cf55152016-11-02 14:37:54 -0700763 return false;
dsinclaira440bb32016-09-14 07:01:54 -0700764 }
765
dsinclair38fd8442016-09-15 10:15:32 -0700766 CPDF_Array* pArray = ToArray(pAcroForm->GetObjectFor("XFA"));
dsinclaira440bb32016-09-14 07:01:54 -0700767 if (!pArray) {
tsepezfa89a202016-12-02 09:48:30 -0800768 fileStream->Flush();
tsepez4cf55152016-11-02 14:37:54 -0700769 return false;
dsinclaira440bb32016-09-14 07:01:54 -0700770 }
771
772 int size = pArray->GetCount();
773 for (int i = 1; i < size; i += 2) {
774 CPDF_Object* pPDFObj = pArray->GetObjectAt(i);
775 CPDF_Object* pPrePDFObj = pArray->GetObjectAt(i - 1);
776 if (!pPrePDFObj->IsString())
777 continue;
778 if (!pPDFObj->IsReference())
779 continue;
780
781 CPDF_Object* pDirectObj = pPDFObj->GetDirect();
782 if (!pDirectObj->IsStream())
783 continue;
784 if (pPrePDFObj->GetString() == "config" && !(flag & FXFA_CONFIG))
785 continue;
786 if (pPrePDFObj->GetString() == "template" && !(flag & FXFA_TEMPLATE))
787 continue;
788 if (pPrePDFObj->GetString() == "localeSet" && !(flag & FXFA_LOCALESET))
789 continue;
790 if (pPrePDFObj->GetString() == "datasets" && !(flag & FXFA_DATASETS))
791 continue;
792 if (pPrePDFObj->GetString() == "xmpmeta" && !(flag & FXFA_XMPMETA))
793 continue;
794 if (pPrePDFObj->GetString() == "xfdf" && !(flag & FXFA_XFDF))
795 continue;
796 if (pPrePDFObj->GetString() == "form" && !(flag & FXFA_FORM))
797 continue;
Dan Sinclairf96dfed2017-11-08 19:57:00 +0000798
dsinclaira440bb32016-09-14 07:01:54 -0700799 if (pPrePDFObj->GetString() == "form") {
Dan Sinclairf96dfed2017-11-08 19:57:00 +0000800 ffdoc->SavePackage(
801 ToNode(ffdoc->GetXFADoc()->GetXFAObject(XFA_HASHCODE_Form)),
802 fileStream, nullptr);
dsinclaira440bb32016-09-14 07:01:54 -0700803 } else if (pPrePDFObj->GetString() == "datasets") {
Dan Sinclairf96dfed2017-11-08 19:57:00 +0000804 ffdoc->SavePackage(
805 ToNode(ffdoc->GetXFADoc()->GetXFAObject(XFA_HASHCODE_Datasets)),
806 fileStream, nullptr);
dsinclaira440bb32016-09-14 07:01:54 -0700807 }
808 }
tsepez4cf55152016-11-02 14:37:54 -0700809 return true;
dsinclaira440bb32016-09-14 07:01:54 -0700810}
811
Ryan Harrison275e2602017-09-18 14:23:18 -0400812void CPDFXFA_DocEnvironment::ToXFAContentFlags(WideString csSrcContent,
dsinclaira440bb32016-09-14 07:01:54 -0700813 FPDF_DWORD& flag) {
Ryan Harrison12db7512017-08-23 10:39:35 -0400814 if (csSrcContent.Contains(L" config "))
dsinclaira440bb32016-09-14 07:01:54 -0700815 flag |= FXFA_CONFIG;
Ryan Harrison12db7512017-08-23 10:39:35 -0400816 if (csSrcContent.Contains(L" template "))
dsinclaira440bb32016-09-14 07:01:54 -0700817 flag |= FXFA_TEMPLATE;
Ryan Harrison12db7512017-08-23 10:39:35 -0400818 if (csSrcContent.Contains(L" localeSet "))
dsinclaira440bb32016-09-14 07:01:54 -0700819 flag |= FXFA_LOCALESET;
Ryan Harrison12db7512017-08-23 10:39:35 -0400820 if (csSrcContent.Contains(L" datasets "))
dsinclaira440bb32016-09-14 07:01:54 -0700821 flag |= FXFA_DATASETS;
Ryan Harrison12db7512017-08-23 10:39:35 -0400822 if (csSrcContent.Contains(L" xmpmeta "))
dsinclaira440bb32016-09-14 07:01:54 -0700823 flag |= FXFA_XMPMETA;
Ryan Harrison12db7512017-08-23 10:39:35 -0400824 if (csSrcContent.Contains(L" xfdf "))
dsinclaira440bb32016-09-14 07:01:54 -0700825 flag |= FXFA_XFDF;
Ryan Harrison12db7512017-08-23 10:39:35 -0400826 if (csSrcContent.Contains(L" form "))
dsinclaira440bb32016-09-14 07:01:54 -0700827 flag |= FXFA_FORM;
828 if (flag == 0) {
829 flag = FXFA_CONFIG | FXFA_TEMPLATE | FXFA_LOCALESET | FXFA_DATASETS |
830 FXFA_XMPMETA | FXFA_XFDF | FXFA_FORM;
831 }
832}
833
Ryan Harrison275e2602017-09-18 14:23:18 -0400834bool CPDFXFA_DocEnvironment::MailToInfo(WideString& csURL,
835 WideString& csToAddress,
836 WideString& csCCAddress,
837 WideString& csBCCAddress,
838 WideString& csSubject,
839 WideString& csMsg) {
840 WideString srcURL = csURL;
dsinclaira440bb32016-09-14 07:01:54 -0700841 srcURL.TrimLeft();
842 if (srcURL.Left(7).CompareNoCase(L"mailto:") != 0)
tsepez4cf55152016-11-02 14:37:54 -0700843 return false;
dsinclaira440bb32016-09-14 07:01:54 -0700844
Ryan Harrison12db7512017-08-23 10:39:35 -0400845 auto pos = srcURL.Find(L'?');
Ryan Harrison275e2602017-09-18 14:23:18 -0400846 WideString tmp;
Ryan Harrison12db7512017-08-23 10:39:35 -0400847 if (!pos.has_value()) {
848 pos = srcURL.Find(L'@');
849 if (!pos.has_value())
tsepez4cf55152016-11-02 14:37:54 -0700850 return false;
dsinclaira440bb32016-09-14 07:01:54 -0700851
852 tmp = srcURL.Right(csURL.GetLength() - 7);
853 } else {
Ryan Harrison12db7512017-08-23 10:39:35 -0400854 tmp = srcURL.Left(pos.value());
dsinclaira440bb32016-09-14 07:01:54 -0700855 tmp = tmp.Right(tmp.GetLength() - 7);
856 }
857 tmp.TrimLeft();
858 tmp.TrimRight();
859
860 csToAddress = tmp;
861
Ryan Harrison12db7512017-08-23 10:39:35 -0400862 srcURL = srcURL.Right(srcURL.GetLength() - (pos.value() + 1));
dsinclaira440bb32016-09-14 07:01:54 -0700863 while (!srcURL.IsEmpty()) {
864 srcURL.TrimLeft();
865 srcURL.TrimRight();
Ryan Harrison12db7512017-08-23 10:39:35 -0400866 pos = srcURL.Find(L'&');
dsinclaira440bb32016-09-14 07:01:54 -0700867
Ryan Harrison12db7512017-08-23 10:39:35 -0400868 tmp = (!pos.has_value()) ? srcURL : srcURL.Left(pos.value());
dsinclaira440bb32016-09-14 07:01:54 -0700869 tmp.TrimLeft();
870 tmp.TrimRight();
871 if (tmp.GetLength() >= 3 && tmp.Left(3).CompareNoCase(L"cc=") == 0) {
872 tmp = tmp.Right(tmp.GetLength() - 3);
873 if (!csCCAddress.IsEmpty())
874 csCCAddress += L';';
875 csCCAddress += tmp;
876 } else if (tmp.GetLength() >= 4 &&
877 tmp.Left(4).CompareNoCase(L"bcc=") == 0) {
878 tmp = tmp.Right(tmp.GetLength() - 4);
879 if (!csBCCAddress.IsEmpty())
880 csBCCAddress += L';';
881 csBCCAddress += tmp;
882 } else if (tmp.GetLength() >= 8 &&
883 tmp.Left(8).CompareNoCase(L"subject=") == 0) {
884 tmp = tmp.Right(tmp.GetLength() - 8);
885 csSubject += tmp;
886 } else if (tmp.GetLength() >= 5 &&
887 tmp.Left(5).CompareNoCase(L"body=") == 0) {
888 tmp = tmp.Right(tmp.GetLength() - 5);
889 csMsg += tmp;
890 }
Ryan Harrison12db7512017-08-23 10:39:35 -0400891 srcURL = !pos.has_value()
892 ? L""
893 : srcURL.Right(csURL.GetLength() - (pos.value() + 1));
dsinclaira440bb32016-09-14 07:01:54 -0700894 }
895 csToAddress.Replace(L",", L";");
896 csCCAddress.Replace(L",", L";");
897 csBCCAddress.Replace(L",", L";");
tsepez4cf55152016-11-02 14:37:54 -0700898 return true;
dsinclaira440bb32016-09-14 07:01:54 -0700899}
900
tsepez4cf55152016-11-02 14:37:54 -0700901bool CPDFXFA_DocEnvironment::SubmitDataInternal(CXFA_FFDoc* hDoc,
Dan Sinclairb8656252017-11-07 21:34:30 +0000902 CXFA_SubmitData submitData) {
dsinclair521b7502016-11-02 13:02:28 -0700903 CPDFSDK_FormFillEnvironment* pFormFillEnv = m_pContext->GetFormFillEnv();
dsinclair655fcca2016-10-11 13:53:37 -0700904 if (!pFormFillEnv)
tsepez4cf55152016-11-02 14:37:54 -0700905 return false;
dsinclaira440bb32016-09-14 07:01:54 -0700906
Ryan Harrison275e2602017-09-18 14:23:18 -0400907 WideStringView csURLC;
Dan Sinclairb8656252017-11-07 21:34:30 +0000908 submitData.GetSubmitTarget(csURLC);
Ryan Harrison275e2602017-09-18 14:23:18 -0400909 WideString csURL(csURLC);
dsinclaira440bb32016-09-14 07:01:54 -0700910 if (csURL.IsEmpty()) {
Ryan Harrison275e2602017-09-18 14:23:18 -0400911 WideString ws;
dsinclaira440bb32016-09-14 07:01:54 -0700912 ws.FromLocal("Submit cancelled.");
Ryan Harrison275e2602017-09-18 14:23:18 -0400913 ByteString bs = ws.UTF16LE_Encode();
dsinclaira440bb32016-09-14 07:01:54 -0700914 int len = bs.GetLength();
dsinclair655fcca2016-10-11 13:53:37 -0700915 pFormFillEnv->Alert((FPDF_WIDESTRING)bs.GetBuffer(len),
916 (FPDF_WIDESTRING)L"", 0, 4);
dsinclaira440bb32016-09-14 07:01:54 -0700917 bs.ReleaseBuffer(len);
tsepez4cf55152016-11-02 14:37:54 -0700918 return false;
dsinclaira440bb32016-09-14 07:01:54 -0700919 }
920
dsinclaira440bb32016-09-14 07:01:54 -0700921 FPDF_FILEHANDLER* pFileHandler = nullptr;
922 int fileFlag = -1;
Dan Sinclairb8656252017-11-07 21:34:30 +0000923 switch (submitData.GetSubmitFormat()) {
dsinclaira440bb32016-09-14 07:01:54 -0700924 case XFA_ATTRIBUTEENUM_Xdp: {
Ryan Harrison275e2602017-09-18 14:23:18 -0400925 WideStringView csContentC;
Dan Sinclairb8656252017-11-07 21:34:30 +0000926 submitData.GetSubmitXDPContent(csContentC);
Ryan Harrison275e2602017-09-18 14:23:18 -0400927 WideString csContent;
dsinclaira440bb32016-09-14 07:01:54 -0700928 csContent = csContentC;
929 csContent.TrimLeft();
930 csContent.TrimRight();
Ryan Harrison275e2602017-09-18 14:23:18 -0400931 WideString space;
dsinclaira440bb32016-09-14 07:01:54 -0700932 space.FromLocal(" ");
933 csContent = space + csContent + space;
934 FPDF_DWORD flag = 0;
Dan Sinclairb8656252017-11-07 21:34:30 +0000935 if (submitData.IsSubmitEmbedPDF())
dsinclaira440bb32016-09-14 07:01:54 -0700936 flag |= FXFA_PDF;
937
938 ToXFAContentFlags(csContent, flag);
dsinclair655fcca2016-10-11 13:53:37 -0700939 pFileHandler = pFormFillEnv->OpenFile(FXFA_SAVEAS_XDP, nullptr, "wb");
dsinclaira440bb32016-09-14 07:01:54 -0700940 fileFlag = FXFA_SAVEAS_XDP;
941 ExportSubmitFile(pFileHandler, FXFA_SAVEAS_XDP, 0, flag);
942 break;
943 }
944 case XFA_ATTRIBUTEENUM_Xml:
dsinclair655fcca2016-10-11 13:53:37 -0700945 pFileHandler = pFormFillEnv->OpenFile(FXFA_SAVEAS_XML, nullptr, "wb");
dsinclaira440bb32016-09-14 07:01:54 -0700946 fileFlag = FXFA_SAVEAS_XML;
947 ExportSubmitFile(pFileHandler, FXFA_SAVEAS_XML, 0, FXFA_XFA_ALL);
948 break;
949 case XFA_ATTRIBUTEENUM_Pdf:
950 break;
951 case XFA_ATTRIBUTEENUM_Urlencoded:
dsinclair655fcca2016-10-11 13:53:37 -0700952 pFileHandler = pFormFillEnv->OpenFile(FXFA_SAVEAS_XML, nullptr, "wb");
dsinclaira440bb32016-09-14 07:01:54 -0700953 fileFlag = FXFA_SAVEAS_XML;
954 ExportSubmitFile(pFileHandler, FXFA_SAVEAS_XML, 0, FXFA_XFA_ALL);
955 break;
956 default:
957 return false;
958 }
959 if (!pFileHandler)
tsepez4cf55152016-11-02 14:37:54 -0700960 return false;
dsinclaira440bb32016-09-14 07:01:54 -0700961 if (csURL.Left(7).CompareNoCase(L"mailto:") == 0) {
Ryan Harrison275e2602017-09-18 14:23:18 -0400962 WideString csToAddress;
963 WideString csCCAddress;
964 WideString csBCCAddress;
965 WideString csSubject;
966 WideString csMsg;
tsepez16b703c2016-10-26 08:45:31 -0700967 if (!MailToInfo(csURL, csToAddress, csCCAddress, csBCCAddress, csSubject,
968 csMsg)) {
tsepez4cf55152016-11-02 14:37:54 -0700969 return false;
tsepez16b703c2016-10-26 08:45:31 -0700970 }
Ryan Harrison275e2602017-09-18 14:23:18 -0400971 ByteString bsTo = WideString(csToAddress).UTF16LE_Encode();
972 ByteString bsCC = WideString(csCCAddress).UTF16LE_Encode();
973 ByteString bsBcc = WideString(csBCCAddress).UTF16LE_Encode();
974 ByteString bsSubject = WideString(csSubject).UTF16LE_Encode();
975 ByteString bsMsg = WideString(csMsg).UTF16LE_Encode();
dsinclaira440bb32016-09-14 07:01:54 -0700976 FPDF_WIDESTRING pTo = (FPDF_WIDESTRING)bsTo.GetBuffer(bsTo.GetLength());
977 FPDF_WIDESTRING pCC = (FPDF_WIDESTRING)bsCC.GetBuffer(bsCC.GetLength());
978 FPDF_WIDESTRING pBcc = (FPDF_WIDESTRING)bsBcc.GetBuffer(bsBcc.GetLength());
979 FPDF_WIDESTRING pSubject =
980 (FPDF_WIDESTRING)bsSubject.GetBuffer(bsSubject.GetLength());
981 FPDF_WIDESTRING pMsg = (FPDF_WIDESTRING)bsMsg.GetBuffer(bsMsg.GetLength());
dsinclair655fcca2016-10-11 13:53:37 -0700982 pFormFillEnv->EmailTo(pFileHandler, pTo, pSubject, pCC, pBcc, pMsg);
Ryan Harrison0186c182017-08-01 16:20:40 -0400983 bsTo.ReleaseBuffer(bsTo.GetStringLength());
984 bsCC.ReleaseBuffer(bsCC.GetStringLength());
985 bsBcc.ReleaseBuffer(bsBcc.GetStringLength());
986 bsSubject.ReleaseBuffer(bsSubject.GetStringLength());
987 bsMsg.ReleaseBuffer(bsMsg.GetStringLength());
dsinclaira440bb32016-09-14 07:01:54 -0700988 } else {
989 // HTTP or FTP
Ryan Harrison275e2602017-09-18 14:23:18 -0400990 WideString ws;
991 ByteString bs = csURL.UTF16LE_Encode();
dsinclaira440bb32016-09-14 07:01:54 -0700992 int len = bs.GetLength();
dsinclair655fcca2016-10-11 13:53:37 -0700993 pFormFillEnv->UploadTo(pFileHandler, fileFlag,
994 (FPDF_WIDESTRING)bs.GetBuffer(len));
dsinclaira440bb32016-09-14 07:01:54 -0700995 bs.ReleaseBuffer(len);
996 }
tsepez4cf55152016-11-02 14:37:54 -0700997 return true;
dsinclaira440bb32016-09-14 07:01:54 -0700998}
999
Ryan Harrison275e2602017-09-18 14:23:18 -04001000bool CPDFXFA_DocEnvironment::SetGlobalProperty(CXFA_FFDoc* hDoc,
1001 const ByteStringView& szPropName,
1002 CFXJSE_Value* pValue) {
dsinclair521b7502016-11-02 13:02:28 -07001003 if (hDoc != m_pContext->GetXFADoc())
tsepez4cf55152016-11-02 14:37:54 -07001004 return false;
Tom Sepez7dc9fe52017-05-18 09:51:57 -07001005 if (!m_pContext->GetFormFillEnv() ||
1006 !m_pContext->GetFormFillEnv()->GetJSRuntime()) {
1007 return false;
dsinclair655fcca2016-10-11 13:53:37 -07001008 }
Tom Sepez7dc9fe52017-05-18 09:51:57 -07001009 CPDFSDK_FormFillEnvironment* pFormFillEnv = m_pContext->GetFormFillEnv();
1010 IJS_EventContext* pContext = pFormFillEnv->GetJSRuntime()->NewEventContext();
1011 bool bRet = pFormFillEnv->GetJSRuntime()->SetValueByName(szPropName, pValue);
1012 pFormFillEnv->GetJSRuntime()->ReleaseEventContext(pContext);
1013 return bRet;
dsinclaira440bb32016-09-14 07:01:54 -07001014}
1015
Ryan Harrison275e2602017-09-18 14:23:18 -04001016bool CPDFXFA_DocEnvironment::GetGlobalProperty(CXFA_FFDoc* hDoc,
1017 const ByteStringView& szPropName,
1018 CFXJSE_Value* pValue) {
dsinclair521b7502016-11-02 13:02:28 -07001019 if (hDoc != m_pContext->GetXFADoc())
tsepez4cf55152016-11-02 14:37:54 -07001020 return false;
dsinclair521b7502016-11-02 13:02:28 -07001021 if (!m_pContext->GetFormFillEnv() ||
1022 !m_pContext->GetFormFillEnv()->GetJSRuntime()) {
tsepez4cf55152016-11-02 14:37:54 -07001023 return false;
dsinclair655fcca2016-10-11 13:53:37 -07001024 }
dsinclair521b7502016-11-02 13:02:28 -07001025 CPDFSDK_FormFillEnvironment* pFormFillEnv = m_pContext->GetFormFillEnv();
Tom Sepez7dc9fe52017-05-18 09:51:57 -07001026 IJS_EventContext* pContext = pFormFillEnv->GetJSRuntime()->NewEventContext();
1027 bool bRet = pFormFillEnv->GetJSRuntime()->GetValueByName(szPropName, pValue);
1028 pFormFillEnv->GetJSRuntime()->ReleaseEventContext(pContext);
1029 return bRet;
dsinclaira440bb32016-09-14 07:01:54 -07001030}