diff --git a/core/fpdfapi/page/cpdf_docpagedata.cpp b/core/fpdfapi/page/cpdf_docpagedata.cpp
index 7b1b032..47b5af2 100644
--- a/core/fpdfapi/page/cpdf_docpagedata.cpp
+++ b/core/fpdfapi/page/cpdf_docpagedata.cpp
@@ -459,7 +459,9 @@
     const ByteString& fontName,
     const CPDF_FontEncoding* pEncoding) {
   ByteString mutable_name(fontName);
-  if (!CFX_FontMapper::GetStandardFontName(&mutable_name))
+  Optional<CFX_FontMapper::StandardFont> font_id =
+      CFX_FontMapper::GetStandardFontName(&mutable_name);
+  if (!font_id.has_value())
     return nullptr;
   return GetStandardFont(mutable_name, pEncoding);
 }
diff --git a/core/fpdfapi/page/cpdf_stitchfunc.cpp b/core/fpdfapi/page/cpdf_stitchfunc.cpp
index 10f1eb1..3e903b7 100644
--- a/core/fpdfapi/page/cpdf_stitchfunc.cpp
+++ b/core/fpdfapi/page/cpdf_stitchfunc.cpp
@@ -84,7 +84,7 @@
       if (nFuncOutputs == 0)
         return false;
 
