Migrate absl variant.h and utility.h in pdfium

Since https://crrev.com/c/6330348 and
https://pdfium-review.googlesource.com/c/pdfium/+/129650/1, some utils
in third_party/abseil-cpp/absl/types/variant.h and
third_party/abseil-cpp/absl/utility/utility.h are only aliases for
their std counterparts. This CL migrates code to use std:: directly.

Bug: 40242126
Change-Id: If5d05bc22d3cabf4fd915f19b00813d963b4cdfe
Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/129630
Reviewed-by: Tom Sepez <tsepez@chromium.org>
Auto-Submit: Victor Vianna <victorvianna@google.com>
Reviewed-by: Lei Zhang <thestig@chromium.org>
Commit-Queue: Lei Zhang <thestig@chromium.org>
diff --git a/core/fpdfapi/edit/cpdf_pagecontentmanager.cpp b/core/fpdfapi/edit/cpdf_pagecontentmanager.cpp
index c26decf..9630c5c 100644
--- a/core/fpdfapi/edit/cpdf_pagecontentmanager.cpp
+++ b/core/fpdfapi/edit/cpdf_pagecontentmanager.cpp
@@ -10,6 +10,7 @@
 #include <numeric>
 #include <sstream>
 #include <utility>
+#include <variant>
 #include <vector>
 
 #include "core/fpdfapi/page/cpdf_pageobject.h"
@@ -24,7 +25,6 @@
 #include "core/fxcrt/containers/adapters.h"
 #include "core/fxcrt/containers/contains.h"
 #include "core/fxcrt/numerics/safe_conversions.h"
