diff --git a/BUILD.gn b/BUILD.gn
index 53facc8..c4da7d6 100644
--- a/BUILD.gn
+++ b/BUILD.gn
@@ -645,6 +645,7 @@
     "core/fxcodec/codec/ccodec_jpegmodule.h",
     "core/fxcodec/codec/ccodec_jpxmodule.h",
     "core/fxcodec/codec/ccodec_scanlinedecoder.h",
+    "core/fxcodec/codec/cjpx_decoder.h",
     "core/fxcodec/codec/codec_int.h",
     "core/fxcodec/codec/fx_codec.cpp",
     "core/fxcodec/codec/fx_codec_fax.cpp",
diff --git a/core/fpdfapi/font/cpdf_type3font.cpp b/core/fpdfapi/font/cpdf_type3font.cpp
index b9a05a0..59702ae 100644
--- a/core/fpdfapi/font/cpdf_type3font.cpp
+++ b/core/fpdfapi/font/cpdf_type3font.cpp
@@ -105,9 +105,9 @@
   if (!pStream)
     return nullptr;
 
-  std::unique_ptr<CPDF_Type3Char> pNewChar(new CPDF_Type3Char(new CPDF_Form(
+  auto pNewChar = pdfium::MakeUnique<CPDF_Type3Char>(new CPDF_Form(
       m_pDocument, m_pFontResources ? m_pFontResources : m_pPageResources,
-      pStream, nullptr)));
+      pStream, nullptr));
 
   // This can trigger recursion into this method. The content of |m_CacheMap|
   // can change as a result. Thus after it returns, check the cache again for
diff --git a/core/fpdfapi/page/cpdf_streamcontentparser.cpp b/core/fpdfapi/page/cpdf_streamcontentparser.cpp
index 312996b..4c64e13 100644
--- a/core/fpdfapi/page/cpdf_streamcontentparser.cpp
+++ b/core/fpdfapi/page/cpdf_streamcontentparser.cpp
@@ -262,7 +262,7 @@
       m_Level(level),
       m_ParamStartPos(0),
       m_ParamCount(0),
-      m_pCurStates(new CPDF_AllStates),
+      m_pCurStates(pdfium::MakeUnique<CPDF_AllStates>()),
       m_pLastTextObject(nullptr),
       m_DefFontSize(0),
       m_PathStartX(0.0f),
@@ -765,9 +765,9 @@
 }
 
 void CPDF_StreamContentParser::AddForm(CPDF_Stream* pStream) {
-  std::unique_ptr<CPDF_FormObject> pFormObj(new CPDF_FormObject);
-  pFormObj->m_pForm.reset(
-      new CPDF_Form(m_pDocument, m_pPageResources, pStream, m_pResources));
+  auto pFormObj = pdfium::MakeUnique<CPDF_FormObject>();
+  pFormObj->m_pForm = pdfium::MakeUnique<CPDF_Form>(
+      m_pDocument, m_pPageResources, pStream, m_pResources);
   pFormObj->m_FormMatrix = m_pCurStates->m_CTM;
   pFormObj->m_FormMatrix.Concat(m_mtContentToUser);
   CPDF_AllStates status;
@@ -957,7 +957,7 @@
 }
 
 void CPDF_StreamContentParser::Handle_SaveGraphState() {
-  std::unique_ptr<CPDF_AllStates> pStates(new CPDF_AllStates);
+  auto pStates = pdfium::MakeUnique<CPDF_AllStates>();
   pStates->Copy(*m_pCurStates);
   m_StateStack.push_back(std::move(pStates));
 }
@@ -1110,7 +1110,7 @@
   if (!pShading->IsShadingObject() || !pShading->Load())
     return;
 
-  std::unique_ptr<CPDF_ShadingObject> pObj(new CPDF_ShadingObject);
+  auto pObj = pdfium::MakeUnique<CPDF_ShadingObject>();
   pObj->m_pShading = pShading;
   SetGraphicStates(pObj.get(), false, false, false);
   pObj->m_Matrix = m_pCurStates->m_CTM;
