summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--fxjs/xfa/cjx_instancemanager.cpp29
-rw-r--r--fxjs/xfa/cjx_object.cpp4
-rw-r--r--xfa/fxfa/parser/cxfa_node.cpp15
-rw-r--r--xfa/fxfa/parser/cxfa_node.h2
4 files changed, 37 insertions, 13 deletions
diff --git a/fxjs/xfa/cjx_instancemanager.cpp b/fxjs/xfa/cjx_instancemanager.cpp
index d6ac66d9df..830541ed7c 100644
--- a/fxjs/xfa/cjx_instancemanager.cpp
+++ b/fxjs/xfa/cjx_instancemanager.cpp
@@ -58,8 +58,15 @@ int32_t CJX_InstanceManager::SetInstances(int32_t iDesired) {
: wsInstManagerName.Right(wsInstManagerName.GetLength() - 1));
uint32_t dInstanceNameHash =
FX_HashCode_GetW(wsInstanceName.AsStringView(), false);
- CXFA_Node* pPrevSibling =
- iDesired == 0 ? GetXFANode() : GetXFANode()->GetItem(iDesired - 1);
+ CXFA_Node* pPrevSibling = iDesired == 0
+ ? GetXFANode()
+ : GetXFANode()->GetItemIfExists(iDesired - 1);
+ if (!pPrevSibling) {
+ // TODO(dsinclair): Better error?
+ ThrowIndexOutOfBoundsException();
+ return 0;
+ }
+
while (iCount > iDesired) {
CXFA_Node* pRemoveInstance = pPrevSibling->GetNextSibling();
if (pRemoveInstance->GetElementType() != XFA_Element::Subform &&
@@ -109,7 +116,12 @@ int32_t CJX_InstanceManager::MoveInstance(int32_t iTo, int32_t iFrom) {
if (iFrom < 0 || iTo < 0 || iFrom == iTo)
return 0;
- CXFA_Node* pMoveInstance = GetXFANode()->GetItem(iFrom);
+ CXFA_Node* pMoveInstance = GetXFANode()->GetItemIfExists(iFrom);
+ if (!pMoveInstance) {
+ ThrowIndexOutOfBoundsException();
+ return 1;
+ }
+
GetXFANode()->RemoveItem(pMoveInstance, false);
GetXFANode()->InsertItem(pMoveInstance, iTo, iCount - 1, true);
CXFA_LayoutProcessor* pLayoutPro = GetDocument()->GetLayoutProcessor();
@@ -134,11 +146,11 @@ CJS_Return CJX_InstanceManager::moveInstance(
if (!pNotify)
return CJS_Return(true);
- CXFA_Node* pToInstance = GetXFANode()->GetItem(iTo);
+ CXFA_Node* pToInstance = GetXFANode()->GetItemIfExists(iTo);
if (pToInstance && pToInstance->GetElementType() == XFA_Element::Subform)
pNotify->RunSubformIndexChange(pToInstance);
- CXFA_Node* pFromInstance = GetXFANode()->GetItem(iFrom);
+ CXFA_Node* pFromInstance = GetXFANode()->GetItemIfExists(iFrom);
if (pFromInstance &&
pFromInstance->GetElementType() == XFA_Element::Subform) {
pNotify->RunSubformIndexChange(pFromInstance);
@@ -163,13 +175,16 @@ CJS_Return CJX_InstanceManager::removeInstance(
if (iCount - 1 < iMin)
return CJS_Return(JSGetStringFromID(JSMessage::kTooManyOccurances));
- CXFA_Node* pRemoveInstance = GetXFANode()->GetItem(iIndex);
+ CXFA_Node* pRemoveInstance = GetXFANode()->GetItemIfExists(iIndex);
+ if (!pRemoveInstance)
+ return CJS_Return(JSGetStringFromID(JSMessage::kParamError));
+
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);
+ CXFA_Node* pSubformInstance = GetXFANode()->GetItemIfExists(i);
if (pSubformInstance &&
pSubformInstance->GetElementType() == XFA_Element::Subform) {
pNotify->RunSubformIndexChange(pSubformInstance);
diff --git a/fxjs/xfa/cjx_object.cpp b/fxjs/xfa/cjx_object.cpp
index cb76497618..8608cc0e8d 100644
--- a/fxjs/xfa/cjx_object.cpp
+++ b/fxjs/xfa/cjx_object.cpp
@@ -1629,12 +1629,12 @@ void CJX_Object::Script_Som_InstanceIndex(CFXJSE_Value* pValue,
if (!pNotify)
return;
- CXFA_Node* pToInstance = pManagerNode->GetItem(iTo);
+ CXFA_Node* pToInstance = pManagerNode->GetItemIfExists(iTo);
if (pToInstance && pToInstance->GetElementType() == XFA_Element::Subform) {
pNotify->RunSubformIndexChange(pToInstance);
}
- CXFA_Node* pFromInstance = pManagerNode->GetItem(iFrom);
+ CXFA_Node* pFromInstance = pManagerNode->GetItemIfExists(iFrom);
if (pFromInstance &&
pFromInstance->GetElementType() == XFA_Element::Subform) {
pNotify->RunSubformIndexChange(pFromInstance);
diff --git a/xfa/fxfa/parser/cxfa_node.cpp b/xfa/fxfa/parser/cxfa_node.cpp
index c29e30347f..075ee46836 100644
--- a/xfa/fxfa/parser/cxfa_node.cpp
+++ b/xfa/fxfa/parser/cxfa_node.cpp
@@ -1129,7 +1129,7 @@ bool CXFA_Node::IsNeedSavingXMLNode() {
GetElementType() == XFA_Element::Xfa);
}
-CXFA_Node* CXFA_Node::GetItem(int32_t iIndex) {
+CXFA_Node* CXFA_Node::GetItemIfExists(int32_t iIndex) {
int32_t iCount = 0;
uint32_t dwNameHash = 0;
for (CXFA_Node* pNode = GetNextSibling(); pNode;
@@ -1198,8 +1198,12 @@ void CXFA_Node::InsertItem(CXFA_Node* pNewInstance,
if (iPos < 0)
iPos = iCount;
if (iPos == iCount) {
+ CXFA_Node* item = GetItemIfExists(iCount - 1);
+ if (!item)
+ return;
+
CXFA_Node* pNextSibling =
- iCount > 0 ? GetItem(iCount - 1)->GetNextSibling() : GetNextSibling();
+ iCount > 0 ? item->GetNextSibling() : GetNextSibling();
GetParent()->InsertChild(pNewInstance, pNextSibling);
if (bMoveDataBindingNodes) {
std::set<CXFA_Node*> sNew;
@@ -1229,7 +1233,12 @@ void CXFA_Node::InsertItem(CXFA_Node* pNewInstance,
ReorderDataNodes(sNew, sAfter, false);
}
} else {
- CXFA_Node* pBeforeInstance = GetItem(iPos);
+ CXFA_Node* pBeforeInstance = GetItemIfExists(iPos);
+ if (!pBeforeInstance) {
+ // TODO(dsinclair): What should happen here?
+ return;
+ }
+
GetParent()->InsertChild(pNewInstance, pBeforeInstance);
if (bMoveDataBindingNodes) {
std::set<CXFA_Node*> sNew;
diff --git a/xfa/fxfa/parser/cxfa_node.h b/xfa/fxfa/parser/cxfa_node.h
index 1e20ace09c..8108eeccc4 100644
--- a/xfa/fxfa/parser/cxfa_node.h
+++ b/xfa/fxfa/parser/cxfa_node.h
@@ -104,7 +104,7 @@ class CXFA_Node : public CXFA_Object {
CXFA_Node* CreateInstanceIfPossible(bool bDataMerge);
int32_t GetCount();
- CXFA_Node* GetItem(int32_t iIndex);
+ CXFA_Node* GetItemIfExists(int32_t iIndex);
void RemoveItem(CXFA_Node* pRemoveInstance, bool bRemoveDataBinding);
void InsertItem(CXFA_Node* pNewInstance,
int32_t iPos,