-#include "third_party/abseil-cpp/absl/types/variant.h"
 
 CPDF_PageContentManager::CPDF_PageContentManager(
     CPDF_PageObjectHolder* page_obj_holder,
@@ -237,15 +237,15 @@
 }
 
 RetainPtr<CPDF_Stream> CPDF_PageContentManager::GetContentsStream() {
-  if (absl::holds_alternative<RetainPtr<CPDF_Stream>>(contents_)) {
-    return absl::get<RetainPtr<CPDF_Stream>>(contents_);
+  if (std::holds_alternative<RetainPtr<CPDF_Stream>>(contents_)) {
+    return std::get<RetainPtr<CPDF_Stream>>(contents_);
   }
   return nullptr;
 }
 
 RetainPtr<CPDF_Array> CPDF_PageContentManager::GetContentsArray() {
-  if (absl::holds_alternative<RetainPtr<CPDF_Array>>(contents_)) {
-    return absl::get<RetainPtr<CPDF_Array>>(contents_);
+  if (std::holds_alternative<RetainPtr<CPDF_Array>>(contents_)) {
+    return std::get<RetainPtr<CPDF_Array>>(contents_);
   }
   return nullptr;
 }
diff --git a/core/fpdfapi/edit/cpdf_pagecontentmanager.h b/core/fpdfapi/edit/cpdf_pagecontentmanager.h
index fcb4162..1a6d94b 100644
--- a/core/fpdfapi/edit/cpdf_pagecontentmanager.h
+++ b/core/fpdfapi/edit/cpdf_pagecontentmanager.h
@@ -8,11 +8,11 @@
 #include <stdint.h>
 
 #include <set>
+#include <variant>
 
 #include "core/fxcrt/fx_string_wrappers.h"
 #include "core/fxcrt/retain_ptr.h"
 #include "core/fxcrt/unowned_ptr.h"
-#include "third_party/abseil-cpp/absl/types/variant.h"
 
 class CPDF_Array;
 class CPDF_Document;
@@ -56,7 +56,7 @@
   UnownedPtr<CPDF_Document> const document_;
   const std::set<uint32_t> objects_with_multi_refs_;
   // When holding a CPDF_Stream, the pointer may be null.
-  absl::variant<RetainPtr<CPDF_Stream>, RetainPtr<CPDF_Array>> contents_;
+  std::variant<RetainPtr<CPDF_Stream>, RetainPtr<CPDF_Array>> contents_;
   std::set<size_t> streams_to_remove_;
 };
 
diff --git a/core/fpdfapi/font/cfx_cttgsubtable.cpp b/core/fpdfapi/font/cfx_cttgsubtable.cpp
index 80c512d..95146ec 100644
--- a/core/fpdfapi/font/cfx_cttgsubtable.cpp
+++ b/core/fpdfapi/font/cfx_cttgsubtable.cpp
@@ -9,6 +9,7 @@
 #include <stdint.h>
 
 #include <utility>
+#include <variant>
 
 #include "core/fxcrt/byteorder.h"
 #include "core/fxcrt/data_vector.h"
@@ -100,17 +101,17 @@
     const Lookup& lookup,
     uint32_t glyphnum) const {
   for (const auto& sub_table : lookup.sub_tables) {
-    if (absl::holds_alternative<absl::monostate>(sub_table.table_data)) {
+    if (std::holds_alternative<std::monostate>(sub_table.table_data)) {
       continue;
     }
     int index = GetCoverageIndex(sub_table.coverage, glyphnum);
-    if (absl::holds_alternative<int16_t>(sub_table.table_data)) {
+    if (std::holds_alternative<int16_t>(sub_table.table_data)) {
       if (index >= 0) {
-        return glyphnum + absl::get<int16_t>(sub_table.table_data);
+        return glyphnum + std::get<int16_t>(sub_table.table_data);
       }
     } else {
       const auto& substitutes =
-          absl::get<DataVector<uint16_t>>(sub_table.table_data);
+          std::get<DataVector<uint16_t>>(sub_table.table_data);
       if (fxcrt::IndexInBounds(substitutes, index)) {
         return substitutes[index];
       }
@@ -121,13 +122,13 @@
 
 int CFX_CTTGSUBTable::GetCoverageIndex(const CoverageFormat& coverage,
                                        uint32_t g) const {
-  if (absl::holds_alternative<absl::monostate>(coverage)) {
+  if (std::holds_alternative<std::monostate>(coverage)) {
     return -1;
   }
 
-  if (absl::holds_alternative<DataVector<uint16_t>>(coverage)) {
+  if (std::holds_alternative<DataVector<uint16_t>>(coverage)) {
     int i = 0;
-    const auto& glyph_array = absl::get<DataVector<uint16_t>>(coverage);
+    const auto& glyph_array = std::get<DataVector<uint16_t>>(coverage);
     for (const auto& glyph : glyph_array) {
       if (static_cast<uint32_t>(glyph) == g) {
         return i;
@@ -137,7 +138,7 @@
     return -1;
   }
 
-  const auto& range_records = absl::get<std::vector<RangeRecord>>(coverage);
+  const auto& range_records = std::get<std::vector<RangeRecord>>(coverage);
   for (const auto& range_rec : range_records) {
     uint32_t s = range_rec.start;
     uint32_t e = range_rec.end;
@@ -272,7 +273,7 @@
   pdfium::span<const uint8_t> sp = raw;
   uint16_t format = GetUInt16(sp);
   if (format != 1 && format != 2) {
-    return absl::monostate();
+    return std::monostate();
   }
   if (format == 1) {
     DataVector<uint16_t> glyph_array(GetUInt16(sp));
diff --git a/core/fpdfapi/font/cfx_cttgsubtable.h b/core/fpdfapi/font/cfx_cttgsubtable.h
index e5dc010..e760607 100644
--- a/core/fpdfapi/font/cfx_cttgsubtable.h
+++ b/core/fpdfapi/font/cfx_cttgsubtable.h
@@ -11,11 +11,11 @@
 
 #include <optional>
 #include <set>
+#include <variant>
 #include <vector>
 
 #include "core/fxcrt/data_vector.h"
 #include "core/fxcrt/span.h"
-#include "third_party/abseil-cpp/absl/types/variant.h"
 
 class CFX_CTTGSUBTable {
  public:
@@ -46,8 +46,8 @@
 
   // GlyphArray for format 1.
   // RangeRecords for format 2.
-  using CoverageFormat = absl::
-      variant<absl::monostate, DataVector<uint16_t>, std::vector<RangeRecord>>;
+  using CoverageFormat = std::
+      variant<std::monostate, DataVector<uint16_t>, std::vector<RangeRecord>>;
 
   struct SubTable {
     SubTable();
@@ -60,7 +60,7 @@
     CoverageFormat coverage;
     // DeltaGlyphID for format 1.
     // Substitutes for format 2.
-    absl::variant<absl::monostate, int16_t, DataVector<uint16_t>> table_data;
+    std::variant<std::monostate, int16_t, DataVector<uint16_t>> table_data;
   };
 
   struct Lookup {
diff --git a/core/fpdfapi/font/cpdf_tounicodemap.cpp b/core/fpdfapi/font/cpdf_tounicodemap.cpp
index 7f82390..e799477 100644
--- a/core/fpdfapi/font/cpdf_tounicodemap.cpp
+++ b/core/fpdfapi/font/cpdf_tounicodemap.cpp
@@ -8,6 +8,7 @@
 
 #include <set>
 #include <utility>
+#include <variant>
 
 #include "core/fpdfapi/font/cpdf_cid2unicodemap.h"
 #include "core/fpdfapi/font/cpdf_fontglobals.h"
@@ -17,7 +18,6 @@
 #include "core/fxcrt/containers/contains.h"
 #include "core/fxcrt/fx_extension.h"
 #include "core/fxcrt/fx_safe_types.h"
-#include "third_party/abseil-cpp/absl/types/variant.h"
 
 namespace {
 
@@ -244,8 +244,8 @@
     uint32_t low_code;
     std::vector<WideString> retcodes;
   };
-  using Range = absl::variant<CodeWordRange, MultimapSingleDestRange,
-                              MultimapMultiDestRange>;
+  using Range = std::variant<CodeWordRange, MultimapSingleDestRange,
+                             MultimapMultiDestRange>;
   std::vector<Range> ranges;
 
   const int raw_count = StringToInt(previous_word);
@@ -338,22 +338,22 @@
 
   if (is_valid && ranges.size() == expected_count) {
     for (const auto& entry : ranges) {
-      if (absl::holds_alternative<CodeWordRange>(entry)) {
-        const auto& range = absl::get<CodeWordRange>(entry);
+      if (std::holds_alternative<CodeWordRange>(entry)) {
+        const auto& range = std::get<CodeWordRange>(entry);
         uint32_t code = range.low_code;
         for (const auto& code_word : range.code_words) {
           SetCode(code, StringToWideString(code_word));
           ++code;
         }
-      } else if (absl::holds_alternative<MultimapSingleDestRange>(entry)) {
-        const auto& range = absl::get<MultimapSingleDestRange>(entry);
+      } else if (std::holds_alternative<MultimapSingleDestRange>(entry)) {
+        const auto& range = std::get<MultimapSingleDestRange>(entry);
         uint32_t value = range.start_value;
         for (uint32_t code = range.low_code; code <= range.high_code; ++code) {
           InsertIntoMultimap(code, value++);
         }
       } else {
-        CHECK(absl::holds_alternative<MultimapMultiDestRange>(entry));
-        const auto& range = absl::get<MultimapMultiDestRange>(entry);
+        CHECK(std::holds_alternative<MultimapMultiDestRange>(entry));
+        const auto& range = std::get<MultimapMultiDestRange>(entry);
         uint32_t code = range.low_code;
         for (const auto& retcode : range.retcodes) {
           InsertIntoMultimap(code, GetMultiCharIndexIndicator());
diff --git a/core/fpdfapi/page/cpdf_color.cpp b/core/fpdfapi/page/cpdf_color.cpp
index 46cb8db..7709dfc 100644
--- a/core/fpdfapi/page/cpdf_color.cpp
+++ b/core/fpdfapi/page/cpdf_color.cpp
@@ -8,6 +8,7 @@
 
 #include <optional>
 #include <utility>
+#include <variant>
 
 #include "core/fpdfapi/page/cpdf_patterncs.h"
 #include "core/fxcrt/check.h"
@@ -22,7 +23,7 @@
 CPDF_Color::~CPDF_Color() = default;
 
 bool CPDF_Color::IsNull() const {
-  return absl::holds_alternative<absl::monostate>(color_data_);
+  return std::holds_alternative<std::monostate>(color_data_);
 }
 
 bool CPDF_Color::IsPattern() const {
@@ -59,7 +60,7 @@
         CPDF_ColorSpace::GetStockCS(CPDF_ColorSpace::Family::kPattern));
   }
 
-  auto& pattern_value = absl::get<std::unique_ptr<PatternValue>>(color_data_);
+  auto& pattern_value = std::get<std::unique_ptr<PatternValue>>(color_data_);
   pattern_value->SetPattern(std::move(pattern));
   pattern_value->SetComps(values);
 }
@@ -71,15 +72,15 @@
 
   cs_ = that.cs_;
 
-  if (absl::holds_alternative<std::vector<float>>(that.color_data_)) {
-    color_data_ = absl::get<std::vector<float>>(that.color_data_);
-  } else if (absl::holds_alternative<std::unique_ptr<PatternValue>>(
+  if (std::holds_alternative<std::vector<float>>(that.color_data_)) {
+    color_data_ = std::get<std::vector<float>>(that.color_data_);
+  } else if (std::holds_alternative<std::unique_ptr<PatternValue>>(
                  that.color_data_)) {
     auto& pattern_value =
-        absl::get<std::unique_ptr<PatternValue>>(that.color_data_);
+        std::get<std::unique_ptr<PatternValue>>(that.color_data_);
     color_data_ = std::make_unique<PatternValue>(*pattern_value);
   } else {
-    color_data_ = absl::monostate();
+    color_data_ = std::monostate();
   }
 
   return *this;
@@ -114,14 +115,14 @@
 
 std::optional<FX_RGB_STRUCT<float>> CPDF_Color::GetRGB() const {
   if (IsPatternInternal()) {
-    if (absl::holds_alternative<std::unique_ptr<PatternValue>>(color_data_)) {
+    if (std::holds_alternative<std::unique_ptr<PatternValue>>(color_data_)) {
       const auto& pattern_value =
-          absl::get<std::unique_ptr<PatternValue>>(color_data_);
+          std::get<std::unique_ptr<PatternValue>>(color_data_);
       return cs_->AsPatternCS()->GetPatternRGB(*pattern_value);
     }
   } else {
-    if (absl::holds_alternative<std::vector<float>>(color_data_)) {
-      const auto& buffer = absl::get<std::vector<float>>(color_data_);
+    if (std::holds_alternative<std::vector<float>>(color_data_)) {
+      const auto& buffer = std::get<std::vector<float>>(color_data_);
       return cs_->GetRGB(buffer);
     }
   }
@@ -132,6 +133,6 @@
   DCHECK(IsPattern());
 
   const auto& pattern_value =
-      absl::get<std::unique_ptr<PatternValue>>(color_data_);
+      std::get<std::unique_ptr<PatternValue>>(color_data_);
   return pattern_value->GetPattern();
 }
diff --git a/core/fpdfapi/page/cpdf_color.h b/core/fpdfapi/page/cpdf_color.h
index 34e32f5..69f0226 100644
--- a/core/fpdfapi/page/cpdf_color.h
+++ b/core/fpdfapi/page/cpdf_color.h
@@ -11,12 +11,12 @@
 
 #include <memory>
 #include <optional>
+#include <variant>
 #include <vector>
 
 #include "core/fxcrt/retain_ptr.h"
 #include "core/fxcrt/span.h"
 #include "core/fxge/dib/fx_dib.h"
-#include "third_party/abseil-cpp/absl/types/variant.h"
 
 class CPDF_ColorSpace;
 class CPDF_Pattern;
@@ -53,9 +53,9 @@
  protected:
   bool IsPatternInternal() const;
 
-  absl::variant<absl::monostate,
-                std::vector<float>,  // Used for non-pattern colorspaces.
-                std::unique_ptr<PatternValue>>  // Used for pattern colorspaces.
+  std::variant<std::monostate,
+               std::vector<float>,  // Used for non-pattern colorspaces.
+               std::unique_ptr<PatternValue>>  // Used for pattern colorspaces.
       color_data_;
   RetainPtr<CPDF_ColorSpace> cs_;
 };
diff --git a/core/fpdfapi/page/cpdf_contentparser.cpp b/core/fpdfapi/page/cpdf_contentparser.cpp
index 60aec84..e21e817 100644
--- a/core/fpdfapi/page/cpdf_contentparser.cpp
+++ b/core/fpdfapi/page/cpdf_contentparser.cpp
@@ -7,6 +7,7 @@
 #include "core/fpdfapi/page/cpdf_contentparser.h"
 
 #include <utility>
+#include <variant>
 
 #include "constants/page_object.h"
 #include "core/fpdfapi/font/cpdf_type3char.h"
@@ -279,7 +280,7 @@
 
 pdfium::span<const uint8_t> CPDF_ContentParser::GetData() const {
   if (is_owned()) {
-    return absl::get<FixedSizeDataVector<uint8_t>>(m_Data).span();
+    return std::get<FixedSizeDataVector<uint8_t>>(m_Data).span();
   }
-  return absl::get<pdfium::raw_span<const uint8_t>>(m_Data);
+  return std::get<pdfium::raw_span<const uint8_t>>(m_Data);
 }
diff --git a/core/fpdfapi/page/cpdf_contentparser.h b/core/fpdfapi/page/cpdf_contentparser.h
index 7105a70..412324f 100644
--- a/core/fpdfapi/page/cpdf_contentparser.h
+++ b/core/fpdfapi/page/cpdf_contentparser.h
@@ -10,6 +10,7 @@
 #include <stdint.h>
 
 #include <memory>
+#include <variant>
 #include <vector>
 
 #include "core/fpdfapi/page/cpdf_form.h"
@@ -19,7 +20,6 @@
 #include "core/fxcrt/raw_span.h"
 #include "core/fxcrt/retain_ptr.h"
 #include "core/fxcrt/unowned_ptr.h"
-#include "third_party/abseil-cpp/absl/types/variant.h"
 
 class CPDF_AllStates;
 class CPDF_Array;
@@ -65,7 +65,7 @@
   void HandlePageContentFailure();
 
   bool is_owned() const {
-    return absl::holds_alternative<FixedSizeDataVector<uint8_t>>(m_Data);
+    return std::holds_alternative<FixedSizeDataVector<uint8_t>>(m_Data);
   }
   pdfium::span<const uint8_t> GetData() const;
 
@@ -75,7 +75,7 @@
   RetainPtr<CPDF_StreamAcc> m_pSingleStream;
   std::vector<RetainPtr<CPDF_StreamAcc>> m_StreamArray;
   std::vector<uint32_t> m_StreamSegmentOffsets;
-  absl::variant<pdfium::raw_span<const uint8_t>, FixedSizeDataVector<uint8_t>>
+  std::variant<pdfium::raw_span<const uint8_t>, FixedSizeDataVector<uint8_t>>
       m_Data;
   uint32_t m_nStreams = 0;
   uint32_t m_CurrentOffset = 0;
diff --git a/core/fpdfapi/parser/cpdf_flateencoder.cpp b/core/fpdfapi/parser/cpdf_flateencoder.cpp
index 05dd872..0e977d8 100644
--- a/core/fpdfapi/parser/cpdf_flateencoder.cpp
+++ b/core/fpdfapi/parser/cpdf_flateencoder.cpp
@@ -6,6 +6,8 @@
 
 #include "core/fpdfapi/parser/cpdf_flateencoder.h"
 
+#include <variant>
+
 #include "constants/stream_dict_common.h"
 #include "core/fpdfapi/parser/cpdf_dictionary.h"
 #include "core/fpdfapi/parser/cpdf_name.h"
@@ -80,6 +82,6 @@
 
 pdfium::span<const uint8_t> CPDF_FlateEncoder::GetSpan() const {
   if (is_owned())
-    return absl::get<DataVector<uint8_t>>(m_Data);
-  return absl::get<pdfium::raw_span<const uint8_t>>(m_Data);
+    return std::get<DataVector<uint8_t>>(m_Data);
+  return std::get<pdfium::raw_span<const uint8_t>>(m_Data);
 }
diff --git a/core/fpdfapi/parser/cpdf_flateencoder.h b/core/fpdfapi/parser/cpdf_flateencoder.h
index 0e60d47..69b662e 100644
--- a/core/fpdfapi/parser/cpdf_flateencoder.h
+++ b/core/fpdfapi/parser/cpdf_flateencoder.h
@@ -8,12 +8,12 @@
 #define CORE_FPDFAPI_PARSER_CPDF_FLATEENCODER_H_
 
 #include <stdint.h>
+#include <variant>
 
 #include "core/fxcrt/data_vector.h"
 #include "core/fxcrt/raw_span.h"
 #include "core/fxcrt/retain_ptr.h"
 #include "core/fxcrt/span.h"
-#include "third_party/abseil-cpp/absl/types/variant.h"
 
 class CPDF_Dictionary;
 class CPDF_Encryptor;
@@ -34,7 +34,7 @@
 
  private:
   bool is_owned() const {
-    return absl::holds_alternative<DataVector<uint8_t>>(m_Data);
+    return std::holds_alternative<DataVector<uint8_t>>(m_Data);
   }
 
   // Returns |m_pClonedDict| if it is valid. Otherwise returns |m_pDict|.
@@ -43,7 +43,7 @@
   // Must outlive `m_Data`.
   RetainPtr<CPDF_StreamAcc> const m_pAcc;
 
-  absl::variant<pdfium::raw_span<const uint8_t>, DataVector<uint8_t>> m_Data;
+  std::variant<pdfium::raw_span<const uint8_t>, DataVector<uint8_t>> m_Data;
 
   // Only one of these two pointers is valid at any time.
   RetainPtr<const CPDF_Dictionary> m_pDict;
diff --git a/core/fpdfapi/parser/cpdf_stream.cpp b/core/fpdfapi/parser/cpdf_stream.cpp
index 287878f..cf16479 100644
--- a/core/fpdfapi/parser/cpdf_stream.cpp
+++ b/core/fpdfapi/parser/cpdf_stream.cpp
@@ -10,6 +10,7 @@
 
 #include <sstream>
 #include <utility>
+#include <variant>
 
 #include "constants/stream_dict_common.h"
 #include "core/fpdfapi/parser/cpdf_dictionary.h"
@@ -55,7 +56,7 @@
     : data_(std::move(file)), dict_(std::move(dict)) {
   CHECK(dict_->IsInline());
   SetLengthInDict(pdfium::checked_cast<int>(
-      absl::get<RetainPtr<IFX_SeekableReadStream>>(data_)->GetSize()));
+      std::get<RetainPtr<IFX_SeekableReadStream>>(data_)->GetSize()));
 }
 
 CPDF_Stream::CPDF_Stream(DataVector<uint8_t> data,
@@ -63,7 +64,7 @@
     : data_(std::move(data)), dict_(std::move(dict)) {
   CHECK(dict_->IsInline());
   SetLengthInDict(
-      pdfium::checked_cast<int>(absl::get<DataVector<uint8_t>>(data_).size()));
+      pdfium::checked_cast<int>(std::get<DataVector<uint8_t>>(data_).size()));
 }
 
 CPDF_Stream::~CPDF_Stream() {
@@ -155,7 +156,7 @@
   DataVector<uint8_t> result(GetRawSize());
   DCHECK(!result.empty());
 
-  auto underlying_stream = absl::get<RetainPtr<IFX_SeekableReadStream>>(data_);
+  auto underlying_stream = std::get<RetainPtr<IFX_SeekableReadStream>>(data_);
   if (!underlying_stream->ReadBlockAtOffset(result, 0))
     return DataVector<uint8_t>();
 
@@ -200,14 +201,14 @@
 size_t CPDF_Stream::GetRawSize() const {
   if (IsFileBased()) {
     return pdfium::checked_cast<size_t>(
-        absl::get<RetainPtr<IFX_SeekableReadStream>>(data_)->GetSize());
+        std::get<RetainPtr<IFX_SeekableReadStream>>(data_)->GetSize());
   }
-  return absl::get<DataVector<uint8_t>>(data_).size();
+  return std::get<DataVector<uint8_t>>(data_).size();
 }
 
 pdfium::span<const uint8_t> CPDF_Stream::GetInMemoryRawData() const {
   DCHECK(IsMemoryBased());
-  return absl::get<DataVector<uint8_t>>(data_);
+  return std::get<DataVector<uint8_t>>(data_);
 }
 
 void CPDF_Stream::SetLengthInDict(int length) {
diff --git a/core/fpdfapi/parser/cpdf_stream.h b/core/fpdfapi/parser/cpdf_stream.h
index 2311bf2..ffeea79 100644
--- a/core/fpdfapi/parser/cpdf_stream.h
+++ b/core/fpdfapi/parser/cpdf_stream.h
@@ -11,12 +11,12 @@
 
 #include <memory>
 #include <set>
+#include <variant>
 
 #include "core/fpdfapi/parser/cpdf_object.h"
 #include "core/fxcrt/data_vector.h"
 #include "core/fxcrt/fx_string_wrappers.h"
 #include "core/fxcrt/retain_ptr.h"
-#include "third_party/abseil-cpp/absl/types/variant.h"
 
 class IFX_SeekableReadStream;
 
@@ -57,10 +57,10 @@
   DataVector<uint8_t> ReadAllRawData() const;
 
   bool IsFileBased() const {
-    return absl::holds_alternative<RetainPtr<IFX_SeekableReadStream>>(data_);
+    return std::holds_alternative<RetainPtr<IFX_SeekableReadStream>>(data_);
   }
   bool IsMemoryBased() const {
-    return absl::holds_alternative<DataVector<uint8_t>>(data_);
+    return std::holds_alternative<DataVector<uint8_t>>(data_);
   }
   bool HasFilter() const;
 
@@ -93,7 +93,7 @@
 
   void SetLengthInDict(int length);
 
-  absl::variant<RetainPtr<IFX_SeekableReadStream>, DataVector<uint8_t>> data_;
+  std::variant<RetainPtr<IFX_SeekableReadStream>, DataVector<uint8_t>> data_;
   RetainPtr<CPDF_Dictionary> dict_;
 };
 
diff --git a/core/fpdfapi/parser/cpdf_stream_acc.cpp b/core/fpdfapi/parser/cpdf_stream_acc.cpp
index 8e18336..dd24940 100644
--- a/core/fpdfapi/parser/cpdf_stream_acc.cpp
+++ b/core/fpdfapi/parser/cpdf_stream_acc.cpp
@@ -7,6 +7,7 @@
 #include "core/fpdfapi/parser/cpdf_stream_acc.h"
 
 #include <utility>
+#include <variant>
 
 #include "core/fdrm/fx_crypt.h"
 #include "core/fpdfapi/parser/cpdf_dictionary.h"
@@ -74,7 +75,7 @@
 
 pdfium::span<const uint8_t> CPDF_StreamAcc::GetSpan() const {
   if (is_owned())
-    return absl::get<DataVector<uint8_t>>(m_Data);
+    return std::get<DataVector<uint8_t>>(m_Data);
   if (m_pStream && m_pStream->IsMemoryBased())
     return m_pStream->GetInMemoryRawData();
   return {};
@@ -90,9 +91,9 @@
 
 DataVector<uint8_t> CPDF_StreamAcc::DetachData() {
   if (is_owned())
-    return std::move(absl::get<DataVector<uint8_t>>(m_Data));
+    return std::move(std::get<DataVector<uint8_t>>(m_Data));
 
-  auto span = absl::get<pdfium::raw_span<const uint8_t>>(m_Data);
+  auto span = std::get<pdfium::raw_span<const uint8_t>>(m_Data);
   return DataVector<uint8_t>(span.begin(), span.end());
 }
 
@@ -119,7 +120,7 @@
   if (dwSrcSize == 0)
     return;
 
-  absl::variant<pdfium::raw_span<const uint8_t>, DataVector<uint8_t>> src_data;
+  std::variant<pdfium::raw_span<const uint8_t>, DataVector<uint8_t>> src_data;
   pdfium::span<const uint8_t> src_span;
   if (m_pStream->IsMemoryBased()) {
     src_span = m_pStream->GetInMemoryRawData();
diff --git a/core/fpdfapi/parser/cpdf_stream_acc.h b/core/fpdfapi/parser/cpdf_stream_acc.h
index 3ddc5ac..ea358db 100644
--- a/core/fpdfapi/parser/cpdf_stream_acc.h
+++ b/core/fpdfapi/parser/cpdf_stream_acc.h
@@ -10,13 +10,13 @@
 #include <stdint.h>
 
 #include <memory>
+#include <variant>
 
 #include "core/fxcrt/bytestring.h"
 #include "core/fxcrt/data_vector.h"
 #include "core/fxcrt/raw_span.h"
 #include "core/fxcrt/retain_ptr.h"
 #include "core/fxcrt/span.h"
-#include "third_party/abseil-cpp/absl/types/variant.h"
 
 class CPDF_Dictionary;
 class CPDF_Stream;
@@ -57,14 +57,14 @@
   DataVector<uint8_t> ReadRawStream() const;
 
   bool is_owned() const {
-    return absl::holds_alternative<DataVector<uint8_t>>(m_Data);
+    return std::holds_alternative<DataVector<uint8_t>>(m_Data);
   }
 
   ByteString m_ImageDecoder;
   RetainPtr<const CPDF_Dictionary> m_pImageParam;
   // Needs to outlive `m_Data` when the data is not owned.
   RetainPtr<const CPDF_Stream> const m_pStream;
-  absl::variant<pdfium::raw_span<const uint8_t>, DataVector<uint8_t>> m_Data;
+  std::variant<pdfium::raw_span<const uint8_t>, DataVector<uint8_t>> m_Data;
 };
 
 #endif  // CORE_FPDFAPI_PARSER_CPDF_STREAM_ACC_H_
diff --git a/core/fxcrt/fx_number.cpp b/core/fxcrt/fx_number.cpp
index 6e1598f..d2cd130 100644
--- a/core/fxcrt/fx_number.cpp
+++ b/core/fxcrt/fx_number.cpp
@@ -7,6 +7,7 @@
 #include "core/fxcrt/fx_number.h"
 
 #include <limits>
+#include <variant>
 
 #include "core/fxcrt/fx_extension.h"
 #include "core/fxcrt/fx_safe_types.h"
@@ -82,31 +83,31 @@
 }
 
 bool FX_Number::IsInteger() const {
-  return absl::holds_alternative<uint32_t>(value_) ||
-         absl::holds_alternative<int32_t>(value_);
+  return std::holds_alternative<uint32_t>(value_) ||
+         std::holds_alternative<int32_t>(value_);
 }
 
 bool FX_Number::IsSigned() const {
-  return absl::holds_alternative<int32_t>(value_) ||
-         absl::holds_alternative<float>(value_);
+  return std::holds_alternative<int32_t>(value_) ||
+         std::holds_alternative<float>(value_);
 }
 
 int32_t FX_Number::GetSigned() const {
-  if (absl::holds_alternative<uint32_t>(value_)) {
-    return static_cast<int32_t>(absl::get<uint32_t>(value_));
+  if (std::holds_alternative<uint32_t>(value_)) {
+    return static_cast<int32_t>(std::get<uint32_t>(value_));
   }
-  if (absl::holds_alternative<int32_t>(value_)) {
-    return absl::get<int32_t>(value_);
+  if (std::holds_alternative<int32_t>(value_)) {
+    return std::get<int32_t>(value_);
   }
-  return pdfium::saturated_cast<int32_t>(absl::get<float>(value_));
+  return pdfium::saturated_cast<int32_t>(std::get<float>(value_));
 }
 
 float FX_Number::GetFloat() const {
-  if (absl::holds_alternative<uint32_t>(value_)) {
-    return static_cast<float>(absl::get<uint32_t>(value_));
+  if (std::holds_alternative<uint32_t>(value_)) {
+    return static_cast<float>(std::get<uint32_t>(value_));
   }
-  if (absl::holds_alternative<int32_t>(value_)) {
-    return static_cast<float>(absl::get<int32_t>(value_));
+  if (std::holds_alternative<int32_t>(value_)) {
+    return static_cast<float>(std::get<int32_t>(value_));
   }
-  return absl::get<float>(value_);
+  return std::get<float>(value_);
 }
diff --git a/core/fxcrt/fx_number.h b/core/fxcrt/fx_number.h
index c943dec..bdaf3f8 100644
--- a/core/fxcrt/fx_number.h
+++ b/core/fxcrt/fx_number.h
@@ -9,8 +9,9 @@
 
 #include <stdint.h>
 
+#include <variant>
+
 #include "core/fxcrt/bytestring.h"
-#include "third_party/abseil-cpp/absl/types/variant.h"
 
 class FX_Number {
  public:
@@ -27,7 +28,7 @@
   float GetFloat() const;
 
  private:
-  absl::variant<uint32_t, int32_t, float> value_ = 0u;
+  std::variant<uint32_t, int32_t, float> value_ = 0u;
 };
 
 #endif  // CORE_FXCRT_FX_NUMBER_H_
diff --git a/core/fxcrt/maybe_owned.h b/core/fxcrt/maybe_owned.h
index c599d39..6f4de82 100644
--- a/core/fxcrt/maybe_owned.h
+++ b/core/fxcrt/maybe_owned.h
@@ -7,9 +7,9 @@
 
 #include <memory>
 #include <utility>
+#include <variant>
 
 #include "core/fxcrt/unowned_ptr.h"
-#include "third_party/abseil-cpp/absl/types/variant.h"
 
 namespace fxcrt {
 
@@ -39,7 +39,7 @@
   void Reset(T* ptr = nullptr) { ptr_ = UnownedType(ptr); }
   void Reset(OwnedType ptr) { ptr_ = std::move(ptr); }
 
-  bool IsOwned() const { return absl::holds_alternative<OwnedType>(ptr_); }
+  bool IsOwned() const { return std::holds_alternative<OwnedType>(ptr_); }
 
   // Helpful for untangling a collection of intertwined MaybeOwned<>.
   void ResetIfUnowned() {
@@ -48,24 +48,24 @@
   }
 
   T* Get() const& {
-    return absl::visit([](const auto& obj) { return obj.get(); }, ptr_);
+    return std::visit([](const auto& obj) { return obj.get(); }, ptr_);
   }
   T* Get() && {
     auto local_variable_preventing_move_elision = std::move(ptr_);
-    return absl::visit([](const auto& obj) { return obj.get(); },
-                       local_variable_preventing_move_elision);
+    return std::visit([](const auto& obj) { return obj.get(); },
+                      local_variable_preventing_move_elision);
   }
 
   // Downgrades to unowned, caller takes ownership.
   OwnedType Release() {
-    auto result = std::move(absl::get<OwnedType>(ptr_));
+    auto result = std::move(std::get<OwnedType>(ptr_));
     ptr_ = UnownedType(result.get());
     return result;
   }
 
   // Downgrades to empty, caller takes ownership.
   OwnedType ReleaseAndClear() {
-    auto result = std::move(absl::get<OwnedType>(ptr_));
+    auto result = std::move(std::get<OwnedType>(ptr_));
     ptr_ = UnownedType();
     return result;
   }
@@ -96,7 +96,7 @@
   T* operator->() const { return Get(); }
 
  private:
-  absl::variant<UnownedType, OwnedType> ptr_;
+  std::variant<UnownedType, OwnedType> ptr_;
 };
 
 }  // namespace fxcrt
diff --git a/core/fxge/agg/cfx_agg_devicedriver.cpp b/core/fxge/agg/cfx_agg_devicedriver.cpp
index a306b4c..ab4af05 100644
--- a/core/fxge/agg/cfx_agg_devicedriver.cpp
+++ b/core/fxge/agg/cfx_agg_devicedriver.cpp
@@ -29,7 +29,6 @@
 #include "core/fxge/cfx_path.h"
 #include "core/fxge/dib/cfx_dibitmap.h"
 #include "core/fxge/dib/cfx_imagestretcher.h"
-#include "third_party/abseil-cpp/absl/types/variant.h"
 
 // Ignore fallthrough warnings in agg23 headers.
 #if defined(__clang__)
@@ -443,12 +442,12 @@
   }
 
   const FX_BGR_STRUCT<uint8_t>& GetBGR() const {
-    return absl::get<FX_BGR_STRUCT<uint8_t>>(m_ColorData);
+    return std::get<FX_BGR_STRUCT<uint8_t>>(m_ColorData);
   }
-  int GetGray() const { return absl::get<int>(m_ColorData); }
+  int GetGray() const { return std::get<int>(m_ColorData); }
 
   const int m_Alpha;
-  absl::variant<FX_BGR_STRUCT<uint8_t>, int> m_ColorData;
+  std::variant<FX_BGR_STRUCT<uint8_t>, int> m_ColorData;
   const uint32_t m_Color;
   const bool m_bFullCover;
   const bool m_bRgbByteOrder;
diff --git a/fpdfsdk/fpdf_formfill.cpp b/fpdfsdk/fpdf_formfill.cpp
index 8e794a5..2ad5fcc 100644
--- a/fpdfsdk/fpdf_formfill.cpp
+++ b/fpdfsdk/fpdf_formfill.cpp
@@ -8,6 +8,7 @@
 
 #include <memory>
 #include <utility>
+#include <variant>
 
 #include "constants/form_fields.h"
 #include "core/fpdfapi/page/cpdf_annotcontext.h"
@@ -28,7 +29,6 @@
 #include "fpdfsdk/cpdfsdk_interactiveform.h"
 #include "fpdfsdk/cpdfsdk_pageview.h"
 #include "public/fpdfview.h"
-#include "third_party/abseil-cpp/absl/types/variant.h"
 
 #ifdef PDF_ENABLE_XFA
 #include "fpdfsdk/fpdfxfa/cpdfxfa_context.h"
@@ -178,9 +178,9 @@
 }
 
 #if defined(PDF_USE_SKIA)
-using BitmapOrCanvas = absl::variant<CFX_DIBitmap*, SkCanvas*>;
+using BitmapOrCanvas = std::variant<CFX_DIBitmap*, SkCanvas*>;
 #else
-using BitmapOrCanvas = absl::variant<CFX_DIBitmap*>;
+using BitmapOrCanvas = std::variant<CFX_DIBitmap*>;
 #endif
 
 // `dest` must be non-null.
@@ -207,9 +207,9 @@
   SkCanvas* canvas = nullptr;
 #endif
 
-  const bool dest_is_bitmap = absl::holds_alternative<CFX_DIBitmap*>(dest);
+  const bool dest_is_bitmap = std::holds_alternative<CFX_DIBitmap*>(dest);
   if (dest_is_bitmap) {
-    holder.Reset(absl::get<CFX_DIBitmap*>(dest));
+    holder.Reset(std::get<CFX_DIBitmap*>(dest));
     CHECK(holder);
   } else {
 #if defined(PDF_USE_SKIA)
@@ -217,7 +217,7 @@
       return;
     }
 
-    canvas = absl::get<SkCanvas*>(dest);
+    canvas = std::get<SkCanvas*>(dest);
     CHECK(canvas);
 #endif
   }