-      if (nOutputs) {
+      if (nOutputs.has_value()) {
         if (nFuncOutputs != *nOutputs)
           return false;
       } else {
diff --git a/core/fpdfapi/parser/cpdf_data_avail.cpp b/core/fpdfapi/parser/cpdf_data_avail.cpp
index d31639a..a3ea904 100644
--- a/core/fpdfapi/parser/cpdf_data_avail.cpp
+++ b/core/fpdfapi/parser/cpdf_data_avail.cpp
@@ -494,7 +494,7 @@
   if (GetValidator()->has_read_problems())
     return kDataNotAvailable;
 
-  if (!header_offset)
+  if (!header_offset.has_value())
     return kDataError;
 
   m_parser.m_pSyntax =
diff --git a/core/fpdfapi/parser/cpdf_parser.cpp b/core/fpdfapi/parser/cpdf_parser.cpp
index f5491dd..03c9bcd 100644
--- a/core/fpdfapi/parser/cpdf_parser.cpp
+++ b/core/fpdfapi/parser/cpdf_parser.cpp
@@ -119,7 +119,7 @@
 bool CPDF_Parser::InitSyntaxParser(
     const RetainPtr<CPDF_ReadValidator>& validator) {
   const Optional<FX_FILESIZE> header_offset = GetHeaderOffset(validator);
-  if (!header_offset)
+  if (!header_offset.has_value())
     return false;
   if (validator->GetSize() < *header_offset + kPDFHeaderSize)
     return false;
diff --git a/core/fpdfdoc/cpdf_formcontrol.cpp b/core/fpdfdoc/cpdf_formcontrol.cpp
index 50dcc17..6e25393 100644
--- a/core/fpdfdoc/cpdf_formcontrol.cpp
+++ b/core/fpdfdoc/cpdf_formcontrol.cpp
@@ -199,7 +199,7 @@
   float fFontSize;
   CPDF_DefaultAppearance cDA = GetDefaultAppearance();
   Optional<ByteString> csFontNameTag = cDA.GetFont(&fFontSize);
-  if (!csFontNameTag || csFontNameTag->IsEmpty())
+  if (!csFontNameTag.has_value() || csFontNameTag->IsEmpty())
     return nullptr;
 
   CPDF_Object* pObj = CPDF_FormField::GetFieldAttr(m_pWidgetDict.Get(), "DR");
diff --git a/core/fpdfdoc/cpdf_formfield.cpp b/core/fpdfdoc/cpdf_formfield.cpp
index 0391657..d1fc368 100644
--- a/core/fpdfdoc/cpdf_formfield.cpp
+++ b/core/fpdfdoc/cpdf_formfield.cpp
@@ -857,7 +857,7 @@
 
   CPDF_DefaultAppearance appearance(DA);
   Optional<ByteString> font_name = appearance.GetFont(&m_FontSize);
-  if (!font_name)
+  if (!font_name.has_value())
     return;
 
   CPDF_Dictionary* pFontDict = pFont->GetDictFor(*font_name);
diff --git a/core/fpdfdoc/cpdf_generateap.cpp b/core/fpdfdoc/cpdf_generateap.cpp
index f98bd5c..2c3dd64 100644
--- a/core/fpdfdoc/cpdf_generateap.cpp
+++ b/core/fpdfdoc/cpdf_generateap.cpp
@@ -938,7 +938,7 @@
 
   float fFontSize = 0;
   Optional<ByteString> font = appearance.GetFont(&fFontSize);
-  if (!font)
+  if (!font.has_value())
     return;
 
   ByteString font_name = *font;
diff --git a/core/fpdftext/cpdf_textpage.cpp b/core/fpdftext/cpdf_textpage.cpp
index f4bf8e2..ef5a46f 100644
--- a/core/fpdftext/cpdf_textpage.cpp
+++ b/core/fpdftext/cpdf_textpage.cpp
@@ -618,7 +618,7 @@
 void CPDF_TextPage::AppendGeneratedCharacter(wchar_t unicode,
                                              const CFX_Matrix& formMatrix) {
   Optional<CharInfo> pGenerateChar = GenerateCharInfo(unicode);
-  if (!pGenerateChar)
+  if (!pGenerateChar.has_value())
     return;
 
   m_TextBuf.AppendChar(unicode);
@@ -982,7 +982,7 @@
         break;
       case GenerateCharacter::kSpace: {
         Optional<CharInfo> pGenerateChar = GenerateCharInfo(L' ');
-        if (pGenerateChar) {
+        if (pGenerateChar.has_value()) {
           if (!form_matrix.IsIdentity())
             pGenerateChar->m_Matrix = form_matrix;
           m_TempTextBuf.AppendChar(L' ');
diff --git a/core/fpdftext/cpdf_textpagefind.cpp b/core/fpdftext/cpdf_textpagefind.cpp
index 2bc46f1..b874ddd 100644
--- a/core/fpdftext/cpdf_textpagefind.cpp
+++ b/core/fpdftext/cpdf_textpagefind.cpp
@@ -129,7 +129,7 @@
   int index = 0;
   while (1) {
     Optional<WideString> word = ExtractSubString(findwhat.c_str(), index);
-    if (!word)
+    if (!word.has_value())
       break;
 
     if (word->IsEmpty()) {
diff --git a/core/fxcodec/jbig2/JBig2_TrdProc.cpp b/core/fxcodec/jbig2/JBig2_TrdProc.cpp
index a009000..328bc88 100644
--- a/core/fxcodec/jbig2/JBig2_TrdProc.cpp
+++ b/core/fxcodec/jbig2/JBig2_TrdProc.cpp
@@ -162,14 +162,14 @@
 
         Optional<uint32_t> WOI = CheckTRDDimension(IBOI->width(), RDWI);
         Optional<uint32_t> HOI = CheckTRDDimension(IBOI->height(), RDHI);
-        if (!WOI || !HOI)
+        if (!WOI.has_value() || !HOI.has_value())
           return nullptr;
 
         Optional<int32_t> GRREFERENCEDX =
             CheckTRDReferenceDimension(RDWI, 2, RDXI);
         Optional<int32_t> GRREFERENCEDY =
             CheckTRDReferenceDimension(RDHI, 2, RDYI);
-        if (!GRREFERENCEDX || !GRREFERENCEDY)
+        if (!GRREFERENCEDX.has_value() || !GRREFERENCEDY.has_value())
           return nullptr;
 
         auto pGRRD = std::make_unique<CJBig2_GRRDProc>();
@@ -342,14 +342,14 @@
 
         Optional<uint32_t> WOI = CheckTRDDimension(IBOI->width(), RDWI);
         Optional<uint32_t> HOI = CheckTRDDimension(IBOI->height(), RDHI);
-        if (!WOI || !HOI)
+        if (!WOI.has_value() || !HOI.has_value())
           return nullptr;
 
         Optional<int32_t> GRREFERENCEDX =
             CheckTRDReferenceDimension(RDWI, 1, RDXI);
         Optional<int32_t> GRREFERENCEDY =
             CheckTRDReferenceDimension(RDHI, 1, RDYI);
-        if (!GRREFERENCEDX || !GRREFERENCEDY)
+        if (!GRREFERENCEDX.has_value() || !GRREFERENCEDY.has_value())
           return nullptr;
 
         auto pGRRD = std::make_unique<CJBig2_GRRDProc>();
diff --git a/core/fxcrt/widestring.cpp b/core/fxcrt/widestring.cpp
index 13939da..4cb8423 100644
--- a/core/fxcrt/widestring.cpp
+++ b/core/fxcrt/widestring.cpp
@@ -308,7 +308,7 @@
         TryVSWPrintf(static_cast<size_t>(maxLen), format, argListCopy);
     va_end(argListCopy);
 
-    if (ret)
+    if (ret.has_value())
       return *ret;
     maxLen *= 2;
   }
diff --git a/fpdfsdk/cpdfsdk_appstream.cpp b/fpdfsdk/cpdfsdk_appstream.cpp
index 187029c..e8c8b48 100644
--- a/fpdfsdk/cpdfsdk_appstream.cpp
+++ b/fpdfsdk/cpdfsdk_appstream.cpp
@@ -1207,7 +1207,7 @@
   float fFontSize;
   ByteString csNameTag;
   Optional<ByteString> font = da.GetFont(&fFontSize);
-  if (font)
+  if (font.has_value())
     csNameTag = *font;
   else
     fFontSize = 12.0f;
diff --git a/fpdfsdk/cpdfsdk_interactiveform.cpp b/fpdfsdk/cpdfsdk_interactiveform.cpp
index 289520d..14f9c71 100644
--- a/fpdfsdk/cpdfsdk_interactiveform.cpp
+++ b/fpdfsdk/cpdfsdk_interactiveform.cpp
@@ -280,7 +280,7 @@
     pContext->OnField_Calculate(pFormField, pField, &sValue, &bRC);
 
     Optional<IJS_Runtime::JS_Error> err = pContext->RunScript(csJS);
-    if (!err && bRC && sValue != sOldValue)
+    if (!err.has_value() && bRC && sValue != sOldValue)
       pField->SetValue(sValue, NotificationOption::kNotify);
   }
 }
@@ -308,7 +308,7 @@
         IJS_Runtime::ScopedEventContext pContext(pRuntime);
         pContext->OnField_Format(pFormField, &sValue);
         Optional<IJS_Runtime::JS_Error> err = pContext->RunScript(script);
-        if (!err)
+        if (!err.has_value())
           return sValue;
       }
     }
diff --git a/fpdfsdk/fpdf_formfill.cpp b/fpdfsdk/fpdf_formfill.cpp
index 04b6606..322c78b 100644
--- a/fpdfsdk/fpdf_formfill.cpp
+++ b/fpdfsdk/fpdf_formfill.cpp
@@ -697,7 +697,7 @@
 
   Optional<FormFieldType> cast_input =
       CPDF_FormField::IntToFormFieldType(fieldType);
-  if (!cast_input)
+  if (!cast_input.has_value())
     return;
 
   if (cast_input.value() == FormFieldType::kUnknown)
diff --git a/fpdfsdk/fpdf_view.cpp b/fpdfsdk/fpdf_view.cpp
index 5f8bf5c..fb35ad8 100644
--- a/fpdfsdk/fpdf_view.cpp
+++ b/fpdfsdk/fpdf_view.cpp
@@ -752,7 +752,7 @@
   const FX_RECT rect(start_x, start_y, start_x + size_x, start_y + size_y);
   Optional<CFX_PointF> pos =
       pPage->DeviceToPage(rect, rotate, CFX_PointF(device_x, device_y));
-  if (!pos)
+  if (!pos.has_value())
     return false;
 
   *page_x = pos->x;
@@ -777,7 +777,7 @@
   const FX_RECT rect(start_x, start_y, start_x + size_x, start_y + size_y);
   CFX_PointF page_point(static_cast<float>(page_x), static_cast<float>(page_y));
   Optional<CFX_PointF> pos = pPage->PageToDevice(rect, rotate, page_point);
-  if (!pos)
+  if (!pos.has_value())
     return false;
 
   *device_x = FXSYS_roundf(pos->x);
@@ -1009,7 +1009,7 @@
 
   CPDF_ViewerPreferences viewRef(pDoc);
   Optional<ByteString> bsVal = viewRef.GenericName(key);
-  if (!bsVal)
+  if (!bsVal.has_value())
     return 0;
 
   return NulTerminateMaybeCopyAndReturnLength(*bsVal, buffer, length);
diff --git a/fxbarcode/datamatrix/BC_ASCIIEncoder.cpp b/fxbarcode/datamatrix/BC_ASCIIEncoder.cpp
index ed51f81..025e8d8 100644
--- a/fxbarcode/datamatrix/BC_ASCIIEncoder.cpp
+++ b/fxbarcode/datamatrix/BC_ASCIIEncoder.cpp
@@ -69,7 +69,7 @@
   if (n >= 2) {
     Optional<wchar_t> code = EncodeASCIIDigits(
         context->m_msg[context->m_pos], context->m_msg[context->m_pos + 1]);
-    if (!code)
+    if (!code.has_value())
       return false;
 
     context->writeCodeword(*code);
diff --git a/fxbarcode/qrcode/BC_QRCoderEncoder.cpp b/fxbarcode/qrcode/BC_QRCoderEncoder.cpp
index 5d7d613..ef12f71 100644
--- a/fxbarcode/qrcode/BC_QRCoderEncoder.cpp
+++ b/fxbarcode/qrcode/BC_QRCoderEncoder.cpp
@@ -455,7 +455,7 @@
       qrCode->GetMatrixWidth(), qrCode->GetMatrixWidth());
   Optional<int32_t> maskPattern = ChooseMaskPattern(
       &finalBits, qrCode->GetECLevel(), qrCode->GetVersion(), matrix.get());
-  if (!maskPattern)
+  if (!maskPattern.has_value())
     return false;
 
   qrCode->SetMaskPattern(*maskPattern);
diff --git a/fxjs/xfa/cfxjse_engine.cpp b/fxjs/xfa/cfxjse_engine.cpp
index 7fdf91e..f437915 100644
--- a/fxjs/xfa/cfxjse_engine.cpp
+++ b/fxjs/xfa/cfxjse_engine.cpp
@@ -489,9 +489,11 @@
   if (pObject->JSObject()->HasMethod(wsPropName))
     return FXJSE_ClassPropType_Method;
 
-  if (bQueryIn &&
-      !XFA_GetScriptAttributeByName(eType, wsPropName.AsStringView())) {
-    return FXJSE_ClassPropType_None;
+  if (bQueryIn) {
+    Optional<XFA_SCRIPTATTRIBUTEINFO> maybe_info =
+        XFA_GetScriptAttributeByName(eType, wsPropName.AsStringView());
+    if (!maybe_info.has_value())
+      return FXJSE_ClassPropType_None;
   }
   return FXJSE_ClassPropType_Property;
 }
@@ -569,7 +571,7 @@
 
   Optional<WideString> wsScript =
       pTextNode->JSObject()->TryCData(XFA_Attribute::Value, true);
-  if (!wsScript)
+  if (!wsScript.has_value())
     return false;
 
   ByteString btScript = wsScript->ToUTF8();
diff --git a/fxjs/xfa/cfxjse_formcalc_context.cpp b/fxjs/xfa/cfxjse_formcalc_context.cpp
index 4c21178..930b1aa 100644
--- a/fxjs/xfa/cfxjse_formcalc_context.cpp
+++ b/fxjs/xfa/cfxjse_formcalc_context.cpp
@@ -1597,7 +1597,7 @@
         if (CXFA_Node* pXFANode = pNode->AsNode()) {
           Optional<WideString> ret =
               pXFANode->JSObject()->TryAttribute(XFA_Attribute::Name, false);
-          if (ret)
+          if (ret.has_value())
             wsName = *ret;
         }
         if (wsName.IsEmpty())
diff --git a/fxjs/xfa/cjx_field.cpp b/fxjs/xfa/cjx_field.cpp
index d2e223d..c0e813e 100644
--- a/fxjs/xfa/cjx_field.cpp
+++ b/fxjs/xfa/cjx_field.cpp
@@ -111,7 +111,7 @@
     return CJS_Result::Success(runtime->NewNull());
 
   Optional<WideString> value = node->GetChoiceListItem(iIndex, true);
-  if (!value)
+  if (!value.has_value())
     return CJS_Result::Success(runtime->NewNull());
 
   return CJS_Result::Success(
@@ -177,7 +177,7 @@
     return CJS_Result::Success(runtime->NewNull());
 
   Optional<WideString> value = node->GetChoiceListItem(iIndex, false);
-  if (!value)
+  if (!value.has_value())
     return CJS_Result::Success(runtime->NewNull());
 
   return CJS_Result::Success(
diff --git a/fxjs/xfa/cjx_object.cpp b/fxjs/xfa/cjx_object.cpp
index 3c5aa1b..7f1a6eb 100644
--- a/fxjs/xfa/cjx_object.cpp
+++ b/fxjs/xfa/cjx_object.cpp
@@ -209,7 +209,8 @@
     case XFA_AttributeType::Enum: {
       Optional<XFA_AttributeValue> item =
           XFA_GetAttributeValueByName(wsValue.AsStringView());
-      SetEnum(eAttr, item ? *item : *(GetXFANode()->GetDefaultEnum(eAttr)),
+      SetEnum(eAttr,
+              item.has_value() ? *item : *(GetXFANode()->GetDefaultEnum(eAttr)),
               bNotify);
       break;
     }
@@ -263,7 +264,7 @@
   switch (GetXFANode()->GetAttributeType(eAttr)) {
     case XFA_AttributeType::Enum: {
       Optional<XFA_AttributeValue> value = TryEnum(eAttr, bUseDefault);
-      if (!value)
+      if (!value.has_value())
         return {};
       return WideString::FromASCII(XFA_AttributeValueToName(*value));
     }
@@ -272,19 +273,19 @@
 
     case XFA_AttributeType::Boolean: {
       Optional<bool> value = TryBoolean(eAttr, bUseDefault);
-      if (!value)
+      if (!value.has_value())
         return {};
       return WideString(*value ? L"1" : L"0");
     }
     case XFA_AttributeType::Integer: {
       Optional<int32_t> iValue = TryInteger(eAttr, bUseDefault);
-      if (!iValue)
+      if (!iValue.has_value())
         return {};
       return WideString::Format(L"%d", *iValue);
     }
     case XFA_AttributeType::Measure: {
       Optional<CXFA_Measurement> value = TryMeasure(eAttr, bUseDefault);
-      if (!value)
+      if (!value.has_value())
         return {};
 
       return value->ToString();
@@ -397,7 +398,7 @@
 
 Optional<float> CJX_Object::TryMeasureAsFloat(XFA_Attribute attr) const {
   Optional<CXFA_Measurement> measure = TryMeasure(attr, false);
-  if (!measure)
+  if (!measure.has_value())
     return pdfium::nullopt;
   return measure->ToUnit(XFA_Unit::Pt);
 }
@@ -613,7 +614,7 @@
       if (GetXFANode()->GetElementType() == XFA_Element::ExData) {
         Optional<WideString> ret =
             TryAttribute(XFA_Attribute::ContentType, false);
-        if (ret)
+        if (ret.has_value())
           wsContentType = *ret;
         if (wsContentType.EqualsASCII("text/html")) {
           wsContentType.clear();
diff --git a/samples/pdfium_test.cc b/samples/pdfium_test.cc
index 7967758..8f31b1d 100644
--- a/samples/pdfium_test.cc
+++ b/samples/pdfium_test.cc
@@ -532,8 +532,8 @@
         return false;
       }
       std::string path = value;
-      auto expanded_path = ExpandDirectoryPath(path);
-      if (!expanded_path) {
+      Optional<std::string> expanded_path = ExpandDirectoryPath(path);
+      if (!expanded_path.has_value()) {
         fprintf(stderr, "Failed to expand --font-dir, %s\n", path.c_str());
         return false;
       }
@@ -581,8 +581,8 @@
         return false;
       }
       std::string path = value;
-      auto expanded_path = ExpandDirectoryPath(path);
-      if (!expanded_path) {
+      Optional<std::string> expanded_path = ExpandDirectoryPath(path);
+      if (!expanded_path.has_value()) {
         fprintf(stderr, "Failed to expand --bin-dir, %s\n", path.c_str());
         return false;
       }
diff --git a/xfa/fxfa/cxfa_ffbarcode.cpp b/xfa/fxfa/cxfa_ffbarcode.cpp
index 9a73b2d..e564133 100644
--- a/xfa/fxfa/cxfa_ffbarcode.cpp
+++ b/xfa/fxfa/cxfa_ffbarcode.cpp
@@ -195,56 +195,56 @@
   pBarCodeWidget->SetType(info->eBCType);
 
   Optional<WideString> encoding_string = barcode_->GetCharEncoding();
-  if (encoding_string) {
+  if (encoding_string.has_value()) {
     Optional<BC_CHAR_ENCODING> encoding =
         CharEncodingFromString(*encoding_string);
-    if (encoding)
+    if (encoding.has_value())
       pBarCodeWidget->SetCharEncoding(*encoding);
   }
 
   Optional<bool> calcChecksum = barcode_->GetChecksum();
-  if (calcChecksum)
+  if (calcChecksum.has_value())
     pBarCodeWidget->SetCalChecksum(*calcChecksum);
 
   Optional<int32_t> dataLen = barcode_->GetDataLength();
-  if (dataLen)
+  if (dataLen.has_value())
     pBarCodeWidget->SetDataLength(*dataLen);
 
   Optional<char> startChar = barcode_->GetStartChar();
-  if (startChar)
+  if (startChar.has_value())
     pBarCodeWidget->SetStartChar(*startChar);
 
   Optional<char> endChar = barcode_->GetEndChar();
-  if (endChar)
+  if (endChar.has_value())
     pBarCodeWidget->SetEndChar(*endChar);
 
   Optional<int32_t> ecLevel = barcode_->GetECLevel();
-  if (ecLevel)
+  if (ecLevel.has_value())
     pBarCodeWidget->SetErrorCorrectionLevel(*ecLevel);
 
   Optional<int32_t> width = barcode_->GetModuleWidth();
-  if (width)
+  if (width.has_value())
     pBarCodeWidget->SetModuleWidth(*width);
 
   Optional<int32_t> height = barcode_->GetModuleHeight();
-  if (height)
+  if (height.has_value())
     pBarCodeWidget->SetModuleHeight(*height);
 
   Optional<bool> printCheck = barcode_->GetPrintChecksum();
-  if (printCheck)
+  if (printCheck.has_value())
     pBarCodeWidget->SetPrintChecksum(*printCheck);
 
   Optional<XFA_AttributeValue> text_attr = barcode_->GetTextLocation();
-  if (text_attr) {
+  if (text_attr.has_value()) {
     Optional<BC_TEXT_LOC> textLoc = TextLocFromAttribute(*text_attr);
-    if (textLoc)
+    if (textLoc.has_value())
       pBarCodeWidget->SetTextLocation(*textLoc);
   }
 
   // Truncated is currently not a supported flag.
 
   Optional<int8_t> ratio = barcode_->GetWideNarrowRatio();
-  if (ratio)
+  if (ratio.has_value())
     pBarCodeWidget->SetWideNarrowRatio(*ratio);
 
   if (info->eName == BarcodeType::code3Of9 ||
diff --git a/xfa/fxfa/cxfa_ffdatetimeedit.cpp b/xfa/fxfa/cxfa_ffdatetimeedit.cpp
index a8b5f7d..0cd34ee 100644
--- a/xfa/fxfa/cxfa_ffdatetimeedit.cpp
+++ b/xfa/fxfa/cxfa_ffdatetimeedit.cpp
@@ -93,7 +93,7 @@
 
   uint32_t dwEditStyles = 0;
   Optional<int32_t> numCells = m_pNode->GetNumberOfCells();
-  if (numCells && *numCells > 0) {
+  if (numCells.has_value() && *numCells > 0) {
     dwEditStyles |= FWL_STYLEEXT_EDT_CombText;
     pPicker->SetEditLimit(*numCells);
   }
diff --git a/xfa/fxfa/cxfa_ffnumericedit.cpp b/xfa/fxfa/cxfa_ffnumericedit.cpp
index e464d71..2067ffa 100644
--- a/xfa/fxfa/cxfa_ffnumericedit.cpp
+++ b/xfa/fxfa/cxfa_ffnumericedit.cpp
@@ -56,7 +56,7 @@
     dwExtendedStyle |= FWL_STYLEEXT_EDT_AutoHScroll;
 
   Optional<int32_t> numCells = m_pNode->GetNumberOfCells();
-  if (numCells && *numCells > 0) {
+  if (numCells.has_value() && *numCells > 0) {
     dwExtendedStyle |= FWL_STYLEEXT_EDT_CombText;
     pWidget->SetLimit(*numCells);
   }
diff --git a/xfa/fxfa/cxfa_ffpageview.cpp b/xfa/fxfa/cxfa_ffpageview.cpp
index ab92161..6d357c6 100644
--- a/xfa/fxfa/cxfa_ffpageview.cpp
+++ b/xfa/fxfa/cxfa_ffpageview.cpp
@@ -431,7 +431,7 @@
     if (pTraverse) {
       Optional<WideString> traverseWidgetName =
           pTraverse->JSObject()->TryAttribute(XFA_Attribute::Ref, true);
-      if (traverseWidgetName)
+      if (traverseWidgetName.has_value())
         return FindWidgetByName(*traverseWidgetName, pWidget);
     }
   }
diff --git a/xfa/fxfa/cxfa_fftextedit.cpp b/xfa/fxfa/cxfa_fftextedit.cpp
index 92e139c..5c0b665 100644
--- a/xfa/fxfa/cxfa_fftextedit.cpp
+++ b/xfa/fxfa/cxfa_fftextedit.cpp
@@ -103,7 +103,7 @@
     iMaxChars = 0;
 
   Optional<int32_t> numCells = m_pNode->GetNumberOfCells();
-  if (!numCells) {
+  if (!numCells.has_value()) {
     pWidget->SetLimit(iMaxChars);
   } else if (*numCells == 0) {
     dwExtendedStyle |= FWL_STYLEEXT_EDT_CombText;
@@ -273,7 +273,7 @@
 
   bool bUpdate = false;
   if (m_pNode->GetFFWidgetType() == XFA_FFWidgetType::kTextEdit &&
-      !m_pNode->GetNumberOfCells()) {
+      !m_pNode->GetNumberOfCells().has_value()) {
     XFA_Element elementType;
     int32_t iMaxChars;
     std::tie(elementType, iMaxChars) = m_pNode->GetMaxChars();
diff --git a/xfa/fxfa/cxfa_textlayout.cpp b/xfa/fxfa/cxfa_textlayout.cpp
index 2872d9a..c760d47 100644
--- a/xfa/fxfa/cxfa_textlayout.cpp
+++ b/xfa/fxfa/cxfa_textlayout.cpp
@@ -812,7 +812,7 @@
         } else {
           Optional<WideString> obj =
               m_pTextParser->GetEmbeddedObj(m_pTextProvider, pXMLNode);
-          if (obj)
+          if (obj.has_value())
             wsText = *obj;
         }
       }
diff --git a/xfa/fxfa/cxfa_textprovider.cpp b/xfa/fxfa/cxfa_textprovider.cpp
index 176d70c..824d7d4 100644
--- a/xfa/fxfa/cxfa_textprovider.cpp
+++ b/xfa/fxfa/cxfa_textprovider.cpp
@@ -143,7 +143,7 @@
 bool CXFA_TextProvider::IsCheckButtonAndAutoWidth() const {
   if (m_pNode->GetFFWidgetType() != XFA_FFWidgetType::kCheckButton)
     return false;
-  return !m_pNode->TryWidth();
+  return !m_pNode->TryWidth().has_value();
 }
 
 Optional<WideString> CXFA_TextProvider::GetEmbeddedObj(
diff --git a/xfa/fxfa/layout/cxfa_contentlayoutprocessor.cpp b/xfa/fxfa/layout/cxfa_contentlayoutprocessor.cpp
index e3726aa..8a4f613 100644
--- a/xfa/fxfa/layout/cxfa_contentlayoutprocessor.cpp
+++ b/xfa/fxfa/layout/cxfa_contentlayoutprocessor.cpp
@@ -95,14 +95,14 @@
   if (eType == XFA_Element::Subform || eType == XFA_Element::ExclGroup) {
     Optional<CXFA_Measurement> wValue =
         pFormNode->JSObject()->TryMeasure(XFA_Attribute::W, false);
-    if (wValue && wValue->GetValue() > kXFALayoutPrecision) {
+    if (wValue.has_value() && wValue->GetValue() > kXFALayoutPrecision) {
       containerSize.width = wValue->ToUnit(XFA_Unit::Pt);
       *bContainerWidthAutoSize = false;
     }
 
     Optional<CXFA_Measurement> hValue =
         pFormNode->JSObject()->TryMeasure(XFA_Attribute::H, false);
-    if (hValue && hValue->GetValue() > kXFALayoutPrecision) {
+    if (hValue.has_value() && hValue->GetValue() > kXFALayoutPrecision) {
       containerSize.height = hValue->ToUnit(XFA_Unit::Pt);
       *bContainerHeightAutoSize = false;
     }
@@ -111,14 +111,14 @@
   if (*bContainerWidthAutoSize && eType == XFA_Element::Subform) {
     Optional<CXFA_Measurement> maxW =
         pFormNode->JSObject()->TryMeasure(XFA_Attribute::MaxW, false);
-    if (maxW && maxW->GetValue() > kXFALayoutPrecision) {
+    if (maxW.has_value() && maxW->GetValue() > kXFALayoutPrecision) {
       containerSize.width = maxW->ToUnit(XFA_Unit::Pt);
       *bContainerWidthAutoSize = false;
     }
 
     Optional<CXFA_Measurement> maxH =
         pFormNode->JSObject()->TryMeasure(XFA_Attribute::MaxH, false);
-    if (maxH && maxH->GetValue() > kXFALayoutPrecision) {
+    if (maxH.has_value() && maxH->GetValue() > kXFALayoutPrecision) {
       containerSize.height = maxH->ToUnit(XFA_Unit::Pt);
       *bContainerHeightAutoSize = false;
     }
@@ -141,12 +141,12 @@
     if (pMarginNode) {
       Optional<CXFA_Measurement> leftInset =
           pMarginNode->JSObject()->TryMeasure(XFA_Attribute::LeftInset, false);
-      if (leftInset)
+      if (leftInset.has_value())
         componentSize.width += leftInset->ToUnit(XFA_Unit::Pt);
 
       Optional<CXFA_Measurement> rightInset =
           pMarginNode->JSObject()->TryMeasure(XFA_Attribute::RightInset, false);
-      if (rightInset)
+      if (rightInset.has_value())
         componentSize.width += rightInset->ToUnit(XFA_Unit::Pt);
     }
   }
@@ -156,13 +156,13 @@
     if (pMarginNode) {
       Optional<CXFA_Measurement> topInset =
           pMarginNode->JSObject()->TryMeasure(XFA_Attribute::TopInset, false);
-      if (topInset)
+      if (topInset.has_value())
         componentSize.height += topInset->ToUnit(XFA_Unit::Pt);
 
       Optional<CXFA_Measurement> bottomInset =
           pMarginNode->JSObject()->TryMeasure(XFA_Attribute::BottomInset,
                                               false);
-      if (bottomInset)
+      if (bottomInset.has_value())
         componentSize.height += bottomInset->ToUnit(XFA_Unit::Pt);
     }
   }
@@ -340,7 +340,7 @@
   *bRootForceTb = false;
   Optional<XFA_AttributeValue> layoutMode =
       pFormNode->JSObject()->TryEnum(XFA_Attribute::Layout, false);
-  if (layoutMode)
+  if (layoutMode.has_value())
     return *layoutMode;
 
   CXFA_Node* pParentNode = pFormNode->GetParent();
@@ -369,7 +369,7 @@
 
     Optional<XFA_AttributeValue> previous =
         pKeep->JSObject()->TryEnum(eKeepType, false);
-    if (previous) {
+    if (previous.has_value()) {
       if (*previous == XFA_AttributeValue::ContentArea ||
           *previous == XFA_AttributeValue::PageArea) {
         return true;
@@ -387,7 +387,7 @@
 
   Optional<XFA_AttributeValue> next =
       pKeep->JSObject()->TryEnum(eKeepType, false);
-  if (!next)
+  if (!next.has_value())
     return false;
   if (*next == XFA_AttributeValue::ContentArea ||
       *next == XFA_AttributeValue::PageArea) {
diff --git a/xfa/fxfa/layout/cxfa_viewlayoutprocessor.cpp b/xfa/fxfa/layout/cxfa_viewlayoutprocessor.cpp
index 17fd7fa..f207e8c 100644
--- a/xfa/fxfa/layout/cxfa_viewlayoutprocessor.cpp
+++ b/xfa/fxfa/layout/cxfa_viewlayoutprocessor.cpp
@@ -1156,7 +1156,7 @@
     if (pOccurNode) {
       Optional<int32_t> ret =
           pOccurNode->JSObject()->TryInteger(XFA_Attribute::Max, false);
-      if (ret)
+      if (ret.has_value())
         iMax = *ret;
     }
     if (iMax >= 0 && iMax <= iPageSetCount)
@@ -1325,7 +1325,7 @@
 
   Optional<XFA_AttributeValue> ret =
       pPageArea->JSObject()->TryEnum(XFA_Attribute::OddOrEven, true);
-  if (!ret || *ret == XFA_AttributeValue::Any)
+  if (!ret.has_value() || *ret == XFA_AttributeValue::Any)
     return true;
 
   int32_t iPageLast = GetPageCount() % 2;
@@ -1354,7 +1354,7 @@
       if (pOccurNode) {
         Optional<int32_t> ret =
             pOccurNode->JSObject()->TryInteger(XFA_Attribute::Max, false);
-        if (ret)
+        if (ret.has_value())
           iMax = *ret;
       }
       if ((iMax < 0 || m_nCurPageCount < iMax)) {
@@ -1461,11 +1461,11 @@
       pPageArea->GetFirstChildByClass<CXFA_Occur>(XFA_Element::Occur);
   if (pOccurNode) {
     ret = pOccurNode->JSObject()->TryInteger(XFA_Attribute::Min, false);
-    if (ret)
+    if (ret.has_value())
       iMin = *ret;
   }
 
-  if (!ret && !bTargetPageArea)
+  if (!ret.has_value() && !bTargetPageArea)
     return iMin;
 
   CXFA_Node* pContentArea = pPageArea->GetFirstChildByClass<CXFA_ContentArea>(
@@ -1502,7 +1502,7 @@
 
   Optional<int32_t> iMin =
       pOccurNode->JSObject()->TryInteger(XFA_Attribute::Min, false);
-  if (!iMin || iCurSetCount >= *iMin)
+  if (!iMin.has_value() || iCurSetCount >= *iMin)
     return;
 
   for (int32_t i = 0; i < *iMin - iCurSetCount; i++) {
@@ -1568,10 +1568,10 @@
   Optional<int32_t> ret;
   if (pOccurNode) {
     ret = pOccurNode->JSObject()->TryInteger(XFA_Attribute::Max, false);
-    if (ret)
+    if (ret.has_value())
       iMax = *ret;
   }
-  if (ret) {
+  if (ret.has_value()) {
     if (m_nCurPageCount == iMax) {
       CXFA_Node* pSrcPage = m_pCurPageArea;
       int32_t nSrcPageCount = m_nCurPageCount;
diff --git a/xfa/fxfa/parser/cxfa_barcode.cpp b/xfa/fxfa/parser/cxfa_barcode.cpp
index 3e028ca..5ae3b66 100644
--- a/xfa/fxfa/parser/cxfa_barcode.cpp
+++ b/xfa/fxfa/parser/cxfa_barcode.cpp
@@ -71,7 +71,7 @@
 Optional<bool> CXFA_Barcode::GetChecksum() {
   Optional<XFA_AttributeValue> checksum =
       JSObject()->TryEnum(XFA_Attribute::Checksum, true);
-  if (!checksum)
+  if (!checksum.has_value())
     return {};
 
   switch (*checksum) {
@@ -91,7 +91,7 @@
 Optional<int32_t> CXFA_Barcode::GetDataLength() {
   Optional<WideString> wsDataLength =
       JSObject()->TryCData(XFA_Attribute::DataLength, true);
-  if (!wsDataLength)
+  if (!wsDataLength.has_value())
     return {};
 
   return {FXSYS_wtoi(wsDataLength->c_str())};
@@ -100,7 +100,7 @@
 Optional<char> CXFA_Barcode::GetStartChar() {
   Optional<WideString> wsStartEndChar =
       JSObject()->TryCData(XFA_Attribute::StartChar, true);
-  if (!wsStartEndChar || wsStartEndChar->IsEmpty())
+  if (!wsStartEndChar.has_value() || wsStartEndChar->IsEmpty())
     return {};
 
   return {static_cast<char>((*wsStartEndChar)[0])};
@@ -109,7 +109,7 @@
 Optional<char> CXFA_Barcode::GetEndChar() {
   Optional<WideString> wsStartEndChar =
       JSObject()->TryCData(XFA_Attribute::EndChar, true);
-  if (!wsStartEndChar || wsStartEndChar->IsEmpty())
+  if (!wsStartEndChar.has_value() || wsStartEndChar->IsEmpty())
     return {};
 
   return {static_cast<char>((*wsStartEndChar)[0])};
@@ -118,7 +118,7 @@
 Optional<int32_t> CXFA_Barcode::GetECLevel() {
   Optional<WideString> wsECLevel =
       JSObject()->TryCData(XFA_Attribute::ErrorCorrectionLevel, true);
-  if (!wsECLevel)
+  if (!wsECLevel.has_value())
     return {};
   return {FXSYS_wtoi(wsECLevel->c_str())};
 }
@@ -126,7 +126,7 @@
 Optional<int32_t> CXFA_Barcode::GetModuleWidth() {
   Optional<CXFA_Measurement> moduleWidthHeight =
       JSObject()->TryMeasure(XFA_Attribute::ModuleWidth, true);
-  if (!moduleWidthHeight)
+  if (!moduleWidthHeight.has_value())
     return {};
 
   return {static_cast<int32_t>(moduleWidthHeight->ToUnit(XFA_Unit::Pt))};
@@ -135,7 +135,7 @@
 Optional<int32_t> CXFA_Barcode::GetModuleHeight() {
   Optional<CXFA_Measurement> moduleWidthHeight =
       JSObject()->TryMeasure(XFA_Attribute::ModuleHeight, true);
-  if (!moduleWidthHeight)
+  if (!moduleWidthHeight.has_value())
     return {};
 
   return {static_cast<int32_t>(moduleWidthHeight->ToUnit(XFA_Unit::Pt))};
@@ -156,11 +156,11 @@
 Optional<int8_t> CXFA_Barcode::GetWideNarrowRatio() {
   Optional<WideString> wsWideNarrowRatio =
       JSObject()->TryCData(XFA_Attribute::WideNarrowRatio, true);
-  if (!wsWideNarrowRatio)
+  if (!wsWideNarrowRatio.has_value())
     return {};
 
   Optional<size_t> ptPos = wsWideNarrowRatio->Find(':');
-  if (!ptPos)
+  if (!ptPos.has_value())
     return {static_cast<int8_t>(FXSYS_wtoi(wsWideNarrowRatio->c_str()))};
 
   int32_t fB = FXSYS_wtoi(
diff --git a/xfa/fxfa/parser/cxfa_box.cpp b/xfa/fxfa/parser/cxfa_box.cpp
index 772db0f..ff00a0d 100644
--- a/xfa/fxfa/parser/cxfa_box.cpp
+++ b/xfa/fxfa/parser/cxfa_box.cpp
@@ -257,7 +257,7 @@
   rtDraw.height = b + b;
   Optional<int32_t> startAngle = GetStartAngle();
   Optional<int32_t> sweepAngle = GetSweepAngle();
-  if (!startAngle && !sweepAngle) {
+  if (!startAngle.has_value() && !sweepAngle.has_value()) {
     fillPath->AddEllipse(rtDraw);
     return;
   }
diff --git a/xfa/fxfa/parser/cxfa_color.cpp b/xfa/fxfa/parser/cxfa_color.cpp
index ef77b7f..3f3da16 100644
--- a/xfa/fxfa/parser/cxfa_color.cpp
+++ b/xfa/fxfa/parser/cxfa_color.cpp
@@ -41,12 +41,12 @@
 
 FX_ARGB CXFA_Color::GetValue() {
   Optional<WideString> val = JSObject()->TryCData(XFA_Attribute::Value, false);
-  return val ? StringToFXARGB(val->AsStringView()) : 0xFF000000;
+  return val.has_value() ? StringToFXARGB(val->AsStringView()) : 0xFF000000;
 }
 
 FX_ARGB CXFA_Color::GetValueOrDefault(FX_ARGB defaultValue) {
   Optional<WideString> val = JSObject()->TryCData(XFA_Attribute::Value, false);
-  return val ? StringToFXARGB(val->AsStringView()) : defaultValue;
+  return val.has_value() ? StringToFXARGB(val->AsStringView()) : defaultValue;
 }
 
 void CXFA_Color::SetValue(FX_ARGB color) {
diff --git a/xfa/fxfa/parser/cxfa_document.cpp b/xfa/fxfa/parser/cxfa_document.cpp
index 1ac2e2c..99008b2 100644
--- a/xfa/fxfa/parser/cxfa_document.cpp
+++ b/xfa/fxfa/parser/cxfa_document.cpp
@@ -1341,12 +1341,12 @@
 
         Optional<WideString> namespaceURI =
             pDatasetsChild->JSObject()->TryNamespace();
-        if (!namespaceURI)
+        if (!namespaceURI.has_value())
           continue;
 
         Optional<WideString> datasetsURI =
             pDatasetsNode->JSObject()->TryNamespace();
-        if (!datasetsURI)
+        if (!datasetsURI.has_value())
           continue;
         if (*namespaceURI == *datasetsURI)
           return pDatasetsChild;
@@ -1690,7 +1690,7 @@
     } else if (!pDataRoot && pChildNode->GetNameHash() == XFA_HASHCODE_Data) {
       Optional<WideString> namespaceURI =
           pChildNode->JSObject()->TryNamespace();
-      if (!namespaceURI)
+      if (!namespaceURI.has_value())
         continue;
       if (*namespaceURI == wsDatasetsURI)
         pDataRoot = pChildNode;
diff --git a/xfa/fxfa/parser/cxfa_node.cpp b/xfa/fxfa/parser/cxfa_node.cpp
index 32ef519..0330b0b 100644
--- a/xfa/fxfa/parser/cxfa_node.cpp
+++ b/xfa/fxfa/parser/cxfa_node.cpp
@@ -1452,7 +1452,7 @@
       layout.value_or(XFA_AttributeValue::Position);
   if (pKeep) {
     Optional<XFA_AttributeValue> intact = GetIntactFromKeep(pKeep, eLayoutType);
-    if (intact)
+    if (intact.has_value())
       return *intact;
   }
 
@@ -1485,7 +1485,7 @@
       if (eParLayout == XFA_AttributeValue::Tb && version < XFA_VERSION_208) {
         Optional<CXFA_Measurement> measureH =
             JSObject()->TryMeasure(XFA_Attribute::H, false);
-        if (measureH)
+        if (measureH.has_value())
           return XFA_AttributeValue::ContentArea;
       }
       return XFA_AttributeValue::None;
@@ -2020,14 +2020,14 @@
 
 Optional<bool> CXFA_Node::GetDefaultBoolean(XFA_Attribute attr) const {
   Optional<void*> value = GetDefaultValue(attr, XFA_AttributeType::Boolean);
-  if (!value)
+  if (!value.has_value())
     return {};
   return {!!*value};
 }
 
 Optional<int32_t> CXFA_Node::GetDefaultInteger(XFA_Attribute attr) const {
   Optional<void*> value = GetDefaultValue(attr, XFA_AttributeType::Integer);
-  if (!value)
+  if (!value.has_value())
     return {};
   return {static_cast<int32_t>(reinterpret_cast<uintptr_t>(*value))};
 }
@@ -2035,7 +2035,7 @@
 Optional<CXFA_Measurement> CXFA_Node::GetDefaultMeasurement(
     XFA_Attribute attr) const {
   Optional<void*> value = GetDefaultValue(attr, XFA_AttributeType::Measure);
-  if (!value)
+  if (!value.has_value())
     return {};
 
   WideString str = WideString(static_cast<const wchar_t*>(*value));
@@ -2044,7 +2044,7 @@
 
 Optional<WideString> CXFA_Node::GetDefaultCData(XFA_Attribute attr) const {
   Optional<void*> value = GetDefaultValue(attr, XFA_AttributeType::CData);
-  if (!value)
+  if (!value.has_value())
     return {};
 
   return {WideString(static_cast<const wchar_t*>(*value))};
@@ -2053,7 +2053,7 @@
 Optional<XFA_AttributeValue> CXFA_Node::GetDefaultEnum(
     XFA_Attribute attr) const {
   Optional<void*> value = GetDefaultValue(attr, XFA_AttributeType::Enum);
-  if (!value)
+  if (!value.has_value())
     return {};
   return {static_cast<XFA_AttributeValue>(reinterpret_cast<uintptr_t>(*value))};
 }
@@ -2231,7 +2231,7 @@
 int32_t CXFA_Node::GetRotate() const {
   Optional<int32_t> degrees =
       JSObject()->TryInteger(XFA_Attribute::Rotate, false);
-  return degrees ? XFA_MapRotation(*degrees) / 90 * 90 : 0;
+  return degrees.has_value() ? XFA_MapRotation(*degrees) / 90 * 90 : 0;
 }
 
 CXFA_Border* CXFA_Node::GetBorderIfExists() const {
@@ -2343,8 +2343,8 @@
 
   Optional<XFA_AttributeValue> value =
       pKeep->JSObject()->TryEnum(XFA_Attribute::Previous, false);
-  if (value && (*value == XFA_AttributeValue::ContentArea ||
-                *value == XFA_AttributeValue::PageArea)) {
+  if (value.has_value() && (*value == XFA_AttributeValue::ContentArea ||
+                            *value == XFA_AttributeValue::PageArea)) {
     return XFA_AttributeValue::ContentArea;
   }
 
@@ -2355,7 +2355,7 @@
 
   Optional<XFA_AttributeValue> ret =
       pNode->JSObject()->TryEnum(XFA_Attribute::Next, false);
-  if (!ret)
+  if (!ret.has_value())
     return intact;
 
   return (*ret == XFA_AttributeValue::ContentArea ||
@@ -3004,15 +3004,16 @@
     float fThickness = 0;
     XFA_AttributeValue iType = XFA_AttributeValue::Unknown;
     std::tie(iType, bVisible, fThickness) = border->Get3DStyle();
-    if (!left || !top || !right || !bottom) {
+    if (!left.has_value() || !top.has_value() || !right.has_value() ||
+        !bottom.has_value()) {
       std::vector<CXFA_Stroke*> strokes = border->GetStrokes();
-      if (!top)
+      if (!top.has_value())
         top = GetEdgeThickness(strokes, bVisible, 0);
-      if (!right)
+      if (!right.has_value())
         right = GetEdgeThickness(strokes, bVisible, 1);
-      if (!bottom)
+      if (!bottom.has_value())
         bottom = GetEdgeThickness(strokes, bVisible, 2);
-      if (!left)
+      if (!left.has_value())
         left = GetEdgeThickness(strokes, bVisible, 3);
     }
   }
@@ -3242,28 +3243,28 @@
     pSize->width += para->GetMarginLeft() + para->GetTextIndent();
 
   Optional<float> width = TryWidth();
-  if (width) {
+  if (width.has_value()) {
     pSize->width = *width;
   } else {
     Optional<float> min = TryMinWidth();
-    if (min)
+    if (min.has_value())
       pSize->width = std::max(pSize->width, *min);
 
     Optional<float> max = TryMaxWidth();
-    if (max && *max > 0)
+    if (max.has_value() && *max > 0)
       pSize->width = std::min(pSize->width, *max);
   }
 
   Optional<float> height = TryHeight();
-  if (height) {
+  if (height.has_value()) {
     pSize->height = *height;
   } else {
     Optional<float> min = TryMinHeight();
-    if (min)
+    if (min.has_value())
       pSize->height = std::max(pSize->height, *min);
 
     Optional<float> max = TryMaxHeight();
-    if (max && *max > 0)
+    if (max.has_value() && *max > 0)
       pSize->height = std::min(pSize->height, *max);
   }
   return true;
@@ -3372,7 +3373,7 @@
 
   CFX_RectF rtFit;
   Optional<float> width = TryWidth();
-  if (width) {
+  if (width.has_value()) {
     rtFit.width = *width;
     GetWidthWithoutMargin(rtFit.width);
   } else {
@@ -3380,7 +3381,7 @@
   }
 
   Optional<float> height = TryHeight();
-  if (height) {
+  if (height.has_value()) {
     rtFit.height = *height;
     GetHeightWithoutMargin(rtFit.height);
   } else {
@@ -3446,11 +3447,11 @@
     fWidthCalc += margin->GetLeftInset() + margin->GetRightInset();
 
   Optional<float> min = TryMinWidth();
-  if (min)
+  if (min.has_value())
     fWidthCalc = std::max(fWidthCalc, *min);
 
   Optional<float> max = TryMaxWidth();
-  if (max && *max > 0)
+  if (max.has_value() && *max > 0)
     fWidthCalc = std::min(fWidthCalc, *max);
 
   return fWidthCalc;
@@ -3469,11 +3470,11 @@
     fHeightCalc += margin->GetTopInset() + margin->GetBottomInset();
 
   Optional<float> min = TryMinHeight();
-  if (min)
+  if (min.has_value())
     fHeightCalc = std::max(fHeightCalc, *min);
 
   Optional<float> max = TryMaxHeight();
-  if (max && *max > 0)
+  if (max.has_value() && *max > 0)
     fHeightCalc = std::min(fHeightCalc, *max);
 
   return fHeightCalc;
@@ -3503,7 +3504,7 @@
   float fWidth = 0;
   if (*pCalcWidth > 0 && *pCalcHeight < 0) {
     Optional<float> height = TryHeight();
-    if (height) {
+    if (height.has_value()) {
       *pCalcHeight = *height;
     } else {
       CFX_SizeF size = CalculateAccWidthAndHeight(doc, *pCalcWidth);
@@ -3517,14 +3518,13 @@
   if (*pCalcWidth < 0 && *pCalcHeight < 0) {
     Optional<float> height;
     Optional<float> width = TryWidth();
-    if (width) {
+    if (width.has_value()) {
       fWidth = *width;
-
       height = TryHeight();
-      if (height)
+      if (height.has_value())
         *pCalcHeight = *height;
     }
-    if (!width || !height) {
+    if (!width.has_value() || !height.has_value()) {
       CFX_SizeF size = CalculateAccWidthAndHeight(doc, fWidth);
       *pCalcWidth = size.width;
       *pCalcHeight = size.height;
@@ -3856,7 +3856,7 @@
   }
   if (*pCalcWidth < 0 && *pCalcHeight < 0) {
     Optional<float> width = TryWidth();
-    if (width) {
+    if (width.has_value()) {
       pTextLayout->StartLayout(GetWidthWithoutMargin(*width));
       *pCalcWidth = *width;
     } else {
@@ -3989,7 +3989,7 @@
   int32_t i = 0;
   while (pText) {
     Optional<WideString> wsContent = pText->JSObject()->TryContent(false, true);
-    if (wsContent && *wsContent == wsValue)
+    if (wsContent.has_value() && *wsContent == wsValue)
       return static_cast<XFA_CheckState>(i);
 
     i++;
@@ -4720,7 +4720,7 @@
                 0, XFA_Element::Picture, false)) {
           Optional<WideString> picture =
               pPicture->JSObject()->TryContent(false, true);
-          if (picture)
+          if (picture.has_value())
             return *picture;
         }
       }
@@ -4755,7 +4755,7 @@
                 pUI->GetChild<CXFA_Picture>(0, XFA_Element::Picture, false)) {
           Optional<WideString> picture =
               pPicture->JSObject()->TryContent(false, true);
-          if (picture)
+          if (picture.has_value())
             return *picture;
         }
       }
diff --git a/xfa/fxfa/parser/cxfa_occur.cpp b/xfa/fxfa/parser/cxfa_occur.cpp
index bdcfc3c..a9281bc 100644
--- a/xfa/fxfa/parser/cxfa_occur.cpp
+++ b/xfa/fxfa/parser/cxfa_occur.cpp
@@ -42,12 +42,12 @@
 
 int32_t CXFA_Occur::GetMax() {
   Optional<int32_t> max = JSObject()->TryInteger(XFA_Attribute::Max, true);
-  return max ? *max : GetMin();
+  return max.has_value() ? *max : GetMin();
 }
 
 int32_t CXFA_Occur::GetMin() {
   Optional<int32_t> min = JSObject()->TryInteger(XFA_Attribute::Min, true);
-  return min && *min >= 0 ? *min : 1;
+  return min.has_value() && *min >= 0 ? *min : 1;
 }
 
 std::tuple<int32_t, int32_t, int32_t> CXFA_Occur::GetOccurInfo() {
@@ -56,7 +56,7 @@
 
   Optional<int32_t> init =
       JSObject()->TryInteger(XFA_Attribute::Initial, false);
-  return {iMin, iMax, init && *init >= iMin ? *init : iMin};
+  return {iMin, iMax, init.has_value() && *init >= iMin ? *init : iMin};
 }
 
 void CXFA_Occur::SetMax(int32_t iMax) {
diff --git a/xfa/fxfa/parser/cxfa_validate.cpp b/xfa/fxfa/parser/cxfa_validate.cpp
index 4834cb3..44e8cd8 100644
--- a/xfa/fxfa/parser/cxfa_validate.cpp
+++ b/xfa/fxfa/parser/cxfa_validate.cpp
@@ -65,7 +65,8 @@
   Optional<XFA_AttributeValue> item =
       XFA_GetAttributeValueByName(wsValue.AsStringView());
   JSObject()->SetEnum(XFA_Attribute::NullTest,
-                      item ? *item : XFA_AttributeValue::Disabled, false);
+                      item.has_value() ? *item : XFA_AttributeValue::Disabled,
+                      false);
 }
 
 XFA_AttributeValue CXFA_Validate::GetNullTest() {
diff --git a/xfa/fxfa/parser/xfa_utils.cpp b/xfa/fxfa/parser/xfa_utils.cpp
index b4c05ca..580b333 100644
--- a/xfa/fxfa/parser/xfa_utils.cpp
+++ b/xfa/fxfa/parser/xfa_utils.cpp
@@ -115,7 +115,7 @@
 bool ContentNodeNeedtoExport(CXFA_Node* pContentNode) {
   Optional<WideString> wsContent =
       pContentNode->JSObject()->TryContent(false, false);
-  if (!wsContent)
+  if (!wsContent.has_value())
     return false;
 
   DCHECK(pContentNode->IsContentNode());
@@ -142,7 +142,7 @@
     return;
 
   Optional<WideString> value = pNode->JSObject()->TryAttribute(eName, false);
-  if (!value)
+  if (!value.has_value())
     return;
 
   wsOutput += L" ";
@@ -209,7 +209,7 @@
                  contentType.value().EqualsASCII("text/xml")) {
         Optional<WideString> rawValue = pRawValueNode->JSObject()->TryAttribute(
             XFA_Attribute::Value, false);
-        if (!rawValue || rawValue->IsEmpty())
+        if (!rawValue.has_value() || rawValue->IsEmpty())
           break;
 
         std::vector<WideString> wsSelTextArray =
@@ -362,7 +362,7 @@
     return WideString();
 
   Optional<WideString> templateNS = pTemplateRoot->JSObject()->TryNamespace();
-  if (!templateNS)
+  if (!templateNS.has_value())
     return WideString();
 
   XFA_VERSION eVersion =
