Use Optional<> return from CXFA_LocaleMgr::GetConfigLocaleName(). Its only caller returns an optional, too. Change-Id: I700f15b69c7eee75d73a1a7c271e5482951e224e Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/74110 Commit-Queue: Tom Sepez <tsepez@chromium.org> Reviewed-by: Lei Zhang <thestig@chromium.org>
diff --git a/xfa/fxfa/parser/cxfa_localemgr.cpp b/xfa/fxfa/parser/cxfa_localemgr.cpp index e1b7b5c..b5da74e 100644 --- a/xfa/fxfa/parser/cxfa_localemgr.cpp +++ b/xfa/fxfa/parser/cxfa_localemgr.cpp
@@ -1231,32 +1231,40 @@ m_pDefLocale = pLocale; } -WideString CXFA_LocaleMgr::GetConfigLocaleName(CXFA_Node* pConfig) { - if (m_hasSetLocaleName) +Optional<WideString> CXFA_LocaleMgr::GetConfigLocaleName( + CXFA_Node* pConfig) const { + if (m_bConfigLocaleCached) return m_wsConfigLocale; - m_hasSetLocaleName = true; - m_wsConfigLocale.clear(); + ASSERT(!m_wsConfigLocale.has_value()); + m_bConfigLocaleCached = true; if (!pConfig) return m_wsConfigLocale; - CXFA_Node* pChildfConfig = + CXFA_Node* pChildConfig = pConfig->GetFirstChildByClass<CXFA_Acrobat>(XFA_Element::Acrobat); - if (!pChildfConfig) { - pChildfConfig = + if (!pChildConfig) { + pChildConfig = pConfig->GetFirstChildByClass<CXFA_Present>(XFA_Element::Present); + if (!pChildConfig) + return m_wsConfigLocale; } - CXFA_Common* pCommon = pChildfConfig - ? pChildfConfig->GetFirstChildByClass<CXFA_Common>( - XFA_Element::Common) - : nullptr; + + CXFA_Common* pCommon = + pChildConfig->GetFirstChildByClass<CXFA_Common>(XFA_Element::Common); + if (!pCommon) + return m_wsConfigLocale; + CXFA_Locale* pLocale = - pCommon ? pCommon->GetFirstChildByClass<CXFA_Locale>(XFA_Element::Locale) - : nullptr; - if (pLocale) { - m_wsConfigLocale = pLocale->JSObject() - ->TryCData(XFA_Attribute::Value, false) - .value_or(WideString()); - } + pCommon->GetFirstChildByClass<CXFA_Locale>(XFA_Element::Locale); + if (!pLocale) + return m_wsConfigLocale; + + Optional<WideString> wsMaybeLocale = + pLocale->JSObject()->TryCData(XFA_Attribute::Value, false); + if (!wsMaybeLocale.has_value() || wsMaybeLocale.value().IsEmpty()) + return m_wsConfigLocale; + + m_wsConfigLocale = wsMaybeLocale; return m_wsConfigLocale; }
diff --git a/xfa/fxfa/parser/cxfa_localemgr.h b/xfa/fxfa/parser/cxfa_localemgr.h index 8cb6f04..e9fdf44 100644 --- a/xfa/fxfa/parser/cxfa_localemgr.h +++ b/xfa/fxfa/parser/cxfa_localemgr.h
@@ -13,6 +13,7 @@ #include "core/fxcrt/unowned_ptr.h" #include "core/fxcrt/widestring.h" #include "fxjs/gc/heap.h" +#include "third_party/base/optional.h" #include "v8/include/cppgc/garbage-collected.h" #include "v8/include/cppgc/member.h" #include "xfa/fgas/crt/locale_mgr_iface.h" @@ -34,7 +35,7 @@ GCedLocaleIface* GetLocaleByName(const WideString& wsLocaleName) override; void SetDefLocale(GCedLocaleIface* pLocale); - WideString GetConfigLocaleName(CXFA_Node* pConfig); + Optional<WideString> GetConfigLocaleName(CXFA_Node* pConfig) const; private: CXFA_LocaleMgr(cppgc::Heap* pHeap, @@ -49,9 +50,17 @@ std::vector<cppgc::Member<CXFA_XMLLocale>> m_XMLLocaleArray; cppgc::Member<GCedLocaleIface> m_pDefLocale; - WideString m_wsConfigLocale; + // Note: three possiblities + // 1. we might never have tried to determine |m_wsConfigLocale|. + // 2. we might have tried but gotten nothing and want to continue + // to return nothing without ever trying again. + // 3. we might have tried and gotten something. + // So |m_bConfigLocaleCached| indicates whether we've already tried, + // and |m_wsConfigLocale| is the possibly nothing we got if we tried. + mutable Optional<WideString> m_wsConfigLocale; + mutable bool m_bConfigLocaleCached = false; + uint16_t m_dwDeflcid; - bool m_hasSetLocaleName = false; }; #endif // XFA_FXFA_PARSER_CXFA_LOCALEMGR_H_
diff --git a/xfa/fxfa/parser/cxfa_node.cpp b/xfa/fxfa/parser/cxfa_node.cpp index 55dc84a..9b67810 100644 --- a/xfa/fxfa/parser/cxfa_node.cpp +++ b/xfa/fxfa/parser/cxfa_node.cpp
@@ -1403,39 +1403,39 @@ Optional<WideString> CXFA_Node::GetLocaleName() { CXFA_Node* pForm = ToNode(GetDocument()->GetXFAObject(XFA_HASHCODE_Form)); if (!pForm) - return {}; + return pdfium::nullopt; CXFA_Subform* pTopSubform = pForm->GetFirstChildByClass<CXFA_Subform>(XFA_Element::Subform); if (!pTopSubform) - return {}; + return pdfium::nullopt; + Optional<WideString> localeName; CXFA_Node* pLocaleNode = this; do { - Optional<WideString> localeName = + localeName = pLocaleNode->JSObject()->TryCData(XFA_Attribute::Locale, false); - if (localeName) + if (localeName.has_value()) return localeName; pLocaleNode = pLocaleNode->GetParent(); } while (pLocaleNode && pLocaleNode != pTopSubform); CXFA_Node* pConfig = ToNode(GetDocument()->GetXFAObject(XFA_HASHCODE_Config)); - WideString wsLocaleName = - GetDocument()->GetLocaleMgr()->GetConfigLocaleName(pConfig); - if (!wsLocaleName.IsEmpty()) - return wsLocaleName; + localeName = GetDocument()->GetLocaleMgr()->GetConfigLocaleName(pConfig); + if (localeName.has_value()) + return localeName; if (pTopSubform) { - Optional<WideString> localeName = + localeName = pTopSubform->JSObject()->TryCData(XFA_Attribute::Locale, false); - if (localeName) + if (localeName.has_value()) return localeName; } LocaleIface* pLocale = GetDocument()->GetLocaleMgr()->GetDefLocale(); if (!pLocale) - return {}; + return pdfium::nullopt; return pLocale->GetName(); }