xref: /aosp_15_r20/external/pdfium/fxjs/cjs_document.cpp (revision 3ac0a46f773bac49fa9476ec2b1cf3f8da5ec3a4)
1*3ac0a46fSAndroid Build Coastguard Worker // Copyright 2017 The PDFium Authors
2*3ac0a46fSAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*3ac0a46fSAndroid Build Coastguard Worker // found in the LICENSE file.
4*3ac0a46fSAndroid Build Coastguard Worker 
5*3ac0a46fSAndroid Build Coastguard Worker // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
6*3ac0a46fSAndroid Build Coastguard Worker 
7*3ac0a46fSAndroid Build Coastguard Worker #include "fxjs/cjs_document.h"
8*3ac0a46fSAndroid Build Coastguard Worker 
9*3ac0a46fSAndroid Build Coastguard Worker #include <stdint.h>
10*3ac0a46fSAndroid Build Coastguard Worker 
11*3ac0a46fSAndroid Build Coastguard Worker #include <utility>
12*3ac0a46fSAndroid Build Coastguard Worker 
13*3ac0a46fSAndroid Build Coastguard Worker #include "constants/access_permissions.h"
14*3ac0a46fSAndroid Build Coastguard Worker #include "core/fpdfapi/page/cpdf_pageimagecache.h"
15*3ac0a46fSAndroid Build Coastguard Worker #include "core/fpdfapi/page/cpdf_pageobject.h"
16*3ac0a46fSAndroid Build Coastguard Worker #include "core/fpdfapi/page/cpdf_textobject.h"
17*3ac0a46fSAndroid Build Coastguard Worker #include "core/fpdfapi/parser/cpdf_array.h"
18*3ac0a46fSAndroid Build Coastguard Worker #include "core/fpdfapi/parser/cpdf_dictionary.h"
19*3ac0a46fSAndroid Build Coastguard Worker #include "core/fpdfapi/parser/cpdf_name.h"
20*3ac0a46fSAndroid Build Coastguard Worker #include "core/fpdfapi/parser/cpdf_string.h"
21*3ac0a46fSAndroid Build Coastguard Worker #include "core/fpdfdoc/cpdf_interactiveform.h"
22*3ac0a46fSAndroid Build Coastguard Worker #include "core/fpdfdoc/cpdf_nametree.h"
23*3ac0a46fSAndroid Build Coastguard Worker #include "fpdfsdk/cpdfsdk_annotiteration.h"
24*3ac0a46fSAndroid Build Coastguard Worker #include "fpdfsdk/cpdfsdk_formfillenvironment.h"
25*3ac0a46fSAndroid Build Coastguard Worker #include "fpdfsdk/cpdfsdk_interactiveform.h"
26*3ac0a46fSAndroid Build Coastguard Worker #include "fpdfsdk/cpdfsdk_pageview.h"
27*3ac0a46fSAndroid Build Coastguard Worker #include "fxjs/cjs_annot.h"
28*3ac0a46fSAndroid Build Coastguard Worker #include "fxjs/cjs_app.h"
29*3ac0a46fSAndroid Build Coastguard Worker #include "fxjs/cjs_delaydata.h"
30*3ac0a46fSAndroid Build Coastguard Worker #include "fxjs/cjs_event_context.h"
31*3ac0a46fSAndroid Build Coastguard Worker #include "fxjs/cjs_field.h"
32*3ac0a46fSAndroid Build Coastguard Worker #include "fxjs/cjs_icon.h"
33*3ac0a46fSAndroid Build Coastguard Worker #include "fxjs/js_resources.h"
34*3ac0a46fSAndroid Build Coastguard Worker #include "third_party/base/check.h"
35*3ac0a46fSAndroid Build Coastguard Worker #include "v8/include/v8-container.h"
36*3ac0a46fSAndroid Build Coastguard Worker 
37*3ac0a46fSAndroid Build Coastguard Worker const JSPropertySpec CJS_Document::PropertySpecs[] = {
38*3ac0a46fSAndroid Build Coastguard Worker     {"ADBE", get_ADBE_static, set_ADBE_static},
39*3ac0a46fSAndroid Build Coastguard Worker     {"author", get_author_static, set_author_static},
40*3ac0a46fSAndroid Build Coastguard Worker     {"baseURL", get_base_URL_static, set_base_URL_static},
41*3ac0a46fSAndroid Build Coastguard Worker     {"bookmarkRoot", get_bookmark_root_static, set_bookmark_root_static},
42*3ac0a46fSAndroid Build Coastguard Worker     {"calculate", get_calculate_static, set_calculate_static},
43*3ac0a46fSAndroid Build Coastguard Worker     {"Collab", get_collab_static, set_collab_static},
44*3ac0a46fSAndroid Build Coastguard Worker     {"creationDate", get_creation_date_static, set_creation_date_static},
45*3ac0a46fSAndroid Build Coastguard Worker     {"creator", get_creator_static, set_creator_static},
46*3ac0a46fSAndroid Build Coastguard Worker     {"delay", get_delay_static, set_delay_static},
47*3ac0a46fSAndroid Build Coastguard Worker     {"dirty", get_dirty_static, set_dirty_static},
48*3ac0a46fSAndroid Build Coastguard Worker     {"documentFileName", get_document_file_name_static,
49*3ac0a46fSAndroid Build Coastguard Worker      set_document_file_name_static},
50*3ac0a46fSAndroid Build Coastguard Worker     {"external", get_external_static, set_external_static},
51*3ac0a46fSAndroid Build Coastguard Worker     {"filesize", get_filesize_static, set_filesize_static},
52*3ac0a46fSAndroid Build Coastguard Worker     {"icons", get_icons_static, set_icons_static},
53*3ac0a46fSAndroid Build Coastguard Worker     {"info", get_info_static, set_info_static},
54*3ac0a46fSAndroid Build Coastguard Worker     {"keywords", get_keywords_static, set_keywords_static},
55*3ac0a46fSAndroid Build Coastguard Worker     {"layout", get_layout_static, set_layout_static},
56*3ac0a46fSAndroid Build Coastguard Worker     {"media", get_media_static, set_media_static},
57*3ac0a46fSAndroid Build Coastguard Worker     {"modDate", get_mod_date_static, set_mod_date_static},
58*3ac0a46fSAndroid Build Coastguard Worker     {"mouseX", get_mouse_x_static, set_mouse_x_static},
59*3ac0a46fSAndroid Build Coastguard Worker     {"mouseY", get_mouse_y_static, set_mouse_y_static},
60*3ac0a46fSAndroid Build Coastguard Worker     {"numFields", get_num_fields_static, set_num_fields_static},
61*3ac0a46fSAndroid Build Coastguard Worker     {"numPages", get_num_pages_static, set_num_pages_static},
62*3ac0a46fSAndroid Build Coastguard Worker     {"pageNum", get_page_num_static, set_page_num_static},
63*3ac0a46fSAndroid Build Coastguard Worker     {"pageWindowRect", get_page_window_rect_static,
64*3ac0a46fSAndroid Build Coastguard Worker      set_page_window_rect_static},
65*3ac0a46fSAndroid Build Coastguard Worker     {"path", get_path_static, set_path_static},
66*3ac0a46fSAndroid Build Coastguard Worker     {"producer", get_producer_static, set_producer_static},
67*3ac0a46fSAndroid Build Coastguard Worker     {"subject", get_subject_static, set_subject_static},
68*3ac0a46fSAndroid Build Coastguard Worker     {"title", get_title_static, set_title_static},
69*3ac0a46fSAndroid Build Coastguard Worker     {"URL", get_URL_static, set_URL_static},
70*3ac0a46fSAndroid Build Coastguard Worker     {"zoom", get_zoom_static, set_zoom_static},
71*3ac0a46fSAndroid Build Coastguard Worker     {"zoomType", get_zoom_type_static, set_zoom_type_static}};
72*3ac0a46fSAndroid Build Coastguard Worker 
73*3ac0a46fSAndroid Build Coastguard Worker const JSMethodSpec CJS_Document::MethodSpecs[] = {
74*3ac0a46fSAndroid Build Coastguard Worker     {"addAnnot", addAnnot_static},
75*3ac0a46fSAndroid Build Coastguard Worker     {"addField", addField_static},
76*3ac0a46fSAndroid Build Coastguard Worker     {"addLink", addLink_static},
77*3ac0a46fSAndroid Build Coastguard Worker     {"addIcon", addIcon_static},
78*3ac0a46fSAndroid Build Coastguard Worker     {"calculateNow", calculateNow_static},
79*3ac0a46fSAndroid Build Coastguard Worker     {"closeDoc", closeDoc_static},
80*3ac0a46fSAndroid Build Coastguard Worker     {"createDataObject", createDataObject_static},
81*3ac0a46fSAndroid Build Coastguard Worker     {"deletePages", deletePages_static},
82*3ac0a46fSAndroid Build Coastguard Worker     {"exportAsText", exportAsText_static},
83*3ac0a46fSAndroid Build Coastguard Worker     {"exportAsFDF", exportAsFDF_static},
84*3ac0a46fSAndroid Build Coastguard Worker     {"exportAsXFDF", exportAsXFDF_static},
85*3ac0a46fSAndroid Build Coastguard Worker     {"extractPages", extractPages_static},
86*3ac0a46fSAndroid Build Coastguard Worker     {"getAnnot", getAnnot_static},
87*3ac0a46fSAndroid Build Coastguard Worker     {"getAnnots", getAnnots_static},
88*3ac0a46fSAndroid Build Coastguard Worker     {"getAnnot3D", getAnnot3D_static},
89*3ac0a46fSAndroid Build Coastguard Worker     {"getAnnots3D", getAnnots3D_static},
90*3ac0a46fSAndroid Build Coastguard Worker     {"getField", getField_static},
91*3ac0a46fSAndroid Build Coastguard Worker     {"getIcon", getIcon_static},
92*3ac0a46fSAndroid Build Coastguard Worker     {"getLinks", getLinks_static},
93*3ac0a46fSAndroid Build Coastguard Worker     {"getNthFieldName", getNthFieldName_static},
94*3ac0a46fSAndroid Build Coastguard Worker     {"getOCGs", getOCGs_static},
95*3ac0a46fSAndroid Build Coastguard Worker     {"getPageBox", getPageBox_static},
96*3ac0a46fSAndroid Build Coastguard Worker     {"getPageNthWord", getPageNthWord_static},
97*3ac0a46fSAndroid Build Coastguard Worker     {"getPageNthWordQuads", getPageNthWordQuads_static},
98*3ac0a46fSAndroid Build Coastguard Worker     {"getPageNumWords", getPageNumWords_static},
99*3ac0a46fSAndroid Build Coastguard Worker     {"getPrintParams", getPrintParams_static},
100*3ac0a46fSAndroid Build Coastguard Worker     {"getURL", getURL_static},
101*3ac0a46fSAndroid Build Coastguard Worker     {"gotoNamedDest", gotoNamedDest_static},
102*3ac0a46fSAndroid Build Coastguard Worker     {"importAnFDF", importAnFDF_static},
103*3ac0a46fSAndroid Build Coastguard Worker     {"importAnXFDF", importAnXFDF_static},
104*3ac0a46fSAndroid Build Coastguard Worker     {"importTextData", importTextData_static},
105*3ac0a46fSAndroid Build Coastguard Worker     {"insertPages", insertPages_static},
106*3ac0a46fSAndroid Build Coastguard Worker     {"mailDoc", mailDoc_static},
107*3ac0a46fSAndroid Build Coastguard Worker     {"mailForm", mailForm_static},
108*3ac0a46fSAndroid Build Coastguard Worker     {"print", print_static},
109*3ac0a46fSAndroid Build Coastguard Worker     {"removeField", removeField_static},
110*3ac0a46fSAndroid Build Coastguard Worker     {"replacePages", replacePages_static},
111*3ac0a46fSAndroid Build Coastguard Worker     {"resetForm", resetForm_static},
112*3ac0a46fSAndroid Build Coastguard Worker     {"removeIcon", removeIcon_static},
113*3ac0a46fSAndroid Build Coastguard Worker     {"saveAs", saveAs_static},
114*3ac0a46fSAndroid Build Coastguard Worker     {"submitForm", submitForm_static},
115*3ac0a46fSAndroid Build Coastguard Worker     {"syncAnnotScan", syncAnnotScan_static}};
116*3ac0a46fSAndroid Build Coastguard Worker 
117*3ac0a46fSAndroid Build Coastguard Worker uint32_t CJS_Document::ObjDefnID = 0;
118*3ac0a46fSAndroid Build Coastguard Worker const char CJS_Document::kName[] = "Document";
119*3ac0a46fSAndroid Build Coastguard Worker 
120*3ac0a46fSAndroid Build Coastguard Worker // static
GetObjDefnID()121*3ac0a46fSAndroid Build Coastguard Worker uint32_t CJS_Document::GetObjDefnID() {
122*3ac0a46fSAndroid Build Coastguard Worker   return ObjDefnID;
123*3ac0a46fSAndroid Build Coastguard Worker }
124*3ac0a46fSAndroid Build Coastguard Worker 
125*3ac0a46fSAndroid Build Coastguard Worker // static
DefineJSObjects(CFXJS_Engine * pEngine)126*3ac0a46fSAndroid Build Coastguard Worker void CJS_Document::DefineJSObjects(CFXJS_Engine* pEngine) {
127*3ac0a46fSAndroid Build Coastguard Worker   ObjDefnID = pEngine->DefineObj(CJS_Document::kName, FXJSOBJTYPE_GLOBAL,
128*3ac0a46fSAndroid Build Coastguard Worker                                  JSConstructor<CJS_Document>, JSDestructor);
129*3ac0a46fSAndroid Build Coastguard Worker   DefineProps(pEngine, ObjDefnID, PropertySpecs);
130*3ac0a46fSAndroid Build Coastguard Worker   DefineMethods(pEngine, ObjDefnID, MethodSpecs);
131*3ac0a46fSAndroid Build Coastguard Worker }
132*3ac0a46fSAndroid Build Coastguard Worker 
CJS_Document(v8::Local<v8::Object> pObject,CJS_Runtime * pRuntime)133*3ac0a46fSAndroid Build Coastguard Worker CJS_Document::CJS_Document(v8::Local<v8::Object> pObject, CJS_Runtime* pRuntime)
134*3ac0a46fSAndroid Build Coastguard Worker     : CJS_Object(pObject, pRuntime) {
135*3ac0a46fSAndroid Build Coastguard Worker   SetFormFillEnv(GetRuntime()->GetFormFillEnv());
136*3ac0a46fSAndroid Build Coastguard Worker }
137*3ac0a46fSAndroid Build Coastguard Worker 
138*3ac0a46fSAndroid Build Coastguard Worker CJS_Document::~CJS_Document() = default;
139*3ac0a46fSAndroid Build Coastguard Worker 
140*3ac0a46fSAndroid Build Coastguard Worker // The total number of fields in document.
get_num_fields(CJS_Runtime * pRuntime)141*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_Document::get_num_fields(CJS_Runtime* pRuntime) {
142*3ac0a46fSAndroid Build Coastguard Worker   if (!m_pFormFillEnv)
143*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kBadObjectError);
144*3ac0a46fSAndroid Build Coastguard Worker 
145*3ac0a46fSAndroid Build Coastguard Worker   CPDF_InteractiveForm* pPDFForm = GetCoreInteractiveForm();
146*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Success(pRuntime->NewNumber(
147*3ac0a46fSAndroid Build Coastguard Worker       static_cast<int>(pPDFForm->CountFields(WideString()))));
148*3ac0a46fSAndroid Build Coastguard Worker }
149*3ac0a46fSAndroid Build Coastguard Worker 
set_num_fields(CJS_Runtime * pRuntime,v8::Local<v8::Value> vp)150*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_Document::set_num_fields(CJS_Runtime* pRuntime,
151*3ac0a46fSAndroid Build Coastguard Worker                                         v8::Local<v8::Value> vp) {
152*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Failure(JSMessage::kReadOnlyError);
153*3ac0a46fSAndroid Build Coastguard Worker }
154*3ac0a46fSAndroid Build Coastguard Worker 
get_dirty(CJS_Runtime * pRuntime)155*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_Document::get_dirty(CJS_Runtime* pRuntime) {
156*3ac0a46fSAndroid Build Coastguard Worker   if (!m_pFormFillEnv)
157*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kBadObjectError);
158*3ac0a46fSAndroid Build Coastguard Worker 
159*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Success(
160*3ac0a46fSAndroid Build Coastguard Worker       pRuntime->NewBoolean(!!m_pFormFillEnv->GetChangeMark()));
161*3ac0a46fSAndroid Build Coastguard Worker }
162*3ac0a46fSAndroid Build Coastguard Worker 
set_dirty(CJS_Runtime * pRuntime,v8::Local<v8::Value> vp)163*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_Document::set_dirty(CJS_Runtime* pRuntime,
164*3ac0a46fSAndroid Build Coastguard Worker                                    v8::Local<v8::Value> vp) {
165*3ac0a46fSAndroid Build Coastguard Worker   if (!m_pFormFillEnv)
166*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kBadObjectError);
167*3ac0a46fSAndroid Build Coastguard Worker 
168*3ac0a46fSAndroid Build Coastguard Worker   pRuntime->ToBoolean(vp) ? m_pFormFillEnv->SetChangeMark()
169*3ac0a46fSAndroid Build Coastguard Worker                           : m_pFormFillEnv->ClearChangeMark();
170*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Success();
171*3ac0a46fSAndroid Build Coastguard Worker }
172*3ac0a46fSAndroid Build Coastguard Worker 
get_ADBE(CJS_Runtime * pRuntime)173*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_Document::get_ADBE(CJS_Runtime* pRuntime) {
174*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Success(pRuntime->NewUndefined());
175*3ac0a46fSAndroid Build Coastguard Worker }
176*3ac0a46fSAndroid Build Coastguard Worker 
set_ADBE(CJS_Runtime * pRuntime,v8::Local<v8::Value> vp)177*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_Document::set_ADBE(CJS_Runtime* pRuntime,
178*3ac0a46fSAndroid Build Coastguard Worker                                   v8::Local<v8::Value> vp) {
179*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Success();
180*3ac0a46fSAndroid Build Coastguard Worker }
181*3ac0a46fSAndroid Build Coastguard Worker 
get_page_num(CJS_Runtime * pRuntime)182*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_Document::get_page_num(CJS_Runtime* pRuntime) {
183*3ac0a46fSAndroid Build Coastguard Worker   if (!m_pFormFillEnv)
184*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kBadObjectError);
185*3ac0a46fSAndroid Build Coastguard Worker 
186*3ac0a46fSAndroid Build Coastguard Worker   CPDFSDK_PageView* pPageView = m_pFormFillEnv->GetCurrentView();
187*3ac0a46fSAndroid Build Coastguard Worker   if (!pPageView)
188*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Success(pRuntime->NewUndefined());
189*3ac0a46fSAndroid Build Coastguard Worker 
190*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Success(pRuntime->NewNumber(pPageView->GetPageIndex()));
191*3ac0a46fSAndroid Build Coastguard Worker }
192*3ac0a46fSAndroid Build Coastguard Worker 
set_page_num(CJS_Runtime * pRuntime,v8::Local<v8::Value> vp)193*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_Document::set_page_num(CJS_Runtime* pRuntime,
194*3ac0a46fSAndroid Build Coastguard Worker                                       v8::Local<v8::Value> vp) {
195*3ac0a46fSAndroid Build Coastguard Worker   if (!m_pFormFillEnv)
196*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kBadObjectError);
197*3ac0a46fSAndroid Build Coastguard Worker 
198*3ac0a46fSAndroid Build Coastguard Worker   int iPageCount = m_pFormFillEnv->GetPageCount();
199*3ac0a46fSAndroid Build Coastguard Worker   int iPageNum = pRuntime->ToInt32(vp);
200*3ac0a46fSAndroid Build Coastguard Worker   if (iPageNum >= 0 && iPageNum < iPageCount)
201*3ac0a46fSAndroid Build Coastguard Worker     m_pFormFillEnv->JS_docgotoPage(iPageNum);
202*3ac0a46fSAndroid Build Coastguard Worker   else if (iPageNum >= iPageCount)
203*3ac0a46fSAndroid Build Coastguard Worker     m_pFormFillEnv->JS_docgotoPage(iPageCount - 1);
204*3ac0a46fSAndroid Build Coastguard Worker   else if (iPageNum < 0)
205*3ac0a46fSAndroid Build Coastguard Worker     m_pFormFillEnv->JS_docgotoPage(0);
206*3ac0a46fSAndroid Build Coastguard Worker 
207*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Success();
208*3ac0a46fSAndroid Build Coastguard Worker }
209*3ac0a46fSAndroid Build Coastguard Worker 
addAnnot(CJS_Runtime * pRuntime,const std::vector<v8::Local<v8::Value>> & params)210*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_Document::addAnnot(
211*3ac0a46fSAndroid Build Coastguard Worker     CJS_Runtime* pRuntime,
212*3ac0a46fSAndroid Build Coastguard Worker     const std::vector<v8::Local<v8::Value>>& params) {
213*3ac0a46fSAndroid Build Coastguard Worker   // Not supported, but do not return an error.
214*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Success();
215*3ac0a46fSAndroid Build Coastguard Worker }
216*3ac0a46fSAndroid Build Coastguard Worker 
addField(CJS_Runtime * pRuntime,const std::vector<v8::Local<v8::Value>> & params)217*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_Document::addField(
218*3ac0a46fSAndroid Build Coastguard Worker     CJS_Runtime* pRuntime,
219*3ac0a46fSAndroid Build Coastguard Worker     const std::vector<v8::Local<v8::Value>>& params) {
220*3ac0a46fSAndroid Build Coastguard Worker   // Not supported, but do not return an error.
221*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Success();
222*3ac0a46fSAndroid Build Coastguard Worker }
223*3ac0a46fSAndroid Build Coastguard Worker 
exportAsText(CJS_Runtime * pRuntime,const std::vector<v8::Local<v8::Value>> & params)224*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_Document::exportAsText(
225*3ac0a46fSAndroid Build Coastguard Worker     CJS_Runtime* pRuntime,
226*3ac0a46fSAndroid Build Coastguard Worker     const std::vector<v8::Local<v8::Value>>& params) {
227*3ac0a46fSAndroid Build Coastguard Worker   // Unsafe, not supported, but do not return an error.
228*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Success();
229*3ac0a46fSAndroid Build Coastguard Worker }
230*3ac0a46fSAndroid Build Coastguard Worker 
exportAsFDF(CJS_Runtime * pRuntime,const std::vector<v8::Local<v8::Value>> & params)231*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_Document::exportAsFDF(
232*3ac0a46fSAndroid Build Coastguard Worker     CJS_Runtime* pRuntime,
233*3ac0a46fSAndroid Build Coastguard Worker     const std::vector<v8::Local<v8::Value>>& params) {
234*3ac0a46fSAndroid Build Coastguard Worker   // Unsafe, not supported, but do not return an error.
235*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Success();
236*3ac0a46fSAndroid Build Coastguard Worker }
237*3ac0a46fSAndroid Build Coastguard Worker 
exportAsXFDF(CJS_Runtime * pRuntime,const std::vector<v8::Local<v8::Value>> & params)238*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_Document::exportAsXFDF(
239*3ac0a46fSAndroid Build Coastguard Worker     CJS_Runtime* pRuntime,
240*3ac0a46fSAndroid Build Coastguard Worker     const std::vector<v8::Local<v8::Value>>& params) {
241*3ac0a46fSAndroid Build Coastguard Worker   // Unsafe, not supported, but do not return an error.
242*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Success();
243*3ac0a46fSAndroid Build Coastguard Worker }
244*3ac0a46fSAndroid Build Coastguard Worker 
getField(CJS_Runtime * pRuntime,const std::vector<v8::Local<v8::Value>> & params)245*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_Document::getField(
246*3ac0a46fSAndroid Build Coastguard Worker     CJS_Runtime* pRuntime,
247*3ac0a46fSAndroid Build Coastguard Worker     const std::vector<v8::Local<v8::Value>>& params) {
248*3ac0a46fSAndroid Build Coastguard Worker   if (params.empty())
249*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kParamError);
250*3ac0a46fSAndroid Build Coastguard Worker 
251*3ac0a46fSAndroid Build Coastguard Worker   if (!m_pFormFillEnv)
252*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kBadObjectError);
253*3ac0a46fSAndroid Build Coastguard Worker 
254*3ac0a46fSAndroid Build Coastguard Worker   WideString wideName = pRuntime->ToWideString(params[0]);
255*3ac0a46fSAndroid Build Coastguard Worker   CPDF_InteractiveForm* pPDFForm = GetCoreInteractiveForm();
256*3ac0a46fSAndroid Build Coastguard Worker   if (pPDFForm->CountFields(wideName) <= 0)
257*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Success(pRuntime->NewUndefined());
258*3ac0a46fSAndroid Build Coastguard Worker 
259*3ac0a46fSAndroid Build Coastguard Worker   v8::Local<v8::Object> pFieldObj = pRuntime->NewFXJSBoundObject(
260*3ac0a46fSAndroid Build Coastguard Worker       CJS_Field::GetObjDefnID(), FXJSOBJTYPE_DYNAMIC);
261*3ac0a46fSAndroid Build Coastguard Worker   if (pFieldObj.IsEmpty())
262*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kBadObjectError);
263*3ac0a46fSAndroid Build Coastguard Worker 
264*3ac0a46fSAndroid Build Coastguard Worker   auto* pJSField = static_cast<CJS_Field*>(
265*3ac0a46fSAndroid Build Coastguard Worker       CFXJS_Engine::GetObjectPrivate(pRuntime->GetIsolate(), pFieldObj));
266*3ac0a46fSAndroid Build Coastguard Worker   if (!pJSField)
267*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kBadObjectError);
268*3ac0a46fSAndroid Build Coastguard Worker 
269*3ac0a46fSAndroid Build Coastguard Worker   pJSField->AttachField(this, wideName);
270*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Success(pJSField->ToV8Object());
271*3ac0a46fSAndroid Build Coastguard Worker }
272*3ac0a46fSAndroid Build Coastguard Worker 
273*3ac0a46fSAndroid Build Coastguard Worker // Gets the name of the nth field in the document
getNthFieldName(CJS_Runtime * pRuntime,const std::vector<v8::Local<v8::Value>> & params)274*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_Document::getNthFieldName(
275*3ac0a46fSAndroid Build Coastguard Worker     CJS_Runtime* pRuntime,
276*3ac0a46fSAndroid Build Coastguard Worker     const std::vector<v8::Local<v8::Value>>& params) {
277*3ac0a46fSAndroid Build Coastguard Worker   if (params.size() != 1)
278*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kParamError);
279*3ac0a46fSAndroid Build Coastguard Worker   if (!m_pFormFillEnv)
280*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kBadObjectError);
281*3ac0a46fSAndroid Build Coastguard Worker 
282*3ac0a46fSAndroid Build Coastguard Worker   int nIndex = pRuntime->ToInt32(params[0]);
283*3ac0a46fSAndroid Build Coastguard Worker   if (nIndex < 0)
284*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kValueError);
285*3ac0a46fSAndroid Build Coastguard Worker 
286*3ac0a46fSAndroid Build Coastguard Worker   CPDF_InteractiveForm* pPDFForm = GetCoreInteractiveForm();
287*3ac0a46fSAndroid Build Coastguard Worker   CPDF_FormField* pField = pPDFForm->GetField(nIndex, WideString());
288*3ac0a46fSAndroid Build Coastguard Worker   if (!pField)
289*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kBadObjectError);
290*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Success(
291*3ac0a46fSAndroid Build Coastguard Worker       pRuntime->NewString(pField->GetFullName().AsStringView()));
292*3ac0a46fSAndroid Build Coastguard Worker }
293*3ac0a46fSAndroid Build Coastguard Worker 
importAnFDF(CJS_Runtime * pRuntime,const std::vector<v8::Local<v8::Value>> & params)294*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_Document::importAnFDF(
295*3ac0a46fSAndroid Build Coastguard Worker     CJS_Runtime* pRuntime,
296*3ac0a46fSAndroid Build Coastguard Worker     const std::vector<v8::Local<v8::Value>>& params) {
297*3ac0a46fSAndroid Build Coastguard Worker   // Unsafe, not supported.
298*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Success();
299*3ac0a46fSAndroid Build Coastguard Worker }
300*3ac0a46fSAndroid Build Coastguard Worker 
importAnXFDF(CJS_Runtime * pRuntime,const std::vector<v8::Local<v8::Value>> & params)301*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_Document::importAnXFDF(
302*3ac0a46fSAndroid Build Coastguard Worker     CJS_Runtime* pRuntime,
303*3ac0a46fSAndroid Build Coastguard Worker     const std::vector<v8::Local<v8::Value>>& params) {
304*3ac0a46fSAndroid Build Coastguard Worker   // Unsafe, not supported.
305*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Success();
306*3ac0a46fSAndroid Build Coastguard Worker }
307*3ac0a46fSAndroid Build Coastguard Worker 
importTextData(CJS_Runtime * pRuntime,const std::vector<v8::Local<v8::Value>> & params)308*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_Document::importTextData(
309*3ac0a46fSAndroid Build Coastguard Worker     CJS_Runtime* pRuntime,
310*3ac0a46fSAndroid Build Coastguard Worker     const std::vector<v8::Local<v8::Value>>& params) {
311*3ac0a46fSAndroid Build Coastguard Worker   // Unsafe, not supported.
312*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Success();
313*3ac0a46fSAndroid Build Coastguard Worker }
314*3ac0a46fSAndroid Build Coastguard Worker 
mailDoc(CJS_Runtime * pRuntime,const std::vector<v8::Local<v8::Value>> & params)315*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_Document::mailDoc(
316*3ac0a46fSAndroid Build Coastguard Worker     CJS_Runtime* pRuntime,
317*3ac0a46fSAndroid Build Coastguard Worker     const std::vector<v8::Local<v8::Value>>& params) {
318*3ac0a46fSAndroid Build Coastguard Worker   if (!m_pFormFillEnv)
319*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kBadObjectError);
320*3ac0a46fSAndroid Build Coastguard Worker 
321*3ac0a46fSAndroid Build Coastguard Worker   std::vector<v8::Local<v8::Value>> newParams = ExpandKeywordParams(
322*3ac0a46fSAndroid Build Coastguard Worker       pRuntime, params, 6, "bUI", "cTo", "cCc", "cBcc", "cSubject", "cMsg");
323*3ac0a46fSAndroid Build Coastguard Worker 
324*3ac0a46fSAndroid Build Coastguard Worker   bool bUI = true;
325*3ac0a46fSAndroid Build Coastguard Worker   if (IsExpandedParamKnown(newParams[0]))
326*3ac0a46fSAndroid Build Coastguard Worker     bUI = pRuntime->ToBoolean(newParams[0]);
327*3ac0a46fSAndroid Build Coastguard Worker 
328*3ac0a46fSAndroid Build Coastguard Worker   WideString cTo;
329*3ac0a46fSAndroid Build Coastguard Worker   if (IsExpandedParamKnown(newParams[1]))
330*3ac0a46fSAndroid Build Coastguard Worker     cTo = pRuntime->ToWideString(newParams[1]);
331*3ac0a46fSAndroid Build Coastguard Worker 
332*3ac0a46fSAndroid Build Coastguard Worker   WideString cCc;
333*3ac0a46fSAndroid Build Coastguard Worker   if (IsExpandedParamKnown(newParams[2]))
334*3ac0a46fSAndroid Build Coastguard Worker     cCc = pRuntime->ToWideString(newParams[2]);
335*3ac0a46fSAndroid Build Coastguard Worker 
336*3ac0a46fSAndroid Build Coastguard Worker   WideString cBcc;
337*3ac0a46fSAndroid Build Coastguard Worker   if (IsExpandedParamKnown(newParams[3]))
338*3ac0a46fSAndroid Build Coastguard Worker     cBcc = pRuntime->ToWideString(newParams[3]);
339*3ac0a46fSAndroid Build Coastguard Worker 
340*3ac0a46fSAndroid Build Coastguard Worker   WideString cSubject;
341*3ac0a46fSAndroid Build Coastguard Worker   if (IsExpandedParamKnown(newParams[4]))
342*3ac0a46fSAndroid Build Coastguard Worker     cSubject = pRuntime->ToWideString(newParams[4]);
343*3ac0a46fSAndroid Build Coastguard Worker 
344*3ac0a46fSAndroid Build Coastguard Worker   WideString cMsg;
345*3ac0a46fSAndroid Build Coastguard Worker   if (IsExpandedParamKnown(newParams[5]))
346*3ac0a46fSAndroid Build Coastguard Worker     cMsg = pRuntime->ToWideString(newParams[5]);
347*3ac0a46fSAndroid Build Coastguard Worker 
348*3ac0a46fSAndroid Build Coastguard Worker   pRuntime->BeginBlock();
349*3ac0a46fSAndroid Build Coastguard Worker   m_pFormFillEnv->JS_docmailForm(pdfium::span<const uint8_t>(), bUI, cTo,
350*3ac0a46fSAndroid Build Coastguard Worker                                  cSubject, cCc, cBcc, cMsg);
351*3ac0a46fSAndroid Build Coastguard Worker   pRuntime->EndBlock();
352*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Success();
353*3ac0a46fSAndroid Build Coastguard Worker }
354*3ac0a46fSAndroid Build Coastguard Worker 
355*3ac0a46fSAndroid Build Coastguard Worker // exports the form data and mails the resulting fdf file as an attachment to
356*3ac0a46fSAndroid Build Coastguard Worker // all recipients.
357*3ac0a46fSAndroid Build Coastguard Worker // comment: need reader supports
mailForm(CJS_Runtime * pRuntime,const std::vector<v8::Local<v8::Value>> & params)358*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_Document::mailForm(
359*3ac0a46fSAndroid Build Coastguard Worker     CJS_Runtime* pRuntime,
360*3ac0a46fSAndroid Build Coastguard Worker     const std::vector<v8::Local<v8::Value>>& params) {
361*3ac0a46fSAndroid Build Coastguard Worker   if (!m_pFormFillEnv)
362*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kBadObjectError);
363*3ac0a46fSAndroid Build Coastguard Worker 
364*3ac0a46fSAndroid Build Coastguard Worker   using pdfium::access_permissions::kExtractForAccessibility;
365*3ac0a46fSAndroid Build Coastguard Worker   if (!m_pFormFillEnv->HasPermissions(kExtractForAccessibility))
366*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kPermissionError);
367*3ac0a46fSAndroid Build Coastguard Worker 
368*3ac0a46fSAndroid Build Coastguard Worker   CPDFSDK_InteractiveForm* pInteractiveForm = GetSDKInteractiveForm();
369*3ac0a46fSAndroid Build Coastguard Worker   ByteString sTextBuf = pInteractiveForm->ExportFormToFDFTextBuf();
370*3ac0a46fSAndroid Build Coastguard Worker   if (sTextBuf.IsEmpty())
371*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(L"Bad FDF format.");
372*3ac0a46fSAndroid Build Coastguard Worker 
373*3ac0a46fSAndroid Build Coastguard Worker   std::vector<v8::Local<v8::Value>> newParams = ExpandKeywordParams(
374*3ac0a46fSAndroid Build Coastguard Worker       pRuntime, params, 6, "bUI", "cTo", "cCc", "cBcc", "cSubject", "cMsg");
375*3ac0a46fSAndroid Build Coastguard Worker 
376*3ac0a46fSAndroid Build Coastguard Worker   bool bUI = true;
377*3ac0a46fSAndroid Build Coastguard Worker   if (IsExpandedParamKnown(newParams[0]))
378*3ac0a46fSAndroid Build Coastguard Worker     bUI = pRuntime->ToBoolean(newParams[0]);
379*3ac0a46fSAndroid Build Coastguard Worker 
380*3ac0a46fSAndroid Build Coastguard Worker   WideString cTo;
381*3ac0a46fSAndroid Build Coastguard Worker   if (IsExpandedParamKnown(newParams[1]))
382*3ac0a46fSAndroid Build Coastguard Worker     cTo = pRuntime->ToWideString(newParams[1]);
383*3ac0a46fSAndroid Build Coastguard Worker 
384*3ac0a46fSAndroid Build Coastguard Worker   WideString cCc;
385*3ac0a46fSAndroid Build Coastguard Worker   if (IsExpandedParamKnown(newParams[2]))
386*3ac0a46fSAndroid Build Coastguard Worker     cCc = pRuntime->ToWideString(newParams[2]);
387*3ac0a46fSAndroid Build Coastguard Worker 
388*3ac0a46fSAndroid Build Coastguard Worker   WideString cBcc;
389*3ac0a46fSAndroid Build Coastguard Worker   if (IsExpandedParamKnown(newParams[3]))
390*3ac0a46fSAndroid Build Coastguard Worker     cBcc = pRuntime->ToWideString(newParams[3]);
391*3ac0a46fSAndroid Build Coastguard Worker 
392*3ac0a46fSAndroid Build Coastguard Worker   WideString cSubject;
393*3ac0a46fSAndroid Build Coastguard Worker   if (IsExpandedParamKnown(newParams[4]))
394*3ac0a46fSAndroid Build Coastguard Worker     cSubject = pRuntime->ToWideString(newParams[4]);
395*3ac0a46fSAndroid Build Coastguard Worker 
396*3ac0a46fSAndroid Build Coastguard Worker   WideString cMsg;
397*3ac0a46fSAndroid Build Coastguard Worker   if (IsExpandedParamKnown(newParams[5]))
398*3ac0a46fSAndroid Build Coastguard Worker     cMsg = pRuntime->ToWideString(newParams[5]);
399*3ac0a46fSAndroid Build Coastguard Worker 
400*3ac0a46fSAndroid Build Coastguard Worker   pRuntime->BeginBlock();
401*3ac0a46fSAndroid Build Coastguard Worker   m_pFormFillEnv->JS_docmailForm(sTextBuf.raw_span(), bUI, cTo, cSubject, cCc,
402*3ac0a46fSAndroid Build Coastguard Worker                                  cBcc, cMsg);
403*3ac0a46fSAndroid Build Coastguard Worker   pRuntime->EndBlock();
404*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Success();
405*3ac0a46fSAndroid Build Coastguard Worker }
406*3ac0a46fSAndroid Build Coastguard Worker 
print(CJS_Runtime * pRuntime,const std::vector<v8::Local<v8::Value>> & params)407*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_Document::print(
408*3ac0a46fSAndroid Build Coastguard Worker     CJS_Runtime* pRuntime,
409*3ac0a46fSAndroid Build Coastguard Worker     const std::vector<v8::Local<v8::Value>>& params) {
410*3ac0a46fSAndroid Build Coastguard Worker   std::vector<v8::Local<v8::Value>> newParams = ExpandKeywordParams(
411*3ac0a46fSAndroid Build Coastguard Worker       pRuntime, params, 8, "bUI", "nStart", "nEnd", "bSilent", "bShrinkToFit",
412*3ac0a46fSAndroid Build Coastguard Worker       "bPrintAsImage", "bReverse", "bAnnotations");
413*3ac0a46fSAndroid Build Coastguard Worker 
414*3ac0a46fSAndroid Build Coastguard Worker   bool bUI = true;
415*3ac0a46fSAndroid Build Coastguard Worker   if (IsExpandedParamKnown(newParams[0]))
416*3ac0a46fSAndroid Build Coastguard Worker     bUI = pRuntime->ToBoolean(newParams[0]);
417*3ac0a46fSAndroid Build Coastguard Worker 
418*3ac0a46fSAndroid Build Coastguard Worker   int nStart = 0;
419*3ac0a46fSAndroid Build Coastguard Worker   if (IsExpandedParamKnown(newParams[1]))
420*3ac0a46fSAndroid Build Coastguard Worker     nStart = pRuntime->ToInt32(newParams[1]);
421*3ac0a46fSAndroid Build Coastguard Worker 
422*3ac0a46fSAndroid Build Coastguard Worker   int nEnd = 0;
423*3ac0a46fSAndroid Build Coastguard Worker   if (IsExpandedParamKnown(newParams[2]))
424*3ac0a46fSAndroid Build Coastguard Worker     nEnd = pRuntime->ToInt32(newParams[2]);
425*3ac0a46fSAndroid Build Coastguard Worker 
426*3ac0a46fSAndroid Build Coastguard Worker   bool bSilent = false;
427*3ac0a46fSAndroid Build Coastguard Worker   if (IsExpandedParamKnown(newParams[3]))
428*3ac0a46fSAndroid Build Coastguard Worker     bSilent = pRuntime->ToBoolean(newParams[3]);
429*3ac0a46fSAndroid Build Coastguard Worker 
430*3ac0a46fSAndroid Build Coastguard Worker   bool bShrinkToFit = false;
431*3ac0a46fSAndroid Build Coastguard Worker   if (IsExpandedParamKnown(newParams[4]))
432*3ac0a46fSAndroid Build Coastguard Worker     bShrinkToFit = pRuntime->ToBoolean(newParams[4]);
433*3ac0a46fSAndroid Build Coastguard Worker 
434*3ac0a46fSAndroid Build Coastguard Worker   bool bPrintAsImage = false;
435*3ac0a46fSAndroid Build Coastguard Worker   if (IsExpandedParamKnown(newParams[5]))
436*3ac0a46fSAndroid Build Coastguard Worker     bPrintAsImage = pRuntime->ToBoolean(newParams[5]);
437*3ac0a46fSAndroid Build Coastguard Worker 
438*3ac0a46fSAndroid Build Coastguard Worker   bool bReverse = false;
439*3ac0a46fSAndroid Build Coastguard Worker   if (IsExpandedParamKnown(newParams[6]))
440*3ac0a46fSAndroid Build Coastguard Worker     bReverse = pRuntime->ToBoolean(newParams[6]);
441*3ac0a46fSAndroid Build Coastguard Worker 
442*3ac0a46fSAndroid Build Coastguard Worker   bool bAnnotations = false;
443*3ac0a46fSAndroid Build Coastguard Worker   if (IsExpandedParamKnown(newParams[7]))
444*3ac0a46fSAndroid Build Coastguard Worker     bAnnotations = pRuntime->ToBoolean(newParams[7]);
445*3ac0a46fSAndroid Build Coastguard Worker 
446*3ac0a46fSAndroid Build Coastguard Worker   if (!m_pFormFillEnv)
447*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kBadObjectError);
448*3ac0a46fSAndroid Build Coastguard Worker 
449*3ac0a46fSAndroid Build Coastguard Worker   CJS_EventContext* pHandler = pRuntime->GetCurrentEventContext();
450*3ac0a46fSAndroid Build Coastguard Worker   if (!pHandler->IsUserGesture())
451*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kUserGestureRequiredError);
452*3ac0a46fSAndroid Build Coastguard Worker 
453*3ac0a46fSAndroid Build Coastguard Worker   m_pFormFillEnv->JS_docprint(bUI, nStart, nEnd, bSilent, bShrinkToFit,
454*3ac0a46fSAndroid Build Coastguard Worker                               bPrintAsImage, bReverse, bAnnotations);
455*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Success();
456*3ac0a46fSAndroid Build Coastguard Worker }
457*3ac0a46fSAndroid Build Coastguard Worker 
458*3ac0a46fSAndroid Build Coastguard Worker // removes the specified field from the document.
459*3ac0a46fSAndroid Build Coastguard Worker // comment:
460*3ac0a46fSAndroid Build Coastguard Worker // note: if the filed name is not rational, adobe is dumb for it.
removeField(CJS_Runtime * pRuntime,const std::vector<v8::Local<v8::Value>> & params)461*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_Document::removeField(
462*3ac0a46fSAndroid Build Coastguard Worker     CJS_Runtime* pRuntime,
463*3ac0a46fSAndroid Build Coastguard Worker     const std::vector<v8::Local<v8::Value>>& params) {
464*3ac0a46fSAndroid Build Coastguard Worker   if (params.size() != 1)
465*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kParamError);
466*3ac0a46fSAndroid Build Coastguard Worker   if (!m_pFormFillEnv)
467*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kBadObjectError);
468*3ac0a46fSAndroid Build Coastguard Worker 
469*3ac0a46fSAndroid Build Coastguard Worker   if (!m_pFormFillEnv->HasPermissions(
470*3ac0a46fSAndroid Build Coastguard Worker           pdfium::access_permissions::kModifyContent |
471*3ac0a46fSAndroid Build Coastguard Worker           pdfium::access_permissions::kModifyAnnotation)) {
472*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kPermissionError);
473*3ac0a46fSAndroid Build Coastguard Worker   }
474*3ac0a46fSAndroid Build Coastguard Worker 
475*3ac0a46fSAndroid Build Coastguard Worker   WideString sFieldName = pRuntime->ToWideString(params[0]);
476*3ac0a46fSAndroid Build Coastguard Worker   CPDFSDK_InteractiveForm* pInteractiveForm = GetSDKInteractiveForm();
477*3ac0a46fSAndroid Build Coastguard Worker   std::vector<ObservedPtr<CPDFSDK_Widget>> widgets;
478*3ac0a46fSAndroid Build Coastguard Worker   pInteractiveForm->GetWidgets(sFieldName, &widgets);
479*3ac0a46fSAndroid Build Coastguard Worker   if (widgets.empty())
480*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Success();
481*3ac0a46fSAndroid Build Coastguard Worker 
482*3ac0a46fSAndroid Build Coastguard Worker   for (const auto& pWidget : widgets) {
483*3ac0a46fSAndroid Build Coastguard Worker     if (!pWidget)
484*3ac0a46fSAndroid Build Coastguard Worker       continue;
485*3ac0a46fSAndroid Build Coastguard Worker 
486*3ac0a46fSAndroid Build Coastguard Worker     IPDF_Page* pPage = pWidget->GetPage();
487*3ac0a46fSAndroid Build Coastguard Worker     DCHECK(pPage);
488*3ac0a46fSAndroid Build Coastguard Worker 
489*3ac0a46fSAndroid Build Coastguard Worker     // If there is currently no pageview associated with the page being used
490*3ac0a46fSAndroid Build Coastguard Worker     // do not create one. We may be in the process of tearing down the document
491*3ac0a46fSAndroid Build Coastguard Worker     // and creating a new pageview at this point will cause bad things.
492*3ac0a46fSAndroid Build Coastguard Worker     CPDFSDK_PageView* pPageView = m_pFormFillEnv->GetPageView(pPage);
493*3ac0a46fSAndroid Build Coastguard Worker     if (!pPageView)
494*3ac0a46fSAndroid Build Coastguard Worker       continue;
495*3ac0a46fSAndroid Build Coastguard Worker 
496*3ac0a46fSAndroid Build Coastguard Worker     CFX_FloatRect rcAnnot = pWidget->GetRect();
497*3ac0a46fSAndroid Build Coastguard Worker     rcAnnot.Inflate(1.0f, 1.0f, 1.0f, 1.0f);
498*3ac0a46fSAndroid Build Coastguard Worker 
499*3ac0a46fSAndroid Build Coastguard Worker     std::vector<CFX_FloatRect> aRefresh(1, rcAnnot);
500*3ac0a46fSAndroid Build Coastguard Worker     pPageView->UpdateRects(aRefresh);
501*3ac0a46fSAndroid Build Coastguard Worker   }
502*3ac0a46fSAndroid Build Coastguard Worker   m_pFormFillEnv->SetChangeMark();
503*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Success();
504*3ac0a46fSAndroid Build Coastguard Worker }
505*3ac0a46fSAndroid Build Coastguard Worker 
506*3ac0a46fSAndroid Build Coastguard Worker // reset filed values within a document.
507*3ac0a46fSAndroid Build Coastguard Worker // comment:
508*3ac0a46fSAndroid Build Coastguard Worker // note: if the fields names r not rational, aodbe is dumb for it.
509*3ac0a46fSAndroid Build Coastguard Worker 
resetForm(CJS_Runtime * pRuntime,const std::vector<v8::Local<v8::Value>> & params)510*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_Document::resetForm(
511*3ac0a46fSAndroid Build Coastguard Worker     CJS_Runtime* pRuntime,
512*3ac0a46fSAndroid Build Coastguard Worker     const std::vector<v8::Local<v8::Value>>& params) {
513*3ac0a46fSAndroid Build Coastguard Worker   if (!m_pFormFillEnv)
514*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kBadObjectError);
515*3ac0a46fSAndroid Build Coastguard Worker 
516*3ac0a46fSAndroid Build Coastguard Worker   if (!m_pFormFillEnv->HasPermissions(
517*3ac0a46fSAndroid Build Coastguard Worker           pdfium::access_permissions::kModifyContent |
518*3ac0a46fSAndroid Build Coastguard Worker           pdfium::access_permissions::kModifyAnnotation |
519*3ac0a46fSAndroid Build Coastguard Worker           pdfium::access_permissions::kFillForm)) {
520*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kPermissionError);
521*3ac0a46fSAndroid Build Coastguard Worker   }
522*3ac0a46fSAndroid Build Coastguard Worker 
523*3ac0a46fSAndroid Build Coastguard Worker   CPDF_InteractiveForm* pPDFForm = GetCoreInteractiveForm();
524*3ac0a46fSAndroid Build Coastguard Worker   if (params.empty()) {
525*3ac0a46fSAndroid Build Coastguard Worker     pPDFForm->ResetForm();
526*3ac0a46fSAndroid Build Coastguard Worker     m_pFormFillEnv->SetChangeMark();
527*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Success();
528*3ac0a46fSAndroid Build Coastguard Worker   }
529*3ac0a46fSAndroid Build Coastguard Worker 
530*3ac0a46fSAndroid Build Coastguard Worker   v8::Local<v8::Array> array;
531*3ac0a46fSAndroid Build Coastguard Worker   if (params[0]->IsString()) {
532*3ac0a46fSAndroid Build Coastguard Worker     array = pRuntime->NewArray();
533*3ac0a46fSAndroid Build Coastguard Worker     pRuntime->PutArrayElement(array, 0, params[0]);
534*3ac0a46fSAndroid Build Coastguard Worker   } else {
535*3ac0a46fSAndroid Build Coastguard Worker     array = pRuntime->ToArray(params[0]);
536*3ac0a46fSAndroid Build Coastguard Worker   }
537*3ac0a46fSAndroid Build Coastguard Worker 
538*3ac0a46fSAndroid Build Coastguard Worker   std::vector<CPDF_FormField*> aFields;
539*3ac0a46fSAndroid Build Coastguard Worker   for (size_t i = 0; i < pRuntime->GetArrayLength(array); ++i) {
540*3ac0a46fSAndroid Build Coastguard Worker     WideString swVal =
541*3ac0a46fSAndroid Build Coastguard Worker         pRuntime->ToWideString(pRuntime->GetArrayElement(array, i));
542*3ac0a46fSAndroid Build Coastguard Worker     const size_t jsz = pPDFForm->CountFields(swVal);
543*3ac0a46fSAndroid Build Coastguard Worker     for (size_t j = 0; j < jsz; ++j)
544*3ac0a46fSAndroid Build Coastguard Worker       aFields.push_back(pPDFForm->GetField(j, swVal));
545*3ac0a46fSAndroid Build Coastguard Worker   }
546*3ac0a46fSAndroid Build Coastguard Worker 
547*3ac0a46fSAndroid Build Coastguard Worker   if (!aFields.empty()) {
548*3ac0a46fSAndroid Build Coastguard Worker     pPDFForm->ResetForm(aFields, true);
549*3ac0a46fSAndroid Build Coastguard Worker     m_pFormFillEnv->SetChangeMark();
550*3ac0a46fSAndroid Build Coastguard Worker   }
551*3ac0a46fSAndroid Build Coastguard Worker 
552*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Success();
553*3ac0a46fSAndroid Build Coastguard Worker }
554*3ac0a46fSAndroid Build Coastguard Worker 
saveAs(CJS_Runtime * pRuntime,const std::vector<v8::Local<v8::Value>> & params)555*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_Document::saveAs(
556*3ac0a46fSAndroid Build Coastguard Worker     CJS_Runtime* pRuntime,
557*3ac0a46fSAndroid Build Coastguard Worker     const std::vector<v8::Local<v8::Value>>& params) {
558*3ac0a46fSAndroid Build Coastguard Worker   // Unsafe, not supported.
559*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Success();
560*3ac0a46fSAndroid Build Coastguard Worker }
561*3ac0a46fSAndroid Build Coastguard Worker 
syncAnnotScan(CJS_Runtime * pRuntime,const std::vector<v8::Local<v8::Value>> & params)562*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_Document::syncAnnotScan(
563*3ac0a46fSAndroid Build Coastguard Worker     CJS_Runtime* pRuntime,
564*3ac0a46fSAndroid Build Coastguard Worker     const std::vector<v8::Local<v8::Value>>& params) {
565*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Success();
566*3ac0a46fSAndroid Build Coastguard Worker }
567*3ac0a46fSAndroid Build Coastguard Worker 
submitForm(CJS_Runtime * pRuntime,const std::vector<v8::Local<v8::Value>> & params)568*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_Document::submitForm(
569*3ac0a46fSAndroid Build Coastguard Worker     CJS_Runtime* pRuntime,
570*3ac0a46fSAndroid Build Coastguard Worker     const std::vector<v8::Local<v8::Value>>& params) {
571*3ac0a46fSAndroid Build Coastguard Worker   size_t nSize = params.size();
572*3ac0a46fSAndroid Build Coastguard Worker   if (nSize < 1)
573*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kParamError);
574*3ac0a46fSAndroid Build Coastguard Worker   if (!m_pFormFillEnv)
575*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kBadObjectError);
576*3ac0a46fSAndroid Build Coastguard Worker 
577*3ac0a46fSAndroid Build Coastguard Worker   CJS_EventContext* pHandler = pRuntime->GetCurrentEventContext();
578*3ac0a46fSAndroid Build Coastguard Worker   if (!pHandler->IsUserGesture())
579*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kUserGestureRequiredError);
580*3ac0a46fSAndroid Build Coastguard Worker 
581*3ac0a46fSAndroid Build Coastguard Worker   v8::Local<v8::Array> aFields;
582*3ac0a46fSAndroid Build Coastguard Worker   WideString strURL;
583*3ac0a46fSAndroid Build Coastguard Worker   bool bFDF = true;
584*3ac0a46fSAndroid Build Coastguard Worker   bool bEmpty = false;
585*3ac0a46fSAndroid Build Coastguard Worker   if (params[0]->IsString()) {
586*3ac0a46fSAndroid Build Coastguard Worker     strURL = pRuntime->ToWideString(params[0]);
587*3ac0a46fSAndroid Build Coastguard Worker     if (nSize > 1)
588*3ac0a46fSAndroid Build Coastguard Worker       bFDF = pRuntime->ToBoolean(params[1]);
589*3ac0a46fSAndroid Build Coastguard Worker     if (nSize > 2)
590*3ac0a46fSAndroid Build Coastguard Worker       bEmpty = pRuntime->ToBoolean(params[2]);
591*3ac0a46fSAndroid Build Coastguard Worker     if (nSize > 3)
592*3ac0a46fSAndroid Build Coastguard Worker       aFields = pRuntime->ToArray(params[3]);
593*3ac0a46fSAndroid Build Coastguard Worker   } else if (params[0]->IsObject()) {
594*3ac0a46fSAndroid Build Coastguard Worker     v8::Local<v8::Object> pObj = pRuntime->ToObject(params[0]);
595*3ac0a46fSAndroid Build Coastguard Worker     v8::Local<v8::Value> pValue = pRuntime->GetObjectProperty(pObj, "cURL");
596*3ac0a46fSAndroid Build Coastguard Worker     if (!pValue.IsEmpty())
597*3ac0a46fSAndroid Build Coastguard Worker       strURL = pRuntime->ToWideString(pValue);
598*3ac0a46fSAndroid Build Coastguard Worker 
599*3ac0a46fSAndroid Build Coastguard Worker     bFDF = pRuntime->ToBoolean(pRuntime->GetObjectProperty(pObj, "bFDF"));
600*3ac0a46fSAndroid Build Coastguard Worker     bEmpty = pRuntime->ToBoolean(pRuntime->GetObjectProperty(pObj, "bEmpty"));
601*3ac0a46fSAndroid Build Coastguard Worker     aFields = pRuntime->ToArray(pRuntime->GetObjectProperty(pObj, "aFields"));
602*3ac0a46fSAndroid Build Coastguard Worker   }
603*3ac0a46fSAndroid Build Coastguard Worker 
604*3ac0a46fSAndroid Build Coastguard Worker   CPDF_InteractiveForm* pPDFForm = GetCoreInteractiveForm();
605*3ac0a46fSAndroid Build Coastguard Worker   if (pRuntime->GetArrayLength(aFields) == 0 && bEmpty) {
606*3ac0a46fSAndroid Build Coastguard Worker     if (pPDFForm->CheckRequiredFields(nullptr, true)) {
607*3ac0a46fSAndroid Build Coastguard Worker       pRuntime->BeginBlock();
608*3ac0a46fSAndroid Build Coastguard Worker       GetSDKInteractiveForm()->SubmitForm(strURL);
609*3ac0a46fSAndroid Build Coastguard Worker       pRuntime->EndBlock();
610*3ac0a46fSAndroid Build Coastguard Worker     }
611*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Success();
612*3ac0a46fSAndroid Build Coastguard Worker   }
613*3ac0a46fSAndroid Build Coastguard Worker 
614*3ac0a46fSAndroid Build Coastguard Worker   std::vector<CPDF_FormField*> fieldObjects;
615*3ac0a46fSAndroid Build Coastguard Worker   for (size_t i = 0; i < pRuntime->GetArrayLength(aFields); ++i) {
616*3ac0a46fSAndroid Build Coastguard Worker     WideString sName =
617*3ac0a46fSAndroid Build Coastguard Worker         pRuntime->ToWideString(pRuntime->GetArrayElement(aFields, i));
618*3ac0a46fSAndroid Build Coastguard Worker     const size_t jsz = pPDFForm->CountFields(sName);
619*3ac0a46fSAndroid Build Coastguard Worker     for (size_t j = 0; j < jsz; ++j) {
620*3ac0a46fSAndroid Build Coastguard Worker       CPDF_FormField* pField = pPDFForm->GetField(j, sName);
621*3ac0a46fSAndroid Build Coastguard Worker       if (!bEmpty && pField->GetValue().IsEmpty())
622*3ac0a46fSAndroid Build Coastguard Worker         continue;
623*3ac0a46fSAndroid Build Coastguard Worker 
624*3ac0a46fSAndroid Build Coastguard Worker       fieldObjects.push_back(pField);
625*3ac0a46fSAndroid Build Coastguard Worker     }
626*3ac0a46fSAndroid Build Coastguard Worker   }
627*3ac0a46fSAndroid Build Coastguard Worker 
628*3ac0a46fSAndroid Build Coastguard Worker   if (pPDFForm->CheckRequiredFields(&fieldObjects, true)) {
629*3ac0a46fSAndroid Build Coastguard Worker     pRuntime->BeginBlock();
630*3ac0a46fSAndroid Build Coastguard Worker     GetSDKInteractiveForm()->SubmitFields(strURL, fieldObjects, true, !bFDF);
631*3ac0a46fSAndroid Build Coastguard Worker     pRuntime->EndBlock();
632*3ac0a46fSAndroid Build Coastguard Worker   }
633*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Success();
634*3ac0a46fSAndroid Build Coastguard Worker }
635*3ac0a46fSAndroid Build Coastguard Worker 
SetFormFillEnv(CPDFSDK_FormFillEnvironment * pFormFillEnv)636*3ac0a46fSAndroid Build Coastguard Worker void CJS_Document::SetFormFillEnv(CPDFSDK_FormFillEnvironment* pFormFillEnv) {
637*3ac0a46fSAndroid Build Coastguard Worker   m_pFormFillEnv.Reset(pFormFillEnv);
638*3ac0a46fSAndroid Build Coastguard Worker }
639*3ac0a46fSAndroid Build Coastguard Worker 
get_bookmark_root(CJS_Runtime * pRuntime)640*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_Document::get_bookmark_root(CJS_Runtime* pRuntime) {
641*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Success();
642*3ac0a46fSAndroid Build Coastguard Worker }
643*3ac0a46fSAndroid Build Coastguard Worker 
set_bookmark_root(CJS_Runtime * pRuntime,v8::Local<v8::Value> vp)644*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_Document::set_bookmark_root(CJS_Runtime* pRuntime,
645*3ac0a46fSAndroid Build Coastguard Worker                                            v8::Local<v8::Value> vp) {
646*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Success();
647*3ac0a46fSAndroid Build Coastguard Worker }
648*3ac0a46fSAndroid Build Coastguard Worker 
get_author(CJS_Runtime * pRuntime)649*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_Document::get_author(CJS_Runtime* pRuntime) {
650*3ac0a46fSAndroid Build Coastguard Worker   return getPropertyInternal(pRuntime, "Author");
651*3ac0a46fSAndroid Build Coastguard Worker }
652*3ac0a46fSAndroid Build Coastguard Worker 
set_author(CJS_Runtime * pRuntime,v8::Local<v8::Value> vp)653*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_Document::set_author(CJS_Runtime* pRuntime,
654*3ac0a46fSAndroid Build Coastguard Worker                                     v8::Local<v8::Value> vp) {
655*3ac0a46fSAndroid Build Coastguard Worker   // Read-only.
656*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Success();
657*3ac0a46fSAndroid Build Coastguard Worker }
658*3ac0a46fSAndroid Build Coastguard Worker 
get_info(CJS_Runtime * pRuntime)659*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_Document::get_info(CJS_Runtime* pRuntime) {
660*3ac0a46fSAndroid Build Coastguard Worker   if (!m_pFormFillEnv)
661*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kBadObjectError);
662*3ac0a46fSAndroid Build Coastguard Worker 
663*3ac0a46fSAndroid Build Coastguard Worker   RetainPtr<const CPDF_Dictionary> pDictionary =
664*3ac0a46fSAndroid Build Coastguard Worker       m_pFormFillEnv->GetPDFDocument()->GetInfo();
665*3ac0a46fSAndroid Build Coastguard Worker   if (!pDictionary)
666*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kBadObjectError);
667*3ac0a46fSAndroid Build Coastguard Worker 
668*3ac0a46fSAndroid Build Coastguard Worker   WideString cwAuthor = pDictionary->GetUnicodeTextFor("Author");
669*3ac0a46fSAndroid Build Coastguard Worker   WideString cwTitle = pDictionary->GetUnicodeTextFor("Title");
670*3ac0a46fSAndroid Build Coastguard Worker   WideString cwSubject = pDictionary->GetUnicodeTextFor("Subject");
671*3ac0a46fSAndroid Build Coastguard Worker   WideString cwKeywords = pDictionary->GetUnicodeTextFor("Keywords");
672*3ac0a46fSAndroid Build Coastguard Worker   WideString cwCreator = pDictionary->GetUnicodeTextFor("Creator");
673*3ac0a46fSAndroid Build Coastguard Worker   WideString cwProducer = pDictionary->GetUnicodeTextFor("Producer");
674*3ac0a46fSAndroid Build Coastguard Worker   WideString cwCreationDate = pDictionary->GetUnicodeTextFor("CreationDate");
675*3ac0a46fSAndroid Build Coastguard Worker   WideString cwModDate = pDictionary->GetUnicodeTextFor("ModDate");
676*3ac0a46fSAndroid Build Coastguard Worker   WideString cwTrapped = pDictionary->GetUnicodeTextFor("Trapped");
677*3ac0a46fSAndroid Build Coastguard Worker 
678*3ac0a46fSAndroid Build Coastguard Worker   v8::Local<v8::Object> pObj = pRuntime->NewObject();
679*3ac0a46fSAndroid Build Coastguard Worker   pRuntime->PutObjectProperty(pObj, "Author",
680*3ac0a46fSAndroid Build Coastguard Worker                               pRuntime->NewString(cwAuthor.AsStringView()));
681*3ac0a46fSAndroid Build Coastguard Worker   pRuntime->PutObjectProperty(pObj, "Title",
682*3ac0a46fSAndroid Build Coastguard Worker                               pRuntime->NewString(cwTitle.AsStringView()));
683*3ac0a46fSAndroid Build Coastguard Worker   pRuntime->PutObjectProperty(pObj, "Subject",
684*3ac0a46fSAndroid Build Coastguard Worker                               pRuntime->NewString(cwSubject.AsStringView()));
685*3ac0a46fSAndroid Build Coastguard Worker   pRuntime->PutObjectProperty(pObj, "Keywords",
686*3ac0a46fSAndroid Build Coastguard Worker                               pRuntime->NewString(cwKeywords.AsStringView()));
687*3ac0a46fSAndroid Build Coastguard Worker   pRuntime->PutObjectProperty(pObj, "Creator",
688*3ac0a46fSAndroid Build Coastguard Worker                               pRuntime->NewString(cwCreator.AsStringView()));
689*3ac0a46fSAndroid Build Coastguard Worker   pRuntime->PutObjectProperty(pObj, "Producer",
690*3ac0a46fSAndroid Build Coastguard Worker                               pRuntime->NewString(cwProducer.AsStringView()));
691*3ac0a46fSAndroid Build Coastguard Worker   pRuntime->PutObjectProperty(
692*3ac0a46fSAndroid Build Coastguard Worker       pObj, "CreationDate", pRuntime->NewString(cwCreationDate.AsStringView()));
693*3ac0a46fSAndroid Build Coastguard Worker   pRuntime->PutObjectProperty(pObj, "ModDate",
694*3ac0a46fSAndroid Build Coastguard Worker                               pRuntime->NewString(cwModDate.AsStringView()));
695*3ac0a46fSAndroid Build Coastguard Worker   pRuntime->PutObjectProperty(pObj, "Trapped",
696*3ac0a46fSAndroid Build Coastguard Worker                               pRuntime->NewString(cwTrapped.AsStringView()));
697*3ac0a46fSAndroid Build Coastguard Worker 
698*3ac0a46fSAndroid Build Coastguard Worker   // PutObjectProperty() calls below may re-enter JS and change info dict.
699*3ac0a46fSAndroid Build Coastguard Worker   CPDF_DictionaryLocker locker(ToDictionary(pDictionary->Clone()));
700*3ac0a46fSAndroid Build Coastguard Worker   for (const auto& it : locker) {
701*3ac0a46fSAndroid Build Coastguard Worker     const ByteString& bsKey = it.first;
702*3ac0a46fSAndroid Build Coastguard Worker     const RetainPtr<CPDF_Object>& pValueObj = it.second;
703*3ac0a46fSAndroid Build Coastguard Worker     if (pValueObj->IsString() || pValueObj->IsName()) {
704*3ac0a46fSAndroid Build Coastguard Worker       pRuntime->PutObjectProperty(
705*3ac0a46fSAndroid Build Coastguard Worker           pObj, bsKey.AsStringView(),
706*3ac0a46fSAndroid Build Coastguard Worker           pRuntime->NewString(pValueObj->GetUnicodeText().AsStringView()));
707*3ac0a46fSAndroid Build Coastguard Worker     } else if (pValueObj->IsNumber()) {
708*3ac0a46fSAndroid Build Coastguard Worker       pRuntime->PutObjectProperty(pObj, bsKey.AsStringView(),
709*3ac0a46fSAndroid Build Coastguard Worker                                   pRuntime->NewNumber(pValueObj->GetNumber()));
710*3ac0a46fSAndroid Build Coastguard Worker     } else if (pValueObj->IsBoolean()) {
711*3ac0a46fSAndroid Build Coastguard Worker       pRuntime->PutObjectProperty(
712*3ac0a46fSAndroid Build Coastguard Worker           pObj, bsKey.AsStringView(),
713*3ac0a46fSAndroid Build Coastguard Worker           pRuntime->NewBoolean(!!pValueObj->GetInteger()));
714*3ac0a46fSAndroid Build Coastguard Worker     }
715*3ac0a46fSAndroid Build Coastguard Worker   }
716*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Success(pObj);
717*3ac0a46fSAndroid Build Coastguard Worker }
718*3ac0a46fSAndroid Build Coastguard Worker 
set_info(CJS_Runtime * pRuntime,v8::Local<v8::Value> vp)719*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_Document::set_info(CJS_Runtime* pRuntime,
720*3ac0a46fSAndroid Build Coastguard Worker                                   v8::Local<v8::Value> vp) {
721*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Failure(JSMessage::kReadOnlyError);
722*3ac0a46fSAndroid Build Coastguard Worker }
723*3ac0a46fSAndroid Build Coastguard Worker 
getPropertyInternal(CJS_Runtime * pRuntime,const ByteString & propName)724*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_Document::getPropertyInternal(CJS_Runtime* pRuntime,
725*3ac0a46fSAndroid Build Coastguard Worker                                              const ByteString& propName) {
726*3ac0a46fSAndroid Build Coastguard Worker   if (!m_pFormFillEnv)
727*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kBadObjectError);
728*3ac0a46fSAndroid Build Coastguard Worker 
729*3ac0a46fSAndroid Build Coastguard Worker   RetainPtr<CPDF_Dictionary> pDictionary =
730*3ac0a46fSAndroid Build Coastguard Worker       m_pFormFillEnv->GetPDFDocument()->GetInfo();
731*3ac0a46fSAndroid Build Coastguard Worker   if (!pDictionary)
732*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kBadObjectError);
733*3ac0a46fSAndroid Build Coastguard Worker 
734*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Success(pRuntime->NewString(
735*3ac0a46fSAndroid Build Coastguard Worker       pDictionary->GetUnicodeTextFor(propName).AsStringView()));
736*3ac0a46fSAndroid Build Coastguard Worker }
737*3ac0a46fSAndroid Build Coastguard Worker 
get_creation_date(CJS_Runtime * pRuntime)738*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_Document::get_creation_date(CJS_Runtime* pRuntime) {
739*3ac0a46fSAndroid Build Coastguard Worker   return getPropertyInternal(pRuntime, "CreationDate");
740*3ac0a46fSAndroid Build Coastguard Worker }
741*3ac0a46fSAndroid Build Coastguard Worker 
set_creation_date(CJS_Runtime * pRuntime,v8::Local<v8::Value> vp)742*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_Document::set_creation_date(CJS_Runtime* pRuntime,
743*3ac0a46fSAndroid Build Coastguard Worker                                            v8::Local<v8::Value> vp) {
744*3ac0a46fSAndroid Build Coastguard Worker   // Read-only.
745*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Success();
746*3ac0a46fSAndroid Build Coastguard Worker }
747*3ac0a46fSAndroid Build Coastguard Worker 
get_creator(CJS_Runtime * pRuntime)748*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_Document::get_creator(CJS_Runtime* pRuntime) {
749*3ac0a46fSAndroid Build Coastguard Worker   return getPropertyInternal(pRuntime, "Creator");
750*3ac0a46fSAndroid Build Coastguard Worker }
751*3ac0a46fSAndroid Build Coastguard Worker 
set_creator(CJS_Runtime * pRuntime,v8::Local<v8::Value> vp)752*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_Document::set_creator(CJS_Runtime* pRuntime,
753*3ac0a46fSAndroid Build Coastguard Worker                                      v8::Local<v8::Value> vp) {
754*3ac0a46fSAndroid Build Coastguard Worker   // Read-only.
755*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Success();
756*3ac0a46fSAndroid Build Coastguard Worker }
757*3ac0a46fSAndroid Build Coastguard Worker 
get_delay(CJS_Runtime * pRuntime)758*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_Document::get_delay(CJS_Runtime* pRuntime) {
759*3ac0a46fSAndroid Build Coastguard Worker   if (!m_pFormFillEnv)
760*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kBadObjectError);
761*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Success(pRuntime->NewBoolean(m_bDelay));
762*3ac0a46fSAndroid Build Coastguard Worker }
763*3ac0a46fSAndroid Build Coastguard Worker 
set_delay(CJS_Runtime * pRuntime,v8::Local<v8::Value> vp)764*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_Document::set_delay(CJS_Runtime* pRuntime,
765*3ac0a46fSAndroid Build Coastguard Worker                                    v8::Local<v8::Value> vp) {
766*3ac0a46fSAndroid Build Coastguard Worker   if (!m_pFormFillEnv)
767*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kBadObjectError);
768*3ac0a46fSAndroid Build Coastguard Worker 
769*3ac0a46fSAndroid Build Coastguard Worker   using pdfium::access_permissions::kModifyContent;
770*3ac0a46fSAndroid Build Coastguard Worker   if (!m_pFormFillEnv->HasPermissions(kModifyContent))
771*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kPermissionError);
772*3ac0a46fSAndroid Build Coastguard Worker 
773*3ac0a46fSAndroid Build Coastguard Worker   m_bDelay = pRuntime->ToBoolean(vp);
774*3ac0a46fSAndroid Build Coastguard Worker   if (m_bDelay) {
775*3ac0a46fSAndroid Build Coastguard Worker     m_DelayData.clear();
776*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Success();
777*3ac0a46fSAndroid Build Coastguard Worker   }
778*3ac0a46fSAndroid Build Coastguard Worker 
779*3ac0a46fSAndroid Build Coastguard Worker   std::list<std::unique_ptr<CJS_DelayData>> DelayDataToProcess;
780*3ac0a46fSAndroid Build Coastguard Worker   DelayDataToProcess.swap(m_DelayData);
781*3ac0a46fSAndroid Build Coastguard Worker   for (const auto& pData : DelayDataToProcess)
782*3ac0a46fSAndroid Build Coastguard Worker     CJS_Field::DoDelay(m_pFormFillEnv.Get(), pData.get());
783*3ac0a46fSAndroid Build Coastguard Worker 
784*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Success();
785*3ac0a46fSAndroid Build Coastguard Worker }
786*3ac0a46fSAndroid Build Coastguard Worker 
get_keywords(CJS_Runtime * pRuntime)787*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_Document::get_keywords(CJS_Runtime* pRuntime) {
788*3ac0a46fSAndroid Build Coastguard Worker   return getPropertyInternal(pRuntime, "Keywords");
789*3ac0a46fSAndroid Build Coastguard Worker }
790*3ac0a46fSAndroid Build Coastguard Worker 
set_keywords(CJS_Runtime * pRuntime,v8::Local<v8::Value> vp)791*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_Document::set_keywords(CJS_Runtime* pRuntime,
792*3ac0a46fSAndroid Build Coastguard Worker                                       v8::Local<v8::Value> vp) {
793*3ac0a46fSAndroid Build Coastguard Worker   // Read-only.
794*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Success();
795*3ac0a46fSAndroid Build Coastguard Worker }
796*3ac0a46fSAndroid Build Coastguard Worker 
get_mod_date(CJS_Runtime * pRuntime)797*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_Document::get_mod_date(CJS_Runtime* pRuntime) {
798*3ac0a46fSAndroid Build Coastguard Worker   return getPropertyInternal(pRuntime, "ModDate");
799*3ac0a46fSAndroid Build Coastguard Worker }
800*3ac0a46fSAndroid Build Coastguard Worker 
set_mod_date(CJS_Runtime * pRuntime,v8::Local<v8::Value> vp)801*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_Document::set_mod_date(CJS_Runtime* pRuntime,
802*3ac0a46fSAndroid Build Coastguard Worker                                       v8::Local<v8::Value> vp) {
803*3ac0a46fSAndroid Build Coastguard Worker   // Read-only.
804*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Success();
805*3ac0a46fSAndroid Build Coastguard Worker }
806*3ac0a46fSAndroid Build Coastguard Worker 
get_producer(CJS_Runtime * pRuntime)807*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_Document::get_producer(CJS_Runtime* pRuntime) {
808*3ac0a46fSAndroid Build Coastguard Worker   return getPropertyInternal(pRuntime, "Producer");
809*3ac0a46fSAndroid Build Coastguard Worker }
810*3ac0a46fSAndroid Build Coastguard Worker 
set_producer(CJS_Runtime * pRuntime,v8::Local<v8::Value> vp)811*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_Document::set_producer(CJS_Runtime* pRuntime,
812*3ac0a46fSAndroid Build Coastguard Worker                                       v8::Local<v8::Value> vp) {
813*3ac0a46fSAndroid Build Coastguard Worker   // Read-only.
814*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Success();
815*3ac0a46fSAndroid Build Coastguard Worker }
816*3ac0a46fSAndroid Build Coastguard Worker 
get_subject(CJS_Runtime * pRuntime)817*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_Document::get_subject(CJS_Runtime* pRuntime) {
818*3ac0a46fSAndroid Build Coastguard Worker   return getPropertyInternal(pRuntime, "Subject");
819*3ac0a46fSAndroid Build Coastguard Worker }
820*3ac0a46fSAndroid Build Coastguard Worker 
set_subject(CJS_Runtime * pRuntime,v8::Local<v8::Value> vp)821*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_Document::set_subject(CJS_Runtime* pRuntime,
822*3ac0a46fSAndroid Build Coastguard Worker                                      v8::Local<v8::Value> vp) {
823*3ac0a46fSAndroid Build Coastguard Worker   // Read-only.
824*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Success();
825*3ac0a46fSAndroid Build Coastguard Worker }
826*3ac0a46fSAndroid Build Coastguard Worker 
get_title(CJS_Runtime * pRuntime)827*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_Document::get_title(CJS_Runtime* pRuntime) {
828*3ac0a46fSAndroid Build Coastguard Worker   if (!m_pFormFillEnv)
829*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kBadObjectError);
830*3ac0a46fSAndroid Build Coastguard Worker   return getPropertyInternal(pRuntime, "Title");
831*3ac0a46fSAndroid Build Coastguard Worker }
832*3ac0a46fSAndroid Build Coastguard Worker 
set_title(CJS_Runtime * pRuntime,v8::Local<v8::Value> vp)833*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_Document::set_title(CJS_Runtime* pRuntime,
834*3ac0a46fSAndroid Build Coastguard Worker                                    v8::Local<v8::Value> vp) {
835*3ac0a46fSAndroid Build Coastguard Worker   // Read-only.
836*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Success();
837*3ac0a46fSAndroid Build Coastguard Worker }
838*3ac0a46fSAndroid Build Coastguard Worker 
get_num_pages(CJS_Runtime * pRuntime)839*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_Document::get_num_pages(CJS_Runtime* pRuntime) {
840*3ac0a46fSAndroid Build Coastguard Worker   if (!m_pFormFillEnv)
841*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kBadObjectError);
842*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Success(
843*3ac0a46fSAndroid Build Coastguard Worker       pRuntime->NewNumber(m_pFormFillEnv->GetPageCount()));
844*3ac0a46fSAndroid Build Coastguard Worker }
845*3ac0a46fSAndroid Build Coastguard Worker 
set_num_pages(CJS_Runtime * pRuntime,v8::Local<v8::Value> vp)846*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_Document::set_num_pages(CJS_Runtime* pRuntime,
847*3ac0a46fSAndroid Build Coastguard Worker                                        v8::Local<v8::Value> vp) {
848*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Failure(JSMessage::kReadOnlyError);
849*3ac0a46fSAndroid Build Coastguard Worker }
850*3ac0a46fSAndroid Build Coastguard Worker 
get_external(CJS_Runtime * pRuntime)851*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_Document::get_external(CJS_Runtime* pRuntime) {
852*3ac0a46fSAndroid Build Coastguard Worker   // In Chrome case, should always return true.
853*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Success(pRuntime->NewBoolean(true));
854*3ac0a46fSAndroid Build Coastguard Worker }
855*3ac0a46fSAndroid Build Coastguard Worker 
set_external(CJS_Runtime * pRuntime,v8::Local<v8::Value> vp)856*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_Document::set_external(CJS_Runtime* pRuntime,
857*3ac0a46fSAndroid Build Coastguard Worker                                       v8::Local<v8::Value> vp) {
858*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Success();
859*3ac0a46fSAndroid Build Coastguard Worker }
860*3ac0a46fSAndroid Build Coastguard Worker 
get_filesize(CJS_Runtime * pRuntime)861*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_Document::get_filesize(CJS_Runtime* pRuntime) {
862*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Success(pRuntime->NewNumber(0));
863*3ac0a46fSAndroid Build Coastguard Worker }
864*3ac0a46fSAndroid Build Coastguard Worker 
set_filesize(CJS_Runtime * pRuntime,v8::Local<v8::Value> vp)865*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_Document::set_filesize(CJS_Runtime* pRuntime,
866*3ac0a46fSAndroid Build Coastguard Worker                                       v8::Local<v8::Value> vp) {
867*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Failure(JSMessage::kReadOnlyError);
868*3ac0a46fSAndroid Build Coastguard Worker }
869*3ac0a46fSAndroid Build Coastguard Worker 
get_mouse_x(CJS_Runtime * pRuntime)870*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_Document::get_mouse_x(CJS_Runtime* pRuntime) {
871*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Success();
872*3ac0a46fSAndroid Build Coastguard Worker }
873*3ac0a46fSAndroid Build Coastguard Worker 
set_mouse_x(CJS_Runtime * pRuntime,v8::Local<v8::Value> vp)874*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_Document::set_mouse_x(CJS_Runtime* pRuntime,
875*3ac0a46fSAndroid Build Coastguard Worker                                      v8::Local<v8::Value> vp) {
876*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Success();
877*3ac0a46fSAndroid Build Coastguard Worker }
878*3ac0a46fSAndroid Build Coastguard Worker 
get_mouse_y(CJS_Runtime * pRuntime)879*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_Document::get_mouse_y(CJS_Runtime* pRuntime) {
880*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Success();
881*3ac0a46fSAndroid Build Coastguard Worker }
882*3ac0a46fSAndroid Build Coastguard Worker 
set_mouse_y(CJS_Runtime * pRuntime,v8::Local<v8::Value> vp)883*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_Document::set_mouse_y(CJS_Runtime* pRuntime,
884*3ac0a46fSAndroid Build Coastguard Worker                                      v8::Local<v8::Value> vp) {
885*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Success();
886*3ac0a46fSAndroid Build Coastguard Worker }
887*3ac0a46fSAndroid Build Coastguard Worker 
get_URL(CJS_Runtime * pRuntime)888*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_Document::get_URL(CJS_Runtime* pRuntime) {
889*3ac0a46fSAndroid Build Coastguard Worker   if (!m_pFormFillEnv)
890*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kBadObjectError);
891*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Success(
892*3ac0a46fSAndroid Build Coastguard Worker       pRuntime->NewString(m_pFormFillEnv->JS_docGetFilePath().AsStringView()));
893*3ac0a46fSAndroid Build Coastguard Worker }
894*3ac0a46fSAndroid Build Coastguard Worker 
set_URL(CJS_Runtime * pRuntime,v8::Local<v8::Value> vp)895*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_Document::set_URL(CJS_Runtime* pRuntime,
896*3ac0a46fSAndroid Build Coastguard Worker                                  v8::Local<v8::Value> vp) {
897*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Failure(JSMessage::kReadOnlyError);
898*3ac0a46fSAndroid Build Coastguard Worker }
899*3ac0a46fSAndroid Build Coastguard Worker 
get_base_URL(CJS_Runtime * pRuntime)900*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_Document::get_base_URL(CJS_Runtime* pRuntime) {
901*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Success(pRuntime->NewString(m_cwBaseURL.AsStringView()));
902*3ac0a46fSAndroid Build Coastguard Worker }
903*3ac0a46fSAndroid Build Coastguard Worker 
set_base_URL(CJS_Runtime * pRuntime,v8::Local<v8::Value> vp)904*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_Document::set_base_URL(CJS_Runtime* pRuntime,
905*3ac0a46fSAndroid Build Coastguard Worker                                       v8::Local<v8::Value> vp) {
906*3ac0a46fSAndroid Build Coastguard Worker   m_cwBaseURL = pRuntime->ToWideString(vp);
907*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Success();
908*3ac0a46fSAndroid Build Coastguard Worker }
909*3ac0a46fSAndroid Build Coastguard Worker 
get_calculate(CJS_Runtime * pRuntime)910*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_Document::get_calculate(CJS_Runtime* pRuntime) {
911*3ac0a46fSAndroid Build Coastguard Worker   if (!m_pFormFillEnv)
912*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kBadObjectError);
913*3ac0a46fSAndroid Build Coastguard Worker 
914*3ac0a46fSAndroid Build Coastguard Worker   CPDFSDK_InteractiveForm* pInteractiveForm = GetSDKInteractiveForm();
915*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Success(
916*3ac0a46fSAndroid Build Coastguard Worker       pRuntime->NewBoolean(!!pInteractiveForm->IsCalculateEnabled()));
917*3ac0a46fSAndroid Build Coastguard Worker }
918*3ac0a46fSAndroid Build Coastguard Worker 
set_calculate(CJS_Runtime * pRuntime,v8::Local<v8::Value> vp)919*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_Document::set_calculate(CJS_Runtime* pRuntime,
920*3ac0a46fSAndroid Build Coastguard Worker                                        v8::Local<v8::Value> vp) {
921*3ac0a46fSAndroid Build Coastguard Worker   if (!m_pFormFillEnv)
922*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kBadObjectError);
923*3ac0a46fSAndroid Build Coastguard Worker 
924*3ac0a46fSAndroid Build Coastguard Worker   CPDFSDK_InteractiveForm* pInteractiveForm = GetSDKInteractiveForm();
925*3ac0a46fSAndroid Build Coastguard Worker   pInteractiveForm->EnableCalculate(pRuntime->ToBoolean(vp));
926*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Success();
927*3ac0a46fSAndroid Build Coastguard Worker }
928*3ac0a46fSAndroid Build Coastguard Worker 
get_document_file_name(CJS_Runtime * pRuntime)929*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_Document::get_document_file_name(CJS_Runtime* pRuntime) {
930*3ac0a46fSAndroid Build Coastguard Worker   if (!m_pFormFillEnv)
931*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kBadObjectError);
932*3ac0a46fSAndroid Build Coastguard Worker 
933*3ac0a46fSAndroid Build Coastguard Worker   WideString wsFilePath = m_pFormFillEnv->JS_docGetFilePath();
934*3ac0a46fSAndroid Build Coastguard Worker   size_t i = wsFilePath.GetLength();
935*3ac0a46fSAndroid Build Coastguard Worker   for (; i > 0; i--) {
936*3ac0a46fSAndroid Build Coastguard Worker     if (wsFilePath[i - 1] == L'\\' || wsFilePath[i - 1] == L'/')
937*3ac0a46fSAndroid Build Coastguard Worker       break;
938*3ac0a46fSAndroid Build Coastguard Worker   }
939*3ac0a46fSAndroid Build Coastguard Worker   if (i > 0 && i < wsFilePath.GetLength()) {
940*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Success(
941*3ac0a46fSAndroid Build Coastguard Worker         pRuntime->NewString(wsFilePath.AsStringView().Substr(i)));
942*3ac0a46fSAndroid Build Coastguard Worker   }
943*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Success(pRuntime->NewString(""));
944*3ac0a46fSAndroid Build Coastguard Worker }
945*3ac0a46fSAndroid Build Coastguard Worker 
set_document_file_name(CJS_Runtime * pRuntime,v8::Local<v8::Value> vp)946*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_Document::set_document_file_name(CJS_Runtime* pRuntime,
947*3ac0a46fSAndroid Build Coastguard Worker                                                 v8::Local<v8::Value> vp) {
948*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Failure(JSMessage::kReadOnlyError);
949*3ac0a46fSAndroid Build Coastguard Worker }
950*3ac0a46fSAndroid Build Coastguard Worker 
get_path(CJS_Runtime * pRuntime)951*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_Document::get_path(CJS_Runtime* pRuntime) {
952*3ac0a46fSAndroid Build Coastguard Worker   if (!m_pFormFillEnv)
953*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kBadObjectError);
954*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Success(pRuntime->NewString(
955*3ac0a46fSAndroid Build Coastguard Worker       CJS_App::SysPathToPDFPath(m_pFormFillEnv->JS_docGetFilePath())
956*3ac0a46fSAndroid Build Coastguard Worker           .AsStringView()));
957*3ac0a46fSAndroid Build Coastguard Worker }
958*3ac0a46fSAndroid Build Coastguard Worker 
set_path(CJS_Runtime * pRuntime,v8::Local<v8::Value> vp)959*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_Document::set_path(CJS_Runtime* pRuntime,
960*3ac0a46fSAndroid Build Coastguard Worker                                   v8::Local<v8::Value> vp) {
961*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Failure(JSMessage::kReadOnlyError);
962*3ac0a46fSAndroid Build Coastguard Worker }
963*3ac0a46fSAndroid Build Coastguard Worker 
get_page_window_rect(CJS_Runtime * pRuntime)964*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_Document::get_page_window_rect(CJS_Runtime* pRuntime) {
965*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Success();
966*3ac0a46fSAndroid Build Coastguard Worker }
967*3ac0a46fSAndroid Build Coastguard Worker 
set_page_window_rect(CJS_Runtime * pRuntime,v8::Local<v8::Value> vp)968*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_Document::set_page_window_rect(CJS_Runtime* pRuntime,
969*3ac0a46fSAndroid Build Coastguard Worker                                               v8::Local<v8::Value> vp) {
970*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Success();
971*3ac0a46fSAndroid Build Coastguard Worker }
972*3ac0a46fSAndroid Build Coastguard Worker 
get_layout(CJS_Runtime * pRuntime)973*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_Document::get_layout(CJS_Runtime* pRuntime) {
974*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Success();
975*3ac0a46fSAndroid Build Coastguard Worker }
976*3ac0a46fSAndroid Build Coastguard Worker 
set_layout(CJS_Runtime * pRuntime,v8::Local<v8::Value> vp)977*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_Document::set_layout(CJS_Runtime* pRuntime,
978*3ac0a46fSAndroid Build Coastguard Worker                                     v8::Local<v8::Value> vp) {
979*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Success();
980*3ac0a46fSAndroid Build Coastguard Worker }
981*3ac0a46fSAndroid Build Coastguard Worker 
addLink(CJS_Runtime * pRuntime,const std::vector<v8::Local<v8::Value>> & params)982*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_Document::addLink(
983*3ac0a46fSAndroid Build Coastguard Worker     CJS_Runtime* pRuntime,
984*3ac0a46fSAndroid Build Coastguard Worker     const std::vector<v8::Local<v8::Value>>& params) {
985*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Success();
986*3ac0a46fSAndroid Build Coastguard Worker }
987*3ac0a46fSAndroid Build Coastguard Worker 
closeDoc(CJS_Runtime * pRuntime,const std::vector<v8::Local<v8::Value>> & params)988*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_Document::closeDoc(
989*3ac0a46fSAndroid Build Coastguard Worker     CJS_Runtime* pRuntime,
990*3ac0a46fSAndroid Build Coastguard Worker     const std::vector<v8::Local<v8::Value>>& params) {
991*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Success();
992*3ac0a46fSAndroid Build Coastguard Worker }
993*3ac0a46fSAndroid Build Coastguard Worker 
getPageBox(CJS_Runtime * pRuntime,const std::vector<v8::Local<v8::Value>> & params)994*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_Document::getPageBox(
995*3ac0a46fSAndroid Build Coastguard Worker     CJS_Runtime* pRuntime,
996*3ac0a46fSAndroid Build Coastguard Worker     const std::vector<v8::Local<v8::Value>>& params) {
997*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Success();
998*3ac0a46fSAndroid Build Coastguard Worker }
999*3ac0a46fSAndroid Build Coastguard Worker 
getAnnot(CJS_Runtime * pRuntime,const std::vector<v8::Local<v8::Value>> & params)1000*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_Document::getAnnot(
1001*3ac0a46fSAndroid Build Coastguard Worker     CJS_Runtime* pRuntime,
1002*3ac0a46fSAndroid Build Coastguard Worker     const std::vector<v8::Local<v8::Value>>& params) {
1003*3ac0a46fSAndroid Build Coastguard Worker   if (params.size() != 2)
1004*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kParamError);
1005*3ac0a46fSAndroid Build Coastguard Worker   if (!m_pFormFillEnv)
1006*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kBadObjectError);
1007*3ac0a46fSAndroid Build Coastguard Worker 
1008*3ac0a46fSAndroid Build Coastguard Worker   int nPageNo = pRuntime->ToInt32(params[0]);
1009*3ac0a46fSAndroid Build Coastguard Worker   WideString swAnnotName = pRuntime->ToWideString(params[1]);
1010*3ac0a46fSAndroid Build Coastguard Worker   CPDFSDK_PageView* pPageView = m_pFormFillEnv->GetPageViewAtIndex(nPageNo);
1011*3ac0a46fSAndroid Build Coastguard Worker   if (!pPageView)
1012*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kBadObjectError);
1013*3ac0a46fSAndroid Build Coastguard Worker 
1014*3ac0a46fSAndroid Build Coastguard Worker   CPDFSDK_AnnotIteration annot_iteration(pPageView);
1015*3ac0a46fSAndroid Build Coastguard Worker   CPDFSDK_BAAnnot* pSDKBAAnnot = nullptr;
1016*3ac0a46fSAndroid Build Coastguard Worker   for (const auto& pSDKAnnotCur : annot_iteration) {
1017*3ac0a46fSAndroid Build Coastguard Worker     auto* pBAAnnot = pSDKAnnotCur->AsBAAnnot();
1018*3ac0a46fSAndroid Build Coastguard Worker     if (pBAAnnot && pBAAnnot->GetAnnotName() == swAnnotName) {
1019*3ac0a46fSAndroid Build Coastguard Worker       pSDKBAAnnot = pBAAnnot;
1020*3ac0a46fSAndroid Build Coastguard Worker       break;
1021*3ac0a46fSAndroid Build Coastguard Worker     }
1022*3ac0a46fSAndroid Build Coastguard Worker   }
1023*3ac0a46fSAndroid Build Coastguard Worker   if (!pSDKBAAnnot)
1024*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kBadObjectError);
1025*3ac0a46fSAndroid Build Coastguard Worker 
1026*3ac0a46fSAndroid Build Coastguard Worker   v8::Local<v8::Object> pObj = pRuntime->NewFXJSBoundObject(
1027*3ac0a46fSAndroid Build Coastguard Worker       CJS_Annot::GetObjDefnID(), FXJSOBJTYPE_DYNAMIC);
1028*3ac0a46fSAndroid Build Coastguard Worker   if (pObj.IsEmpty())
1029*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kBadObjectError);
1030*3ac0a46fSAndroid Build Coastguard Worker 
1031*3ac0a46fSAndroid Build Coastguard Worker   auto* pJS_Annot = static_cast<CJS_Annot*>(
1032*3ac0a46fSAndroid Build Coastguard Worker       CFXJS_Engine::GetObjectPrivate(pRuntime->GetIsolate(), pObj));
1033*3ac0a46fSAndroid Build Coastguard Worker   if (!pJS_Annot)
1034*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kBadObjectError);
1035*3ac0a46fSAndroid Build Coastguard Worker 
1036*3ac0a46fSAndroid Build Coastguard Worker   pJS_Annot->SetSDKAnnot(pSDKBAAnnot);
1037*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Success(pJS_Annot->ToV8Object());
1038*3ac0a46fSAndroid Build Coastguard Worker }
1039*3ac0a46fSAndroid Build Coastguard Worker 
getAnnots(CJS_Runtime * pRuntime,const std::vector<v8::Local<v8::Value>> & params)1040*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_Document::getAnnots(
1041*3ac0a46fSAndroid Build Coastguard Worker     CJS_Runtime* pRuntime,
1042*3ac0a46fSAndroid Build Coastguard Worker     const std::vector<v8::Local<v8::Value>>& params) {
1043*3ac0a46fSAndroid Build Coastguard Worker   if (!m_pFormFillEnv)
1044*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kBadObjectError);
1045*3ac0a46fSAndroid Build Coastguard Worker 
1046*3ac0a46fSAndroid Build Coastguard Worker   // TODO(tonikitoo): Add support supported parameters as per
1047*3ac0a46fSAndroid Build Coastguard Worker   // the PDF spec.
1048*3ac0a46fSAndroid Build Coastguard Worker 
1049*3ac0a46fSAndroid Build Coastguard Worker   int nPageNo = m_pFormFillEnv->GetPageCount();
1050*3ac0a46fSAndroid Build Coastguard Worker   v8::Local<v8::Array> annots = pRuntime->NewArray();
1051*3ac0a46fSAndroid Build Coastguard Worker   for (int i = 0; i < nPageNo; ++i) {
1052*3ac0a46fSAndroid Build Coastguard Worker     CPDFSDK_PageView* pPageView = m_pFormFillEnv->GetPageViewAtIndex(i);
1053*3ac0a46fSAndroid Build Coastguard Worker     if (!pPageView)
1054*3ac0a46fSAndroid Build Coastguard Worker       return CJS_Result::Failure(JSMessage::kBadObjectError);
1055*3ac0a46fSAndroid Build Coastguard Worker 
1056*3ac0a46fSAndroid Build Coastguard Worker     CPDFSDK_AnnotIteration annot_iteration(pPageView);
1057*3ac0a46fSAndroid Build Coastguard Worker     for (const auto& pSDKAnnotCur : annot_iteration) {
1058*3ac0a46fSAndroid Build Coastguard Worker       if (!pSDKAnnotCur)
1059*3ac0a46fSAndroid Build Coastguard Worker         return CJS_Result::Failure(JSMessage::kBadObjectError);
1060*3ac0a46fSAndroid Build Coastguard Worker 
1061*3ac0a46fSAndroid Build Coastguard Worker       v8::Local<v8::Object> pObj = pRuntime->NewFXJSBoundObject(
1062*3ac0a46fSAndroid Build Coastguard Worker           CJS_Annot::GetObjDefnID(), FXJSOBJTYPE_DYNAMIC);
1063*3ac0a46fSAndroid Build Coastguard Worker       if (pObj.IsEmpty())
1064*3ac0a46fSAndroid Build Coastguard Worker         return CJS_Result::Failure(JSMessage::kBadObjectError);
1065*3ac0a46fSAndroid Build Coastguard Worker 
1066*3ac0a46fSAndroid Build Coastguard Worker       auto* pJS_Annot = static_cast<CJS_Annot*>(
1067*3ac0a46fSAndroid Build Coastguard Worker           CFXJS_Engine::GetObjectPrivate(pRuntime->GetIsolate(), pObj));
1068*3ac0a46fSAndroid Build Coastguard Worker       pJS_Annot->SetSDKAnnot(pSDKAnnotCur->AsBAAnnot());
1069*3ac0a46fSAndroid Build Coastguard Worker       pRuntime->PutArrayElement(
1070*3ac0a46fSAndroid Build Coastguard Worker           annots, i,
1071*3ac0a46fSAndroid Build Coastguard Worker           pJS_Annot ? v8::Local<v8::Value>(pJS_Annot->ToV8Object())
1072*3ac0a46fSAndroid Build Coastguard Worker                     : v8::Local<v8::Value>());
1073*3ac0a46fSAndroid Build Coastguard Worker     }
1074*3ac0a46fSAndroid Build Coastguard Worker   }
1075*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Success(annots);
1076*3ac0a46fSAndroid Build Coastguard Worker }
1077*3ac0a46fSAndroid Build Coastguard Worker 
getAnnot3D(CJS_Runtime * pRuntime,const std::vector<v8::Local<v8::Value>> & params)1078*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_Document::getAnnot3D(
1079*3ac0a46fSAndroid Build Coastguard Worker     CJS_Runtime* pRuntime,
1080*3ac0a46fSAndroid Build Coastguard Worker     const std::vector<v8::Local<v8::Value>>& params) {
1081*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Success(pRuntime->NewUndefined());
1082*3ac0a46fSAndroid Build Coastguard Worker }
1083*3ac0a46fSAndroid Build Coastguard Worker 
getAnnots3D(CJS_Runtime * pRuntime,const std::vector<v8::Local<v8::Value>> & params)1084*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_Document::getAnnots3D(
1085*3ac0a46fSAndroid Build Coastguard Worker     CJS_Runtime* pRuntime,
1086*3ac0a46fSAndroid Build Coastguard Worker     const std::vector<v8::Local<v8::Value>>& params) {
1087*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Success();
1088*3ac0a46fSAndroid Build Coastguard Worker }
1089*3ac0a46fSAndroid Build Coastguard Worker 
getOCGs(CJS_Runtime * pRuntime,const std::vector<v8::Local<v8::Value>> & params)1090*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_Document::getOCGs(
1091*3ac0a46fSAndroid Build Coastguard Worker     CJS_Runtime* pRuntime,
1092*3ac0a46fSAndroid Build Coastguard Worker     const std::vector<v8::Local<v8::Value>>& params) {
1093*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Success();
1094*3ac0a46fSAndroid Build Coastguard Worker }
1095*3ac0a46fSAndroid Build Coastguard Worker 
getLinks(CJS_Runtime * pRuntime,const std::vector<v8::Local<v8::Value>> & params)1096*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_Document::getLinks(
1097*3ac0a46fSAndroid Build Coastguard Worker     CJS_Runtime* pRuntime,
1098*3ac0a46fSAndroid Build Coastguard Worker     const std::vector<v8::Local<v8::Value>>& params) {
1099*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Success();
1100*3ac0a46fSAndroid Build Coastguard Worker }
1101*3ac0a46fSAndroid Build Coastguard Worker 
addIcon(CJS_Runtime * pRuntime,const std::vector<v8::Local<v8::Value>> & params)1102*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_Document::addIcon(
1103*3ac0a46fSAndroid Build Coastguard Worker     CJS_Runtime* pRuntime,
1104*3ac0a46fSAndroid Build Coastguard Worker     const std::vector<v8::Local<v8::Value>>& params) {
1105*3ac0a46fSAndroid Build Coastguard Worker   if (params.size() != 2)
1106*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kParamError);
1107*3ac0a46fSAndroid Build Coastguard Worker 
1108*3ac0a46fSAndroid Build Coastguard Worker   if (!params[1]->IsObject())
1109*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kTypeError);
1110*3ac0a46fSAndroid Build Coastguard Worker 
1111*3ac0a46fSAndroid Build Coastguard Worker   v8::Local<v8::Object> pObj = pRuntime->ToObject(params[1]);
1112*3ac0a46fSAndroid Build Coastguard Worker   if (!JSGetObject<CJS_Icon>(pRuntime->GetIsolate(), pObj))
1113*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kTypeError);
1114*3ac0a46fSAndroid Build Coastguard Worker 
1115*3ac0a46fSAndroid Build Coastguard Worker   WideString swIconName = pRuntime->ToWideString(params[0]);
1116*3ac0a46fSAndroid Build Coastguard Worker   m_IconNames.push_back(swIconName);
1117*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Success();
1118*3ac0a46fSAndroid Build Coastguard Worker }
1119*3ac0a46fSAndroid Build Coastguard Worker 
get_icons(CJS_Runtime * pRuntime)1120*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_Document::get_icons(CJS_Runtime* pRuntime) {
1121*3ac0a46fSAndroid Build Coastguard Worker   // TODO(tsepez): Maybe make consistent with Acrobat Reader behavior which
1122*3ac0a46fSAndroid Build Coastguard Worker   // is to throw an exception under the default security settings.
1123*3ac0a46fSAndroid Build Coastguard Worker   if (m_IconNames.empty())
1124*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Success(pRuntime->NewUndefined());
1125*3ac0a46fSAndroid Build Coastguard Worker 
1126*3ac0a46fSAndroid Build Coastguard Worker   v8::Local<v8::Array> Icons = pRuntime->NewArray();
1127*3ac0a46fSAndroid Build Coastguard Worker   int i = 0;
1128*3ac0a46fSAndroid Build Coastguard Worker   for (const auto& name : m_IconNames) {
1129*3ac0a46fSAndroid Build Coastguard Worker     v8::Local<v8::Object> pObj = pRuntime->NewFXJSBoundObject(
1130*3ac0a46fSAndroid Build Coastguard Worker         CJS_Icon::GetObjDefnID(), FXJSOBJTYPE_DYNAMIC);
1131*3ac0a46fSAndroid Build Coastguard Worker     if (pObj.IsEmpty())
1132*3ac0a46fSAndroid Build Coastguard Worker       return CJS_Result::Failure(JSMessage::kBadObjectError);
1133*3ac0a46fSAndroid Build Coastguard Worker 
1134*3ac0a46fSAndroid Build Coastguard Worker     auto* pJS_Icon = static_cast<CJS_Icon*>(
1135*3ac0a46fSAndroid Build Coastguard Worker         CFXJS_Engine::GetObjectPrivate(pRuntime->GetIsolate(), pObj));
1136*3ac0a46fSAndroid Build Coastguard Worker     pJS_Icon->SetIconName(name);
1137*3ac0a46fSAndroid Build Coastguard Worker     pRuntime->PutArrayElement(Icons, i++,
1138*3ac0a46fSAndroid Build Coastguard Worker                               pJS_Icon
1139*3ac0a46fSAndroid Build Coastguard Worker                                   ? v8::Local<v8::Value>(pJS_Icon->ToV8Object())
1140*3ac0a46fSAndroid Build Coastguard Worker                                   : v8::Local<v8::Value>());
1141*3ac0a46fSAndroid Build Coastguard Worker   }
1142*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Success(Icons);
1143*3ac0a46fSAndroid Build Coastguard Worker }
1144*3ac0a46fSAndroid Build Coastguard Worker 
set_icons(CJS_Runtime * pRuntime,v8::Local<v8::Value> vp)1145*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_Document::set_icons(CJS_Runtime* pRuntime,
1146*3ac0a46fSAndroid Build Coastguard Worker                                    v8::Local<v8::Value> vp) {
1147*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Failure(JSMessage::kReadOnlyError);
1148*3ac0a46fSAndroid Build Coastguard Worker }
1149*3ac0a46fSAndroid Build Coastguard Worker 
getIcon(CJS_Runtime * pRuntime,const std::vector<v8::Local<v8::Value>> & params)1150*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_Document::getIcon(
1151*3ac0a46fSAndroid Build Coastguard Worker     CJS_Runtime* pRuntime,
1152*3ac0a46fSAndroid Build Coastguard Worker     const std::vector<v8::Local<v8::Value>>& params) {
1153*3ac0a46fSAndroid Build Coastguard Worker   if (params.size() != 1)
1154*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kParamError);
1155*3ac0a46fSAndroid Build Coastguard Worker 
1156*3ac0a46fSAndroid Build Coastguard Worker   WideString swIconName = pRuntime->ToWideString(params[0]);
1157*3ac0a46fSAndroid Build Coastguard Worker   auto it = std::find(m_IconNames.begin(), m_IconNames.end(), swIconName);
1158*3ac0a46fSAndroid Build Coastguard Worker   if (it == m_IconNames.end())
1159*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kBadObjectError);
1160*3ac0a46fSAndroid Build Coastguard Worker 
1161*3ac0a46fSAndroid Build Coastguard Worker   v8::Local<v8::Object> pObj = pRuntime->NewFXJSBoundObject(
1162*3ac0a46fSAndroid Build Coastguard Worker       CJS_Icon::GetObjDefnID(), FXJSOBJTYPE_DYNAMIC);
1163*3ac0a46fSAndroid Build Coastguard Worker   if (pObj.IsEmpty())
1164*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kBadObjectError);
1165*3ac0a46fSAndroid Build Coastguard Worker 
1166*3ac0a46fSAndroid Build Coastguard Worker   auto* pJSIcon = static_cast<CJS_Icon*>(
1167*3ac0a46fSAndroid Build Coastguard Worker       CFXJS_Engine::GetObjectPrivate(pRuntime->GetIsolate(), pObj));
1168*3ac0a46fSAndroid Build Coastguard Worker   if (!pJSIcon)
1169*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kBadObjectError);
1170*3ac0a46fSAndroid Build Coastguard Worker 
1171*3ac0a46fSAndroid Build Coastguard Worker   pJSIcon->SetIconName(*it);
1172*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Success(pJSIcon->ToV8Object());
1173*3ac0a46fSAndroid Build Coastguard Worker }
1174*3ac0a46fSAndroid Build Coastguard Worker 
removeIcon(CJS_Runtime * pRuntime,const std::vector<v8::Local<v8::Value>> & params)1175*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_Document::removeIcon(
1176*3ac0a46fSAndroid Build Coastguard Worker     CJS_Runtime* pRuntime,
1177*3ac0a46fSAndroid Build Coastguard Worker     const std::vector<v8::Local<v8::Value>>& params) {
1178*3ac0a46fSAndroid Build Coastguard Worker   // Unsafe, no supported.
1179*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Success();
1180*3ac0a46fSAndroid Build Coastguard Worker }
1181*3ac0a46fSAndroid Build Coastguard Worker 
createDataObject(CJS_Runtime * pRuntime,const std::vector<v8::Local<v8::Value>> & params)1182*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_Document::createDataObject(
1183*3ac0a46fSAndroid Build Coastguard Worker     CJS_Runtime* pRuntime,
1184*3ac0a46fSAndroid Build Coastguard Worker     const std::vector<v8::Local<v8::Value>>& params) {
1185*3ac0a46fSAndroid Build Coastguard Worker   // Unsafe, not implemented.
1186*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Success();
1187*3ac0a46fSAndroid Build Coastguard Worker }
1188*3ac0a46fSAndroid Build Coastguard Worker 
get_media(CJS_Runtime * pRuntime)1189*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_Document::get_media(CJS_Runtime* pRuntime) {
1190*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Success();
1191*3ac0a46fSAndroid Build Coastguard Worker }
1192*3ac0a46fSAndroid Build Coastguard Worker 
set_media(CJS_Runtime * pRuntime,v8::Local<v8::Value> vp)1193*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_Document::set_media(CJS_Runtime* pRuntime,
1194*3ac0a46fSAndroid Build Coastguard Worker                                    v8::Local<v8::Value> vp) {
1195*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Success();
1196*3ac0a46fSAndroid Build Coastguard Worker }
1197*3ac0a46fSAndroid Build Coastguard Worker 
calculateNow(CJS_Runtime * pRuntime,const std::vector<v8::Local<v8::Value>> & params)1198*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_Document::calculateNow(
1199*3ac0a46fSAndroid Build Coastguard Worker     CJS_Runtime* pRuntime,
1200*3ac0a46fSAndroid Build Coastguard Worker     const std::vector<v8::Local<v8::Value>>& params) {
1201*3ac0a46fSAndroid Build Coastguard Worker   if (!m_pFormFillEnv)
1202*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kBadObjectError);
1203*3ac0a46fSAndroid Build Coastguard Worker 
1204*3ac0a46fSAndroid Build Coastguard Worker   if (!m_pFormFillEnv->HasPermissions(
1205*3ac0a46fSAndroid Build Coastguard Worker           pdfium::access_permissions::kModifyContent |
1206*3ac0a46fSAndroid Build Coastguard Worker           pdfium::access_permissions::kModifyAnnotation |
1207*3ac0a46fSAndroid Build Coastguard Worker           pdfium::access_permissions::kFillForm)) {
1208*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kPermissionError);
1209*3ac0a46fSAndroid Build Coastguard Worker   }
1210*3ac0a46fSAndroid Build Coastguard Worker 
1211*3ac0a46fSAndroid Build Coastguard Worker   GetSDKInteractiveForm()->OnCalculate(nullptr);
1212*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Success();
1213*3ac0a46fSAndroid Build Coastguard Worker }
1214*3ac0a46fSAndroid Build Coastguard Worker 
get_collab(CJS_Runtime * pRuntime)1215*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_Document::get_collab(CJS_Runtime* pRuntime) {
1216*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Success();
1217*3ac0a46fSAndroid Build Coastguard Worker }
1218*3ac0a46fSAndroid Build Coastguard Worker 
set_collab(CJS_Runtime * pRuntime,v8::Local<v8::Value> vp)1219*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_Document::set_collab(CJS_Runtime* pRuntime,
1220*3ac0a46fSAndroid Build Coastguard Worker                                     v8::Local<v8::Value> vp) {
1221*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Success();
1222*3ac0a46fSAndroid Build Coastguard Worker }
1223*3ac0a46fSAndroid Build Coastguard Worker 
getPageNthWord(CJS_Runtime * pRuntime,const std::vector<v8::Local<v8::Value>> & params)1224*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_Document::getPageNthWord(
1225*3ac0a46fSAndroid Build Coastguard Worker     CJS_Runtime* pRuntime,
1226*3ac0a46fSAndroid Build Coastguard Worker     const std::vector<v8::Local<v8::Value>>& params) {
1227*3ac0a46fSAndroid Build Coastguard Worker   if (!m_pFormFillEnv)
1228*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kBadObjectError);
1229*3ac0a46fSAndroid Build Coastguard Worker 
1230*3ac0a46fSAndroid Build Coastguard Worker   using pdfium::access_permissions::kExtractForAccessibility;
1231*3ac0a46fSAndroid Build Coastguard Worker   if (!m_pFormFillEnv->HasPermissions(kExtractForAccessibility))
1232*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kPermissionError);
1233*3ac0a46fSAndroid Build Coastguard Worker 
1234*3ac0a46fSAndroid Build Coastguard Worker   // TODO(tsepez): check maximum allowable params.
1235*3ac0a46fSAndroid Build Coastguard Worker 
1236*3ac0a46fSAndroid Build Coastguard Worker   int nPageNo = params.size() > 0 ? pRuntime->ToInt32(params[0]) : 0;
1237*3ac0a46fSAndroid Build Coastguard Worker   int nWordNo = params.size() > 1 ? pRuntime->ToInt32(params[1]) : 0;
1238*3ac0a46fSAndroid Build Coastguard Worker   bool bStrip = params.size() > 2 ? pRuntime->ToBoolean(params[2]) : true;
1239*3ac0a46fSAndroid Build Coastguard Worker 
1240*3ac0a46fSAndroid Build Coastguard Worker   CPDF_Document* pDocument = m_pFormFillEnv->GetPDFDocument();
1241*3ac0a46fSAndroid Build Coastguard Worker   if (nPageNo < 0 || nPageNo >= pDocument->GetPageCount())
1242*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kValueError);
1243*3ac0a46fSAndroid Build Coastguard Worker 
1244*3ac0a46fSAndroid Build Coastguard Worker   RetainPtr<CPDF_Dictionary> pPageDict =
1245*3ac0a46fSAndroid Build Coastguard Worker       pDocument->GetMutablePageDictionary(nPageNo);
1246*3ac0a46fSAndroid Build Coastguard Worker   if (!pPageDict)
1247*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kBadObjectError);
1248*3ac0a46fSAndroid Build Coastguard Worker 
1249*3ac0a46fSAndroid Build Coastguard Worker   auto page = pdfium::MakeRetain<CPDF_Page>(pDocument, std::move(pPageDict));
1250*3ac0a46fSAndroid Build Coastguard Worker   page->AddPageImageCache();
1251*3ac0a46fSAndroid Build Coastguard Worker   page->ParseContent();
1252*3ac0a46fSAndroid Build Coastguard Worker 
1253*3ac0a46fSAndroid Build Coastguard Worker   int nWords = 0;
1254*3ac0a46fSAndroid Build Coastguard Worker   WideString swRet;
1255*3ac0a46fSAndroid Build Coastguard Worker   for (auto& pPageObj : *page) {
1256*3ac0a46fSAndroid Build Coastguard Worker     if (pPageObj->IsText()) {
1257*3ac0a46fSAndroid Build Coastguard Worker       CPDF_TextObject* pTextObj = pPageObj->AsText();
1258*3ac0a46fSAndroid Build Coastguard Worker       int nObjWords = pTextObj->CountWords();
1259*3ac0a46fSAndroid Build Coastguard Worker       if (nWords + nObjWords >= nWordNo) {
1260*3ac0a46fSAndroid Build Coastguard Worker         swRet = pTextObj->GetWordString(nWordNo - nWords);
1261*3ac0a46fSAndroid Build Coastguard Worker         break;
1262*3ac0a46fSAndroid Build Coastguard Worker       }
1263*3ac0a46fSAndroid Build Coastguard Worker       nWords += nObjWords;
1264*3ac0a46fSAndroid Build Coastguard Worker     }
1265*3ac0a46fSAndroid Build Coastguard Worker   }
1266*3ac0a46fSAndroid Build Coastguard Worker 
1267*3ac0a46fSAndroid Build Coastguard Worker   if (bStrip)
1268*3ac0a46fSAndroid Build Coastguard Worker     swRet.Trim();
1269*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Success(pRuntime->NewString(swRet.AsStringView()));
1270*3ac0a46fSAndroid Build Coastguard Worker }
1271*3ac0a46fSAndroid Build Coastguard Worker 
getPageNthWordQuads(CJS_Runtime * pRuntime,const std::vector<v8::Local<v8::Value>> & params)1272*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_Document::getPageNthWordQuads(
1273*3ac0a46fSAndroid Build Coastguard Worker     CJS_Runtime* pRuntime,
1274*3ac0a46fSAndroid Build Coastguard Worker     const std::vector<v8::Local<v8::Value>>& params) {
1275*3ac0a46fSAndroid Build Coastguard Worker   if (!m_pFormFillEnv)
1276*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kBadObjectError);
1277*3ac0a46fSAndroid Build Coastguard Worker 
1278*3ac0a46fSAndroid Build Coastguard Worker   using pdfium::access_permissions::kExtractForAccessibility;
1279*3ac0a46fSAndroid Build Coastguard Worker   if (!m_pFormFillEnv->HasPermissions(kExtractForAccessibility))
1280*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kBadObjectError);
1281*3ac0a46fSAndroid Build Coastguard Worker 
1282*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Failure(JSMessage::kNotSupportedError);
1283*3ac0a46fSAndroid Build Coastguard Worker }
1284*3ac0a46fSAndroid Build Coastguard Worker 
getPageNumWords(CJS_Runtime * pRuntime,const std::vector<v8::Local<v8::Value>> & params)1285*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_Document::getPageNumWords(
1286*3ac0a46fSAndroid Build Coastguard Worker     CJS_Runtime* pRuntime,
1287*3ac0a46fSAndroid Build Coastguard Worker     const std::vector<v8::Local<v8::Value>>& params) {
1288*3ac0a46fSAndroid Build Coastguard Worker   if (!m_pFormFillEnv)
1289*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kBadObjectError);
1290*3ac0a46fSAndroid Build Coastguard Worker 
1291*3ac0a46fSAndroid Build Coastguard Worker   using pdfium::access_permissions::kExtractForAccessibility;
1292*3ac0a46fSAndroid Build Coastguard Worker   if (!m_pFormFillEnv->HasPermissions(kExtractForAccessibility))
1293*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kPermissionError);
1294*3ac0a46fSAndroid Build Coastguard Worker 
1295*3ac0a46fSAndroid Build Coastguard Worker   int nPageNo = params.size() > 0 ? pRuntime->ToInt32(params[0]) : 0;
1296*3ac0a46fSAndroid Build Coastguard Worker   CPDF_Document* pDocument = m_pFormFillEnv->GetPDFDocument();
1297*3ac0a46fSAndroid Build Coastguard Worker   if (nPageNo < 0 || nPageNo >= pDocument->GetPageCount())
1298*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kValueError);
1299*3ac0a46fSAndroid Build Coastguard Worker 
1300*3ac0a46fSAndroid Build Coastguard Worker   RetainPtr<CPDF_Dictionary> pPageDict =
1301*3ac0a46fSAndroid Build Coastguard Worker       pDocument->GetMutablePageDictionary(nPageNo);
1302*3ac0a46fSAndroid Build Coastguard Worker   if (!pPageDict)
1303*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kBadObjectError);
1304*3ac0a46fSAndroid Build Coastguard Worker 
1305*3ac0a46fSAndroid Build Coastguard Worker   auto page = pdfium::MakeRetain<CPDF_Page>(pDocument, std::move(pPageDict));
1306*3ac0a46fSAndroid Build Coastguard Worker   page->AddPageImageCache();
1307*3ac0a46fSAndroid Build Coastguard Worker   page->ParseContent();
1308*3ac0a46fSAndroid Build Coastguard Worker 
1309*3ac0a46fSAndroid Build Coastguard Worker   int nWords = 0;
1310*3ac0a46fSAndroid Build Coastguard Worker   for (auto& pPageObj : *page) {
1311*3ac0a46fSAndroid Build Coastguard Worker     if (pPageObj->IsText())
1312*3ac0a46fSAndroid Build Coastguard Worker       nWords += pPageObj->AsText()->CountWords();
1313*3ac0a46fSAndroid Build Coastguard Worker   }
1314*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Success(pRuntime->NewNumber(nWords));
1315*3ac0a46fSAndroid Build Coastguard Worker }
1316*3ac0a46fSAndroid Build Coastguard Worker 
getPrintParams(CJS_Runtime * pRuntime,const std::vector<v8::Local<v8::Value>> & params)1317*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_Document::getPrintParams(
1318*3ac0a46fSAndroid Build Coastguard Worker     CJS_Runtime* pRuntime,
1319*3ac0a46fSAndroid Build Coastguard Worker     const std::vector<v8::Local<v8::Value>>& params) {
1320*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Failure(JSMessage::kNotSupportedError);
1321*3ac0a46fSAndroid Build Coastguard Worker }
1322*3ac0a46fSAndroid Build Coastguard Worker 
get_zoom(CJS_Runtime * pRuntime)1323*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_Document::get_zoom(CJS_Runtime* pRuntime) {
1324*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Success();
1325*3ac0a46fSAndroid Build Coastguard Worker }
1326*3ac0a46fSAndroid Build Coastguard Worker 
set_zoom(CJS_Runtime * pRuntime,v8::Local<v8::Value> vp)1327*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_Document::set_zoom(CJS_Runtime* pRuntime,
1328*3ac0a46fSAndroid Build Coastguard Worker                                   v8::Local<v8::Value> vp) {
1329*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Success();
1330*3ac0a46fSAndroid Build Coastguard Worker }
1331*3ac0a46fSAndroid Build Coastguard Worker 
get_zoom_type(CJS_Runtime * pRuntime)1332*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_Document::get_zoom_type(CJS_Runtime* pRuntime) {
1333*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Success();
1334*3ac0a46fSAndroid Build Coastguard Worker }
1335*3ac0a46fSAndroid Build Coastguard Worker 
set_zoom_type(CJS_Runtime * pRuntime,v8::Local<v8::Value> vp)1336*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_Document::set_zoom_type(CJS_Runtime* pRuntime,
1337*3ac0a46fSAndroid Build Coastguard Worker                                        v8::Local<v8::Value> vp) {
1338*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Success();
1339*3ac0a46fSAndroid Build Coastguard Worker }
1340*3ac0a46fSAndroid Build Coastguard Worker 
deletePages(CJS_Runtime * pRuntime,const std::vector<v8::Local<v8::Value>> & params)1341*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_Document::deletePages(
1342*3ac0a46fSAndroid Build Coastguard Worker     CJS_Runtime* pRuntime,
1343*3ac0a46fSAndroid Build Coastguard Worker     const std::vector<v8::Local<v8::Value>>& params) {
1344*3ac0a46fSAndroid Build Coastguard Worker   // Unsafe, not supported.
1345*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Success();
1346*3ac0a46fSAndroid Build Coastguard Worker }
1347*3ac0a46fSAndroid Build Coastguard Worker 
extractPages(CJS_Runtime * pRuntime,const std::vector<v8::Local<v8::Value>> & params)1348*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_Document::extractPages(
1349*3ac0a46fSAndroid Build Coastguard Worker     CJS_Runtime* pRuntime,
1350*3ac0a46fSAndroid Build Coastguard Worker     const std::vector<v8::Local<v8::Value>>& params) {
1351*3ac0a46fSAndroid Build Coastguard Worker   // Unsafe, not supported.
1352*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Success();
1353*3ac0a46fSAndroid Build Coastguard Worker }
1354*3ac0a46fSAndroid Build Coastguard Worker 
insertPages(CJS_Runtime * pRuntime,const std::vector<v8::Local<v8::Value>> & params)1355*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_Document::insertPages(
1356*3ac0a46fSAndroid Build Coastguard Worker     CJS_Runtime* pRuntime,
1357*3ac0a46fSAndroid Build Coastguard Worker     const std::vector<v8::Local<v8::Value>>& params) {
1358*3ac0a46fSAndroid Build Coastguard Worker   // Unsafe, not supported.
1359*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Success();
1360*3ac0a46fSAndroid Build Coastguard Worker }
1361*3ac0a46fSAndroid Build Coastguard Worker 
replacePages(CJS_Runtime * pRuntime,const std::vector<v8::Local<v8::Value>> & params)1362*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_Document::replacePages(
1363*3ac0a46fSAndroid Build Coastguard Worker     CJS_Runtime* pRuntime,
1364*3ac0a46fSAndroid Build Coastguard Worker     const std::vector<v8::Local<v8::Value>>& params) {
1365*3ac0a46fSAndroid Build Coastguard Worker   // Unsafe, not supported.
1366*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Success();
1367*3ac0a46fSAndroid Build Coastguard Worker }
1368*3ac0a46fSAndroid Build Coastguard Worker 
getURL(CJS_Runtime * pRuntime,const std::vector<v8::Local<v8::Value>> & params)1369*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_Document::getURL(
1370*3ac0a46fSAndroid Build Coastguard Worker     CJS_Runtime* pRuntime,
1371*3ac0a46fSAndroid Build Coastguard Worker     const std::vector<v8::Local<v8::Value>>& params) {
1372*3ac0a46fSAndroid Build Coastguard Worker   // Unsafe, not supported.
1373*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Success();
1374*3ac0a46fSAndroid Build Coastguard Worker }
1375*3ac0a46fSAndroid Build Coastguard Worker 
gotoNamedDest(CJS_Runtime * pRuntime,const std::vector<v8::Local<v8::Value>> & params)1376*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_Document::gotoNamedDest(
1377*3ac0a46fSAndroid Build Coastguard Worker     CJS_Runtime* pRuntime,
1378*3ac0a46fSAndroid Build Coastguard Worker     const std::vector<v8::Local<v8::Value>>& params) {
1379*3ac0a46fSAndroid Build Coastguard Worker   if (params.size() != 1)
1380*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kParamError);
1381*3ac0a46fSAndroid Build Coastguard Worker 
1382*3ac0a46fSAndroid Build Coastguard Worker   if (!m_pFormFillEnv)
1383*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kBadObjectError);
1384*3ac0a46fSAndroid Build Coastguard Worker 
1385*3ac0a46fSAndroid Build Coastguard Worker   CPDF_Document* pDocument = m_pFormFillEnv->GetPDFDocument();
1386*3ac0a46fSAndroid Build Coastguard Worker   RetainPtr<const CPDF_Array> dest_array = CPDF_NameTree::LookupNamedDest(
1387*3ac0a46fSAndroid Build Coastguard Worker       pDocument, pRuntime->ToByteString(params[0]));
1388*3ac0a46fSAndroid Build Coastguard Worker   if (!dest_array)
1389*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kBadObjectError);
1390*3ac0a46fSAndroid Build Coastguard Worker 
1391*3ac0a46fSAndroid Build Coastguard Worker   CPDF_Dest dest(std::move(dest_array));
1392*3ac0a46fSAndroid Build Coastguard Worker   std::vector<float> positions = dest.GetScrollPositionArray();
1393*3ac0a46fSAndroid Build Coastguard Worker   pRuntime->BeginBlock();
1394*3ac0a46fSAndroid Build Coastguard Worker   m_pFormFillEnv->DoGoToAction(dest.GetDestPageIndex(pDocument),
1395*3ac0a46fSAndroid Build Coastguard Worker                                dest.GetZoomMode(), positions);
1396*3ac0a46fSAndroid Build Coastguard Worker   pRuntime->EndBlock();
1397*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Success();
1398*3ac0a46fSAndroid Build Coastguard Worker }
1399*3ac0a46fSAndroid Build Coastguard Worker 
AddDelayData(std::unique_ptr<CJS_DelayData> pData)1400*3ac0a46fSAndroid Build Coastguard Worker void CJS_Document::AddDelayData(std::unique_ptr<CJS_DelayData> pData) {
1401*3ac0a46fSAndroid Build Coastguard Worker   m_DelayData.push_back(std::move(pData));
1402*3ac0a46fSAndroid Build Coastguard Worker }
1403*3ac0a46fSAndroid Build Coastguard Worker 
DoFieldDelay(const WideString & sFieldName,int nControlIndex)1404*3ac0a46fSAndroid Build Coastguard Worker void CJS_Document::DoFieldDelay(const WideString& sFieldName,
1405*3ac0a46fSAndroid Build Coastguard Worker                                 int nControlIndex) {
1406*3ac0a46fSAndroid Build Coastguard Worker   std::vector<std::unique_ptr<CJS_DelayData>> delayed_data;
1407*3ac0a46fSAndroid Build Coastguard Worker   auto iter = m_DelayData.begin();
1408*3ac0a46fSAndroid Build Coastguard Worker   while (iter != m_DelayData.end()) {
1409*3ac0a46fSAndroid Build Coastguard Worker     auto old = iter++;
1410*3ac0a46fSAndroid Build Coastguard Worker     if ((*old)->sFieldName == sFieldName &&
1411*3ac0a46fSAndroid Build Coastguard Worker         (*old)->nControlIndex == nControlIndex) {
1412*3ac0a46fSAndroid Build Coastguard Worker       delayed_data.push_back(std::move(*old));
1413*3ac0a46fSAndroid Build Coastguard Worker       m_DelayData.erase(old);
1414*3ac0a46fSAndroid Build Coastguard Worker     }
1415*3ac0a46fSAndroid Build Coastguard Worker   }
1416*3ac0a46fSAndroid Build Coastguard Worker 
1417*3ac0a46fSAndroid Build Coastguard Worker   for (const auto& pData : delayed_data)
1418*3ac0a46fSAndroid Build Coastguard Worker     CJS_Field::DoDelay(m_pFormFillEnv.Get(), pData.get());
1419*3ac0a46fSAndroid Build Coastguard Worker }
1420*3ac0a46fSAndroid Build Coastguard Worker 
GetCoreInteractiveForm()1421*3ac0a46fSAndroid Build Coastguard Worker CPDF_InteractiveForm* CJS_Document::GetCoreInteractiveForm() {
1422*3ac0a46fSAndroid Build Coastguard Worker   return GetSDKInteractiveForm()->GetInteractiveForm();
1423*3ac0a46fSAndroid Build Coastguard Worker }
1424*3ac0a46fSAndroid Build Coastguard Worker 
GetSDKInteractiveForm()1425*3ac0a46fSAndroid Build Coastguard Worker CPDFSDK_InteractiveForm* CJS_Document::GetSDKInteractiveForm() {
1426*3ac0a46fSAndroid Build Coastguard Worker   return m_pFormFillEnv->GetInteractiveForm();
1427*3ac0a46fSAndroid Build Coastguard Worker }
1428