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/cxfa_scriptcontext.h" | 7 #include "xfa/fxfa/parser/cxfa_scriptcontext.h" |
8 | 8 |
9 #include "core/fxcrt/include/fx_ext.h" | 9 #include "core/fxcrt/include/fx_ext.h" |
10 #include "fxjs/include/cfxjse_arguments.h" | 10 #include "fxjs/include/cfxjse_arguments.h" |
11 #include "fxjs/include/cfxjse_class.h" | 11 #include "fxjs/include/cfxjse_class.h" |
12 #include "fxjs/include/cfxjse_value.h" | 12 #include "fxjs/include/cfxjse_value.h" |
13 #include "xfa/fxfa/app/xfa_ffnotify.h" | 13 #include "xfa/fxfa/app/xfa_ffnotify.h" |
14 #include "xfa/fxfa/include/cxfa_eventparam.h" | 14 #include "xfa/fxfa/include/cxfa_eventparam.h" |
15 #include "xfa/fxfa/parser/cxfa_nodehelper.h" | 15 #include "xfa/fxfa/parser/cxfa_nodehelper.h" |
16 #include "xfa/fxfa/parser/cxfa_resolveprocessor.h" | 16 #include "xfa/fxfa/parser/cxfa_resolveprocessor.h" |
| 17 #include "xfa/fxfa/parser/xfa_basic_data.h" |
17 #include "xfa/fxfa/parser/xfa_doclayout.h" | 18 #include "xfa/fxfa/parser/xfa_doclayout.h" |
18 #include "xfa/fxfa/parser/xfa_document.h" | 19 #include "xfa/fxfa/parser/xfa_document.h" |
19 #include "xfa/fxfa/parser/xfa_localemgr.h" | 20 #include "xfa/fxfa/parser/xfa_localemgr.h" |
20 #include "xfa/fxfa/parser/xfa_object.h" | 21 #include "xfa/fxfa/parser/xfa_object.h" |
21 #include "xfa/fxfa/parser/xfa_resolvenode_rs.h" | 22 #include "xfa/fxfa/parser/xfa_resolvenode_rs.h" |
22 #include "xfa/fxfa/parser/xfa_utils.h" | 23 #include "xfa/fxfa/parser/xfa_utils.h" |
23 | 24 |
24 namespace { | 25 namespace { |
25 | 26 |
26 const FXJSE_CLASS_DESCRIPTOR GlobalClassDescriptor = { | 27 const FXJSE_CLASS_DESCRIPTOR GlobalClassDescriptor = { |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
64 nullptr, // property deleter | 65 nullptr, // property deleter |
65 CXFA_ScriptContext::NormalMethodCall, | 66 CXFA_ScriptContext::NormalMethodCall, |
66 }; | 67 }; |
67 | 68 |
68 const char kFormCalcRuntime[] = "foxit_xfa_formcalc_runtime"; | 69 const char kFormCalcRuntime[] = "foxit_xfa_formcalc_runtime"; |
69 | 70 |
70 CXFA_ThisProxy* ToThisProxy(CFXJSE_Value* pValue, CFXJSE_Class* pClass) { | 71 CXFA_ThisProxy* ToThisProxy(CFXJSE_Value* pValue, CFXJSE_Class* pClass) { |
71 return static_cast<CXFA_ThisProxy*>(pValue->ToHostObject(pClass)); | 72 return static_cast<CXFA_ThisProxy*>(pValue->ToHostObject(pClass)); |
72 } | 73 } |
73 | 74 |
| 75 const XFA_METHODINFO* GetMethodByName(XFA_Element eElement, |
| 76 const CFX_WideStringC& wsMethodName) { |
| 77 if (wsMethodName.IsEmpty()) |
| 78 return nullptr; |
| 79 |
| 80 int32_t iElementIndex = static_cast<int32_t>(eElement); |
| 81 while (iElementIndex >= 0 && iElementIndex < g_iScriptIndexCount) { |
| 82 const XFA_SCRIPTHIERARCHY* scriptIndex = g_XFAScriptIndex + iElementIndex; |
| 83 int32_t icount = scriptIndex->wMethodCount; |
| 84 if (icount == 0) { |
| 85 iElementIndex = scriptIndex->wParentIndex; |
| 86 continue; |
| 87 } |
| 88 uint32_t uHash = FX_HashCode_GetW(wsMethodName, false); |
| 89 int32_t iStart = scriptIndex->wMethodStart; |
| 90 // TODO(dsinclair): Switch to std::lower_bound. |
| 91 int32_t iEnd = iStart + icount - 1; |
| 92 do { |
| 93 int32_t iMid = (iStart + iEnd) / 2; |
| 94 const XFA_METHODINFO* pInfo = g_SomMethodData + iMid; |
| 95 if (uHash == pInfo->uHash) |
| 96 return pInfo; |
| 97 if (uHash < pInfo->uHash) |
| 98 iEnd = iMid - 1; |
| 99 else |
| 100 iStart = iMid + 1; |
| 101 } while (iStart <= iEnd); |
| 102 iElementIndex = scriptIndex->wParentIndex; |
| 103 } |
| 104 return nullptr; |
| 105 } |
| 106 |
74 } // namespace | 107 } // namespace |
75 | 108 |
76 // static. | 109 // static. |
77 CXFA_Object* CXFA_ScriptContext::ToObject(CFXJSE_Value* pValue, | 110 CXFA_Object* CXFA_ScriptContext::ToObject(CFXJSE_Value* pValue, |
78 CFXJSE_Class* pClass) { | 111 CFXJSE_Class* pClass) { |
79 return static_cast<CXFA_Object*>(pValue->ToHostObject(pClass)); | 112 return static_cast<CXFA_Object*>(pValue->ToHostObject(pClass)); |
80 } | 113 } |
81 | 114 |
82 CXFA_ScriptContext::CXFA_ScriptContext(CXFA_Document* pDocument) | 115 CXFA_ScriptContext::CXFA_ScriptContext(CXFA_Document* pDocument) |
83 : m_pDocument(pDocument), | 116 : m_pDocument(pDocument), |
(...skipping 266 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
350 FX_BOOL bQueryIn) { | 383 FX_BOOL bQueryIn) { |
351 CXFA_Object* pObject = ToObject(pOriginalValue, nullptr); | 384 CXFA_Object* pObject = ToObject(pOriginalValue, nullptr); |
352 if (!pObject) | 385 if (!pObject) |
353 return FXJSE_ClassPropType_None; | 386 return FXJSE_ClassPropType_None; |
354 | 387 |
355 CXFA_ScriptContext* lpScriptContext = | 388 CXFA_ScriptContext* lpScriptContext = |
356 pObject->GetDocument()->GetScriptContext(); | 389 pObject->GetDocument()->GetScriptContext(); |
357 pObject = lpScriptContext->GetVariablesThis(pObject); | 390 pObject = lpScriptContext->GetVariablesThis(pObject); |
358 XFA_Element eType = pObject->GetElementType(); | 391 XFA_Element eType = pObject->GetElementType(); |
359 CFX_WideString wsPropName = CFX_WideString::FromUTF8(szPropName); | 392 CFX_WideString wsPropName = CFX_WideString::FromUTF8(szPropName); |
360 if (XFA_GetMethodByName(eType, wsPropName.AsStringC())) { | 393 if (GetMethodByName(eType, wsPropName.AsStringC())) { |
361 return FXJSE_ClassPropType_Method; | 394 return FXJSE_ClassPropType_Method; |
362 } | 395 } |
363 if (bQueryIn && | 396 if (bQueryIn && |
364 !XFA_GetScriptAttributeByName(eType, wsPropName.AsStringC())) { | 397 !XFA_GetScriptAttributeByName(eType, wsPropName.AsStringC())) { |
365 return FXJSE_ClassPropType_None; | 398 return FXJSE_ClassPropType_None; |
366 } | 399 } |
367 return FXJSE_ClassPropType_Property; | 400 return FXJSE_ClassPropType_Property; |
368 } | 401 } |
369 int32_t CXFA_ScriptContext::GlobalPropTypeGetter( | 402 int32_t CXFA_ScriptContext::GlobalPropTypeGetter( |
370 CFXJSE_Value* pOriginalValue, | 403 CFXJSE_Value* pOriginalValue, |
371 const CFX_ByteStringC& szPropName, | 404 const CFX_ByteStringC& szPropName, |
372 FX_BOOL bQueryIn) { | 405 FX_BOOL bQueryIn) { |
373 CXFA_Object* pObject = ToObject(pOriginalValue, nullptr); | 406 CXFA_Object* pObject = ToObject(pOriginalValue, nullptr); |
374 if (!pObject) | 407 if (!pObject) |
375 return FXJSE_ClassPropType_None; | 408 return FXJSE_ClassPropType_None; |
376 | 409 |
377 CXFA_ScriptContext* lpScriptContext = | 410 CXFA_ScriptContext* lpScriptContext = |
378 pObject->GetDocument()->GetScriptContext(); | 411 pObject->GetDocument()->GetScriptContext(); |
379 pObject = lpScriptContext->GetVariablesThis(pObject); | 412 pObject = lpScriptContext->GetVariablesThis(pObject); |
380 XFA_Element eType = pObject->GetElementType(); | 413 XFA_Element eType = pObject->GetElementType(); |
381 CFX_WideString wsPropName = CFX_WideString::FromUTF8(szPropName); | 414 CFX_WideString wsPropName = CFX_WideString::FromUTF8(szPropName); |
382 if (XFA_GetMethodByName(eType, wsPropName.AsStringC())) { | 415 if (GetMethodByName(eType, wsPropName.AsStringC())) { |
383 return FXJSE_ClassPropType_Method; | 416 return FXJSE_ClassPropType_Method; |
384 } | 417 } |
385 return FXJSE_ClassPropType_Property; | 418 return FXJSE_ClassPropType_Property; |
386 } | 419 } |
387 void CXFA_ScriptContext::NormalMethodCall(CFXJSE_Value* pThis, | 420 void CXFA_ScriptContext::NormalMethodCall(CFXJSE_Value* pThis, |
388 const CFX_ByteStringC& szFuncName, | 421 const CFX_ByteStringC& szFuncName, |
389 CFXJSE_Arguments& args) { | 422 CFXJSE_Arguments& args) { |
390 CXFA_Object* pObject = ToObject(pThis, nullptr); | 423 CXFA_Object* pObject = ToObject(pThis, nullptr); |
391 if (!pObject) | 424 if (!pObject) |
392 return; | 425 return; |
393 | 426 |
394 CXFA_ScriptContext* lpScriptContext = | 427 CXFA_ScriptContext* lpScriptContext = |
395 pObject->GetDocument()->GetScriptContext(); | 428 pObject->GetDocument()->GetScriptContext(); |
396 pObject = lpScriptContext->GetVariablesThis(pObject); | 429 pObject = lpScriptContext->GetVariablesThis(pObject); |
397 CFX_WideString wsFunName = CFX_WideString::FromUTF8(szFuncName); | 430 CFX_WideString wsFunName = CFX_WideString::FromUTF8(szFuncName); |
398 const XFA_METHODINFO* lpMethodInfo = | 431 const XFA_METHODINFO* lpMethodInfo = |
399 XFA_GetMethodByName(pObject->GetElementType(), wsFunName.AsStringC()); | 432 GetMethodByName(pObject->GetElementType(), wsFunName.AsStringC()); |
400 if (!lpMethodInfo) | 433 if (!lpMethodInfo) |
401 return; | 434 return; |
402 | 435 |
403 (pObject->*(lpMethodInfo->lpfnCallback))(&args); | 436 (pObject->*(lpMethodInfo->lpfnCallback))(&args); |
404 } | 437 } |
405 FX_BOOL CXFA_ScriptContext::IsStrictScopeInJavaScript() { | 438 FX_BOOL CXFA_ScriptContext::IsStrictScopeInJavaScript() { |
406 return m_pDocument->HasFlag(XFA_DOCFLAG_StrictScoping); | 439 return m_pDocument->HasFlag(XFA_DOCFLAG_StrictScoping); |
407 } | 440 } |
408 XFA_SCRIPTLANGTYPE CXFA_ScriptContext::GetType() { | 441 XFA_SCRIPTLANGTYPE CXFA_ScriptContext::GetType() { |
409 return m_eScriptType; | 442 return m_eScriptType; |
(...skipping 320 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
730 return; | 763 return; |
731 if (nodes.GetSize() > 0) | 764 if (nodes.GetSize() > 0) |
732 m_pScriptNodeArray->Copy(nodes); | 765 m_pScriptNodeArray->Copy(nodes); |
733 } | 766 } |
734 void CXFA_ScriptContext::AddNodesOfRunScript(CXFA_Node* pNode) { | 767 void CXFA_ScriptContext::AddNodesOfRunScript(CXFA_Node* pNode) { |
735 if (!m_pScriptNodeArray) | 768 if (!m_pScriptNodeArray) |
736 return; | 769 return; |
737 if (m_pScriptNodeArray->Find(pNode) == -1) | 770 if (m_pScriptNodeArray->Find(pNode) == -1) |
738 m_pScriptNodeArray->Add(pNode); | 771 m_pScriptNodeArray->Add(pNode); |
739 } | 772 } |
OLD | NEW |