diff options
Diffstat (limited to 'fxjs')
58 files changed, 3515 insertions, 2667 deletions
diff --git a/fxjs/CJX_Define.h b/fxjs/CJX_Define.h new file mode 100644 index 0000000000..3d8a84b7ac --- /dev/null +++ b/fxjs/CJX_Define.h @@ -0,0 +1,24 @@ +// Copyright 2017 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef FXJS_CJX_DEFINE_H_ +#define FXJS_CJX_DEFINE_H_ + +#include "fxjs/cfxjse_arguments.h" + +template <class C, void (C::*M)(CFXJSE_Arguments* args)> +void JSMethod(C* node, CFXJSE_Arguments* args) { + (node->*M)(args); +} + +#define JS_METHOD(method_name, class_name) \ + static void method_name##_static(CJX_Object* node, CFXJSE_Arguments* args) { \ + JSMethod<class_name, &class_name::method_name>( \ + static_cast<class_name*>(node), args); \ + } \ + void method_name(CFXJSE_Arguments* pArguments) + +#endif // FXJS_CJX_DEFINE_H_ diff --git a/fxjs/cfxjse_engine.cpp b/fxjs/cfxjse_engine.cpp index 821b8da70f..4f086e22e2 100644 --- a/fxjs/cfxjse_engine.cpp +++ b/fxjs/cfxjse_engine.cpp @@ -23,9 +23,9 @@ #include "xfa/fxfa/parser/cxfa_localemgr.h" #include "xfa/fxfa/parser/cxfa_node.h" #include "xfa/fxfa/parser/cxfa_nodehelper.h" -#include "xfa/fxfa/parser/cxfa_nodelist.h" #include "xfa/fxfa/parser/cxfa_object.h" #include "xfa/fxfa/parser/cxfa_thisproxy.h" +#include "xfa/fxfa/parser/cxfa_treelist.h" #include "xfa/fxfa/parser/xfa_basic_data.h" #include "xfa/fxfa/parser/xfa_resolvenode_rs.h" #include "xfa/fxfa/parser/xfa_utils.h" @@ -68,38 +68,6 @@ CXFA_ThisProxy* ToThisProxy(CFXJSE_Value* pValue, CFXJSE_Class* pClass) { return static_cast<CXFA_ThisProxy*>(pValue->ToHostObject(pClass)); } -const XFA_METHODINFO* GetMethodByName(XFA_Element eElement, - const WideStringView& wsMethodName) { - if (wsMethodName.IsEmpty()) - return nullptr; - - int32_t iElementIndex = static_cast<int32_t>(eElement); - while (iElementIndex >= 0 && iElementIndex < g_iScriptIndexCount) { - const XFA_SCRIPTHIERARCHY* scriptIndex = g_XFAScriptIndex + iElementIndex; - int32_t icount = scriptIndex->wMethodCount; - if (icount == 0) { - iElementIndex = scriptIndex->wParentIndex; - continue; - } - uint32_t uHash = FX_HashCode_GetW(wsMethodName, false); - int32_t iStart = scriptIndex->wMethodStart; - // TODO(dsinclair): Switch to std::lower_bound. - int32_t iEnd = iStart + icount - 1; - do { - int32_t iMid = (iStart + iEnd) / 2; - const XFA_METHODINFO* pInfo = g_SomMethodData + iMid; - if (uHash == pInfo->uHash) - return pInfo; - if (uHash < pInfo->uHash) - iEnd = iMid - 1; - else - iStart = iMid + 1; - } while (iStart <= iEnd); - iElementIndex = scriptIndex->wParentIndex; - } - return nullptr; -} - } // namespace // static. @@ -289,9 +257,8 @@ int32_t CFXJSE_Engine::GlobalPropTypeGetter(CFXJSE_Value* pOriginalValue, CFXJSE_Engine* lpScriptContext = pObject->GetDocument()->GetScriptContext(); pObject = lpScriptContext->GetVariablesThis(pObject); - XFA_Element eType = pObject->GetElementType(); WideString wsPropName = WideString::FromUTF8(szPropName); - if (GetMethodByName(eType, wsPropName.AsStringView())) + if (pObject->JSObject()->HasMethod(wsPropName)) return FXJSE_ClassPropType_Method; return FXJSE_ClassPropType_Property; @@ -407,7 +374,7 @@ int32_t CFXJSE_Engine::NormalPropTypeGetter(CFXJSE_Value* pOriginalValue, pObject = lpScriptContext->GetVariablesThis(pObject); XFA_Element eType = pObject->GetElementType(); WideString wsPropName = WideString::FromUTF8(szPropName); - if (GetMethodByName(eType, wsPropName.AsStringView())) + if (pObject->JSObject()->HasMethod(wsPropName)) return FXJSE_ClassPropType_Method; if (bQueryIn && @@ -424,17 +391,11 @@ void CFXJSE_Engine::NormalMethodCall(CFXJSE_Value* pThis, if (!pObject) return; - CFXJSE_Engine* lpScriptContext = pObject->GetDocument()->GetScriptContext(); - pObject = lpScriptContext->GetVariablesThis(pObject); - WideString wsFunName = WideString::FromUTF8(szFuncName); - const XFA_METHODINFO* lpMethodInfo = - GetMethodByName(pObject->GetElementType(), wsFunName.AsStringView()); - if (!lpMethodInfo) - return; + CFXJSE_Engine* lpScriptContext = pObject->GetDocument()->GetScriptContext(); - CJX_Object* jsObject = pObject->JSObject(); - (jsObject->*(lpMethodInfo->callback))(&args); + pObject = lpScriptContext->GetVariablesThis(pObject); + pObject->JSObject()->RunMethod(wsFunName, &args); } bool CFXJSE_Engine::IsStrictScopeInJavaScript() { @@ -728,7 +689,7 @@ bool CFXJSE_Engine::ResolveObjects(CXFA_Object* refObject, return nNodes > 0; } -void CFXJSE_Engine::AddToCacheList(std::unique_ptr<CXFA_NodeList> pList) { +void CFXJSE_Engine::AddToCacheList(std::unique_ptr<CXFA_List> pList) { m_CacheList.push_back(std::move(pList)); } diff --git a/fxjs/cfxjse_engine.h b/fxjs/cfxjse_engine.h index a675a390da..5310a5c1a5 100644 --- a/fxjs/cfxjse_engine.h +++ b/fxjs/cfxjse_engine.h @@ -19,6 +19,7 @@ #define XFA_RESOLVENODE_TagName 0x0002 +class CXFA_List; class CFXJSE_ResolveProcessor; class CFXJSE_Engine { @@ -62,7 +63,7 @@ class CFXJSE_Engine { uint32_t dwStyles, CXFA_Node* bindNode); CFXJSE_Value* GetJSValueFromMap(CXFA_Object* pObject); - void AddToCacheList(std::unique_ptr<CXFA_NodeList> pList); + void AddToCacheList(std::unique_ptr<CXFA_List> pList); CXFA_Object* GetThisObject() const { return m_pThisObject; } v8::Isolate* GetRuntime() const { return m_pIsolate; } @@ -108,8 +109,8 @@ class CFXJSE_Engine { m_mapVariableToContext; CXFA_EventParam m_eventParam; std::vector<CXFA_Node*> m_upObjectArray; - // CacheList holds the NodeList items so we can clean them up when we're done. - std::vector<std::unique_ptr<CXFA_NodeList>> m_CacheList; + // CacheList holds the List items so we can clean them up when we're done. + std::vector<std::unique_ptr<CXFA_List>> m_CacheList; std::vector<CXFA_Node*>* m_pScriptNodeArray; std::unique_ptr<CFXJSE_ResolveProcessor> m_ResolveProcessor; std::unique_ptr<CFXJSE_FormCalcContext> m_FM2JSContext; diff --git a/fxjs/cjx_datawindow.cpp b/fxjs/cjx_datawindow.cpp index acefb407c3..0d712bac77 100644 --- a/fxjs/cjx_datawindow.cpp +++ b/fxjs/cjx_datawindow.cpp @@ -10,18 +10,27 @@ #include "fxjs/cfxjse_value.h" #include "xfa/fxfa/parser/cscript_datawindow.h" +const CJX_MethodSpec CJX_DataWindow::MethodSpecs[] = { + {"gotoRecord", gotoRecord_static}, + {"isRecordGroup", isRecordGroup_static}, + {"moveCurrentRecord", moveCurrentRecord_static}, + {"record", record_static}, + {"", nullptr}}; + CJX_DataWindow::CJX_DataWindow(CScript_DataWindow* window) - : CJX_Object(window) {} + : CJX_Object(window) { + DefineMethods(MethodSpecs); +} CJX_DataWindow::~CJX_DataWindow() {} -void CJX_DataWindow::MoveCurrentRecord(CFXJSE_Arguments* pArguments) {} +void CJX_DataWindow::moveCurrentRecord(CFXJSE_Arguments* pArguments) {} -void CJX_DataWindow::Record(CFXJSE_Arguments* pArguments) {} +void CJX_DataWindow::record(CFXJSE_Arguments* pArguments) {} -void CJX_DataWindow::GotoRecord(CFXJSE_Arguments* pArguments) {} +void CJX_DataWindow::gotoRecord(CFXJSE_Arguments* pArguments) {} -void CJX_DataWindow::IsRecordGroup(CFXJSE_Arguments* pArguments) {} +void CJX_DataWindow::isRecordGroup(CFXJSE_Arguments* pArguments) {} void CJX_DataWindow::RecordsBefore(CFXJSE_Value* pValue, bool bSetting, diff --git a/fxjs/cjx_datawindow.h b/fxjs/cjx_datawindow.h index ccdfea4b17..e7c39edad8 100644 --- a/fxjs/cjx_datawindow.h +++ b/fxjs/cjx_datawindow.h @@ -7,10 +7,10 @@ #ifndef FXJS_CJX_DATAWINDOW_H_ #define FXJS_CJX_DATAWINDOW_H_ +#include "fxjs/CJX_Define.h" #include "fxjs/cjx_object.h" #include "xfa/fxfa/fxfa_basic.h" -class CFXJSE_Arguments; class CFXJSE_Value; class CScript_DataWindow; @@ -19,10 +19,6 @@ class CJX_DataWindow : public CJX_Object { explicit CJX_DataWindow(CScript_DataWindow* window); ~CJX_DataWindow() override; - void MoveCurrentRecord(CFXJSE_Arguments* pArguments); - void Record(CFXJSE_Arguments* pArguments); - void GotoRecord(CFXJSE_Arguments* pArguments); - void IsRecordGroup(CFXJSE_Arguments* pArguments); void RecordsBefore(CFXJSE_Value* pValue, bool bSetting, XFA_Attribute eAttribute); @@ -33,6 +29,14 @@ class CJX_DataWindow : public CJX_Object { bool bSetting, XFA_Attribute eAttribute); void IsDefined(CFXJSE_Value* pValue, bool bSetting, XFA_Attribute eAttribute); + + JS_METHOD(gotoRecord, CJX_DataWindow); + JS_METHOD(isRecordGroup, CJX_DataWindow); + JS_METHOD(moveCurrentRecord, CJX_DataWindow); + JS_METHOD(record, CJX_DataWindow); + + private: + static const CJX_MethodSpec MethodSpecs[]; }; #endif // FXJS_CJX_DATAWINDOW_H_ diff --git a/fxjs/cjx_eventpseudomodel.cpp b/fxjs/cjx_eventpseudomodel.cpp index edadb5dafe..f78890bc9f 100644 --- a/fxjs/cjx_eventpseudomodel.cpp +++ b/fxjs/cjx_eventpseudomodel.cpp @@ -42,8 +42,15 @@ void BooleanProperty(CFXJSE_Value* pValue, bool& bValue, bool bSetting) { } // namespace +const CJX_MethodSpec CJX_EventPseudoModel::MethodSpecs[] = { + {"emit", emit_static}, + {"reset", reset_static}, + {"", nullptr}}; + CJX_EventPseudoModel::CJX_EventPseudoModel(CScript_EventPseudoModel* model) - : CJX_Object(model) {} + : CJX_Object(model) { + DefineMethods(MethodSpecs); +} CJX_EventPseudoModel::~CJX_EventPseudoModel() {} @@ -143,7 +150,7 @@ void CJX_EventPseudoModel::Target(CFXJSE_Value* pValue, Property(pValue, XFA_Event::Target, bSetting); } -void CJX_EventPseudoModel::Emit(CFXJSE_Arguments* pArguments) { +void CJX_EventPseudoModel::emit(CFXJSE_Arguments* pArguments) { CFXJSE_Engine* pScriptContext = GetDocument()->GetScriptContext(); if (!pScriptContext) return; @@ -163,7 +170,7 @@ void CJX_EventPseudoModel::Emit(CFXJSE_Arguments* pArguments) { pWidgetHandler->ProcessEvent(pEventParam->m_pTarget, pEventParam); } -void CJX_EventPseudoModel::Reset(CFXJSE_Arguments* pArguments) { +void CJX_EventPseudoModel::reset(CFXJSE_Arguments* pArguments) { CFXJSE_Engine* pScriptContext = GetDocument()->GetScriptContext(); if (!pScriptContext) return; diff --git a/fxjs/cjx_eventpseudomodel.h b/fxjs/cjx_eventpseudomodel.h index 319bb5d0ed..08cca73a3d 100644 --- a/fxjs/cjx_eventpseudomodel.h +++ b/fxjs/cjx_eventpseudomodel.h @@ -7,9 +7,9 @@ #ifndef FXJS_CJX_EVENTPSEUDOMODEL_H_ #define FXJS_CJX_EVENTPSEUDOMODEL_H_ +#include "fxjs/CJX_Define.h" #include "fxjs/cjx_object.h" -class CFXJSE_Arguments; class CFXJSE_Value; class CScript_EventPseudoModel; @@ -63,11 +63,13 @@ class CJX_EventPseudoModel : public CJX_Object { XFA_Attribute eAttribute); void Target(CFXJSE_Value* pValue, bool bSetting, XFA_Attribute eAttribute); - void Emit(CFXJSE_Arguments* pArguments); - void Reset(CFXJSE_Arguments* pArguments); + JS_METHOD(emit, CJX_EventPseudoModel); + JS_METHOD(reset, CJX_EventPseudoModel); private: void Property(CFXJSE_Value* pValue, XFA_Event dwFlag, bool bSetting); + + static const CJX_MethodSpec MethodSpecs[]; }; #endif // FXJS_CJX_EVENTPSEUDOMODEL_H_ diff --git a/fxjs/cjx_hostpseudomodel.cpp b/fxjs/cjx_hostpseudomodel.cpp index 8838c891d9..6e0f2f83cb 100644 --- a/fxjs/cjx_hostpseudomodel.cpp +++ b/fxjs/cjx_hostpseudomodel.cpp @@ -49,8 +49,28 @@ int32_t FilterName(const WideStringView& wsExpression, } // namespace +const CJX_MethodSpec CJX_HostPseudoModel::MethodSpecs[] = { + {"beep", beep_static}, + {"documentCountInBatch", documentCountInBatch_static}, + {"documentInBatch", documentInBatch_static}, + {"exportData", exportData_static}, + {"getFocus", getFocus_static}, + {"gotoURL", gotoURL_static}, + {"importData", importData_static}, + {"messageBox", messageBox_static}, + {"openList", openList_static}, + {"pageDown", pageDown_static}, + {"pageUp", pageUp_static}, + {"print", print_static}, + {"resetData", resetData_static}, + {"response", response_static}, + {"setFocus", setFocus_static}, + {"", nullptr}}; + CJX_HostPseudoModel::CJX_HostPseudoModel(CScript_HostPseudoModel* model) - : CJX_Object(model) {} + : CJX_Object(model) { + DefineMethods(MethodSpecs); +} CJX_HostPseudoModel::~CJX_HostPseudoModel() {} @@ -229,7 +249,7 @@ void CJX_HostPseudoModel::Name(CFXJSE_Value* pValue, pNotify->GetAppProvider()->GetAppName().UTF8Encode().AsStringView()); } -void CJX_HostPseudoModel::GotoURL(CFXJSE_Arguments* pArguments) { +void CJX_HostPseudoModel::gotoURL(CFXJSE_Arguments* pArguments) { if (!GetDocument()->GetScriptContext()->IsRunAtClient()) return; @@ -252,7 +272,7 @@ void CJX_HostPseudoModel::GotoURL(CFXJSE_Arguments* pArguments) { pNotify->GetDocEnvironment()->GotoURL(hDoc, wsURL); } -void CJX_HostPseudoModel::OpenList(CFXJSE_Arguments* pArguments) { +void CJX_HostPseudoModel::openList(CFXJSE_Arguments* pArguments) { if (!GetDocument()->GetScriptContext()->IsRunAtClient()) return; @@ -306,7 +326,7 @@ void CJX_HostPseudoModel::OpenList(CFXJSE_Arguments* pArguments) { pNotify->OpenDropDownList(hWidget); } -void CJX_HostPseudoModel::Response(CFXJSE_Arguments* pArguments) { +void CJX_HostPseudoModel::response(CFXJSE_Arguments* pArguments) { int32_t iLength = pArguments->GetLength(); if (iLength < 1 || iLength > 4) { ThrowParamCountMismatchException(L"response"); @@ -344,12 +364,12 @@ void CJX_HostPseudoModel::Response(CFXJSE_Arguments* pArguments) { pValue->SetString(wsAnswer.UTF8Encode().AsStringView()); } -void CJX_HostPseudoModel::DocumentInBatch(CFXJSE_Arguments* pArguments) { +void CJX_HostPseudoModel::documentInBatch(CFXJSE_Arguments* pArguments) { if (CFXJSE_Value* pValue = pArguments->GetReturnValue()) pValue->SetInteger(0); } -void CJX_HostPseudoModel::ResetData(CFXJSE_Arguments* pArguments) { +void CJX_HostPseudoModel::resetData(CFXJSE_Arguments* pArguments) { int32_t iLength = pArguments->GetLength(); if (iLength < 0 || iLength > 1) { ThrowParamCountMismatchException(L"resetData"); @@ -399,7 +419,7 @@ void CJX_HostPseudoModel::ResetData(CFXJSE_Arguments* pArguments) { pNotify->ResetData(); } -void CJX_HostPseudoModel::Beep(CFXJSE_Arguments* pArguments) { +void CJX_HostPseudoModel::beep(CFXJSE_Arguments* pArguments) { if (!GetDocument()->GetScriptContext()->IsRunAtClient()) return; @@ -420,7 +440,7 @@ void CJX_HostPseudoModel::Beep(CFXJSE_Arguments* pArguments) { pNotify->GetAppProvider()->Beep(dwType); } -void CJX_HostPseudoModel::SetFocus(CFXJSE_Arguments* pArguments) { +void CJX_HostPseudoModel::setFocus(CFXJSE_Arguments* pArguments) { if (!GetDocument()->GetScriptContext()->IsRunAtClient()) return; @@ -463,7 +483,7 @@ void CJX_HostPseudoModel::SetFocus(CFXJSE_Arguments* pArguments) { pNotify->SetFocusWidgetNode(pNode); } -void CJX_HostPseudoModel::GetFocus(CFXJSE_Arguments* pArguments) { +void CJX_HostPseudoModel::getFocus(CFXJSE_Arguments* pArguments) { CXFA_FFNotify* pNotify = GetDocument()->GetNotify(); if (!pNotify) return; @@ -476,7 +496,7 @@ void CJX_HostPseudoModel::GetFocus(CFXJSE_Arguments* pArguments) { GetDocument()->GetScriptContext()->GetJSValueFromMap(pNode)); } -void CJX_HostPseudoModel::MessageBox(CFXJSE_Arguments* pArguments) { +void CJX_HostPseudoModel::messageBox(CFXJSE_Arguments* pArguments) { if (!GetDocument()->GetScriptContext()->IsRunAtClient()) return; @@ -541,12 +561,12 @@ bool CJX_HostPseudoModel::ValidateArgsForMsg(CFXJSE_Arguments* pArguments, return true; } -void CJX_HostPseudoModel::DocumentCountInBatch(CFXJSE_Arguments* pArguments) { +void CJX_HostPseudoModel::documentCountInBatch(CFXJSE_Arguments* pArguments) { if (CFXJSE_Value* pValue = pArguments->GetReturnValue()) pValue->SetInteger(0); } -void CJX_HostPseudoModel::Print(CFXJSE_Arguments* pArguments) { +void CJX_HostPseudoModel::print(CFXJSE_Arguments* pArguments) { if (!GetDocument()->GetScriptContext()->IsRunAtClient()) return; @@ -611,7 +631,7 @@ void CJX_HostPseudoModel::Print(CFXJSE_Arguments* pArguments) { pNotify->GetDocEnvironment()->Print(hDoc, nStartPage, nEndPage, dwOptions); } -void CJX_HostPseudoModel::ImportData(CFXJSE_Arguments* pArguments) { +void CJX_HostPseudoModel::importData(CFXJSE_Arguments* pArguments) { int32_t iLength = pArguments->GetLength(); if (iLength < 0 || iLength > 1) { ThrowParamCountMismatchException(L"importData"); @@ -620,7 +640,7 @@ void CJX_HostPseudoModel::ImportData(CFXJSE_Arguments* pArguments) { // Not implemented. } -void CJX_HostPseudoModel::ExportData(CFXJSE_Arguments* pArguments) { +void CJX_HostPseudoModel::exportData(CFXJSE_Arguments* pArguments) { int32_t iLength = pArguments->GetLength(); if (iLength < 0 || iLength > 2) { ThrowParamCountMismatchException(L"exportData"); @@ -644,7 +664,7 @@ void CJX_HostPseudoModel::ExportData(CFXJSE_Arguments* pArguments) { pNotify->GetDocEnvironment()->ExportData(hDoc, wsFilePath, bXDP); } -void CJX_HostPseudoModel::PageUp(CFXJSE_Arguments* pArguments) { +void CJX_HostPseudoModel::pageUp(CFXJSE_Arguments* pArguments) { CXFA_FFNotify* pNotify = GetDocument()->GetNotify(); if (!pNotify) return; @@ -659,7 +679,7 @@ void CJX_HostPseudoModel::PageUp(CFXJSE_Arguments* pArguments) { pNotify->GetDocEnvironment()->SetCurrentPage(hDoc, nNewPage); } -void CJX_HostPseudoModel::PageDown(CFXJSE_Arguments* pArguments) { +void CJX_HostPseudoModel::pageDown(CFXJSE_Arguments* pArguments) { CXFA_FFNotify* pNotify = GetDocument()->GetNotify(); if (!pNotify) return; @@ -678,14 +698,3 @@ void CJX_HostPseudoModel::PageDown(CFXJSE_Arguments* pArguments) { pNotify->GetDocEnvironment()->SetCurrentPage(hDoc, nNewPage); } - -void CJX_HostPseudoModel::CurrentDateTime(CFXJSE_Arguments* pArguments) { - CXFA_FFNotify* pNotify = GetDocument()->GetNotify(); - if (!pNotify) - return; - - WideString wsDataTime = pNotify->GetCurrentDateTime(); - CFXJSE_Value* pValue = pArguments->GetReturnValue(); - if (pValue) - pValue->SetString(wsDataTime.UTF8Encode().AsStringView()); -} diff --git a/fxjs/cjx_hostpseudomodel.h b/fxjs/cjx_hostpseudomodel.h index 9a71bc4224..d5c90aa87c 100644 --- a/fxjs/cjx_hostpseudomodel.h +++ b/fxjs/cjx_hostpseudomodel.h @@ -7,10 +7,10 @@ #ifndef FXJS_CJX_HOSTPSEUDOMODEL_H_ #define FXJS_CJX_HOSTPSEUDOMODEL_H_ +#include "fxjs/CJX_Define.h" #include "fxjs/cjx_object.h" #include "xfa/fxfa/fxfa_basic.h" -class CFXJSE_Arguments; class CFXJSE_Value; class CScript_HostPseudoModel; @@ -36,27 +36,29 @@ class CJX_HostPseudoModel : public CJX_Object { void Variation(CFXJSE_Value* pValue, bool bSetting, XFA_Attribute eAttribute); void Version(CFXJSE_Value* pValue, bool bSetting, XFA_Attribute eAttribute); void Name(CFXJSE_Value* pValue, bool bSetting, XFA_Attribute eAttribute); - void GotoURL(CFXJSE_Arguments* pArguments); - void OpenList(CFXJSE_Arguments* pArguments); - void Response(CFXJSE_Arguments* pArguments); - void DocumentInBatch(CFXJSE_Arguments* pArguments); - void ResetData(CFXJSE_Arguments* pArguments); - void Beep(CFXJSE_Arguments* pArguments); - void SetFocus(CFXJSE_Arguments* pArguments); - void GetFocus(CFXJSE_Arguments* pArguments); - void MessageBox(CFXJSE_Arguments* pArguments); - void DocumentCountInBatch(CFXJSE_Arguments* pArguments); - void Print(CFXJSE_Arguments* pArguments); - void ImportData(CFXJSE_Arguments* pArguments); - void ExportData(CFXJSE_Arguments* pArguments); - void PageUp(CFXJSE_Arguments* pArguments); - void PageDown(CFXJSE_Arguments* pArguments); - void CurrentDateTime(CFXJSE_Arguments* pArguments); + + JS_METHOD(beep, CJX_HostPseudoModel); + JS_METHOD(documentCountInBatch, CJX_HostPseudoModel); + JS_METHOD(documentInBatch, CJX_HostPseudoModel); + JS_METHOD(exportData, CJX_HostPseudoModel); + JS_METHOD(getFocus, CJX_HostPseudoModel); + JS_METHOD(gotoURL, CJX_HostPseudoModel); + JS_METHOD(importData, CJX_HostPseudoModel); + JS_METHOD(messageBox, CJX_HostPseudoModel); + JS_METHOD(openList, CJX_HostPseudoModel); + JS_METHOD(pageDown, CJX_HostPseudoModel); + JS_METHOD(pageUp, CJX_HostPseudoModel); + JS_METHOD(print, CJX_HostPseudoModel); + JS_METHOD(resetData, CJX_HostPseudoModel); + JS_METHOD(response, CJX_HostPseudoModel); + JS_METHOD(setFocus, CJX_HostPseudoModel); private: bool ValidateArgsForMsg(CFXJSE_Arguments* pArguments, int32_t iArgIndex, WideString& wsValue); + + static const CJX_MethodSpec MethodSpecs[]; }; #endif // FXJS_CJX_HOSTPSEUDOMODEL_H_ diff --git a/fxjs/cjx_layoutpseudomodel.cpp b/fxjs/cjx_layoutpseudomodel.cpp index 9767c15d3a..cc7c154841 100644 --- a/fxjs/cjx_layoutpseudomodel.cpp +++ b/fxjs/cjx_layoutpseudomodel.cpp @@ -24,8 +24,32 @@ #include "xfa/fxfa/parser/cxfa_nodeiteratortemplate.h" #include "xfa/fxfa/parser/cxfa_traversestrategy_contentlayoutitem.h" +const CJX_MethodSpec CJX_LayoutPseudoModel::MethodSpecs[] = { + {"absPage", absPage_static}, + {"absPageCount", absPageCount_static}, + {"absPageCountInBatch", absPageCountInBatch_static}, + {"absPageInBatch", absPageInBatch_static}, + {"absPageSpan", absPageSpan_static}, + {"h", h_static}, + {"page", page_static}, + {"pageContent", pageContent_static}, + {"pageCount", pageCount_static}, + {"pageSpan", pageSpan_static}, + {"relayout", relayout_static}, + {"relayoutPageArea", relayoutPageArea_static}, + {"sheet", sheet_static}, + {"sheetCount", sheetCount_static}, + {"sheetCountInBatch", sheetCountInBatch_static}, + {"sheetInBatch", sheetInBatch_static}, + {"w", w_static}, + {"x", x_static}, + {"y", y_static}, + {"", nullptr}}; + CJX_LayoutPseudoModel::CJX_LayoutPseudoModel(CScript_LayoutPseudoModel* model) - : CJX_Object(model) {} + : CJX_Object(model) { + DefineMethods(MethodSpecs); +} CJX_LayoutPseudoModel::~CJX_LayoutPseudoModel() {} @@ -122,19 +146,19 @@ void CJX_LayoutPseudoModel::HWXY(CFXJSE_Arguments* pArguments, pValue->SetFloat(fValue); } -void CJX_LayoutPseudoModel::H(CFXJSE_Arguments* pArguments) { +void CJX_LayoutPseudoModel::h(CFXJSE_Arguments* pArguments) { HWXY(pArguments, XFA_LAYOUTMODEL_H); } -void CJX_LayoutPseudoModel::W(CFXJSE_Arguments* pArguments) { +void CJX_LayoutPseudoModel::w(CFXJSE_Arguments* pArguments) { HWXY(pArguments, XFA_LAYOUTMODEL_W); } -void CJX_LayoutPseudoModel::X(CFXJSE_Arguments* pArguments) { +void CJX_LayoutPseudoModel::x(CFXJSE_Arguments* pArguments) { HWXY(pArguments, XFA_LAYOUTMODEL_X); } -void CJX_LayoutPseudoModel::Y(CFXJSE_Arguments* pArguments) { +void CJX_LayoutPseudoModel::y(CFXJSE_Arguments* pArguments) { HWXY(pArguments, XFA_LAYOUTMODEL_Y); } @@ -163,11 +187,11 @@ void CJX_LayoutPseudoModel::NumberedPageCount(CFXJSE_Arguments* pArguments, pArguments->GetReturnValue()->SetInteger(iPageCount); } -void CJX_LayoutPseudoModel::PageCount(CFXJSE_Arguments* pArguments) { +void CJX_LayoutPseudoModel::pageCount(CFXJSE_Arguments* pArguments) { NumberedPageCount(pArguments, true); } -void CJX_LayoutPseudoModel::PageSpan(CFXJSE_Arguments* pArguments) { +void CJX_LayoutPseudoModel::pageSpan(CFXJSE_Arguments* pArguments) { int32_t iLength = pArguments->GetLength(); if (iLength != 1) { ThrowParamCountMismatchException(L"pageSpan"); @@ -197,7 +221,7 @@ void CJX_LayoutPseudoModel::PageSpan(CFXJSE_Arguments* pArguments) { pValue->SetInteger(iPageSpan); } -void CJX_LayoutPseudoModel::Page(CFXJSE_Arguments* pArguments) { +void CJX_LayoutPseudoModel::page(CFXJSE_Arguments* pArguments) { PageInternals(pArguments, false); } @@ -335,7 +359,7 @@ std::vector<CXFA_Node*> CJX_LayoutPseudoModel::GetObjArray( return retArray; } -void CJX_LayoutPseudoModel::PageContent(CFXJSE_Arguments* pArguments) { +void CJX_LayoutPseudoModel::pageContent(CFXJSE_Arguments* pArguments) { int32_t iLength = pArguments->GetLength(); if (iLength < 1 || iLength > 3) { ThrowParamCountMismatchException(L"pageContent"); @@ -371,19 +395,19 @@ void CJX_LayoutPseudoModel::PageContent(CFXJSE_Arguments* pArguments) { GetDocument()->GetScriptContext()->GetJseNormalClass()); } -void CJX_LayoutPseudoModel::AbsPageCount(CFXJSE_Arguments* pArguments) { +void CJX_LayoutPseudoModel::absPageCount(CFXJSE_Arguments* pArguments) { NumberedPageCount(pArguments, false); } -void CJX_LayoutPseudoModel::AbsPageCountInBatch(CFXJSE_Arguments* pArguments) { +void CJX_LayoutPseudoModel::absPageCountInBatch(CFXJSE_Arguments* pArguments) { pArguments->GetReturnValue()->SetInteger(0); } -void CJX_LayoutPseudoModel::SheetCountInBatch(CFXJSE_Arguments* pArguments) { +void CJX_LayoutPseudoModel::sheetCountInBatch(CFXJSE_Arguments* pArguments) { pArguments->GetReturnValue()->SetInteger(0); } -void CJX_LayoutPseudoModel::Relayout(CFXJSE_Arguments* pArguments) { +void CJX_LayoutPseudoModel::relayout(CFXJSE_Arguments* pArguments) { CXFA_Node* pRootNode = GetDocument()->GetRoot(); CXFA_Node* pFormRoot = pRootNode->GetFirstChildByClass(XFA_Element::Form); CXFA_Node* pContentRootNode = pFormRoot->GetNodeItem(XFA_NODEITEM_FirstChild); @@ -394,11 +418,11 @@ void CJX_LayoutPseudoModel::Relayout(CFXJSE_Arguments* pArguments) { pLayoutProcessor->SetForceReLayout(true); } -void CJX_LayoutPseudoModel::AbsPageSpan(CFXJSE_Arguments* pArguments) { - PageSpan(pArguments); +void CJX_LayoutPseudoModel::absPageSpan(CFXJSE_Arguments* pArguments) { + pageSpan(pArguments); } -void CJX_LayoutPseudoModel::AbsPageInBatch(CFXJSE_Arguments* pArguments) { +void CJX_LayoutPseudoModel::absPageInBatch(CFXJSE_Arguments* pArguments) { if (pArguments->GetLength() != 1) { ThrowParamCountMismatchException(L"absPageInBatch"); return; @@ -407,7 +431,7 @@ void CJX_LayoutPseudoModel::AbsPageInBatch(CFXJSE_Arguments* pArguments) { pArguments->GetReturnValue()->SetInteger(0); } -void CJX_LayoutPseudoModel::SheetInBatch(CFXJSE_Arguments* pArguments) { +void CJX_LayoutPseudoModel::sheetInBatch(CFXJSE_Arguments* pArguments) { if (pArguments->GetLength() != 1) { ThrowParamCountMismatchException(L"sheetInBatch"); return; @@ -416,17 +440,17 @@ void CJX_LayoutPseudoModel::SheetInBatch(CFXJSE_Arguments* pArguments) { pArguments->GetReturnValue()->SetInteger(0); } -void CJX_LayoutPseudoModel::Sheet(CFXJSE_Arguments* pArguments) { +void CJX_LayoutPseudoModel::sheet(CFXJSE_Arguments* pArguments) { PageInternals(pArguments, true); } -void CJX_LayoutPseudoModel::RelayoutPageArea(CFXJSE_Arguments* pArguments) {} +void CJX_LayoutPseudoModel::relayoutPageArea(CFXJSE_Arguments* pArguments) {} -void CJX_LayoutPseudoModel::SheetCount(CFXJSE_Arguments* pArguments) { +void CJX_LayoutPseudoModel::sheetCount(CFXJSE_Arguments* pArguments) { NumberedPageCount(pArguments, false); } -void CJX_LayoutPseudoModel::AbsPage(CFXJSE_Arguments* pArguments) { +void CJX_LayoutPseudoModel::absPage(CFXJSE_Arguments* pArguments) { PageInternals(pArguments, true); } diff --git a/fxjs/cjx_layoutpseudomodel.h b/fxjs/cjx_layoutpseudomodel.h index 66adb79927..9eba2ac85f 100644 --- a/fxjs/cjx_layoutpseudomodel.h +++ b/fxjs/cjx_layoutpseudomodel.h @@ -9,6 +9,7 @@ #include <vector> +#include "fxjs/CJX_Define.h" #include "fxjs/cjx_object.h" enum XFA_LAYOUTMODEL_HWXY { @@ -31,25 +32,25 @@ class CJX_LayoutPseudoModel : public CJX_Object { void Ready(CFXJSE_Value* pValue, bool bSetting, XFA_Attribute eAttribute); - void H(CFXJSE_Arguments* pArguments); - void W(CFXJSE_Arguments* pArguments); - void X(CFXJSE_Arguments* pArguments); - void Y(CFXJSE_Arguments* pArguments); - void PageCount(CFXJSE_Arguments* pArguments); - void PageSpan(CFXJSE_Arguments* pArguments); - void Page(CFXJSE_Arguments* pArguments); - void PageContent(CFXJSE_Arguments* pArguments); - void AbsPageCount(CFXJSE_Arguments* pArguments); - void AbsPageCountInBatch(CFXJSE_Arguments* pArguments); - void SheetCountInBatch(CFXJSE_Arguments* pArguments); - void Relayout(CFXJSE_Arguments* pArguments); - void AbsPageSpan(CFXJSE_Arguments* pArguments); - void AbsPageInBatch(CFXJSE_Arguments* pArguments); - void SheetInBatch(CFXJSE_Arguments* pArguments); - void Sheet(CFXJSE_Arguments* pArguments); - void RelayoutPageArea(CFXJSE_Arguments* pArguments); - void SheetCount(CFXJSE_Arguments* pArguments); - void AbsPage(CFXJSE_Arguments* pArguments); + JS_METHOD(absPage, CJX_LayoutPseudoModel); + JS_METHOD(absPageCount, CJX_LayoutPseudoModel); + JS_METHOD(absPageCountInBatch, CJX_LayoutPseudoModel); + JS_METHOD(absPageInBatch, CJX_LayoutPseudoModel); + JS_METHOD(absPageSpan, CJX_LayoutPseudoModel); + JS_METHOD(h, CJX_LayoutPseudoModel); + JS_METHOD(page, CJX_LayoutPseudoModel); + JS_METHOD(pageContent, CJX_LayoutPseudoModel); + JS_METHOD(pageCount, CJX_LayoutPseudoModel); + JS_METHOD(pageSpan, CJX_LayoutPseudoModel); + JS_METHOD(relayout, CJX_LayoutPseudoModel); + JS_METHOD(relayoutPageArea, CJX_LayoutPseudoModel); + JS_METHOD(sheet, CJX_LayoutPseudoModel); + JS_METHOD(sheetCount, CJX_LayoutPseudoModel); + JS_METHOD(sheetCountInBatch, CJX_LayoutPseudoModel); + JS_METHOD(sheetInBatch, CJX_LayoutPseudoModel); + JS_METHOD(w, CJX_LayoutPseudoModel); + JS_METHOD(x, CJX_LayoutPseudoModel); + JS_METHOD(y, CJX_LayoutPseudoModel); private: void NumberedPageCount(CFXJSE_Arguments* pArguments, bool bNumbered); @@ -59,6 +60,8 @@ class CJX_LayoutPseudoModel : public CJX_Object { const WideString& wsType, bool bOnPageArea); void PageInternals(CFXJSE_Arguments* pArguments, bool bAbsPage); + + static const CJX_MethodSpec MethodSpecs[]; }; #endif // FXJS_CJX_LAYOUTPSEUDOMODEL_H_ diff --git a/fxjs/cjx_logpseudomodel.cpp b/fxjs/cjx_logpseudomodel.cpp index 815f1a8a98..759817257d 100644 --- a/fxjs/cjx_logpseudomodel.cpp +++ b/fxjs/cjx_logpseudomodel.cpp @@ -10,17 +10,27 @@ #include "fxjs/cfxjse_value.h" #include "xfa/fxfa/parser/cscript_logpseudomodel.h" +const CJX_MethodSpec CJX_LogPseudoModel::MethodSpecs[] = { + {"message", message_static}, + {"traceEnabled", traceEnabled_static}, + {"traceActivate", traceActivate_static}, + {"traceDeactivate", traceDeactivate_static}, + {"trace", trace_static}, + {"", nullptr}}; + CJX_LogPseudoModel::CJX_LogPseudoModel(CScript_LogPseudoModel* model) - : CJX_Object(model) {} + : CJX_Object(model) { + DefineMethods(MethodSpecs); +} CJX_LogPseudoModel::~CJX_LogPseudoModel() {} -void CJX_LogPseudoModel::Message(CFXJSE_Arguments* pArguments) {} +void CJX_LogPseudoModel::message(CFXJSE_Arguments* pArguments) {} -void CJX_LogPseudoModel::TraceEnabled(CFXJSE_Arguments* pArguments) {} +void CJX_LogPseudoModel::traceEnabled(CFXJSE_Arguments* pArguments) {} -void CJX_LogPseudoModel::TraceActivate(CFXJSE_Arguments* pArguments) {} +void CJX_LogPseudoModel::traceActivate(CFXJSE_Arguments* pArguments) {} -void CJX_LogPseudoModel::TraceDeactivate(CFXJSE_Arguments* pArguments) {} +void CJX_LogPseudoModel::traceDeactivate(CFXJSE_Arguments* pArguments) {} -void CJX_LogPseudoModel::Trace(CFXJSE_Arguments* pArguments) {} +void CJX_LogPseudoModel::trace(CFXJSE_Arguments* pArguments) {} diff --git a/fxjs/cjx_logpseudomodel.h b/fxjs/cjx_logpseudomodel.h index 26a47026e7..e22301e303 100644 --- a/fxjs/cjx_logpseudomodel.h +++ b/fxjs/cjx_logpseudomodel.h @@ -7,10 +7,9 @@ #ifndef FXJS_CJX_LOGPSEUDOMODEL_H_ #define FXJS_CJX_LOGPSEUDOMODEL_H_ +#include "fxjs/CJX_Define.h" #include "fxjs/cjx_object.h" -class CFXJSE_Arguments; -class CFXJSE_Value; class CScript_LogPseudoModel; class CJX_LogPseudoModel : public CJX_Object { @@ -18,11 +17,14 @@ class CJX_LogPseudoModel : public CJX_Object { explicit CJX_LogPseudoModel(CScript_LogPseudoModel* model); ~CJX_LogPseudoModel() override; - void Message(CFXJSE_Arguments* pArguments); - void TraceEnabled(CFXJSE_Arguments* pArguments); - void TraceActivate(CFXJSE_Arguments* pArguments); - void TraceDeactivate(CFXJSE_Arguments* pArguments); - void Trace(CFXJSE_Arguments* pArguments); + JS_METHOD(message, CJX_LogPseudoModel); + JS_METHOD(traceEnabled, CJX_LogPseudoModel); + JS_METHOD(traceActivate, CJX_LogPseudoModel); + JS_METHOD(traceDeactivate, CJX_LogPseudoModel); + JS_METHOD(trace, CJX_LogPseudoModel); + + private: + static const CJX_MethodSpec MethodSpecs[]; }; #endif // FXJS_CJX_LOGPSEUDOMODEL_H_ diff --git a/fxjs/cjx_node.cpp b/fxjs/cjx_node.cpp index aaff83ecb1..4a07b31d4a 100644 --- a/fxjs/cjx_node.cpp +++ b/fxjs/cjx_node.cpp @@ -32,19 +32,6 @@ namespace { -void XFA_DeleteWideString(void* pData) { - delete static_cast<WideString*>(pData); -} - -void XFA_CopyWideString(void*& pData) { - if (!pData) - return; - pData = new WideString(*reinterpret_cast<WideString*>(pData)); -} - -XFA_MAPDATABLOCKCALLBACKINFO deleteWideStringCallBack = {XFA_DeleteWideString, - XFA_CopyWideString}; - std::tuple<int32_t, int32_t, int32_t> StrToRGB(const WideString& strRGB) { int32_t r = 0; int32_t g = 0; @@ -76,56 +63,45 @@ std::tuple<int32_t, int32_t, int32_t> StrToRGB(const WideString& strRGB) { return {r, g, b}; } -enum XFA_KEYTYPE { - XFA_KEYTYPE_Custom, - XFA_KEYTYPE_Element, +enum class EventAppliesToo { + kNone = 0, + kAll = 1, + kAllNonRecursive = 2, + kSubform = 3, + kFieldOrExclusion = 4, + kField = 5, + kSignature = 6, + kChoiceList = 7 }; -void* GetMapKey_Custom(const WideStringView& wsKey) { - uint32_t dwKey = FX_HashCode_GetW(wsKey, false); - return (void*)(uintptr_t)((dwKey << 1) | XFA_KEYTYPE_Custom); -} - -void* GetMapKey_Element(XFA_Element eType, XFA_Attribute eAttribute) { - return (void*)(uintptr_t)((static_cast<uint32_t>(eType) << 16) | - (static_cast<uint32_t>(eAttribute) << 8) | - XFA_KEYTYPE_Element); -} - struct XFA_ExecEventParaInfo { public: uint32_t m_uHash; const wchar_t* m_lpcEventName; XFA_EVENTTYPE m_eventType; - uint32_t m_validFlags; + EventAppliesToo m_validFlags; }; const XFA_ExecEventParaInfo gs_eventParaInfos[] = { - {0x02a6c55a, L"postSubmit", XFA_EVENT_PostSubmit, 0}, - {0x0ab466bb, L"preSubmit", XFA_EVENT_PreSubmit, 0}, - {0x109d7ce7, L"mouseEnter", XFA_EVENT_MouseEnter, 5}, - {0x17fad373, L"postPrint", XFA_EVENT_PostPrint, 0}, - {0x1bfc72d9, L"preOpen", XFA_EVENT_PreOpen, 7}, - {0x2196a452, L"initialize", XFA_EVENT_Initialize, 1}, - {0x27410f03, L"mouseExit", XFA_EVENT_MouseExit, 5}, - {0x33c43dec, L"docClose", XFA_EVENT_DocClose, 0}, - {0x361fa1b6, L"preSave", XFA_EVENT_PreSave, 0}, - {0x36f1c6d8, L"preSign", XFA_EVENT_PreSign, 6}, - {0x4731d6ba, L"exit", XFA_EVENT_Exit, 2}, - {0x56bf456b, L"docReady", XFA_EVENT_DocReady, 0}, - {0x7233018a, L"validate", XFA_EVENT_Validate, 1}, - {0x8808385e, L"indexChange", XFA_EVENT_IndexChange, 3}, - {0x891f4606, L"change", XFA_EVENT_Change, 4}, - {0x9528a7b4, L"prePrint", XFA_EVENT_PrePrint, 0}, - {0x9f693b21, L"mouseDown", XFA_EVENT_MouseDown, 5}, - {0xcdce56b3, L"full", XFA_EVENT_Full, 4}, - {0xd576d08e, L"mouseUp", XFA_EVENT_MouseUp, 5}, - {0xd95657a6, L"click", XFA_EVENT_Click, 4}, - {0xdbfbe02e, L"calculate", XFA_EVENT_Calculate, 1}, - {0xe25fa7b8, L"postOpen", XFA_EVENT_PostOpen, 7}, - {0xe28dce7e, L"enter", XFA_EVENT_Enter, 2}, - {0xfc82d695, L"postSave", XFA_EVENT_PostSave, 0}, - {0xfd54fbb7, L"postSign", XFA_EVENT_PostSign, 6}, + {0x109d7ce7, L"mouseEnter", XFA_EVENT_MouseEnter, EventAppliesToo::kField}, + {0x1bfc72d9, L"preOpen", XFA_EVENT_PreOpen, EventAppliesToo::kChoiceList}, + {0x2196a452, L"initialize", XFA_EVENT_Initialize, EventAppliesToo::kAll}, + {0x27410f03, L"mouseExit", XFA_EVENT_MouseExit, EventAppliesToo::kField}, + {0x36f1c6d8, L"preSign", XFA_EVENT_PreSign, EventAppliesToo::kSignature}, + {0x4731d6ba, L"exit", XFA_EVENT_Exit, EventAppliesToo::kAllNonRecursive}, + {0x7233018a, L"validate", XFA_EVENT_Validate, EventAppliesToo::kAll}, + {0x8808385e, L"indexChange", XFA_EVENT_IndexChange, + EventAppliesToo::kSubform}, + {0x891f4606, L"change", XFA_EVENT_Change, + EventAppliesToo::kFieldOrExclusion}, + {0x9f693b21, L"mouseDown", XFA_EVENT_MouseDown, EventAppliesToo::kField}, + {0xcdce56b3, L"full", XFA_EVENT_Full, EventAppliesToo::kFieldOrExclusion}, + {0xd576d08e, L"mouseUp", XFA_EVENT_MouseUp, EventAppliesToo::kField}, + {0xd95657a6, L"click", XFA_EVENT_Click, EventAppliesToo::kFieldOrExclusion}, + {0xdbfbe02e, L"calculate", XFA_EVENT_Calculate, EventAppliesToo::kAll}, + {0xe25fa7b8, L"postOpen", XFA_EVENT_PostOpen, EventAppliesToo::kChoiceList}, + {0xe28dce7e, L"enter", XFA_EVENT_Enter, EventAppliesToo::kAllNonRecursive}, + {0xfd54fbb7, L"postSign", XFA_EVENT_PostSign, EventAppliesToo::kSignature}, }; const XFA_ExecEventParaInfo* GetEventParaInfoByName( @@ -148,32 +124,26 @@ const XFA_ExecEventParaInfo* GetEventParaInfoByName( } // namespace -static void XFA_DefaultFreeData(void* pData) {} - -static XFA_MAPDATABLOCKCALLBACKINFO gs_XFADefaultFreeData = { - XFA_DefaultFreeData, nullptr}; - -struct XFA_MAPDATABLOCK { - uint8_t* GetData() const { return (uint8_t*)this + sizeof(XFA_MAPDATABLOCK); } - - XFA_MAPDATABLOCKCALLBACKINFO* pCallbackInfo; - int32_t iBytes; -}; - -struct XFA_MAPMODULEDATA { - XFA_MAPMODULEDATA() {} - ~XFA_MAPMODULEDATA() {} - - std::map<void*, void*> m_ValueMap; - std::map<void*, XFA_MAPDATABLOCK*> m_BufferMap; -}; - -CJX_Node::CJX_Node(CXFA_Node* node) : CJX_Object(node) {} +const CJX_MethodSpec CJX_Node::MethodSpecs[] = { + {"applyXSL", applyXSL_static}, + {"assignNode", assignNode_static}, + {"clone", clone_static}, + {"getAttribute", getAttribute_static}, + {"getElement", getElement_static}, + {"isPropertySpecified", isPropertySpecified_static}, + {"loadXML", loadXML_static}, + {"saveFilteredXML", saveFilteredXML_static}, + {"saveXML", saveXML_static}, + {"setAttribute", setAttribute_static}, + {"setElement", setElement_static}, + {"", nullptr}}; -CJX_Node::~CJX_Node() { - ClearMapModuleBuffer(); +CJX_Node::CJX_Node(CXFA_Node* node) : CJX_Tree(node) { + DefineMethods(MethodSpecs); } +CJX_Node::~CJX_Node() = default; + CXFA_Node* CJX_Node::GetXFANode() { return static_cast<CXFA_Node*>(GetXFAObject()); } @@ -182,120 +152,6 @@ const CXFA_Node* CJX_Node::GetXFANode() const { return static_cast<const CXFA_Node*>(GetXFAObject()); } -bool CJX_Node::HasAttribute(XFA_Attribute eAttr) { - void* pKey = GetMapKey_Element(GetXFANode()->GetElementType(), eAttr); - return HasMapModuleKey(pKey); -} - -bool CJX_Node::SetAttribute(XFA_Attribute eAttr, - const WideStringView& wsValue, - bool bNotify) { - XFA_AttributeType eType = GetXFANode()->GetAttributeType(eAttr); - switch (eType) { - case XFA_AttributeType::Enum: { - pdfium::Optional<XFA_AttributeEnum> item = - CXFA_Node::NameToAttributeEnum(wsValue); - return SetEnum(eAttr, - item ? *item : *(GetXFANode()->GetDefaultEnum(eAttr)), - bNotify); - } - case XFA_AttributeType::CData: - return SetCData(eAttr, WideString(wsValue), bNotify, false); - case XFA_AttributeType::Boolean: - return SetBoolean(eAttr, wsValue != L"0", bNotify); - case XFA_AttributeType::Integer: - return SetInteger(eAttr, - FXSYS_round(FXSYS_wcstof(wsValue.unterminated_c_str(), - wsValue.GetLength(), nullptr)), - bNotify); - case XFA_AttributeType::Measure: - return SetMeasure(eAttr, CXFA_Measurement(wsValue), bNotify); - default: - break; - } - return false; -} - -bool CJX_Node::SetAttribute(const WideStringView& wsAttr, - const WideStringView& wsValue, - bool bNotify) { - XFA_Attribute attr = CXFA_Node::NameToAttribute(wsValue); - if (attr != XFA_Attribute::Unknown) - return SetAttribute(attr, wsValue, bNotify); - - void* pKey = GetMapKey_Custom(wsAttr); - SetMapModuleString(pKey, wsValue); - return true; -} - -WideString CJX_Node::GetAttribute(const WideStringView& attr) { - return TryAttribute(attr, true).value_or(WideString()); -} - -WideString CJX_Node::GetAttribute(XFA_Attribute attr) { - return TryAttribute(attr, true).value_or(WideString()); -} - -pdfium::Optional<WideString> CJX_Node::TryAttribute(XFA_Attribute eAttr, - bool bUseDefault) { - XFA_AttributeType eType = GetXFANode()->GetAttributeType(eAttr); - switch (eType) { - case XFA_AttributeType::Enum: { - pdfium::Optional<XFA_AttributeEnum> value = TryEnum(eAttr, bUseDefault); - if (!value) - return {}; - - return {CXFA_Node::AttributeEnumToName(*value)}; - } - case XFA_AttributeType::CData: - return TryCData(eAttr, bUseDefault); - - case XFA_AttributeType::Boolean: { - pdfium::Optional<bool> value = TryBoolean(eAttr, bUseDefault); - if (!value) - return {}; - return {*value ? L"1" : L"0"}; - } - case XFA_AttributeType::Integer: { - pdfium::Optional<int32_t> iValue = TryInteger(eAttr, bUseDefault); - if (!iValue) - return {}; - return {WideString::Format(L"%d", *iValue)}; - } - case XFA_AttributeType::Measure: { - pdfium::Optional<CXFA_Measurement> value = TryMeasure(eAttr, bUseDefault); - if (!value) - return {}; - - return {value->ToString()}; - } - default: - break; - } - return {}; -} - -pdfium::Optional<WideString> CJX_Node::TryAttribute( - const WideStringView& wsAttr, - bool bUseDefault) { - XFA_Attribute attr = CXFA_Node::NameToAttribute(wsAttr); - if (attr != XFA_Attribute::Unknown) - return TryAttribute(attr, bUseDefault); - - void* pKey = GetMapKey_Custom(wsAttr); - WideStringView wsValueC; - if (!GetMapModuleString(pKey, wsValueC)) - return {}; - - return {WideString(wsValueC)}; -} - -void CJX_Node::RemoveAttribute(const WideStringView& wsAttr) { - void* pKey = GetMapKey_Custom(wsAttr); - if (pKey) - RemoveMapModuleKey(pKey); -} - int32_t CJX_Node::Subform_and_SubformSet_InstanceIndex() { int32_t index = 0; for (CXFA_Node* pNode = GetXFANode()->GetNodeItem(XFA_NODEITEM_PrevSibling); @@ -393,207 +249,7 @@ int32_t CJX_Node::InstanceManager_MoveInstance(int32_t iTo, int32_t iFrom) { return 0; } -void CJX_Node::Script_TreeClass_ResolveNode(CFXJSE_Arguments* pArguments) { - int32_t iLength = pArguments->GetLength(); - if (iLength != 1) { - ThrowParamCountMismatchException(L"resolveNode"); - return; - } - WideString wsExpression = - WideString::FromUTF8(pArguments->GetUTF8String(0).AsStringView()); - CFXJSE_Engine* pScriptContext = GetDocument()->GetScriptContext(); - if (!pScriptContext) - return; - CXFA_Node* refNode = GetXFANode(); - if (refNode->GetElementType() == XFA_Element::Xfa) - refNode = ToNode(pScriptContext->GetThisObject()); - uint32_t dwFlag = XFA_RESOLVENODE_Children | XFA_RESOLVENODE_Attributes | - XFA_RESOLVENODE_Properties | XFA_RESOLVENODE_Parent | - XFA_RESOLVENODE_Siblings; - XFA_RESOLVENODE_RS resolveNodeRS; - if (!pScriptContext->ResolveObjects(refNode, wsExpression.AsStringView(), - &resolveNodeRS, dwFlag, nullptr)) { - pArguments->GetReturnValue()->SetNull(); - return; - } - if (resolveNodeRS.dwFlags == XFA_ResolveNode_RSType_Nodes) { - CXFA_Object* pObject = resolveNodeRS.objects.front(); - pArguments->GetReturnValue()->Assign( - pScriptContext->GetJSValueFromMap(pObject)); - } else { - const XFA_SCRIPTATTRIBUTEINFO* lpAttributeInfo = - resolveNodeRS.pScriptAttribute; - if (lpAttributeInfo && - lpAttributeInfo->eValueType == XFA_ScriptType::Object) { - auto pValue = - pdfium::MakeUnique<CFXJSE_Value>(pScriptContext->GetRuntime()); - CJX_Object* jsObject = resolveNodeRS.objects.front()->JSObject(); - (jsObject->*(lpAttributeInfo->callback))(pValue.get(), false, - lpAttributeInfo->attribute); - pArguments->GetReturnValue()->Assign(pValue.get()); - } else { - pArguments->GetReturnValue()->SetNull(); - } - } -} - -void CJX_Node::Script_TreeClass_ResolveNodes(CFXJSE_Arguments* pArguments) { - int32_t iLength = pArguments->GetLength(); - if (iLength != 1) { - ThrowParamCountMismatchException(L"resolveNodes"); - return; - } - - WideString wsExpression = - WideString::FromUTF8(pArguments->GetUTF8String(0).AsStringView()); - CFXJSE_Value* pValue = pArguments->GetReturnValue(); - if (!pValue) - return; - - CXFA_Node* refNode = GetXFANode(); - if (refNode->GetElementType() == XFA_Element::Xfa) - refNode = ToNode(GetDocument()->GetScriptContext()->GetThisObject()); - - ResolveNodeList(pValue, wsExpression, - XFA_RESOLVENODE_Children | XFA_RESOLVENODE_Attributes | - XFA_RESOLVENODE_Properties | XFA_RESOLVENODE_Parent | - XFA_RESOLVENODE_Siblings, - refNode); -} - -void CJX_Node::ResolveNodeList(CFXJSE_Value* pValue, - WideString wsExpression, - uint32_t dwFlag, - CXFA_Node* refNode) { - CFXJSE_Engine* pScriptContext = GetDocument()->GetScriptContext(); - if (!pScriptContext) - return; - if (!refNode) - refNode = GetXFANode(); - - XFA_RESOLVENODE_RS resolveNodeRS; - pScriptContext->ResolveObjects(refNode, wsExpression.AsStringView(), - &resolveNodeRS, dwFlag, nullptr); - CXFA_ArrayNodeList* pNodeList = new CXFA_ArrayNodeList(GetDocument()); - if (resolveNodeRS.dwFlags == XFA_ResolveNode_RSType_Nodes) { - for (CXFA_Object* pObject : resolveNodeRS.objects) { - if (pObject->IsNode()) - pNodeList->Append(pObject->AsNode()); - } - } else { - if (resolveNodeRS.pScriptAttribute && - resolveNodeRS.pScriptAttribute->eValueType == XFA_ScriptType::Object) { - for (CXFA_Object* pObject : resolveNodeRS.objects) { - auto pValue = - pdfium::MakeUnique<CFXJSE_Value>(pScriptContext->GetRuntime()); - CJX_Object* jsObject = pObject->JSObject(); - (jsObject->*(resolveNodeRS.pScriptAttribute->callback))( - pValue.get(), false, resolveNodeRS.pScriptAttribute->attribute); - - CXFA_Object* obj = CFXJSE_Engine::ToObject(pValue.get(), nullptr); - if (obj->IsNode()) - pNodeList->Append(obj->AsNode()); - } - } - } - pValue->SetObject(pNodeList, pScriptContext->GetJseNormalClass()); -} - -void CJX_Node::Script_TreeClass_All(CFXJSE_Value* pValue, - bool bSetting, - XFA_Attribute eAttribute) { - if (bSetting) { - ThrowInvalidPropertyException(); - return; - } - - uint32_t dwFlag = XFA_RESOLVENODE_Siblings | XFA_RESOLVENODE_ALL; - WideString wsExpression = GetAttribute(XFA_Attribute::Name) + L"[*]"; - ResolveNodeList(pValue, wsExpression, dwFlag, nullptr); -} - -void CJX_Node::Script_TreeClass_Nodes(CFXJSE_Value* pValue, - bool bSetting, - XFA_Attribute eAttribute) { - CFXJSE_Engine* pScriptContext = GetDocument()->GetScriptContext(); - if (!pScriptContext) - return; - - if (bSetting) { - WideString wsMessage = L"Unable to set "; - FXJSE_ThrowMessage(wsMessage.UTF8Encode().AsStringView()); - return; - } - - CXFA_AttachNodeList* pNodeList = - new CXFA_AttachNodeList(GetDocument(), GetXFANode()); - pValue->SetObject(pNodeList, pScriptContext->GetJseNormalClass()); -} - -void CJX_Node::Script_TreeClass_ClassAll(CFXJSE_Value* pValue, - bool bSetting, - XFA_Attribute eAttribute) { - if (bSetting) { - ThrowInvalidPropertyException(); - return; - } - - WideString wsExpression = L"#" + GetXFANode()->GetClassName() + L"[*]"; - ResolveNodeList(pValue, wsExpression, - XFA_RESOLVENODE_Siblings | XFA_RESOLVENODE_ALL, nullptr); -} - -void CJX_Node::Script_TreeClass_Parent(CFXJSE_Value* pValue, - bool bSetting, - XFA_Attribute eAttribute) { - if (bSetting) { - ThrowInvalidPropertyException(); - return; - } - - CXFA_Node* pParent = GetXFANode()->GetNodeItem(XFA_NODEITEM_Parent); - if (!pParent) { - pValue->SetNull(); - return; - } - - pValue->Assign(GetDocument()->GetScriptContext()->GetJSValueFromMap(pParent)); -} - -void CJX_Node::Script_TreeClass_Index(CFXJSE_Value* pValue, - bool bSetting, - XFA_Attribute eAttribute) { - if (bSetting) { - ThrowInvalidPropertyException(); - return; - } - pValue->SetInteger(GetXFANode()->GetNodeSameNameIndex()); -} - -void CJX_Node::Script_TreeClass_ClassIndex(CFXJSE_Value* pValue, - bool bSetting, - XFA_Attribute eAttribute) { - if (bSetting) { - ThrowInvalidPropertyException(); - return; - } - pValue->SetInteger(GetXFANode()->GetNodeSameClassIndex()); -} - -void CJX_Node::Script_TreeClass_SomExpression(CFXJSE_Value* pValue, - bool bSetting, - XFA_Attribute eAttribute) { - if (bSetting) { - ThrowInvalidPropertyException(); - return; - } - - WideString wsSOMExpression; - GetXFANode()->GetSOMExpression(wsSOMExpression); - pValue->SetString(wsSOMExpression.UTF8Encode().AsStringView()); -} - -void CJX_Node::Script_NodeClass_ApplyXSL(CFXJSE_Arguments* pArguments) { +void CJX_Node::applyXSL(CFXJSE_Arguments* pArguments) { if (pArguments->GetLength() != 1) { ThrowParamCountMismatchException(L"applyXSL"); return; @@ -602,7 +258,7 @@ void CJX_Node::Script_NodeClass_ApplyXSL(CFXJSE_Arguments* pArguments) { // TODO(weili): check whether we need to implement this, pdfium:501. } -void CJX_Node::Script_NodeClass_AssignNode(CFXJSE_Arguments* pArguments) { +void CJX_Node::assignNode(CFXJSE_Arguments* pArguments) { int32_t iLength = pArguments->GetLength(); if (iLength < 1 || iLength > 3) { ThrowParamCountMismatchException(L"assignNode"); @@ -612,7 +268,7 @@ void CJX_Node::Script_NodeClass_AssignNode(CFXJSE_Arguments* pArguments) { // TODO(weili): check whether we need to implement this, pdfium:501. } -void CJX_Node::Script_NodeClass_Clone(CFXJSE_Arguments* pArguments) { +void CJX_Node::clone(CFXJSE_Arguments* pArguments) { int32_t iLength = pArguments->GetLength(); if (iLength != 1) { ThrowParamCountMismatchException(L"clone"); @@ -624,7 +280,7 @@ void CJX_Node::Script_NodeClass_Clone(CFXJSE_Arguments* pArguments) { GetDocument()->GetScriptContext()->GetJSValueFromMap(pCloneNode)); } -void CJX_Node::Script_NodeClass_GetAttribute(CFXJSE_Arguments* pArguments) { +void CJX_Node::getAttribute(CFXJSE_Arguments* pArguments) { int32_t iLength = pArguments->GetLength(); if (iLength != 1) { ThrowParamCountMismatchException(L"getAttribute"); @@ -641,7 +297,7 @@ void CJX_Node::Script_NodeClass_GetAttribute(CFXJSE_Arguments* pArguments) { GetAttribute(wsExpression.AsStringView()).UTF8Encode().AsStringView()); } -void CJX_Node::Script_NodeClass_GetElement(CFXJSE_Arguments* pArguments) { +void CJX_Node::getElement(CFXJSE_Arguments* pArguments) { int32_t iLength = pArguments->GetLength(); if (iLength < 1 || iLength > 2) { ThrowParamCountMismatchException(L"getElement"); @@ -658,8 +314,7 @@ void CJX_Node::Script_NodeClass_GetElement(CFXJSE_Arguments* pArguments) { GetDocument()->GetScriptContext()->GetJSValueFromMap(pNode)); } -void CJX_Node::Script_NodeClass_IsPropertySpecified( - CFXJSE_Arguments* pArguments) { +void CJX_Node::isPropertySpecified(CFXJSE_Arguments* pArguments) { int32_t iLength = pArguments->GetLength(); if (iLength < 1 || iLength > 3) { ThrowParamCountMismatchException(L"isPropertySpecified"); @@ -691,7 +346,7 @@ void CJX_Node::Script_NodeClass_IsPropertySpecified( pValue->SetBoolean(bHas); } -void CJX_Node::Script_NodeClass_LoadXML(CFXJSE_Arguments* pArguments) { +void CJX_Node::loadXML(CFXJSE_Arguments* pArguments) { int32_t iLength = pArguments->GetLength(); if (iLength < 1 || iLength > 3) { ThrowParamCountMismatchException(L"loadXML"); @@ -811,11 +466,11 @@ void CJX_Node::Script_NodeClass_LoadXML(CFXJSE_Arguments* pArguments) { pFakeRoot->SetFlag(XFA_NodeFlag_HasRemovedChildren, false); } -void CJX_Node::Script_NodeClass_SaveFilteredXML(CFXJSE_Arguments* pArguments) { +void CJX_Node::saveFilteredXML(CFXJSE_Arguments* pArguments) { // TODO(weili): Check whether we need to implement this, pdfium:501. } -void CJX_Node::Script_NodeClass_SaveXML(CFXJSE_Arguments* pArguments) { +void CJX_Node::saveXML(CFXJSE_Arguments* pArguments) { int32_t iLength = pArguments->GetLength(); if (iLength < 0 || iLength > 1) { ThrowParamCountMismatchException(L"saveXML"); @@ -862,7 +517,7 @@ void CJX_Node::Script_NodeClass_SaveXML(CFXJSE_Arguments* pArguments) { ByteStringView(pMemoryStream->GetBuffer(), pMemoryStream->GetSize())); } -void CJX_Node::Script_NodeClass_SetAttribute(CFXJSE_Arguments* pArguments) { +void CJX_Node::setAttribute(CFXJSE_Arguments* pArguments) { if (pArguments->GetLength() != 2) { ThrowParamCountMismatchException(L"setAttribute"); return; @@ -876,7 +531,7 @@ void CJX_Node::Script_NodeClass_SetAttribute(CFXJSE_Arguments* pArguments) { true); } -void CJX_Node::Script_NodeClass_SetElement(CFXJSE_Arguments* pArguments) { +void CJX_Node::setElement(CFXJSE_Arguments* pArguments) { int32_t iLength = pArguments->GetLength(); if (iLength != 1 && iLength != 2) { ThrowParamCountMismatchException(L"setElement"); @@ -950,40 +605,6 @@ void CJX_Node::Script_NodeClass_OneOfChild(CFXJSE_Value* pValue, } } -void CJX_Node::Script_ContainerClass_GetDelta(CFXJSE_Arguments* pArguments) {} - -void CJX_Node::Script_ContainerClass_GetDeltas(CFXJSE_Arguments* pArguments) { - CXFA_ArrayNodeList* pFormNodes = new CXFA_ArrayNodeList(GetDocument()); - pArguments->GetReturnValue()->SetObject( - pFormNodes, GetDocument()->GetScriptContext()->GetJseNormalClass()); -} - -void CJX_Node::Script_ModelClass_ClearErrorList(CFXJSE_Arguments* pArguments) {} - -void CJX_Node::Script_ModelClass_CreateNode(CFXJSE_Arguments* pArguments) { - Script_Template_CreateNode(pArguments); -} - -void CJX_Node::Script_ModelClass_IsCompatibleNS(CFXJSE_Arguments* pArguments) { - int32_t iLength = pArguments->GetLength(); - if (iLength < 1) { - ThrowParamCountMismatchException(L"isCompatibleNS"); - return; - } - - WideString wsNameSpace; - if (iLength >= 1) { - ByteString bsNameSpace = pArguments->GetUTF8String(0); - wsNameSpace = WideString::FromUTF8(bsNameSpace.AsStringView()); - } - - CFXJSE_Value* pValue = pArguments->GetReturnValue(); - if (!pValue) - return; - - pValue->SetBoolean(TryNamespace().value_or(WideString()) == wsNameSpace); -} - void CJX_Node::Script_ModelClass_Context(CFXJSE_Value* pValue, bool bSetting, XFA_Attribute eAttribute) {} @@ -1032,182 +653,6 @@ void CJX_Node::Script_Attribute_BOOLRead(CFXJSE_Value* pValue, pValue->SetString(GetBoolean(eAttribute) ? "1" : "0"); } -void CJX_Node::OnChanging(XFA_Attribute eAttr, bool bNotify) { - if (!bNotify || !GetXFANode()->IsInitialized()) - return; - - CXFA_FFNotify* pNotify = GetDocument()->GetNotify(); - if (pNotify) - pNotify->OnValueChanging(GetXFANode(), eAttr); -} - -void CJX_Node::OnChanged(XFA_Attribute eAttr, - bool bNotify, - bool bScriptModify) { - if (bNotify && GetXFANode()->IsInitialized()) - SendAttributeChangeMessage(eAttr, bScriptModify); -} - -void CJX_Node::SendAttributeChangeMessage(XFA_Attribute eAttribute, - bool bScriptModify) { - CXFA_LayoutProcessor* pLayoutPro = GetDocument()->GetLayoutProcessor(); - if (!pLayoutPro) - return; - - CXFA_FFNotify* pNotify = GetDocument()->GetNotify(); - if (!pNotify) - return; - - if (GetXFANode()->GetPacketType() != XFA_PacketType::Form) { - pNotify->OnValueChanged(GetXFANode(), eAttribute, GetXFANode(), - GetXFANode()); - return; - } - - bool bNeedFindContainer = false; - switch (GetXFANode()->GetElementType()) { - case XFA_Element::Caption: - bNeedFindContainer = true; - pNotify->OnValueChanged(GetXFANode(), eAttribute, GetXFANode(), - GetXFANode()->GetNodeItem(XFA_NODEITEM_Parent)); - break; - case XFA_Element::Font: - case XFA_Element::Para: { - bNeedFindContainer = true; - CXFA_Node* pParentNode = GetXFANode()->GetNodeItem(XFA_NODEITEM_Parent); - if (pParentNode->GetElementType() == XFA_Element::Caption) { - pNotify->OnValueChanged(GetXFANode(), eAttribute, pParentNode, - pParentNode->GetNodeItem(XFA_NODEITEM_Parent)); - } else { - pNotify->OnValueChanged(GetXFANode(), eAttribute, GetXFANode(), - pParentNode); - } - break; - } - case XFA_Element::Margin: { - bNeedFindContainer = true; - CXFA_Node* pParentNode = GetXFANode()->GetNodeItem(XFA_NODEITEM_Parent); - XFA_Element eParentType = pParentNode->GetElementType(); - if (pParentNode->IsContainerNode()) { - pNotify->OnValueChanged(GetXFANode(), eAttribute, GetXFANode(), - pParentNode); - } else if (eParentType == XFA_Element::Caption) { - pNotify->OnValueChanged(GetXFANode(), eAttribute, pParentNode, - pParentNode->GetNodeItem(XFA_NODEITEM_Parent)); - } else { - CXFA_Node* pNode = pParentNode->GetNodeItem(XFA_NODEITEM_Parent); - if (pNode && pNode->GetElementType() == XFA_Element::Ui) { - pNotify->OnValueChanged(GetXFANode(), eAttribute, pNode, - pNode->GetNodeItem(XFA_NODEITEM_Parent)); - } - } - break; - } - case XFA_Element::Comb: { - CXFA_Node* pEditNode = GetXFANode()->GetNodeItem(XFA_NODEITEM_Parent); - XFA_Element eUIType = pEditNode->GetElementType(); - if (pEditNode && (eUIType == XFA_Element::DateTimeEdit || - eUIType == XFA_Element::NumericEdit || - eUIType == XFA_Element::TextEdit)) { - CXFA_Node* pUINode = pEditNode->GetNodeItem(XFA_NODEITEM_Parent); - if (pUINode) { - pNotify->OnValueChanged(GetXFANode(), eAttribute, pUINode, - pUINode->GetNodeItem(XFA_NODEITEM_Parent)); - } - } - break; - } - case XFA_Element::Button: - case XFA_Element::Barcode: - case XFA_Element::ChoiceList: - case XFA_Element::DateTimeEdit: - case XFA_Element::NumericEdit: - case XFA_Element::PasswordEdit: - case XFA_Element::TextEdit: { - CXFA_Node* pUINode = GetXFANode()->GetNodeItem(XFA_NODEITEM_Parent); - if (pUINode) { - pNotify->OnValueChanged(GetXFANode(), eAttribute, pUINode, - pUINode->GetNodeItem(XFA_NODEITEM_Parent)); - } - break; - } - case XFA_Element::CheckButton: { - bNeedFindContainer = true; - CXFA_Node* pUINode = GetXFANode()->GetNodeItem(XFA_NODEITEM_Parent); - if (pUINode) { - pNotify->OnValueChanged(GetXFANode(), eAttribute, pUINode, - pUINode->GetNodeItem(XFA_NODEITEM_Parent)); - } - break; - } - case XFA_Element::Keep: - case XFA_Element::Bookend: - case XFA_Element::Break: - case XFA_Element::BreakAfter: - case XFA_Element::BreakBefore: - case XFA_Element::Overflow: - bNeedFindContainer = true; - break; - case XFA_Element::Area: - case XFA_Element::Draw: - case XFA_Element::ExclGroup: - case XFA_Element::Field: - case XFA_Element::Subform: - case XFA_Element::SubformSet: - pLayoutPro->AddChangedContainer(GetXFANode()); - pNotify->OnValueChanged(GetXFANode(), eAttribute, GetXFANode(), - GetXFANode()); - break; - case XFA_Element::Sharptext: - case XFA_Element::Sharpxml: - case XFA_Element::SharpxHTML: { - CXFA_Node* pTextNode = GetXFANode()->GetNodeItem(XFA_NODEITEM_Parent); - if (!pTextNode) - return; - - CXFA_Node* pValueNode = pTextNode->GetNodeItem(XFA_NODEITEM_Parent); - if (!pValueNode) - return; - - XFA_Element eType = pValueNode->GetElementType(); - if (eType == XFA_Element::Value) { - bNeedFindContainer = true; - CXFA_Node* pNode = pValueNode->GetNodeItem(XFA_NODEITEM_Parent); - if (pNode && pNode->IsContainerNode()) { - if (bScriptModify) - pValueNode = pNode; - - pNotify->OnValueChanged(GetXFANode(), eAttribute, pValueNode, pNode); - } else { - pNotify->OnValueChanged(GetXFANode(), eAttribute, pNode, - pNode->GetNodeItem(XFA_NODEITEM_Parent)); - } - } else { - if (eType == XFA_Element::Items) { - CXFA_Node* pNode = pValueNode->GetNodeItem(XFA_NODEITEM_Parent); - if (pNode && pNode->IsContainerNode()) { - pNotify->OnValueChanged(GetXFANode(), eAttribute, pValueNode, - pNode); - } - } - } - break; - } - default: - break; - } - - if (!bNeedFindContainer) - return; - - CXFA_Node* pParent = GetXFANode(); - while (pParent && !pParent->IsContainerNode()) - pParent = pParent->GetNodeItem(XFA_NODEITEM_Parent); - - if (pParent) - pLayoutPro->AddChangedContainer(pParent); -} - void CJX_Node::Script_Attribute_String(CFXJSE_Value* pValue, bool bSetting, XFA_Attribute eAttribute) { @@ -1285,20 +730,6 @@ void CJX_Node::Script_Attribute_StringRead(CFXJSE_Value* pValue, pValue->SetString(GetAttribute(eAttribute).UTF8Encode().AsStringView()); } -void CJX_Node::Script_WsdlConnection_Execute(CFXJSE_Arguments* pArguments) { - int32_t argc = pArguments->GetLength(); - if (argc != 0 && argc != 1) { - ThrowParamCountMismatchException(L"execute"); - return; - } - pArguments->GetReturnValue()->SetBoolean(false); -} - -void CJX_Node::Script_Delta_Restore(CFXJSE_Arguments* pArguments) { - if (pArguments->GetLength() != 0) - ThrowParamCountMismatchException(L"restore"); -} - void CJX_Node::Script_Delta_CurrentValue(CFXJSE_Value* pValue, bool bSetting, XFA_Attribute eAttribute) {} @@ -1805,234 +1236,6 @@ void CJX_Node::Script_Field_SelectedIndex(CFXJSE_Value* pValue, pWidgetData->SetItemState(iIndex, true, true, true, true); } -void CJX_Node::Script_Field_ClearItems(CFXJSE_Arguments* pArguments) { - CXFA_WidgetData* pWidgetData = GetXFANode()->GetWidgetData(); - if (!pWidgetData) - return; - - pWidgetData->DeleteItem(-1, true, false); -} - -void CJX_Node::Script_Field_ExecEvent(CFXJSE_Arguments* pArguments) { - if (pArguments->GetLength() != 1) { - ThrowParamCountMismatchException(L"execEvent"); - return; - } - - ByteString eventString = pArguments->GetUTF8String(0); - int32_t iRet = execSingleEventByName( - WideString::FromUTF8(eventString.AsStringView()).AsStringView(), - XFA_Element::Field); - if (eventString != "validate") - return; - - pArguments->GetReturnValue()->SetBoolean( - (iRet == XFA_EVENTERROR_Error) ? false : true); -} - -void CJX_Node::Script_Field_ExecInitialize(CFXJSE_Arguments* pArguments) { - if (pArguments->GetLength() != 0) { - ThrowParamCountMismatchException(L"execInitialize"); - return; - } - - CXFA_FFNotify* pNotify = GetDocument()->GetNotify(); - if (!pNotify) - return; - - pNotify->ExecEventByDeepFirst(GetXFANode(), XFA_EVENT_Initialize, false, - false); -} - -void CJX_Node::Script_Field_DeleteItem(CFXJSE_Arguments* pArguments) { - int32_t iLength = pArguments->GetLength(); - if (iLength != 1) { - ThrowParamCountMismatchException(L"deleteItem"); - return; - } - - CXFA_WidgetData* pWidgetData = GetXFANode()->GetWidgetData(); - if (!pWidgetData) - return; - - int32_t iIndex = pArguments->GetInt32(0); - bool bValue = pWidgetData->DeleteItem(iIndex, true, true); - CFXJSE_Value* pValue = pArguments->GetReturnValue(); - if (pValue) - pValue->SetBoolean(bValue); -} - -void CJX_Node::Script_Field_GetSaveItem(CFXJSE_Arguments* pArguments) { - int32_t iLength = pArguments->GetLength(); - if (iLength != 1) { - ThrowParamCountMismatchException(L"getSaveItem"); - return; - } - - int32_t iIndex = pArguments->GetInt32(0); - if (iIndex < 0) { - pArguments->GetReturnValue()->SetNull(); - return; - } - - CXFA_WidgetData* pWidgetData = GetXFANode()->GetWidgetData(); - if (!pWidgetData) { - pArguments->GetReturnValue()->SetNull(); - return; - } - - pdfium::Optional<WideString> value = - pWidgetData->GetChoiceListItem(iIndex, true); - if (!value) { - pArguments->GetReturnValue()->SetNull(); - return; - } - pArguments->GetReturnValue()->SetString(value->UTF8Encode().AsStringView()); -} - -void CJX_Node::Script_Field_BoundItem(CFXJSE_Arguments* pArguments) { - int32_t iLength = pArguments->GetLength(); - if (iLength != 1) { - ThrowParamCountMismatchException(L"boundItem"); - return; - } - - CXFA_WidgetData* pWidgetData = GetXFANode()->GetWidgetData(); - if (!pWidgetData) - return; - - ByteString bsValue = pArguments->GetUTF8String(0); - WideString wsValue = WideString::FromUTF8(bsValue.AsStringView()); - WideString wsBoundValue = pWidgetData->GetItemValue(wsValue.AsStringView()); - CFXJSE_Value* pValue = pArguments->GetReturnValue(); - if (pValue) - pValue->SetString(wsBoundValue.UTF8Encode().AsStringView()); -} - -void CJX_Node::Script_Field_GetItemState(CFXJSE_Arguments* pArguments) { - int32_t iLength = pArguments->GetLength(); - if (iLength != 1) { - ThrowParamCountMismatchException(L"getItemState"); - return; - } - - CXFA_WidgetData* pWidgetData = GetXFANode()->GetWidgetData(); - if (!pWidgetData) - return; - - CFXJSE_Value* pValue = pArguments->GetReturnValue(); - if (pValue) - pValue->SetBoolean(pWidgetData->GetItemState(pArguments->GetInt32(0))); -} - -void CJX_Node::Script_Field_ExecCalculate(CFXJSE_Arguments* pArguments) { - if (pArguments->GetLength() != 0) { - ThrowParamCountMismatchException(L"execCalculate"); - return; - } - - CXFA_FFNotify* pNotify = GetDocument()->GetNotify(); - if (!pNotify) - return; - - pNotify->ExecEventByDeepFirst(GetXFANode(), XFA_EVENT_Calculate, false, - false); -} - -void CJX_Node::Script_Field_SetItems(CFXJSE_Arguments* pArguments) {} - -void CJX_Node::Script_Field_GetDisplayItem(CFXJSE_Arguments* pArguments) { - int32_t iLength = pArguments->GetLength(); - if (iLength != 1) { - ThrowParamCountMismatchException(L"getDisplayItem"); - return; - } - - int32_t iIndex = pArguments->GetInt32(0); - if (iIndex < 0) { - pArguments->GetReturnValue()->SetNull(); - return; - } - - CXFA_WidgetData* pWidgetData = GetXFANode()->GetWidgetData(); - if (!pWidgetData) { - pArguments->GetReturnValue()->SetNull(); - return; - } - - pdfium::Optional<WideString> value = - pWidgetData->GetChoiceListItem(iIndex, false); - if (!value) { - pArguments->GetReturnValue()->SetNull(); - return; - } - pArguments->GetReturnValue()->SetString(value->UTF8Encode().AsStringView()); -} - -void CJX_Node::Script_Field_SetItemState(CFXJSE_Arguments* pArguments) { - if (pArguments->GetLength() != 2) { - ThrowParamCountMismatchException(L"setItemState"); - return; - } - - CXFA_WidgetData* pWidgetData = GetXFANode()->GetWidgetData(); - if (!pWidgetData) - return; - - int32_t iIndex = pArguments->GetInt32(0); - if (pArguments->GetInt32(1) != 0) { - pWidgetData->SetItemState(iIndex, true, true, true, true); - return; - } - - if (pWidgetData->GetItemState(iIndex)) - pWidgetData->SetItemState(iIndex, false, true, true, true); -} - -void CJX_Node::Script_Field_AddItem(CFXJSE_Arguments* pArguments) { - int32_t iLength = pArguments->GetLength(); - if (iLength < 1 || iLength > 2) { - ThrowParamCountMismatchException(L"addItem"); - return; - } - - CXFA_WidgetData* pWidgetData = GetXFANode()->GetWidgetData(); - if (!pWidgetData) - return; - - WideString wsLabel; - if (iLength >= 1) { - ByteString bsLabel = pArguments->GetUTF8String(0); - wsLabel = WideString::FromUTF8(bsLabel.AsStringView()); - } - - WideString wsValue; - if (iLength >= 2) { - ByteString bsValue = pArguments->GetUTF8String(1); - wsValue = WideString::FromUTF8(bsValue.AsStringView()); - } - - pWidgetData->InsertItem(wsLabel, wsValue, true); -} - -void CJX_Node::Script_Field_ExecValidate(CFXJSE_Arguments* pArguments) { - if (pArguments->GetLength() != 0) { - ThrowParamCountMismatchException(L"execValidate"); - return; - } - - CXFA_FFNotify* pNotify = GetDocument()->GetNotify(); - if (!pNotify) { - pArguments->GetReturnValue()->SetBoolean(false); - return; - } - - int32_t iRet = pNotify->ExecEventByDeepFirst(GetXFANode(), XFA_EVENT_Validate, - false, false); - pArguments->GetReturnValue()->SetBoolean( - (iRet == XFA_EVENTERROR_Error) ? false : true); -} - void CJX_Node::Script_ExclGroup_ErrorText(CFXJSE_Value* pValue, bool bSetting, XFA_Attribute eAttribute) { @@ -2066,93 +1269,6 @@ void CJX_Node::Script_ExclGroup_Transient(CFXJSE_Value* pValue, bool bSetting, XFA_Attribute eAttribute) {} -void CJX_Node::Script_ExclGroup_ExecEvent(CFXJSE_Arguments* pArguments) { - if (pArguments->GetLength() != 1) { - ThrowParamCountMismatchException(L"execEvent"); - return; - } - - ByteString eventString = pArguments->GetUTF8String(0); - execSingleEventByName( - WideString::FromUTF8(eventString.AsStringView()).AsStringView(), - XFA_Element::ExclGroup); -} - -void CJX_Node::Script_ExclGroup_SelectedMember(CFXJSE_Arguments* pArguments) { - int32_t argc = pArguments->GetLength(); - if (argc < 0 || argc > 1) { - ThrowParamCountMismatchException(L"selectedMember"); - return; - } - - CXFA_WidgetData* pWidgetData = GetXFANode()->GetWidgetData(); - if (!pWidgetData) { - pArguments->GetReturnValue()->SetNull(); - return; - } - - CXFA_Node* pReturnNode = nullptr; - if (argc == 0) { - pReturnNode = pWidgetData->GetSelectedMember(); - } else { - ByteString szName; - szName = pArguments->GetUTF8String(0); - pReturnNode = pWidgetData->SetSelectedMember( - WideString::FromUTF8(szName.AsStringView()).AsStringView(), true); - } - if (!pReturnNode) { - pArguments->GetReturnValue()->SetNull(); - return; - } - - pArguments->GetReturnValue()->Assign( - GetDocument()->GetScriptContext()->GetJSValueFromMap(pReturnNode)); -} - -void CJX_Node::Script_ExclGroup_ExecInitialize(CFXJSE_Arguments* pArguments) { - if (pArguments->GetLength() != 0) { - ThrowParamCountMismatchException(L"execInitialize"); - return; - } - - CXFA_FFNotify* pNotify = GetDocument()->GetNotify(); - if (!pNotify) - return; - - pNotify->ExecEventByDeepFirst(GetXFANode(), XFA_EVENT_Initialize); -} - -void CJX_Node::Script_ExclGroup_ExecCalculate(CFXJSE_Arguments* pArguments) { - if (pArguments->GetLength() != 0) { - ThrowParamCountMismatchException(L"execCalculate"); - return; - } - - CXFA_FFNotify* pNotify = GetDocument()->GetNotify(); - if (!pNotify) - return; - - pNotify->ExecEventByDeepFirst(GetXFANode(), XFA_EVENT_Calculate); -} - -void CJX_Node::Script_ExclGroup_ExecValidate(CFXJSE_Arguments* pArguments) { - if (pArguments->GetLength() != 0) { - ThrowParamCountMismatchException(L"execValidate"); - return; - } - - CXFA_FFNotify* pNotify = GetDocument()->GetNotify(); - if (!pNotify) { - pArguments->GetReturnValue()->SetBoolean(false); - return; - } - - int32_t iRet = - pNotify->ExecEventByDeepFirst(GetXFANode(), XFA_EVENT_Validate); - pArguments->GetReturnValue()->SetBoolean( - (iRet == XFA_EVENTERROR_Error) ? false : true); -} - void CJX_Node::Script_Som_InstanceIndex(CFXJSE_Value* pValue, bool bSetting, XFA_Attribute eAttribute) { @@ -2234,188 +1350,6 @@ void CJX_Node::Script_Subform_Locale(CFXJSE_Value* pValue, pValue->SetString(wsLocaleName.UTF8Encode().AsStringView()); } -void CJX_Node::Script_Subform_ExecEvent(CFXJSE_Arguments* pArguments) { - if (pArguments->GetLength() != 1) { - ThrowParamCountMismatchException(L"execEvent"); - return; - } - - ByteString eventString = pArguments->GetUTF8String(0); - execSingleEventByName( - WideString::FromUTF8(eventString.AsStringView()).AsStringView(), - XFA_Element::Subform); -} - -void CJX_Node::Script_Subform_ExecInitialize(CFXJSE_Arguments* pArguments) { - if (pArguments->GetLength() != 0) { - ThrowParamCountMismatchException(L"execInitialize"); - return; - } - - CXFA_FFNotify* pNotify = GetDocument()->GetNotify(); - if (!pNotify) - return; - - pNotify->ExecEventByDeepFirst(GetXFANode(), XFA_EVENT_Initialize); -} - -void CJX_Node::Script_Subform_ExecCalculate(CFXJSE_Arguments* pArguments) { - if (pArguments->GetLength() != 0) { - ThrowParamCountMismatchException(L"execCalculate"); - return; - } - - CXFA_FFNotify* pNotify = GetDocument()->GetNotify(); - if (!pNotify) - return; - - pNotify->ExecEventByDeepFirst(GetXFANode(), XFA_EVENT_Calculate); -} - -void CJX_Node::Script_Subform_ExecValidate(CFXJSE_Arguments* pArguments) { - if (pArguments->GetLength() != 0) { - ThrowParamCountMismatchException(L"execValidate"); - return; - } - - CXFA_FFNotify* pNotify = GetDocument()->GetNotify(); - if (!pNotify) { - pArguments->GetReturnValue()->SetBoolean(false); - return; - } - - int32_t iRet = - pNotify->ExecEventByDeepFirst(GetXFANode(), XFA_EVENT_Validate); - pArguments->GetReturnValue()->SetBoolean( - (iRet == XFA_EVENTERROR_Error) ? false : true); -} - -void CJX_Node::Script_Subform_GetInvalidObjects(CFXJSE_Arguments* pArguments) { - if (pArguments->GetLength() != 0) - ThrowParamCountMismatchException(L"getInvalidObjects"); -} - -void CJX_Node::Script_Template_FormNodes(CFXJSE_Arguments* pArguments) { - if (pArguments->GetLength() != 1) { - ThrowParamCountMismatchException(L"formNodes"); - return; - } - pArguments->GetReturnValue()->SetBoolean(true); -} - -void CJX_Node::Script_Template_Remerge(CFXJSE_Arguments* pArguments) { - if (pArguments->GetLength() != 0) { - ThrowParamCountMismatchException(L"remerge"); - return; - } - GetDocument()->DoDataRemerge(true); -} - -void CJX_Node::Script_Template_ExecInitialize(CFXJSE_Arguments* pArguments) { - if (pArguments->GetLength() != 0) { - ThrowParamCountMismatchException(L"execInitialize"); - return; - } - - CXFA_WidgetData* pWidgetData = GetXFANode()->GetWidgetData(); - if (!pWidgetData) { - pArguments->GetReturnValue()->SetBoolean(false); - return; - } - pArguments->GetReturnValue()->SetBoolean(true); -} - -void CJX_Node::Script_Template_CreateNode(CFXJSE_Arguments* pArguments) { - int32_t argc = pArguments->GetLength(); - if (argc <= 0 || argc >= 4) { - ThrowParamCountMismatchException(L"createNode"); - return; - } - - WideString strName; - WideString strNameSpace; - if (argc > 1) { - ByteString bsName = pArguments->GetUTF8String(1); - strName = WideString::FromUTF8(bsName.AsStringView()); - if (argc == 3) { - ByteString bsNameSpace = pArguments->GetUTF8String(2); - strNameSpace = WideString::FromUTF8(bsNameSpace.AsStringView()); - } - } - - ByteString bsTagName = pArguments->GetUTF8String(0); - WideString strTagName = WideString::FromUTF8(bsTagName.AsStringView()); - XFA_Element eType = CXFA_Node::NameToElement(strTagName); - CXFA_Node* pNewNode = GetXFANode()->CreateSamePacketNode(eType); - if (!pNewNode) { - pArguments->GetReturnValue()->SetNull(); - return; - } - - if (strName.IsEmpty()) { - pArguments->GetReturnValue()->Assign( - GetDocument()->GetScriptContext()->GetJSValueFromMap(pNewNode)); - return; - } - - if (!pNewNode->HasAttribute(XFA_Attribute::Name)) { - ThrowMissingPropertyException(strTagName, L"name"); - return; - } - - pNewNode->JSNode()->SetAttribute(XFA_Attribute::Name, strName.AsStringView(), - true); - if (pNewNode->GetPacketType() == XFA_PacketType::Datasets) - pNewNode->CreateXMLMappingNode(); - - pArguments->GetReturnValue()->Assign( - GetDocument()->GetScriptContext()->GetJSValueFromMap(pNewNode)); -} - -void CJX_Node::Script_Template_Recalculate(CFXJSE_Arguments* pArguments) { - if (pArguments->GetLength() != 1) { - ThrowParamCountMismatchException(L"recalculate"); - return; - } - pArguments->GetReturnValue()->SetBoolean(true); -} - -void CJX_Node::Script_Template_ExecCalculate(CFXJSE_Arguments* pArguments) { - if (pArguments->GetLength() != 0) { - ThrowParamCountMismatchException(L"execCalculate"); - return; - } - - CXFA_WidgetData* pWidgetData = GetXFANode()->GetWidgetData(); - if (!pWidgetData) { - pArguments->GetReturnValue()->SetBoolean(false); - return; - } - pArguments->GetReturnValue()->SetBoolean(true); -} - -void CJX_Node::Script_Template_ExecValidate(CFXJSE_Arguments* pArguments) { - if (pArguments->GetLength() != 0) { - ThrowParamCountMismatchException(L"execValidate"); - return; - } - pArguments->GetReturnValue()->SetBoolean(!!GetXFANode()->GetWidgetData()); -} - -void CJX_Node::Script_Manifest_Evaluate(CFXJSE_Arguments* pArguments) { - if (pArguments->GetLength() != 0) { - ThrowParamCountMismatchException(L"evaluate"); - return; - } - - CXFA_WidgetData* pWidgetData = GetXFANode()->GetWidgetData(); - if (!pWidgetData) { - pArguments->GetReturnValue()->SetBoolean(false); - return; - } - pArguments->GetReturnValue()->SetBoolean(true); -} - void CJX_Node::Script_InstanceManager_Max(CFXJSE_Value* pValue, bool bSetting, XFA_Attribute eAttribute) { @@ -2446,160 +1380,6 @@ void CJX_Node::Script_InstanceManager_Count(CFXJSE_Value* pValue, InstanceManager_SetInstances(pValue->ToInteger()); } -void CJX_Node::Script_InstanceManager_MoveInstance( - CFXJSE_Arguments* pArguments) { - if (pArguments->GetLength() != 2) { - pArguments->GetReturnValue()->SetUndefined(); - return; - } - - int32_t iFrom = pArguments->GetInt32(0); - int32_t iTo = pArguments->GetInt32(1); - InstanceManager_MoveInstance(iTo, iFrom); - CXFA_FFNotify* pNotify = GetDocument()->GetNotify(); - if (!pNotify) - return; - - CXFA_Node* pToInstance = GetXFANode()->GetItem(iTo); - if (pToInstance && pToInstance->GetElementType() == XFA_Element::Subform) - pNotify->RunSubformIndexChange(pToInstance); - - CXFA_Node* pFromInstance = GetXFANode()->GetItem(iFrom); - if (pFromInstance && - pFromInstance->GetElementType() == XFA_Element::Subform) { - pNotify->RunSubformIndexChange(pFromInstance); - } -} - -void CJX_Node::Script_InstanceManager_RemoveInstance( - CFXJSE_Arguments* pArguments) { - if (pArguments->GetLength() != 1) { - pArguments->GetReturnValue()->SetUndefined(); - return; - } - - int32_t iIndex = pArguments->GetInt32(0); - int32_t iCount = GetXFANode()->GetCount(); - if (iIndex < 0 || iIndex >= iCount) { - ThrowIndexOutOfBoundsException(); - return; - } - - int32_t iMin = CXFA_OccurData(GetXFANode()->GetOccurNode()).GetMin(); - if (iCount - 1 < iMin) { - ThrowTooManyOccurancesException(L"min"); - return; - } - - CXFA_Node* pRemoveInstance = GetXFANode()->GetItem(iIndex); - GetXFANode()->RemoveItem(pRemoveInstance, true); - CXFA_FFNotify* pNotify = GetDocument()->GetNotify(); - if (pNotify) { - for (int32_t i = iIndex; i < iCount - 1; i++) { - CXFA_Node* pSubformInstance = GetXFANode()->GetItem(i); - if (pSubformInstance && - pSubformInstance->GetElementType() == XFA_Element::Subform) { - pNotify->RunSubformIndexChange(pSubformInstance); - } - } - } - CXFA_LayoutProcessor* pLayoutPro = GetDocument()->GetLayoutProcessor(); - if (!pLayoutPro) - return; - - pLayoutPro->AddChangedContainer( - ToNode(GetDocument()->GetXFAObject(XFA_HASHCODE_Form))); -} - -void CJX_Node::Script_InstanceManager_SetInstances( - CFXJSE_Arguments* pArguments) { - if (pArguments->GetLength() != 1) { - pArguments->GetReturnValue()->SetUndefined(); - return; - } - - int32_t iDesired = pArguments->GetInt32(0); - InstanceManager_SetInstances(iDesired); -} - -void CJX_Node::Script_InstanceManager_AddInstance( - CFXJSE_Arguments* pArguments) { - int32_t argc = pArguments->GetLength(); - if (argc != 0 && argc != 1) { - ThrowParamCountMismatchException(L"addInstance"); - return; - } - - bool fFlags = true; - if (argc == 1) - fFlags = pArguments->GetInt32(0) == 0 ? false : true; - - int32_t iCount = GetXFANode()->GetCount(); - int32_t iMax = CXFA_OccurData(GetXFANode()->GetOccurNode()).GetMax(); - if (iMax >= 0 && iCount >= iMax) { - ThrowTooManyOccurancesException(L"max"); - return; - } - - CXFA_Node* pNewInstance = GetXFANode()->CreateInstance(fFlags); - GetXFANode()->InsertItem(pNewInstance, iCount, iCount, false); - pArguments->GetReturnValue()->Assign( - GetDocument()->GetScriptContext()->GetJSValueFromMap(pNewInstance)); - CXFA_FFNotify* pNotify = GetDocument()->GetNotify(); - if (!pNotify) - return; - - pNotify->RunNodeInitialize(pNewInstance); - CXFA_LayoutProcessor* pLayoutPro = GetDocument()->GetLayoutProcessor(); - if (!pLayoutPro) - return; - - pLayoutPro->AddChangedContainer( - ToNode(GetDocument()->GetXFAObject(XFA_HASHCODE_Form))); -} - -void CJX_Node::Script_InstanceManager_InsertInstance( - CFXJSE_Arguments* pArguments) { - int32_t argc = pArguments->GetLength(); - if (argc != 1 && argc != 2) { - ThrowParamCountMismatchException(L"insertInstance"); - return; - } - - int32_t iIndex = pArguments->GetInt32(0); - bool bBind = false; - if (argc == 2) - bBind = pArguments->GetInt32(1) == 0 ? false : true; - - int32_t iCount = GetXFANode()->GetCount(); - if (iIndex < 0 || iIndex > iCount) { - ThrowIndexOutOfBoundsException(); - return; - } - - int32_t iMax = CXFA_OccurData(GetXFANode()->GetOccurNode()).GetMax(); - if (iMax >= 0 && iCount >= iMax) { - ThrowTooManyOccurancesException(L"max"); - return; - } - - CXFA_Node* pNewInstance = GetXFANode()->CreateInstance(bBind); - GetXFANode()->InsertItem(pNewInstance, iIndex, iCount, true); - pArguments->GetReturnValue()->Assign( - GetDocument()->GetScriptContext()->GetJSValueFromMap(pNewInstance)); - CXFA_FFNotify* pNotify = GetDocument()->GetNotify(); - if (!pNotify) - return; - - pNotify->RunNodeInitialize(pNewInstance); - CXFA_LayoutProcessor* pLayoutPro = GetDocument()->GetLayoutProcessor(); - if (!pLayoutPro) - return; - - pLayoutPro->AddChangedContainer( - ToNode(GetDocument()->GetXFAObject(XFA_HASHCODE_Form))); -} - void CJX_Node::Script_Occur_Max(CFXJSE_Value* pValue, bool bSetting, XFA_Attribute eAttribute) { @@ -2622,110 +1402,6 @@ void CJX_Node::Script_Occur_Min(CFXJSE_Value* pValue, occurData.SetMin(pValue->ToInteger()); } -void CJX_Node::Script_Desc_Metadata(CFXJSE_Arguments* pArguments) { - int32_t argc = pArguments->GetLength(); - if (argc != 0 && argc != 1) { - ThrowParamCountMismatchException(L"metadata"); - return; - } - pArguments->GetReturnValue()->SetString(""); -} - -void CJX_Node::Script_Form_FormNodes(CFXJSE_Arguments* pArguments) { - if (pArguments->GetLength() != 1) { - ThrowParamCountMismatchException(L"formNodes"); - return; - } - - CXFA_Node* pDataNode = static_cast<CXFA_Node*>(pArguments->GetObject(0)); - if (!pDataNode) { - ThrowArgumentMismatchException(); - return; - } - - std::vector<CXFA_Node*> formItems; - CXFA_ArrayNodeList* pFormNodes = new CXFA_ArrayNodeList(GetDocument()); - pFormNodes->SetArrayNodeList(formItems); - pArguments->GetReturnValue()->SetObject( - pFormNodes, GetDocument()->GetScriptContext()->GetJseNormalClass()); -} - -void CJX_Node::Script_Form_Remerge(CFXJSE_Arguments* pArguments) { - if (pArguments->GetLength() != 0) { - ThrowParamCountMismatchException(L"remerge"); - return; - } - - GetDocument()->DoDataRemerge(true); -} - -void CJX_Node::Script_Form_ExecInitialize(CFXJSE_Arguments* pArguments) { - if (pArguments->GetLength() != 0) { - ThrowParamCountMismatchException(L"execInitialize"); - return; - } - - CXFA_FFNotify* pNotify = GetDocument()->GetNotify(); - if (!pNotify) - return; - - pNotify->ExecEventByDeepFirst(GetXFANode(), XFA_EVENT_Initialize); -} - -void CJX_Node::Script_Form_Recalculate(CFXJSE_Arguments* pArguments) { - CXFA_EventParam* pEventParam = - GetDocument()->GetScriptContext()->GetEventParam(); - if (pEventParam->m_eType == XFA_EVENT_Calculate || - pEventParam->m_eType == XFA_EVENT_InitCalculate) { - return; - } - if (pArguments->GetLength() != 1) { - ThrowParamCountMismatchException(L"recalculate"); - return; - } - - CXFA_FFNotify* pNotify = GetDocument()->GetNotify(); - if (!pNotify) - return; - if (pArguments->GetInt32(0) != 0) - return; - - pNotify->ExecEventByDeepFirst(GetXFANode(), XFA_EVENT_Calculate); - pNotify->ExecEventByDeepFirst(GetXFANode(), XFA_EVENT_Validate); - pNotify->ExecEventByDeepFirst(GetXFANode(), XFA_EVENT_Ready, true); -} - -void CJX_Node::Script_Form_ExecCalculate(CFXJSE_Arguments* pArguments) { - if (pArguments->GetLength() != 0) { - ThrowParamCountMismatchException(L"execCalculate"); - return; - } - - CXFA_FFNotify* pNotify = GetDocument()->GetNotify(); - if (!pNotify) - return; - - pNotify->ExecEventByDeepFirst(GetXFANode(), XFA_EVENT_Calculate); -} - -void CJX_Node::Script_Form_ExecValidate(CFXJSE_Arguments* pArguments) { - if (pArguments->GetLength() != 0) { - ThrowParamCountMismatchException(L"execValidate"); - return; - } - - CXFA_FFNotify* pNotify = GetDocument()->GetNotify(); - if (!pNotify) { - pArguments->GetReturnValue()->SetBoolean(false); - return; - } - - int32_t iRet = - pNotify->ExecEventByDeepFirst(GetXFANode(), XFA_EVENT_Validate); - pArguments->GetReturnValue()->SetBoolean( - (iRet == XFA_EVENTERROR_Error) ? false : true); -} - void CJX_Node::Script_Form_Checksum(CFXJSE_Value* pValue, bool bSetting, XFA_Attribute eAttribute) { @@ -2740,58 +1416,6 @@ void CJX_Node::Script_Form_Checksum(CFXJSE_Value* pValue, pValue->SetString(checksum ? checksum->UTF8Encode().AsStringView() : ""); } -void CJX_Node::Script_Packet_GetAttribute(CFXJSE_Arguments* pArguments) { - if (pArguments->GetLength() != 1) { - ThrowParamCountMismatchException(L"getAttribute"); - return; - } - - WideString wsAttributeValue; - CFX_XMLNode* pXMLNode = GetXFANode()->GetXMLMappingNode(); - if (pXMLNode && pXMLNode->GetType() == FX_XMLNODE_Element) { - ByteString bsAttributeName = pArguments->GetUTF8String(0); - wsAttributeValue = static_cast<CFX_XMLElement*>(pXMLNode)->GetString( - WideString::FromUTF8(bsAttributeName.AsStringView()).c_str()); - } - - pArguments->GetReturnValue()->SetString( - wsAttributeValue.UTF8Encode().AsStringView()); -} - -void CJX_Node::Script_Packet_SetAttribute(CFXJSE_Arguments* pArguments) { - if (pArguments->GetLength() != 2) { - ThrowParamCountMismatchException(L"setAttribute"); - return; - } - - CFX_XMLNode* pXMLNode = GetXFANode()->GetXMLMappingNode(); - if (pXMLNode && pXMLNode->GetType() == FX_XMLNODE_Element) { - ByteString bsValue = pArguments->GetUTF8String(0); - ByteString bsName = pArguments->GetUTF8String(1); - static_cast<CFX_XMLElement*>(pXMLNode)->SetString( - WideString::FromUTF8(bsName.AsStringView()), - WideString::FromUTF8(bsValue.AsStringView())); - } - pArguments->GetReturnValue()->SetNull(); -} - -void CJX_Node::Script_Packet_RemoveAttribute(CFXJSE_Arguments* pArguments) { - if (pArguments->GetLength() != 1) { - ThrowParamCountMismatchException(L"removeAttribute"); - return; - } - - CFX_XMLNode* pXMLNode = GetXFANode()->GetXMLMappingNode(); - if (pXMLNode && pXMLNode->GetType() == FX_XMLNODE_Element) { - ByteString bsName = pArguments->GetUTF8String(0); - WideString wsName = WideString::FromUTF8(bsName.AsStringView()); - CFX_XMLElement* pXMLElement = static_cast<CFX_XMLElement*>(pXMLNode); - if (pXMLElement->HasAttribute(wsName.c_str())) - pXMLElement->RemoveAttribute(wsName.c_str()); - } - pArguments->GetReturnValue()->SetNull(); -} - void CJX_Node::Script_Packet_Content(CFXJSE_Value* pValue, bool bSetting, XFA_Attribute eAttribute) { @@ -2813,91 +1437,6 @@ void CJX_Node::Script_Packet_Content(CFXJSE_Value* pValue, pValue->SetString(wsTextData.UTF8Encode().AsStringView()); } -void CJX_Node::Script_Source_Next(CFXJSE_Arguments* pArguments) { - if (pArguments->GetLength() != 0) - ThrowParamCountMismatchException(L"next"); -} - -void CJX_Node::Script_Source_CancelBatch(CFXJSE_Arguments* pArguments) { - if (pArguments->GetLength() != 0) - ThrowParamCountMismatchException(L"cancelBatch"); -} - -void CJX_Node::Script_Source_First(CFXJSE_Arguments* pArguments) { - if (pArguments->GetLength() != 0) - ThrowParamCountMismatchException(L"first"); -} - -void CJX_Node::Script_Source_UpdateBatch(CFXJSE_Arguments* pArguments) { - if (pArguments->GetLength() != 0) - ThrowParamCountMismatchException(L"updateBatch"); -} - -void CJX_Node::Script_Source_Previous(CFXJSE_Arguments* pArguments) { - if (pArguments->GetLength() != 0) - ThrowParamCountMismatchException(L"previous"); -} - -void CJX_Node::Script_Source_IsBOF(CFXJSE_Arguments* pArguments) { - if (pArguments->GetLength() != 0) - ThrowParamCountMismatchException(L"isBOF"); -} - -void CJX_Node::Script_Source_IsEOF(CFXJSE_Arguments* pArguments) { - if (pArguments->GetLength() != 0) - ThrowParamCountMismatchException(L"isEOF"); -} - -void CJX_Node::Script_Source_Cancel(CFXJSE_Arguments* pArguments) { - if (pArguments->GetLength() != 0) - ThrowParamCountMismatchException(L"cancel"); -} - -void CJX_Node::Script_Source_Update(CFXJSE_Arguments* pArguments) { - if (pArguments->GetLength() != 0) - ThrowParamCountMismatchException(L"update"); -} - -void CJX_Node::Script_Source_Open(CFXJSE_Arguments* pArguments) { - if (pArguments->GetLength() != 0) - ThrowParamCountMismatchException(L"open"); -} - -void CJX_Node::Script_Source_Delete(CFXJSE_Arguments* pArguments) { - if (pArguments->GetLength() != 0) - ThrowParamCountMismatchException(L"delete"); -} - -void CJX_Node::Script_Source_AddNew(CFXJSE_Arguments* pArguments) { - if (pArguments->GetLength() != 0) - ThrowParamCountMismatchException(L"addNew"); -} - -void CJX_Node::Script_Source_Requery(CFXJSE_Arguments* pArguments) { - if (pArguments->GetLength() != 0) - ThrowParamCountMismatchException(L"requery"); -} - -void CJX_Node::Script_Source_Resync(CFXJSE_Arguments* pArguments) { - if (pArguments->GetLength() != 0) - ThrowParamCountMismatchException(L"resync"); -} - -void CJX_Node::Script_Source_Close(CFXJSE_Arguments* pArguments) { - if (pArguments->GetLength() != 0) - ThrowParamCountMismatchException(L"close"); -} - -void CJX_Node::Script_Source_Last(CFXJSE_Arguments* pArguments) { - if (pArguments->GetLength() != 0) - ThrowParamCountMismatchException(L"last"); -} - -void CJX_Node::Script_Source_HasDataChanged(CFXJSE_Arguments* pArguments) { - if (pArguments->GetLength() != 0) - ThrowParamCountMismatchException(L"hasDataChanged"); -} - void CJX_Node::Script_Source_Db(CFXJSE_Value* pValue, bool bSetting, XFA_Attribute eAttribute) {} @@ -2939,297 +1478,164 @@ void CJX_Node::Script_Encrypt_Format(CFXJSE_Value* pValue, bool bSetting, XFA_Attribute eAttribute) {} -pdfium::Optional<bool> CJX_Node::TryBoolean(XFA_Attribute eAttr, - bool bUseDefault) { - void* pValue = nullptr; - void* pKey = GetMapKey_Element(GetXFANode()->GetElementType(), eAttr); - if (GetMapModuleValue(pKey, pValue)) - return {!!pValue}; - if (!bUseDefault) - return {}; - - return GetXFANode()->GetDefaultBoolean(eAttr); -} - -bool CJX_Node::SetBoolean(XFA_Attribute eAttr, bool bValue, bool bNotify) { - CFX_XMLElement* elem = SetValue(eAttr, XFA_AttributeType::Boolean, - (void*)(uintptr_t)bValue, bNotify); - if (elem) - elem->SetString(CXFA_Node::AttributeToName(eAttr), bValue ? L"1" : L"0"); - return true; +void CJX_Node::SetWidgetData(std::unique_ptr<CXFA_WidgetData> data) { + widget_data_ = std::move(data); } -bool CJX_Node::GetBoolean(XFA_Attribute eAttr) { - return TryBoolean(eAttr, true).value_or(false); -} +pdfium::Optional<WideString> CJX_Node::TryNamespace() { + if (GetXFANode()->IsModelNode() || + GetXFANode()->GetElementType() == XFA_Element::Packet) { + CFX_XMLNode* pXMLNode = GetXFANode()->GetXMLMappingNode(); + if (!pXMLNode || pXMLNode->GetType() != FX_XMLNODE_Element) + return {}; -bool CJX_Node::SetInteger(XFA_Attribute eAttr, int32_t iValue, bool bNotify) { - CFX_XMLElement* elem = SetValue(eAttr, XFA_AttributeType::Integer, - (void*)(uintptr_t)iValue, bNotify); - if (elem) { - elem->SetString(CXFA_Node::AttributeToName(eAttr), - WideString::Format(L"%d", iValue)); + return {static_cast<CFX_XMLElement*>(pXMLNode)->GetNamespaceURI()}; } - return true; -} - -int32_t CJX_Node::GetInteger(XFA_Attribute eAttr) { - return TryInteger(eAttr, true).value_or(0); -} -pdfium::Optional<int32_t> CJX_Node::TryInteger(XFA_Attribute eAttr, - bool bUseDefault) { - void* pKey = GetMapKey_Element(GetXFANode()->GetElementType(), eAttr); - void* pValue = nullptr; - if (GetMapModuleValue(pKey, pValue)) - return {static_cast<int32_t>(reinterpret_cast<uintptr_t>(pValue))}; - if (!bUseDefault) - return {}; - - return GetXFANode()->GetDefaultInteger(eAttr); -} + if (GetXFANode()->GetPacketType() != XFA_PacketType::Datasets) + return GetXFANode()->GetModelNode()->JSNode()->TryNamespace(); -pdfium::Optional<XFA_AttributeEnum> CJX_Node::TryEnum(XFA_Attribute eAttr, - bool bUseDefault) { - void* pKey = GetMapKey_Element(GetXFANode()->GetElementType(), eAttr); - void* pValue = nullptr; - if (GetMapModuleValue(pKey, pValue)) { - return { - static_cast<XFA_AttributeEnum>(reinterpret_cast<uintptr_t>(pValue))}; - } - if (!bUseDefault) + CFX_XMLNode* pXMLNode = GetXFANode()->GetXMLMappingNode(); + if (!pXMLNode || pXMLNode->GetType() != FX_XMLNODE_Element) return {}; - return GetXFANode()->GetDefaultEnum(eAttr); -} - -bool CJX_Node::SetEnum(XFA_Attribute eAttr, - XFA_AttributeEnum eValue, - bool bNotify) { - CFX_XMLElement* elem = SetValue(eAttr, XFA_AttributeType::Enum, - (void*)(uintptr_t)eValue, bNotify); - if (elem) { - elem->SetString(CXFA_Node::AttributeToName(eAttr), - CXFA_Node::AttributeEnumToName(eValue)); + if (GetXFANode()->GetElementType() == XFA_Element::DataValue && + GetEnum(XFA_Attribute::Contains) == XFA_AttributeEnum::MetaData) { + WideString wsNamespace; + bool ret = XFA_FDEExtension_ResolveNamespaceQualifier( + static_cast<CFX_XMLElement*>(pXMLNode), + GetCData(XFA_Attribute::QualifiedName), &wsNamespace); + if (!ret) + return {}; + return {wsNamespace}; } - return true; + return {static_cast<CFX_XMLElement*>(pXMLNode)->GetNamespaceURI()}; } -XFA_AttributeEnum CJX_Node::GetEnum(XFA_Attribute eAttr) { - return TryEnum(eAttr, true).value_or(XFA_AttributeEnum::Unknown); -} +CXFA_Node* CJX_Node::GetProperty(int32_t index, + XFA_Element eProperty, + bool bCreateProperty) { + if (index < 0 || index >= GetXFANode()->PropertyOccuranceCount(eProperty)) + return nullptr; -bool CJX_Node::SetMeasure(XFA_Attribute eAttr, - CXFA_Measurement mValue, - bool bNotify) { - void* pKey = GetMapKey_Element(GetXFANode()->GetElementType(), eAttr); - OnChanging(eAttr, bNotify); - SetMapModuleBuffer(pKey, &mValue, sizeof(CXFA_Measurement), nullptr); - OnChanged(eAttr, bNotify, false); - return true; -} + int32_t iCount = 0; + for (CXFA_Node* pNode = GetXFANode()->GetChildNode(); pNode; + pNode = pNode->GetNodeItem(XFA_NODEITEM_NextSibling)) { + if (pNode->GetElementType() == eProperty) { + iCount++; + if (iCount > index) + return pNode; + } + } + if (!bCreateProperty) + return nullptr; -pdfium::Optional<CXFA_Measurement> CJX_Node::TryMeasure( - XFA_Attribute eAttr, - bool bUseDefault) const { - void* pKey = GetMapKey_Element(GetXFANode()->GetElementType(), eAttr); - void* pValue; - int32_t iBytes; - if (GetMapModuleBuffer(pKey, pValue, iBytes, true) && - iBytes == sizeof(CXFA_Measurement)) { - return {*reinterpret_cast<CXFA_Measurement*>(pValue)}; + if (GetXFANode()->HasPropertyFlags(eProperty, XFA_PROPERTYFLAG_OneOf)) { + for (CXFA_Node* pNode = GetXFANode()->GetChildNode(); pNode; + pNode = pNode->GetNodeItem(XFA_NODEITEM_NextSibling)) { + if (GetXFANode()->HasPropertyFlags(pNode->GetElementType(), + XFA_PROPERTYFLAG_OneOf)) { + return nullptr; + } + } } - if (!bUseDefault) - return {}; - return GetXFANode()->GetDefaultMeasurement(eAttr); + CXFA_Node* pNewNode = nullptr; + for (; iCount <= index; ++iCount) { + pNewNode = + GetDocument()->CreateNode(GetXFANode()->GetPacketType(), eProperty); + if (!pNewNode) + return nullptr; + GetXFANode()->InsertChild(pNewNode, nullptr); + pNewNode->SetFlag(XFA_NodeFlag_Initialized, true); + } + return pNewNode; } -CXFA_Measurement CJX_Node::GetMeasure(XFA_Attribute eAttr) const { - return TryMeasure(eAttr, true).value_or(CXFA_Measurement()); -} +int32_t CJX_Node::execSingleEventByName(const WideStringView& wsEventName, + XFA_Element eType) { + CXFA_FFNotify* pNotify = GetDocument()->GetNotify(); + if (!pNotify) + return XFA_EVENTERROR_NotExist; -WideString CJX_Node::GetCData(XFA_Attribute eAttr) { - return TryCData(eAttr, true).value_or(WideString()); -} + const XFA_ExecEventParaInfo* eventParaInfo = + GetEventParaInfoByName(wsEventName); + if (!eventParaInfo) + return XFA_EVENTERROR_NotExist; -bool CJX_Node::SetCData(XFA_Attribute eAttr, - const WideString& wsValue, - bool bNotify, - bool bScriptModify) { - void* pKey = GetMapKey_Element(GetXFANode()->GetElementType(), eAttr); - OnChanging(eAttr, bNotify); - if (eAttr == XFA_Attribute::Value) { - WideString* pClone = new WideString(wsValue); - SetUserData(pKey, pClone, &deleteWideStringCallBack); - } else { - SetMapModuleString(pKey, wsValue.AsStringView()); - if (eAttr == XFA_Attribute::Name) - GetXFANode()->UpdateNameHash(); - } - OnChanged(eAttr, bNotify, bScriptModify); - - if (!GetXFANode()->IsNeedSavingXMLNode() || - eAttr == XFA_Attribute::QualifiedName || - eAttr == XFA_Attribute::BindingNode) { - return true; - } - - if (eAttr == XFA_Attribute::Name && - (GetXFANode()->GetElementType() == XFA_Element::DataValue || - GetXFANode()->GetElementType() == XFA_Element::DataGroup)) { - return true; - } - - auto* elem = static_cast<CFX_XMLElement*>(GetXFANode()->GetXMLMappingNode()); - if (eAttr == XFA_Attribute::Value) { - FX_XMLNODETYPE eXMLType = elem->GetType(); - switch (eXMLType) { - case FX_XMLNODE_Element: - if (GetXFANode()->IsAttributeInXML()) { - elem->SetString(WideString(GetCData(XFA_Attribute::QualifiedName)), - wsValue); - } else { - bool bDeleteChildren = true; - if (GetXFANode()->GetPacketType() == XFA_PacketType::Datasets) { - for (CXFA_Node* pChildDataNode = - GetXFANode()->GetNodeItem(XFA_NODEITEM_FirstChild); - pChildDataNode; pChildDataNode = pChildDataNode->GetNodeItem( - XFA_NODEITEM_NextSibling)) { - if (!pChildDataNode->GetBindItems()->empty()) { - bDeleteChildren = false; - break; - } - } - } - if (bDeleteChildren) - elem->DeleteChildren(); + switch (eventParaInfo->m_validFlags) { + case EventAppliesToo::kNone: + return XFA_EVENTERROR_NotExist; + case EventAppliesToo::kAll: + case EventAppliesToo::kAllNonRecursive: + return pNotify->ExecEventByDeepFirst( + GetXFANode(), eventParaInfo->m_eventType, false, + eventParaInfo->m_validFlags == EventAppliesToo::kAll); + case EventAppliesToo::kSubform: + if (eType != XFA_Element::Subform) + return XFA_EVENTERROR_NotExist; + + return pNotify->ExecEventByDeepFirst( + GetXFANode(), eventParaInfo->m_eventType, false, false); + case EventAppliesToo::kFieldOrExclusion: { + if (eType != XFA_Element::ExclGroup && eType != XFA_Element::Field) + return XFA_EVENTERROR_NotExist; - elem->SetTextData(wsValue); - } - break; - case FX_XMLNODE_Text: - static_cast<CFX_XMLText*>(GetXFANode()->GetXMLMappingNode()) - ->SetText(wsValue); - break; - default: - ASSERT(0); + CXFA_Node* pParentNode = GetXFANode()->GetNodeItem(XFA_NODEITEM_Parent); + if (pParentNode && + pParentNode->GetElementType() == XFA_Element::ExclGroup) { + // TODO(dsinclair): This seems like a bug, we do the same work twice? + pNotify->ExecEventByDeepFirst(GetXFANode(), eventParaInfo->m_eventType, + false, false); + } + return pNotify->ExecEventByDeepFirst( + GetXFANode(), eventParaInfo->m_eventType, false, false); } - return true; - } - ASSERT(elem->GetType() == FX_XMLNODE_Element); - - WideString wsAttrName = CXFA_Node::AttributeToName(eAttr); - if (eAttr == XFA_Attribute::ContentType) - wsAttrName = L"xfa:" + wsAttrName; - - elem->SetString(wsAttrName, wsValue); - return true; -} - -void CJX_Node::SetAttributeValue(const WideString& wsValue, - const WideString& wsXMLValue, - bool bNotify, - bool bScriptModify) { - void* pKey = - GetMapKey_Element(GetXFANode()->GetElementType(), XFA_Attribute::Value); - OnChanging(XFA_Attribute::Value, bNotify); - WideString* pClone = new WideString(wsValue); - SetUserData(pKey, pClone, &deleteWideStringCallBack); - OnChanged(XFA_Attribute::Value, bNotify, bScriptModify); - if (!GetXFANode()->IsNeedSavingXMLNode()) - return; - - auto* elem = static_cast<CFX_XMLElement*>(GetXFANode()->GetXMLMappingNode()); - FX_XMLNODETYPE eXMLType = elem->GetType(); - switch (eXMLType) { - case FX_XMLNODE_Element: - if (GetXFANode()->IsAttributeInXML()) { - elem->SetString(WideString(GetCData(XFA_Attribute::QualifiedName)), - wsXMLValue); - } else { - bool bDeleteChildren = true; - if (GetXFANode()->GetPacketType() == XFA_PacketType::Datasets) { - for (CXFA_Node* pChildDataNode = - GetXFANode()->GetNodeItem(XFA_NODEITEM_FirstChild); - pChildDataNode; pChildDataNode = pChildDataNode->GetNodeItem( - XFA_NODEITEM_NextSibling)) { - if (!pChildDataNode->GetBindItems()->empty()) { - bDeleteChildren = false; - break; - } - } - } - if (bDeleteChildren) - elem->DeleteChildren(); - - elem->SetTextData(wsXMLValue); + case EventAppliesToo::kField: + if (eType != XFA_Element::Field) + return XFA_EVENTERROR_NotExist; + + return pNotify->ExecEventByDeepFirst( + GetXFANode(), eventParaInfo->m_eventType, false, false); + case EventAppliesToo::kSignature: { + CXFA_WidgetData* pWidgetData = GetXFANode()->GetWidgetData(); + if (!pWidgetData) + return XFA_EVENTERROR_NotExist; + + CXFA_Node* pUINode = pWidgetData->GetUIChild(); + if (pUINode->GetElementType() != XFA_Element::Signature) + return XFA_EVENTERROR_NotExist; + + return pNotify->ExecEventByDeepFirst( + GetXFANode(), eventParaInfo->m_eventType, false, false); + } + case EventAppliesToo::kChoiceList: { + CXFA_WidgetData* pWidgetData = GetXFANode()->GetWidgetData(); + if (!pWidgetData) + return XFA_EVENTERROR_NotExist; + + CXFA_Node* pUINode = pWidgetData->GetUIChild(); + if (pUINode->GetElementType() != XFA_Element::ChoiceList || + pWidgetData->IsListBox()) { + return XFA_EVENTERROR_NotExist; } - break; - case FX_XMLNODE_Text: - static_cast<CFX_XMLText*>(GetXFANode()->GetXMLMappingNode()) - ->SetText(wsXMLValue); - break; - default: - ASSERT(0); - } -} - -pdfium::Optional<WideString> CJX_Node::TryCData(XFA_Attribute eAttr, - bool bUseDefault) { - void* pKey = GetMapKey_Element(GetXFANode()->GetElementType(), eAttr); - if (eAttr == XFA_Attribute::Value) { - void* pData; - int32_t iBytes = 0; - WideString* pStr = nullptr; - if (GetMapModuleBuffer(pKey, pData, iBytes, true) && - iBytes == sizeof(void*)) { - memcpy(&pData, pData, iBytes); - pStr = reinterpret_cast<WideString*>(pData); + return pNotify->ExecEventByDeepFirst( + GetXFANode(), eventParaInfo->m_eventType, false, false); } - if (pStr) - return {*pStr}; - } else { - WideStringView wsValueC; - if (GetMapModuleString(pKey, wsValueC)) - return {WideString(wsValueC)}; } - if (!bUseDefault) - return {}; - - return GetXFANode()->GetDefaultCData(eAttr); -} - -CFX_XMLElement* CJX_Node::SetValue(XFA_Attribute eAttr, - XFA_AttributeType eType, - void* pValue, - bool bNotify) { - void* pKey = GetMapKey_Element(GetXFANode()->GetElementType(), eAttr); - OnChanging(eAttr, bNotify); - SetMapModuleValue(pKey, pValue); - OnChanged(eAttr, bNotify, false); - if (!GetXFANode()->IsNeedSavingXMLNode()) - return nullptr; - - auto* elem = static_cast<CFX_XMLElement*>(GetXFANode()->GetXMLMappingNode()); - ASSERT(elem->GetType() == FX_XMLNODE_Element); - - return elem; + return XFA_EVENTERROR_NotExist; } -// TODO(dsinclair): This should not be needed. Nodes should get un-bound when -// they're deleted instead of us pointing to bad objects. -void CJX_Node::ReleaseBindingNodes() { - for (auto& node : binding_nodes_) - node.Release(); +void CJX_Node::ThrowMissingPropertyException(const WideString& obj, + const WideString& prop) const { + ThrowException(L"'%ls' doesn't have property '%ls'.", obj.c_str(), + prop.c_str()); } -bool CJX_Node::SetUserData(void* pKey, - void* pData, - XFA_MAPDATABLOCKCALLBACKINFO* pCallbackInfo) { - SetMapModuleBuffer(pKey, &pData, sizeof(void*), - pCallbackInfo ? pCallbackInfo : &gs_XFADefaultFreeData); - return true; +void CJX_Node::ThrowTooManyOccurancesException(const WideString& obj) const { + ThrowException( + L"The element [%ls] has violated its allowable number of occurrences.", + obj.c_str()); } bool CJX_Node::SetContent(const WideString& wsContent, @@ -3483,407 +1889,3 @@ pdfium::Optional<WideString> CJX_Node::TryContent(bool bScriptModify, } return {}; } - -void CJX_Node::SetWidgetData(std::unique_ptr<CXFA_WidgetData> data) { - widget_data_ = std::move(data); -} - -void CJX_Node::SetCalcData(std::unique_ptr<CXFA_CalcData> data) { - calc_data_ = std::move(data); -} - -std::unique_ptr<CXFA_CalcData> CJX_Node::ReleaseCalcData() { - return std::move(calc_data_); -} - -pdfium::Optional<WideString> CJX_Node::TryNamespace() { - if (GetXFANode()->IsModelNode() || - GetXFANode()->GetElementType() == XFA_Element::Packet) { - CFX_XMLNode* pXMLNode = GetXFANode()->GetXMLMappingNode(); - if (!pXMLNode || pXMLNode->GetType() != FX_XMLNODE_Element) - return {}; - - return {static_cast<CFX_XMLElement*>(pXMLNode)->GetNamespaceURI()}; - } - - if (GetXFANode()->GetPacketType() != XFA_PacketType::Datasets) - return GetXFANode()->GetModelNode()->JSNode()->TryNamespace(); - - CFX_XMLNode* pXMLNode = GetXFANode()->GetXMLMappingNode(); - if (!pXMLNode || pXMLNode->GetType() != FX_XMLNODE_Element) - return {}; - - if (GetXFANode()->GetElementType() == XFA_Element::DataValue && - GetEnum(XFA_Attribute::Contains) == XFA_AttributeEnum::MetaData) { - WideString wsNamespace; - bool ret = XFA_FDEExtension_ResolveNamespaceQualifier( - static_cast<CFX_XMLElement*>(pXMLNode), - GetCData(XFA_Attribute::QualifiedName), &wsNamespace); - if (!ret) - return {}; - return {wsNamespace}; - } - return {static_cast<CFX_XMLElement*>(pXMLNode)->GetNamespaceURI()}; -} - -CXFA_Node* CJX_Node::GetProperty(int32_t index, - XFA_Element eProperty, - bool bCreateProperty) { - if (index < 0 || index >= GetXFANode()->PropertyOccuranceCount(eProperty)) - return nullptr; - - CXFA_Node* pNode = GetXFANode()->GetChildNode(); - int32_t iCount = 0; - for (; pNode; pNode = pNode->GetNodeItem(XFA_NODEITEM_NextSibling)) { - if (pNode->GetElementType() == eProperty) { - iCount++; - if (iCount > index) - return pNode; - } - } - if (!bCreateProperty) - return nullptr; - - if (GetXFANode()->HasPropertyFlags(eProperty, XFA_PROPERTYFLAG_OneOf)) { - pNode = GetXFANode()->GetChildNode(); - for (; pNode; pNode = pNode->GetNodeItem(XFA_NODEITEM_NextSibling)) { - if (GetXFANode()->HasPropertyFlags(pNode->GetElementType(), - XFA_PROPERTYFLAG_OneOf)) { - return nullptr; - } - } - } - - CXFA_Node* pNewNode = nullptr; - for (; iCount <= index; ++iCount) { - pNewNode = - GetDocument()->CreateNode(GetXFANode()->GetPacketType(), eProperty); - if (!pNewNode) - return nullptr; - GetXFANode()->InsertChild(pNewNode, nullptr); - pNewNode->SetFlag(XFA_NodeFlag_Initialized, true); - } - return pNewNode; -} - -XFA_MAPMODULEDATA* CJX_Node::CreateMapModuleData() { - if (!map_module_data_) - map_module_data_ = pdfium::MakeUnique<XFA_MAPMODULEDATA>(); - return map_module_data_.get(); -} - -XFA_MAPMODULEDATA* CJX_Node::GetMapModuleData() const { - return map_module_data_.get(); -} - -void CJX_Node::SetMapModuleValue(void* pKey, void* pValue) { - CreateMapModuleData()->m_ValueMap[pKey] = pValue; -} - -bool CJX_Node::GetMapModuleValue(void* pKey, void*& pValue) { - for (CXFA_Node* pNode = GetXFANode(); pNode; - pNode = pNode->GetTemplateNode()) { - XFA_MAPMODULEDATA* pModule = pNode->JSNode()->GetMapModuleData(); - if (pModule) { - auto it = pModule->m_ValueMap.find(pKey); - if (it != pModule->m_ValueMap.end()) { - pValue = it->second; - return true; - } - } - if (pNode->GetPacketType() == XFA_PacketType::Datasets) - break; - } - return false; -} - -void CJX_Node::SetMapModuleString(void* pKey, const WideStringView& wsValue) { - SetMapModuleBuffer(pKey, (void*)wsValue.unterminated_c_str(), - wsValue.GetLength() * sizeof(wchar_t), nullptr); -} - -bool CJX_Node::GetMapModuleString(void* pKey, WideStringView& wsValue) { - void* pValue; - int32_t iBytes; - if (!GetMapModuleBuffer(pKey, pValue, iBytes, true)) - return false; - - // Defensive measure: no out-of-bounds pointers even if zero length. - int32_t iChars = iBytes / sizeof(wchar_t); - wsValue = WideStringView(iChars ? (const wchar_t*)pValue : nullptr, iChars); - return true; -} - -void CJX_Node::SetMapModuleBuffer(void* pKey, - void* pValue, - int32_t iBytes, - XFA_MAPDATABLOCKCALLBACKINFO* pCallbackInfo) { - XFA_MAPDATABLOCK*& pBuffer = CreateMapModuleData()->m_BufferMap[pKey]; - if (!pBuffer) { - pBuffer = reinterpret_cast<XFA_MAPDATABLOCK*>( - FX_Alloc(uint8_t, sizeof(XFA_MAPDATABLOCK) + iBytes)); - } else if (pBuffer->iBytes != iBytes) { - if (pBuffer->pCallbackInfo && pBuffer->pCallbackInfo->pFree) - pBuffer->pCallbackInfo->pFree(*(void**)pBuffer->GetData()); - - pBuffer = reinterpret_cast<XFA_MAPDATABLOCK*>( - FX_Realloc(uint8_t, pBuffer, sizeof(XFA_MAPDATABLOCK) + iBytes)); - } else if (pBuffer->pCallbackInfo && pBuffer->pCallbackInfo->pFree) { - pBuffer->pCallbackInfo->pFree( - *reinterpret_cast<void**>(pBuffer->GetData())); - } - if (!pBuffer) - return; - - pBuffer->pCallbackInfo = pCallbackInfo; - pBuffer->iBytes = iBytes; - memcpy(pBuffer->GetData(), pValue, iBytes); -} - -bool CJX_Node::GetMapModuleBuffer(void* pKey, - void*& pValue, - int32_t& iBytes, - bool bProtoAlso) const { - XFA_MAPDATABLOCK* pBuffer = nullptr; - for (const CXFA_Node* pNode = GetXFANode(); pNode; - pNode = pNode->GetTemplateNode()) { - XFA_MAPMODULEDATA* pModule = pNode->JSNode()->GetMapModuleData(); - if (pModule) { - auto it = pModule->m_BufferMap.find(pKey); - if (it != pModule->m_BufferMap.end()) { - pBuffer = it->second; - break; - } - } - if (!bProtoAlso || pNode->GetPacketType() == XFA_PacketType::Datasets) - break; - } - if (!pBuffer) - return false; - - pValue = pBuffer->GetData(); - iBytes = pBuffer->iBytes; - return true; -} - -bool CJX_Node::HasMapModuleKey(void* pKey) { - XFA_MAPMODULEDATA* pModule = GetXFANode()->JSNode()->GetMapModuleData(); - return pModule && (pdfium::ContainsKey(pModule->m_ValueMap, pKey) || - pdfium::ContainsKey(pModule->m_BufferMap, pKey)); -} - -void CJX_Node::ClearMapModuleBuffer() { - XFA_MAPMODULEDATA* pModule = GetMapModuleData(); - if (!pModule) - return; - - for (auto& pair : pModule->m_BufferMap) { - XFA_MAPDATABLOCK* pBuffer = pair.second; - if (pBuffer) { - if (pBuffer->pCallbackInfo && pBuffer->pCallbackInfo->pFree) - pBuffer->pCallbackInfo->pFree(*(void**)pBuffer->GetData()); - - FX_Free(pBuffer); - } - } - pModule->m_BufferMap.clear(); - pModule->m_ValueMap.clear(); -} - -void CJX_Node::RemoveMapModuleKey(void* pKey) { - ASSERT(pKey); - - XFA_MAPMODULEDATA* pModule = GetMapModuleData(); - if (!pModule) - return; - - auto it = pModule->m_BufferMap.find(pKey); - if (it != pModule->m_BufferMap.end()) { - XFA_MAPDATABLOCK* pBuffer = it->second; - if (pBuffer) { - if (pBuffer->pCallbackInfo && pBuffer->pCallbackInfo->pFree) - pBuffer->pCallbackInfo->pFree(*(void**)pBuffer->GetData()); - - FX_Free(pBuffer); - } - pModule->m_BufferMap.erase(it); - } - pModule->m_ValueMap.erase(pKey); - return; -} - -void CJX_Node::MergeAllData(CXFA_Node* pDstModule) { - XFA_MAPMODULEDATA* pDstModuleData = - pDstModule->JSNode()->CreateMapModuleData(); - XFA_MAPMODULEDATA* pSrcModuleData = GetMapModuleData(); - if (!pSrcModuleData) - return; - - for (const auto& pair : pSrcModuleData->m_ValueMap) - pDstModuleData->m_ValueMap[pair.first] = pair.second; - - for (const auto& pair : pSrcModuleData->m_BufferMap) { - XFA_MAPDATABLOCK* pSrcBuffer = pair.second; - XFA_MAPDATABLOCK*& pDstBuffer = pDstModuleData->m_BufferMap[pair.first]; - if (pSrcBuffer->pCallbackInfo && pSrcBuffer->pCallbackInfo->pFree && - !pSrcBuffer->pCallbackInfo->pCopy) { - if (pDstBuffer) { - pDstBuffer->pCallbackInfo->pFree(*(void**)pDstBuffer->GetData()); - pDstModuleData->m_BufferMap.erase(pair.first); - } - continue; - } - if (!pDstBuffer) { - pDstBuffer = (XFA_MAPDATABLOCK*)FX_Alloc( - uint8_t, sizeof(XFA_MAPDATABLOCK) + pSrcBuffer->iBytes); - } else if (pDstBuffer->iBytes != pSrcBuffer->iBytes) { - if (pDstBuffer->pCallbackInfo && pDstBuffer->pCallbackInfo->pFree) { - pDstBuffer->pCallbackInfo->pFree(*(void**)pDstBuffer->GetData()); - } - pDstBuffer = (XFA_MAPDATABLOCK*)FX_Realloc( - uint8_t, pDstBuffer, sizeof(XFA_MAPDATABLOCK) + pSrcBuffer->iBytes); - } else if (pDstBuffer->pCallbackInfo && pDstBuffer->pCallbackInfo->pFree) { - pDstBuffer->pCallbackInfo->pFree(*(void**)pDstBuffer->GetData()); - } - if (!pDstBuffer) - continue; - - pDstBuffer->pCallbackInfo = pSrcBuffer->pCallbackInfo; - pDstBuffer->iBytes = pSrcBuffer->iBytes; - memcpy(pDstBuffer->GetData(), pSrcBuffer->GetData(), pSrcBuffer->iBytes); - if (pDstBuffer->pCallbackInfo && pDstBuffer->pCallbackInfo->pCopy) { - pDstBuffer->pCallbackInfo->pCopy(*(void**)pDstBuffer->GetData()); - } - } -} - -void CJX_Node::MoveBufferMapData(CXFA_Node* pDstModule) { - if (!pDstModule) - return; - - bool bNeedMove = true; - if (pDstModule->GetElementType() != GetXFANode()->GetElementType()) - bNeedMove = false; - - if (bNeedMove) - pDstModule->JSNode()->SetCalcData(ReleaseCalcData()); - if (!pDstModule->IsNodeV()) - return; - - WideString wsValue = pDstModule->JSNode()->GetContent(false); - WideString wsFormatValue(wsValue); - CXFA_WidgetData* pWidgetData = pDstModule->GetContainerWidgetData(); - if (pWidgetData) - wsFormatValue = pWidgetData->GetFormatDataValue(wsValue); - - pDstModule->JSNode()->SetContent(wsValue, wsFormatValue, true, true, true); -} - -void CJX_Node::MoveBufferMapData(CXFA_Node* pSrcModule, CXFA_Node* pDstModule) { - if (!pSrcModule || !pDstModule) - return; - - CXFA_Node* pSrcChild = pSrcModule->GetNodeItem(XFA_NODEITEM_FirstChild); - CXFA_Node* pDstChild = pDstModule->GetNodeItem(XFA_NODEITEM_FirstChild); - while (pSrcChild && pDstChild) { - MoveBufferMapData(pSrcChild, pDstChild); - - pSrcChild = pSrcChild->GetNodeItem(XFA_NODEITEM_NextSibling); - pDstChild = pDstChild->GetNodeItem(XFA_NODEITEM_NextSibling); - } - pSrcModule->JSNode()->MoveBufferMapData(pDstModule); -} - -int32_t CJX_Node::execSingleEventByName(const WideStringView& wsEventName, - XFA_Element eType) { - const XFA_ExecEventParaInfo* eventParaInfo = - GetEventParaInfoByName(wsEventName); - if (!eventParaInfo) - return XFA_EVENTERROR_NotExist; - - uint32_t validFlags = eventParaInfo->m_validFlags; - CXFA_FFNotify* pNotify = GetDocument()->GetNotify(); - if (!pNotify) - return XFA_EVENTERROR_NotExist; - - if (validFlags == 1) { - return pNotify->ExecEventByDeepFirst(GetXFANode(), - eventParaInfo->m_eventType); - } - - if (validFlags == 2) { - return pNotify->ExecEventByDeepFirst( - GetXFANode(), eventParaInfo->m_eventType, false, false); - } - - if (validFlags == 3) { - if (eType != XFA_Element::Subform) - return XFA_EVENTERROR_NotExist; - - return pNotify->ExecEventByDeepFirst( - GetXFANode(), eventParaInfo->m_eventType, false, false); - } - - if (validFlags == 4) { - if (eType != XFA_Element::ExclGroup && eType != XFA_Element::Field) - return XFA_EVENTERROR_NotExist; - - CXFA_Node* pParentNode = GetXFANode()->GetNodeItem(XFA_NODEITEM_Parent); - if (pParentNode && - pParentNode->GetElementType() == XFA_Element::ExclGroup) { - pNotify->ExecEventByDeepFirst(GetXFANode(), eventParaInfo->m_eventType, - false, false); - } - return pNotify->ExecEventByDeepFirst( - GetXFANode(), eventParaInfo->m_eventType, false, false); - } - - if (validFlags == 5) { - if (eType != XFA_Element::Field) - return XFA_EVENTERROR_NotExist; - - return pNotify->ExecEventByDeepFirst( - GetXFANode(), eventParaInfo->m_eventType, false, false); - } - - if (validFlags == 6) { - CXFA_WidgetData* pWidgetData = GetXFANode()->GetWidgetData(); - if (!pWidgetData) - return XFA_EVENTERROR_NotExist; - - CXFA_Node* pUINode = pWidgetData->GetUIChild(); - if (pUINode->GetElementType() != XFA_Element::Signature) - return XFA_EVENTERROR_NotExist; - - return pNotify->ExecEventByDeepFirst( - GetXFANode(), eventParaInfo->m_eventType, false, false); - } - - if (validFlags == 7) { - CXFA_WidgetData* pWidgetData = GetXFANode()->GetWidgetData(); - if (!pWidgetData) - return XFA_EVENTERROR_NotExist; - - CXFA_Node* pUINode = pWidgetData->GetUIChild(); - if (pUINode->GetElementType() != XFA_Element::ChoiceList || - pWidgetData->IsListBox()) { - return XFA_EVENTERROR_NotExist; - } - return pNotify->ExecEventByDeepFirst( - GetXFANode(), eventParaInfo->m_eventType, false, false); - } - - return XFA_EVENTERROR_NotExist; -} - -void CJX_Node::ThrowMissingPropertyException(const WideString& obj, - const WideString& prop) const { - ThrowException(L"'%s' doesn't have property '%s'.", obj.c_str(), - prop.c_str()); -} - -void CJX_Node::ThrowTooManyOccurancesException(const WideString& obj) const { - ThrowException( - L"The element [%s] has violated its allowable number of occurrences.", - obj.c_str()); -} diff --git a/fxjs/cjx_node.h b/fxjs/cjx_node.h index ba1d7523bd..7ccf8b111b 100644 --- a/fxjs/cjx_node.h +++ b/fxjs/cjx_node.h @@ -12,33 +12,22 @@ #include <vector> #include "core/fxcrt/unowned_ptr.h" +#include "fxjs/CJX_Define.h" #include "fxjs/cjx_object.h" +#include "fxjs/xfa/cjx_tree.h" #include "xfa/fxfa/fxfa_basic.h" -typedef void (*PD_CALLBACK_FREEDATA)(void* pData); -typedef void (*PD_CALLBACK_DUPLICATEDATA)(void*& pData); - -struct XFA_MAPDATABLOCKCALLBACKINFO { - PD_CALLBACK_FREEDATA pFree; - PD_CALLBACK_DUPLICATEDATA pCopy; -}; - enum XFA_SOM_MESSAGETYPE { XFA_SOM_ValidationMessage, XFA_SOM_FormatMessage, XFA_SOM_MandatoryMessage }; -class CFX_XMLElement; -class CFXJSE_Arguments; -class CXFA_CalcData; class CXFA_LayoutItem; class CXFA_Node; class CXFA_WidgetData; -struct XFA_MAPMODULEDATA; - -class CJX_Node : public CJX_Object { +class CJX_Node : public CJX_Tree { public: explicit CJX_Node(CXFA_Node* node); ~CJX_Node() override; @@ -46,26 +35,6 @@ class CJX_Node : public CJX_Object { CXFA_Node* GetXFANode(); const CXFA_Node* GetXFANode() const; - bool HasAttribute(XFA_Attribute eAttr); - bool SetAttribute(XFA_Attribute eAttr, - const WideStringView& wsValue, - bool bNotify); - bool SetAttribute(const WideStringView& wsAttr, - const WideStringView& wsValue, - bool bNotify); - WideString GetAttribute(const WideStringView& attr); - WideString GetAttribute(XFA_Attribute attr); - pdfium::Optional<WideString> TryAttribute(const WideStringView& wsAttr, - bool bUseDefault); - pdfium::Optional<WideString> TryAttribute(XFA_Attribute eAttr, - bool bUseDefault); - - void SetAttributeValue(const WideString& wsValue, - const WideString& wsXMLValue, - bool bNotify, - bool bScriptModify); - void RemoveAttribute(const WideStringView& wsAttr); - CXFA_Node* GetProperty(int32_t index, XFA_Element eType, bool bCreateProperty); @@ -78,67 +47,17 @@ class CJX_Node : public CJX_Object { bool bSyncData); WideString GetContent(bool bScriptModify); - pdfium::Optional<int32_t> TryInteger(XFA_Attribute eAttr, bool bUseDefault); - bool SetInteger(XFA_Attribute eAttr, int32_t iValue, bool bNotify); - int32_t GetInteger(XFA_Attribute eAttr); - - pdfium::Optional<WideString> TryCData(XFA_Attribute eAttr, bool bUseDefault); - bool SetCData(XFA_Attribute eAttr, - const WideString& wsValue, - bool bNotify, - bool bScriptModify); - WideString GetCData(XFA_Attribute eAttr); - - pdfium::Optional<XFA_AttributeEnum> TryEnum(XFA_Attribute eAttr, - bool bUseDefault); - bool SetEnum(XFA_Attribute eAttr, XFA_AttributeEnum eValue, bool bNotify); - XFA_AttributeEnum GetEnum(XFA_Attribute eAttr); - - pdfium::Optional<bool> TryBoolean(XFA_Attribute eAttr, bool bUseDefault); - bool SetBoolean(XFA_Attribute eAttr, bool bValue, bool bNotify); - bool GetBoolean(XFA_Attribute eAttr); - - pdfium::Optional<CXFA_Measurement> TryMeasure(XFA_Attribute eAttr, - bool bUseDefault) const; - bool SetMeasure(XFA_Attribute eAttr, CXFA_Measurement mValue, bool bNotify); - CXFA_Measurement GetMeasure(XFA_Attribute eAttr) const; - - void SetBindingNodes(std::vector<UnownedPtr<CXFA_Node>> nodes) { - binding_nodes_ = std::move(nodes); - } - std::vector<UnownedPtr<CXFA_Node>>* GetBindingNodes() { - return &binding_nodes_; - } - void ReleaseBindingNodes(); - - void SetBindingNode(CXFA_Node* node) { - binding_nodes_.clear(); - if (node) - binding_nodes_.emplace_back(node); - } - CXFA_Node* GetBindingNode() const { - if (binding_nodes_.empty()) - return nullptr; - return binding_nodes_[0].Get(); - } - void SetWidgetData(std::unique_ptr<CXFA_WidgetData> data); CXFA_WidgetData* GetWidgetData() const { return widget_data_.get(); } void SetLayoutItem(CXFA_LayoutItem* item) { layout_item_ = item; } CXFA_LayoutItem* GetLayoutItem() const { return layout_item_.Get(); } - void SetCalcData(std::unique_ptr<CXFA_CalcData> data); - CXFA_CalcData* GetCalcData() const { return calc_data_.get(); } - std::unique_ptr<CXFA_CalcData> ReleaseCalcData(); - void SetCalcRecursionCount(size_t count) { calc_recursion_count_ = count; } size_t GetCalcRecursionCount() const { return calc_recursion_count_; } pdfium::Optional<WideString> TryNamespace(); - void MergeAllData(CXFA_Node* pDstModule); - void ThrowMissingPropertyException(const WideString& obj, const WideString& prop) const; void ThrowTooManyOccurancesException(const WideString& obj) const; @@ -147,41 +66,18 @@ class CJX_Node : public CJX_Object { int32_t InstanceManager_SetInstances(int32_t iDesired); int32_t InstanceManager_MoveInstance(int32_t iTo, int32_t iFrom); - void Script_TreeClass_ResolveNode(CFXJSE_Arguments* pArguments); - void Script_TreeClass_ResolveNodes(CFXJSE_Arguments* pArguments); + JS_METHOD(applyXSL, CJX_Node); + JS_METHOD(assignNode, CJX_Node); + JS_METHOD(clone, CJX_Node); + JS_METHOD(getAttribute, CJX_Node); + JS_METHOD(getElement, CJX_Node); + JS_METHOD(isPropertySpecified, CJX_Node); + JS_METHOD(loadXML, CJX_Node); + JS_METHOD(saveFilteredXML, CJX_Node); + JS_METHOD(saveXML, CJX_Node); + JS_METHOD(setAttribute, CJX_Node); + JS_METHOD(setElement, CJX_Node); - void Script_TreeClass_All(CFXJSE_Value* pValue, - bool bSetting, - XFA_Attribute eAttribute); - void Script_TreeClass_Nodes(CFXJSE_Value* pValue, - bool bSetting, - XFA_Attribute eAttribute); - void Script_TreeClass_ClassAll(CFXJSE_Value* pValue, - bool bSetting, - XFA_Attribute eAttribute); - void Script_TreeClass_Parent(CFXJSE_Value* pValue, - bool bSetting, - XFA_Attribute eAttribute); - void Script_TreeClass_Index(CFXJSE_Value* pValue, - bool bSetting, - XFA_Attribute eAttribute); - void Script_TreeClass_ClassIndex(CFXJSE_Value* pValue, - bool bSetting, - XFA_Attribute eAttribute); - void Script_TreeClass_SomExpression(CFXJSE_Value* pValue, - bool bSetting, - XFA_Attribute eAttribute); - void Script_NodeClass_ApplyXSL(CFXJSE_Arguments* pArguments); - void Script_NodeClass_AssignNode(CFXJSE_Arguments* pArguments); - void Script_NodeClass_Clone(CFXJSE_Arguments* pArguments); - void Script_NodeClass_GetAttribute(CFXJSE_Arguments* pArguments); - void Script_NodeClass_GetElement(CFXJSE_Arguments* pArguments); - void Script_NodeClass_IsPropertySpecified(CFXJSE_Arguments* pArguments); - void Script_NodeClass_LoadXML(CFXJSE_Arguments* pArguments); - void Script_NodeClass_SaveFilteredXML(CFXJSE_Arguments* pArguments); - void Script_NodeClass_SaveXML(CFXJSE_Arguments* pArguments); - void Script_NodeClass_SetAttribute(CFXJSE_Arguments* pArguments); - void Script_NodeClass_SetElement(CFXJSE_Arguments* pArguments); void Script_NodeClass_Ns(CFXJSE_Value* pValue, bool bSetting, XFA_Attribute eAttribute); @@ -197,19 +93,12 @@ class CJX_Node : public CJX_Object { void Script_NodeClass_OneOfChild(CFXJSE_Value* pValue, bool bSetting, XFA_Attribute eAttribute); - void Script_ContainerClass_GetDelta(CFXJSE_Arguments* pArguments); - void Script_ContainerClass_GetDeltas(CFXJSE_Arguments* pArguments); - void Script_ModelClass_ClearErrorList(CFXJSE_Arguments* pArguments); - void Script_ModelClass_CreateNode(CFXJSE_Arguments* pArguments); - void Script_ModelClass_IsCompatibleNS(CFXJSE_Arguments* pArguments); void Script_ModelClass_Context(CFXJSE_Value* pValue, bool bSetting, XFA_Attribute eAttribute); void Script_ModelClass_AliasNode(CFXJSE_Value* pValue, bool bSetting, XFA_Attribute eAttribute); - void Script_WsdlConnection_Execute(CFXJSE_Arguments* pArguments); - void Script_Delta_Restore(CFXJSE_Arguments* pArguments); void Script_Delta_CurrentValue(CFXJSE_Value* pValue, bool bSetting, XFA_Attribute eAttribute); @@ -300,19 +189,6 @@ class CJX_Node : public CJX_Object { void Script_Field_SelectedIndex(CFXJSE_Value* pValue, bool bSetting, XFA_Attribute eAttribute); - void Script_Field_ClearItems(CFXJSE_Arguments* pArguments); - void Script_Field_ExecEvent(CFXJSE_Arguments* pArguments); - void Script_Field_ExecInitialize(CFXJSE_Arguments* pArguments); - void Script_Field_DeleteItem(CFXJSE_Arguments* pArguments); - void Script_Field_GetSaveItem(CFXJSE_Arguments* pArguments); - void Script_Field_BoundItem(CFXJSE_Arguments* pArguments); - void Script_Field_GetItemState(CFXJSE_Arguments* pArguments); - void Script_Field_ExecCalculate(CFXJSE_Arguments* pArguments); - void Script_Field_SetItems(CFXJSE_Arguments* pArguments); - void Script_Field_GetDisplayItem(CFXJSE_Arguments* pArguments); - void Script_Field_SetItemState(CFXJSE_Arguments* pArguments); - void Script_Field_AddItem(CFXJSE_Arguments* pArguments); - void Script_Field_ExecValidate(CFXJSE_Arguments* pArguments); void Script_ExclGroup_DefaultAndRawValue(CFXJSE_Value* pValue, bool bSetting, XFA_Attribute eAttribute); @@ -322,30 +198,13 @@ class CJX_Node : public CJX_Object { void Script_ExclGroup_Transient(CFXJSE_Value* pValue, bool bSetting, XFA_Attribute eAttribute); - void Script_ExclGroup_ExecEvent(CFXJSE_Arguments* pArguments); - void Script_ExclGroup_SelectedMember(CFXJSE_Arguments* pArguments); - void Script_ExclGroup_ExecInitialize(CFXJSE_Arguments* pArguments); - void Script_ExclGroup_ExecCalculate(CFXJSE_Arguments* pArguments); - void Script_ExclGroup_ExecValidate(CFXJSE_Arguments* pArguments); + void Script_Subform_InstanceManager(CFXJSE_Value* pValue, bool bSetting, XFA_Attribute eAttribute); void Script_Subform_Locale(CFXJSE_Value* pValue, bool bSetting, XFA_Attribute eAttribute); - void Script_Subform_ExecEvent(CFXJSE_Arguments* pArguments); - void Script_Subform_ExecInitialize(CFXJSE_Arguments* pArguments); - void Script_Subform_ExecCalculate(CFXJSE_Arguments* pArguments); - void Script_Subform_ExecValidate(CFXJSE_Arguments* pArguments); - void Script_Subform_GetInvalidObjects(CFXJSE_Arguments* pArguments); - void Script_Template_FormNodes(CFXJSE_Arguments* pArguments); - void Script_Template_Remerge(CFXJSE_Arguments* pArguments); - void Script_Template_ExecInitialize(CFXJSE_Arguments* pArguments); - void Script_Template_CreateNode(CFXJSE_Arguments* pArguments); - void Script_Template_Recalculate(CFXJSE_Arguments* pArguments); - void Script_Template_ExecCalculate(CFXJSE_Arguments* pArguments); - void Script_Template_ExecValidate(CFXJSE_Arguments* pArguments); - void Script_Manifest_Evaluate(CFXJSE_Arguments* pArguments); void Script_InstanceManager_Count(CFXJSE_Value* pValue, bool bSetting, XFA_Attribute eAttribute); @@ -355,50 +214,22 @@ class CJX_Node : public CJX_Object { void Script_InstanceManager_Min(CFXJSE_Value* pValue, bool bSetting, XFA_Attribute eAttribute); - void Script_InstanceManager_MoveInstance(CFXJSE_Arguments* pArguments); - void Script_InstanceManager_RemoveInstance(CFXJSE_Arguments* pArguments); - void Script_InstanceManager_SetInstances(CFXJSE_Arguments* pArguments); - void Script_InstanceManager_AddInstance(CFXJSE_Arguments* pArguments); - void Script_InstanceManager_InsertInstance(CFXJSE_Arguments* pArguments); + void Script_Occur_Max(CFXJSE_Value* pValue, bool bSetting, XFA_Attribute eAttribute); void Script_Occur_Min(CFXJSE_Value* pValue, bool bSetting, XFA_Attribute eAttribute); - void Script_Desc_Metadata(CFXJSE_Arguments* pArguments); - void Script_Form_FormNodes(CFXJSE_Arguments* pArguments); - void Script_Form_Remerge(CFXJSE_Arguments* pArguments); - void Script_Form_ExecInitialize(CFXJSE_Arguments* pArguments); - void Script_Form_Recalculate(CFXJSE_Arguments* pArguments); - void Script_Form_ExecCalculate(CFXJSE_Arguments* pArguments); - void Script_Form_ExecValidate(CFXJSE_Arguments* pArguments); + void Script_Form_Checksum(CFXJSE_Value* pValue, bool bSetting, XFA_Attribute eAttribute); - void Script_Packet_GetAttribute(CFXJSE_Arguments* pArguments); - void Script_Packet_SetAttribute(CFXJSE_Arguments* pArguments); - void Script_Packet_RemoveAttribute(CFXJSE_Arguments* pArguments); + void Script_Packet_Content(CFXJSE_Value* pValue, bool bSetting, XFA_Attribute eAttribute); - void Script_Source_Next(CFXJSE_Arguments* pArguments); - void Script_Source_CancelBatch(CFXJSE_Arguments* pArguments); - void Script_Source_First(CFXJSE_Arguments* pArguments); - void Script_Source_UpdateBatch(CFXJSE_Arguments* pArguments); - void Script_Source_Previous(CFXJSE_Arguments* pArguments); - void Script_Source_IsBOF(CFXJSE_Arguments* pArguments); - void Script_Source_IsEOF(CFXJSE_Arguments* pArguments); - void Script_Source_Cancel(CFXJSE_Arguments* pArguments); - void Script_Source_Update(CFXJSE_Arguments* pArguments); - void Script_Source_Open(CFXJSE_Arguments* pArguments); - void Script_Source_Delete(CFXJSE_Arguments* pArguments); - void Script_Source_AddNew(CFXJSE_Arguments* pArguments); - void Script_Source_Requery(CFXJSE_Arguments* pArguments); - void Script_Source_Resync(CFXJSE_Arguments* pArguments); - void Script_Source_Close(CFXJSE_Arguments* pArguments); - void Script_Source_Last(CFXJSE_Arguments* pArguments); - void Script_Source_HasDataChanged(CFXJSE_Arguments* pArguments); + void Script_Source_Db(CFXJSE_Value* pValue, bool bSetting, XFA_Attribute eAttribute); @@ -421,58 +252,15 @@ class CJX_Node : public CJX_Object { bool bSetting, XFA_Attribute eAttribute); - private: - bool SetUserData(void* pKey, - void* pData, - XFA_MAPDATABLOCKCALLBACKINFO* pCallbackInfo); - - void ResolveNodeList(CFXJSE_Value* pValue, - WideString wsExpression, - uint32_t dwFlag, - CXFA_Node* refNode); - - void OnChanged(XFA_Attribute eAttr, bool bNotify, bool bScriptModify); - void OnChanging(XFA_Attribute eAttr, bool bNotify); - void SendAttributeChangeMessage(XFA_Attribute eAttribute, bool bScriptModify); - - // Returns a pointer to the XML node that needs to be updated with the new - // attribute value. |nullptr| if no update is needed. - CFX_XMLElement* SetValue(XFA_Attribute eAttr, - XFA_AttributeType eType, - void* pValue, - bool bNotify); - - bool TryUserData(void* pKey, void*& pData, bool bProtoAlso); - - XFA_MAPMODULEDATA* CreateMapModuleData(); - XFA_MAPMODULEDATA* GetMapModuleData() const; - void SetMapModuleValue(void* pKey, void* pValue); - bool GetMapModuleValue(void* pKey, void*& pValue); - void SetMapModuleString(void* pKey, const WideStringView& wsValue); - bool GetMapModuleString(void* pKey, WideStringView& wsValue); - void SetMapModuleBuffer(void* pKey, - void* pValue, - int32_t iBytes, - XFA_MAPDATABLOCKCALLBACKINFO* pCallbackInfo); - bool GetMapModuleBuffer(void* pKey, - void*& pValue, - int32_t& iBytes, - bool bProtoAlso) const; - bool HasMapModuleKey(void* pKey); - void ClearMapModuleBuffer(); - void RemoveMapModuleKey(void* pKey); - void MoveBufferMapData(CXFA_Node* pDstModule); - void MoveBufferMapData(CXFA_Node* pSrcModule, CXFA_Node* pDstModule); - + protected: int32_t execSingleEventByName(const WideStringView& wsEventName, XFA_Element eType); - std::unique_ptr<XFA_MAPMODULEDATA> map_module_data_; + private: std::unique_ptr<CXFA_WidgetData> widget_data_; - std::unique_ptr<CXFA_CalcData> calc_data_; UnownedPtr<CXFA_LayoutItem> layout_item_; - std::vector<UnownedPtr<CXFA_Node>> binding_nodes_; size_t calc_recursion_count_ = 0; + static const CJX_MethodSpec MethodSpecs[]; }; #endif // FXJS_CJX_NODE_H_ diff --git a/fxjs/cjx_nodelist.h b/fxjs/cjx_nodelist.h deleted file mode 100644 index df879980bb..0000000000 --- a/fxjs/cjx_nodelist.h +++ /dev/null @@ -1,35 +0,0 @@ -// Copyright 2017 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com - -#ifndef FXJS_CJX_NODELIST_H_ -#define FXJS_CJX_NODELIST_H_ - -#include "fxjs/cjx_object.h" -#include "xfa/fxfa/fxfa_basic.h" - -class CFXJSE_Arguments; -class CFXJSE_Value; -class CXFA_NodeList; - -class CJX_NodeList : public CJX_Object { - public: - explicit CJX_NodeList(CXFA_NodeList* list); - ~CJX_NodeList() override; - - CXFA_NodeList* GetXFANodeList(); - - void Script_ListClass_Append(CFXJSE_Arguments* pArguments); - void Script_ListClass_Insert(CFXJSE_Arguments* pArguments); - void Script_ListClass_Remove(CFXJSE_Arguments* pArguments); - void Script_ListClass_Item(CFXJSE_Arguments* pArguments); - - void Script_TreelistClass_NamedItem(CFXJSE_Arguments* pArguments); - void Script_ListClass_Length(CFXJSE_Value* pValue, - bool bSetting, - XFA_Attribute eAttribute); -}; - -#endif // FXJS_CJX_NODELIST_H_ diff --git a/fxjs/cjx_object.cpp b/fxjs/cjx_object.cpp index 49c147ba95..21eb3c8921 100644 --- a/fxjs/cjx_object.cpp +++ b/fxjs/cjx_object.cpp @@ -6,13 +6,83 @@ #include "fxjs/cjx_object.h" +#include <map> +#include <utility> + +#include "core/fxcrt/fx_extension.h" +#include "core/fxcrt/xml/cfx_xmltext.h" #include "fxjs/cfxjse_value.h" +#include "third_party/base/ptr_util.h" +#include "xfa/fxfa/cxfa_ffnotify.h" +#include "xfa/fxfa/cxfa_ffwidget.h" #include "xfa/fxfa/parser/cxfa_document.h" +#include "xfa/fxfa/parser/cxfa_measurement.h" +#include "xfa/fxfa/parser/cxfa_node.h" #include "xfa/fxfa/parser/cxfa_object.h" +namespace { + +void XFA_DeleteWideString(void* pData) { + delete static_cast<WideString*>(pData); +} + +void XFA_CopyWideString(void*& pData) { + if (!pData) + return; + pData = new WideString(*reinterpret_cast<WideString*>(pData)); +} + +XFA_MAPDATABLOCKCALLBACKINFO deleteWideStringCallBack = {XFA_DeleteWideString, + XFA_CopyWideString}; + +enum XFA_KEYTYPE { + XFA_KEYTYPE_Custom, + XFA_KEYTYPE_Element, +}; + +void* GetMapKey_Custom(const WideStringView& wsKey) { + uint32_t dwKey = FX_HashCode_GetW(wsKey, false); + return (void*)(uintptr_t)((dwKey << 1) | XFA_KEYTYPE_Custom); +} + +void* GetMapKey_Element(XFA_Element eType, XFA_Attribute eAttribute) { + return (void*)(uintptr_t)((static_cast<uint32_t>(eType) << 16) | + (static_cast<uint32_t>(eAttribute) << 8) | + XFA_KEYTYPE_Element); +} + +void XFA_DefaultFreeData(void* pData) {} + +XFA_MAPDATABLOCKCALLBACKINFO gs_XFADefaultFreeData = {XFA_DefaultFreeData, + nullptr}; + +} // namespace + +struct XFA_MAPDATABLOCK { + uint8_t* GetData() const { return (uint8_t*)this + sizeof(XFA_MAPDATABLOCK); } + + XFA_MAPDATABLOCKCALLBACKINFO* pCallbackInfo; + int32_t iBytes; +}; + +struct XFA_MAPMODULEDATA { + XFA_MAPMODULEDATA() {} + ~XFA_MAPMODULEDATA() {} + + std::map<void*, void*> m_ValueMap; + std::map<void*, XFA_MAPDATABLOCK*> m_BufferMap; +}; + CJX_Object::CJX_Object(CXFA_Object* obj) : object_(obj) {} -CJX_Object::~CJX_Object() {} +CJX_Object::~CJX_Object() { + ClearMapModuleBuffer(); +} + +void CJX_Object::DefineMethods(const CJX_MethodSpec method_specs[]) { + for (size_t i = 0; method_specs[i].pMethodCall != nullptr; ++i) + method_specs_[method_specs[i].pName] = method_specs[i].pMethodCall; +} CXFA_Document* CJX_Object::GetDocument() const { return object_->GetDocument(); @@ -29,6 +99,17 @@ void CJX_Object::Script_ObjectClass_ClassName(CFXJSE_Value* pValue, FX_UTF8Encode(GetXFAObject()->GetClassName()).AsStringView()); } +bool CJX_Object::HasMethod(const WideString& func) const { + return pdfium::ContainsKey(method_specs_, func.UTF8Encode()); +} + +void CJX_Object::RunMethod(const WideString& func, CFXJSE_Arguments* args) { + auto it = method_specs_.find(func.UTF8Encode()); + if (it == method_specs_.end()) + return; + it->second(this, args); +} + void CJX_Object::ThrowInvalidPropertyException() const { ThrowException(L"Invalid property set operation."); } @@ -56,3 +137,666 @@ void CJX_Object::ThrowException(const wchar_t* str, ...) const { ASSERT(!wsMessage.IsEmpty()); FXJSE_ThrowMessage(wsMessage.UTF8Encode().AsStringView()); } + +bool CJX_Object::HasAttribute(XFA_Attribute eAttr) { + void* pKey = GetMapKey_Element(GetXFAObject()->GetElementType(), eAttr); + return HasMapModuleKey(pKey); +} + +bool CJX_Object::SetAttribute(XFA_Attribute eAttr, + const WideStringView& wsValue, + bool bNotify) { + switch (ToNode(GetXFAObject())->GetAttributeType(eAttr)) { + case XFA_AttributeType::Enum: { + pdfium::Optional<XFA_AttributeEnum> item = + CXFA_Node::NameToAttributeEnum(wsValue); + return SetEnum( + eAttr, + item ? *item : *(ToNode(GetXFAObject())->GetDefaultEnum(eAttr)), + bNotify); + } + case XFA_AttributeType::CData: + return SetCData(eAttr, WideString(wsValue), bNotify, false); + case XFA_AttributeType::Boolean: + return SetBoolean(eAttr, wsValue != L"0", bNotify); + case XFA_AttributeType::Integer: + return SetInteger(eAttr, + FXSYS_round(FXSYS_wcstof(wsValue.unterminated_c_str(), + wsValue.GetLength(), nullptr)), + bNotify); + case XFA_AttributeType::Measure: + return SetMeasure(eAttr, CXFA_Measurement(wsValue), bNotify); + default: + break; + } + return false; +} + +void CJX_Object::SetMapModuleString(void* pKey, const WideStringView& wsValue) { + SetMapModuleBuffer(pKey, (void*)wsValue.unterminated_c_str(), + wsValue.GetLength() * sizeof(wchar_t), nullptr); +} + +bool CJX_Object::SetAttribute(const WideStringView& wsAttr, + const WideStringView& wsValue, + bool bNotify) { + XFA_Attribute attr = CXFA_Node::NameToAttribute(wsValue); + if (attr != XFA_Attribute::Unknown) + return SetAttribute(attr, wsValue, bNotify); + + void* pKey = GetMapKey_Custom(wsAttr); + SetMapModuleString(pKey, wsValue); + return true; +} + +WideString CJX_Object::GetAttribute(const WideStringView& attr) { + return TryAttribute(attr, true).value_or(WideString()); +} + +WideString CJX_Object::GetAttribute(XFA_Attribute attr) { + return TryAttribute(attr, true).value_or(WideString()); +} + +pdfium::Optional<WideString> CJX_Object::TryAttribute(XFA_Attribute eAttr, + bool bUseDefault) { + switch (ToNode(GetXFAObject())->GetAttributeType(eAttr)) { + case XFA_AttributeType::Enum: { + pdfium::Optional<XFA_AttributeEnum> value = TryEnum(eAttr, bUseDefault); + if (!value) + return {}; + + return {CXFA_Node::AttributeEnumToName(*value)}; + } + case XFA_AttributeType::CData: + return TryCData(eAttr, bUseDefault); + + case XFA_AttributeType::Boolean: { + pdfium::Optional<bool> value = TryBoolean(eAttr, bUseDefault); + if (!value) + return {}; + return {*value ? L"1" : L"0"}; + } + case XFA_AttributeType::Integer: { + pdfium::Optional<int32_t> iValue = TryInteger(eAttr, bUseDefault); + if (!iValue) + return {}; + return {WideString::Format(L"%d", *iValue)}; + } + case XFA_AttributeType::Measure: { + pdfium::Optional<CXFA_Measurement> value = TryMeasure(eAttr, bUseDefault); + if (!value) + return {}; + + return {value->ToString()}; + } + default: + break; + } + return {}; +} + +pdfium::Optional<WideString> CJX_Object::TryAttribute( + const WideStringView& wsAttr, + bool bUseDefault) { + XFA_Attribute attr = CXFA_Node::NameToAttribute(wsAttr); + if (attr != XFA_Attribute::Unknown) + return TryAttribute(attr, bUseDefault); + + void* pKey = GetMapKey_Custom(wsAttr); + WideStringView wsValueC; + if (!GetMapModuleString(pKey, wsValueC)) + return {}; + + return {WideString(wsValueC)}; +} + +void CJX_Object::RemoveAttribute(const WideStringView& wsAttr) { + void* pKey = GetMapKey_Custom(wsAttr); + if (pKey) + RemoveMapModuleKey(pKey); +} + +pdfium::Optional<bool> CJX_Object::TryBoolean(XFA_Attribute eAttr, + bool bUseDefault) { + void* pValue = nullptr; + void* pKey = GetMapKey_Element(GetXFAObject()->GetElementType(), eAttr); + if (GetMapModuleValue(pKey, pValue)) + return {!!pValue}; + if (!bUseDefault) + return {}; + + return ToNode(GetXFAObject())->GetDefaultBoolean(eAttr); +} + +bool CJX_Object::SetBoolean(XFA_Attribute eAttr, bool bValue, bool bNotify) { + CFX_XMLElement* elem = SetValue(eAttr, XFA_AttributeType::Boolean, + (void*)(uintptr_t)bValue, bNotify); + if (elem) + elem->SetString(CXFA_Node::AttributeToName(eAttr), bValue ? L"1" : L"0"); + return true; +} + +bool CJX_Object::GetBoolean(XFA_Attribute eAttr) { + return TryBoolean(eAttr, true).value_or(false); +} + +bool CJX_Object::SetInteger(XFA_Attribute eAttr, int32_t iValue, bool bNotify) { + CFX_XMLElement* elem = SetValue(eAttr, XFA_AttributeType::Integer, + (void*)(uintptr_t)iValue, bNotify); + if (elem) { + elem->SetString(CXFA_Node::AttributeToName(eAttr), + WideString::Format(L"%d", iValue)); + } + return true; +} + +int32_t CJX_Object::GetInteger(XFA_Attribute eAttr) { + return TryInteger(eAttr, true).value_or(0); +} + +pdfium::Optional<int32_t> CJX_Object::TryInteger(XFA_Attribute eAttr, + bool bUseDefault) { + void* pKey = GetMapKey_Element(GetXFAObject()->GetElementType(), eAttr); + void* pValue = nullptr; + if (GetMapModuleValue(pKey, pValue)) + return {static_cast<int32_t>(reinterpret_cast<uintptr_t>(pValue))}; + if (!bUseDefault) + return {}; + + return ToNode(GetXFAObject())->GetDefaultInteger(eAttr); +} + +pdfium::Optional<XFA_AttributeEnum> CJX_Object::TryEnum(XFA_Attribute eAttr, + bool bUseDefault) { + void* pKey = GetMapKey_Element(GetXFAObject()->GetElementType(), eAttr); + void* pValue = nullptr; + if (GetMapModuleValue(pKey, pValue)) { + return { + static_cast<XFA_AttributeEnum>(reinterpret_cast<uintptr_t>(pValue))}; + } + if (!bUseDefault) + return {}; + + return ToNode(GetXFAObject())->GetDefaultEnum(eAttr); +} + +bool CJX_Object::SetEnum(XFA_Attribute eAttr, + XFA_AttributeEnum eValue, + bool bNotify) { + CFX_XMLElement* elem = SetValue(eAttr, XFA_AttributeType::Enum, + (void*)(uintptr_t)eValue, bNotify); + if (elem) { + elem->SetString(CXFA_Node::AttributeToName(eAttr), + CXFA_Node::AttributeEnumToName(eValue)); + } + return true; +} + +XFA_AttributeEnum CJX_Object::GetEnum(XFA_Attribute eAttr) { + return TryEnum(eAttr, true).value_or(XFA_AttributeEnum::Unknown); +} + +bool CJX_Object::SetMeasure(XFA_Attribute eAttr, + CXFA_Measurement mValue, + bool bNotify) { + void* pKey = GetMapKey_Element(GetXFAObject()->GetElementType(), eAttr); + OnChanging(eAttr, bNotify); + SetMapModuleBuffer(pKey, &mValue, sizeof(CXFA_Measurement), nullptr); + OnChanged(eAttr, bNotify, false); + return true; +} + +pdfium::Optional<CXFA_Measurement> CJX_Object::TryMeasure( + XFA_Attribute eAttr, + bool bUseDefault) const { + void* pKey = GetMapKey_Element(GetXFAObject()->GetElementType(), eAttr); + void* pValue; + int32_t iBytes; + if (GetMapModuleBuffer(pKey, pValue, iBytes, true) && + iBytes == sizeof(CXFA_Measurement)) { + return {*reinterpret_cast<CXFA_Measurement*>(pValue)}; + } + if (!bUseDefault) + return {}; + + return ToNode(GetXFAObject())->GetDefaultMeasurement(eAttr); +} + +CXFA_Measurement CJX_Object::GetMeasure(XFA_Attribute eAttr) const { + return TryMeasure(eAttr, true).value_or(CXFA_Measurement()); +} + +WideString CJX_Object::GetCData(XFA_Attribute eAttr) { + return TryCData(eAttr, true).value_or(WideString()); +} + +bool CJX_Object::SetCData(XFA_Attribute eAttr, + const WideString& wsValue, + bool bNotify, + bool bScriptModify) { + void* pKey = GetMapKey_Element(GetXFAObject()->GetElementType(), eAttr); + OnChanging(eAttr, bNotify); + if (eAttr == XFA_Attribute::Value) { + WideString* pClone = new WideString(wsValue); + SetUserData(pKey, pClone, &deleteWideStringCallBack); + } else { + SetMapModuleString(pKey, wsValue.AsStringView()); + if (eAttr == XFA_Attribute::Name) + ToNode(GetXFAObject())->UpdateNameHash(); + } + OnChanged(eAttr, bNotify, bScriptModify); + + if (!ToNode(GetXFAObject())->IsNeedSavingXMLNode() || + eAttr == XFA_Attribute::QualifiedName || + eAttr == XFA_Attribute::BindingNode) { + return true; + } + + if (eAttr == XFA_Attribute::Name && + (GetXFAObject()->GetElementType() == XFA_Element::DataValue || + GetXFAObject()->GetElementType() == XFA_Element::DataGroup)) { + return true; + } + + auto* elem = + static_cast<CFX_XMLElement*>(ToNode(GetXFAObject())->GetXMLMappingNode()); + if (eAttr == XFA_Attribute::Value) { + FX_XMLNODETYPE eXMLType = elem->GetType(); + switch (eXMLType) { + case FX_XMLNODE_Element: + if (ToNode(GetXFAObject())->IsAttributeInXML()) { + elem->SetString(WideString(GetCData(XFA_Attribute::QualifiedName)), + wsValue); + } else { + bool bDeleteChildren = true; + if (ToNode(GetXFAObject())->GetPacketType() == + XFA_PacketType::Datasets) { + for (CXFA_Node* pChildDataNode = + ToNode(GetXFAObject()) + ->GetNodeItem(XFA_NODEITEM_FirstChild); + pChildDataNode; pChildDataNode = pChildDataNode->GetNodeItem( + XFA_NODEITEM_NextSibling)) { + if (!pChildDataNode->GetBindItems()->empty()) { + bDeleteChildren = false; + break; + } + } + } + if (bDeleteChildren) + elem->DeleteChildren(); + + elem->SetTextData(wsValue); + } + break; + case FX_XMLNODE_Text: + static_cast<CFX_XMLText*>(ToNode(GetXFAObject())->GetXMLMappingNode()) + ->SetText(wsValue); + break; + default: + NOTREACHED(); + } + return true; + } + ASSERT(elem->GetType() == FX_XMLNODE_Element); + + WideString wsAttrName = CXFA_Node::AttributeToName(eAttr); + if (eAttr == XFA_Attribute::ContentType) + wsAttrName = L"xfa:" + wsAttrName; + + elem->SetString(wsAttrName, wsValue); + return true; +} + +void CJX_Object::SetAttributeValue(const WideString& wsValue, + const WideString& wsXMLValue, + bool bNotify, + bool bScriptModify) { + void* pKey = + GetMapKey_Element(GetXFAObject()->GetElementType(), XFA_Attribute::Value); + OnChanging(XFA_Attribute::Value, bNotify); + WideString* pClone = new WideString(wsValue); + SetUserData(pKey, pClone, &deleteWideStringCallBack); + OnChanged(XFA_Attribute::Value, bNotify, bScriptModify); + if (!ToNode(GetXFAObject())->IsNeedSavingXMLNode()) + return; + + auto* elem = + static_cast<CFX_XMLElement*>(ToNode(GetXFAObject())->GetXMLMappingNode()); + FX_XMLNODETYPE eXMLType = elem->GetType(); + switch (eXMLType) { + case FX_XMLNODE_Element: + if (ToNode(GetXFAObject())->IsAttributeInXML()) { + elem->SetString(WideString(GetCData(XFA_Attribute::QualifiedName)), + wsXMLValue); + } else { + bool bDeleteChildren = true; + if (ToNode(GetXFAObject())->GetPacketType() == + XFA_PacketType::Datasets) { + for (CXFA_Node* pChildDataNode = + ToNode(GetXFAObject())->GetNodeItem(XFA_NODEITEM_FirstChild); + pChildDataNode; pChildDataNode = pChildDataNode->GetNodeItem( + XFA_NODEITEM_NextSibling)) { + if (!pChildDataNode->GetBindItems()->empty()) { + bDeleteChildren = false; + break; + } + } + } + if (bDeleteChildren) + elem->DeleteChildren(); + + elem->SetTextData(wsXMLValue); + } + break; + case FX_XMLNODE_Text: + static_cast<CFX_XMLText*>(ToNode(GetXFAObject())->GetXMLMappingNode()) + ->SetText(wsXMLValue); + break; + default: + ASSERT(0); + } +} + +pdfium::Optional<WideString> CJX_Object::TryCData(XFA_Attribute eAttr, + bool bUseDefault) { + void* pKey = GetMapKey_Element(GetXFAObject()->GetElementType(), eAttr); + if (eAttr == XFA_Attribute::Value) { + void* pData; + int32_t iBytes = 0; + WideString* pStr = nullptr; + if (GetMapModuleBuffer(pKey, pData, iBytes, true) && + iBytes == sizeof(void*)) { + memcpy(&pData, pData, iBytes); + pStr = reinterpret_cast<WideString*>(pData); + } + if (pStr) + return {*pStr}; + } else { + WideStringView wsValueC; + if (GetMapModuleString(pKey, wsValueC)) + return {WideString(wsValueC)}; + } + if (!bUseDefault) + return {}; + + return ToNode(GetXFAObject())->GetDefaultCData(eAttr); +} + +CFX_XMLElement* CJX_Object::SetValue(XFA_Attribute eAttr, + XFA_AttributeType eType, + void* pValue, + bool bNotify) { + void* pKey = GetMapKey_Element(GetXFAObject()->GetElementType(), eAttr); + OnChanging(eAttr, bNotify); + SetMapModuleValue(pKey, pValue); + OnChanged(eAttr, bNotify, false); + if (!ToNode(GetXFAObject())->IsNeedSavingXMLNode()) + return nullptr; + + auto* elem = + static_cast<CFX_XMLElement*>(ToNode(GetXFAObject())->GetXMLMappingNode()); + ASSERT(elem->GetType() == FX_XMLNODE_Element); + + return elem; +} + +bool CJX_Object::SetUserData(void* pKey, + void* pData, + XFA_MAPDATABLOCKCALLBACKINFO* pCallbackInfo) { + SetMapModuleBuffer(pKey, &pData, sizeof(void*), + pCallbackInfo ? pCallbackInfo : &gs_XFADefaultFreeData); + return true; +} + +XFA_MAPMODULEDATA* CJX_Object::CreateMapModuleData() { + if (!map_module_data_) + map_module_data_ = pdfium::MakeUnique<XFA_MAPMODULEDATA>(); + return map_module_data_.get(); +} + +XFA_MAPMODULEDATA* CJX_Object::GetMapModuleData() const { + return map_module_data_.get(); +} + +void CJX_Object::SetMapModuleValue(void* pKey, void* pValue) { + CreateMapModuleData()->m_ValueMap[pKey] = pValue; +} + +bool CJX_Object::GetMapModuleValue(void* pKey, void*& pValue) { + for (CXFA_Node* pNode = ToNode(GetXFAObject()); pNode; + pNode = pNode->GetTemplateNode()) { + XFA_MAPMODULEDATA* pModule = pNode->JSNode()->GetMapModuleData(); + if (pModule) { + auto it = pModule->m_ValueMap.find(pKey); + if (it != pModule->m_ValueMap.end()) { + pValue = it->second; + return true; + } + } + if (pNode->GetPacketType() == XFA_PacketType::Datasets) + break; + } + return false; +} + +bool CJX_Object::GetMapModuleString(void* pKey, WideStringView& wsValue) { + void* pValue; + int32_t iBytes; + if (!GetMapModuleBuffer(pKey, pValue, iBytes, true)) + return false; + + // Defensive measure: no out-of-bounds pointers even if zero length. + int32_t iChars = iBytes / sizeof(wchar_t); + wsValue = WideStringView(iChars ? (const wchar_t*)pValue : nullptr, iChars); + return true; +} + +void CJX_Object::SetMapModuleBuffer( + void* pKey, + void* pValue, + int32_t iBytes, + XFA_MAPDATABLOCKCALLBACKINFO* pCallbackInfo) { + XFA_MAPDATABLOCK*& pBuffer = CreateMapModuleData()->m_BufferMap[pKey]; + if (!pBuffer) { + pBuffer = reinterpret_cast<XFA_MAPDATABLOCK*>( + FX_Alloc(uint8_t, sizeof(XFA_MAPDATABLOCK) + iBytes)); + } else if (pBuffer->iBytes != iBytes) { + if (pBuffer->pCallbackInfo && pBuffer->pCallbackInfo->pFree) + pBuffer->pCallbackInfo->pFree(*(void**)pBuffer->GetData()); + + pBuffer = reinterpret_cast<XFA_MAPDATABLOCK*>( + FX_Realloc(uint8_t, pBuffer, sizeof(XFA_MAPDATABLOCK) + iBytes)); + } else if (pBuffer->pCallbackInfo && pBuffer->pCallbackInfo->pFree) { + pBuffer->pCallbackInfo->pFree( + *reinterpret_cast<void**>(pBuffer->GetData())); + } + if (!pBuffer) + return; + + pBuffer->pCallbackInfo = pCallbackInfo; + pBuffer->iBytes = iBytes; + memcpy(pBuffer->GetData(), pValue, iBytes); +} + +bool CJX_Object::GetMapModuleBuffer(void* pKey, + void*& pValue, + int32_t& iBytes, + bool bProtoAlso) const { + XFA_MAPDATABLOCK* pBuffer = nullptr; + for (const CXFA_Node* pNode = ToNode(GetXFAObject()); pNode; + pNode = pNode->GetTemplateNode()) { + XFA_MAPMODULEDATA* pModule = pNode->JSNode()->GetMapModuleData(); + if (pModule) { + auto it = pModule->m_BufferMap.find(pKey); + if (it != pModule->m_BufferMap.end()) { + pBuffer = it->second; + break; + } + } + if (!bProtoAlso || pNode->GetPacketType() == XFA_PacketType::Datasets) + break; + } + if (!pBuffer) + return false; + + pValue = pBuffer->GetData(); + iBytes = pBuffer->iBytes; + return true; +} + +bool CJX_Object::HasMapModuleKey(void* pKey) { + XFA_MAPMODULEDATA* pModule = GetMapModuleData(); + return pModule && (pdfium::ContainsKey(pModule->m_ValueMap, pKey) || + pdfium::ContainsKey(pModule->m_BufferMap, pKey)); +} + +void CJX_Object::ClearMapModuleBuffer() { + XFA_MAPMODULEDATA* pModule = GetMapModuleData(); + if (!pModule) + return; + + for (auto& pair : pModule->m_BufferMap) { + XFA_MAPDATABLOCK* pBuffer = pair.second; + if (pBuffer) { + if (pBuffer->pCallbackInfo && pBuffer->pCallbackInfo->pFree) + pBuffer->pCallbackInfo->pFree(*(void**)pBuffer->GetData()); + + FX_Free(pBuffer); + } + } + pModule->m_BufferMap.clear(); + pModule->m_ValueMap.clear(); +} + +void CJX_Object::RemoveMapModuleKey(void* pKey) { + ASSERT(pKey); + + XFA_MAPMODULEDATA* pModule = GetMapModuleData(); + if (!pModule) + return; + + auto it = pModule->m_BufferMap.find(pKey); + if (it != pModule->m_BufferMap.end()) { + XFA_MAPDATABLOCK* pBuffer = it->second; + if (pBuffer) { + if (pBuffer->pCallbackInfo && pBuffer->pCallbackInfo->pFree) + pBuffer->pCallbackInfo->pFree(*(void**)pBuffer->GetData()); + + FX_Free(pBuffer); + } + pModule->m_BufferMap.erase(it); + } + pModule->m_ValueMap.erase(pKey); + return; +} + +void CJX_Object::MergeAllData(CXFA_Object* pDstModule) { + XFA_MAPMODULEDATA* pDstModuleData = + ToNode(pDstModule)->JSNode()->CreateMapModuleData(); + XFA_MAPMODULEDATA* pSrcModuleData = GetMapModuleData(); + if (!pSrcModuleData) + return; + + for (const auto& pair : pSrcModuleData->m_ValueMap) + pDstModuleData->m_ValueMap[pair.first] = pair.second; + + for (const auto& pair : pSrcModuleData->m_BufferMap) { + XFA_MAPDATABLOCK* pSrcBuffer = pair.second; + XFA_MAPDATABLOCK*& pDstBuffer = pDstModuleData->m_BufferMap[pair.first]; + if (pSrcBuffer->pCallbackInfo && pSrcBuffer->pCallbackInfo->pFree && + !pSrcBuffer->pCallbackInfo->pCopy) { + if (pDstBuffer) { + pDstBuffer->pCallbackInfo->pFree(*(void**)pDstBuffer->GetData()); + pDstModuleData->m_BufferMap.erase(pair.first); + } + continue; + } + if (!pDstBuffer) { + pDstBuffer = (XFA_MAPDATABLOCK*)FX_Alloc( + uint8_t, sizeof(XFA_MAPDATABLOCK) + pSrcBuffer->iBytes); + } else if (pDstBuffer->iBytes != pSrcBuffer->iBytes) { + if (pDstBuffer->pCallbackInfo && pDstBuffer->pCallbackInfo->pFree) { + pDstBuffer->pCallbackInfo->pFree(*(void**)pDstBuffer->GetData()); + } + pDstBuffer = (XFA_MAPDATABLOCK*)FX_Realloc( + uint8_t, pDstBuffer, sizeof(XFA_MAPDATABLOCK) + pSrcBuffer->iBytes); + } else if (pDstBuffer->pCallbackInfo && pDstBuffer->pCallbackInfo->pFree) { + pDstBuffer->pCallbackInfo->pFree(*(void**)pDstBuffer->GetData()); + } + if (!pDstBuffer) + continue; + + pDstBuffer->pCallbackInfo = pSrcBuffer->pCallbackInfo; + pDstBuffer->iBytes = pSrcBuffer->iBytes; + memcpy(pDstBuffer->GetData(), pSrcBuffer->GetData(), pSrcBuffer->iBytes); + if (pDstBuffer->pCallbackInfo && pDstBuffer->pCallbackInfo->pCopy) { + pDstBuffer->pCallbackInfo->pCopy(*(void**)pDstBuffer->GetData()); + } + } +} + +void CJX_Object::MoveBufferMapData(CXFA_Object* pDstModule) { + if (!pDstModule) + return; + + bool bNeedMove = true; + if (pDstModule->GetElementType() != GetXFAObject()->GetElementType()) + bNeedMove = false; + + if (bNeedMove) + ToNode(pDstModule)->JSNode()->SetCalcData(ReleaseCalcData()); + if (!pDstModule->IsNodeV()) + return; + + WideString wsValue = ToNode(pDstModule)->JSNode()->GetContent(false); + WideString wsFormatValue(wsValue); + CXFA_WidgetData* pWidgetData = ToNode(pDstModule)->GetContainerWidgetData(); + if (pWidgetData) + wsFormatValue = pWidgetData->GetFormatDataValue(wsValue); + + ToNode(pDstModule) + ->JSNode() + ->SetContent(wsValue, wsFormatValue, true, true, true); +} + +void CJX_Object::MoveBufferMapData(CXFA_Object* pSrcModule, + CXFA_Object* pDstModule) { + if (!pSrcModule || !pDstModule) + return; + + CXFA_Node* pSrcChild = + ToNode(pSrcModule)->GetNodeItem(XFA_NODEITEM_FirstChild); + CXFA_Node* pDstChild = + ToNode(pDstModule)->GetNodeItem(XFA_NODEITEM_FirstChild); + while (pSrcChild && pDstChild) { + MoveBufferMapData(pSrcChild, pDstChild); + + pSrcChild = pSrcChild->GetNodeItem(XFA_NODEITEM_NextSibling); + pDstChild = pDstChild->GetNodeItem(XFA_NODEITEM_NextSibling); + } + ToNode(pSrcModule)->JSNode()->MoveBufferMapData(pDstModule); +} + +void CJX_Object::OnChanging(XFA_Attribute eAttr, bool bNotify) { + if (!bNotify || !ToNode(GetXFAObject())->IsInitialized()) + return; + + CXFA_FFNotify* pNotify = GetDocument()->GetNotify(); + if (pNotify) + pNotify->OnValueChanging(ToNode(GetXFAObject()), eAttr); +} + +void CJX_Object::OnChanged(XFA_Attribute eAttr, + bool bNotify, + bool bScriptModify) { + if (bNotify && ToNode(GetXFAObject())->IsInitialized()) + ToNode(GetXFAObject())->SendAttributeChangeMessage(eAttr, bScriptModify); +} + +void CJX_Object::SetCalcData(std::unique_ptr<CXFA_CalcData> data) { + calc_data_ = std::move(data); +} + +std::unique_ptr<CXFA_CalcData> CJX_Object::ReleaseCalcData() { + return std::move(calc_data_); +} diff --git a/fxjs/cjx_object.h b/fxjs/cjx_object.h index d05956c1ec..c945c1e832 100644 --- a/fxjs/cjx_object.h +++ b/fxjs/cjx_object.h @@ -7,13 +7,34 @@ #ifndef FXJS_CJX_OBJECT_H_ #define FXJS_CJX_OBJECT_H_ +#include <map> +#include <memory> + #include "core/fxcrt/unowned_ptr.h" #include "core/fxcrt/widestring.h" +#include "core/fxcrt/xml/cfx_xmlelement.h" #include "xfa/fxfa/fxfa_basic.h" +typedef void (*CJX_MethodCall)(CJX_Object* obj, CFXJSE_Arguments* args); + +struct CJX_MethodSpec { + const char* pName; + CJX_MethodCall pMethodCall; +}; + +typedef void (*PD_CALLBACK_FREEDATA)(void* pData); +typedef void (*PD_CALLBACK_DUPLICATEDATA)(void*& pData); + +struct XFA_MAPDATABLOCKCALLBACKINFO { + PD_CALLBACK_FREEDATA pFree; + PD_CALLBACK_DUPLICATEDATA pCopy; +}; + class CFXJSE_Value; -class CXFA_Object; +class CXFA_CalcData; class CXFA_Document; +class CXFA_Object; +struct XFA_MAPMODULEDATA; class CJX_Object { public: @@ -24,22 +45,114 @@ class CJX_Object { CXFA_Document* GetDocument() const; + bool HasMethod(const WideString& func) const; + void RunMethod(const WideString& func, CFXJSE_Arguments* args); + + bool HasAttribute(XFA_Attribute eAttr); + bool SetAttribute(XFA_Attribute eAttr, + const WideStringView& wsValue, + bool bNotify); + bool SetAttribute(const WideStringView& wsAttr, + const WideStringView& wsValue, + bool bNotify); + void RemoveAttribute(const WideStringView& wsAttr); + WideString GetAttribute(const WideStringView& attr); + WideString GetAttribute(XFA_Attribute attr); + pdfium::Optional<WideString> TryAttribute(const WideStringView& wsAttr, + bool bUseDefault); + pdfium::Optional<WideString> TryAttribute(XFA_Attribute eAttr, + bool bUseDefault); + + void SetAttributeValue(const WideString& wsValue, + const WideString& wsXMLValue, + bool bNotify, + bool bScriptModify); + + pdfium::Optional<int32_t> TryInteger(XFA_Attribute eAttr, bool bUseDefault); + bool SetInteger(XFA_Attribute eAttr, int32_t iValue, bool bNotify); + int32_t GetInteger(XFA_Attribute eAttr); + + pdfium::Optional<WideString> TryCData(XFA_Attribute eAttr, bool bUseDefault); + bool SetCData(XFA_Attribute eAttr, + const WideString& wsValue, + bool bNotify, + bool bScriptModify); + WideString GetCData(XFA_Attribute eAttr); + + pdfium::Optional<XFA_AttributeEnum> TryEnum(XFA_Attribute eAttr, + bool bUseDefault); + bool SetEnum(XFA_Attribute eAttr, XFA_AttributeEnum eValue, bool bNotify); + XFA_AttributeEnum GetEnum(XFA_Attribute eAttr); + + pdfium::Optional<bool> TryBoolean(XFA_Attribute eAttr, bool bUseDefault); + bool SetBoolean(XFA_Attribute eAttr, bool bValue, bool bNotify); + bool GetBoolean(XFA_Attribute eAttr); + + pdfium::Optional<CXFA_Measurement> TryMeasure(XFA_Attribute eAttr, + bool bUseDefault) const; + bool SetMeasure(XFA_Attribute eAttr, CXFA_Measurement mValue, bool bNotify); + CXFA_Measurement GetMeasure(XFA_Attribute eAttr) const; + void Script_ObjectClass_ClassName(CFXJSE_Value* pValue, bool bSetting, XFA_Attribute eAttribute); + void MergeAllData(CXFA_Object* pDstModule); + + void SetCalcData(std::unique_ptr<CXFA_CalcData> data); + CXFA_CalcData* GetCalcData() const { return calc_data_.get(); } + std::unique_ptr<CXFA_CalcData> ReleaseCalcData(); + void ThrowInvalidPropertyException() const; void ThrowArgumentMismatchException() const; void ThrowIndexOutOfBoundsException() const; void ThrowParamCountMismatchException(const WideString& method) const; protected: - explicit CJX_Object(CXFA_Object* object); + explicit CJX_Object(CXFA_Object* obj); + + void DefineMethods(const CJX_MethodSpec method_specs[]); + void MoveBufferMapData(CXFA_Object* pSrcModule, CXFA_Object* pDstModule); + void SetMapModuleString(void* pKey, const WideStringView& wsValue); void ThrowException(const wchar_t* str, ...) const; private: + void OnChanged(XFA_Attribute eAttr, bool bNotify, bool bScriptModify); + void OnChanging(XFA_Attribute eAttr, bool bNotify); + bool SetUserData(void* pKey, + void* pData, + XFA_MAPDATABLOCKCALLBACKINFO* pCallbackInfo); + + // Returns a pointer to the XML node that needs to be updated with the new + // attribute value. |nullptr| if no update is needed. + CFX_XMLElement* SetValue(XFA_Attribute eAttr, + XFA_AttributeType eType, + void* pValue, + bool bNotify); + + XFA_MAPMODULEDATA* CreateMapModuleData(); + XFA_MAPMODULEDATA* GetMapModuleData() const; + void SetMapModuleValue(void* pKey, void* pValue); + bool GetMapModuleValue(void* pKey, void*& pValue); + bool GetMapModuleString(void* pKey, WideStringView& wsValue); + void SetMapModuleBuffer(void* pKey, + void* pValue, + int32_t iBytes, + XFA_MAPDATABLOCKCALLBACKINFO* pCallbackInfo); + bool GetMapModuleBuffer(void* pKey, + void*& pValue, + int32_t& iBytes, + bool bProtoAlso) const; + bool HasMapModuleKey(void* pKey); + void ClearMapModuleBuffer(); + void RemoveMapModuleKey(void* pKey); + void MoveBufferMapData(CXFA_Object* pDstModule); + UnownedPtr<CXFA_Object> object_; + std::unique_ptr<XFA_MAPMODULEDATA> map_module_data_; + std::unique_ptr<CXFA_CalcData> calc_data_; + std::map<ByteString, CJX_MethodCall> method_specs_; }; #endif // FXJS_CJX_OBJECT_H_ diff --git a/fxjs/cjx_signaturepseudomodel.cpp b/fxjs/cjx_signaturepseudomodel.cpp index 76cf989b7f..b50e5dc9ab 100644 --- a/fxjs/cjx_signaturepseudomodel.cpp +++ b/fxjs/cjx_signaturepseudomodel.cpp @@ -10,13 +10,22 @@ #include "fxjs/cfxjse_value.h" #include "xfa/fxfa/parser/cscript_signaturepseudomodel.h" +const CJX_MethodSpec CJX_SignaturePseudoModel::MethodSpecs[] = { + {"verify", verifySignature_static}, + {"sign", sign_static}, + {"enumerate", enumerate_static}, + {"clear", clear_static}, + {"", nullptr}}; + CJX_SignaturePseudoModel::CJX_SignaturePseudoModel( CScript_SignaturePseudoModel* model) - : CJX_Object(model) {} + : CJX_Object(model) { + DefineMethods(MethodSpecs); +} CJX_SignaturePseudoModel::~CJX_SignaturePseudoModel() {} -void CJX_SignaturePseudoModel::Verify(CFXJSE_Arguments* pArguments) { +void CJX_SignaturePseudoModel::verifySignature(CFXJSE_Arguments* pArguments) { int32_t iLength = pArguments->GetLength(); if (iLength < 1 || iLength > 4) { ThrowParamCountMismatchException(L"verify"); @@ -28,7 +37,7 @@ void CJX_SignaturePseudoModel::Verify(CFXJSE_Arguments* pArguments) { pValue->SetInteger(0); } -void CJX_SignaturePseudoModel::Sign(CFXJSE_Arguments* pArguments) { +void CJX_SignaturePseudoModel::sign(CFXJSE_Arguments* pArguments) { int32_t iLength = pArguments->GetLength(); if (iLength < 3 || iLength > 7) { ThrowParamCountMismatchException(L"sign"); @@ -40,7 +49,7 @@ void CJX_SignaturePseudoModel::Sign(CFXJSE_Arguments* pArguments) { pValue->SetBoolean(false); } -void CJX_SignaturePseudoModel::Enumerate(CFXJSE_Arguments* pArguments) { +void CJX_SignaturePseudoModel::enumerate(CFXJSE_Arguments* pArguments) { if (pArguments->GetLength() != 0) { ThrowParamCountMismatchException(L"enumerate"); return; @@ -48,7 +57,7 @@ void CJX_SignaturePseudoModel::Enumerate(CFXJSE_Arguments* pArguments) { return; } -void CJX_SignaturePseudoModel::Clear(CFXJSE_Arguments* pArguments) { +void CJX_SignaturePseudoModel::clear(CFXJSE_Arguments* pArguments) { int32_t iLength = pArguments->GetLength(); if (iLength < 1 || iLength > 2) { ThrowParamCountMismatchException(L"clear"); diff --git a/fxjs/cjx_signaturepseudomodel.h b/fxjs/cjx_signaturepseudomodel.h index e0e1f09dd2..d0508dd694 100644 --- a/fxjs/cjx_signaturepseudomodel.h +++ b/fxjs/cjx_signaturepseudomodel.h @@ -7,10 +7,9 @@ #ifndef FXJS_CJX_SIGNATUREPSEUDOMODEL_H_ #define FXJS_CJX_SIGNATUREPSEUDOMODEL_H_ +#include "fxjs/CJX_Define.h" #include "fxjs/cjx_object.h" -class CFXJSE_Arguments; -class CFXJSE_Value; class CScript_SignaturePseudoModel; class CJX_SignaturePseudoModel : public CJX_Object { @@ -18,10 +17,13 @@ class CJX_SignaturePseudoModel : public CJX_Object { explicit CJX_SignaturePseudoModel(CScript_SignaturePseudoModel* model); ~CJX_SignaturePseudoModel() override; - void Verify(CFXJSE_Arguments* pArguments); - void Sign(CFXJSE_Arguments* pArguments); - void Enumerate(CFXJSE_Arguments* pArguments); - void Clear(CFXJSE_Arguments* pArguments); + JS_METHOD(verifySignature /*verify*/, CJX_SignaturePseudoModel); + JS_METHOD(sign, CJX_SignaturePseudoModel); + JS_METHOD(enumerate, CJX_SignaturePseudoModel); + JS_METHOD(clear, CJX_SignaturePseudoModel); + + private: + static const CJX_MethodSpec MethodSpecs[]; }; #endif // FXJS_CJX_SIGNATUREPSEUDOMODEL_H_ diff --git a/fxjs/xfa/cjx_container.cpp b/fxjs/xfa/cjx_container.cpp new file mode 100644 index 0000000000..517fb86f98 --- /dev/null +++ b/fxjs/xfa/cjx_container.cpp @@ -0,0 +1,33 @@ +// Copyright 2017 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "fxjs/xfa/cjx_container.h" + +#include "fxjs/cfxjse_arguments.h" +#include "fxjs/cfxjse_engine.h" +#include "fxjs/cfxjse_value.h" +#include "xfa/fxfa/parser/cxfa_arraynodelist.h" +#include "xfa/fxfa/parser/cxfa_document.h" +#include "xfa/fxfa/parser/cxfa_field.h" + +const CJX_MethodSpec CJX_Container::MethodSpecs[] = { + {"getDelta", getDelta_static}, + {"getDeltas", getDeltas_static}, + {"", nullptr}}; + +CJX_Container::CJX_Container(CXFA_Node* node) : CJX_Node(node) { + DefineMethods(MethodSpecs); +} + +CJX_Container::~CJX_Container() {} + +void CJX_Container::getDelta(CFXJSE_Arguments* pArguments) {} + +void CJX_Container::getDeltas(CFXJSE_Arguments* pArguments) { + CXFA_ArrayNodeList* pFormNodes = new CXFA_ArrayNodeList(GetDocument()); + pArguments->GetReturnValue()->SetObject( + pFormNodes, GetDocument()->GetScriptContext()->GetJseNormalClass()); +} diff --git a/fxjs/xfa/cjx_container.h b/fxjs/xfa/cjx_container.h new file mode 100644 index 0000000000..41d11cfd69 --- /dev/null +++ b/fxjs/xfa/cjx_container.h @@ -0,0 +1,27 @@ +// Copyright 2017 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef FXJS_XFA_CJX_CONTAINER_H_ +#define FXJS_XFA_CJX_CONTAINER_H_ + +#include "fxjs/CJX_Define.h" +#include "fxjs/cjx_node.h" + +class CXFA_Node; + +class CJX_Container : public CJX_Node { + public: + explicit CJX_Container(CXFA_Node* node); + ~CJX_Container() override; + + JS_METHOD(getDelta, CJX_Container); + JS_METHOD(getDeltas, CJX_Container); + + private: + static const CJX_MethodSpec MethodSpecs[]; +}; + +#endif // FXJS_XFA_CJX_CONTAINER_H_ diff --git a/fxjs/xfa/cjx_content.cpp b/fxjs/xfa/cjx_content.cpp new file mode 100644 index 0000000000..87ddf63d86 --- /dev/null +++ b/fxjs/xfa/cjx_content.cpp @@ -0,0 +1,15 @@ +// Copyright 2017 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "fxjs/xfa/cjx_content.h" + +#include "fxjs/cfxjse_arguments.h" +#include "fxjs/cfxjse_value.h" +#include "xfa/fxfa/parser/cxfa_object.h" + +CJX_Content::CJX_Content(CXFA_Object* obj) : CJX_Object(obj) {} + +CJX_Content::~CJX_Content() {} diff --git a/fxjs/xfa/cjx_content.h b/fxjs/xfa/cjx_content.h new file mode 100644 index 0000000000..cd2e71a776 --- /dev/null +++ b/fxjs/xfa/cjx_content.h @@ -0,0 +1,21 @@ +// Copyright 2017 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef FXJS_XFA_CJX_CONTENT_H_ +#define FXJS_XFA_CJX_CONTENT_H_ + +#include "fxjs/CJX_Define.h" +#include "fxjs/cjx_object.h" + +class CXFA_Content; + +class CJX_Content : public CJX_Object { + public: + explicit CJX_Content(CXFA_Object* obj); + ~CJX_Content() override; +}; + +#endif // FXJS_XFA_CJX_CONTENT_H_ diff --git a/fxjs/xfa/cjx_delta.cpp b/fxjs/xfa/cjx_delta.cpp new file mode 100644 index 0000000000..b661ae9ffd --- /dev/null +++ b/fxjs/xfa/cjx_delta.cpp @@ -0,0 +1,25 @@ +// Copyright 2017 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "fxjs/xfa/cjx_delta.h" + +#include "fxjs/cfxjse_arguments.h" +#include "fxjs/cfxjse_value.h" +#include "xfa/fxfa/parser/cxfa_delta.h" + +const CJX_MethodSpec CJX_Delta::MethodSpecs[] = {{"restore", restore_static}, + {"", nullptr}}; + +CJX_Delta::CJX_Delta(CXFA_Delta* delta) : CJX_Object(delta) { + DefineMethods(MethodSpecs); +} + +CJX_Delta::~CJX_Delta() {} + +void CJX_Delta::restore(CFXJSE_Arguments* pArguments) { + if (pArguments->GetLength() != 0) + ThrowParamCountMismatchException(L"restore"); +} diff --git a/fxjs/xfa/cjx_delta.h b/fxjs/xfa/cjx_delta.h new file mode 100644 index 0000000000..d9a2c6290e --- /dev/null +++ b/fxjs/xfa/cjx_delta.h @@ -0,0 +1,26 @@ +// Copyright 2017 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef FXJS_XFA_CJX_DELTA_H_ +#define FXJS_XFA_CJX_DELTA_H_ + +#include "fxjs/CJX_Define.h" +#include "fxjs/cjx_object.h" + +class CXFA_Delta; + +class CJX_Delta : public CJX_Object { + public: + explicit CJX_Delta(CXFA_Delta* delta); + ~CJX_Delta() override; + + JS_METHOD(restore, CJX_Delta); + + private: + static const CJX_MethodSpec MethodSpecs[]; +}; + +#endif // FXJS_XFA_CJX_DELTA_H_ diff --git a/fxjs/xfa/cjx_desc.cpp b/fxjs/xfa/cjx_desc.cpp new file mode 100644 index 0000000000..4efd1dde0e --- /dev/null +++ b/fxjs/xfa/cjx_desc.cpp @@ -0,0 +1,29 @@ +// Copyright 2017 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "fxjs/xfa/cjx_desc.h" + +#include "fxjs/cfxjse_arguments.h" +#include "fxjs/cfxjse_value.h" +#include "xfa/fxfa/parser/cxfa_desc.h" + +const CJX_MethodSpec CJX_Desc::MethodSpecs[] = {{"metadata", metadata_static}, + {"", nullptr}}; + +CJX_Desc::CJX_Desc(CXFA_Desc* desc) : CJX_Node(desc) { + DefineMethods(MethodSpecs); +} + +CJX_Desc::~CJX_Desc() {} + +void CJX_Desc::metadata(CFXJSE_Arguments* pArguments) { + int32_t argc = pArguments->GetLength(); + if (argc != 0 && argc != 1) { + ThrowParamCountMismatchException(L"metadata"); + return; + } + pArguments->GetReturnValue()->SetString(""); +} diff --git a/fxjs/xfa/cjx_desc.h b/fxjs/xfa/cjx_desc.h new file mode 100644 index 0000000000..602633d482 --- /dev/null +++ b/fxjs/xfa/cjx_desc.h @@ -0,0 +1,26 @@ +// Copyright 2017 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef FXJS_XFA_CJX_DESC_H_ +#define FXJS_XFA_CJX_DESC_H_ + +#include "fxjs/CJX_Define.h" +#include "fxjs/cjx_node.h" + +class CXFA_Desc; + +class CJX_Desc : public CJX_Node { + public: + explicit CJX_Desc(CXFA_Desc* desc); + ~CJX_Desc() override; + + JS_METHOD(metadata, CJX_Desc); + + private: + static const CJX_MethodSpec MethodSpecs[]; +}; + +#endif // FXJS_XFA_CJX_DESC_H_ diff --git a/fxjs/xfa/cjx_exclgroup.cpp b/fxjs/xfa/cjx_exclgroup.cpp new file mode 100644 index 0000000000..c84ec94793 --- /dev/null +++ b/fxjs/xfa/cjx_exclgroup.cpp @@ -0,0 +1,118 @@ +// Copyright 2017 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "fxjs/xfa/cjx_exclgroup.h" + +#include "fxjs/cfxjse_arguments.h" +#include "fxjs/cfxjse_engine.h" +#include "fxjs/cfxjse_value.h" +#include "xfa/fxfa/cxfa_eventparam.h" +#include "xfa/fxfa/cxfa_ffnotify.h" +#include "xfa/fxfa/fxfa.h" +#include "xfa/fxfa/parser/cxfa_document.h" +#include "xfa/fxfa/parser/cxfa_exclgroup.h" +#include "xfa/fxfa/parser/cxfa_widgetdata.h" + +const CJX_MethodSpec CJX_ExclGroup::MethodSpecs[] = { + {"execCalculate", execCalculate_static}, + {"execEvent", execEvent_static}, + {"execInitialize", execInitialize_static}, + {"execValidate", execValidate_static}, + {"selectedMember", selectedMember_static}, + {"", nullptr}}; + +CJX_ExclGroup::CJX_ExclGroup(CXFA_ExclGroup* group) : CJX_Node(group) { + DefineMethods(MethodSpecs); +} + +CJX_ExclGroup::~CJX_ExclGroup() {} + +void CJX_ExclGroup::execEvent(CFXJSE_Arguments* pArguments) { + if (pArguments->GetLength() != 1) { + ThrowParamCountMismatchException(L"execEvent"); + return; + } + + ByteString eventString = pArguments->GetUTF8String(0); + execSingleEventByName( + WideString::FromUTF8(eventString.AsStringView()).AsStringView(), + XFA_Element::ExclGroup); +} + +void CJX_ExclGroup::execInitialize(CFXJSE_Arguments* pArguments) { + if (pArguments->GetLength() != 0) { + ThrowParamCountMismatchException(L"execInitialize"); + return; + } + + CXFA_FFNotify* pNotify = GetDocument()->GetNotify(); + if (!pNotify) + return; + + pNotify->ExecEventByDeepFirst(GetXFANode(), XFA_EVENT_Initialize); +} + +void CJX_ExclGroup::execCalculate(CFXJSE_Arguments* pArguments) { + if (pArguments->GetLength() != 0) { + ThrowParamCountMismatchException(L"execCalculate"); + return; + } + + CXFA_FFNotify* pNotify = GetDocument()->GetNotify(); + if (!pNotify) + return; + + pNotify->ExecEventByDeepFirst(GetXFANode(), XFA_EVENT_Calculate); +} + +void CJX_ExclGroup::execValidate(CFXJSE_Arguments* pArguments) { + if (pArguments->GetLength() != 0) { + ThrowParamCountMismatchException(L"execValidate"); + return; + } + + CXFA_FFNotify* pNotify = GetDocument()->GetNotify(); + if (!pNotify) { + pArguments->GetReturnValue()->SetBoolean(false); + return; + } + + int32_t iRet = + pNotify->ExecEventByDeepFirst(GetXFANode(), XFA_EVENT_Validate); + pArguments->GetReturnValue()->SetBoolean( + (iRet == XFA_EVENTERROR_Error) ? false : true); +} + +void CJX_ExclGroup::selectedMember(CFXJSE_Arguments* pArguments) { + int32_t argc = pArguments->GetLength(); + if (argc < 0 || argc > 1) { + ThrowParamCountMismatchException(L"selectedMember"); + return; + } + + CXFA_WidgetData* pWidgetData = GetXFANode()->GetWidgetData(); + if (!pWidgetData) { + pArguments->GetReturnValue()->SetNull(); + return; + } + + CXFA_Node* pReturnNode = nullptr; + if (argc == 0) { + pReturnNode = pWidgetData->GetSelectedMember(); + } else { + ByteString szName; + szName = pArguments->GetUTF8String(0); + pReturnNode = pWidgetData->SetSelectedMember( + WideString::FromUTF8(szName.AsStringView()).AsStringView(), true); + } + if (!pReturnNode) { + pArguments->GetReturnValue()->SetNull(); + return; + } + + pArguments->GetReturnValue()->Assign( + GetDocument()->GetScriptContext()->GetJSValueFromMap(pReturnNode)); +} diff --git a/fxjs/xfa/cjx_exclgroup.h b/fxjs/xfa/cjx_exclgroup.h new file mode 100644 index 0000000000..2ef280e17a --- /dev/null +++ b/fxjs/xfa/cjx_exclgroup.h @@ -0,0 +1,30 @@ +// Copyright 2017 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef FXJS_XFA_CJX_EXCLGROUP_H_ +#define FXJS_XFA_CJX_EXCLGROUP_H_ + +#include "fxjs/CJX_Define.h" +#include "fxjs/cjx_node.h" + +class CXFA_ExclGroup; + +class CJX_ExclGroup : public CJX_Node { + public: + explicit CJX_ExclGroup(CXFA_ExclGroup* group); + ~CJX_ExclGroup() override; + + JS_METHOD(execCalculate, CJX_ExclGroup); + JS_METHOD(execEvent, CJX_ExclGroup); + JS_METHOD(execInitialize, CJX_ExclGroup); + JS_METHOD(execValidate, CJX_ExclGroup); + JS_METHOD(selectedMember, CJX_ExclGroup); + + private: + static const CJX_MethodSpec MethodSpecs[]; +}; + +#endif // FXJS_XFA_CJX_EXCLGROUP_H_ diff --git a/fxjs/xfa/cjx_field.cpp b/fxjs/xfa/cjx_field.cpp new file mode 100644 index 0000000000..f0dbc78c78 --- /dev/null +++ b/fxjs/xfa/cjx_field.cpp @@ -0,0 +1,263 @@ +// Copyright 2017 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "fxjs/xfa/cjx_field.h" + +#include "fxjs/cfxjse_arguments.h" +#include "fxjs/cfxjse_value.h" +#include "xfa/fxfa/cxfa_eventparam.h" +#include "xfa/fxfa/cxfa_ffnotify.h" +#include "xfa/fxfa/fxfa.h" +#include "xfa/fxfa/parser/cxfa_document.h" +#include "xfa/fxfa/parser/cxfa_field.h" +#include "xfa/fxfa/parser/cxfa_widgetdata.h" + +const CJX_MethodSpec CJX_Field::MethodSpecs[] = { + {"addItem", addItem_static}, + {"boundItem", boundItem_static}, + {"clearItems", clearItems_static}, + {"deleteItem", deleteItem_static}, + {"execCalculate", execCalculate_static}, + {"execEvent", execEvent_static}, + {"execInitialize", execInitialize_static}, + {"execValidate", execValidate_static}, + {"getDisplayItem", getDisplayItem_static}, + {"getItemState", getItemState_static}, + {"getSaveItem", getSaveItem_static}, + {"setItemState", setItemState_static}, + {"", nullptr}}; + +CJX_Field::CJX_Field(CXFA_Field* field) : CJX_Container(field) { + DefineMethods(MethodSpecs); +} + +CJX_Field::~CJX_Field() {} + +void CJX_Field::clearItems(CFXJSE_Arguments* pArguments) { + CXFA_WidgetData* pWidgetData = GetXFANode()->GetWidgetData(); + if (!pWidgetData) + return; + + pWidgetData->DeleteItem(-1, true, false); +} + +void CJX_Field::execEvent(CFXJSE_Arguments* pArguments) { + if (pArguments->GetLength() != 1) { + ThrowParamCountMismatchException(L"execEvent"); + return; + } + + ByteString eventString = pArguments->GetUTF8String(0); + int32_t iRet = execSingleEventByName( + WideString::FromUTF8(eventString.AsStringView()).AsStringView(), + XFA_Element::Field); + if (eventString != "validate") + return; + + pArguments->GetReturnValue()->SetBoolean( + (iRet == XFA_EVENTERROR_Error) ? false : true); +} + +void CJX_Field::execInitialize(CFXJSE_Arguments* pArguments) { + if (pArguments->GetLength() != 0) { + ThrowParamCountMismatchException(L"execInitialize"); + return; + } + + CXFA_FFNotify* pNotify = GetDocument()->GetNotify(); + if (!pNotify) + return; + + pNotify->ExecEventByDeepFirst(GetXFANode(), XFA_EVENT_Initialize, false, + false); +} + +void CJX_Field::deleteItem(CFXJSE_Arguments* pArguments) { + int32_t iLength = pArguments->GetLength(); + if (iLength != 1) { + ThrowParamCountMismatchException(L"deleteItem"); + return; + } + + CXFA_WidgetData* pWidgetData = GetXFANode()->GetWidgetData(); + if (!pWidgetData) + return; + + int32_t iIndex = pArguments->GetInt32(0); + bool bValue = pWidgetData->DeleteItem(iIndex, true, true); + CFXJSE_Value* pValue = pArguments->GetReturnValue(); + if (pValue) + pValue->SetBoolean(bValue); +} + +void CJX_Field::getSaveItem(CFXJSE_Arguments* pArguments) { + int32_t iLength = pArguments->GetLength(); + if (iLength != 1) { + ThrowParamCountMismatchException(L"getSaveItem"); + return; + } + + int32_t iIndex = pArguments->GetInt32(0); + if (iIndex < 0) { + pArguments->GetReturnValue()->SetNull(); + return; + } + + CXFA_WidgetData* pWidgetData = GetXFANode()->GetWidgetData(); + if (!pWidgetData) { + pArguments->GetReturnValue()->SetNull(); + return; + } + + pdfium::Optional<WideString> value = + pWidgetData->GetChoiceListItem(iIndex, true); + if (!value) { + pArguments->GetReturnValue()->SetNull(); + return; + } + pArguments->GetReturnValue()->SetString(value->UTF8Encode().AsStringView()); +} + +void CJX_Field::boundItem(CFXJSE_Arguments* pArguments) { + int32_t iLength = pArguments->GetLength(); + if (iLength != 1) { + ThrowParamCountMismatchException(L"boundItem"); + return; + } + + CXFA_WidgetData* pWidgetData = GetXFANode()->GetWidgetData(); + if (!pWidgetData) + return; + + ByteString bsValue = pArguments->GetUTF8String(0); + WideString wsValue = WideString::FromUTF8(bsValue.AsStringView()); + WideString wsBoundValue = pWidgetData->GetItemValue(wsValue.AsStringView()); + CFXJSE_Value* pValue = pArguments->GetReturnValue(); + if (pValue) + pValue->SetString(wsBoundValue.UTF8Encode().AsStringView()); +} + +void CJX_Field::getItemState(CFXJSE_Arguments* pArguments) { + int32_t iLength = pArguments->GetLength(); + if (iLength != 1) { + ThrowParamCountMismatchException(L"getItemState"); + return; + } + + CXFA_WidgetData* pWidgetData = GetXFANode()->GetWidgetData(); + if (!pWidgetData) + return; + + CFXJSE_Value* pValue = pArguments->GetReturnValue(); + if (pValue) + pValue->SetBoolean(pWidgetData->GetItemState(pArguments->GetInt32(0))); +} + +void CJX_Field::execCalculate(CFXJSE_Arguments* pArguments) { + if (pArguments->GetLength() != 0) { + ThrowParamCountMismatchException(L"execCalculate"); + return; + } + + CXFA_FFNotify* pNotify = GetDocument()->GetNotify(); + if (!pNotify) + return; + + pNotify->ExecEventByDeepFirst(GetXFANode(), XFA_EVENT_Calculate, false, + false); +} + +void CJX_Field::getDisplayItem(CFXJSE_Arguments* pArguments) { + int32_t iLength = pArguments->GetLength(); + if (iLength != 1) { + ThrowParamCountMismatchException(L"getDisplayItem"); + return; + } + + int32_t iIndex = pArguments->GetInt32(0); + if (iIndex < 0) { + pArguments->GetReturnValue()->SetNull(); + return; + } + + CXFA_WidgetData* pWidgetData = GetXFANode()->GetWidgetData(); + if (!pWidgetData) { + pArguments->GetReturnValue()->SetNull(); + return; + } + + pdfium::Optional<WideString> value = + pWidgetData->GetChoiceListItem(iIndex, false); + if (!value) { + pArguments->GetReturnValue()->SetNull(); + return; + } + pArguments->GetReturnValue()->SetString(value->UTF8Encode().AsStringView()); +} + +void CJX_Field::setItemState(CFXJSE_Arguments* pArguments) { + if (pArguments->GetLength() != 2) { + ThrowParamCountMismatchException(L"setItemState"); + return; + } + + CXFA_WidgetData* pWidgetData = GetXFANode()->GetWidgetData(); + if (!pWidgetData) + return; + + int32_t iIndex = pArguments->GetInt32(0); + if (pArguments->GetInt32(1) != 0) { + pWidgetData->SetItemState(iIndex, true, true, true, true); + return; + } + + if (pWidgetData->GetItemState(iIndex)) + pWidgetData->SetItemState(iIndex, false, true, true, true); +} + +void CJX_Field::addItem(CFXJSE_Arguments* pArguments) { + int32_t iLength = pArguments->GetLength(); + if (iLength < 1 || iLength > 2) { + ThrowParamCountMismatchException(L"addItem"); + return; + } + + CXFA_WidgetData* pWidgetData = GetXFANode()->GetWidgetData(); + if (!pWidgetData) + return; + + WideString wsLabel; + if (iLength >= 1) { + ByteString bsLabel = pArguments->GetUTF8String(0); + wsLabel = WideString::FromUTF8(bsLabel.AsStringView()); + } + + WideString wsValue; + if (iLength >= 2) { + ByteString bsValue = pArguments->GetUTF8String(1); + wsValue = WideString::FromUTF8(bsValue.AsStringView()); + } + + pWidgetData->InsertItem(wsLabel, wsValue, true); +} + +void CJX_Field::execValidate(CFXJSE_Arguments* pArguments) { + if (pArguments->GetLength() != 0) { + ThrowParamCountMismatchException(L"execValidate"); + return; + } + + CXFA_FFNotify* pNotify = GetDocument()->GetNotify(); + if (!pNotify) { + pArguments->GetReturnValue()->SetBoolean(false); + return; + } + + int32_t iRet = pNotify->ExecEventByDeepFirst(GetXFANode(), XFA_EVENT_Validate, + false, false); + pArguments->GetReturnValue()->SetBoolean( + (iRet == XFA_EVENTERROR_Error) ? false : true); +} diff --git a/fxjs/xfa/cjx_field.h b/fxjs/xfa/cjx_field.h new file mode 100644 index 0000000000..524a6afdaa --- /dev/null +++ b/fxjs/xfa/cjx_field.h @@ -0,0 +1,37 @@ +// Copyright 2017 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef FXJS_XFA_CJX_FIELD_H_ +#define FXJS_XFA_CJX_FIELD_H_ + +#include "fxjs/CJX_Define.h" +#include "fxjs/xfa/cjx_container.h" + +class CXFA_Field; + +class CJX_Field : public CJX_Container { + public: + explicit CJX_Field(CXFA_Field* field); + ~CJX_Field() override; + + JS_METHOD(addItem, CJX_Field); + JS_METHOD(boundItem, CJX_Field); + JS_METHOD(clearItems, CJX_Field); + JS_METHOD(deleteItem, CJX_Field); + JS_METHOD(execCalculate, CJX_Field); + JS_METHOD(execEvent, CJX_Field); + JS_METHOD(execInitialize, CJX_Field); + JS_METHOD(execValidate, CJX_Field); + JS_METHOD(getDisplayItem, CJX_Field); + JS_METHOD(getItemState, CJX_Field); + JS_METHOD(getSaveItem, CJX_Field); + JS_METHOD(setItemState, CJX_Field); + + private: + static const CJX_MethodSpec MethodSpecs[]; +}; + +#endif // FXJS_XFA_CJX_FIELD_H_ diff --git a/fxjs/xfa/cjx_form.cpp b/fxjs/xfa/cjx_form.cpp new file mode 100644 index 0000000000..106910c6c1 --- /dev/null +++ b/fxjs/xfa/cjx_form.cpp @@ -0,0 +1,128 @@ +// Copyright 2017 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "fxjs/xfa/cjx_form.h" + +#include <vector> + +#include "fxjs/cfxjse_arguments.h" +#include "fxjs/cfxjse_engine.h" +#include "fxjs/cfxjse_value.h" +#include "xfa/fxfa/cxfa_eventparam.h" +#include "xfa/fxfa/cxfa_ffnotify.h" +#include "xfa/fxfa/parser/cxfa_arraynodelist.h" +#include "xfa/fxfa/parser/cxfa_document.h" +#include "xfa/fxfa/parser/cxfa_form.h" + +const CJX_MethodSpec CJX_Form::MethodSpecs[] = { + {"execCalculate", execCalculate_static}, + {"execInitialize", execInitialize_static}, + {"execValidate", execValidate_static}, + {"formNodes", formNodes_static}, + {"recalculate", recalculate_static}, + {"remerge", remerge_static}, + {"", nullptr}}; + +CJX_Form::CJX_Form(CXFA_Form* form) : CJX_Model(form) { + DefineMethods(MethodSpecs); +} + +CJX_Form::~CJX_Form() {} + +void CJX_Form::formNodes(CFXJSE_Arguments* pArguments) { + if (pArguments->GetLength() != 1) { + ThrowParamCountMismatchException(L"formNodes"); + return; + } + + CXFA_Node* pDataNode = static_cast<CXFA_Node*>(pArguments->GetObject(0)); + if (!pDataNode) { + ThrowArgumentMismatchException(); + return; + } + + std::vector<CXFA_Node*> formItems; + CXFA_ArrayNodeList* pFormNodes = new CXFA_ArrayNodeList(GetDocument()); + pFormNodes->SetArrayNodeList(formItems); + pArguments->GetReturnValue()->SetObject( + pFormNodes, GetDocument()->GetScriptContext()->GetJseNormalClass()); +} + +void CJX_Form::remerge(CFXJSE_Arguments* pArguments) { + if (pArguments->GetLength() != 0) { + ThrowParamCountMismatchException(L"remerge"); + return; + } + + GetDocument()->DoDataRemerge(true); +} + +void CJX_Form::execInitialize(CFXJSE_Arguments* pArguments) { + if (pArguments->GetLength() != 0) { + ThrowParamCountMismatchException(L"execInitialize"); + return; + } + + CXFA_FFNotify* pNotify = GetDocument()->GetNotify(); + if (!pNotify) + return; + + pNotify->ExecEventByDeepFirst(GetXFANode(), XFA_EVENT_Initialize); +} + +void CJX_Form::recalculate(CFXJSE_Arguments* pArguments) { + CXFA_EventParam* pEventParam = + GetDocument()->GetScriptContext()->GetEventParam(); + if (pEventParam->m_eType == XFA_EVENT_Calculate || + pEventParam->m_eType == XFA_EVENT_InitCalculate) { + return; + } + if (pArguments->GetLength() != 1) { + ThrowParamCountMismatchException(L"recalculate"); + return; + } + + CXFA_FFNotify* pNotify = GetDocument()->GetNotify(); + if (!pNotify) + return; + if (pArguments->GetInt32(0) != 0) + return; + + pNotify->ExecEventByDeepFirst(GetXFANode(), XFA_EVENT_Calculate); + pNotify->ExecEventByDeepFirst(GetXFANode(), XFA_EVENT_Validate); + pNotify->ExecEventByDeepFirst(GetXFANode(), XFA_EVENT_Ready, true); +} + +void CJX_Form::execCalculate(CFXJSE_Arguments* pArguments) { + if (pArguments->GetLength() != 0) { + ThrowParamCountMismatchException(L"execCalculate"); + return; + } + + CXFA_FFNotify* pNotify = GetDocument()->GetNotify(); + if (!pNotify) + return; + + pNotify->ExecEventByDeepFirst(GetXFANode(), XFA_EVENT_Calculate); +} + +void CJX_Form::execValidate(CFXJSE_Arguments* pArguments) { + if (pArguments->GetLength() != 0) { + ThrowParamCountMismatchException(L"execValidate"); + return; + } + + CXFA_FFNotify* pNotify = GetDocument()->GetNotify(); + if (!pNotify) { + pArguments->GetReturnValue()->SetBoolean(false); + return; + } + + int32_t iRet = + pNotify->ExecEventByDeepFirst(GetXFANode(), XFA_EVENT_Validate); + pArguments->GetReturnValue()->SetBoolean( + (iRet == XFA_EVENTERROR_Error) ? false : true); +} diff --git a/fxjs/xfa/cjx_form.h b/fxjs/xfa/cjx_form.h new file mode 100644 index 0000000000..e4d64daca0 --- /dev/null +++ b/fxjs/xfa/cjx_form.h @@ -0,0 +1,31 @@ +// Copyright 2017 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef FXJS_XFA_CJX_FORM_H_ +#define FXJS_XFA_CJX_FORM_H_ + +#include "fxjs/CJX_Define.h" +#include "fxjs/xfa/cjx_model.h" + +class CXFA_Form; + +class CJX_Form : public CJX_Model { + public: + explicit CJX_Form(CXFA_Form* form); + ~CJX_Form() override; + + JS_METHOD(execCalculate, CJX_Form); + JS_METHOD(execInitialize, CJX_Form); + JS_METHOD(execValidate, CJX_Form); + JS_METHOD(formNodes, CJX_Form); + JS_METHOD(recalculate, CJX_Form); + JS_METHOD(remerge, CJX_Form); + + private: + static const CJX_MethodSpec MethodSpecs[]; +}; + +#endif // FXJS_XFA_CJX_FORM_H_ diff --git a/fxjs/xfa/cjx_instancemanager.cpp b/fxjs/xfa/cjx_instancemanager.cpp new file mode 100644 index 0000000000..da8422ea35 --- /dev/null +++ b/fxjs/xfa/cjx_instancemanager.cpp @@ -0,0 +1,180 @@ +// Copyright 2017 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "fxjs/xfa/cjx_instancemanager.h" + +#include "fxjs/cfxjse_arguments.h" +#include "fxjs/cfxjse_engine.h" +#include "fxjs/cfxjse_value.h" +#include "xfa/fxfa/cxfa_ffnotify.h" +#include "xfa/fxfa/parser/cxfa_document.h" +#include "xfa/fxfa/parser/cxfa_instancemanager.h" +#include "xfa/fxfa/parser/cxfa_layoutprocessor.h" +#include "xfa/fxfa/parser/cxfa_occurdata.h" + +const CJX_MethodSpec CJX_InstanceManager::MethodSpecs[] = { + {"addInstance", addInstance_static}, + {"insertInstance", insertInstance_static}, + {"moveInstance", moveInstance_static}, + {"removeInstance", removeInstance_static}, + {"setInstances", setInstances_static}, + {"", nullptr}}; + +CJX_InstanceManager::CJX_InstanceManager(CXFA_InstanceManager* mgr) + : CJX_Node(mgr) { + DefineMethods(MethodSpecs); +} + +CJX_InstanceManager::~CJX_InstanceManager() {} + +void CJX_InstanceManager::moveInstance(CFXJSE_Arguments* pArguments) { + if (pArguments->GetLength() != 2) { + pArguments->GetReturnValue()->SetUndefined(); + return; + } + + int32_t iFrom = pArguments->GetInt32(0); + int32_t iTo = pArguments->GetInt32(1); + InstanceManager_MoveInstance(iTo, iFrom); + CXFA_FFNotify* pNotify = GetDocument()->GetNotify(); + if (!pNotify) + return; + + CXFA_Node* pToInstance = GetXFANode()->GetItem(iTo); + if (pToInstance && pToInstance->GetElementType() == XFA_Element::Subform) + pNotify->RunSubformIndexChange(pToInstance); + + CXFA_Node* pFromInstance = GetXFANode()->GetItem(iFrom); + if (pFromInstance && + pFromInstance->GetElementType() == XFA_Element::Subform) { + pNotify->RunSubformIndexChange(pFromInstance); + } +} + +void CJX_InstanceManager::removeInstance(CFXJSE_Arguments* pArguments) { + if (pArguments->GetLength() != 1) { + pArguments->GetReturnValue()->SetUndefined(); + return; + } + + int32_t iIndex = pArguments->GetInt32(0); + int32_t iCount = GetXFANode()->GetCount(); + if (iIndex < 0 || iIndex >= iCount) { + ThrowIndexOutOfBoundsException(); + return; + } + + int32_t iMin = CXFA_OccurData(GetXFANode()->GetOccurNode()).GetMin(); + if (iCount - 1 < iMin) { + ThrowTooManyOccurancesException(L"min"); + return; + } + + CXFA_Node* pRemoveInstance = GetXFANode()->GetItem(iIndex); + GetXFANode()->RemoveItem(pRemoveInstance, true); + CXFA_FFNotify* pNotify = GetDocument()->GetNotify(); + if (pNotify) { + for (int32_t i = iIndex; i < iCount - 1; i++) { + CXFA_Node* pSubformInstance = GetXFANode()->GetItem(i); + if (pSubformInstance && + pSubformInstance->GetElementType() == XFA_Element::Subform) { + pNotify->RunSubformIndexChange(pSubformInstance); + } + } + } + CXFA_LayoutProcessor* pLayoutPro = GetDocument()->GetLayoutProcessor(); + if (!pLayoutPro) + return; + + pLayoutPro->AddChangedContainer( + ToNode(GetDocument()->GetXFAObject(XFA_HASHCODE_Form))); +} + +void CJX_InstanceManager::setInstances(CFXJSE_Arguments* pArguments) { + if (pArguments->GetLength() != 1) { + pArguments->GetReturnValue()->SetUndefined(); + return; + } + + int32_t iDesired = pArguments->GetInt32(0); + InstanceManager_SetInstances(iDesired); +} + +void CJX_InstanceManager::addInstance(CFXJSE_Arguments* pArguments) { + int32_t argc = pArguments->GetLength(); + if (argc != 0 && argc != 1) { + ThrowParamCountMismatchException(L"addInstance"); + return; + } + + bool fFlags = true; + if (argc == 1) + fFlags = pArguments->GetInt32(0) == 0 ? false : true; + + int32_t iCount = GetXFANode()->GetCount(); + int32_t iMax = CXFA_OccurData(GetXFANode()->GetOccurNode()).GetMax(); + if (iMax >= 0 && iCount >= iMax) { + ThrowTooManyOccurancesException(L"max"); + return; + } + + CXFA_Node* pNewInstance = GetXFANode()->CreateInstance(fFlags); + GetXFANode()->InsertItem(pNewInstance, iCount, iCount, false); + pArguments->GetReturnValue()->Assign( + GetDocument()->GetScriptContext()->GetJSValueFromMap(pNewInstance)); + CXFA_FFNotify* pNotify = GetDocument()->GetNotify(); + if (!pNotify) + return; + + pNotify->RunNodeInitialize(pNewInstance); + CXFA_LayoutProcessor* pLayoutPro = GetDocument()->GetLayoutProcessor(); + if (!pLayoutPro) + return; + + pLayoutPro->AddChangedContainer( + ToNode(GetDocument()->GetXFAObject(XFA_HASHCODE_Form))); +} + +void CJX_InstanceManager::insertInstance(CFXJSE_Arguments* pArguments) { + int32_t argc = pArguments->GetLength(); + if (argc != 1 && argc != 2) { + ThrowParamCountMismatchException(L"insertInstance"); + return; + } + + int32_t iIndex = pArguments->GetInt32(0); + bool bBind = false; + if (argc == 2) + bBind = pArguments->GetInt32(1) == 0 ? false : true; + + int32_t iCount = GetXFANode()->GetCount(); + if (iIndex < 0 || iIndex > iCount) { + ThrowIndexOutOfBoundsException(); + return; + } + + int32_t iMax = CXFA_OccurData(GetXFANode()->GetOccurNode()).GetMax(); + if (iMax >= 0 && iCount >= iMax) { + ThrowTooManyOccurancesException(L"max"); + return; + } + + CXFA_Node* pNewInstance = GetXFANode()->CreateInstance(bBind); + GetXFANode()->InsertItem(pNewInstance, iIndex, iCount, true); + pArguments->GetReturnValue()->Assign( + GetDocument()->GetScriptContext()->GetJSValueFromMap(pNewInstance)); + CXFA_FFNotify* pNotify = GetDocument()->GetNotify(); + if (!pNotify) + return; + + pNotify->RunNodeInitialize(pNewInstance); + CXFA_LayoutProcessor* pLayoutPro = GetDocument()->GetLayoutProcessor(); + if (!pLayoutPro) + return; + + pLayoutPro->AddChangedContainer( + ToNode(GetDocument()->GetXFAObject(XFA_HASHCODE_Form))); +} diff --git a/fxjs/xfa/cjx_instancemanager.h b/fxjs/xfa/cjx_instancemanager.h new file mode 100644 index 0000000000..a312366b3b --- /dev/null +++ b/fxjs/xfa/cjx_instancemanager.h @@ -0,0 +1,30 @@ +// Copyright 2017 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef FXJS_XFA_CJX_INSTANCEMANAGER_H_ +#define FXJS_XFA_CJX_INSTANCEMANAGER_H_ + +#include "fxjs/CJX_Define.h" +#include "fxjs/cjx_node.h" + +class CXFA_InstanceManager; + +class CJX_InstanceManager : public CJX_Node { + public: + explicit CJX_InstanceManager(CXFA_InstanceManager* mgr); + ~CJX_InstanceManager() override; + + JS_METHOD(addInstance, CJX_InstanceManager); + JS_METHOD(insertInstance, CJX_InstanceManager); + JS_METHOD(moveInstance, CJX_InstanceManager); + JS_METHOD(removeInstance, CJX_InstanceManager); + JS_METHOD(setInstances, CJX_InstanceManager); + + private: + static const CJX_MethodSpec MethodSpecs[]; +}; + +#endif // FXJS_XFA_CJX_INSTANCEMANAGER_H_ diff --git a/fxjs/cjx_nodelist.cpp b/fxjs/xfa/cjx_list.cpp index badd71c7d5..34cf9da7a5 100644 --- a/fxjs/cjx_nodelist.cpp +++ b/fxjs/xfa/cjx_list.cpp @@ -4,24 +4,32 @@ // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com -#include "fxjs/cjx_nodelist.h" +#include "fxjs/xfa/cjx_list.h" #include "fxjs/cfxjse_arguments.h" #include "fxjs/cfxjse_engine.h" #include "fxjs/cfxjse_value.h" #include "xfa/fxfa/parser/cxfa_document.h" +#include "xfa/fxfa/parser/cxfa_list.h" #include "xfa/fxfa/parser/cxfa_node.h" -#include "xfa/fxfa/parser/cxfa_nodelist.h" -CJX_NodeList::CJX_NodeList(CXFA_NodeList* list) : CJX_Object(list) {} +const CJX_MethodSpec CJX_List::MethodSpecs[] = {{"append", append_static}, + {"insert", insert_static}, + {"item", item_static}, + {"remove", remove_static}, + {"", nullptr}}; -CJX_NodeList::~CJX_NodeList() {} +CJX_List::CJX_List(CXFA_List* list) : CJX_Object(list) { + DefineMethods(MethodSpecs); +} + +CJX_List::~CJX_List() {} -CXFA_NodeList* CJX_NodeList::GetXFANodeList() { - return static_cast<CXFA_NodeList*>(GetXFAObject()); +CXFA_List* CJX_List::GetXFAList() { + return static_cast<CXFA_List*>(GetXFAObject()); } -void CJX_NodeList::Script_ListClass_Append(CFXJSE_Arguments* pArguments) { +void CJX_List::append(CFXJSE_Arguments* pArguments) { int32_t argc = pArguments->GetLength(); if (argc != 1) { ThrowParamCountMismatchException(L"append"); @@ -33,10 +41,10 @@ void CJX_NodeList::Script_ListClass_Append(CFXJSE_Arguments* pArguments) { ThrowArgumentMismatchException(); return; } - GetXFANodeList()->Append(pNode); + GetXFAList()->Append(pNode); } -void CJX_NodeList::Script_ListClass_Insert(CFXJSE_Arguments* pArguments) { +void CJX_List::insert(CFXJSE_Arguments* pArguments) { int32_t argc = pArguments->GetLength(); if (argc != 2) { ThrowParamCountMismatchException(L"insert"); @@ -49,10 +57,10 @@ void CJX_NodeList::Script_ListClass_Insert(CFXJSE_Arguments* pArguments) { ThrowArgumentMismatchException(); return; } - GetXFANodeList()->Insert(pNewNode, pBeforeNode); + GetXFAList()->Insert(pNewNode, pBeforeNode); } -void CJX_NodeList::Script_ListClass_Remove(CFXJSE_Arguments* pArguments) { +void CJX_List::remove(CFXJSE_Arguments* pArguments) { int32_t argc = pArguments->GetLength(); if (argc != 1) { ThrowParamCountMismatchException(L"remove"); @@ -64,10 +72,10 @@ void CJX_NodeList::Script_ListClass_Remove(CFXJSE_Arguments* pArguments) { ThrowArgumentMismatchException(); return; } - GetXFANodeList()->Remove(pNode); + GetXFAList()->Remove(pNode); } -void CJX_NodeList::Script_ListClass_Item(CFXJSE_Arguments* pArguments) { +void CJX_List::item(CFXJSE_Arguments* pArguments) { int32_t argc = pArguments->GetLength(); if (argc != 1) { ThrowParamCountMismatchException(L"item"); @@ -75,39 +83,21 @@ void CJX_NodeList::Script_ListClass_Item(CFXJSE_Arguments* pArguments) { } int32_t iIndex = pArguments->GetInt32(0); - if (iIndex < 0 || iIndex >= GetXFANodeList()->GetLength()) { + if (iIndex < 0 || iIndex >= GetXFAList()->GetLength()) { ThrowIndexOutOfBoundsException(); return; } pArguments->GetReturnValue()->Assign( GetDocument()->GetScriptContext()->GetJSValueFromMap( - GetXFANodeList()->Item(iIndex))); -} - -void CJX_NodeList::Script_TreelistClass_NamedItem( - CFXJSE_Arguments* pArguments) { - int32_t argc = pArguments->GetLength(); - if (argc != 1) { - ThrowParamCountMismatchException(L"namedItem"); - return; - } - - ByteString szName = pArguments->GetUTF8String(0); - CXFA_Node* pNode = GetXFANodeList()->NamedItem( - WideString::FromUTF8(szName.AsStringView()).AsStringView()); - if (!pNode) - return; - - pArguments->GetReturnValue()->Assign( - GetDocument()->GetScriptContext()->GetJSValueFromMap(pNode)); + GetXFAList()->Item(iIndex))); } -void CJX_NodeList::Script_ListClass_Length(CFXJSE_Value* pValue, - bool bSetting, - XFA_Attribute eAttribute) { +void CJX_List::length(CFXJSE_Value* pValue, + bool bSetting, + XFA_Attribute eAttribute) { if (bSetting) { ThrowInvalidPropertyException(); return; } - pValue->SetInteger(GetXFANodeList()->GetLength()); + pValue->SetInteger(GetXFAList()->GetLength()); } diff --git a/fxjs/xfa/cjx_list.h b/fxjs/xfa/cjx_list.h new file mode 100644 index 0000000000..b4a002551a --- /dev/null +++ b/fxjs/xfa/cjx_list.h @@ -0,0 +1,33 @@ +// Copyright 2017 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef FXJS_XFA_CJX_LIST_H_ +#define FXJS_XFA_CJX_LIST_H_ + +#include "fxjs/CJX_Define.h" +#include "fxjs/cjx_object.h" + +class CXFA_List; + +class CJX_List : public CJX_Object { + public: + explicit CJX_List(CXFA_List* list); + ~CJX_List() override; + + JS_METHOD(append, CJX_List); + JS_METHOD(insert, CJX_List); + JS_METHOD(item, CJX_List); + JS_METHOD(remove, CJX_List); + + void length(CFXJSE_Value* pValue, bool bSetting, XFA_Attribute eAttribute); + + private: + CXFA_List* GetXFAList(); + + static const CJX_MethodSpec MethodSpecs[]; +}; + +#endif // FXJS_XFA_CJX_LIST_H_ diff --git a/fxjs/xfa/cjx_manifest.cpp b/fxjs/xfa/cjx_manifest.cpp new file mode 100644 index 0000000000..066ba29e15 --- /dev/null +++ b/fxjs/xfa/cjx_manifest.cpp @@ -0,0 +1,35 @@ +// Copyright 2017 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "fxjs/xfa/cjx_manifest.h" + +#include "fxjs/cfxjse_arguments.h" +#include "fxjs/cfxjse_value.h" +#include "xfa/fxfa/parser/cxfa_manifest.h" + +const CJX_MethodSpec CJX_Manifest::MethodSpecs[] = { + {"evaluate", evaluate_static}, + {"", nullptr}}; + +CJX_Manifest::CJX_Manifest(CXFA_Manifest* manifest) : CJX_Node(manifest) { + DefineMethods(MethodSpecs); +} + +CJX_Manifest::~CJX_Manifest() {} + +void CJX_Manifest::evaluate(CFXJSE_Arguments* pArguments) { + if (pArguments->GetLength() != 0) { + ThrowParamCountMismatchException(L"evaluate"); + return; + } + + CXFA_WidgetData* pWidgetData = GetXFANode()->GetWidgetData(); + if (!pWidgetData) { + pArguments->GetReturnValue()->SetBoolean(false); + return; + } + pArguments->GetReturnValue()->SetBoolean(true); +} diff --git a/fxjs/xfa/cjx_manifest.h b/fxjs/xfa/cjx_manifest.h new file mode 100644 index 0000000000..167ef46b6e --- /dev/null +++ b/fxjs/xfa/cjx_manifest.h @@ -0,0 +1,26 @@ +// Copyright 2017 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef FXJS_XFA_CJX_MANIFEST_H_ +#define FXJS_XFA_CJX_MANIFEST_H_ + +#include "fxjs/CJX_Define.h" +#include "fxjs/cjx_node.h" + +class CXFA_Manifest; + +class CJX_Manifest : public CJX_Node { + public: + explicit CJX_Manifest(CXFA_Manifest* manifest); + ~CJX_Manifest() override; + + JS_METHOD(evaluate, CJX_Manifest); + + private: + static const CJX_MethodSpec MethodSpecs[]; +}; + +#endif // FXJS_XFA_CJX_MANIFEST_H_ diff --git a/fxjs/xfa/cjx_model.cpp b/fxjs/xfa/cjx_model.cpp new file mode 100644 index 0000000000..cd738b0018 --- /dev/null +++ b/fxjs/xfa/cjx_model.cpp @@ -0,0 +1,94 @@ +// Copyright 2017 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "fxjs/xfa/cjx_model.h" + +#include "fxjs/cfxjse_arguments.h" +#include "fxjs/cfxjse_engine.h" +#include "fxjs/cfxjse_value.h" +#include "xfa/fxfa/parser/cxfa_delta.h" +#include "xfa/fxfa/parser/cxfa_document.h" + +const CJX_MethodSpec CJX_Model::MethodSpecs[] = { + {"clearErrorList", clearErrorList_static}, + {"createNode", createNode_static}, + {"isCompatibleNS", isCompatibleNS_static}, + {"", nullptr}}; + +CJX_Model::CJX_Model(CXFA_Node* node) : CJX_Node(node) { + DefineMethods(MethodSpecs); +} + +CJX_Model::~CJX_Model() {} + +void CJX_Model::clearErrorList(CFXJSE_Arguments* pArguments) {} + +void CJX_Model::createNode(CFXJSE_Arguments* pArguments) { + int32_t argc = pArguments->GetLength(); + if (argc <= 0 || argc >= 4) { + ThrowParamCountMismatchException(L"createNode"); + return; + } + + WideString strName; + WideString strNameSpace; + if (argc > 1) { + ByteString bsName = pArguments->GetUTF8String(1); + strName = WideString::FromUTF8(bsName.AsStringView()); + if (argc == 3) { + ByteString bsNameSpace = pArguments->GetUTF8String(2); + strNameSpace = WideString::FromUTF8(bsNameSpace.AsStringView()); + } + } + + ByteString bsTagName = pArguments->GetUTF8String(0); + WideString strTagName = WideString::FromUTF8(bsTagName.AsStringView()); + XFA_Element eType = CXFA_Node::NameToElement(strTagName); + CXFA_Node* pNewNode = GetXFANode()->CreateSamePacketNode(eType); + if (!pNewNode) { + pArguments->GetReturnValue()->SetNull(); + return; + } + + if (strName.IsEmpty()) { + pArguments->GetReturnValue()->Assign( + GetDocument()->GetScriptContext()->GetJSValueFromMap(pNewNode)); + return; + } + + if (!pNewNode->HasAttribute(XFA_Attribute::Name)) { + ThrowMissingPropertyException(strTagName, L"name"); + return; + } + + pNewNode->JSNode()->SetAttribute(XFA_Attribute::Name, strName.AsStringView(), + true); + if (pNewNode->GetPacketType() == XFA_PacketType::Datasets) + pNewNode->CreateXMLMappingNode(); + + pArguments->GetReturnValue()->Assign( + GetDocument()->GetScriptContext()->GetJSValueFromMap(pNewNode)); +} + +void CJX_Model::isCompatibleNS(CFXJSE_Arguments* pArguments) { + int32_t iLength = pArguments->GetLength(); + if (iLength < 1) { + ThrowParamCountMismatchException(L"isCompatibleNS"); + return; + } + + WideString wsNameSpace; + if (iLength >= 1) { + ByteString bsNameSpace = pArguments->GetUTF8String(0); + wsNameSpace = WideString::FromUTF8(bsNameSpace.AsStringView()); + } + + CFXJSE_Value* pValue = pArguments->GetReturnValue(); + if (!pValue) + return; + + pValue->SetBoolean(TryNamespace().value_or(WideString()) == wsNameSpace); +} diff --git a/fxjs/xfa/cjx_model.h b/fxjs/xfa/cjx_model.h new file mode 100644 index 0000000000..f4e6ac9406 --- /dev/null +++ b/fxjs/xfa/cjx_model.h @@ -0,0 +1,28 @@ +// Copyright 2017 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef FXJS_XFA_CJX_MODEL_H_ +#define FXJS_XFA_CJX_MODEL_H_ + +#include "fxjs/CJX_Define.h" +#include "fxjs/cjx_node.h" + +class CXFA_Node; + +class CJX_Model : public CJX_Node { + public: + explicit CJX_Model(CXFA_Node* obj); + ~CJX_Model() override; + + JS_METHOD(clearErrorList, CJX_Model); + JS_METHOD(createNode, CJX_Model); + JS_METHOD(isCompatibleNS, CJX_Model); + + private: + static const CJX_MethodSpec MethodSpecs[]; +}; + +#endif // FXJS_XFA_CJX_MODEL_H_ diff --git a/fxjs/xfa/cjx_packet.cpp b/fxjs/xfa/cjx_packet.cpp new file mode 100644 index 0000000000..b1424d27e7 --- /dev/null +++ b/fxjs/xfa/cjx_packet.cpp @@ -0,0 +1,75 @@ +// Copyright 2017 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "fxjs/xfa/cjx_packet.h" + +#include "fxjs/cfxjse_arguments.h" +#include "fxjs/cfxjse_value.h" +#include "xfa/fxfa/parser/cxfa_packet.h" + +const CJX_MethodSpec CJX_Packet::MethodSpecs[] = { + {"getAttribute", getAttribute_static}, + {"removeAttribute", removeAttribute_static}, + {"setAttribute", setAttribute_static}, + {"", nullptr}}; + +CJX_Packet::CJX_Packet(CXFA_Packet* packet) : CJX_Node(packet) { + DefineMethods(MethodSpecs); +} + +CJX_Packet::~CJX_Packet() {} + +void CJX_Packet::getAttribute(CFXJSE_Arguments* pArguments) { + if (pArguments->GetLength() != 1) { + ThrowParamCountMismatchException(L"getAttribute"); + return; + } + + WideString wsAttributeValue; + CFX_XMLNode* pXMLNode = GetXFANode()->GetXMLMappingNode(); + if (pXMLNode && pXMLNode->GetType() == FX_XMLNODE_Element) { + ByteString bsAttributeName = pArguments->GetUTF8String(0); + wsAttributeValue = static_cast<CFX_XMLElement*>(pXMLNode)->GetString( + WideString::FromUTF8(bsAttributeName.AsStringView()).c_str()); + } + + pArguments->GetReturnValue()->SetString( + wsAttributeValue.UTF8Encode().AsStringView()); +} + +void CJX_Packet::setAttribute(CFXJSE_Arguments* pArguments) { + if (pArguments->GetLength() != 2) { + ThrowParamCountMismatchException(L"setAttribute"); + return; + } + + CFX_XMLNode* pXMLNode = GetXFANode()->GetXMLMappingNode(); + if (pXMLNode && pXMLNode->GetType() == FX_XMLNODE_Element) { + ByteString bsValue = pArguments->GetUTF8String(0); + ByteString bsName = pArguments->GetUTF8String(1); + static_cast<CFX_XMLElement*>(pXMLNode)->SetString( + WideString::FromUTF8(bsName.AsStringView()), + WideString::FromUTF8(bsValue.AsStringView())); + } + pArguments->GetReturnValue()->SetNull(); +} + +void CJX_Packet::removeAttribute(CFXJSE_Arguments* pArguments) { + if (pArguments->GetLength() != 1) { + ThrowParamCountMismatchException(L"removeAttribute"); + return; + } + + CFX_XMLNode* pXMLNode = GetXFANode()->GetXMLMappingNode(); + if (pXMLNode && pXMLNode->GetType() == FX_XMLNODE_Element) { + ByteString bsName = pArguments->GetUTF8String(0); + WideString wsName = WideString::FromUTF8(bsName.AsStringView()); + CFX_XMLElement* pXMLElement = static_cast<CFX_XMLElement*>(pXMLNode); + if (pXMLElement->HasAttribute(wsName.c_str())) + pXMLElement->RemoveAttribute(wsName.c_str()); + } + pArguments->GetReturnValue()->SetNull(); +} diff --git a/fxjs/xfa/cjx_packet.h b/fxjs/xfa/cjx_packet.h new file mode 100644 index 0000000000..80520e2751 --- /dev/null +++ b/fxjs/xfa/cjx_packet.h @@ -0,0 +1,28 @@ +// Copyright 2017 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef FXJS_XFA_CJX_PACKET_H_ +#define FXJS_XFA_CJX_PACKET_H_ + +#include "fxjs/CJX_Define.h" +#include "fxjs/cjx_node.h" + +class CXFA_Packet; + +class CJX_Packet : public CJX_Node { + public: + explicit CJX_Packet(CXFA_Packet* packet); + ~CJX_Packet() override; + + JS_METHOD(getAttribute, CJX_Packet); + JS_METHOD(removeAttribute, CJX_Packet); + JS_METHOD(setAttribute, CJX_Packet); + + private: + static const CJX_MethodSpec MethodSpecs[]; +}; + +#endif // FXJS_XFA_CJX_PACKET_H_ diff --git a/fxjs/xfa/cjx_source.cpp b/fxjs/xfa/cjx_source.cpp new file mode 100644 index 0000000000..3197231811 --- /dev/null +++ b/fxjs/xfa/cjx_source.cpp @@ -0,0 +1,122 @@ +// Copyright 2017 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "fxjs/xfa/cjx_source.h" + +#include "fxjs/cfxjse_arguments.h" +#include "fxjs/cfxjse_value.h" +#include "xfa/fxfa/parser/cxfa_source.h" + +const CJX_MethodSpec CJX_Source::MethodSpecs[] = { + {"addNew", addNew_static}, + {"cancel", cancel_static}, + {"cancelBatch", cancelBatch_static}, + {"close", close_static}, + {"delete", deleteItem_static}, + {"first", first_static}, + {"hasDataChanged", hasDataChanged_static}, + {"isBOF", isBOF_static}, + {"isEOF", isEOF_static}, + {"last", last_static}, + {"next", next_static}, + {"open", open_static}, + {"previous", previous_static}, + {"requery", requery_static}, + {"resync", resync_static}, + {"update", update_static}, + {"updateBatch", updateBatch_static}, + {"", nullptr}}; + +CJX_Source::CJX_Source(CXFA_Source* src) : CJX_Node(src) { + DefineMethods(MethodSpecs); +} + +CJX_Source::~CJX_Source() {} + +void CJX_Source::next(CFXJSE_Arguments* pArguments) { + if (pArguments->GetLength() != 0) + ThrowParamCountMismatchException(L"next"); +} + +void CJX_Source::cancelBatch(CFXJSE_Arguments* pArguments) { + if (pArguments->GetLength() != 0) + ThrowParamCountMismatchException(L"cancelBatch"); +} + +void CJX_Source::first(CFXJSE_Arguments* pArguments) { + if (pArguments->GetLength() != 0) + ThrowParamCountMismatchException(L"first"); +} + +void CJX_Source::updateBatch(CFXJSE_Arguments* pArguments) { + if (pArguments->GetLength() != 0) + ThrowParamCountMismatchException(L"updateBatch"); +} + +void CJX_Source::previous(CFXJSE_Arguments* pArguments) { + if (pArguments->GetLength() != 0) + ThrowParamCountMismatchException(L"previous"); +} + +void CJX_Source::isBOF(CFXJSE_Arguments* pArguments) { + if (pArguments->GetLength() != 0) + ThrowParamCountMismatchException(L"isBOF"); +} + +void CJX_Source::isEOF(CFXJSE_Arguments* pArguments) { + if (pArguments->GetLength() != 0) + ThrowParamCountMismatchException(L"isEOF"); +} + +void CJX_Source::cancel(CFXJSE_Arguments* pArguments) { + if (pArguments->GetLength() != 0) + ThrowParamCountMismatchException(L"cancel"); +} + +void CJX_Source::update(CFXJSE_Arguments* pArguments) { + if (pArguments->GetLength() != 0) + ThrowParamCountMismatchException(L"update"); +} + +void CJX_Source::open(CFXJSE_Arguments* pArguments) { + if (pArguments->GetLength() != 0) + ThrowParamCountMismatchException(L"open"); +} + +void CJX_Source::deleteItem(CFXJSE_Arguments* pArguments) { + if (pArguments->GetLength() != 0) + ThrowParamCountMismatchException(L"delete"); +} + +void CJX_Source::addNew(CFXJSE_Arguments* pArguments) { + if (pArguments->GetLength() != 0) + ThrowParamCountMismatchException(L"addNew"); +} + +void CJX_Source::requery(CFXJSE_Arguments* pArguments) { + if (pArguments->GetLength() != 0) + ThrowParamCountMismatchException(L"requery"); +} + +void CJX_Source::resync(CFXJSE_Arguments* pArguments) { + if (pArguments->GetLength() != 0) + ThrowParamCountMismatchException(L"resync"); +} + +void CJX_Source::close(CFXJSE_Arguments* pArguments) { + if (pArguments->GetLength() != 0) + ThrowParamCountMismatchException(L"close"); +} + +void CJX_Source::last(CFXJSE_Arguments* pArguments) { + if (pArguments->GetLength() != 0) + ThrowParamCountMismatchException(L"last"); +} + +void CJX_Source::hasDataChanged(CFXJSE_Arguments* pArguments) { + if (pArguments->GetLength() != 0) + ThrowParamCountMismatchException(L"hasDataChanged"); +} diff --git a/fxjs/xfa/cjx_source.h b/fxjs/xfa/cjx_source.h new file mode 100644 index 0000000000..1502e0e807 --- /dev/null +++ b/fxjs/xfa/cjx_source.h @@ -0,0 +1,42 @@ +// Copyright 2017 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef FXJS_XFA_CJX_SOURCE_H_ +#define FXJS_XFA_CJX_SOURCE_H_ + +#include "fxjs/CJX_Define.h" +#include "fxjs/cjx_node.h" + +class CXFA_Source; + +class CJX_Source : public CJX_Node { + public: + explicit CJX_Source(CXFA_Source* src); + ~CJX_Source() override; + + JS_METHOD(addNew, CJX_Source); + JS_METHOD(cancel, CJX_Source); + JS_METHOD(cancelBatch, CJX_Source); + JS_METHOD(close, CJX_Source); + JS_METHOD(deleteItem /*delete*/, CJX_Source); + JS_METHOD(first, CJX_Source); + JS_METHOD(hasDataChanged, CJX_Source); + JS_METHOD(isBOF, CJX_Source); + JS_METHOD(isEOF, CJX_Source); + JS_METHOD(last, CJX_Source); + JS_METHOD(next, CJX_Source); + JS_METHOD(open, CJX_Source); + JS_METHOD(previous, CJX_Source); + JS_METHOD(requery, CJX_Source); + JS_METHOD(resync, CJX_Source); + JS_METHOD(update, CJX_Source); + JS_METHOD(updateBatch, CJX_Source); + + private: + static const CJX_MethodSpec MethodSpecs[]; +}; + +#endif // FXJS_XFA_CJX_SOURCE_H_ diff --git a/fxjs/xfa/cjx_subform.cpp b/fxjs/xfa/cjx_subform.cpp new file mode 100644 index 0000000000..32de182e7b --- /dev/null +++ b/fxjs/xfa/cjx_subform.cpp @@ -0,0 +1,84 @@ +// Copyright 2017 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "fxjs/xfa/cjx_subform.h" + +#include "fxjs/cfxjse_arguments.h" +#include "fxjs/cfxjse_value.h" +#include "xfa/fxfa/cxfa_eventparam.h" +#include "xfa/fxfa/cxfa_ffnotify.h" +#include "xfa/fxfa/fxfa.h" +#include "xfa/fxfa/parser/cxfa_delta.h" +#include "xfa/fxfa/parser/cxfa_document.h" + +const CJX_MethodSpec CJX_Subform::MethodSpecs[] = { + {"execCalculate", execCalculate_static}, + {"execEvent", execEvent_static}, + {"execInitialize", execInitialize_static}, + {"execValidate", execValidate_static}, + {"", nullptr}}; + +CJX_Subform::CJX_Subform(CXFA_Node* node) : CJX_Container(node) { + DefineMethods(MethodSpecs); +} + +CJX_Subform::~CJX_Subform() {} + +void CJX_Subform::execEvent(CFXJSE_Arguments* pArguments) { + if (pArguments->GetLength() != 1) { + ThrowParamCountMismatchException(L"execEvent"); + return; + } + + ByteString eventString = pArguments->GetUTF8String(0); + execSingleEventByName( + WideString::FromUTF8(eventString.AsStringView()).AsStringView(), + XFA_Element::Subform); +} + +void CJX_Subform::execInitialize(CFXJSE_Arguments* pArguments) { + if (pArguments->GetLength() != 0) { + ThrowParamCountMismatchException(L"execInitialize"); + return; + } + + CXFA_FFNotify* pNotify = GetDocument()->GetNotify(); + if (!pNotify) + return; + + pNotify->ExecEventByDeepFirst(GetXFANode(), XFA_EVENT_Initialize); +} + +void CJX_Subform::execCalculate(CFXJSE_Arguments* pArguments) { + if (pArguments->GetLength() != 0) { + ThrowParamCountMismatchException(L"execCalculate"); + return; + } + + CXFA_FFNotify* pNotify = GetDocument()->GetNotify(); + if (!pNotify) + return; + + pNotify->ExecEventByDeepFirst(GetXFANode(), XFA_EVENT_Calculate); +} + +void CJX_Subform::execValidate(CFXJSE_Arguments* pArguments) { + if (pArguments->GetLength() != 0) { + ThrowParamCountMismatchException(L"execValidate"); + return; + } + + CXFA_FFNotify* pNotify = GetDocument()->GetNotify(); + if (!pNotify) { + pArguments->GetReturnValue()->SetBoolean(false); + return; + } + + int32_t iRet = + pNotify->ExecEventByDeepFirst(GetXFANode(), XFA_EVENT_Validate); + pArguments->GetReturnValue()->SetBoolean( + (iRet == XFA_EVENTERROR_Error) ? false : true); +} diff --git a/fxjs/xfa/cjx_subform.h b/fxjs/xfa/cjx_subform.h new file mode 100644 index 0000000000..a0227f08dd --- /dev/null +++ b/fxjs/xfa/cjx_subform.h @@ -0,0 +1,29 @@ +// Copyright 2017 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef FXJS_XFA_CJX_SUBFORM_H_ +#define FXJS_XFA_CJX_SUBFORM_H_ + +#include "fxjs/CJX_Define.h" +#include "fxjs/xfa/cjx_container.h" + +class CXFA_Delta; + +class CJX_Subform : public CJX_Container { + public: + explicit CJX_Subform(CXFA_Node* container); + ~CJX_Subform() override; + + JS_METHOD(execCalculate, CJX_Subform); + JS_METHOD(execEvent, CJX_Subform); + JS_METHOD(execInitialize, CJX_Subform); + JS_METHOD(execValidate, CJX_Subform); + + private: + static const CJX_MethodSpec MethodSpecs[]; +}; + +#endif // FXJS_XFA_CJX_SUBFORM_H_ diff --git a/fxjs/xfa/cjx_template.cpp b/fxjs/xfa/cjx_template.cpp new file mode 100644 index 0000000000..99db4ea69a --- /dev/null +++ b/fxjs/xfa/cjx_template.cpp @@ -0,0 +1,87 @@ +// Copyright 2017 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "fxjs/xfa/cjx_template.h" + +#include "fxjs/cfxjse_arguments.h" +#include "fxjs/cfxjse_value.h" +#include "xfa/fxfa/parser/cxfa_document.h" +#include "xfa/fxfa/parser/cxfa_template.h" + +const CJX_MethodSpec CJX_Template::MethodSpecs[] = { + {"execCalculate", execCalculate_static}, + {"execInitialize", execInitialize_static}, + {"execValidate", execValidate_static}, + {"formNodes", formNodes_static}, + {"recalculate", recalculate_static}, + {"remerge", remerge_static}, + {"", nullptr}}; + +CJX_Template::CJX_Template(CXFA_Template* tmpl) : CJX_Model(tmpl) { + DefineMethods(MethodSpecs); +} + +CJX_Template::~CJX_Template() {} + +void CJX_Template::formNodes(CFXJSE_Arguments* pArguments) { + if (pArguments->GetLength() != 1) { + ThrowParamCountMismatchException(L"formNodes"); + return; + } + pArguments->GetReturnValue()->SetBoolean(true); +} + +void CJX_Template::remerge(CFXJSE_Arguments* pArguments) { + if (pArguments->GetLength() != 0) { + ThrowParamCountMismatchException(L"remerge"); + return; + } + GetDocument()->DoDataRemerge(true); +} + +void CJX_Template::execInitialize(CFXJSE_Arguments* pArguments) { + if (pArguments->GetLength() != 0) { + ThrowParamCountMismatchException(L"execInitialize"); + return; + } + + CXFA_WidgetData* pWidgetData = GetXFANode()->GetWidgetData(); + if (!pWidgetData) { + pArguments->GetReturnValue()->SetBoolean(false); + return; + } + pArguments->GetReturnValue()->SetBoolean(true); +} + +void CJX_Template::recalculate(CFXJSE_Arguments* pArguments) { + if (pArguments->GetLength() != 1) { + ThrowParamCountMismatchException(L"recalculate"); + return; + } + pArguments->GetReturnValue()->SetBoolean(true); +} + +void CJX_Template::execCalculate(CFXJSE_Arguments* pArguments) { + if (pArguments->GetLength() != 0) { + ThrowParamCountMismatchException(L"execCalculate"); + return; + } + + CXFA_WidgetData* pWidgetData = GetXFANode()->GetWidgetData(); + if (!pWidgetData) { + pArguments->GetReturnValue()->SetBoolean(false); + return; + } + pArguments->GetReturnValue()->SetBoolean(true); +} + +void CJX_Template::execValidate(CFXJSE_Arguments* pArguments) { + if (pArguments->GetLength() != 0) { + ThrowParamCountMismatchException(L"execValidate"); + return; + } + pArguments->GetReturnValue()->SetBoolean(!!GetXFANode()->GetWidgetData()); +} diff --git a/fxjs/xfa/cjx_template.h b/fxjs/xfa/cjx_template.h new file mode 100644 index 0000000000..2c82788153 --- /dev/null +++ b/fxjs/xfa/cjx_template.h @@ -0,0 +1,34 @@ +// Copyright 2017 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef FXJS_XFA_CJX_TEMPLATE_H_ +#define FXJS_XFA_CJX_TEMPLATE_H_ + +#include "fxjs/CJX_Define.h" +#include "fxjs/xfa/cjx_model.h" + +class CXFA_Template; + +class CJX_Template : public CJX_Model { + public: + explicit CJX_Template(CXFA_Template* tmpl); + ~CJX_Template() override; + + /* The docs list a |createNode| method on Template but that method already + * exists on Model, also the |createNode| docs say it exists on Model not + * on Template so I'm leaving |createNode| out of the template methods. */ + JS_METHOD(execCalculate, CJX_Template); + JS_METHOD(execInitialize, CJX_Template); + JS_METHOD(execValidate, CJX_Template); + JS_METHOD(formNodes, CJX_Template); + JS_METHOD(recalculate, CJX_Template); + JS_METHOD(remerge, CJX_Template); + + private: + static const CJX_MethodSpec MethodSpecs[]; +}; + +#endif // FXJS_XFA_CJX_TEMPLATE_H_ diff --git a/fxjs/xfa/cjx_textnode.cpp b/fxjs/xfa/cjx_textnode.cpp new file mode 100644 index 0000000000..4ebf3ce472 --- /dev/null +++ b/fxjs/xfa/cjx_textnode.cpp @@ -0,0 +1,15 @@ +// Copyright 2017 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "fxjs/xfa/cjx_textnode.h" + +#include "fxjs/cfxjse_arguments.h" +#include "fxjs/cfxjse_value.h" +#include "xfa/fxfa/parser/cxfa_node.h" + +CJX_TextNode::CJX_TextNode(CXFA_Node* node) : CJX_Node(node) {} + +CJX_TextNode::~CJX_TextNode() {} diff --git a/fxjs/xfa/cjx_textnode.h b/fxjs/xfa/cjx_textnode.h new file mode 100644 index 0000000000..1fa84d8d52 --- /dev/null +++ b/fxjs/xfa/cjx_textnode.h @@ -0,0 +1,21 @@ +// Copyright 2017 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef FXJS_XFA_CJX_TEXTNODE_H_ +#define FXJS_XFA_CJX_TEXTNODE_H_ + +#include "fxjs/CJX_Define.h" +#include "fxjs/cjx_node.h" + +class CXFA_Node; + +class CJX_TextNode : public CJX_Node { + public: + explicit CJX_TextNode(CXFA_Node* node); + ~CJX_TextNode() override; +}; + +#endif // FXJS_XFA_CJX_TEXTNODE_H_ diff --git a/fxjs/xfa/cjx_tree.cpp b/fxjs/xfa/cjx_tree.cpp new file mode 100644 index 0000000000..69cbfa0652 --- /dev/null +++ b/fxjs/xfa/cjx_tree.cpp @@ -0,0 +1,230 @@ +// Copyright 2017 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "fxjs/xfa/cjx_tree.h" + +#include "fxjs/cfxjse_arguments.h" +#include "fxjs/cfxjse_engine.h" +#include "fxjs/cfxjse_value.h" +#include "third_party/base/ptr_util.h" +#include "xfa/fxfa/parser/cxfa_arraynodelist.h" +#include "xfa/fxfa/parser/cxfa_attachnodelist.h" +#include "xfa/fxfa/parser/cxfa_document.h" +#include "xfa/fxfa/parser/cxfa_node.h" +#include "xfa/fxfa/parser/cxfa_object.h" +#include "xfa/fxfa/parser/xfa_resolvenode_rs.h" + +const CJX_MethodSpec CJX_Tree::MethodSpecs[] = { + {"resolveNode", resolveNode_static}, + {"resolveNodes", resolveNodes_static}, + {"", nullptr}}; + +CJX_Tree::CJX_Tree(CXFA_Object* obj) : CJX_Object(obj) { + DefineMethods(MethodSpecs); +} + +CJX_Tree::~CJX_Tree() {} + +void CJX_Tree::resolveNode(CFXJSE_Arguments* pArguments) { + int32_t iLength = pArguments->GetLength(); + if (iLength != 1) { + ThrowParamCountMismatchException(L"resolveNode"); + return; + } + WideString wsExpression = + WideString::FromUTF8(pArguments->GetUTF8String(0).AsStringView()); + CFXJSE_Engine* pScriptContext = GetDocument()->GetScriptContext(); + if (!pScriptContext) + return; + CXFA_Object* refNode = GetXFAObject(); + if (refNode->GetElementType() == XFA_Element::Xfa) + refNode = pScriptContext->GetThisObject(); + uint32_t dwFlag = XFA_RESOLVENODE_Children | XFA_RESOLVENODE_Attributes | + XFA_RESOLVENODE_Properties | XFA_RESOLVENODE_Parent | + XFA_RESOLVENODE_Siblings; + XFA_RESOLVENODE_RS resolveNodeRS; + if (!pScriptContext->ResolveObjects(ToNode(refNode), + wsExpression.AsStringView(), + &resolveNodeRS, dwFlag, nullptr)) { + pArguments->GetReturnValue()->SetNull(); + return; + } + if (resolveNodeRS.dwFlags == XFA_ResolveNode_RSType_Nodes) { + CXFA_Object* pObject = resolveNodeRS.objects.front(); + pArguments->GetReturnValue()->Assign( + pScriptContext->GetJSValueFromMap(pObject)); + } else { + const XFA_SCRIPTATTRIBUTEINFO* lpAttributeInfo = + resolveNodeRS.pScriptAttribute; + if (lpAttributeInfo && + lpAttributeInfo->eValueType == XFA_ScriptType::Object) { + auto pValue = + pdfium::MakeUnique<CFXJSE_Value>(pScriptContext->GetRuntime()); + CJX_Object* jsObject = resolveNodeRS.objects.front()->JSObject(); + (jsObject->*(lpAttributeInfo->callback))(pValue.get(), false, + lpAttributeInfo->attribute); + pArguments->GetReturnValue()->Assign(pValue.get()); + } else { + pArguments->GetReturnValue()->SetNull(); + } + } +} + +void CJX_Tree::resolveNodes(CFXJSE_Arguments* pArguments) { + int32_t iLength = pArguments->GetLength(); + if (iLength != 1) { + ThrowParamCountMismatchException(L"resolveNodes"); + return; + } + + WideString wsExpression = + WideString::FromUTF8(pArguments->GetUTF8String(0).AsStringView()); + CFXJSE_Value* pValue = pArguments->GetReturnValue(); + if (!pValue) + return; + + CXFA_Object* refNode = GetXFAObject(); + if (refNode->GetElementType() == XFA_Element::Xfa) + refNode = GetDocument()->GetScriptContext()->GetThisObject(); + + ResolveNodeList(pValue, wsExpression, + XFA_RESOLVENODE_Children | XFA_RESOLVENODE_Attributes | + XFA_RESOLVENODE_Properties | XFA_RESOLVENODE_Parent | + XFA_RESOLVENODE_Siblings, + ToNode(refNode)); +} + +void CJX_Tree::all(CFXJSE_Value* pValue, + bool bSetting, + XFA_Attribute eAttribute) { + if (bSetting) { + ThrowInvalidPropertyException(); + return; + } + + uint32_t dwFlag = XFA_RESOLVENODE_Siblings | XFA_RESOLVENODE_ALL; + WideString wsExpression = GetAttribute(XFA_Attribute::Name) + L"[*]"; + ResolveNodeList(pValue, wsExpression, dwFlag, nullptr); +} + +void CJX_Tree::classAll(CFXJSE_Value* pValue, + bool bSetting, + XFA_Attribute eAttribute) { + if (bSetting) { + ThrowInvalidPropertyException(); + return; + } + + WideString wsExpression = L"#" + GetXFAObject()->GetClassName() + L"[*]"; + ResolveNodeList(pValue, wsExpression, + XFA_RESOLVENODE_Siblings | XFA_RESOLVENODE_ALL, nullptr); +} + +void CJX_Tree::nodes(CFXJSE_Value* pValue, + bool bSetting, + XFA_Attribute eAttribute) { + CFXJSE_Engine* pScriptContext = GetDocument()->GetScriptContext(); + if (!pScriptContext) + return; + + if (bSetting) { + WideString wsMessage = L"Unable to set "; + FXJSE_ThrowMessage(wsMessage.UTF8Encode().AsStringView()); + return; + } + + CXFA_AttachNodeList* pNodeList = + new CXFA_AttachNodeList(GetDocument(), ToNode(GetXFAObject())); + pValue->SetObject(pNodeList, pScriptContext->GetJseNormalClass()); +} + +void CJX_Tree::parent(CFXJSE_Value* pValue, + bool bSetting, + XFA_Attribute eAttribute) { + if (bSetting) { + ThrowInvalidPropertyException(); + return; + } + + CXFA_Node* pParent = ToNode(GetXFAObject())->GetNodeItem(XFA_NODEITEM_Parent); + if (!pParent) { + pValue->SetNull(); + return; + } + + pValue->Assign(GetDocument()->GetScriptContext()->GetJSValueFromMap(pParent)); +} + +void CJX_Tree::index(CFXJSE_Value* pValue, + bool bSetting, + XFA_Attribute eAttribute) { + if (bSetting) { + ThrowInvalidPropertyException(); + return; + } + pValue->SetInteger(ToNode(GetXFAObject())->GetNodeSameNameIndex()); +} + +void CJX_Tree::classIndex(CFXJSE_Value* pValue, + bool bSetting, + XFA_Attribute eAttribute) { + if (bSetting) { + ThrowInvalidPropertyException(); + return; + } + pValue->SetInteger(ToNode(GetXFAObject())->GetNodeSameClassIndex()); +} + +void CJX_Tree::somExpression(CFXJSE_Value* pValue, + bool bSetting, + XFA_Attribute eAttribute) { + if (bSetting) { + ThrowInvalidPropertyException(); + return; + } + + WideString wsSOMExpression; + GetXFAObject()->GetSOMExpression(wsSOMExpression); + pValue->SetString(wsSOMExpression.UTF8Encode().AsStringView()); +} + +void CJX_Tree::ResolveNodeList(CFXJSE_Value* pValue, + WideString wsExpression, + uint32_t dwFlag, + CXFA_Node* refNode) { + CFXJSE_Engine* pScriptContext = GetDocument()->GetScriptContext(); + if (!pScriptContext) + return; + if (!refNode) + refNode = ToNode(GetXFAObject()); + + XFA_RESOLVENODE_RS resolveNodeRS; + pScriptContext->ResolveObjects(refNode, wsExpression.AsStringView(), + &resolveNodeRS, dwFlag, nullptr); + CXFA_ArrayNodeList* pNodeList = new CXFA_ArrayNodeList(GetDocument()); + if (resolveNodeRS.dwFlags == XFA_ResolveNode_RSType_Nodes) { + for (CXFA_Object* pObject : resolveNodeRS.objects) { + if (pObject->IsNode()) + pNodeList->Append(pObject->AsNode()); + } + } else { + if (resolveNodeRS.pScriptAttribute && + resolveNodeRS.pScriptAttribute->eValueType == XFA_ScriptType::Object) { + for (CXFA_Object* pObject : resolveNodeRS.objects) { + auto pValue = + pdfium::MakeUnique<CFXJSE_Value>(pScriptContext->GetRuntime()); + CJX_Object* jsObject = pObject->JSObject(); + (jsObject->*(resolveNodeRS.pScriptAttribute->callback))( + pValue.get(), false, resolveNodeRS.pScriptAttribute->attribute); + + CXFA_Object* obj = CFXJSE_Engine::ToObject(pValue.get(), nullptr); + if (obj->IsNode()) + pNodeList->Append(obj->AsNode()); + } + } + } + pValue->SetObject(pNodeList, pScriptContext->GetJseNormalClass()); +} diff --git a/fxjs/xfa/cjx_tree.h b/fxjs/xfa/cjx_tree.h new file mode 100644 index 0000000000..30081122a5 --- /dev/null +++ b/fxjs/xfa/cjx_tree.h @@ -0,0 +1,45 @@ +// Copyright 2017 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef FXJS_XFA_CJX_TREE_H_ +#define FXJS_XFA_CJX_TREE_H_ + +#include "fxjs/CJX_Define.h" +#include "fxjs/cjx_object.h" + +class CXFA_Object; +class CXFA_Node; + +class CJX_Tree : public CJX_Object { + public: + explicit CJX_Tree(CXFA_Object* obj); + ~CJX_Tree() override; + + JS_METHOD(resolveNode, CJX_Tree); + JS_METHOD(resolveNodes, CJX_Tree); + + void all(CFXJSE_Value* pValue, bool bSetting, XFA_Attribute eAttribute); + void nodes(CFXJSE_Value* pValue, bool bSetting, XFA_Attribute eAttribute); + void classAll(CFXJSE_Value* pValue, bool bSetting, XFA_Attribute eAttribute); + void parent(CFXJSE_Value* pValue, bool bSetting, XFA_Attribute eAttribute); + void index(CFXJSE_Value* pValue, bool bSetting, XFA_Attribute eAttribute); + void classIndex(CFXJSE_Value* pValue, + bool bSetting, + XFA_Attribute eAttribute); + void somExpression(CFXJSE_Value* pValue, + bool bSetting, + XFA_Attribute eAttribute); + + private: + void ResolveNodeList(CFXJSE_Value* pValue, + WideString wsExpression, + uint32_t dwFlag, + CXFA_Node* refNode); + + static const CJX_MethodSpec MethodSpecs[]; +}; + +#endif // FXJS_XFA_CJX_TREE_H_ diff --git a/fxjs/xfa/cjx_treelist.cpp b/fxjs/xfa/cjx_treelist.cpp new file mode 100644 index 0000000000..f82f30db29 --- /dev/null +++ b/fxjs/xfa/cjx_treelist.cpp @@ -0,0 +1,45 @@ +// Copyright 2017 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "fxjs/xfa/cjx_treelist.h" + +#include "fxjs/cfxjse_arguments.h" +#include "fxjs/cfxjse_engine.h" +#include "fxjs/cfxjse_value.h" +#include "xfa/fxfa/parser/cxfa_document.h" +#include "xfa/fxfa/parser/cxfa_node.h" +#include "xfa/fxfa/parser/cxfa_treelist.h" + +const CJX_MethodSpec CJX_TreeList::MethodSpecs[] = { + {"namedItem", namedItem_static}, + {"", nullptr}}; + +CJX_TreeList::CJX_TreeList(CXFA_TreeList* list) : CJX_List(list) { + DefineMethods(MethodSpecs); +} + +CJX_TreeList::~CJX_TreeList() {} + +CXFA_TreeList* CJX_TreeList::GetXFATreeList() { + return static_cast<CXFA_TreeList*>(GetXFAObject()); +} + +void CJX_TreeList::namedItem(CFXJSE_Arguments* pArguments) { + int32_t argc = pArguments->GetLength(); + if (argc != 1) { + ThrowParamCountMismatchException(L"namedItem"); + return; + } + + ByteString szName = pArguments->GetUTF8String(0); + CXFA_Node* pNode = GetXFATreeList()->NamedItem( + WideString::FromUTF8(szName.AsStringView()).AsStringView()); + if (!pNode) + return; + + pArguments->GetReturnValue()->Assign( + GetDocument()->GetScriptContext()->GetJSValueFromMap(pNode)); +} diff --git a/fxjs/xfa/cjx_treelist.h b/fxjs/xfa/cjx_treelist.h new file mode 100644 index 0000000000..29a95e6d74 --- /dev/null +++ b/fxjs/xfa/cjx_treelist.h @@ -0,0 +1,28 @@ +// Copyright 2017 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef FXJS_XFA_CJX_TREELIST_H_ +#define FXJS_XFA_CJX_TREELIST_H_ + +#include "fxjs/CJX_Define.h" +#include "fxjs/xfa/cjx_list.h" + +class CXFA_TreeList; + +class CJX_TreeList : public CJX_List { + public: + explicit CJX_TreeList(CXFA_TreeList* list); + ~CJX_TreeList() override; + + JS_METHOD(namedItem, CJX_TreeList); + + private: + CXFA_TreeList* GetXFATreeList(); + + static const CJX_MethodSpec MethodSpecs[]; +}; + +#endif // FXJS_XFA_CJX_TREELIST_H_ diff --git a/fxjs/xfa/cjx_wsdlconnection.cpp b/fxjs/xfa/cjx_wsdlconnection.cpp new file mode 100644 index 0000000000..8a684f4341 --- /dev/null +++ b/fxjs/xfa/cjx_wsdlconnection.cpp @@ -0,0 +1,31 @@ +// Copyright 2017 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "fxjs/xfa/cjx_wsdlconnection.h" + +#include "fxjs/cfxjse_arguments.h" +#include "fxjs/cfxjse_value.h" +#include "xfa/fxfa/parser/cxfa_wsdlconnection.h" + +const CJX_MethodSpec CJX_WsdlConnection::MethodSpecs[] = { + {"execute", execute_static}, + {"", nullptr}}; + +CJX_WsdlConnection::CJX_WsdlConnection(CXFA_WsdlConnection* connection) + : CJX_Node(connection) { + DefineMethods(MethodSpecs); +} + +CJX_WsdlConnection::~CJX_WsdlConnection() {} + +void CJX_WsdlConnection::execute(CFXJSE_Arguments* pArguments) { + int32_t argc = pArguments->GetLength(); + if (argc != 0 && argc != 1) { + ThrowParamCountMismatchException(L"execute"); + return; + } + pArguments->GetReturnValue()->SetBoolean(false); +} diff --git a/fxjs/xfa/cjx_wsdlconnection.h b/fxjs/xfa/cjx_wsdlconnection.h new file mode 100644 index 0000000000..76533ce658 --- /dev/null +++ b/fxjs/xfa/cjx_wsdlconnection.h @@ -0,0 +1,26 @@ +// Copyright 2017 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef FXJS_XFA_CJX_WSDLCONNECTION_H_ +#define FXJS_XFA_CJX_WSDLCONNECTION_H_ + +#include "fxjs/CJX_Define.h" +#include "fxjs/cjx_node.h" + +class CXFA_WsdlConnection; + +class CJX_WsdlConnection : public CJX_Node { + public: + explicit CJX_WsdlConnection(CXFA_WsdlConnection* connection); + ~CJX_WsdlConnection() override; + + JS_METHOD(execute, CJX_WsdlConnection); + + private: + static const CJX_MethodSpec MethodSpecs[]; +}; + +#endif // FXJS_XFA_CJX_WSDLCONNECTION_H_ |