diff options
-rw-r--r-- | fxjs/cjx_node.cpp | 29 | ||||
-rw-r--r-- | fxjs/cjx_node.h | 2 | ||||
-rw-r--r-- | xfa/fxfa/parser/cxfa_filldata.cpp | 4 | ||||
-rw-r--r-- | xfa/fxfa/parser/cxfa_fontdata.cpp | 8 | ||||
-rw-r--r-- | xfa/fxfa/parser/cxfa_layoutpagemgr.cpp | 102 | ||||
-rw-r--r-- | xfa/fxfa/parser/cxfa_occurdata.cpp | 46 | ||||
-rw-r--r-- | xfa/fxfa/parser/cxfa_widgetdata.cpp | 18 |
7 files changed, 108 insertions, 101 deletions
diff --git a/fxjs/cjx_node.cpp b/fxjs/cjx_node.cpp index a1b2f048dc..0e0f2d0274 100644 --- a/fxjs/cjx_node.cpp +++ b/fxjs/cjx_node.cpp @@ -294,11 +294,11 @@ bool CJX_Node::GetAttribute(XFA_Attribute eAttr, return true; } case XFA_AttributeType::Integer: { - int32_t iValue; - if (!TryInteger(pAttr->eName, iValue, bUseDefault)) + pdfium::Optional<int32_t> iValue = TryInteger(pAttr->eName, bUseDefault); + if (!iValue) return false; - wsValue.Format(L"%d", iValue); + wsValue.Format(L"%d", *iValue); return true; } case XFA_AttributeType::Measure: { @@ -3038,28 +3038,19 @@ bool CJX_Node::SetInteger(XFA_Attribute eAttr, int32_t iValue, bool bNotify) { } int32_t CJX_Node::GetInteger(XFA_Attribute eAttr) { - int32_t iValue; - return TryInteger(eAttr, iValue, true) ? iValue : 0; + return TryInteger(eAttr, true).value_or(0); } -bool CJX_Node::TryInteger(XFA_Attribute eAttr, - int32_t& iValue, - bool bUseDefault) { +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)) { - iValue = (int32_t)(uintptr_t)pValue; - return true; - } + if (GetMapModuleValue(pKey, pValue)) + return {static_cast<int32_t>(reinterpret_cast<uintptr_t>(pValue))}; if (!bUseDefault) - return false; - - pdfium::Optional<int32_t> ret = GetXFANode()->GetDefaultInteger(eAttr); - if (!ret) - return false; + return {}; - iValue = *ret; - return true; + return GetXFANode()->GetDefaultInteger(eAttr); } bool CJX_Node::TryEnum(XFA_Attribute eAttr, diff --git a/fxjs/cjx_node.h b/fxjs/cjx_node.h index 2e9360d451..6c95673d25 100644 --- a/fxjs/cjx_node.h +++ b/fxjs/cjx_node.h @@ -69,7 +69,7 @@ class CJX_Node : public CJX_Object { bool bSyncData); WideString GetContent(bool bScriptModify); - bool TryInteger(XFA_Attribute eAttr, int32_t& iValue, bool bUseDefault); + 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); diff --git a/xfa/fxfa/parser/cxfa_filldata.cpp b/xfa/fxfa/parser/cxfa_filldata.cpp index b55f24ad2a..4e1e5f1af2 100644 --- a/xfa/fxfa/parser/cxfa_filldata.cpp +++ b/xfa/fxfa/parser/cxfa_filldata.cpp @@ -72,15 +72,13 @@ int32_t CXFA_FillData::GetStipple(FX_ARGB& stippleColor) { CXFA_Node* pNode = m_pNode->JSNode()->GetProperty(0, XFA_Element::Stipple, true); - int32_t eAttr = 50; - pNode->JSNode()->TryInteger(XFA_Attribute::Rate, eAttr, true); if (CXFA_Node* pColor = pNode->GetChild(0, XFA_Element::Color, false)) { pdfium::Optional<WideString> wsColor = pColor->JSNode()->TryCData(XFA_Attribute::Value, false); if (wsColor) stippleColor = CXFA_DataData::ToColor(wsColor->AsStringView()); } - return eAttr; + return pNode->JSNode()->TryInteger(XFA_Attribute::Rate, true).value_or(50); } int32_t CXFA_FillData::GetLinear(FX_ARGB& endColor) { diff --git a/xfa/fxfa/parser/cxfa_fontdata.cpp b/xfa/fxfa/parser/cxfa_fontdata.cpp index afe73538c8..f5600f24df 100644 --- a/xfa/fxfa/parser/cxfa_fontdata.cpp +++ b/xfa/fxfa/parser/cxfa_fontdata.cpp @@ -43,15 +43,11 @@ float CXFA_FontData::GetLetterSpacing() { } int32_t CXFA_FontData::GetLineThrough() { - int32_t iValue = 0; - m_pNode->JSNode()->TryInteger(XFA_Attribute::LineThrough, iValue, true); - return iValue; + return m_pNode->JSNode()->GetInteger(XFA_Attribute::LineThrough); } int32_t CXFA_FontData::GetUnderline() { - int32_t iValue = 0; - m_pNode->JSNode()->TryInteger(XFA_Attribute::Underline, iValue, true); - return iValue; + return m_pNode->JSNode()->GetInteger(XFA_Attribute::Underline); } int32_t CXFA_FontData::GetUnderlinePeriod() { diff --git a/xfa/fxfa/parser/cxfa_layoutpagemgr.cpp b/xfa/fxfa/parser/cxfa_layoutpagemgr.cpp index 09cb08a283..e301825735 100644 --- a/xfa/fxfa/parser/cxfa_layoutpagemgr.cpp +++ b/xfa/fxfa/parser/cxfa_layoutpagemgr.cpp @@ -1138,11 +1138,16 @@ bool CXFA_LayoutPageMgr::FindPageAreaFromPageSet_Ordered( iPageSetCount = it->second; int32_t iMax = -1; CXFA_Node* pOccurNode = pPageSet->GetFirstChildByClass(XFA_Element::Occur); - if (pOccurNode) - pOccurNode->JSNode()->TryInteger(XFA_Attribute::Max, iMax, false); + if (pOccurNode) { + pdfium::Optional<int32_t> ret = + pOccurNode->JSNode()->TryInteger(XFA_Attribute::Max, false); + if (ret) + iMax = *ret; + } if (iMax >= 0 && iMax <= iPageSetCount) return false; } + bool bRes = false; CXFA_Node* pCurrentNode = pStartChild ? pStartChild->GetNodeItem(XFA_NODEITEM_NextSibling) @@ -1338,8 +1343,12 @@ CXFA_Node* CXFA_LayoutPageMgr::GetNextAvailPageArea( int32_t iMax = -1; CXFA_Node* pOccurNode = m_pCurPageArea->GetFirstChildByClass(XFA_Element::Occur); - if (pOccurNode) - pOccurNode->JSNode()->TryInteger(XFA_Attribute::Max, iMax, false); + if (pOccurNode) { + pdfium::Optional<int32_t> ret = + pOccurNode->JSNode()->TryInteger(XFA_Attribute::Max, false); + if (ret) + iMax = *ret; + } if ((iMax < 0 || m_nCurPageCount < iMax)) { if (!bQuery) { CXFA_ContainerRecord* pNewRecord = @@ -1439,25 +1448,31 @@ int32_t CXFA_LayoutPageMgr::CreateMinPageRecord(CXFA_Node* pPageArea, if (!pPageArea) return 0; - CXFA_Node* pOccurNode = pPageArea->GetFirstChildByClass(XFA_Element::Occur); int32_t iMin = 0; - if ((pOccurNode && - pOccurNode->JSNode()->TryInteger(XFA_Attribute::Min, iMin, false)) || - bTargetPageArea) { - CXFA_Node* pContentArea = - pPageArea->GetFirstChildByClass(XFA_Element::ContentArea); - if (iMin < 1 && bTargetPageArea && !pContentArea) - iMin = 1; - - int32_t i = 0; - if (bCreateLast) - i = m_nCurPageCount; - - for (; i < iMin; i++) { - CXFA_ContainerRecord* pNewRecord = CreateContainerRecord(); - AddPageAreaLayoutItem(pNewRecord, pPageArea); - AddContentAreaLayoutItem(pNewRecord, pContentArea); - } + pdfium::Optional<int32_t> ret; + CXFA_Node* pOccurNode = pPageArea->GetFirstChildByClass(XFA_Element::Occur); + if (pOccurNode) { + ret = pOccurNode->JSNode()->TryInteger(XFA_Attribute::Min, false); + if (ret) + iMin = *ret; + } + + if (!ret && !bTargetPageArea) + return iMin; + + CXFA_Node* pContentArea = + pPageArea->GetFirstChildByClass(XFA_Element::ContentArea); + if (iMin < 1 && bTargetPageArea && !pContentArea) + iMin = 1; + + int32_t i = 0; + if (bCreateLast) + i = m_nCurPageCount; + + for (; i < iMin; i++) { + CXFA_ContainerRecord* pNewRecord = CreateContainerRecord(); + AddPageAreaLayoutItem(pNewRecord, pPageArea); + AddContentAreaLayoutItem(pNewRecord, pContentArea); } return iMin; } @@ -1476,26 +1491,24 @@ void CXFA_LayoutPageMgr::CreateMinPageSetRecord(CXFA_Node* pPageSet, iCurSetCount = 0; CXFA_Node* pOccurNode = pPageSet->GetFirstChildByClass(XFA_Element::Occur); - int32_t iMin = 0; - if (pOccurNode && - pOccurNode->JSNode()->TryInteger(XFA_Attribute::Min, iMin, false)) { - if (iCurSetCount < iMin) { - for (int32_t i = 0; i < iMin - iCurSetCount; i++) { - for (CXFA_Node* pCurrentPageNode = - pPageSet->GetNodeItem(XFA_NODEITEM_FirstChild); - pCurrentPageNode; pCurrentPageNode = pCurrentPageNode->GetNodeItem( - XFA_NODEITEM_NextSibling)) { - if (pCurrentPageNode->GetElementType() == XFA_Element::PageArea) { - CreateMinPageRecord(pCurrentPageNode, false); - } else if (pCurrentPageNode->GetElementType() == - XFA_Element::PageSet) { - CreateMinPageSetRecord(pCurrentPageNode, true); - } - } - } - m_pPageSetMap[pPageSet] = iMin; + if (!pOccurNode) + return; + + pdfium::Optional<int32_t> iMin = + pOccurNode->JSNode()->TryInteger(XFA_Attribute::Min, false); + if (!iMin || iCurSetCount >= *iMin) + return; + + for (int32_t i = 0; i < *iMin - iCurSetCount; i++) { + for (CXFA_Node* node = pPageSet->GetNodeItem(XFA_NODEITEM_FirstChild); node; + node = node->GetNodeItem(XFA_NODEITEM_NextSibling)) { + if (node->GetElementType() == XFA_Element::PageArea) + CreateMinPageRecord(node, false); + else if (node->GetElementType() == XFA_Element::PageSet) + CreateMinPageSetRecord(node, true); } } + m_pPageSetMap[pPageSet] = *iMin; } void CXFA_LayoutPageMgr::CreateNextMinRecord(CXFA_Node* pRecordNode) { @@ -1545,8 +1558,13 @@ bool CXFA_LayoutPageMgr::GetNextAvailContentHeight(float fChildHeight) { CXFA_Node* pPageNode = GetCurrentContainerRecord()->pCurPageArea->m_pFormNode; CXFA_Node* pOccurNode = pPageNode->GetFirstChildByClass(XFA_Element::Occur); int32_t iMax = 0; - if (pOccurNode && - pOccurNode->JSNode()->TryInteger(XFA_Attribute::Max, iMax, false)) { + pdfium::Optional<int32_t> ret; + if (pOccurNode) { + ret = pOccurNode->JSNode()->TryInteger(XFA_Attribute::Max, false); + if (ret) + iMax = *ret; + } + if (ret) { if (m_nCurPageCount == iMax) { CXFA_Node* pSrcPage = m_pCurPageArea; int32_t nSrcPageCount = m_nCurPageCount; diff --git a/xfa/fxfa/parser/cxfa_occurdata.cpp b/xfa/fxfa/parser/cxfa_occurdata.cpp index 1f20e3c0e9..4538919d10 100644 --- a/xfa/fxfa/parser/cxfa_occurdata.cpp +++ b/xfa/fxfa/parser/cxfa_occurdata.cpp @@ -11,22 +11,21 @@ CXFA_OccurData::CXFA_OccurData(CXFA_Node* pNode) : CXFA_DataData(pNode) {} int32_t CXFA_OccurData::GetMax() { - int32_t iMax = 1; - if (m_pNode) { - if (!m_pNode->JSNode()->TryInteger(XFA_Attribute::Max, iMax, true)) - iMax = GetMin(); - } - return iMax; + if (!m_pNode) + return 1; + + pdfium::Optional<int32_t> max = + m_pNode->JSNode()->TryInteger(XFA_Attribute::Max, true); + return max ? *max : GetMin(); } int32_t CXFA_OccurData::GetMin() { - int32_t iMin = 1; - if (m_pNode) { - if (!m_pNode->JSNode()->TryInteger(XFA_Attribute::Min, iMin, true) || - iMin < 0) - iMin = 1; - } - return iMin; + if (!m_pNode) + return 1; + + pdfium::Optional<int32_t> min = + m_pNode->JSNode()->TryInteger(XFA_Attribute::Min, true); + return min && *min >= 0 ? *min : 1; } bool CXFA_OccurData::GetOccurInfo(int32_t& iMin, @@ -34,19 +33,14 @@ bool CXFA_OccurData::GetOccurInfo(int32_t& iMin, int32_t& iInit) { if (!m_pNode) return false; - if (!m_pNode->JSNode()->TryInteger(XFA_Attribute::Min, iMin, false) || - iMin < 0) - iMin = 1; - if (!m_pNode->JSNode()->TryInteger(XFA_Attribute::Max, iMax, false)) { - if (iMin == 0) - iMax = 1; - else - iMax = iMin; - } - if (!m_pNode->JSNode()->TryInteger(XFA_Attribute::Initial, iInit, false) || - iInit < iMin) { - iInit = iMin; - } + + iMin = GetMin(); + iMax = GetMax(); + + pdfium::Optional<int32_t> init = + m_pNode->JSNode()->TryInteger(XFA_Attribute::Initial, false); + iInit = init && *init >= iMin ? *init : iMin; + return true; } diff --git a/xfa/fxfa/parser/cxfa_widgetdata.cpp b/xfa/fxfa/parser/cxfa_widgetdata.cpp index 1a39e2a525..90d02994de 100644 --- a/xfa/fxfa/parser/cxfa_widgetdata.cpp +++ b/xfa/fxfa/parser/cxfa_widgetdata.cpp @@ -1350,8 +1350,13 @@ bool CXFA_WidgetData::GetFracDigits(int32_t& iFracDigits) { if (!pChild) return false; - return pChild->JSNode()->TryInteger(XFA_Attribute::FracDigits, iFracDigits, - true); + pdfium::Optional<int32_t> ret = + pChild->JSNode()->TryInteger(XFA_Attribute::FracDigits, true); + if (!ret) + return false; + + iFracDigits = *ret; + return true; } bool CXFA_WidgetData::GetLeadDigits(int32_t& iLeadDigits) { @@ -1365,8 +1370,13 @@ bool CXFA_WidgetData::GetLeadDigits(int32_t& iLeadDigits) { if (!pChild) return false; - return pChild->JSNode()->TryInteger(XFA_Attribute::LeadDigits, iLeadDigits, - true); + pdfium::Optional<int32_t> ret = + pChild->JSNode()->TryInteger(XFA_Attribute::LeadDigits, true); + if (!ret) + return false; + + iLeadDigits = *ret; + return true; } bool CXFA_WidgetData::SetValue(const WideString& wsValue, |