blob: d47c1457009a35d39bef2627898d28439d73b7de [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"
Dan Sinclair08915152018-01-23 15:22:54 +000024#include "xfa/fxfa/cxfa_readynodeiterator.h"
25#include "xfa/fxfa/parser/cxfa_node.h"
Dan Sinclairc5e0f662017-12-14 20:20:33 +000026#include "xfa/fxfa/parser/cxfa_submit.h"
dsinclaira440bb32016-09-14 07:01:54 -070027
28#define IDS_XFA_Validate_Input \
29 "At least one required field was empty. Please fill in the required " \
30 "fields\r\n(highlighted) before continuing."
31
32// submit
33#define FXFA_CONFIG 0x00000001
34#define FXFA_TEMPLATE 0x00000010
35#define FXFA_LOCALESET 0x00000100
36#define FXFA_DATASETS 0x00001000
37#define FXFA_XMPMETA 0x00010000
38#define FXFA_XFDF 0x00100000
39#define FXFA_FORM 0x01000000
40#define FXFA_PDF 0x10000000
41#define FXFA_XFA_ALL 0x01111111
42
dsinclair521b7502016-11-02 13:02:28 -070043CPDFXFA_DocEnvironment::CPDFXFA_DocEnvironment(CPDFXFA_Context* pContext)
Tom Sepez7dc9fe52017-05-18 09:51:57 -070044 : m_pContext(pContext) {
dsinclair521b7502016-11-02 13:02:28 -070045 ASSERT(m_pContext);
dsinclaira440bb32016-09-14 07:01:54 -070046}
47
Tom Sepez7dc9fe52017-05-18 09:51:57 -070048CPDFXFA_DocEnvironment::~CPDFXFA_DocEnvironment() {}
dsinclaira440bb32016-09-14 07:01:54 -070049
50void CPDFXFA_DocEnvironment::SetChangeMark(CXFA_FFDoc* hDoc) {
dsinclair521b7502016-11-02 13:02:28 -070051 if (hDoc == m_pContext->GetXFADoc() && m_pContext->GetFormFillEnv())
52 m_pContext->GetFormFillEnv()->SetChangeMark();
dsinclaira440bb32016-09-14 07:01:54 -070053}
54
55void CPDFXFA_DocEnvironment::InvalidateRect(CXFA_FFPageView* pPageView,
Dan Sinclaire3978d02017-03-23 09:12:10 -040056 const CFX_RectF& rt) {
dsinclair521b7502016-11-02 13:02:28 -070057 if (!m_pContext->GetXFADoc() || !m_pContext->GetFormFillEnv())
dsinclaira440bb32016-09-14 07:01:54 -070058 return;
59
Ryan Harrison854d71c2017-10-18 12:28:14 -040060 if (m_pContext->GetFormType() != FormType::kXFAFull)
dsinclaira440bb32016-09-14 07:01:54 -070061 return;
62
Dan Sinclair0b950422017-09-21 15:49:49 -040063 RetainPtr<CPDFXFA_Page> pPage = m_pContext->GetXFAPage(pPageView);
dsinclaira440bb32016-09-14 07:01:54 -070064 if (!pPage)
65 return;
66
dsinclair521b7502016-11-02 13:02:28 -070067 CPDFSDK_FormFillEnvironment* pFormFillEnv = m_pContext->GetFormFillEnv();
dsinclair655fcca2016-10-11 13:53:37 -070068 if (!pFormFillEnv)
dsinclaira440bb32016-09-14 07:01:54 -070069 return;
70
Dan Sinclair6ba39e82017-07-26 17:19:40 -040071 pFormFillEnv->Invalidate(pPage.Get(), rt.ToFloatRect().ToFxRect());
dsinclaira440bb32016-09-14 07:01:54 -070072}
73
74void CPDFXFA_DocEnvironment::DisplayCaret(CXFA_FFWidget* hWidget,
tsepez4cf55152016-11-02 14:37:54 -070075 bool bVisible,
dsinclaira440bb32016-09-14 07:01:54 -070076 const CFX_RectF* pRtAnchor) {
dsinclair521b7502016-11-02 13:02:28 -070077 if (!hWidget || !pRtAnchor || !m_pContext->GetXFADoc() ||
78 !m_pContext->GetFormFillEnv() || !m_pContext->GetXFADocView())
dsinclaira440bb32016-09-14 07:01:54 -070079 return;
80
Ryan Harrison854d71c2017-10-18 12:28:14 -040081 if (m_pContext->GetFormType() != FormType::kXFAFull)
dsinclaira440bb32016-09-14 07:01:54 -070082 return;
83
84 CXFA_FFWidgetHandler* pWidgetHandler =
dsinclair521b7502016-11-02 13:02:28 -070085 m_pContext->GetXFADocView()->GetWidgetHandler();
dsinclaira440bb32016-09-14 07:01:54 -070086 if (!pWidgetHandler)
87 return;
88
89 CXFA_FFPageView* pPageView = hWidget->GetPageView();
90 if (!pPageView)
91 return;
92
Dan Sinclair0b950422017-09-21 15:49:49 -040093 RetainPtr<CPDFXFA_Page> pPage = m_pContext->GetXFAPage(pPageView);
dsinclaira440bb32016-09-14 07:01:54 -070094 if (!pPage)
95 return;
96
dsinclair521b7502016-11-02 13:02:28 -070097 CPDFSDK_FormFillEnvironment* pFormFillEnv = m_pContext->GetFormFillEnv();
dsinclair655fcca2016-10-11 13:53:37 -070098 if (!pFormFillEnv)
dsinclaira440bb32016-09-14 07:01:54 -070099 return;
100
Dan Sinclair6ba39e82017-07-26 17:19:40 -0400101 CFX_FloatRect rcCaret = pRtAnchor->ToFloatRect();
Lei Zhang671630e2017-05-19 19:25:16 -0700102 pFormFillEnv->DisplayCaret(pPage.Get(), bVisible, rcCaret.left, rcCaret.top,
103 rcCaret.right, rcCaret.bottom);
dsinclaira440bb32016-09-14 07:01:54 -0700104}
105
tsepez4cf55152016-11-02 14:37:54 -0700106bool CPDFXFA_DocEnvironment::GetPopupPos(CXFA_FFWidget* hWidget,
Dan Sinclair05df0752017-03-14 14:43:42 -0400107 float fMinPopup,
108 float fMaxPopup,
tsepez4cf55152016-11-02 14:37:54 -0700109 const CFX_RectF& rtAnchor,
110 CFX_RectF& rtPopup) {
dsinclaira440bb32016-09-14 07:01:54 -0700111 if (!hWidget)
tsepez4cf55152016-11-02 14:37:54 -0700112 return false;
dsinclaira440bb32016-09-14 07:01:54 -0700113
114 CXFA_FFPageView* pXFAPageView = hWidget->GetPageView();
115 if (!pXFAPageView)
tsepez4cf55152016-11-02 14:37:54 -0700116 return false;
dsinclaira440bb32016-09-14 07:01:54 -0700117
Dan Sinclair0b950422017-09-21 15:49:49 -0400118 RetainPtr<CPDFXFA_Page> pPage = m_pContext->GetXFAPage(pXFAPageView);
dsinclaira440bb32016-09-14 07:01:54 -0700119 if (!pPage)
tsepez4cf55152016-11-02 14:37:54 -0700120 return false;
dsinclaira440bb32016-09-14 07:01:54 -0700121
dsinclair521b7502016-11-02 13:02:28 -0700122 CPDFSDK_FormFillEnvironment* pFormFillEnv = m_pContext->GetFormFillEnv();
dsinclair655fcca2016-10-11 13:53:37 -0700123 if (!pFormFillEnv)
tsepez4cf55152016-11-02 14:37:54 -0700124 return false;
dsinclaira440bb32016-09-14 07:01:54 -0700125
126 FS_RECTF pageViewRect = {0.0f, 0.0f, 0.0f, 0.0f};
Tom Sepez9792f162017-05-16 14:11:30 -0700127 pFormFillEnv->GetPageViewRect(pPage.Get(), pageViewRect);
dsinclaira440bb32016-09-14 07:01:54 -0700128
129 int t1;
130 int t2;
Dan Sinclair6ba39e82017-07-26 17:19:40 -0400131 CFX_FloatRect rcAnchor = rtAnchor.ToFloatRect();
Dan Sinclair0c53b002018-01-08 14:30:00 -0500132 int nRotate = hWidget->GetNode()->GetRotate();
dsinclaira440bb32016-09-14 07:01:54 -0700133 switch (nRotate) {
134 case 90: {
135 t1 = (int)(pageViewRect.right - rcAnchor.right);
136 t2 = (int)(rcAnchor.left - pageViewRect.left);
137 if (rcAnchor.bottom < pageViewRect.bottom)
138 rtPopup.left += rcAnchor.bottom - pageViewRect.bottom;
139 break;
140 }
141 case 180: {
142 t2 = (int)(pageViewRect.top - rcAnchor.top);
143 t1 = (int)(rcAnchor.bottom - pageViewRect.bottom);
144 if (rcAnchor.left < pageViewRect.left)
145 rtPopup.left += rcAnchor.left - pageViewRect.left;
146 break;
147 }
148 case 270: {
149 t1 = (int)(rcAnchor.left - pageViewRect.left);
150 t2 = (int)(pageViewRect.right - rcAnchor.right);
151 if (rcAnchor.top > pageViewRect.top)
152 rtPopup.left -= rcAnchor.top - pageViewRect.top;
153 break;
154 }
155 case 0:
156 default: {
157 t1 = (int)(pageViewRect.top - rcAnchor.top);
158 t2 = (int)(rcAnchor.bottom - pageViewRect.bottom);
159 if (rcAnchor.right > pageViewRect.right)
160 rtPopup.left -= rcAnchor.right - pageViewRect.right;
161 break;
162 }
163 }
164
165 int t;
166 uint32_t dwPos;
167 if (t1 <= 0 && t2 <= 0)
tsepez4cf55152016-11-02 14:37:54 -0700168 return false;
dsinclaira440bb32016-09-14 07:01:54 -0700169 if (t1 <= 0) {
170 t = t2;
171 dwPos = 1;
172 } else if (t2 <= 0) {
173 t = t1;
174 dwPos = 0;
175 } else if (t1 > t2) {
176 t = t1;
177 dwPos = 0;
178 } else {
179 t = t2;
180 dwPos = 1;
181 }
182
Dan Sinclair05df0752017-03-14 14:43:42 -0400183 float fPopupHeight;
dsinclaira440bb32016-09-14 07:01:54 -0700184 if (t < fMinPopup)
185 fPopupHeight = fMinPopup;
186 else if (t > fMaxPopup)
187 fPopupHeight = fMaxPopup;
188 else
Dan Sinclair05df0752017-03-14 14:43:42 -0400189 fPopupHeight = static_cast<float>(t);
dsinclaira440bb32016-09-14 07:01:54 -0700190
191 switch (nRotate) {
192 case 0:
193 case 180: {
194 if (dwPos == 0) {
195 rtPopup.top = rtAnchor.height;
196 rtPopup.height = fPopupHeight;
197 } else {
198 rtPopup.top = -fPopupHeight;
199 rtPopup.height = fPopupHeight;
200 }
201 break;
202 }
203 case 90:
204 case 270: {
205 if (dwPos == 0) {
206 rtPopup.top = rtAnchor.width;
207 rtPopup.height = fPopupHeight;
208 } else {
209 rtPopup.top = -fPopupHeight;
210 rtPopup.height = fPopupHeight;
211 }
212 break;
213 }
214 default:
215 break;
216 }
217
tsepez4cf55152016-11-02 14:37:54 -0700218 return true;
dsinclaira440bb32016-09-14 07:01:54 -0700219}
220
tsepez4cf55152016-11-02 14:37:54 -0700221bool CPDFXFA_DocEnvironment::PopupMenu(CXFA_FFWidget* hWidget,
222 CFX_PointF ptPopup) {
dsinclaira440bb32016-09-14 07:01:54 -0700223 if (!hWidget)
tsepez4cf55152016-11-02 14:37:54 -0700224 return false;
dsinclaira440bb32016-09-14 07:01:54 -0700225
226 CXFA_FFPageView* pXFAPageView = hWidget->GetPageView();
227 if (!pXFAPageView)
tsepez4cf55152016-11-02 14:37:54 -0700228 return false;
dsinclaira440bb32016-09-14 07:01:54 -0700229
Dan Sinclair0b950422017-09-21 15:49:49 -0400230 RetainPtr<CPDFXFA_Page> pPage = m_pContext->GetXFAPage(pXFAPageView);
dsinclaira440bb32016-09-14 07:01:54 -0700231 if (!pPage)
tsepez4cf55152016-11-02 14:37:54 -0700232 return false;
dsinclaira440bb32016-09-14 07:01:54 -0700233
dsinclair521b7502016-11-02 13:02:28 -0700234 CPDFSDK_FormFillEnvironment* pFormFillEnv = m_pContext->GetFormFillEnv();
dsinclair655fcca2016-10-11 13:53:37 -0700235 if (!pFormFillEnv)
tsepez4cf55152016-11-02 14:37:54 -0700236 return false;
dsinclaira440bb32016-09-14 07:01:54 -0700237
238 int menuFlag = 0;
239 if (hWidget->CanUndo())
240 menuFlag |= FXFA_MENU_UNDO;
241 if (hWidget->CanRedo())
242 menuFlag |= FXFA_MENU_REDO;
243 if (hWidget->CanPaste())
244 menuFlag |= FXFA_MENU_PASTE;
245 if (hWidget->CanCopy())
246 menuFlag |= FXFA_MENU_COPY;
247 if (hWidget->CanCut())
248 menuFlag |= FXFA_MENU_CUT;
249 if (hWidget->CanSelectAll())
250 menuFlag |= FXFA_MENU_SELECTALL;
251
Tom Sepez9792f162017-05-16 14:11:30 -0700252 return pFormFillEnv->PopupMenu(pPage.Get(), hWidget, menuFlag, ptPopup);
dsinclaira440bb32016-09-14 07:01:54 -0700253}
254
255void CPDFXFA_DocEnvironment::PageViewEvent(CXFA_FFPageView* pPageView,
256 uint32_t dwFlags) {
dsinclair521b7502016-11-02 13:02:28 -0700257 CPDFSDK_FormFillEnvironment* pFormFillEnv = m_pContext->GetFormFillEnv();
dsinclair655fcca2016-10-11 13:53:37 -0700258 if (!pFormFillEnv)
dsinclaira440bb32016-09-14 07:01:54 -0700259 return;
260
dsinclair521b7502016-11-02 13:02:28 -0700261 if (m_pContext->GetLoadStatus() == FXFA_LOADSTATUS_LOADING ||
262 m_pContext->GetLoadStatus() == FXFA_LOADSTATUS_CLOSING ||
dsinclaira440bb32016-09-14 07:01:54 -0700263 XFA_PAGEVIEWEVENT_StopLayout != dwFlags)
264 return;
265
dsinclair521b7502016-11-02 13:02:28 -0700266 int nNewCount = m_pContext->GetPageCount();
267 if (nNewCount == m_pContext->GetOriginalPageCount())
dsinclaira440bb32016-09-14 07:01:54 -0700268 return;
269
dsinclair521b7502016-11-02 13:02:28 -0700270 CXFA_FFDocView* pXFADocView = m_pContext->GetXFADocView();
dsinclaira440bb32016-09-14 07:01:54 -0700271 if (!pXFADocView)
272 return;
273
dsinclair521b7502016-11-02 13:02:28 -0700274 for (int iPageIter = 0; iPageIter < m_pContext->GetOriginalPageCount();
dsinclaira440bb32016-09-14 07:01:54 -0700275 iPageIter++) {
Dan Sinclair0b950422017-09-21 15:49:49 -0400276 RetainPtr<CPDFXFA_Page> pPage = (*m_pContext->GetXFAPageList())[iPageIter];
dsinclaira440bb32016-09-14 07:01:54 -0700277 if (!pPage)
278 continue;
279
Tom Sepez9792f162017-05-16 14:11:30 -0700280 m_pContext->GetFormFillEnv()->RemovePageView(pPage.Get());
dsinclaira440bb32016-09-14 07:01:54 -0700281 pPage->SetXFAPageView(pXFADocView->GetPageView(iPageIter));
282 }
283
dsinclair521b7502016-11-02 13:02:28 -0700284 int flag = (nNewCount < m_pContext->GetOriginalPageCount())
dsinclaira440bb32016-09-14 07:01:54 -0700285 ? FXFA_PAGEVIEWEVENT_POSTREMOVED
286 : FXFA_PAGEVIEWEVENT_POSTADDED;
Dan Sinclair669a4182017-04-03 14:51:45 -0400287 int count = abs(nNewCount - m_pContext->GetOriginalPageCount());
dsinclair521b7502016-11-02 13:02:28 -0700288 m_pContext->SetOriginalPageCount(nNewCount);
dsinclair655fcca2016-10-11 13:53:37 -0700289 pFormFillEnv->PageEvent(count, flag);
dsinclaira440bb32016-09-14 07:01:54 -0700290}
291
Dan Sinclair04f50cf2018-01-22 21:11:17 +0000292void CPDFXFA_DocEnvironment::WidgetPostAdd(CXFA_FFWidget* hWidget) {
Ryan Harrison854d71c2017-10-18 12:28:14 -0400293 if (m_pContext->GetFormType() != FormType::kXFAFull || !hWidget)
dsinclaira440bb32016-09-14 07:01:54 -0700294 return;
295
296 CXFA_FFPageView* pPageView = hWidget->GetPageView();
297 if (!pPageView)
298 return;
299
Dan Sinclair0b950422017-09-21 15:49:49 -0400300 RetainPtr<CPDFXFA_Page> pXFAPage = m_pContext->GetXFAPage(pPageView);
dsinclaira440bb32016-09-14 07:01:54 -0700301 if (!pXFAPage)
302 return;
303
Tom Sepez9792f162017-05-16 14:11:30 -0700304 m_pContext->GetFormFillEnv()
305 ->GetPageView(pXFAPage.Get(), true)
306 ->AddAnnot(hWidget);
dsinclaira440bb32016-09-14 07:01:54 -0700307}
308
Dan Sinclair04f50cf2018-01-22 21:11:17 +0000309void CPDFXFA_DocEnvironment::WidgetPreRemove(CXFA_FFWidget* hWidget) {
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);
dsinclaira440bb32016-09-14 07:01:54 -0700437 if (fileType == FXFA_SAVEAS_XML) {
Dan Sinclair1c4735a2017-11-16 22:08:07 +0000438 ByteString content = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n";
tsepezfa89a202016-12-02 09:48:30 -0800439 fileWrite->WriteBlock(content.c_str(), fileWrite->GetSize(),
440 content.GetLength());
Dan Sinclairf96dfed2017-11-08 19:57:00 +0000441 CXFA_FFDoc* ffdoc = m_pContext->GetXFADocView()->GetDoc();
442 ffdoc->SavePackage(
443 ToNode(ffdoc->GetXFADoc()->GetXFAObject(XFA_HASHCODE_Data)), fileWrite,
444 nullptr);
dsinclaira440bb32016-09-14 07:01:54 -0700445 } else if (fileType == FXFA_SAVEAS_XDP) {
dsinclair521b7502016-11-02 13:02:28 -0700446 if (!m_pContext->GetPDFDoc())
dsinclaira440bb32016-09-14 07:01:54 -0700447 return;
448
Lei Zhang01581062017-08-30 14:19:26 -0700449 const CPDF_Dictionary* pRoot = m_pContext->GetPDFDoc()->GetRoot();
dsinclaira440bb32016-09-14 07:01:54 -0700450 if (!pRoot)
451 return;
452
dsinclair38fd8442016-09-15 10:15:32 -0700453 CPDF_Dictionary* pAcroForm = pRoot->GetDictFor("AcroForm");
dsinclaira440bb32016-09-14 07:01:54 -0700454 if (!pAcroForm)
455 return;
456
dsinclair38fd8442016-09-15 10:15:32 -0700457 CPDF_Array* pArray = ToArray(pAcroForm->GetObjectFor("XFA"));
dsinclaira440bb32016-09-14 07:01:54 -0700458 if (!pArray)
459 return;
460
461 int size = pArray->GetCount();
462 for (int i = 1; i < size; i += 2) {
463 CPDF_Object* pPDFObj = pArray->GetObjectAt(i);
464 CPDF_Object* pPrePDFObj = pArray->GetObjectAt(i - 1);
465 if (!pPrePDFObj->IsString())
466 continue;
467 if (!pPDFObj->IsReference())
468 continue;
469
470 CPDF_Stream* pStream = ToStream(pPDFObj->GetDirect());
471 if (!pStream)
472 continue;
473 if (pPrePDFObj->GetString() == "form") {
Dan Sinclairf96dfed2017-11-08 19:57:00 +0000474 CXFA_FFDoc* ffdoc = m_pContext->GetXFADocView()->GetDoc();
475 ffdoc->SavePackage(
476 ToNode(ffdoc->GetXFADoc()->GetXFAObject(XFA_HASHCODE_Form)),
477 fileWrite, nullptr);
dsinclaira440bb32016-09-14 07:01:54 -0700478 continue;
479 }
480 if (pPrePDFObj->GetString() == "datasets") {
Dan Sinclairf96dfed2017-11-08 19:57:00 +0000481 CXFA_FFDoc* ffdoc = m_pContext->GetXFADocView()->GetDoc();
482 ffdoc->SavePackage(
483 ToNode(ffdoc->GetXFADoc()->GetXFAObject(XFA_HASHCODE_Datasets)),
484 fileWrite, nullptr);
dsinclaira440bb32016-09-14 07:01:54 -0700485 continue;
486 }
487 if (i == size - 1) {
Ryan Harrison275e2602017-09-18 14:23:18 -0400488 WideString wPath = WideString::FromUTF16LE(
dsinclaira440bb32016-09-14 07:01:54 -0700489 reinterpret_cast<const unsigned short*>(bs.c_str()),
490 bs.GetLength() / sizeof(unsigned short));
Ryan Harrison275e2602017-09-18 14:23:18 -0400491 ByteString bPath = wPath.UTF8Encode();
dsinclaira440bb32016-09-14 07:01:54 -0700492 const char* szFormat =
493 "\n<pdf href=\"%s\" xmlns=\"http://ns.adobe.com/xdp/pdf/\"/>";
Dan Sinclair1c4735a2017-11-16 22:08:07 +0000494 ByteString content = ByteString::Format(szFormat, bPath.c_str());
tsepezfa89a202016-12-02 09:48:30 -0800495 fileWrite->WriteBlock(content.c_str(), fileWrite->GetSize(),
496 content.GetLength());
dsinclaira440bb32016-09-14 07:01:54 -0700497 }
Tom Sepezafd0d1f2017-04-04 14:37:18 -0700498 auto pAcc = pdfium::MakeRetain<CPDF_StreamAcc>(pStream);
Lei Zhang07401ba2017-12-11 22:12:08 +0000499 pAcc->LoadAllDataFiltered();
tsepezfa89a202016-12-02 09:48:30 -0800500 fileWrite->WriteBlock(pAcc->GetData(), fileWrite->GetSize(),
501 pAcc->GetSize());
dsinclaira440bb32016-09-14 07:01:54 -0700502 }
503 }
tsepezfa89a202016-12-02 09:48:30 -0800504 fileWrite->Flush();
dsinclaira440bb32016-09-14 07:01:54 -0700505}
506
507void CPDFXFA_DocEnvironment::GotoURL(CXFA_FFDoc* hDoc,
Ryan Harrison275e2602017-09-18 14:23:18 -0400508 const WideString& bsURL) {
dsinclair521b7502016-11-02 13:02:28 -0700509 if (hDoc != m_pContext->GetXFADoc())
dsinclaira440bb32016-09-14 07:01:54 -0700510 return;
511
Ryan Harrison854d71c2017-10-18 12:28:14 -0400512 if (m_pContext->GetFormType() != FormType::kXFAFull)
dsinclaira440bb32016-09-14 07:01:54 -0700513 return;
514
dsinclair521b7502016-11-02 13:02:28 -0700515 CPDFSDK_FormFillEnvironment* pFormFillEnv = m_pContext->GetFormFillEnv();
dsinclair655fcca2016-10-11 13:53:37 -0700516 if (!pFormFillEnv)
dsinclaira440bb32016-09-14 07:01:54 -0700517 return;
518
Ryan Harrison275e2602017-09-18 14:23:18 -0400519 WideStringView str(bsURL.c_str());
Lei Zhang671630e2017-05-19 19:25:16 -0700520 pFormFillEnv->GotoURL(m_pContext.Get(), str);
dsinclaira440bb32016-09-14 07:01:54 -0700521}
522
tsepez4cf55152016-11-02 14:37:54 -0700523bool CPDFXFA_DocEnvironment::IsValidationsEnabled(CXFA_FFDoc* hDoc) {
dsinclair521b7502016-11-02 13:02:28 -0700524 if (hDoc != m_pContext->GetXFADoc() || !m_pContext->GetFormFillEnv())
tsepez4cf55152016-11-02 14:37:54 -0700525 return false;
dsinclair521b7502016-11-02 13:02:28 -0700526 if (m_pContext->GetFormFillEnv()->GetInterForm()) {
527 return m_pContext->GetFormFillEnv()
dsinclair655fcca2016-10-11 13:53:37 -0700528 ->GetInterForm()
529 ->IsXfaValidationsEnabled();
dsinclair7cbe68e2016-10-12 11:56:23 -0700530 }
tsepez4cf55152016-11-02 14:37:54 -0700531 return true;
dsinclaira440bb32016-09-14 07:01:54 -0700532}
533
534void CPDFXFA_DocEnvironment::SetValidationsEnabled(CXFA_FFDoc* hDoc,
tsepez4cf55152016-11-02 14:37:54 -0700535 bool bEnabled) {
dsinclair521b7502016-11-02 13:02:28 -0700536 if (hDoc != m_pContext->GetXFADoc() || !m_pContext->GetFormFillEnv())
dsinclaira440bb32016-09-14 07:01:54 -0700537 return;
dsinclair521b7502016-11-02 13:02:28 -0700538 if (m_pContext->GetFormFillEnv()->GetInterForm()) {
539 m_pContext->GetFormFillEnv()->GetInterForm()->XfaSetValidationsEnabled(
540 bEnabled);
dsinclair7cbe68e2016-10-12 11:56:23 -0700541 }
dsinclaira440bb32016-09-14 07:01:54 -0700542}
543
544void CPDFXFA_DocEnvironment::SetFocusWidget(CXFA_FFDoc* hDoc,
545 CXFA_FFWidget* hWidget) {
dsinclair521b7502016-11-02 13:02:28 -0700546 if (hDoc != m_pContext->GetXFADoc())
dsinclaira440bb32016-09-14 07:01:54 -0700547 return;
548
549 if (!hWidget) {
tsepezf8074ce2016-09-27 14:29:57 -0700550 CPDFSDK_Annot::ObservedPtr pNull;
dsinclair521b7502016-11-02 13:02:28 -0700551 m_pContext->GetFormFillEnv()->SetFocusAnnot(&pNull);
dsinclaira440bb32016-09-14 07:01:54 -0700552 return;
553 }
554
dsinclair521b7502016-11-02 13:02:28 -0700555 int pageViewCount = m_pContext->GetFormFillEnv()->GetPageViewCount();
dsinclaira440bb32016-09-14 07:01:54 -0700556 for (int i = 0; i < pageViewCount; i++) {
dsinclair521b7502016-11-02 13:02:28 -0700557 CPDFSDK_PageView* pPageView = m_pContext->GetFormFillEnv()->GetPageView(i);
dsinclaira440bb32016-09-14 07:01:54 -0700558 if (!pPageView)
559 continue;
560
tsepezf8074ce2016-09-27 14:29:57 -0700561 CPDFSDK_Annot::ObservedPtr pAnnot(pPageView->GetAnnotByXFAWidget(hWidget));
dsinclaira440bb32016-09-14 07:01:54 -0700562 if (pAnnot) {
dsinclair521b7502016-11-02 13:02:28 -0700563 m_pContext->GetFormFillEnv()->SetFocusAnnot(&pAnnot);
dsinclaira440bb32016-09-14 07:01:54 -0700564 break;
565 }
566 }
567}
568
569void CPDFXFA_DocEnvironment::Print(CXFA_FFDoc* hDoc,
570 int32_t nStartPage,
571 int32_t nEndPage,
572 uint32_t dwOptions) {
dsinclair521b7502016-11-02 13:02:28 -0700573 if (hDoc != m_pContext->GetXFADoc())
dsinclaira440bb32016-09-14 07:01:54 -0700574 return;
575
dsinclair521b7502016-11-02 13:02:28 -0700576 CPDFSDK_FormFillEnvironment* pFormFillEnv = m_pContext->GetFormFillEnv();
dsinclair655fcca2016-10-11 13:53:37 -0700577 if (!pFormFillEnv || !pFormFillEnv->GetFormFillInfo() ||
578 !pFormFillEnv->GetFormFillInfo()->m_pJsPlatform ||
579 !pFormFillEnv->GetFormFillInfo()->m_pJsPlatform->Doc_print) {
dsinclaira440bb32016-09-14 07:01:54 -0700580 return;
581 }
582
dsinclair655fcca2016-10-11 13:53:37 -0700583 pFormFillEnv->GetFormFillInfo()->m_pJsPlatform->Doc_print(
584 pFormFillEnv->GetFormFillInfo()->m_pJsPlatform,
dsinclaira440bb32016-09-14 07:01:54 -0700585 dwOptions & XFA_PRINTOPT_ShowDialog, nStartPage, nEndPage,
586 dwOptions & XFA_PRINTOPT_CanCancel, dwOptions & XFA_PRINTOPT_ShrinkPage,
587 dwOptions & XFA_PRINTOPT_AsImage, dwOptions & XFA_PRINTOPT_ReverseOrder,
588 dwOptions & XFA_PRINTOPT_PrintAnnot);
589}
590
591FX_ARGB CPDFXFA_DocEnvironment::GetHighlightColor(CXFA_FFDoc* hDoc) {
dsinclair521b7502016-11-02 13:02:28 -0700592 if (hDoc != m_pContext->GetXFADoc() || !m_pContext->GetFormFillEnv())
dsinclaira440bb32016-09-14 07:01:54 -0700593 return 0;
594
dsinclair521b7502016-11-02 13:02:28 -0700595 CPDFSDK_InterForm* pInterForm = m_pContext->GetFormFillEnv()->GetInterForm();
dsinclaira440bb32016-09-14 07:01:54 -0700596 if (!pInterForm)
597 return 0;
598
599 return ArgbEncode(pInterForm->GetHighlightAlpha(),
Ryan Harrison9baf31f2018-01-12 18:36:30 +0000600 pInterForm->GetHighlightColor(FormFieldType::kXFA));
dsinclaira440bb32016-09-14 07:01:54 -0700601}
602
tsepez4cf55152016-11-02 14:37:54 -0700603bool CPDFXFA_DocEnvironment::NotifySubmit(bool bPrevOrPost) {
dsinclaira440bb32016-09-14 07:01:54 -0700604 if (bPrevOrPost)
605 return OnBeforeNotifySubmit();
606
607 OnAfterNotifySubmit();
tsepez4cf55152016-11-02 14:37:54 -0700608 return true;
dsinclaira440bb32016-09-14 07:01:54 -0700609}
610
tsepez4cf55152016-11-02 14:37:54 -0700611bool CPDFXFA_DocEnvironment::OnBeforeNotifySubmit() {
Ryan Harrison854d71c2017-10-18 12:28:14 -0400612 if (!m_pContext->ContainsXFAForm())
tsepez4cf55152016-11-02 14:37:54 -0700613 return true;
dsinclaira440bb32016-09-14 07:01:54 -0700614
Dan Sinclairb7e315c2018-01-04 15:43:00 -0500615 CXFA_FFDocView* docView = m_pContext->GetXFADocView();
616 if (!docView)
tsepez4cf55152016-11-02 14:37:54 -0700617 return true;
dsinclaira440bb32016-09-14 07:01:54 -0700618
Dan Sinclairb7e315c2018-01-04 15:43:00 -0500619 CXFA_FFWidgetHandler* pWidgetHandler = docView->GetWidgetHandler();
dsinclaira440bb32016-09-14 07:01:54 -0700620 if (!pWidgetHandler)
tsepez4cf55152016-11-02 14:37:54 -0700621 return true;
dsinclaira440bb32016-09-14 07:01:54 -0700622
Dan Sinclair08915152018-01-23 15:22:54 +0000623 auto it = docView->CreateReadyNodeIterator();
624 if (it) {
dsinclaira440bb32016-09-14 07:01:54 -0700625 CXFA_EventParam Param;
626 Param.m_eType = XFA_EVENT_PreSubmit;
Dan Sinclair08915152018-01-23 15:22:54 +0000627 while (CXFA_Node* pNode = it->MoveToNext())
628 pWidgetHandler->ProcessEvent(pNode, &Param);
dsinclaira440bb32016-09-14 07:01:54 -0700629 }
630
Dan Sinclair08915152018-01-23 15:22:54 +0000631 it = docView->CreateReadyNodeIterator();
632 if (!it)
tsepez4cf55152016-11-02 14:37:54 -0700633 return true;
dsinclaira440bb32016-09-14 07:01:54 -0700634
Dan Sinclair08915152018-01-23 15:22:54 +0000635 (void)it->MoveToNext();
636 CXFA_Node* pNode = it->MoveToNext();
637
638 while (pNode) {
639 int fRet = pNode->ProcessValidate(docView, -1);
dsinclaira440bb32016-09-14 07:01:54 -0700640 if (fRet == XFA_EVENTERROR_Error) {
dsinclair521b7502016-11-02 13:02:28 -0700641 CPDFSDK_FormFillEnvironment* pFormFillEnv = m_pContext->GetFormFillEnv();
dsinclair655fcca2016-10-11 13:53:37 -0700642 if (!pFormFillEnv)
tsepez4cf55152016-11-02 14:37:54 -0700643 return false;
dsinclaira440bb32016-09-14 07:01:54 -0700644
Henrique Nakashimace6979f2017-12-07 22:19:53 +0000645 WideString ws = WideString::FromLocal(IDS_XFA_Validate_Input);
Ryan Harrison275e2602017-09-18 14:23:18 -0400646 ByteString bs = ws.UTF16LE_Encode();
dsinclaira440bb32016-09-14 07:01:54 -0700647 int len = bs.GetLength();
dsinclair655fcca2016-10-11 13:53:37 -0700648 pFormFillEnv->Alert((FPDF_WIDESTRING)bs.GetBuffer(len),
649 (FPDF_WIDESTRING)L"", 0, 1);
dsinclaira440bb32016-09-14 07:01:54 -0700650 bs.ReleaseBuffer(len);
tsepez4cf55152016-11-02 14:37:54 -0700651 return false;
dsinclaira440bb32016-09-14 07:01:54 -0700652 }
Dan Sinclair08915152018-01-23 15:22:54 +0000653 pNode = it->MoveToNext();
dsinclaira440bb32016-09-14 07:01:54 -0700654 }
Dan Sinclairb7e315c2018-01-04 15:43:00 -0500655 docView->UpdateDocView();
dsinclaira440bb32016-09-14 07:01:54 -0700656
tsepez4cf55152016-11-02 14:37:54 -0700657 return true;
dsinclaira440bb32016-09-14 07:01:54 -0700658}
659
660void CPDFXFA_DocEnvironment::OnAfterNotifySubmit() {
Ryan Harrison854d71c2017-10-18 12:28:14 -0400661 if (!m_pContext->ContainsXFAForm())
dsinclaira440bb32016-09-14 07:01:54 -0700662 return;
663
dsinclair521b7502016-11-02 13:02:28 -0700664 if (!m_pContext->GetXFADocView())
dsinclaira440bb32016-09-14 07:01:54 -0700665 return;
666
667 CXFA_FFWidgetHandler* pWidgetHandler =
dsinclair521b7502016-11-02 13:02:28 -0700668 m_pContext->GetXFADocView()->GetWidgetHandler();
dsinclaira440bb32016-09-14 07:01:54 -0700669 if (!pWidgetHandler)
670 return;
671
Dan Sinclair08915152018-01-23 15:22:54 +0000672 auto it = m_pContext->GetXFADocView()->CreateReadyNodeIterator();
673 if (!it)
dsinclaira440bb32016-09-14 07:01:54 -0700674 return;
675
676 CXFA_EventParam Param;
677 Param.m_eType = XFA_EVENT_PostSubmit;
Dan Sinclair08915152018-01-23 15:22:54 +0000678 CXFA_Node* pNode = it->MoveToNext();
679 while (pNode) {
680 pWidgetHandler->ProcessEvent(pNode, &Param);
681 pNode = it->MoveToNext();
dsinclaira440bb32016-09-14 07:01:54 -0700682 }
dsinclair521b7502016-11-02 13:02:28 -0700683 m_pContext->GetXFADocView()->UpdateDocView();
dsinclaira440bb32016-09-14 07:01:54 -0700684}
685
Dan Sinclairc5e0f662017-12-14 20:20:33 +0000686bool CPDFXFA_DocEnvironment::Submit(CXFA_FFDoc* hDoc, CXFA_Submit* submit) {
tsepez4cf55152016-11-02 14:37:54 -0700687 if (!NotifySubmit(true) || !m_pContext->GetXFADocView())
688 return false;
dsinclaira440bb32016-09-14 07:01:54 -0700689
dsinclair521b7502016-11-02 13:02:28 -0700690 m_pContext->GetXFADocView()->UpdateDocView();
Dan Sinclairc5e0f662017-12-14 20:20:33 +0000691 bool ret = SubmitInternal(hDoc, submit);
tsepez4cf55152016-11-02 14:37:54 -0700692 NotifySubmit(false);
dsinclaira440bb32016-09-14 07:01:54 -0700693 return ret;
694}
695
Dan Sinclair0b950422017-09-21 15:49:49 -0400696RetainPtr<IFX_SeekableReadStream> CPDFXFA_DocEnvironment::OpenLinkedFile(
dsinclaira440bb32016-09-14 07:01:54 -0700697 CXFA_FFDoc* hDoc,
Ryan Harrison275e2602017-09-18 14:23:18 -0400698 const WideString& wsLink) {
dsinclair521b7502016-11-02 13:02:28 -0700699 CPDFSDK_FormFillEnvironment* pFormFillEnv = m_pContext->GetFormFillEnv();
dsinclair655fcca2016-10-11 13:53:37 -0700700 if (!pFormFillEnv)
tsepez04c10092016-10-25 15:16:40 -0700701 return nullptr;
dsinclaira440bb32016-09-14 07:01:54 -0700702
Ryan Harrison275e2602017-09-18 14:23:18 -0400703 ByteString bs = wsLink.UTF16LE_Encode();
dsinclaira440bb32016-09-14 07:01:54 -0700704 int len = bs.GetLength();
705 FPDF_FILEHANDLER* pFileHandler =
dsinclair655fcca2016-10-11 13:53:37 -0700706 pFormFillEnv->OpenFile(0, (FPDF_WIDESTRING)bs.GetBuffer(len), "rb");
dsinclaira440bb32016-09-14 07:01:54 -0700707 bs.ReleaseBuffer(len);
dsinclaira440bb32016-09-14 07:01:54 -0700708 if (!pFileHandler)
709 return nullptr;
tsepez04c10092016-10-25 15:16:40 -0700710
tsepezfa89a202016-12-02 09:48:30 -0800711 return MakeSeekableStream(pFileHandler);
dsinclaira440bb32016-09-14 07:01:54 -0700712}
713
tsepez4cf55152016-11-02 14:37:54 -0700714bool CPDFXFA_DocEnvironment::ExportSubmitFile(FPDF_FILEHANDLER* pFileHandler,
715 int fileType,
716 FPDF_DWORD encodeType,
717 FPDF_DWORD flag) {
dsinclair521b7502016-11-02 13:02:28 -0700718 if (!m_pContext->GetXFADocView())
tsepez4cf55152016-11-02 14:37:54 -0700719 return false;
dsinclaira440bb32016-09-14 07:01:54 -0700720
dsinclair521b7502016-11-02 13:02:28 -0700721 CPDFSDK_FormFillEnvironment* pFormFillEnv = m_pContext->GetFormFillEnv();
dsinclair655fcca2016-10-11 13:53:37 -0700722 if (!pFormFillEnv)
tsepez4cf55152016-11-02 14:37:54 -0700723 return false;
dsinclaira440bb32016-09-14 07:01:54 -0700724
Dan Sinclairf96dfed2017-11-08 19:57:00 +0000725 CXFA_FFDoc* ffdoc = m_pContext->GetXFADocView()->GetDoc();
Dan Sinclair0b950422017-09-21 15:49:49 -0400726 RetainPtr<IFX_SeekableStream> fileStream = MakeSeekableStream(pFileHandler);
dsinclaira440bb32016-09-14 07:01:54 -0700727 if (fileType == FXFA_SAVEAS_XML) {
Dan Sinclairf96dfed2017-11-08 19:57:00 +0000728 static constexpr char kContent[] =
729 "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n";
tsepezfa89a202016-12-02 09:48:30 -0800730 fileStream->WriteBlock(kContent, 0, strlen(kContent));
Dan Sinclairf96dfed2017-11-08 19:57:00 +0000731
732 ffdoc->SavePackage(
733 ToNode(ffdoc->GetXFADoc()->GetXFAObject(XFA_HASHCODE_Data)), fileStream,
734 nullptr);
tsepez4cf55152016-11-02 14:37:54 -0700735 return true;
dsinclaira440bb32016-09-14 07:01:54 -0700736 }
737
738 if (fileType != FXFA_SAVEAS_XDP)
tsepez4cf55152016-11-02 14:37:54 -0700739 return true;
dsinclaira440bb32016-09-14 07:01:54 -0700740
741 if (!flag) {
742 flag = FXFA_CONFIG | FXFA_TEMPLATE | FXFA_LOCALESET | FXFA_DATASETS |
743 FXFA_XMPMETA | FXFA_XFDF | FXFA_FORM;
744 }
dsinclair521b7502016-11-02 13:02:28 -0700745 if (!m_pContext->GetPDFDoc()) {
tsepezfa89a202016-12-02 09:48:30 -0800746 fileStream->Flush();
tsepez4cf55152016-11-02 14:37:54 -0700747 return false;
dsinclaira440bb32016-09-14 07:01:54 -0700748 }
749
Lei Zhang01581062017-08-30 14:19:26 -0700750 const CPDF_Dictionary* pRoot = m_pContext->GetPDFDoc()->GetRoot();
dsinclaira440bb32016-09-14 07:01:54 -0700751 if (!pRoot) {
tsepezfa89a202016-12-02 09:48:30 -0800752 fileStream->Flush();
tsepez4cf55152016-11-02 14:37:54 -0700753 return false;
dsinclaira440bb32016-09-14 07:01:54 -0700754 }
755
dsinclair38fd8442016-09-15 10:15:32 -0700756 CPDF_Dictionary* pAcroForm = pRoot->GetDictFor("AcroForm");
dsinclaira440bb32016-09-14 07:01:54 -0700757 if (!pAcroForm) {
tsepezfa89a202016-12-02 09:48:30 -0800758 fileStream->Flush();
tsepez4cf55152016-11-02 14:37:54 -0700759 return false;
dsinclaira440bb32016-09-14 07:01:54 -0700760 }
761
dsinclair38fd8442016-09-15 10:15:32 -0700762 CPDF_Array* pArray = ToArray(pAcroForm->GetObjectFor("XFA"));
dsinclaira440bb32016-09-14 07:01:54 -0700763 if (!pArray) {
tsepezfa89a202016-12-02 09:48:30 -0800764 fileStream->Flush();
tsepez4cf55152016-11-02 14:37:54 -0700765 return false;
dsinclaira440bb32016-09-14 07:01:54 -0700766 }
767
768 int size = pArray->GetCount();
769 for (int i = 1; i < size; i += 2) {
770 CPDF_Object* pPDFObj = pArray->GetObjectAt(i);
771 CPDF_Object* pPrePDFObj = pArray->GetObjectAt(i - 1);
772 if (!pPrePDFObj->IsString())
773 continue;
774 if (!pPDFObj->IsReference())
775 continue;
776
777 CPDF_Object* pDirectObj = pPDFObj->GetDirect();
778 if (!pDirectObj->IsStream())
779 continue;
780 if (pPrePDFObj->GetString() == "config" && !(flag & FXFA_CONFIG))
781 continue;
782 if (pPrePDFObj->GetString() == "template" && !(flag & FXFA_TEMPLATE))
783 continue;
784 if (pPrePDFObj->GetString() == "localeSet" && !(flag & FXFA_LOCALESET))
785 continue;
786 if (pPrePDFObj->GetString() == "datasets" && !(flag & FXFA_DATASETS))
787 continue;
788 if (pPrePDFObj->GetString() == "xmpmeta" && !(flag & FXFA_XMPMETA))
789 continue;
790 if (pPrePDFObj->GetString() == "xfdf" && !(flag & FXFA_XFDF))
791 continue;
792 if (pPrePDFObj->GetString() == "form" && !(flag & FXFA_FORM))
793 continue;
Dan Sinclairf96dfed2017-11-08 19:57:00 +0000794
dsinclaira440bb32016-09-14 07:01:54 -0700795 if (pPrePDFObj->GetString() == "form") {
Dan Sinclairf96dfed2017-11-08 19:57:00 +0000796 ffdoc->SavePackage(
797 ToNode(ffdoc->GetXFADoc()->GetXFAObject(XFA_HASHCODE_Form)),
798 fileStream, nullptr);
dsinclaira440bb32016-09-14 07:01:54 -0700799 } else if (pPrePDFObj->GetString() == "datasets") {
Dan Sinclairf96dfed2017-11-08 19:57:00 +0000800 ffdoc->SavePackage(
801 ToNode(ffdoc->GetXFADoc()->GetXFAObject(XFA_HASHCODE_Datasets)),
802 fileStream, nullptr);
dsinclaira440bb32016-09-14 07:01:54 -0700803 }
804 }
tsepez4cf55152016-11-02 14:37:54 -0700805 return true;
dsinclaira440bb32016-09-14 07:01:54 -0700806}
807
Ryan Harrison275e2602017-09-18 14:23:18 -0400808void CPDFXFA_DocEnvironment::ToXFAContentFlags(WideString csSrcContent,
dsinclaira440bb32016-09-14 07:01:54 -0700809 FPDF_DWORD& flag) {
Ryan Harrison12db7512017-08-23 10:39:35 -0400810 if (csSrcContent.Contains(L" config "))
dsinclaira440bb32016-09-14 07:01:54 -0700811 flag |= FXFA_CONFIG;
Ryan Harrison12db7512017-08-23 10:39:35 -0400812 if (csSrcContent.Contains(L" template "))
dsinclaira440bb32016-09-14 07:01:54 -0700813 flag |= FXFA_TEMPLATE;
Ryan Harrison12db7512017-08-23 10:39:35 -0400814 if (csSrcContent.Contains(L" localeSet "))
dsinclaira440bb32016-09-14 07:01:54 -0700815 flag |= FXFA_LOCALESET;
Ryan Harrison12db7512017-08-23 10:39:35 -0400816 if (csSrcContent.Contains(L" datasets "))
dsinclaira440bb32016-09-14 07:01:54 -0700817 flag |= FXFA_DATASETS;
Ryan Harrison12db7512017-08-23 10:39:35 -0400818 if (csSrcContent.Contains(L" xmpmeta "))
dsinclaira440bb32016-09-14 07:01:54 -0700819 flag |= FXFA_XMPMETA;
Ryan Harrison12db7512017-08-23 10:39:35 -0400820 if (csSrcContent.Contains(L" xfdf "))
dsinclaira440bb32016-09-14 07:01:54 -0700821 flag |= FXFA_XFDF;
Ryan Harrison12db7512017-08-23 10:39:35 -0400822 if (csSrcContent.Contains(L" form "))
dsinclaira440bb32016-09-14 07:01:54 -0700823 flag |= FXFA_FORM;
824 if (flag == 0) {
825 flag = FXFA_CONFIG | FXFA_TEMPLATE | FXFA_LOCALESET | FXFA_DATASETS |
826 FXFA_XMPMETA | FXFA_XFDF | FXFA_FORM;
827 }
828}
829
Ryan Harrison275e2602017-09-18 14:23:18 -0400830bool CPDFXFA_DocEnvironment::MailToInfo(WideString& csURL,
831 WideString& csToAddress,
832 WideString& csCCAddress,
833 WideString& csBCCAddress,
834 WideString& csSubject,
835 WideString& csMsg) {
836 WideString srcURL = csURL;
dsinclaira440bb32016-09-14 07:01:54 -0700837 srcURL.TrimLeft();
838 if (srcURL.Left(7).CompareNoCase(L"mailto:") != 0)
tsepez4cf55152016-11-02 14:37:54 -0700839 return false;
dsinclaira440bb32016-09-14 07:01:54 -0700840
Ryan Harrison12db7512017-08-23 10:39:35 -0400841 auto pos = srcURL.Find(L'?');
Ryan Harrison275e2602017-09-18 14:23:18 -0400842 WideString tmp;
Ryan Harrison12db7512017-08-23 10:39:35 -0400843 if (!pos.has_value()) {
844 pos = srcURL.Find(L'@');
845 if (!pos.has_value())
tsepez4cf55152016-11-02 14:37:54 -0700846 return false;
dsinclaira440bb32016-09-14 07:01:54 -0700847
848 tmp = srcURL.Right(csURL.GetLength() - 7);
849 } else {
Ryan Harrison12db7512017-08-23 10:39:35 -0400850 tmp = srcURL.Left(pos.value());
dsinclaira440bb32016-09-14 07:01:54 -0700851 tmp = tmp.Right(tmp.GetLength() - 7);
852 }
Lei Zhang135c6602017-11-21 18:07:00 +0000853 tmp.Trim();
dsinclaira440bb32016-09-14 07:01:54 -0700854
855 csToAddress = tmp;
856
Ryan Harrison12db7512017-08-23 10:39:35 -0400857 srcURL = srcURL.Right(srcURL.GetLength() - (pos.value() + 1));
dsinclaira440bb32016-09-14 07:01:54 -0700858 while (!srcURL.IsEmpty()) {
Lei Zhang135c6602017-11-21 18:07:00 +0000859 srcURL.Trim();
Ryan Harrison12db7512017-08-23 10:39:35 -0400860 pos = srcURL.Find(L'&');
dsinclaira440bb32016-09-14 07:01:54 -0700861
Ryan Harrison12db7512017-08-23 10:39:35 -0400862 tmp = (!pos.has_value()) ? srcURL : srcURL.Left(pos.value());
Lei Zhang135c6602017-11-21 18:07:00 +0000863 tmp.Trim();
dsinclaira440bb32016-09-14 07:01:54 -0700864 if (tmp.GetLength() >= 3 && tmp.Left(3).CompareNoCase(L"cc=") == 0) {
865 tmp = tmp.Right(tmp.GetLength() - 3);
866 if (!csCCAddress.IsEmpty())
867 csCCAddress += L';';
868 csCCAddress += tmp;
869 } else if (tmp.GetLength() >= 4 &&
870 tmp.Left(4).CompareNoCase(L"bcc=") == 0) {
871 tmp = tmp.Right(tmp.GetLength() - 4);
872 if (!csBCCAddress.IsEmpty())
873 csBCCAddress += L';';
874 csBCCAddress += tmp;
875 } else if (tmp.GetLength() >= 8 &&
876 tmp.Left(8).CompareNoCase(L"subject=") == 0) {
877 tmp = tmp.Right(tmp.GetLength() - 8);
878 csSubject += tmp;
879 } else if (tmp.GetLength() >= 5 &&
880 tmp.Left(5).CompareNoCase(L"body=") == 0) {
881 tmp = tmp.Right(tmp.GetLength() - 5);
882 csMsg += tmp;
883 }
Ryan Harrison12db7512017-08-23 10:39:35 -0400884 srcURL = !pos.has_value()
885 ? L""
886 : srcURL.Right(csURL.GetLength() - (pos.value() + 1));
dsinclaira440bb32016-09-14 07:01:54 -0700887 }
888 csToAddress.Replace(L",", L";");
889 csCCAddress.Replace(L",", L";");
890 csBCCAddress.Replace(L",", L";");
tsepez4cf55152016-11-02 14:37:54 -0700891 return true;
dsinclaira440bb32016-09-14 07:01:54 -0700892}
893
Dan Sinclairc5e0f662017-12-14 20:20:33 +0000894bool CPDFXFA_DocEnvironment::SubmitInternal(CXFA_FFDoc* hDoc,
895 CXFA_Submit* submit) {
dsinclair521b7502016-11-02 13:02:28 -0700896 CPDFSDK_FormFillEnvironment* pFormFillEnv = m_pContext->GetFormFillEnv();
dsinclair655fcca2016-10-11 13:53:37 -0700897 if (!pFormFillEnv)
tsepez4cf55152016-11-02 14:37:54 -0700898 return false;
dsinclaira440bb32016-09-14 07:01:54 -0700899
Dan Sinclairc5e0f662017-12-14 20:20:33 +0000900 WideString csURL = submit->GetSubmitTarget();
dsinclaira440bb32016-09-14 07:01:54 -0700901 if (csURL.IsEmpty()) {
Henrique Nakashimace6979f2017-12-07 22:19:53 +0000902 WideString ws = WideString::FromLocal("Submit cancelled.");
Ryan Harrison275e2602017-09-18 14:23:18 -0400903 ByteString bs = ws.UTF16LE_Encode();
dsinclaira440bb32016-09-14 07:01:54 -0700904 int len = bs.GetLength();
Dan Sinclairaee28692017-11-14 21:19:44 +0000905 pFormFillEnv->Alert(reinterpret_cast<FPDF_WIDESTRING>(bs.GetBuffer(len)),
906 reinterpret_cast<FPDF_WIDESTRING>(L""), 0, 4);
dsinclaira440bb32016-09-14 07:01:54 -0700907 bs.ReleaseBuffer(len);
tsepez4cf55152016-11-02 14:37:54 -0700908 return false;
dsinclaira440bb32016-09-14 07:01:54 -0700909 }
910
dsinclaira440bb32016-09-14 07:01:54 -0700911 FPDF_FILEHANDLER* pFileHandler = nullptr;
912 int fileFlag = -1;
Dan Sinclairc5e0f662017-12-14 20:20:33 +0000913 switch (submit->GetSubmitFormat()) {
Dan Sinclaird02c4d82017-11-30 22:06:40 +0000914 case XFA_AttributeEnum::Xdp: {
Dan Sinclairc5e0f662017-12-14 20:20:33 +0000915 WideString csContent = submit->GetSubmitXDPContent();
Lei Zhang135c6602017-11-21 18:07:00 +0000916 csContent.Trim();
Dan Sinclairebe865d2017-11-21 22:05:40 +0000917
Henrique Nakashimace6979f2017-12-07 22:19:53 +0000918 WideString space = WideString::FromLocal(" ");
dsinclaira440bb32016-09-14 07:01:54 -0700919 csContent = space + csContent + space;
920 FPDF_DWORD flag = 0;
Dan Sinclairc5e0f662017-12-14 20:20:33 +0000921 if (submit->IsSubmitEmbedPDF())
dsinclaira440bb32016-09-14 07:01:54 -0700922 flag |= FXFA_PDF;
923
924 ToXFAContentFlags(csContent, flag);
dsinclair655fcca2016-10-11 13:53:37 -0700925 pFileHandler = pFormFillEnv->OpenFile(FXFA_SAVEAS_XDP, nullptr, "wb");
dsinclaira440bb32016-09-14 07:01:54 -0700926 fileFlag = FXFA_SAVEAS_XDP;
927 ExportSubmitFile(pFileHandler, FXFA_SAVEAS_XDP, 0, flag);
928 break;
929 }
Dan Sinclaird02c4d82017-11-30 22:06:40 +0000930 case XFA_AttributeEnum::Xml:
dsinclair655fcca2016-10-11 13:53:37 -0700931 pFileHandler = pFormFillEnv->OpenFile(FXFA_SAVEAS_XML, nullptr, "wb");
dsinclaira440bb32016-09-14 07:01:54 -0700932 fileFlag = FXFA_SAVEAS_XML;
933 ExportSubmitFile(pFileHandler, FXFA_SAVEAS_XML, 0, FXFA_XFA_ALL);
934 break;
Dan Sinclaird02c4d82017-11-30 22:06:40 +0000935 case XFA_AttributeEnum::Pdf:
dsinclaira440bb32016-09-14 07:01:54 -0700936 break;
Dan Sinclaird02c4d82017-11-30 22:06:40 +0000937 case XFA_AttributeEnum::Urlencoded:
dsinclair655fcca2016-10-11 13:53:37 -0700938 pFileHandler = pFormFillEnv->OpenFile(FXFA_SAVEAS_XML, nullptr, "wb");
dsinclaira440bb32016-09-14 07:01:54 -0700939 fileFlag = FXFA_SAVEAS_XML;
940 ExportSubmitFile(pFileHandler, FXFA_SAVEAS_XML, 0, FXFA_XFA_ALL);
941 break;
942 default:
943 return false;
944 }
945 if (!pFileHandler)
tsepez4cf55152016-11-02 14:37:54 -0700946 return false;
Dan Sinclairebe865d2017-11-21 22:05:40 +0000947
dsinclaira440bb32016-09-14 07:01:54 -0700948 if (csURL.Left(7).CompareNoCase(L"mailto:") == 0) {
Ryan Harrison275e2602017-09-18 14:23:18 -0400949 WideString csToAddress;
950 WideString csCCAddress;
951 WideString csBCCAddress;
952 WideString csSubject;
953 WideString csMsg;
tsepez16b703c2016-10-26 08:45:31 -0700954 if (!MailToInfo(csURL, csToAddress, csCCAddress, csBCCAddress, csSubject,
955 csMsg)) {
tsepez4cf55152016-11-02 14:37:54 -0700956 return false;
tsepez16b703c2016-10-26 08:45:31 -0700957 }
Ryan Harrison275e2602017-09-18 14:23:18 -0400958 ByteString bsTo = WideString(csToAddress).UTF16LE_Encode();
959 ByteString bsCC = WideString(csCCAddress).UTF16LE_Encode();
960 ByteString bsBcc = WideString(csBCCAddress).UTF16LE_Encode();
961 ByteString bsSubject = WideString(csSubject).UTF16LE_Encode();
962 ByteString bsMsg = WideString(csMsg).UTF16LE_Encode();
dsinclaira440bb32016-09-14 07:01:54 -0700963 FPDF_WIDESTRING pTo = (FPDF_WIDESTRING)bsTo.GetBuffer(bsTo.GetLength());
964 FPDF_WIDESTRING pCC = (FPDF_WIDESTRING)bsCC.GetBuffer(bsCC.GetLength());
965 FPDF_WIDESTRING pBcc = (FPDF_WIDESTRING)bsBcc.GetBuffer(bsBcc.GetLength());
966 FPDF_WIDESTRING pSubject =
967 (FPDF_WIDESTRING)bsSubject.GetBuffer(bsSubject.GetLength());
968 FPDF_WIDESTRING pMsg = (FPDF_WIDESTRING)bsMsg.GetBuffer(bsMsg.GetLength());
dsinclair655fcca2016-10-11 13:53:37 -0700969 pFormFillEnv->EmailTo(pFileHandler, pTo, pSubject, pCC, pBcc, pMsg);
Ryan Harrison0186c182017-08-01 16:20:40 -0400970 bsTo.ReleaseBuffer(bsTo.GetStringLength());
971 bsCC.ReleaseBuffer(bsCC.GetStringLength());
972 bsBcc.ReleaseBuffer(bsBcc.GetStringLength());
973 bsSubject.ReleaseBuffer(bsSubject.GetStringLength());
974 bsMsg.ReleaseBuffer(bsMsg.GetStringLength());
dsinclaira440bb32016-09-14 07:01:54 -0700975 } else {
976 // HTTP or FTP
Ryan Harrison275e2602017-09-18 14:23:18 -0400977 WideString ws;
978 ByteString bs = csURL.UTF16LE_Encode();
dsinclaira440bb32016-09-14 07:01:54 -0700979 int len = bs.GetLength();
dsinclair655fcca2016-10-11 13:53:37 -0700980 pFormFillEnv->UploadTo(pFileHandler, fileFlag,
981 (FPDF_WIDESTRING)bs.GetBuffer(len));
dsinclaira440bb32016-09-14 07:01:54 -0700982 bs.ReleaseBuffer(len);
983 }
tsepez4cf55152016-11-02 14:37:54 -0700984 return true;
dsinclaira440bb32016-09-14 07:01:54 -0700985}
986
Ryan Harrison275e2602017-09-18 14:23:18 -0400987bool CPDFXFA_DocEnvironment::SetGlobalProperty(CXFA_FFDoc* hDoc,
988 const ByteStringView& szPropName,
989 CFXJSE_Value* pValue) {
dsinclair521b7502016-11-02 13:02:28 -0700990 if (hDoc != m_pContext->GetXFADoc())
tsepez4cf55152016-11-02 14:37:54 -0700991 return false;
Tom Sepez7dc9fe52017-05-18 09:51:57 -0700992 if (!m_pContext->GetFormFillEnv() ||
Tom Sepezf5ca90c2018-02-01 02:15:44 +0000993 !m_pContext->GetFormFillEnv()->GetIJSRuntime()) {
Tom Sepez7dc9fe52017-05-18 09:51:57 -0700994 return false;
dsinclair655fcca2016-10-11 13:53:37 -0700995 }
Tom Sepez7dc9fe52017-05-18 09:51:57 -0700996 CPDFSDK_FormFillEnvironment* pFormFillEnv = m_pContext->GetFormFillEnv();
Tom Sepezf5ca90c2018-02-01 02:15:44 +0000997 IJS_EventContext* pContext = pFormFillEnv->GetIJSRuntime()->NewEventContext();
998 bool bRet = pFormFillEnv->GetIJSRuntime()->SetValueByName(szPropName, pValue);
999 pFormFillEnv->GetIJSRuntime()->ReleaseEventContext(pContext);
Tom Sepez7dc9fe52017-05-18 09:51:57 -07001000 return bRet;
dsinclaira440bb32016-09-14 07:01:54 -07001001}
1002
Ryan Harrison275e2602017-09-18 14:23:18 -04001003bool CPDFXFA_DocEnvironment::GetGlobalProperty(CXFA_FFDoc* hDoc,
1004 const ByteStringView& szPropName,
1005 CFXJSE_Value* pValue) {
dsinclair521b7502016-11-02 13:02:28 -07001006 if (hDoc != m_pContext->GetXFADoc())
tsepez4cf55152016-11-02 14:37:54 -07001007 return false;
dsinclair521b7502016-11-02 13:02:28 -07001008 if (!m_pContext->GetFormFillEnv() ||
Tom Sepezf5ca90c2018-02-01 02:15:44 +00001009 !m_pContext->GetFormFillEnv()->GetIJSRuntime()) {
tsepez4cf55152016-11-02 14:37:54 -07001010 return false;
dsinclair655fcca2016-10-11 13:53:37 -07001011 }
dsinclair521b7502016-11-02 13:02:28 -07001012 CPDFSDK_FormFillEnvironment* pFormFillEnv = m_pContext->GetFormFillEnv();
Tom Sepezf5ca90c2018-02-01 02:15:44 +00001013 IJS_EventContext* pContext = pFormFillEnv->GetIJSRuntime()->NewEventContext();
1014 bool bRet = pFormFillEnv->GetIJSRuntime()->GetValueByName(szPropName, pValue);
1015 pFormFillEnv->GetIJSRuntime()->ReleaseEventContext(pContext);
Tom Sepez7dc9fe52017-05-18 09:51:57 -07001016 return bRet;
dsinclaira440bb32016-09-14 07:01:54 -07001017}