OLD | NEW |
1 // Copyright 2014 PDFium Authors. All rights reserved. | 1 // Copyright 2014 PDFium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com | 5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com |
6 | 6 |
7 #include "xfa/fxfa/parser/xfa_script_imp.h" | 7 #include "xfa/fxfa/parser/xfa_script_imp.h" |
8 | 8 |
9 #include "core/fxcrt/include/fx_ext.h" | 9 #include "core/fxcrt/include/fx_ext.h" |
10 #include "xfa/fxfa/app/xfa_ffnotify.h" | 10 #include "xfa/fxfa/app/xfa_ffnotify.h" |
(...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
116 (CXFA_ScriptContext*)pDoc->GetScriptContext(); | 116 (CXFA_ScriptContext*)pDoc->GetScriptContext(); |
117 CXFA_Object* lpCurNode = lpScriptContext->GetVariablesThis(lpOrginalNode); | 117 CXFA_Object* lpCurNode = lpScriptContext->GetVariablesThis(lpOrginalNode); |
118 CFX_WideString wsPropName = CFX_WideString::FromUTF8(szPropName); | 118 CFX_WideString wsPropName = CFX_WideString::FromUTF8(szPropName); |
119 uint32_t dwFlag = XFA_RESOLVENODE_Parent | XFA_RESOLVENODE_Siblings | | 119 uint32_t dwFlag = XFA_RESOLVENODE_Parent | XFA_RESOLVENODE_Siblings | |
120 XFA_RESOLVENODE_Children | XFA_RESOLVENODE_Properties | | 120 XFA_RESOLVENODE_Children | XFA_RESOLVENODE_Properties | |
121 XFA_RESOLVENODE_Attributes; | 121 XFA_RESOLVENODE_Attributes; |
122 CXFA_Node* pRefNode = ToNode(lpScriptContext->GetThisObject()); | 122 CXFA_Node* pRefNode = ToNode(lpScriptContext->GetThisObject()); |
123 if (lpOrginalNode->GetObjectType() == XFA_OBJECTTYPE_VariablesThis) { | 123 if (lpOrginalNode->GetObjectType() == XFA_OBJECTTYPE_VariablesThis) { |
124 pRefNode = ToNode(lpCurNode); | 124 pRefNode = ToNode(lpCurNode); |
125 } | 125 } |
126 if (lpScriptContext->QueryNodeByFlag(pRefNode, wsPropName.AsWideStringC(), | 126 if (lpScriptContext->QueryNodeByFlag(pRefNode, wsPropName.AsStringC(), hValue, |
127 hValue, dwFlag, TRUE)) { | 127 dwFlag, TRUE)) { |
128 return; | 128 return; |
129 } | 129 } |
130 if (lpOrginalNode->GetObjectType() == XFA_OBJECTTYPE_VariablesThis) { | 130 if (lpOrginalNode->GetObjectType() == XFA_OBJECTTYPE_VariablesThis) { |
131 if (FXJSE_Value_IsUndefined(hValue)) { | 131 if (FXJSE_Value_IsUndefined(hValue)) { |
132 FXJSE_Value_SetObjectOwnProp(hObject, szPropName, hValue); | 132 FXJSE_Value_SetObjectOwnProp(hObject, szPropName, hValue); |
133 return; | 133 return; |
134 } | 134 } |
135 } | 135 } |
136 CXFA_FFNotify* pNotify = pDoc->GetNotify(); | 136 CXFA_FFNotify* pNotify = pDoc->GetNotify(); |
137 if (!pNotify) { | 137 if (!pNotify) { |
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
189 return; | 189 return; |
190 } | 190 } |
191 } | 191 } |
192 } | 192 } |
193 uint32_t dwFlag = XFA_RESOLVENODE_Children | XFA_RESOLVENODE_Properties | | 193 uint32_t dwFlag = XFA_RESOLVENODE_Children | XFA_RESOLVENODE_Properties | |
194 XFA_RESOLVENODE_Attributes; | 194 XFA_RESOLVENODE_Attributes; |
195 CXFA_Node* pRefNode = ToNode(lpScriptContext->GetThisObject()); | 195 CXFA_Node* pRefNode = ToNode(lpScriptContext->GetThisObject()); |
196 if (pOrginalObject->GetObjectType() == XFA_OBJECTTYPE_VariablesThis) { | 196 if (pOrginalObject->GetObjectType() == XFA_OBJECTTYPE_VariablesThis) { |
197 pRefNode = ToNode(lpCurNode); | 197 pRefNode = ToNode(lpCurNode); |
198 } | 198 } |
199 if (lpScriptContext->QueryNodeByFlag(pRefNode, wsPropName.AsWideStringC(), | 199 if (lpScriptContext->QueryNodeByFlag(pRefNode, wsPropName.AsStringC(), hValue, |
200 hValue, dwFlag, FALSE)) { | 200 dwFlag, FALSE)) { |
201 return; | 201 return; |
202 } | 202 } |
203 dwFlag = XFA_RESOLVENODE_Parent | XFA_RESOLVENODE_Siblings; | 203 dwFlag = XFA_RESOLVENODE_Parent | XFA_RESOLVENODE_Siblings; |
204 if (lpScriptContext->QueryNodeByFlag(pRefNode, wsPropName.AsWideStringC(), | 204 if (lpScriptContext->QueryNodeByFlag(pRefNode, wsPropName.AsStringC(), hValue, |
205 hValue, dwFlag, FALSE)) { | 205 dwFlag, FALSE)) { |
206 return; | 206 return; |
207 } | 207 } |
208 CXFA_Object* pScriptObject = | 208 CXFA_Object* pScriptObject = |
209 lpScriptContext->GetVariablesThis(pOrginalObject, TRUE); | 209 lpScriptContext->GetVariablesThis(pOrginalObject, TRUE); |
210 if (pScriptObject && | 210 if (pScriptObject && |
211 lpScriptContext->QueryVariableHValue(pScriptObject->AsNode(), szPropName, | 211 lpScriptContext->QueryVariableHValue(pScriptObject->AsNode(), szPropName, |
212 hValue, TRUE)) { | 212 hValue, TRUE)) { |
213 return; | 213 return; |
214 } | 214 } |
215 CXFA_FFNotify* pNotify = pDoc->GetNotify(); | 215 CXFA_FFNotify* pNotify = pDoc->GetNotify(); |
(...skipping 18 matching lines...) Expand all Loading... |
234 CXFA_Object* pObject = lpScriptContext->GetVariablesThis(pOrginalObject); | 234 CXFA_Object* pObject = lpScriptContext->GetVariablesThis(pOrginalObject); |
235 if (wsPropName == FX_WSTRC(L"xfa")) { | 235 if (wsPropName == FX_WSTRC(L"xfa")) { |
236 FXJSE_HVALUE pValue = lpScriptContext->GetJSValueFromMap( | 236 FXJSE_HVALUE pValue = lpScriptContext->GetJSValueFromMap( |
237 lpScriptContext->GetDocument()->GetRoot()); | 237 lpScriptContext->GetDocument()->GetRoot()); |
238 FXJSE_Value_Set(hValue, pValue); | 238 FXJSE_Value_Set(hValue, pValue); |
239 return; | 239 return; |
240 } | 240 } |
241 uint32_t dwFlag = XFA_RESOLVENODE_Children | XFA_RESOLVENODE_Properties | | 241 uint32_t dwFlag = XFA_RESOLVENODE_Children | XFA_RESOLVENODE_Properties | |
242 XFA_RESOLVENODE_Attributes; | 242 XFA_RESOLVENODE_Attributes; |
243 FX_BOOL bRet = lpScriptContext->QueryNodeByFlag( | 243 FX_BOOL bRet = lpScriptContext->QueryNodeByFlag( |
244 ToNode(pObject), wsPropName.AsWideStringC(), hValue, dwFlag, FALSE); | 244 ToNode(pObject), wsPropName.AsStringC(), hValue, dwFlag, FALSE); |
245 if (bRet) { | 245 if (bRet) { |
246 return; | 246 return; |
247 } | 247 } |
248 if (pObject == lpScriptContext->GetThisObject() || | 248 if (pObject == lpScriptContext->GetThisObject() || |
249 (lpScriptContext->GetType() == XFA_SCRIPTLANGTYPE_Javascript && | 249 (lpScriptContext->GetType() == XFA_SCRIPTLANGTYPE_Javascript && |
250 !lpScriptContext->IsStrictScopeInJavaScript())) { | 250 !lpScriptContext->IsStrictScopeInJavaScript())) { |
251 dwFlag = XFA_RESOLVENODE_Parent | XFA_RESOLVENODE_Siblings; | 251 dwFlag = XFA_RESOLVENODE_Parent | XFA_RESOLVENODE_Siblings; |
252 bRet = lpScriptContext->QueryNodeByFlag( | 252 bRet = lpScriptContext->QueryNodeByFlag( |
253 ToNode(pObject), wsPropName.AsWideStringC(), hValue, dwFlag, FALSE); | 253 ToNode(pObject), wsPropName.AsStringC(), hValue, dwFlag, FALSE); |
254 } | 254 } |
255 if (bRet) { | 255 if (bRet) { |
256 return; | 256 return; |
257 } | 257 } |
258 CXFA_Object* pScriptObject = | 258 CXFA_Object* pScriptObject = |
259 lpScriptContext->GetVariablesThis(pOrginalObject, TRUE); | 259 lpScriptContext->GetVariablesThis(pOrginalObject, TRUE); |
260 if (pScriptObject) { | 260 if (pScriptObject) { |
261 bRet = lpScriptContext->QueryVariableHValue(ToNode(pScriptObject), | 261 bRet = lpScriptContext->QueryVariableHValue(ToNode(pScriptObject), |
262 szPropName, hValue, TRUE); | 262 szPropName, hValue, TRUE); |
263 } | 263 } |
264 if (!bRet) { | 264 if (!bRet) { |
265 FXJSE_Value_SetUndefined(hValue); | 265 FXJSE_Value_SetUndefined(hValue); |
266 } | 266 } |
267 } | 267 } |
268 void CXFA_ScriptContext::NormalPropertySetter(FXJSE_HOBJECT hObject, | 268 void CXFA_ScriptContext::NormalPropertySetter(FXJSE_HOBJECT hObject, |
269 const CFX_ByteStringC& szPropName, | 269 const CFX_ByteStringC& szPropName, |
270 FXJSE_HVALUE hValue) { | 270 FXJSE_HVALUE hValue) { |
271 CXFA_Object* pOrginalObject = | 271 CXFA_Object* pOrginalObject = |
272 (CXFA_Object*)FXJSE_Value_ToObject(hObject, NULL); | 272 (CXFA_Object*)FXJSE_Value_ToObject(hObject, NULL); |
273 if (pOrginalObject == NULL) { | 273 if (pOrginalObject == NULL) { |
274 return; | 274 return; |
275 } | 275 } |
276 CXFA_ScriptContext* lpScriptContext = | 276 CXFA_ScriptContext* lpScriptContext = |
277 (CXFA_ScriptContext*)pOrginalObject->GetDocument()->GetScriptContext(); | 277 (CXFA_ScriptContext*)pOrginalObject->GetDocument()->GetScriptContext(); |
278 CXFA_Object* pObject = lpScriptContext->GetVariablesThis(pOrginalObject); | 278 CXFA_Object* pObject = lpScriptContext->GetVariablesThis(pOrginalObject); |
279 CFX_WideString wsPropName = CFX_WideString::FromUTF8(szPropName); | 279 CFX_WideString wsPropName = CFX_WideString::FromUTF8(szPropName); |
280 const XFA_SCRIPTATTRIBUTEINFO* lpAttributeInfo = XFA_GetScriptAttributeByName( | 280 const XFA_SCRIPTATTRIBUTEINFO* lpAttributeInfo = XFA_GetScriptAttributeByName( |
281 pObject->GetClassID(), wsPropName.AsWideStringC()); | 281 pObject->GetClassID(), wsPropName.AsStringC()); |
282 if (lpAttributeInfo) { | 282 if (lpAttributeInfo) { |
283 (pObject->*(lpAttributeInfo->lpfnCallback))( | 283 (pObject->*(lpAttributeInfo->lpfnCallback))( |
284 hValue, TRUE, (XFA_ATTRIBUTE)lpAttributeInfo->eAttribute); | 284 hValue, TRUE, (XFA_ATTRIBUTE)lpAttributeInfo->eAttribute); |
285 } else { | 285 } else { |
286 if (pObject->IsNode()) { | 286 if (pObject->IsNode()) { |
287 if (wsPropName.GetAt(0) == '#') { | 287 if (wsPropName.GetAt(0) == '#') { |
288 wsPropName = wsPropName.Right(wsPropName.GetLength() - 1); | 288 wsPropName = wsPropName.Right(wsPropName.GetLength() - 1); |
289 } | 289 } |
290 CXFA_Node* pNode = ToNode(pObject); | 290 CXFA_Node* pNode = ToNode(pObject); |
291 CXFA_Node* pPropOrChild = NULL; | 291 CXFA_Node* pPropOrChild = NULL; |
292 const XFA_ELEMENTINFO* lpElementInfo = | 292 const XFA_ELEMENTINFO* lpElementInfo = |
293 XFA_GetElementByName(wsPropName.AsWideStringC()); | 293 XFA_GetElementByName(wsPropName.AsStringC()); |
294 if (lpElementInfo) { | 294 if (lpElementInfo) { |
295 pPropOrChild = pNode->GetProperty(0, lpElementInfo->eName); | 295 pPropOrChild = pNode->GetProperty(0, lpElementInfo->eName); |
296 } else { | 296 } else { |
297 pPropOrChild = pNode->GetFirstChildByName(wsPropName.AsWideStringC()); | 297 pPropOrChild = pNode->GetFirstChildByName(wsPropName.AsStringC()); |
298 } | 298 } |
299 if (pPropOrChild) { | 299 if (pPropOrChild) { |
300 CFX_WideString wsDefaultName = FX_WSTRC(L"{default}"); | 300 CFX_WideString wsDefaultName = FX_WSTRC(L"{default}"); |
301 const XFA_SCRIPTATTRIBUTEINFO* lpAttributeInfo = | 301 const XFA_SCRIPTATTRIBUTEINFO* lpAttributeInfo = |
302 XFA_GetScriptAttributeByName(pPropOrChild->GetClassID(), | 302 XFA_GetScriptAttributeByName(pPropOrChild->GetClassID(), |
303 wsDefaultName.AsWideStringC()); | 303 wsDefaultName.AsStringC()); |
304 if (lpAttributeInfo) { | 304 if (lpAttributeInfo) { |
305 (pPropOrChild->*(lpAttributeInfo->lpfnCallback))( | 305 (pPropOrChild->*(lpAttributeInfo->lpfnCallback))( |
306 hValue, TRUE, (XFA_ATTRIBUTE)lpAttributeInfo->eAttribute); | 306 hValue, TRUE, (XFA_ATTRIBUTE)lpAttributeInfo->eAttribute); |
307 return; | 307 return; |
308 } | 308 } |
309 } | 309 } |
310 } | 310 } |
311 CXFA_Object* pScriptObject = | 311 CXFA_Object* pScriptObject = |
312 lpScriptContext->GetVariablesThis(pOrginalObject, TRUE); | 312 lpScriptContext->GetVariablesThis(pOrginalObject, TRUE); |
313 if (pScriptObject) { | 313 if (pScriptObject) { |
314 lpScriptContext->QueryVariableHValue(ToNode(pScriptObject), szPropName, | 314 lpScriptContext->QueryVariableHValue(ToNode(pScriptObject), szPropName, |
315 hValue, FALSE); | 315 hValue, FALSE); |
316 } | 316 } |
317 } | 317 } |
318 } | 318 } |
319 int32_t CXFA_ScriptContext::NormalPropTypeGetter( | 319 int32_t CXFA_ScriptContext::NormalPropTypeGetter( |
320 FXJSE_HOBJECT hObject, | 320 FXJSE_HOBJECT hObject, |
321 const CFX_ByteStringC& szPropName, | 321 const CFX_ByteStringC& szPropName, |
322 FX_BOOL bQueryIn) { | 322 FX_BOOL bQueryIn) { |
323 CXFA_Object* pObject = (CXFA_Object*)FXJSE_Value_ToObject(hObject, NULL); | 323 CXFA_Object* pObject = (CXFA_Object*)FXJSE_Value_ToObject(hObject, NULL); |
324 if (pObject == NULL) { | 324 if (pObject == NULL) { |
325 return FXJSE_ClassPropType_None; | 325 return FXJSE_ClassPropType_None; |
326 } | 326 } |
327 CXFA_ScriptContext* lpScriptContext = | 327 CXFA_ScriptContext* lpScriptContext = |
328 (CXFA_ScriptContext*)pObject->GetDocument()->GetScriptContext(); | 328 (CXFA_ScriptContext*)pObject->GetDocument()->GetScriptContext(); |
329 pObject = lpScriptContext->GetVariablesThis(pObject); | 329 pObject = lpScriptContext->GetVariablesThis(pObject); |
330 XFA_ELEMENT objElement = pObject->GetClassID(); | 330 XFA_ELEMENT objElement = pObject->GetClassID(); |
331 CFX_WideString wsPropName = CFX_WideString::FromUTF8(szPropName); | 331 CFX_WideString wsPropName = CFX_WideString::FromUTF8(szPropName); |
332 if (XFA_GetMethodByName(objElement, wsPropName.AsWideStringC())) { | 332 if (XFA_GetMethodByName(objElement, wsPropName.AsStringC())) { |
333 return FXJSE_ClassPropType_Method; | 333 return FXJSE_ClassPropType_Method; |
334 } | 334 } |
335 if (bQueryIn && | 335 if (bQueryIn && |
336 !XFA_GetScriptAttributeByName(objElement, wsPropName.AsWideStringC())) { | 336 !XFA_GetScriptAttributeByName(objElement, wsPropName.AsStringC())) { |
337 return FXJSE_ClassPropType_None; | 337 return FXJSE_ClassPropType_None; |
338 } | 338 } |
339 return FXJSE_ClassPropType_Property; | 339 return FXJSE_ClassPropType_Property; |
340 } | 340 } |
341 int32_t CXFA_ScriptContext::GlobalPropTypeGetter( | 341 int32_t CXFA_ScriptContext::GlobalPropTypeGetter( |
342 FXJSE_HOBJECT hObject, | 342 FXJSE_HOBJECT hObject, |
343 const CFX_ByteStringC& szPropName, | 343 const CFX_ByteStringC& szPropName, |
344 FX_BOOL bQueryIn) { | 344 FX_BOOL bQueryIn) { |
345 CXFA_Object* pObject = (CXFA_Object*)FXJSE_Value_ToObject(hObject, NULL); | 345 CXFA_Object* pObject = (CXFA_Object*)FXJSE_Value_ToObject(hObject, NULL); |
346 if (pObject == NULL) { | 346 if (pObject == NULL) { |
347 return FXJSE_ClassPropType_None; | 347 return FXJSE_ClassPropType_None; |
348 } | 348 } |
349 CXFA_ScriptContext* lpScriptContext = | 349 CXFA_ScriptContext* lpScriptContext = |
350 (CXFA_ScriptContext*)pObject->GetDocument()->GetScriptContext(); | 350 (CXFA_ScriptContext*)pObject->GetDocument()->GetScriptContext(); |
351 pObject = lpScriptContext->GetVariablesThis(pObject); | 351 pObject = lpScriptContext->GetVariablesThis(pObject); |
352 XFA_ELEMENT objElement = pObject->GetClassID(); | 352 XFA_ELEMENT objElement = pObject->GetClassID(); |
353 CFX_WideString wsPropName = CFX_WideString::FromUTF8(szPropName); | 353 CFX_WideString wsPropName = CFX_WideString::FromUTF8(szPropName); |
354 if (XFA_GetMethodByName(objElement, wsPropName.AsWideStringC())) { | 354 if (XFA_GetMethodByName(objElement, wsPropName.AsStringC())) { |
355 return FXJSE_ClassPropType_Method; | 355 return FXJSE_ClassPropType_Method; |
356 } | 356 } |
357 return FXJSE_ClassPropType_Property; | 357 return FXJSE_ClassPropType_Property; |
358 } | 358 } |
359 void CXFA_ScriptContext::NormalMethodCall(FXJSE_HOBJECT hThis, | 359 void CXFA_ScriptContext::NormalMethodCall(FXJSE_HOBJECT hThis, |
360 const CFX_ByteStringC& szFuncName, | 360 const CFX_ByteStringC& szFuncName, |
361 CFXJSE_Arguments& args) { | 361 CFXJSE_Arguments& args) { |
362 CXFA_Object* pObject = (CXFA_Object*)FXJSE_Value_ToObject(hThis, NULL); | 362 CXFA_Object* pObject = (CXFA_Object*)FXJSE_Value_ToObject(hThis, NULL); |
363 if (pObject == NULL) { | 363 if (pObject == NULL) { |
364 return; | 364 return; |
365 } | 365 } |
366 CXFA_ScriptContext* lpScriptContext = | 366 CXFA_ScriptContext* lpScriptContext = |
367 (CXFA_ScriptContext*)pObject->GetDocument()->GetScriptContext(); | 367 (CXFA_ScriptContext*)pObject->GetDocument()->GetScriptContext(); |
368 pObject = lpScriptContext->GetVariablesThis(pObject); | 368 pObject = lpScriptContext->GetVariablesThis(pObject); |
369 CFX_WideString wsFunName = CFX_WideString::FromUTF8(szFuncName); | 369 CFX_WideString wsFunName = CFX_WideString::FromUTF8(szFuncName); |
370 const XFA_METHODINFO* lpMethodInfo = | 370 const XFA_METHODINFO* lpMethodInfo = |
371 XFA_GetMethodByName(pObject->GetClassID(), wsFunName.AsWideStringC()); | 371 XFA_GetMethodByName(pObject->GetClassID(), wsFunName.AsStringC()); |
372 if (NULL == lpMethodInfo) { | 372 if (NULL == lpMethodInfo) { |
373 return; | 373 return; |
374 } | 374 } |
375 (pObject->*(lpMethodInfo->lpfnCallback))(&args); | 375 (pObject->*(lpMethodInfo->lpfnCallback))(&args); |
376 } | 376 } |
377 FX_BOOL CXFA_ScriptContext::IsStrictScopeInJavaScript() { | 377 FX_BOOL CXFA_ScriptContext::IsStrictScopeInJavaScript() { |
378 return m_pDocument->HasFlag(XFA_DOCFLAG_StrictScoping); | 378 return m_pDocument->HasFlag(XFA_DOCFLAG_StrictScoping); |
379 } | 379 } |
380 XFA_SCRIPTLANGTYPE CXFA_ScriptContext::GetType() { | 380 XFA_SCRIPTLANGTYPE CXFA_ScriptContext::GetType() { |
381 return m_eScriptType; | 381 return m_eScriptType; |
(...skipping 384 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
766 } | 766 } |
767 } | 767 } |
768 void CXFA_ScriptContext::AddNodesOfRunScript(CXFA_Node* pNode) { | 768 void CXFA_ScriptContext::AddNodesOfRunScript(CXFA_Node* pNode) { |
769 if (!m_pScriptNodeArray) { | 769 if (!m_pScriptNodeArray) { |
770 return; | 770 return; |
771 } | 771 } |
772 if (m_pScriptNodeArray->Find(pNode) == -1) { | 772 if (m_pScriptNodeArray->Find(pNode) == -1) { |
773 m_pScriptNodeArray->Add(pNode); | 773 m_pScriptNodeArray->Add(pNode); |
774 } | 774 } |
775 } | 775 } |
OLD | NEW |