From 778f2feb328ac4321762b8dcf94ebc0a1bac79f5 Mon Sep 17 00:00:00 2001 From: Dan Sinclair Date: Wed, 1 Nov 2017 18:46:47 +0000 Subject: Move CXFA_NodeList JS to CJX_NodeList This CL moves the JS from CXFA_NodeList to CJX_NodeList and proxies the JS calls. Change-Id: Ic2295ce2140321748bfe5f851e00da32d4332ce0 Reviewed-on: https://pdfium-review.googlesource.com/17312 Commit-Queue: dsinclair Reviewed-by: Tom Sepez --- BUILD.gn | 2 + fxjs/cjx_nodelist.cpp | 114 ++++++++++++++++++++++++++++++++++++++ fxjs/cjx_nodelist.h | 35 ++++++++++++ xfa/fxfa/parser/cxfa_nodelist.cpp | 78 +++----------------------- xfa/fxfa/parser/cxfa_nodelist.h | 3 + 5 files changed, 162 insertions(+), 70 deletions(-) create mode 100644 fxjs/cjx_nodelist.cpp create mode 100644 fxjs/cjx_nodelist.h diff --git a/BUILD.gn b/BUILD.gn index 6c5996f675..4ae03b3010 100644 --- a/BUILD.gn +++ b/BUILD.gn @@ -1301,6 +1301,8 @@ static_library("fxjs") { "fxjs/cfxjse_value.h", "fxjs/cjx_node.cpp", "fxjs/cjx_node.h", + "fxjs/cjx_nodelist.cpp", + "fxjs/cjx_nodelist.h", "fxjs/cjx_object.cpp", "fxjs/cjx_object.h", "fxjs/fxjse.h", diff --git a/fxjs/cjx_nodelist.cpp b/fxjs/cjx_nodelist.cpp new file mode 100644 index 0000000000..8200e2ef08 --- /dev/null +++ b/fxjs/cjx_nodelist.cpp @@ -0,0 +1,114 @@ +// 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/cjx_nodelist.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_nodelist.h" + +CJX_NodeList::CJX_NodeList(CXFA_NodeList* list) : CJX_Object(list) {} + +CJX_NodeList::~CJX_NodeList() {} + +CXFA_NodeList* CJX_NodeList::GetXFANodeList() { + return static_cast(GetXFAObject()); +} + +void CJX_NodeList::Script_ListClass_Append(CFXJSE_Arguments* pArguments) { + int32_t argc = pArguments->GetLength(); + if (argc != 1) { + ThrowParamCountMismatchException(L"append"); + return; + } + + auto* pNode = static_cast(pArguments->GetObject(0)); + if (!pNode) { + ThrowArgumentMismatchException(); + return; + } + GetXFANodeList()->Append(pNode); +} + +void CJX_NodeList::Script_ListClass_Insert(CFXJSE_Arguments* pArguments) { + int32_t argc = pArguments->GetLength(); + if (argc != 2) { + ThrowParamCountMismatchException(L"insert"); + return; + } + + auto* pNewNode = static_cast(pArguments->GetObject(0)); + auto* pBeforeNode = static_cast(pArguments->GetObject(1)); + if (!pNewNode) { + ThrowArgumentMismatchException(); + return; + } + GetXFANodeList()->Insert(pNewNode, pBeforeNode); +} + +void CJX_NodeList::Script_ListClass_Remove(CFXJSE_Arguments* pArguments) { + int32_t argc = pArguments->GetLength(); + if (argc != 1) { + ThrowParamCountMismatchException(L"remove"); + return; + } + + auto* pNode = static_cast(pArguments->GetObject(0)); + if (!pNode) { + ThrowArgumentMismatchException(); + return; + } + GetXFANodeList()->Remove(pNode); +} + +void CJX_NodeList::Script_ListClass_Item(CFXJSE_Arguments* pArguments) { + int32_t argc = pArguments->GetLength(); + if (argc != 1) { + ThrowParamCountMismatchException(L"item"); + return; + } + + int32_t iIndex = pArguments->GetInt32(0); + if (iIndex < 0 || iIndex >= GetXFANodeList()->GetLength()) { + ThrowIndexOutOfBoundsException(); + return; + } + pArguments->GetReturnValue()->Assign( + GetXFANodeList()->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( + GetXFANodeList()->GetDocument()->GetScriptContext()->GetJSValueFromMap( + pNode)); +} + +void CJX_NodeList::Script_ListClass_Length(CFXJSE_Value* pValue, + bool bSetting, + XFA_ATTRIBUTE eAttribute) { + if (bSetting) { + ThrowInvalidPropertyException(); + return; + } + pValue->SetInteger(GetXFANodeList()->GetLength()); +} diff --git a/fxjs/cjx_nodelist.h b/fxjs/cjx_nodelist.h new file mode 100644 index 0000000000..eec9b23960 --- /dev/null +++ b/fxjs/cjx_nodelist.h @@ -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 + +#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/xfa/fxfa/parser/cxfa_nodelist.cpp b/xfa/fxfa/parser/cxfa_nodelist.cpp index 4c5e5435c2..31e3bf6764 100644 --- a/xfa/fxfa/parser/cxfa_nodelist.cpp +++ b/xfa/fxfa/parser/cxfa_nodelist.cpp @@ -10,6 +10,7 @@ #include "core/fxcrt/fx_extension.h" #include "fxjs/cfxjse_engine.h" +#include "fxjs/cjx_nodelist.h" #include "xfa/fxfa/parser/cxfa_document.h" #include "xfa/fxfa/parser/cxfa_node.h" @@ -18,7 +19,7 @@ CXFA_NodeList::CXFA_NodeList(CXFA_Document* pDocument) XFA_ObjectType::NodeList, XFA_Element::NodeList, WideStringView(L"nodeList"), - pdfium::MakeUnique(this)) { + pdfium::MakeUnique(this)) { m_pDocument->GetScriptContext()->AddToCacheList( std::unique_ptr(this)); } @@ -37,91 +38,28 @@ CXFA_Node* CXFA_NodeList::NamedItem(const WideStringView& wsName) { } void CXFA_NodeList::Script_ListClass_Append(CFXJSE_Arguments* pArguments) { - int32_t argc = pArguments->GetLength(); - if (argc != 1) { - JSObject()->ThrowParamCountMismatchException(L"append"); - return; - } - - CXFA_Node* pNode = static_cast(pArguments->GetObject(0)); - if (!pNode) { - JSObject()->ThrowArgumentMismatchException(); - return; - } - Append(pNode); + JSNodeList()->Script_ListClass_Append(pArguments); } void CXFA_NodeList::Script_ListClass_Insert(CFXJSE_Arguments* pArguments) { - int32_t argc = pArguments->GetLength(); - if (argc != 2) { - JSObject()->ThrowParamCountMismatchException(L"insert"); - return; - } - - CXFA_Node* pNewNode = static_cast(pArguments->GetObject(0)); - CXFA_Node* pBeforeNode = static_cast(pArguments->GetObject(1)); - if (!pNewNode) { - JSObject()->ThrowArgumentMismatchException(); - return; - } - Insert(pNewNode, pBeforeNode); + JSNodeList()->Script_ListClass_Insert(pArguments); } void CXFA_NodeList::Script_ListClass_Remove(CFXJSE_Arguments* pArguments) { - int32_t argc = pArguments->GetLength(); - if (argc != 1) { - JSObject()->ThrowParamCountMismatchException(L"remove"); - return; - } - - CXFA_Node* pNode = static_cast(pArguments->GetObject(0)); - if (!pNode) { - JSObject()->ThrowArgumentMismatchException(); - return; - } - Remove(pNode); + JSNodeList()->Script_ListClass_Remove(pArguments); } void CXFA_NodeList::Script_ListClass_Item(CFXJSE_Arguments* pArguments) { - int32_t argc = pArguments->GetLength(); - if (argc != 1) { - JSObject()->ThrowParamCountMismatchException(L"item"); - return; - } - - int32_t iIndex = pArguments->GetInt32(0); - if (iIndex < 0 || iIndex >= GetLength()) { - JSObject()->ThrowIndexOutOfBoundsException(); - return; - } - pArguments->GetReturnValue()->Assign( - m_pDocument->GetScriptContext()->GetJSValueFromMap(Item(iIndex))); + JSNodeList()->Script_ListClass_Item(pArguments); } void CXFA_NodeList::Script_TreelistClass_NamedItem( CFXJSE_Arguments* pArguments) { - int32_t argc = pArguments->GetLength(); - if (argc != 1) { - JSObject()->ThrowParamCountMismatchException(L"namedItem"); - return; - } - - ByteString szName = pArguments->GetUTF8String(0); - CXFA_Node* pNode = - NamedItem(WideString::FromUTF8(szName.AsStringView()).AsStringView()); - if (!pNode) - return; - - pArguments->GetReturnValue()->Assign( - m_pDocument->GetScriptContext()->GetJSValueFromMap(pNode)); + JSNodeList()->Script_TreelistClass_NamedItem(pArguments); } void CXFA_NodeList::Script_ListClass_Length(CFXJSE_Value* pValue, bool bSetting, XFA_ATTRIBUTE eAttribute) { - if (bSetting) { - JSObject()->ThrowInvalidPropertyException(); - return; - } - pValue->SetInteger(GetLength()); + JSNodeList()->Script_ListClass_Length(pValue, bSetting, eAttribute); } diff --git a/xfa/fxfa/parser/cxfa_nodelist.h b/xfa/fxfa/parser/cxfa_nodelist.h index 2fccd5d7a5..ec2176e44d 100644 --- a/xfa/fxfa/parser/cxfa_nodelist.h +++ b/xfa/fxfa/parser/cxfa_nodelist.h @@ -7,6 +7,7 @@ #ifndef XFA_FXFA_PARSER_CXFA_NODELIST_H_ #define XFA_FXFA_PARSER_CXFA_NODELIST_H_ +#include "fxjs/cjx_nodelist.h" #include "xfa/fxfa/fxfa_basic.h" #include "xfa/fxfa/parser/cxfa_object.h" @@ -19,6 +20,8 @@ class CXFA_NodeList : public CXFA_Object { explicit CXFA_NodeList(CXFA_Document* pDocument); ~CXFA_NodeList() override; + CJX_NodeList* JSNodeList() { return static_cast(JSObject()); } + CXFA_Node* NamedItem(const WideStringView& wsName); virtual int32_t GetLength() = 0; virtual bool Append(CXFA_Node* pNode) = 0; -- cgit v1.2.3