@@ -1248,7 +1248,7 @@
       pFont->IsType3Font() ? TextRenderingMode::MODE_FILL
                            : m_pCurStates->m_TextState.GetTextMode();
   {
-    std::unique_ptr<CPDF_TextObject> pText(new CPDF_TextObject);
+    auto pText = pdfium::MakeUnique<CPDF_TextObject>();
     m_pLastTextObject = pText.get();
     SetGraphicStates(m_pLastTextObject, true, true, true);
     if (TextRenderingModeIsStrokeMode(text_mode)) {
diff --git a/core/fpdfapi/parser/cpdf_array_unittest.cpp b/core/fpdfapi/parser/cpdf_array_unittest.cpp
index 6d458d8..1e92b32 100644
--- a/core/fpdfapi/parser/cpdf_array_unittest.cpp
+++ b/core/fpdfapi/parser/cpdf_array_unittest.cpp
@@ -15,7 +15,7 @@
 TEST(cpdf_array, RemoveAt) {
   {
     int elems[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
-    std::unique_ptr<CPDF_Array> arr(new CPDF_Array);
+    auto arr = pdfium::MakeUnique<CPDF_Array>();
     for (size_t i = 0; i < FX_ArraySize(elems); ++i)
       arr->AddNew<CPDF_Number>(elems[i]);
     arr->RemoveAt(3, 3);
@@ -32,7 +32,7 @@
   {
     // When the range is out of bound, RemoveAt has no effect.
     int elems[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
-    std::unique_ptr<CPDF_Array> arr(new CPDF_Array);
+    auto arr = pdfium::MakeUnique<CPDF_Array>();
     for (size_t i = 0; i < FX_ArraySize(elems); ++i)
       arr->AddNew<CPDF_Number>(elems[i]);
     arr->RemoveAt(8, 5);
@@ -102,14 +102,13 @@
     static const size_t kNumOfRowElems = 5;
     int elems[kNumOfRows][kNumOfRowElems] = {
         {1, 2, 3, 4, 5}, {10, 9, 8, 7, 6}, {11, 12, 13, 14, 15}};
-    std::unique_ptr<CPDF_Array> arr(new CPDF_Array);
+    auto arr = pdfium::MakeUnique<CPDF_Array>();
     // Indirect references to indirect objects.
-    std::unique_ptr<CPDF_IndirectObjectHolder> obj_holder(
-        new CPDF_IndirectObjectHolder());
+    auto obj_holder = pdfium::MakeUnique<CPDF_IndirectObjectHolder>();
     for (size_t i = 0; i < kNumOfRows; ++i) {
       auto arr_elem = pdfium::MakeUnique<CPDF_Array>();
       for (size_t j = 0; j < kNumOfRowElems; ++j) {
-        std::unique_ptr<CPDF_Number> obj(new CPDF_Number(elems[i][j]));
+        auto obj = pdfium::MakeUnique<CPDF_Number>(elems[i][j]);
         // Starts object number from 1.
         int obj_num = i * kNumOfRowElems + j + 1;
         obj_holder->ReplaceIndirectObjectIfHigherGeneration(obj_num,
@@ -168,7 +167,7 @@
 TEST(cpdf_array, Iterator) {
   const int elems[] = {-23, -11,     3,         455,   2345877,
                        0,   7895330, -12564334, 10000, -100000};
-  std::unique_ptr<CPDF_Array> arr(new CPDF_Array);
+  auto arr = pdfium::MakeUnique<CPDF_Array>();
   for (size_t i = 0; i < FX_ArraySize(elems); ++i)
     arr->InsertNewAt<CPDF_Number>(i, elems[i]);
   size_t index = 0;
diff --git a/core/fpdfapi/parser/cpdf_object_unittest.cpp b/core/fpdfapi/parser/cpdf_object_unittest.cpp
index b25d40a..3b5374b 100644
--- a/core/fpdfapi/parser/cpdf_object_unittest.cpp
+++ b/core/fpdfapi/parser/cpdf_object_unittest.cpp
@@ -484,8 +484,8 @@
     // String and name array
     const char* const vals[] = {"this", "adsde$%^", "\r\t",           "\"012",
                                 ".",    "EYREW",    "It is a joke :)"};
-    std::unique_ptr<CPDF_Array> string_array(new CPDF_Array);
-    std::unique_ptr<CPDF_Array> name_array(new CPDF_Array);
+    auto string_array = pdfium::MakeUnique<CPDF_Array>();
+    auto name_array = pdfium::MakeUnique<CPDF_Array>();
     for (size_t i = 0; i < FX_ArraySize(vals); ++i) {
       string_array->InsertNewAt<CPDF_String>(i, vals[i], false);
       name_array->InsertNewAt<CPDF_Name>(i, vals[i]);
@@ -695,8 +695,8 @@
 TEST(PDFArrayTest, AddStringAndName) {
   const char* vals[] = {"",        "a", "ehjhRIOYTTFdfcdnv",  "122323",
                         "$#%^&**", " ", "This is a test.\r\n"};
-  std::unique_ptr<CPDF_Array> string_array(new CPDF_Array);
-  std::unique_ptr<CPDF_Array> name_array(new CPDF_Array);
+  auto string_array = pdfium::MakeUnique<CPDF_Array>();
+  auto name_array = pdfium::MakeUnique<CPDF_Array>();
   for (size_t i = 0; i < FX_ArraySize(vals); ++i) {
     string_array->AddNew<CPDF_String>(vals[i], false);
     name_array->AddNew<CPDF_Name>(vals[i]);
@@ -710,8 +710,7 @@
 }
 
 TEST(PDFArrayTest, AddReferenceAndGetObjectAt) {
-  std::unique_ptr<CPDF_IndirectObjectHolder> holder(
-      new CPDF_IndirectObjectHolder());
+  auto holder = pdfium::MakeUnique<CPDF_IndirectObjectHolder>();
   CPDF_Boolean* boolean_obj = new CPDF_Boolean(true);
   CPDF_Number* int_obj = new CPDF_Number(-1234);
   CPDF_Number* float_obj = new CPDF_Number(2345.089f);
@@ -723,7 +722,7 @@
                                   str_obj,     name_obj, null_obj};
   unsigned int obj_nums[] = {2, 4, 7, 2345, 799887, 1};
   auto arr = pdfium::MakeUnique<CPDF_Array>();
-  std::unique_ptr<CPDF_Array> arr1(new CPDF_Array);
+  auto arr1 = pdfium::MakeUnique<CPDF_Array>();
   // Create two arrays of references by different AddReference() APIs.
   for (size_t i = 0; i < FX_ArraySize(indirect_objs); ++i) {
     holder->ReplaceIndirectObjectIfHigherGeneration(
@@ -748,7 +747,7 @@
 
 TEST(PDFArrayTest, CloneDirectObject) {
   CPDF_IndirectObjectHolder objects_holder;
-  std::unique_ptr<CPDF_Array> array(new CPDF_Array);
+  auto array = pdfium::MakeUnique<CPDF_Array>();
   array->AddNew<CPDF_Reference>(&objects_holder, 1234);
   ASSERT_EQ(1U, array->GetCount());
   CPDF_Object* obj = array->GetObjectAt(0);
@@ -782,7 +781,7 @@
 
 TEST(PDFDictionaryTest, CloneDirectObject) {
   CPDF_IndirectObjectHolder objects_holder;
-  std::unique_ptr<CPDF_Dictionary> dict(new CPDF_Dictionary());
+  auto dict = pdfium::MakeUnique<CPDF_Dictionary>();
   dict->SetNewFor<CPDF_Reference>("foo", &objects_holder, 1234);
   ASSERT_EQ(1U, dict->GetCount());
   CPDF_Object* obj = dict->GetObjectFor("foo");
@@ -867,7 +866,7 @@
 
 TEST(PDFDictionaryTest, ConvertIndirect) {
   CPDF_IndirectObjectHolder objects_holder;
-  std::unique_ptr<CPDF_Dictionary> dict(new CPDF_Dictionary);
+  auto dict = pdfium::MakeUnique<CPDF_Dictionary>();
   CPDF_Object* pObj = dict->SetNewFor<CPDF_Number>("clams", 42);
   dict->ConvertToIndirectObjectFor("clams", &objects_holder);
   CPDF_Object* pRef = dict->GetObjectFor("clams");
diff --git a/core/fpdfapi/render/cpdf_dibsource.cpp b/core/fpdfapi/render/cpdf_dibsource.cpp
index f3703dd..cb8e9c9 100644
--- a/core/fpdfapi/render/cpdf_dibsource.cpp
+++ b/core/fpdfapi/render/cpdf_dibsource.cpp
@@ -21,6 +21,7 @@
 #include "core/fpdfapi/parser/fpdf_parser_decode.h"
 #include "core/fpdfapi/render/cpdf_pagerendercache.h"
 #include "core/fpdfapi/render/cpdf_renderstatus.h"
+#include "core/fxcodec/codec/cjpx_decoder.h"
 #include "core/fxcodec/fx_codec.h"
 #include "core/fxcrt/fx_safe_types.h"
 #include "third_party/base/ptr_util.h"
@@ -79,16 +80,17 @@
   explicit JpxBitMapContext(CCodec_JpxModule* jpx_module)
       : jpx_module_(jpx_module), decoder_(nullptr) {}
 
-  ~JpxBitMapContext() { jpx_module_->DestroyDecoder(decoder_); }
+  ~JpxBitMapContext() {}
 
-  // Takes ownership of |decoder|.
-  void set_decoder(CJPX_Decoder* decoder) { decoder_ = decoder; }
+  void set_decoder(std::unique_ptr<CJPX_Decoder> decoder) {
+    decoder_ = std::move(decoder);
+  }
 
-  CJPX_Decoder* decoder() { return decoder_; }
+  CJPX_Decoder* decoder() { return decoder_.get(); }
 
  private:
   CCodec_JpxModule* const jpx_module_;  // Weak pointer.
-  CJPX_Decoder* decoder_;               // Decoder, owned.
+  std::unique_ptr<CJPX_Decoder> decoder_;
 
   // Disallow evil constructors
   JpxBitMapContext(const JpxBitMapContext&);
@@ -613,7 +615,7 @@
   if (!pJpxModule)
     return;
 
-  std::unique_ptr<JpxBitMapContext> context(new JpxBitMapContext(pJpxModule));
+  auto context = pdfium::MakeUnique<JpxBitMapContext>(pJpxModule);
   context->set_decoder(pJpxModule->CreateDecoder(
       m_pStreamAcc->GetData(), m_pStreamAcc->GetSize(), m_pColorSpace));
   if (!context->decoder())
diff --git a/core/fpdfdoc/cpdf_filespec_unittest.cpp b/core/fpdfdoc/cpdf_filespec_unittest.cpp
index d164165..e237aa5 100644
--- a/core/fpdfdoc/cpdf_filespec_unittest.cpp
+++ b/core/fpdfdoc/cpdf_filespec_unittest.cpp
@@ -11,6 +11,7 @@
 #include "core/fpdfdoc/cpdf_filespec.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "testing/test_support.h"
+#include "third_party/base/ptr_util.h"
 
 TEST(cpdf_filespec, EncodeDecodeFileName) {
   std::vector<pdfium::NullTermWstrFuncTestData> test_data = {
@@ -67,8 +68,7 @@
       L"/docs/test.pdf"
 #endif
     };
-    std::unique_ptr<CPDF_Object> str_obj(
-        new CPDF_String(nullptr, test_data.input));
+    auto str_obj = pdfium::MakeUnique<CPDF_String>(nullptr, test_data.input);
     CPDF_FileSpec file_spec(str_obj.get());
     CFX_WideString file_name;
     EXPECT_TRUE(file_spec.GetFileName(&file_name));
@@ -99,7 +99,7 @@
     };
     // Keyword fields in reverse order of precedence to retrieve the file name.
     const char* const keywords[5] = {"Unix", "Mac", "DOS", "F", "UF"};
-    std::unique_ptr<CPDF_Dictionary> dict_obj(new CPDF_Dictionary());
+    auto dict_obj = pdfium::MakeUnique<CPDF_Dictionary>();
     CPDF_FileSpec file_spec(dict_obj.get());
     CFX_WideString file_name;
     for (int i = 0; i < 5; ++i) {
@@ -116,7 +116,7 @@
   }
   {
     // Invalid object.
-    std::unique_ptr<CPDF_Object> name_obj(new CPDF_Name(nullptr, "test.pdf"));
+    auto name_obj = pdfium::MakeUnique<CPDF_Name>(nullptr, "test.pdf");
     CPDF_FileSpec file_spec(name_obj.get());
     CFX_WideString file_name;
     EXPECT_FALSE(file_spec.GetFileName(&file_name));
@@ -137,7 +137,7 @@
 #endif
   };
   // String object.
-  std::unique_ptr<CPDF_Object> str_obj(new CPDF_String(nullptr, L"babababa"));
+  auto str_obj = pdfium::MakeUnique<CPDF_String>(nullptr, L"babababa");
   CPDF_FileSpec file_spec1(str_obj.get());
   file_spec1.SetFileName(test_data.input);
   // Check internal object value.
@@ -149,7 +149,7 @@
   EXPECT_TRUE(file_name == test_data.input);
 
   // Dictionary object.
-  std::unique_ptr<CPDF_Dictionary> dict_obj(new CPDF_Dictionary());
+  auto dict_obj = pdfium::MakeUnique<CPDF_Dictionary>();
   CPDF_FileSpec file_spec2(dict_obj.get());
   file_spec2.SetFileName(test_data.input);
   // Check internal object value.
diff --git a/core/fpdfdoc/cpdf_formfield.cpp b/core/fpdfdoc/cpdf_formfield.cpp
index c697cbb..e7ca7c6 100644
--- a/core/fpdfdoc/cpdf_formfield.cpp
+++ b/core/fpdfdoc/cpdf_formfield.cpp
@@ -566,7 +566,7 @@
           if (pValue->GetUnicodeText() == opt_value)
             m_pDict->RemoveFor("V");
         } else if (pValue->IsArray()) {
-          std::unique_ptr<CPDF_Array> pArray(new CPDF_Array);
+          auto pArray = pdfium::MakeUnique<CPDF_Array>();
           for (int i = 0; i < CountOptions(); i++) {
             if (i != index && IsItemSelected(i)) {
               opt_value = GetOptionValue(i);
diff --git a/core/fxcodec/codec/ccodec_jpxmodule.h b/core/fxcodec/codec/ccodec_jpxmodule.h
index fd919d9..c570027 100644
--- a/core/fxcodec/codec/ccodec_jpxmodule.h
+++ b/core/fxcodec/codec/ccodec_jpxmodule.h
@@ -7,6 +7,7 @@
 #ifndef CORE_FXCODEC_CODEC_CCODEC_JPXMODULE_H_
 #define CORE_FXCODEC_CODEC_CCODEC_JPXMODULE_H_
 
+#include <memory>
 #include <vector>
 
 #include "core/fxcrt/fx_system.h"
@@ -19,9 +20,9 @@
   CCodec_JpxModule();
   ~CCodec_JpxModule();
 
-  CJPX_Decoder* CreateDecoder(const uint8_t* src_buf,
-                              uint32_t src_size,
-                              CPDF_ColorSpace* cs);
+  std::unique_ptr<CJPX_Decoder> CreateDecoder(const uint8_t* src_buf,
+                                              uint32_t src_size,
+                                              CPDF_ColorSpace* cs);
   void GetImageInfo(CJPX_Decoder* pDecoder,
                     uint32_t* width,
                     uint32_t* height,
@@ -30,7 +31,6 @@
               uint8_t* dest_data,
               int pitch,
               const std::vector<uint8_t>& offsets);
-  void DestroyDecoder(CJPX_Decoder* pDecoder);
 };
 
 #endif  // CORE_FXCODEC_CODEC_CCODEC_JPXMODULE_H_
diff --git a/core/fxcodec/codec/cjpx_decoder.h b/core/fxcodec/codec/cjpx_decoder.h
new file mode 100644
index 0000000..2e63caa
--- /dev/null
+++ b/core/fxcodec/codec/cjpx_decoder.h
@@ -0,0 +1,36 @@
+// Copyright 2017 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef CORE_FXCODEC_CODEC_CJPX_DECODER_H_
+#define CORE_FXCODEC_CODEC_CJPX_DECODER_H_
+
+#include <vector>
+
+#include "third_party/libopenjpeg20/openjpeg.h"
+
+class CPDF_ColorSpace;
+
+class CJPX_Decoder {
+ public:
+  explicit CJPX_Decoder(CPDF_ColorSpace* cs);
+  ~CJPX_Decoder();
+
+  bool Init(const unsigned char* src_data, uint32_t src_size);
+  void GetInfo(uint32_t* width, uint32_t* height, uint32_t* components);
+  bool Decode(uint8_t* dest_buf,
+              int pitch,
+              const std::vector<uint8_t>& offsets);
+
+ private:
+  const uint8_t* m_SrcData;
+  uint32_t m_SrcSize;
+  opj_image_t* image;
+  opj_codec_t* l_codec;
+  opj_stream_t* l_stream;
+  const CPDF_ColorSpace* const m_ColorSpace;
+};
+
+#endif  // CORE_FXCODEC_CODEC_CJPX_DECODER_H_
diff --git a/core/fxcodec/codec/fx_codec_flate.cpp b/core/fxcodec/codec/fx_codec_flate.cpp
index 7c19d33..269bf58 100644
--- a/core/fxcodec/codec/fx_codec_flate.cpp
+++ b/core/fxcodec/codec/fx_codec_flate.cpp
@@ -822,7 +822,7 @@
   }
   if (bLZW) {
     {
-      std::unique_ptr<CLZWDecoder> decoder(new CLZWDecoder);
+      auto decoder = pdfium::MakeUnique<CLZWDecoder>();
       dest_size = 0xFFFFFFFF;
       offset = src_size;
       int err =
@@ -832,7 +832,7 @@
       }
     }
     {
-      std::unique_ptr<CLZWDecoder> decoder(new CLZWDecoder);
+      auto decoder = pdfium::MakeUnique<CLZWDecoder>();
       dest_buf = FX_Alloc(uint8_t, dest_size + 1);
       dest_buf[dest_size] = '\0';
       decoder->Decode(dest_buf, dest_size, src_buf, offset, bEarlyChange);
diff --git a/core/fxcodec/codec/fx_codec_jpx_opj.cpp b/core/fxcodec/codec/fx_codec_jpx_opj.cpp
index eccf876..4fc3d68 100644
--- a/core/fxcodec/codec/fx_codec_jpx_opj.cpp
+++ b/core/fxcodec/codec/fx_codec_jpx_opj.cpp
@@ -7,12 +7,15 @@
 #include <algorithm>
 #include <limits>
 #include <memory>
+#include <utility>
 #include <vector>
 
 #include "core/fpdfapi/page/cpdf_colorspace.h"
+#include "core/fxcodec/codec/cjpx_decoder.h"
 #include "core/fxcodec/codec/codec_int.h"
 #include "core/fxcodec/fx_codec.h"
 #include "core/fxcrt/fx_safe_types.h"
+#include "third_party/base/ptr_util.h"
 #include "third_party/lcms2-2.6/include/lcms2.h"
 #include "third_party/libopenjpeg20/openjpeg.h"
 
@@ -669,24 +672,6 @@
     return;
   }
 }
-class CJPX_Decoder {
- public:
-  explicit CJPX_Decoder(CPDF_ColorSpace* cs);
-  ~CJPX_Decoder();
-  bool Init(const unsigned char* src_data, uint32_t src_size);
-  void GetInfo(uint32_t* width, uint32_t* height, uint32_t* components);
-  bool Decode(uint8_t* dest_buf,
-              int pitch,
-              const std::vector<uint8_t>& offsets);
-
- private:
-  const uint8_t* m_SrcData;
-  uint32_t m_SrcSize;
-  opj_image_t* image;
-  opj_codec_t* l_codec;
-  opj_stream_t* l_stream;
-  const CPDF_ColorSpace* const m_ColorSpace;
-};
 
 CJPX_Decoder::CJPX_Decoder(CPDF_ColorSpace* cs)
     : image(nullptr), l_codec(nullptr), l_stream(nullptr), m_ColorSpace(cs) {}
@@ -872,13 +857,15 @@
 }
 
 CCodec_JpxModule::CCodec_JpxModule() {}
+
 CCodec_JpxModule::~CCodec_JpxModule() {}
 
-CJPX_Decoder* CCodec_JpxModule::CreateDecoder(const uint8_t* src_buf,
-                                              uint32_t src_size,
-                                              CPDF_ColorSpace* cs) {
-  std::unique_ptr<CJPX_Decoder> decoder(new CJPX_Decoder(cs));
-  return decoder->Init(src_buf, src_size) ? decoder.release() : nullptr;
+std::unique_ptr<CJPX_Decoder> CCodec_JpxModule::CreateDecoder(
+    const uint8_t* src_buf,
+    uint32_t src_size,
+    CPDF_ColorSpace* cs) {
+  auto decoder = pdfium::MakeUnique<CJPX_Decoder>(cs);
+  return decoder->Init(src_buf, src_size) ? std::move(decoder) : nullptr;
 }
 
 void CCodec_JpxModule::GetImageInfo(CJPX_Decoder* pDecoder,
@@ -894,7 +881,3 @@
                               const std::vector<uint8_t>& offsets) {
   return pDecoder->Decode(dest_data, pitch, offsets);
 }
-
-void CCodec_JpxModule::DestroyDecoder(CJPX_Decoder* pDecoder) {
-  delete pDecoder;
-}
diff --git a/core/fxcodec/jbig2/JBig2_Context.cpp b/core/fxcodec/jbig2/JBig2_Context.cpp
index 1090132..9261d16 100644
--- a/core/fxcodec/jbig2/JBig2_Context.cpp
+++ b/core/fxcodec/jbig2/JBig2_Context.cpp
@@ -122,7 +122,7 @@
 int32_t CJBig2_Context::decode_RandomOrgnazation_FirstPage(IFX_Pause* pPause) {
   int32_t nRet;
   while (m_pStream->getByteLeft() > JBIG2_MIN_SEGMENT_SIZE) {
-    std::unique_ptr<CJBig2_Segment> pSegment(new CJBig2_Segment);
+    auto pSegment = pdfium::MakeUnique<CJBig2_Segment>();
     nRet = parseSegmentHeader(pSegment.get());
     if (nRet != JBIG2_SUCCESS) {
       return nRet;
@@ -364,7 +364,7 @@
       return parseGenericRefinementRegion(pSegment);
     case 48: {
       uint16_t wTemp;
-      std::unique_ptr<JBig2PageInfo> pPageInfo(new JBig2PageInfo);
+      auto pPageInfo = pdfium::MakeUnique<JBig2PageInfo>();
       if (m_pStream->readInteger(&pPageInfo->m_dwWidth) != 0 ||
           m_pStream->readInteger(&pPageInfo->m_dwHeight) != 0 ||
           m_pStream->readInteger(&pPageInfo->m_dwResolutionX) != 0 ||
@@ -424,7 +424,7 @@
   if (m_pStream->readShortInteger(&wFlags) != 0)
     return JBIG2_ERROR_TOO_SHORT;
 
-  std::unique_ptr<CJBig2_SDDProc> pSymbolDictDecoder(new CJBig2_SDDProc);
+  auto pSymbolDictDecoder = pdfium::MakeUnique<CJBig2_SDDProc>();
   pSymbolDictDecoder->SDHUFF = wFlags & 0x0001;
   pSymbolDictDecoder->SDREFAGG = (wFlags >> 1) & 0x0001;
   pSymbolDictDecoder->SDTEMPLATE = (wFlags >> 10) & 0x0003;
@@ -600,8 +600,8 @@
   }
   if (!cache_hit) {
     if (bUseGbContext) {
-      std::unique_ptr<CJBig2_ArithDecoder> pArithDecoder(
-          new CJBig2_ArithDecoder(m_pStream.get()));
+      auto pArithDecoder =
+          pdfium::MakeUnique<CJBig2_ArithDecoder>(m_pStream.get());
       pSegment->m_Result.sd = pSymbolDictDecoder->decode_Arith(
           pArithDecoder.get(), &gbContext, &grContext);
       if (!pSegment->m_Result.sd)
@@ -644,7 +644,7 @@
     return JBIG2_ERROR_TOO_SHORT;
   }
 
-  std::unique_ptr<CJBig2_TRDProc> pTRD(new CJBig2_TRDProc);
+  auto pTRD = pdfium::MakeUnique<CJBig2_TRDProc>();
   pTRD->SBW = ri.width;
   pTRD->SBH = ri.height;
   pTRD->SBHUFF = wFlags & 0x0001;
@@ -902,8 +902,8 @@
     JBIG2_memset(grContext.get(), 0, sizeof(JBig2ArithCtx) * size);
   }
   if (pTRD->SBHUFF == 0) {
-    std::unique_ptr<CJBig2_ArithDecoder> pArithDecoder(
-        new CJBig2_ArithDecoder(m_pStream.get()));
+    auto pArithDecoder =
+        pdfium::MakeUnique<CJBig2_ArithDecoder>(m_pStream.get());
     pSegment->m_nResultType = JBIG2_IMAGE_POINTER;
     pSegment->m_Result.im =
         pTRD->decode_Arith(pArithDecoder.get(), grContext.get(), nullptr);
@@ -938,7 +938,7 @@
 int32_t CJBig2_Context::parsePatternDict(CJBig2_Segment* pSegment,
                                          IFX_Pause* pPause) {
   uint8_t cFlags;
-  std::unique_ptr<CJBig2_PDDProc> pPDD(new CJBig2_PDDProc);
+  auto pPDD = pdfium::MakeUnique<CJBig2_PDDProc>();
   if (m_pStream->read1Byte(&cFlags) != 0 ||
       m_pStream->read1Byte(&pPDD->HDPW) != 0 ||
       m_pStream->read1Byte(&pPDD->HDPH) != 0 ||
@@ -956,8 +956,8 @@
     std::unique_ptr<JBig2ArithCtx, FxFreeDeleter> gbContext(
         FX_Alloc(JBig2ArithCtx, size));
     JBIG2_memset(gbContext.get(), 0, sizeof(JBig2ArithCtx) * size);
-    std::unique_ptr<CJBig2_ArithDecoder> pArithDecoder(
-        new CJBig2_ArithDecoder(m_pStream.get()));
+    auto pArithDecoder =
+        pdfium::MakeUnique<CJBig2_ArithDecoder>(m_pStream.get());
     pSegment->m_Result.pd =
         pPDD->decode_Arith(pArithDecoder.get(), gbContext.get(), pPause);
     if (!pSegment->m_Result.pd)
@@ -978,7 +978,7 @@
                                             IFX_Pause* pPause) {
   uint8_t cFlags;
   JBig2RegionInfo ri;
-  std::unique_ptr<CJBig2_HTRDProc> pHRD(new CJBig2_HTRDProc);
+  auto pHRD = pdfium::MakeUnique<CJBig2_HTRDProc>();
   if (parseRegionInfo(&ri) != JBIG2_SUCCESS ||
       m_pStream->read1Byte(&cFlags) != 0 ||
       m_pStream->readInteger(&pHRD->HGW) != 0 ||
@@ -1022,8 +1022,8 @@
     std::unique_ptr<JBig2ArithCtx, FxFreeDeleter> gbContext(
         FX_Alloc(JBig2ArithCtx, size));
     JBIG2_memset(gbContext.get(), 0, sizeof(JBig2ArithCtx) * size);
-    std::unique_ptr<CJBig2_ArithDecoder> pArithDecoder(
-        new CJBig2_ArithDecoder(m_pStream.get()));
+    auto pArithDecoder =
+        pdfium::MakeUnique<CJBig2_ArithDecoder>(m_pStream.get());
     pSegment->m_Result.im =
         pHRD->decode_Arith(pArithDecoder.get(), gbContext.get(), pPause);
     if (!pSegment->m_Result.im)
@@ -1056,7 +1056,7 @@
 int32_t CJBig2_Context::parseGenericRegion(CJBig2_Segment* pSegment,
                                            IFX_Pause* pPause) {
   if (!m_pGRD) {
-    std::unique_ptr<CJBig2_GRDProc> pGRD(new CJBig2_GRDProc);
+    auto pGRD = pdfium::MakeUnique<CJBig2_GRDProc>();
     uint8_t cFlags;
     if (parseRegionInfo(&m_ri) != JBIG2_SUCCESS ||
         m_pStream->read1Byte(&cFlags) != 0) {
@@ -1165,7 +1165,7 @@
       m_pStream->read1Byte(&cFlags) != 0) {
     return JBIG2_ERROR_TOO_SHORT;
   }
-  std::unique_ptr<CJBig2_GRRDProc> pGRRD(new CJBig2_GRRDProc);
+  auto pGRRD = pdfium::MakeUnique<CJBig2_GRRDProc>();
   pGRRD->GRW = ri.width;
   pGRRD->GRH = ri.height;
   pGRRD->GRTEMPLATE = !!(cFlags & 0x01);
@@ -1202,8 +1202,7 @@
   std::unique_ptr<JBig2ArithCtx, FxFreeDeleter> grContext(
       FX_Alloc(JBig2ArithCtx, size));
   JBIG2_memset(grContext.get(), 0, sizeof(JBig2ArithCtx) * size);
-  std::unique_ptr<CJBig2_ArithDecoder> pArithDecoder(
-      new CJBig2_ArithDecoder(m_pStream.get()));
+  auto pArithDecoder = pdfium::MakeUnique<CJBig2_ArithDecoder>(m_pStream.get());
   pSegment->m_nResultType = JBIG2_IMAGE_POINTER;
   pSegment->m_Result.im = pGRRD->decode(pArithDecoder.get(), grContext.get());
   if (!pSegment->m_Result.im)
@@ -1230,8 +1229,7 @@
 int32_t CJBig2_Context::parseTable(CJBig2_Segment* pSegment) {
   pSegment->m_nResultType = JBIG2_HUFFMAN_TABLE_POINTER;
   pSegment->m_Result.ht = nullptr;
-  std::unique_ptr<CJBig2_HuffmanTable> pHuff(
-      new CJBig2_HuffmanTable(m_pStream.get()));
+  auto pHuff = pdfium::MakeUnique<CJBig2_HuffmanTable>(m_pStream.get());
   if (!pHuff->IsOK())
     return JBIG2_ERROR_FATAL;
 
diff --git a/core/fxcodec/jbig2/JBig2_GrdProc.cpp b/core/fxcodec/jbig2/JBig2_GrdProc.cpp
index d5d4c6d..675de9b 100644
--- a/core/fxcodec/jbig2/JBig2_GrdProc.cpp
+++ b/core/fxcodec/jbig2/JBig2_GrdProc.cpp
@@ -12,6 +12,7 @@
 #include "core/fxcodec/jbig2/JBig2_ArithDecoder.h"
 #include "core/fxcodec/jbig2/JBig2_BitStream.h"
 #include "core/fxcodec/jbig2/JBig2_Image.h"
+#include "third_party/base/ptr_util.h"
 
 CJBig2_GRDProc::CJBig2_GRDProc()
     : m_loopIndex(0),
@@ -65,7 +66,7 @@
 CJBig2_Image* CJBig2_GRDProc::decode_Arith_Template0_opt3(
     CJBig2_ArithDecoder* pArithDecoder,
     JBig2ArithCtx* gbContext) {
-  std::unique_ptr<CJBig2_Image> GBREG(new CJBig2_Image(GBW, GBH));
+  auto GBREG = pdfium::MakeUnique<CJBig2_Image>(GBW, GBH);
   if (!GBREG->m_pData)
     return nullptr;
 
@@ -164,7 +165,7 @@
     CJBig2_ArithDecoder* pArithDecoder,
     JBig2ArithCtx* gbContext) {
   int LTP = 0;
-  std::unique_ptr<CJBig2_Image> GBREG(new CJBig2_Image(GBW, GBH));
+  auto GBREG = pdfium::MakeUnique<CJBig2_Image>(GBW, GBH);
   GBREG->fill(0);
   for (uint32_t h = 0; h < GBH; h++) {
     if (TPGDON) {
@@ -214,7 +215,7 @@
 CJBig2_Image* CJBig2_GRDProc::decode_Arith_Template1_opt3(
     CJBig2_ArithDecoder* pArithDecoder,
     JBig2ArithCtx* gbContext) {
-  std::unique_ptr<CJBig2_Image> GBREG(new CJBig2_Image(GBW, GBH));
+  auto GBREG = pdfium::MakeUnique<CJBig2_Image>(GBW, GBH);
   if (!GBREG->m_pData)
     return nullptr;
 
@@ -312,7 +313,7 @@
     CJBig2_ArithDecoder* pArithDecoder,
     JBig2ArithCtx* gbContext) {
   int LTP = 0;
-  std::unique_ptr<CJBig2_Image> GBREG(new CJBig2_Image(GBW, GBH));
+  auto GBREG = pdfium::MakeUnique<CJBig2_Image>(GBW, GBH);
   GBREG->fill(0);
   for (uint32_t h = 0; h < GBH; h++) {
     if (TPGDON) {
@@ -360,7 +361,7 @@
 CJBig2_Image* CJBig2_GRDProc::decode_Arith_Template2_opt3(
     CJBig2_ArithDecoder* pArithDecoder,
     JBig2ArithCtx* gbContext) {
-  std::unique_ptr<CJBig2_Image> GBREG(new CJBig2_Image(GBW, GBH));
+  auto GBREG = pdfium::MakeUnique<CJBig2_Image>(GBW, GBH);
   if (!GBREG->m_pData)
     return nullptr;
 
@@ -458,7 +459,7 @@
     CJBig2_ArithDecoder* pArithDecoder,
     JBig2ArithCtx* gbContext) {
   int LTP = 0;
-  std::unique_ptr<CJBig2_Image> GBREG(new CJBig2_Image(GBW, GBH));
+  auto GBREG = pdfium::MakeUnique<CJBig2_Image>(GBW, GBH);
   GBREG->fill(0);
   for (uint32_t h = 0; h < GBH; h++) {
     if (TPGDON) {
@@ -504,7 +505,7 @@
 CJBig2_Image* CJBig2_GRDProc::decode_Arith_Template3_opt3(
     CJBig2_ArithDecoder* pArithDecoder,
     JBig2ArithCtx* gbContext) {
-  std::unique_ptr<CJBig2_Image> GBREG(new CJBig2_Image(GBW, GBH));
+  auto GBREG = pdfium::MakeUnique<CJBig2_Image>(GBW, GBH);
   if (!GBREG->m_pData)
     return nullptr;
 
@@ -590,7 +591,7 @@
     CJBig2_ArithDecoder* pArithDecoder,
     JBig2ArithCtx* gbContext) {
   int LTP = 0;
-  std::unique_ptr<CJBig2_Image> GBREG(new CJBig2_Image(GBW, GBH));
+  auto GBREG = pdfium::MakeUnique<CJBig2_Image>(GBW, GBH);
   GBREG->fill(0);
   for (uint32_t h = 0; h < GBH; h++) {
     if (TPGDON) {
diff --git a/core/fxcodec/jbig2/JBig2_GrrdProc.cpp b/core/fxcodec/jbig2/JBig2_GrrdProc.cpp
index 669fed6..936b851 100644
--- a/core/fxcodec/jbig2/JBig2_GrrdProc.cpp
+++ b/core/fxcodec/jbig2/JBig2_GrrdProc.cpp
@@ -11,6 +11,7 @@
 #include "core/fxcodec/jbig2/JBig2_ArithDecoder.h"
 #include "core/fxcodec/jbig2/JBig2_BitStream.h"
 #include "core/fxcodec/jbig2/JBig2_Image.h"
+#include "third_party/base/ptr_util.h"
 
 CJBig2_Image* CJBig2_GRRDProc::decode(CJBig2_ArithDecoder* pArithDecoder,
                                       JBig2ArithCtx* grContext) {
@@ -35,7 +36,7 @@
     CJBig2_ArithDecoder* pArithDecoder,
     JBig2ArithCtx* grContext) {
   int LTP = 0;
-  std::unique_ptr<CJBig2_Image> GRREG(new CJBig2_Image(GRW, GRH));
+  auto GRREG = pdfium::MakeUnique<CJBig2_Image>(GRW, GRH);
   GRREG->fill(0);
   for (uint32_t h = 0; h < GRH; h++) {
     if (TPGRON)
@@ -155,7 +156,7 @@
 
   int32_t iGRW = static_cast<int32_t>(GRW);
   int32_t iGRH = static_cast<int32_t>(GRH);
-  std::unique_ptr<CJBig2_Image> GRREG(new CJBig2_Image(iGRW, iGRH));
+  auto GRREG = pdfium::MakeUnique<CJBig2_Image>(iGRW, iGRH);
   if (!GRREG->m_pData)
     return nullptr;
 
@@ -283,7 +284,7 @@
     CJBig2_ArithDecoder* pArithDecoder,
     JBig2ArithCtx* grContext) {
   int LTP = 0;
-  std::unique_ptr<CJBig2_Image> GRREG(new CJBig2_Image(GRW, GRH));
+  auto GRREG = pdfium::MakeUnique<CJBig2_Image>(GRW, GRH);
   GRREG->fill(0);
   for (uint32_t h = 0; h < GRH; h++) {
     if (TPGRON)
@@ -389,7 +390,7 @@
 
   int32_t iGRW = static_cast<int32_t>(GRW);
   int32_t iGRH = static_cast<int32_t>(GRH);
-  std::unique_ptr<CJBig2_Image> GRREG(new CJBig2_Image(iGRW, iGRH));
+  auto GRREG = pdfium::MakeUnique<CJBig2_Image>(iGRW, iGRH);
   if (!GRREG->m_pData)
     return nullptr;
 
diff --git a/core/fxcodec/jbig2/JBig2_GsidProc.cpp b/core/fxcodec/jbig2/JBig2_GsidProc.cpp
index 387f8ee..e65b47d 100644
--- a/core/fxcodec/jbig2/JBig2_GsidProc.cpp
+++ b/core/fxcodec/jbig2/JBig2_GsidProc.cpp
@@ -13,11 +13,12 @@
 #include "core/fxcodec/jbig2/JBig2_GrdProc.h"
 #include "core/fxcodec/jbig2/JBig2_Image.h"
 #include "core/fxcrt/fx_basic.h"
+#include "third_party/base/ptr_util.h"
 
 uint32_t* CJBig2_GSIDProc::decode_Arith(CJBig2_ArithDecoder* pArithDecoder,
                                         JBig2ArithCtx* gbContext,
                                         IFX_Pause* pPause) {
-  std::unique_ptr<CJBig2_GRDProc> pGRD(new CJBig2_GRDProc());
+  auto pGRD = pdfium::MakeUnique<CJBig2_GRDProc>();
   pGRD->MMR = GSMMR;
   pGRD->GBW = GSW;
   pGRD->GBH = GSH;
@@ -69,7 +70,7 @@
 
 uint32_t* CJBig2_GSIDProc::decode_MMR(CJBig2_BitStream* pStream,
                                       IFX_Pause* pPause) {
-  std::unique_ptr<CJBig2_GRDProc> pGRD(new CJBig2_GRDProc());
+  auto pGRD = pdfium::MakeUnique<CJBig2_GRDProc>();
   pGRD->MMR = GSMMR;
   pGRD->GBW = GSW;
   pGRD->GBH = GSH;
diff --git a/core/fxcodec/jbig2/JBig2_HtrdProc.cpp b/core/fxcodec/jbig2/JBig2_HtrdProc.cpp
index 121bf1d..8899fb1 100644
--- a/core/fxcodec/jbig2/JBig2_HtrdProc.cpp
+++ b/core/fxcodec/jbig2/JBig2_HtrdProc.cpp
@@ -20,7 +20,7 @@
   uint32_t HBPP;
   uint32_t* GI;
   std::unique_ptr<CJBig2_Image> HSKIP;
-  std::unique_ptr<CJBig2_Image> HTREG(new CJBig2_Image(HBW, HBH));
+  auto HTREG = pdfium::MakeUnique<CJBig2_Image>(HBW, HBH);
   HTREG->fill(HDEFPIXEL);
   if (HENABLESKIP == 1) {
     HSKIP = pdfium::MakeUnique<CJBig2_Image>(HGW, HGH);
@@ -41,7 +41,7 @@
   while ((uint32_t)(1 << HBPP) < HNUMPATS) {
     HBPP++;
   }
-  std::unique_ptr<CJBig2_GSIDProc> pGID(new CJBig2_GSIDProc());
+  auto pGID = pdfium::MakeUnique<CJBig2_GSIDProc>();
   pGID->GSMMR = HMMR;
   pGID->GSW = HGW;
   pGID->GSH = HGH;
@@ -73,13 +73,13 @@
   uint32_t ng, mg;
   int32_t x, y;
   uint32_t* GI;
-  std::unique_ptr<CJBig2_Image> HTREG(new CJBig2_Image(HBW, HBH));
+  auto HTREG = pdfium::MakeUnique<CJBig2_Image>(HBW, HBH);
   HTREG->fill(HDEFPIXEL);
   uint32_t HBPP = 1;
   while ((uint32_t)(1 << HBPP) < HNUMPATS) {
     HBPP++;
   }
-  std::unique_ptr<CJBig2_GSIDProc> pGID(new CJBig2_GSIDProc());
+  auto pGID = pdfium::MakeUnique<CJBig2_GSIDProc>();
   pGID->GSMMR = HMMR;
   pGID->GSW = HGW;
   pGID->GSH = HGH;
diff --git a/core/fxcodec/jbig2/JBig2_PddProc.cpp b/core/fxcodec/jbig2/JBig2_PddProc.cpp
index 679a87a..3eef302 100644
--- a/core/fxcodec/jbig2/JBig2_PddProc.cpp
+++ b/core/fxcodec/jbig2/JBig2_PddProc.cpp
@@ -11,6 +11,7 @@
 #include "core/fxcodec/jbig2/JBig2_GrdProc.h"
 #include "core/fxcodec/jbig2/JBig2_Image.h"
 #include "core/fxcodec/jbig2/JBig2_PatternDict.h"
+#include "third_party/base/ptr_util.h"
 
 CJBig2_PatternDict* CJBig2_PDDProc::decode_Arith(
     CJBig2_ArithDecoder* pArithDecoder,
@@ -18,12 +19,12 @@
     IFX_Pause* pPause) {
   uint32_t GRAY;
   CJBig2_Image* BHDC = nullptr;
-  std::unique_ptr<CJBig2_PatternDict> pDict(new CJBig2_PatternDict());
+  auto pDict = pdfium::MakeUnique<CJBig2_PatternDict>();
   pDict->NUMPATS = GRAYMAX + 1;
   pDict->HDPATS = FX_Alloc(CJBig2_Image*, pDict->NUMPATS);
   JBIG2_memset(pDict->HDPATS, 0, sizeof(CJBig2_Image*) * pDict->NUMPATS);
 
-  std::unique_ptr<CJBig2_GRDProc> pGRD(new CJBig2_GRDProc());
+  auto pGRD = pdfium::MakeUnique<CJBig2_GRDProc>();
   pGRD->MMR = HDMMR;
   pGRD->GBW = (GRAYMAX + 1) * HDPW;
   pGRD->GBH = HDPH;
@@ -60,12 +61,12 @@
                                                IFX_Pause* pPause) {
   uint32_t GRAY;
   CJBig2_Image* BHDC = nullptr;
-  std::unique_ptr<CJBig2_PatternDict> pDict(new CJBig2_PatternDict());
+  auto pDict = pdfium::MakeUnique<CJBig2_PatternDict>();
   pDict->NUMPATS = GRAYMAX + 1;
   pDict->HDPATS = FX_Alloc(CJBig2_Image*, pDict->NUMPATS);
   JBIG2_memset(pDict->HDPATS, 0, sizeof(CJBig2_Image*) * pDict->NUMPATS);
 
-  std::unique_ptr<CJBig2_GRDProc> pGRD(new CJBig2_GRDProc());
+  auto pGRD = pdfium::MakeUnique<CJBig2_GRDProc>();
   pGRD->MMR = HDMMR;
   pGRD->GBW = (GRAYMAX + 1) * HDPW;
   pGRD->GBH = HDPH;
diff --git a/core/fxcodec/jbig2/JBig2_TrdProc.cpp b/core/fxcodec/jbig2/JBig2_TrdProc.cpp
index 84042db..cf58d9c 100644
--- a/core/fxcodec/jbig2/JBig2_TrdProc.cpp
+++ b/core/fxcodec/jbig2/JBig2_TrdProc.cpp
@@ -16,9 +16,8 @@
 
 CJBig2_Image* CJBig2_TRDProc::decode_Huffman(CJBig2_BitStream* pStream,
                                              JBig2ArithCtx* grContext) {
-  std::unique_ptr<CJBig2_HuffmanDecoder> pHuffmanDecoder(
-      new CJBig2_HuffmanDecoder(pStream));
-  std::unique_ptr<CJBig2_Image> SBREG(new CJBig2_Image(SBW, SBH));
+  auto pHuffmanDecoder = pdfium::MakeUnique<CJBig2_HuffmanDecoder>(pStream);
+  auto SBREG = pdfium::MakeUnique<CJBig2_Image>(SBW, SBH);
   SBREG->fill(SBDEFPIXEL);
   int32_t STRIPT;
   if (pHuffmanDecoder->decodeAValue(SBHUFFDT, &STRIPT) != 0)
@@ -120,7 +119,7 @@
         if ((int)(WOI + RDWI) < 0 || (int)(HOI + RDHI) < 0)
           return nullptr;
 
-        std::unique_ptr<CJBig2_GRRDProc> pGRRD(new CJBig2_GRRDProc());
+        auto pGRRD = pdfium::MakeUnique<CJBig2_GRRDProc>();
         pGRRD->GRW = WOI + RDWI;
         pGRRD->GRH = HOI + RDHI;
         pGRRD->GRTEMPLATE = SBRTEMPLATE;
@@ -134,8 +133,7 @@
         pGRRD->GRAT[3] = SBRAT[3];
 
         {
-          std::unique_ptr<CJBig2_ArithDecoder> pArithDecoder(
-              new CJBig2_ArithDecoder(pStream));
+          auto pArithDecoder = pdfium::MakeUnique<CJBig2_ArithDecoder>(pStream);
           IBI = pGRRD->decode(pArithDecoder.get(), grContext);
           if (!IBI)
             return nullptr;
@@ -264,7 +262,7 @@
     pIARDY = IARDY.get();
     pIAID = IAID.get();
   }
-  std::unique_ptr<CJBig2_Image> SBREG(new CJBig2_Image(SBW, SBH));
+  auto SBREG = pdfium::MakeUnique<CJBig2_Image>(SBW, SBH);
   SBREG->fill(SBDEFPIXEL);
   int32_t STRIPT;
   if (!pIADT->decode(pArithDecoder, &STRIPT))
@@ -335,7 +333,7 @@
         if ((int)(WOI + RDWI) < 0 || (int)(HOI + RDHI) < 0)
           return nullptr;
 
-        std::unique_ptr<CJBig2_GRRDProc> pGRRD(new CJBig2_GRRDProc());
+        auto pGRRD = pdfium::MakeUnique<CJBig2_GRRDProc>();
         pGRRD->GRW = WOI + RDWI;
         pGRRD->GRH = HOI + RDHI;
         pGRRD->GRTEMPLATE = SBRTEMPLATE;
diff --git a/core/fxcrt/fx_basic_util.cpp b/core/fxcrt/fx_basic_util.cpp
index 19e5696..9f699e4 100644
--- a/core/fxcrt/fx_basic_util.cpp
+++ b/core/fxcrt/fx_basic_util.cpp
@@ -4,14 +4,15 @@
 
 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
 
-#include "core/fxcrt/fx_basic.h"
-#include "core/fxcrt/fx_ext.h"
-
 #include <algorithm>
 #include <cctype>
 #include <limits>
 #include <memory>
 
+#include "core/fxcrt/fx_basic.h"
+#include "core/fxcrt/fx_ext.h"
+#include "third_party/base/ptr_util.h"
+
 bool FX_atonum(const CFX_ByteStringC& strc, void* pData) {
   if (strc.Find('.') != -1) {
     float* pFloat = static_cast<float*>(pData);
@@ -142,7 +143,7 @@
 
 FX_FileHandle* FX_OpenFolder(const char* path) {
 #if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_
-  std::unique_ptr<CFindFileDataA> pData(new CFindFileDataA);
+  auto pData = pdfium::MakeUnique<CFindFileDataA>();
   pData->m_Handle = FindFirstFileExA((CFX_ByteString(path) + "/*.*").c_str(),
                                      FindExInfoStandard, &pData->m_FindData,
                                      FindExSearchNameMatch, nullptr, 0);
diff --git a/core/fxge/android/fx_android_imp.cpp b/core/fxge/android/fx_android_imp.cpp
index b8e7c5b..e4fdd1e 100644
--- a/core/fxge/android/fx_android_imp.cpp
+++ b/core/fxge/android/fx_android_imp.cpp
@@ -11,6 +11,7 @@
 
 #include "core/fxge/android/cfpf_skiadevicemodule.h"
 #include "core/fxge/android/cfx_androidfontinfo.h"
+#include "third_party/base/ptr_util.h"
 
 void CFX_GEModule::InitPlatform() {
   CFPF_SkiaDeviceModule* pDeviceModule = CFPF_GetSkiaDeviceModule();
@@ -19,7 +20,7 @@
 
   CFPF_SkiaFontMgr* pFontMgr = pDeviceModule->GetFontMgr();
   if (pFontMgr) {
-    std::unique_ptr<CFX_AndroidFontInfo> pFontInfo(new CFX_AndroidFontInfo);
+    auto pFontInfo = pdfium::MakeUnique<CFX_AndroidFontInfo>();
     pFontInfo->Init(pFontMgr);
     m_pFontMgr->SetSystemFontInfo(std::move(pFontInfo));
   }
diff --git a/core/fxge/ge/cfx_fontcache.cpp b/core/fxge/ge/cfx_fontcache.cpp
index 58cee06..1599c30 100644
--- a/core/fxge/ge/cfx_fontcache.cpp
+++ b/core/fxge/ge/cfx_fontcache.cpp
@@ -12,6 +12,7 @@
 #include "core/fxge/cfx_facecache.h"
 #include "core/fxge/fx_font.h"
 #include "core/fxge/fx_freetype.h"
+#include "third_party/base/ptr_util.h"
 
 CFX_FontCache::CountedFaceCache::CountedFaceCache() {}
 
@@ -35,7 +36,7 @@
     return counted_face_cache->m_Obj.get();
   }
 
-  std::unique_ptr<CountedFaceCache> counted_face_cache(new CountedFaceCache);
+  auto counted_face_cache = pdfium::MakeUnique<CountedFaceCache>();
   counted_face_cache->m_nCount = 2;
   CFX_FaceCache* face_cache = new CFX_FaceCache(bExternal ? nullptr : face);
   counted_face_cache->m_Obj.reset(face_cache);
diff --git a/fpdfsdk/cfx_systemhandler.cpp b/fpdfsdk/cfx_systemhandler.cpp
index ea64412..9069543 100644
--- a/fpdfsdk/cfx_systemhandler.cpp
+++ b/fpdfsdk/cfx_systemhandler.cpp
@@ -114,7 +114,7 @@
   if (!pDoc)
     return nullptr;
 
-  std::unique_ptr<CFX_Font> pFXFont(new CFX_Font);
+  auto pFXFont = pdfium::MakeUnique<CFX_Font>();
   pFXFont->LoadSubst(sFontFaceName, true, 0, 0, 0, CharSet2CP(nCharset), false);
   return pDoc->AddFont(pFXFont.get(), nCharset, false);
 }
diff --git a/fpdfsdk/cpdfsdk_formfillenvironment.cpp b/fpdfsdk/cpdfsdk_formfillenvironment.cpp
index 091ccfc..680cd25 100644
--- a/fpdfsdk/cpdfsdk_formfillenvironment.cpp
+++ b/fpdfsdk/cpdfsdk_formfillenvironment.cpp
@@ -35,7 +35,7 @@
     FPDF_FORMFILLINFO* pFFinfo)
     : m_pInfo(pFFinfo),
       m_pUnderlyingDoc(pDoc),
-      m_pSysHandler(new CFX_SystemHandler(this)),
+      m_pSysHandler(pdfium::MakeUnique<CFX_SystemHandler>(this)),
       m_bChangeMask(false),
       m_bBeingDestroyed(false) {}
 
diff --git a/fpdfsdk/cpdfsdk_interform.cpp b/fpdfsdk/cpdfsdk_interform.cpp
index a16ec93..635a534 100644
--- a/fpdfsdk/cpdfsdk_interform.cpp
+++ b/fpdfsdk/cpdfsdk_interform.cpp
@@ -47,7 +47,8 @@
 
 CPDFSDK_InterForm::CPDFSDK_InterForm(CPDFSDK_FormFillEnvironment* pFormFillEnv)
     : m_pFormFillEnv(pFormFillEnv),
-      m_pInterForm(new CPDF_InterForm(m_pFormFillEnv->GetPDFDocument())),
+      m_pInterForm(
+          pdfium::MakeUnique<CPDF_InterForm>(m_pFormFillEnv->GetPDFDocument())),
 #ifdef PDF_ENABLE_XFA
       m_bXfaCalculate(true),
       m_bXfaValidationsEnabled(true),
@@ -73,8 +74,8 @@
 
 CPDFSDK_Widget* CPDFSDK_InterForm::GetSibling(CPDFSDK_Widget* pWidget,
                                               bool bNext) const {
-  std::unique_ptr<CBA_AnnotIterator> pIterator(new CBA_AnnotIterator(
-      pWidget->GetPageView(), CPDF_Annot::Subtype::WIDGET));
+  auto pIterator = pdfium::MakeUnique<CBA_AnnotIterator>(
+      pWidget->GetPageView(), CPDF_Annot::Subtype::WIDGET);
 
   if (bNext)
     return static_cast<CPDFSDK_Widget*>(pIterator->GetNextAnnot(pWidget));
diff --git a/fpdfsdk/cpdfsdk_pageview.cpp b/fpdfsdk/cpdfsdk_pageview.cpp
index 7a8e266..946dd84 100644
--- a/fpdfsdk/cpdfsdk_pageview.cpp
+++ b/fpdfsdk/cpdfsdk_pageview.cpp
@@ -100,7 +100,7 @@
         static_cast<float>(pClip.left), static_cast<float>(pClip.top),
         static_cast<float>(pClip.Width()), static_cast<float>(pClip.Height()));
     gs.SetClipRect(rectClip);
-    std::unique_ptr<CXFA_RenderContext> pRenderContext(new CXFA_RenderContext);
+    auto pRenderContext = pdfium::MakeUnique<CXFA_RenderContext>();
     CXFA_RenderOptions renderOptions;
     renderOptions.m_bHighlight = true;
     CXFA_FFPageView* xfaView = pPage->GetXFAPageView();
diff --git a/fpdfsdk/cpdfsdk_widget.cpp b/fpdfsdk/cpdfsdk_widget.cpp
index 2ffd170..e65a94b 100644
--- a/fpdfsdk/cpdfsdk_widget.cpp
+++ b/fpdfsdk/cpdfsdk_widget.cpp
@@ -1357,7 +1357,7 @@
   rcButton.left = rcButton.right - 13;
   rcButton.Normalize();
 
-  std::unique_ptr<CFX_Edit> pEdit(new CFX_Edit);
+  auto pEdit = pdfium::MakeUnique<CFX_Edit>();
   pEdit->EnableRefresh(false);
 
   CBA_FontMap font_map(this, m_pInterForm->GetFormFillEnv()->GetSysHandler());
@@ -1421,7 +1421,7 @@
   CFX_FloatRect rcClient = GetClientRect();
   CFX_ByteTextBuf sBody, sLines;
 
-  std::unique_ptr<CFX_Edit> pEdit(new CFX_Edit);
+  auto pEdit = pdfium::MakeUnique<CFX_Edit>();
   pEdit->EnableRefresh(false);
 
   CBA_FontMap font_map(this, m_pInterForm->GetFormFillEnv()->GetSysHandler());
@@ -1503,7 +1503,7 @@
   CPDF_FormField* pField = pControl->GetField();
   CFX_ByteTextBuf sBody, sLines;
 
-  std::unique_ptr<CFX_Edit> pEdit(new CFX_Edit);
+  auto pEdit = pdfium::MakeUnique<CFX_Edit>();
   pEdit->EnableRefresh(false);
 
   CBA_FontMap font_map(this, m_pInterForm->GetFormFillEnv()->GetSysHandler());
diff --git a/fpdfsdk/fpdf_dataavail.cpp b/fpdfsdk/fpdf_dataavail.cpp
index b1bc1e3..f2358d2 100644
--- a/fpdfsdk/fpdf_dataavail.cpp
+++ b/fpdfsdk/fpdf_dataavail.cpp
@@ -60,9 +60,9 @@
 
 class CFPDF_FileAccessWrap : public IFX_SeekableReadStream {
  public:
-  static CFX_RetainPtr<CFPDF_FileAccessWrap> Create() {
-    return CFX_RetainPtr<CFPDF_FileAccessWrap>(new CFPDF_FileAccessWrap());
-  }
+  template <typename T, typename... Args>
+  friend CFX_RetainPtr<T> pdfium::MakeRetain(Args&&... args);
+
   ~CFPDF_FileAccessWrap() override {}
 
   void Set(FPDF_FILEACCESS* pFile) { m_pFileAccess = pFile; }
@@ -101,8 +101,8 @@
 class CFPDF_DataAvail {
  public:
   CFPDF_DataAvail()
-      : m_FileAvail(new CFPDF_FileAvailWrap),
-        m_FileRead(CFPDF_FileAccessWrap::Create()) {}
+      : m_FileAvail(pdfium::MakeUnique<CFPDF_FileAvailWrap>()),
+        m_FileRead(pdfium::MakeRetain<CFPDF_FileAccessWrap>()) {}
   ~CFPDF_DataAvail() {}
 
   std::unique_ptr<CPDF_DataAvail> m_pDataAvail;
@@ -145,11 +145,10 @@
   if (!pDataAvail)
     return nullptr;
 
-  std::unique_ptr<CPDF_Parser> pParser(new CPDF_Parser);
+  auto pParser = pdfium::MakeUnique<CPDF_Parser>();
   pParser->SetPassword(password);
 
-  std::unique_ptr<CPDF_Document> pDocument(
-      new CPDF_Document(std::move(pParser)));
+  auto pDocument = pdfium::MakeUnique<CPDF_Document>(std::move(pParser));
   CPDF_Parser::Error error = pDocument->GetParser()->StartLinearizedParse(
       pDataAvail->m_pDataAvail->GetFileRead(), pDocument.get());
   if (error != CPDF_Parser::SUCCESS) {
diff --git a/fpdfsdk/fpdf_flatten.cpp b/fpdfsdk/fpdf_flatten.cpp
index c43412c..8e181eb 100644
--- a/fpdfsdk/fpdf_flatten.cpp
+++ b/fpdfsdk/fpdf_flatten.cpp
@@ -51,7 +51,7 @@
 void GetContentsRect(CPDF_Document* pDoc,
                      CPDF_Dictionary* pDict,
                      std::vector<CFX_FloatRect>* pRectArray) {
-  std::unique_ptr<CPDF_Page> pPDFPage(new CPDF_Page(pDoc, pDict, false));
+  auto pPDFPage = pdfium::MakeUnique<CPDF_Page>(pDoc, pDict, false);
   pPDFPage->ParseContent();
 
   for (const auto& pPageObject : *pPDFPage->GetPageObjectList()) {
diff --git a/fpdfsdk/fpdfsave.cpp b/fpdfsdk/fpdfsave.cpp
index 1d076cc..6894f8c 100644
--- a/fpdfsdk/fpdfsave.cpp
+++ b/fpdfsdk/fpdfsave.cpp
@@ -41,10 +41,14 @@
 class CFX_IFileWrite final : public IFX_WriteStream {
  public:
   static CFX_RetainPtr<CFX_IFileWrite> Create();
+
   bool Init(FPDF_FILEWRITE* pFileWriteStruct);
   bool WriteBlock(const void* pData, size_t size) override;
 
  protected:
+  template <typename T, typename... Args>
+  friend CFX_RetainPtr<T> pdfium::MakeRetain(Args&&... args);
+
   CFX_IFileWrite();
   ~CFX_IFileWrite() override {}
 
@@ -52,7 +56,7 @@
 };
 
 CFX_RetainPtr<CFX_IFileWrite> CFX_IFileWrite::Create() {
-  return CFX_RetainPtr<CFX_IFileWrite>(new CFX_IFileWrite());
+  return pdfium::MakeRetain<CFX_IFileWrite>();
 }
 
 CFX_IFileWrite::CFX_IFileWrite() : m_pFileWriteStruct(nullptr) {}
@@ -127,7 +131,7 @@
     else if (pPDFObj->GetString() == "template")
       iTemplate = i + 1;
   }
-  std::unique_ptr<CFX_ChecksumContext> pChecksum(new CFX_ChecksumContext);
+  auto pChecksum = pdfium::MakeUnique<CFX_ChecksumContext>();
   pChecksum->StartChecksum();
 
   // template
diff --git a/fpdfsdk/fpdfxfa/cpdfxfa_docenvironment.cpp b/fpdfsdk/fpdfxfa/cpdfxfa_docenvironment.cpp
index 45c5d92..7afd12c 100644
--- a/fpdfsdk/fpdfxfa/cpdfxfa_docenvironment.cpp
+++ b/fpdfsdk/fpdfxfa/cpdfxfa_docenvironment.cpp
@@ -497,7 +497,7 @@
         fileWrite->WriteBlock(content.c_str(), fileWrite->GetSize(),
                               content.GetLength());
       }
-      std::unique_ptr<CPDF_StreamAcc> pAcc(new CPDF_StreamAcc);
+      auto pAcc = pdfium::MakeUnique<CPDF_StreamAcc>();
       pAcc->LoadAllData(pStream);
       fileWrite->WriteBlock(pAcc->GetData(), fileWrite->GetSize(),
                             pAcc->GetSize());
diff --git a/fpdfsdk/javascript/JS_GlobalData.cpp b/fpdfsdk/javascript/JS_GlobalData.cpp
index 048fca0..1420264 100644
--- a/fpdfsdk/javascript/JS_GlobalData.cpp
+++ b/fpdfsdk/javascript/JS_GlobalData.cpp
@@ -9,6 +9,7 @@
 #include <utility>
 
 #include "core/fdrm/crypto/fx_crypt.h"
+#include "third_party/base/ptr_util.h"
 #include "third_party/base/stl_util.h"
 
 #define JS_MAXGLOBALDATA (1024 * 4 - 8)
@@ -104,7 +105,7 @@
     pData->data.dData = dData;
     return;
   }
-  std::unique_ptr<CJS_GlobalData_Element> pNewData(new CJS_GlobalData_Element);
+  auto pNewData = pdfium::MakeUnique<CJS_GlobalData_Element>();
   pNewData->data.sKey = sPropName;
   pNewData->data.nType = JS_GlobalDataType::NUMBER;
   pNewData->data.dData = dData;
@@ -122,7 +123,7 @@
     pData->data.bData = bData;
     return;
   }
-  std::unique_ptr<CJS_GlobalData_Element> pNewData(new CJS_GlobalData_Element);
+  auto pNewData = pdfium::MakeUnique<CJS_GlobalData_Element>();
   pNewData->data.sKey = sPropName;
   pNewData->data.nType = JS_GlobalDataType::BOOLEAN;
   pNewData->data.bData = bData;
@@ -140,7 +141,7 @@
     pData->data.sData = sData;
     return;
   }
-  std::unique_ptr<CJS_GlobalData_Element> pNewData(new CJS_GlobalData_Element);
+  auto pNewData = pdfium::MakeUnique<CJS_GlobalData_Element>();
   pNewData->data.sKey = sPropName;
   pNewData->data.nType = JS_GlobalDataType::STRING;
   pNewData->data.sData = sData;
@@ -159,7 +160,7 @@
     pData->data.objData.Copy(array);
     return;
   }
-  std::unique_ptr<CJS_GlobalData_Element> pNewData(new CJS_GlobalData_Element);
+  auto pNewData = pdfium::MakeUnique<CJS_GlobalData_Element>();
   pNewData->data.sKey = sPropName;
   pNewData->data.nType = JS_GlobalDataType::OBJECT;
   pNewData->data.objData.Copy(array);
@@ -175,7 +176,7 @@
     pData->data.nType = JS_GlobalDataType::NULLOBJ;
     return;
   }
-  std::unique_ptr<CJS_GlobalData_Element> pNewData(new CJS_GlobalData_Element);
+  auto pNewData = pdfium::MakeUnique<CJS_GlobalData_Element>();
   pNewData->data.sKey = sPropName;
   pNewData->data.nType = JS_GlobalDataType::NULLOBJ;
   m_arrayGlobalData.push_back(std::move(pNewData));
diff --git a/fpdfsdk/javascript/cjs_runtime.cpp b/fpdfsdk/javascript/cjs_runtime.cpp
index a6da9c4..cb8f69f 100644
--- a/fpdfsdk/javascript/cjs_runtime.cpp
+++ b/fpdfsdk/javascript/cjs_runtime.cpp
@@ -147,8 +147,7 @@
 }
 
 IJS_EventContext* CJS_Runtime::NewEventContext() {
-  m_EventContextArray.push_back(
-      std::unique_ptr<CJS_EventContext>(new CJS_EventContext(this)));
+  m_EventContextArray.push_back(pdfium::MakeUnique<CJS_EventContext>(this));
   return m_EventContextArray.back().get();
 }
 
diff --git a/fpdfsdk/pdfwindow/PWL_Utils.cpp b/fpdfsdk/pdfwindow/PWL_Utils.cpp
index 08b5e30..dbac6ad 100644
--- a/fpdfsdk/pdfwindow/PWL_Utils.cpp
+++ b/fpdfsdk/pdfwindow/PWL_Utils.cpp
@@ -331,7 +331,7 @@
                                                   int32_t nLayOut) {
   const float fAutoFontScale = 1.0f / 3.0f;
 
-  std::unique_ptr<CFX_Edit> pEdit(new CFX_Edit);
+  auto pEdit = pdfium::MakeUnique<CFX_Edit>();
   pEdit->SetFontMap(pFontMap);
   pEdit->SetAlignmentH(1, true);
   pEdit->SetAlignmentV(1, true);
diff --git a/fxbarcode/datamatrix/BC_HighLevelEncoder.cpp b/fxbarcode/datamatrix/BC_HighLevelEncoder.cpp
index e2d483c..041272e 100644
--- a/fxbarcode/datamatrix/BC_HighLevelEncoder.cpp
+++ b/fxbarcode/datamatrix/BC_HighLevelEncoder.cpp
@@ -39,6 +39,7 @@
 #include "fxbarcode/datamatrix/BC_TextEncoder.h"
 #include "fxbarcode/datamatrix/BC_X12Encoder.h"
 #include "fxbarcode/utils.h"
+#include "third_party/base/ptr_util.h"
 
 wchar_t CBC_HighLevelEncoder::LATCH_TO_C40 = 230;
 wchar_t CBC_HighLevelEncoder::LATCH_TO_BASE256 = 231;
@@ -95,12 +96,12 @@
   }
 
   std::vector<std::unique_ptr<CBC_Encoder>> encoders;
-  encoders.push_back(std::unique_ptr<CBC_Encoder>(new CBC_ASCIIEncoder()));
-  encoders.push_back(std::unique_ptr<CBC_Encoder>(new CBC_C40Encoder()));
-  encoders.push_back(std::unique_ptr<CBC_Encoder>(new CBC_TextEncoder()));
-  encoders.push_back(std::unique_ptr<CBC_Encoder>(new CBC_X12Encoder()));
-  encoders.push_back(std::unique_ptr<CBC_Encoder>(new CBC_EdifactEncoder()));
-  encoders.push_back(std::unique_ptr<CBC_Encoder>(new CBC_Base256Encoder()));
+  encoders.push_back(pdfium::MakeUnique<CBC_ASCIIEncoder>());
+  encoders.push_back(pdfium::MakeUnique<CBC_C40Encoder>());
+  encoders.push_back(pdfium::MakeUnique<CBC_TextEncoder>());
+  encoders.push_back(pdfium::MakeUnique<CBC_X12Encoder>());
+  encoders.push_back(pdfium::MakeUnique<CBC_EdifactEncoder>());
+  encoders.push_back(pdfium::MakeUnique<CBC_Base256Encoder>());
   int32_t encodingMode = ASCII_ENCODATION;
   while (context.hasMoreCharacters()) {
     encoders[encodingMode]->Encode(context, e);
diff --git a/fxbarcode/qrcode/BC_QRCoderEncoder.cpp b/fxbarcode/qrcode/BC_QRCoderEncoder.cpp
index b07b700..29dc699 100644
--- a/fxbarcode/qrcode/BC_QRCoderEncoder.cpp
+++ b/fxbarcode/qrcode/BC_QRCoderEncoder.cpp
@@ -39,6 +39,7 @@
 #include "fxbarcode/qrcode/BC_QRCoderMatrixUtil.h"
 #include "fxbarcode/qrcode/BC_QRCoderMode.h"
 #include "fxbarcode/qrcode/BC_QRCoderVersion.h"
+#include "third_party/base/ptr_util.h"
 
 namespace {
 
@@ -388,8 +389,8 @@
   if (e != BCExceptionNO)
     return;
 
-  std::unique_ptr<CBC_CommonByteMatrix> matrix(new CBC_CommonByteMatrix(
-      qrCode->GetMatrixWidth(), qrCode->GetMatrixWidth()));
+  auto matrix = pdfium::MakeUnique<CBC_CommonByteMatrix>(
+      qrCode->GetMatrixWidth(), qrCode->GetMatrixWidth());
   matrix->Init();
   int32_t maskPattern = ChooseMaskPattern(
       &finalBits, qrCode->GetECLevel(), qrCode->GetVersion(), matrix.get(), e);
@@ -473,8 +474,8 @@
   if (e != BCExceptionNO)
     return;
 
-  std::unique_ptr<CBC_CommonByteMatrix> matrix(new CBC_CommonByteMatrix(
-      qrCode->GetMatrixWidth(), qrCode->GetMatrixWidth()));
+  auto matrix = pdfium::MakeUnique<CBC_CommonByteMatrix>(
+      qrCode->GetMatrixWidth(), qrCode->GetMatrixWidth());
   matrix->Init();
   int32_t maskPattern = ChooseMaskPattern(
       &finalBits, qrCode->GetECLevel(), qrCode->GetVersion(), matrix.get(), e);
@@ -533,8 +534,8 @@
   if (e != BCExceptionNO)
     return;
 
-  std::unique_ptr<CBC_CommonByteMatrix> matrix(new CBC_CommonByteMatrix(
-      qrCode->GetMatrixWidth(), qrCode->GetMatrixWidth()));
+  auto matrix = pdfium::MakeUnique<CBC_CommonByteMatrix>(
+      qrCode->GetMatrixWidth(), qrCode->GetMatrixWidth());
   matrix->Init();
   int32_t maskPattern = ChooseMaskPattern(
       &finalBits, qrCode->GetECLevel(), qrCode->GetVersion(), matrix.get(), e);
@@ -878,7 +879,7 @@
     GetNumDataBytesAndNumECBytesForBlockID(numTotalBytes, numDataBytes,
                                            numRSBlocks, i, numDataBytesInBlock,
                                            numEcBytesInBlosk);
-    std::unique_ptr<CBC_CommonByteArray> dataBytes(new CBC_CommonByteArray);
+    auto dataBytes = pdfium::MakeUnique<CBC_CommonByteArray>();
     dataBytes->Set(bits->GetArray(), dataBytesOffset, numDataBytesInBlock);
     std::unique_ptr<CBC_CommonByteArray> ecBytes(
         GenerateECBytes(dataBytes.get(), numEcBytesInBlosk, e));
diff --git a/fxjs/cfxjse_class.cpp b/fxjs/cfxjse_class.cpp
index 3801fb5..8924a48 100644
--- a/fxjs/cfxjse_class.cpp
+++ b/fxjs/cfxjse_class.cpp
@@ -10,6 +10,7 @@
 
 #include "fxjs/cfxjse_context.h"
 #include "fxjs/cfxjse_value.h"
+#include "third_party/base/ptr_util.h"
 
 namespace {
 
@@ -22,10 +23,9 @@
     return;
 
   CFX_ByteStringC szFunctionName(lpFunctionInfo->name);
-  std::unique_ptr<CFXJSE_Value> lpThisValue(
-      new CFXJSE_Value(info.GetIsolate()));
+  auto lpThisValue = pdfium::MakeUnique<CFXJSE_Value>(info.GetIsolate());
   lpThisValue->ForceSetValue(info.Holder());
-  std::unique_ptr<CFXJSE_Value> lpRetValue(new CFXJSE_Value(info.GetIsolate()));
+  auto lpRetValue = pdfium::MakeUnique<CFXJSE_Value>(info.GetIsolate());
   CFXJSE_Arguments impl(&info, lpRetValue.get());
   lpFunctionInfo->callbackProc(lpThisValue.get(), szFunctionName, impl);
   if (!lpRetValue->DirectGetValue().IsEmpty())
@@ -41,10 +41,9 @@
     return;
 
   CFX_ByteStringC szFunctionName(lpClassDefinition->name);
-  std::unique_ptr<CFXJSE_Value> lpThisValue(
-      new CFXJSE_Value(info.GetIsolate()));
+  auto lpThisValue = pdfium::MakeUnique<CFXJSE_Value>(info.GetIsolate());
   lpThisValue->ForceSetValue(info.Holder());
-  std::unique_ptr<CFXJSE_Value> lpRetValue(new CFXJSE_Value(info.GetIsolate()));
+  auto lpRetValue = pdfium::MakeUnique<CFXJSE_Value>(info.GetIsolate());
   CFXJSE_Arguments impl(&info, lpRetValue.get());
   lpClassDefinition->constructor(lpThisValue.get(), szFunctionName, impl);
   if (!lpRetValue->DirectGetValue().IsEmpty())
@@ -60,10 +59,8 @@
     return;
 
   CFX_ByteStringC szPropertyName(lpPropertyInfo->name);
-  std::unique_ptr<CFXJSE_Value> lpThisValue(
-      new CFXJSE_Value(info.GetIsolate()));
-  std::unique_ptr<CFXJSE_Value> lpPropValue(
-      new CFXJSE_Value(info.GetIsolate()));
+  auto lpThisValue = pdfium::MakeUnique<CFXJSE_Value>(info.GetIsolate());
+  auto lpPropValue = pdfium::MakeUnique<CFXJSE_Value>(info.GetIsolate());
   lpThisValue->ForceSetValue(info.Holder());
   lpPropertyInfo->getProc(lpThisValue.get(), szPropertyName, lpPropValue.get());
   info.GetReturnValue().Set(lpPropValue->DirectGetValue());
@@ -79,10 +76,8 @@
     return;
 
   CFX_ByteStringC szPropertyName(lpPropertyInfo->name);
-  std::unique_ptr<CFXJSE_Value> lpThisValue(
-      new CFXJSE_Value(info.GetIsolate()));
-  std::unique_ptr<CFXJSE_Value> lpPropValue(
-      new CFXJSE_Value(info.GetIsolate()));
+  auto lpThisValue = pdfium::MakeUnique<CFXJSE_Value>(info.GetIsolate());
+  auto lpPropValue = pdfium::MakeUnique<CFXJSE_Value>(info.GetIsolate());
   lpThisValue->ForceSetValue(info.Holder());
   lpPropValue->ForceSetValue(value);
   lpPropertyInfo->setProc(lpThisValue.get(), szPropertyName, lpPropValue.get());
@@ -135,10 +130,9 @@
   ASSERT(lpClass && !hPropName.IsEmpty());
   v8::String::Utf8Value szPropName(hPropName);
   CFX_ByteStringC szFxPropName = *szPropName;
-  std::unique_ptr<CFXJSE_Value> lpThisValue(
-      new CFXJSE_Value(info.GetIsolate()));
+  auto lpThisValue = pdfium::MakeUnique<CFXJSE_Value>(info.GetIsolate());
   lpThisValue->ForceSetValue(info.Holder());
-  std::unique_ptr<CFXJSE_Value> lpRetValue(new CFXJSE_Value(info.GetIsolate()));
+  auto lpRetValue = pdfium::MakeUnique<CFXJSE_Value>(info.GetIsolate());
   CFXJSE_Arguments impl(&info, lpRetValue.get());
   lpClass->dynMethodCall(lpThisValue.get(), szFxPropName, impl);
   if (!lpRetValue->DirectGetValue().IsEmpty())
@@ -233,8 +227,7 @@
   v8::HandleScope scope(pIsolate);
   v8::String::Utf8Value szPropName(property);
   CFX_ByteStringC szFxPropName(*szPropName, szPropName.length());
-  std::unique_ptr<CFXJSE_Value> lpThisValue(
-      new CFXJSE_Value(info.GetIsolate()));
+  auto lpThisValue = pdfium::MakeUnique<CFXJSE_Value>(info.GetIsolate());
   lpThisValue->ForceSetValue(thisObject);
   if (DynPropQueryAdapter(lpClass, lpThisValue.get(), szFxPropName)) {
     info.GetReturnValue().Set(v8::DontDelete);
@@ -254,8 +247,7 @@
   v8::HandleScope scope(pIsolate);
   v8::String::Utf8Value szPropName(property);
   CFX_ByteStringC szFxPropName(*szPropName, szPropName.length());
-  std::unique_ptr<CFXJSE_Value> lpThisValue(
-      new CFXJSE_Value(info.GetIsolate()));
+  auto lpThisValue = pdfium::MakeUnique<CFXJSE_Value>(info.GetIsolate());
   lpThisValue->ForceSetValue(thisObject);
   info.GetReturnValue().Set(
       !!DynPropDeleterAdapter(lpClass, lpThisValue.get(), szFxPropName));
@@ -269,10 +261,9 @@
       info.Data().As<v8::External>()->Value());
   v8::String::Utf8Value szPropName(property);
   CFX_ByteStringC szFxPropName(*szPropName, szPropName.length());
-  std::unique_ptr<CFXJSE_Value> lpThisValue(
-      new CFXJSE_Value(info.GetIsolate()));
+  auto lpThisValue = pdfium::MakeUnique<CFXJSE_Value>(info.GetIsolate());
   lpThisValue->ForceSetValue(thisObject);
-  std::unique_ptr<CFXJSE_Value> lpNewValue(new CFXJSE_Value(info.GetIsolate()));
+  auto lpNewValue = pdfium::MakeUnique<CFXJSE_Value>(info.GetIsolate());
   DynPropGetterAdapter(lpClass, lpThisValue.get(), szFxPropName,
                        lpNewValue.get());
   info.GetReturnValue().Set(lpNewValue->DirectGetValue());
@@ -287,11 +278,10 @@
       info.Data().As<v8::External>()->Value());
   v8::String::Utf8Value szPropName(property);
   CFX_ByteStringC szFxPropName(*szPropName, szPropName.length());
-  std::unique_ptr<CFXJSE_Value> lpThisValue(
-      new CFXJSE_Value(info.GetIsolate()));
+  auto lpThisValue = pdfium::MakeUnique<CFXJSE_Value>(info.GetIsolate());
   lpThisValue->ForceSetValue(thisObject);
 
-  std::unique_ptr<CFXJSE_Value> lpNewValue(new CFXJSE_Value(info.GetIsolate()));
+  auto lpNewValue = pdfium::MakeUnique<CFXJSE_Value>(info.GetIsolate());
   lpNewValue->ForceSetValue(value);
   DynPropSetterAdapter(lpClass, lpThisValue.get(), szFxPropName,
                        lpNewValue.get());
diff --git a/fxjs/cfxjse_context.cpp b/fxjs/cfxjse_context.cpp
index 076e6cf..d3b55ff 100644
--- a/fxjs/cfxjse_context.cpp
+++ b/fxjs/cfxjse_context.cpp
@@ -8,6 +8,7 @@
 
 #include "fxjs/cfxjse_class.h"
 #include "fxjs/cfxjse_value.h"
+#include "third_party/base/ptr_util.h"
 
 namespace {
 
@@ -187,7 +188,7 @@
 CFXJSE_Context::~CFXJSE_Context() {}
 
 std::unique_ptr<CFXJSE_Value> CFXJSE_Context::GetGlobalObject() {
-  std::unique_ptr<CFXJSE_Value> pValue(new CFXJSE_Value(m_pIsolate));
+  auto pValue = pdfium::MakeUnique<CFXJSE_Value>(m_pIsolate);
 
   CFXJSE_ScopeUtil_IsolateHandleContext scope(this);
   v8::Local<v8::Context> hContext =
diff --git a/testing/libfuzzer/pdf_codec_jbig2_fuzzer.cc b/testing/libfuzzer/pdf_codec_jbig2_fuzzer.cc
index 162a0bf..e86ebeb 100644
--- a/testing/libfuzzer/pdf_codec_jbig2_fuzzer.cc
+++ b/testing/libfuzzer/pdf_codec_jbig2_fuzzer.cc
@@ -10,6 +10,7 @@
 #include "core/fxcodec/codec/ccodec_jbig2module.h"
 #include "core/fxcodec/jbig2/JBig2_Context.h"
 #include "core/fxge/fx_dib.h"
+#include "third_party/base/ptr_util.h"
 
 static uint32_t GetInteger(const uint8_t* data) {
   return data[0] | data[1] << 8 | data[2] << 16 | data[3] << 24;
@@ -29,7 +30,7 @@
   if (!bitmap->Create(width, height, FXDIB_1bppRgb))
     return 0;
 
-  std::unique_ptr<CPDF_Object> stream(new CPDF_Stream);
+  auto stream = pdfium::MakeUnique<CPDF_Stream>();
   stream->AsStream()->SetData(data, size);
   CPDF_StreamAcc src_stream;
   src_stream.LoadAllData(stream->AsStream(), true);
diff --git a/testing/libfuzzer/pdf_jpx_fuzzer.cc b/testing/libfuzzer/pdf_jpx_fuzzer.cc
index 92ba210..5ac3148 100644
--- a/testing/libfuzzer/pdf_jpx_fuzzer.cc
+++ b/testing/libfuzzer/pdf_jpx_fuzzer.cc
@@ -6,18 +6,15 @@
 #include <memory>
 #include <vector>
 
+#include "core/fxcodec/codec/cjpx_decoder.h"
 #include "core/fxcodec/codec/codec_int.h"
 #include "core/fxge/fx_dib.h"
 
 CCodec_JpxModule g_module;
 
-struct DecoderDeleter {
-  void operator()(CJPX_Decoder* decoder) { g_module.DestroyDecoder(decoder); }
-};
-
 extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
-  std::unique_ptr<CJPX_Decoder, DecoderDeleter> decoder(
-      g_module.CreateDecoder(data, size, nullptr));
+  std::unique_ptr<CJPX_Decoder> decoder =
+      g_module.CreateDecoder(data, size, nullptr);
   if (!decoder)
     return 0;
 
diff --git a/xfa/fde/cfde_txtedtpage.cpp b/xfa/fde/cfde_txtedtpage.cpp
index ef16939..122eb40 100644
--- a/xfa/fde/cfde_txtedtpage.cpp
+++ b/xfa/fde/cfde_txtedtpage.cpp
@@ -215,7 +215,7 @@
   if (nIndex < 0) {
     return -1;
   }
-  std::unique_ptr<CFX_WordBreak> pIter(new CFX_WordBreak);
+  auto pIter = pdfium::MakeUnique<CFX_WordBreak>();
   pIter->Attach(new CFDE_TxtEdtBuf::Iterator(pBuf));
   pIter->SetAt(nIndex);
   nCount = pIter->GetWordLength();
@@ -238,8 +238,8 @@
   if (pParams->dwMode & FDE_TEXTEDITMODE_Password) {
     wcAlias = m_pEditEngine->GetAliasChar();
   }
-  m_pIter.reset(new CFDE_TxtEdtBuf::Iterator(static_cast<CFDE_TxtEdtBuf*>(pBuf),
-                                             wcAlias));
+  m_pIter = pdfium::MakeUnique<CFDE_TxtEdtBuf::Iterator>(
+      static_cast<CFDE_TxtEdtBuf*>(pBuf), wcAlias);
   CFX_TxtBreak* pBreak = m_pEditEngine->GetTextBreak();
   pBreak->EndBreak(CFX_BreakType::Paragraph);
   pBreak->ClearBreakPieces();
diff --git a/xfa/fde/cfde_txtedtparag.cpp b/xfa/fde/cfde_txtedtparag.cpp
index ceff448..bcacc66 100644
--- a/xfa/fde/cfde_txtedtparag.cpp
+++ b/xfa/fde/cfde_txtedtparag.cpp
@@ -43,8 +43,8 @@
   if (pParam->dwMode & FDE_TEXTEDITMODE_Password)
     wcAlias = m_pEngine->GetAliasChar();
 
-  std::unique_ptr<IFX_CharIter> pIter(new CFDE_TxtEdtBuf::Iterator(
-      static_cast<CFDE_TxtEdtBuf*>(pTxtBuf), wcAlias));
+  auto pIter = pdfium::MakeUnique<CFDE_TxtEdtBuf::Iterator>(
+      static_cast<CFDE_TxtEdtBuf*>(pTxtBuf), wcAlias);
   pIter->SetAt(m_nCharStart);
   int32_t nEndIndex = m_nCharStart + m_nCharCount;
   std::vector<int32_t> LineBaseArr;
diff --git a/xfa/fgas/crt/ifgas_stream.cpp b/xfa/fgas/crt/ifgas_stream.cpp
index eef19a5..4981145 100644
--- a/xfa/fgas/crt/ifgas_stream.cpp
+++ b/xfa/fgas/crt/ifgas_stream.cpp
@@ -1082,7 +1082,7 @@
   if (!pszSrcFileName || FXSYS_wcslen(pszSrcFileName) < 1)
     return false;
 
-  std::unique_ptr<CFGAS_FileStreamImp> pImp(new CFGAS_FileStreamImp());
+  auto pImp = pdfium::MakeUnique<CFGAS_FileStreamImp>();
   if (!pImp->LoadFile(pszSrcFileName, dwAccess))
     return false;
 
@@ -1102,7 +1102,7 @@
   if (!pFileRead)
     return false;
 
-  std::unique_ptr<CFGAS_FileReadStreamImp> pImp(new CFGAS_FileReadStreamImp());
+  auto pImp = pdfium::MakeUnique<CFGAS_FileReadStreamImp>();
   if (!pImp->LoadFileRead(pFileRead, dwAccess))
     return false;
 
@@ -1142,7 +1142,7 @@
   if (!pData || iTotalSize < 1)
     return false;
 
-  std::unique_ptr<CFGAS_BufferStreamImp> pImp(new CFGAS_BufferStreamImp());
+  auto pImp = pdfium::MakeUnique<CFGAS_BufferStreamImp>();
   if (!pImp->LoadBuffer(pData, iTotalSize, dwAccess))
     return false;
 
diff --git a/xfa/fwl/cfwl_barcode.cpp b/xfa/fwl/cfwl_barcode.cpp
index e894d25..bed8921 100644
--- a/xfa/fwl/cfwl_barcode.cpp
+++ b/xfa/fwl/cfwl_barcode.cpp
@@ -218,7 +218,7 @@
   if (m_pBarcodeEngine || m_type == BC_UNKNOWN)
     return;
 
-  std::unique_ptr<CFX_Barcode> pBarcode(new CFX_Barcode);
+  auto pBarcode = pdfium::MakeUnique<CFX_Barcode>();
   if (pBarcode->Create(m_type))
     m_pBarcodeEngine = std::move(pBarcode);
 }
diff --git a/xfa/fwl/cfwl_edit.cpp b/xfa/fwl/cfwl_edit.cpp
index e05f251..c2b0ddf 100644
--- a/xfa/fwl/cfwl_edit.cpp
+++ b/xfa/fwl/cfwl_edit.cpp
@@ -566,9 +566,8 @@
   if (!pRenderDev)
     return;
 
-  std::unique_ptr<CFDE_RenderDevice> pRenderDevice(
-      new CFDE_RenderDevice(pRenderDev, false));
-  std::unique_ptr<CFDE_RenderContext> pRenderContext(new CFDE_RenderContext);
+  auto pRenderDevice = pdfium::MakeUnique<CFDE_RenderDevice>(pRenderDev, false);
+  auto pRenderContext = pdfium::MakeUnique<CFDE_RenderContext>();
   pRenderDevice->SetClipRect(rtClip);
   pRenderContext->StartRender(pRenderDevice.get(), pPage, mt);
   pRenderContext->DoRender(nullptr);
diff --git a/xfa/fxfa/app/cxfa_textlayout.cpp b/xfa/fxfa/app/cxfa_textlayout.cpp
index c8ed4f7..f16fd8c 100644
--- a/xfa/fxfa/app/cxfa_textlayout.cpp
+++ b/xfa/fxfa/app/cxfa_textlayout.cpp
@@ -559,8 +559,7 @@
   if (!pFxDevice)
     return false;
 
-  std::unique_ptr<CFDE_RenderDevice> pDevice(
-      new CFDE_RenderDevice(pFxDevice, false));
+  auto pDevice = pdfium::MakeUnique<CFDE_RenderDevice>(pFxDevice, false);
   pDevice->SaveState();
   pDevice->SetClipRect(rtClip);
 
@@ -1176,7 +1175,7 @@
     return;
 
   pPen->SetColor(pPiece->dwColor);
-  std::unique_ptr<CFDE_Path> pPath(new CFDE_Path);
+  auto pPath = pdfium::MakeUnique<CFDE_Path>();
   int32_t iChars = GetDisplayPos(pPiece, pCharPos);
   if (iChars > 0) {
     CFX_PointF pt1, pt2;
diff --git a/xfa/fxfa/app/xfa_fwltheme.cpp b/xfa/fxfa/app/xfa_fwltheme.cpp
index 4d5b20e..629cd50 100644
--- a/xfa/fxfa/app/xfa_fwltheme.cpp
+++ b/xfa/fxfa/app/xfa_fwltheme.cpp
@@ -44,18 +44,18 @@
 }
 
 CXFA_FWLTheme::CXFA_FWLTheme(CXFA_FFApp* pApp)
-    : m_pCheckBoxTP(new CFWL_CheckBoxTP),
-      m_pListBoxTP(new CFWL_ListBoxTP),
-      m_pPictureBoxTP(new CFWL_PictureBoxTP),
-      m_pSrollBarTP(new CFWL_ScrollBarTP),
-      m_pEditTP(new CFWL_EditTP),
-      m_pComboBoxTP(new CFWL_ComboBoxTP),
-      m_pMonthCalendarTP(new CFWL_MonthCalendarTP),
-      m_pDateTimePickerTP(new CFWL_DateTimePickerTP),
-      m_pPushButtonTP(new CFWL_PushButtonTP),
-      m_pCaretTP(new CFWL_CaretTP),
-      m_pBarcodeTP(new CFWL_BarcodeTP),
-      m_pTextOut(new CFDE_TextOut),
+    : m_pCheckBoxTP(pdfium::MakeUnique<CFWL_CheckBoxTP>()),
+      m_pListBoxTP(pdfium::MakeUnique<CFWL_ListBoxTP>()),
+      m_pPictureBoxTP(pdfium::MakeUnique<CFWL_PictureBoxTP>()),
+      m_pSrollBarTP(pdfium::MakeUnique<CFWL_ScrollBarTP>()),
+      m_pEditTP(pdfium::MakeUnique<CFWL_EditTP>()),
+      m_pComboBoxTP(pdfium::MakeUnique<CFWL_ComboBoxTP>()),
+      m_pMonthCalendarTP(pdfium::MakeUnique<CFWL_MonthCalendarTP>()),
+      m_pDateTimePickerTP(pdfium::MakeUnique<CFWL_DateTimePickerTP>()),
+      m_pPushButtonTP(pdfium::MakeUnique<CFWL_PushButtonTP>()),
+      m_pCaretTP(pdfium::MakeUnique<CFWL_CaretTP>()),
+      m_pBarcodeTP(pdfium::MakeUnique<CFWL_BarcodeTP>()),
+      m_pTextOut(pdfium::MakeUnique<CFDE_TextOut>()),
       m_pCalendarFont(nullptr),
       m_pApp(pApp) {
   m_Rect.Reset();
diff --git a/xfa/fxfa/cxfa_ffdoc.cpp b/xfa/fxfa/cxfa_ffdoc.cpp
index b503692..0deb864 100644
--- a/xfa/fxfa/cxfa_ffdoc.cpp
+++ b/xfa/fxfa/cxfa_ffdoc.cpp
@@ -405,7 +405,7 @@
     const CFX_RetainPtr<IFX_SeekableWriteStream>& pFile,
     CFX_ChecksumContext* pCSContext) {
   CXFA_Document* doc = m_pDocumentParser->GetDocument();
-  std::unique_ptr<CXFA_DataExporter> pExport(new CXFA_DataExporter(doc));
+  auto pExport = pdfium::MakeUnique<CXFA_DataExporter>(doc);
   CXFA_Node* pNode = code == XFA_HASHCODE_Xfa ? doc->GetRoot()
                                               : ToNode(doc->GetXFAObject(code));
   if (!pNode)
diff --git a/xfa/fxfa/parser/cxfa_scriptcontext.cpp b/xfa/fxfa/parser/cxfa_scriptcontext.cpp
index 37f59bd..f539c39 100644
--- a/xfa/fxfa/parser/cxfa_scriptcontext.cpp
+++ b/xfa/fxfa/parser/cxfa_scriptcontext.cpp
@@ -153,8 +153,8 @@
   m_eScriptType = eScriptType;
   if (eScriptType == XFA_SCRIPTLANGTYPE_Formcalc) {
     if (!m_FM2JSContext) {
-      m_FM2JSContext.reset(
-          new CXFA_FM2JSContext(m_pIsolate, m_JsContext.get(), m_pDocument));
+      m_FM2JSContext = pdfium::MakeUnique<CXFA_FM2JSContext>(
+          m_pIsolate, m_JsContext.get(), m_pDocument);
     }
     CFX_WideTextBuf wsJavaScript;
     CFX_WideString wsErrorInfo;
@@ -492,7 +492,7 @@
     return false;
 
   CFX_ByteString btScript = FX_UTF8Encode(wsScript);
-  std::unique_ptr<CFXJSE_Value> hRetValue(new CFXJSE_Value(m_pIsolate));
+  auto hRetValue = pdfium::MakeUnique<CFXJSE_Value>(m_pIsolate);
   CXFA_Node* pThisObject = pParent->GetNodeItem(XFA_NODEITEM_Parent);
   CFXJSE_Context* pVariablesContext =
       CreateVariablesContext(pScriptNode, pThisObject);
@@ -521,7 +521,7 @@
   bool bRes = false;
   CFXJSE_Context* pVariableContext = static_cast<CFXJSE_Context*>(lpVariables);
   std::unique_ptr<CFXJSE_Value> pObject = pVariableContext->GetGlobalObject();
-  std::unique_ptr<CFXJSE_Value> hVariableValue(new CFXJSE_Value(m_pIsolate));
+  auto hVariableValue = pdfium::MakeUnique<CFXJSE_Value>(m_pIsolate);
   if (!bGetter) {
     pObject->SetObjectOwnProperty(szPropName, pValue);
     bRes = true;
@@ -545,7 +545,7 @@
 void CXFA_ScriptContext::RemoveBuiltInObjs(CFXJSE_Context* pContext) const {
   static const CFX_ByteStringC OBJ_NAME[2] = {"Number", "Date"};
   std::unique_ptr<CFXJSE_Value> pObject = pContext->GetGlobalObject();
-  std::unique_ptr<CFXJSE_Value> hProp(new CFXJSE_Value(m_pIsolate));
+  auto hProp = pdfium::MakeUnique<CFXJSE_Value>(m_pIsolate);
   for (int i = 0; i < 2; ++i) {
     if (pObject->GetObjectProperty(OBJ_NAME[i], hProp.get()))
       pObject->DeleteObjectProperty(OBJ_NAME[i]);
@@ -650,7 +650,7 @@
       }
       if (rndFind.m_dwFlag == XFA_RESOVENODE_RSTYPE_Attribute &&
           rndFind.m_pScriptAttribute && nStart < wsExpression.GetLength()) {
-        std::unique_ptr<CFXJSE_Value> pValue(new CFXJSE_Value(m_pIsolate));
+        auto pValue = pdfium::MakeUnique<CFXJSE_Value>(m_pIsolate);
         (rndFind.m_Objects.front()
              ->*(rndFind.m_pScriptAttribute->lpfnCallback))(
             pValue.get(), false,
@@ -733,7 +733,7 @@
   if (iter != m_mapObjectToValue.end())
     return iter->second.get();
 
-  std::unique_ptr<CFXJSE_Value> jsValue(new CFXJSE_Value(m_pIsolate));
+  auto jsValue = pdfium::MakeUnique<CFXJSE_Value>(m_pIsolate);
   jsValue->SetObject(pObject, m_pJsClass);
   CFXJSE_Value* pValue = jsValue.get();
   m_mapObjectToValue.insert(std::make_pair(pObject, std::move(jsValue)));
diff --git a/xfa/fxfa/parser/cxfa_simple_parser.cpp b/xfa/fxfa/parser/cxfa_simple_parser.cpp
index 949f786..574ef3a 100644
--- a/xfa/fxfa/parser/cxfa_simple_parser.cpp
+++ b/xfa/fxfa/parser/cxfa_simple_parser.cpp
@@ -661,7 +661,8 @@
           m_pXMLParser->m_dwCheckStatus != 0x03) {
         return nullptr;
       }
-      std::unique_ptr<CFX_ChecksumContext> pChecksum(new CFX_ChecksumContext);
+
+      auto pChecksum = pdfium::MakeUnique<CFX_ChecksumContext>();
       pChecksum->StartChecksum();
       pChecksum->UpdateChecksum(m_pFileRead, m_pXMLParser->m_nStart[0],
                                 m_pXMLParser->m_nSize[0]);
diff --git a/xfa/fxfa/parser/cxfa_xml_parser.cpp b/xfa/fxfa/parser/cxfa_xml_parser.cpp
index ebde399..72564d9 100644
--- a/xfa/fxfa/parser/cxfa_xml_parser.cpp
+++ b/xfa/fxfa/parser/cxfa_xml_parser.cpp
@@ -6,13 +6,15 @@
 
 #include "xfa/fxfa/parser/cxfa_xml_parser.h"
 
+#include "third_party/base/ptr_util.h"
+
 CXFA_XMLParser::CXFA_XMLParser(CFDE_XMLNode* pParent,
                                const CFX_RetainPtr<IFGAS_Stream>& pStream)
     : m_nElementStart(0),
       m_dwCheckStatus(0),
       m_dwCurrentCheckStatus(0),
       m_pStream(pStream),
-      m_pParser(new CFDE_XMLSyntaxParser),
+      m_pParser(pdfium::MakeUnique<CFDE_XMLSyntaxParser>()),
       m_pParent(pParent),
       m_pChild(nullptr),
       m_syntaxParserResult(FDE_XmlSyntaxResult::None) {
