Remove CFX_Deletable

Change the last use of CFX_Deletable to its actual type and remove
the use of CFX_Deletable.

Review-Url: https://codereview.chromium.org/2178613002
diff --git a/BUILD.gn b/BUILD.gn
index 1b5add6..9fa8248 100644
--- a/BUILD.gn
+++ b/BUILD.gn
@@ -518,6 +518,7 @@
     "core/fxcodec/codec/fx_codec_jbig.cpp",
     "core/fxcodec/codec/fx_codec_jpeg.cpp",
     "core/fxcodec/codec/fx_codec_jpx_opj.cpp",
+    "core/fxcodec/include/JBig2_DocumentContext.h",
     "core/fxcodec/include/fx_codec.h",
     "core/fxcodec/include/fx_codec_def.h",
     "core/fxcodec/jbig2/JBig2_ArithDecoder.cpp",
diff --git a/core/fpdfapi/fpdf_parser/cpdf_document.cpp b/core/fpdfapi/fpdf_parser/cpdf_document.cpp
index 485d538..605fb6e 100644
--- a/core/fpdfapi/fpdf_parser/cpdf_document.cpp
+++ b/core/fpdfapi/fpdf_parser/cpdf_document.cpp
@@ -18,6 +18,7 @@
 #include "core/fpdfapi/fpdf_parser/include/cpdf_stream.h"
 #include "core/fpdfapi/fpdf_render/render_int.h"
 #include "core/fpdfapi/include/cpdf_modulemgr.h"
+#include "core/fxcodec/include/JBig2_DocumentContext.h"
 #include "core/fxge/include/fx_font.h"
 #include "third_party/base/stl_util.h"
 
diff --git a/core/fpdfapi/fpdf_parser/include/cpdf_document.h b/core/fpdfapi/fpdf_parser/include/cpdf_document.h
index 24d400f..63141bf 100644
--- a/core/fpdfapi/fpdf_parser/include/cpdf_document.h
+++ b/core/fpdfapi/fpdf_parser/include/cpdf_document.h
@@ -25,6 +25,7 @@
 class CPDF_Image;
 class CPDF_Pattern;
 class CPDF_StreamAcc;
+class JBig2_DocumentContext;
 
 #define FPDFPERM_PRINT 0x0004
 #define FPDFPERM_MODIFY 0x0008
@@ -58,7 +59,9 @@
   void ClearPageData();
   void RemoveColorSpaceFromPageData(CPDF_Object* pObject);
 
-  std::unique_ptr<CFX_Deletable>* CodecContext() { return &m_pCodecContext; }
+  std::unique_ptr<JBig2_DocumentContext>* CodecContext() {
+    return &m_pCodecContext;
+  }
   std::unique_ptr<CPDF_LinkList>* LinksContext() { return &m_pLinksContext; }
 
   CPDF_DocRenderData* GetRenderData() const { return m_pDocRender.get(); }
@@ -134,7 +137,7 @@
   // TODO(thestig): Figure out why this cannot be a std::unique_ptr.
   CPDF_DocPageData* m_pDocPage;
   std::unique_ptr<CPDF_DocRenderData> m_pDocRender;
-  std::unique_ptr<CFX_Deletable> m_pCodecContext;
+  std::unique_ptr<JBig2_DocumentContext> m_pCodecContext;
   std::unique_ptr<CPDF_LinkList> m_pLinksContext;
 };
 
diff --git a/core/fxcodec/codec/ccodec_jbig2module.h b/core/fxcodec/codec/ccodec_jbig2module.h
index 5d77d53..765a11f 100644
--- a/core/fxcodec/codec/ccodec_jbig2module.h
+++ b/core/fxcodec/codec/ccodec_jbig2module.h
@@ -16,6 +16,7 @@
 class CJBig2_Image;
 class CPDF_StreamAcc;
 class IFX_Pause;
+class JBig2_DocumentContext;
 
 class CCodec_Jbig2Context {
  public:
@@ -37,15 +38,16 @@
   CCodec_Jbig2Module() {}
   ~CCodec_Jbig2Module();
 
-  FXCODEC_STATUS StartDecode(CCodec_Jbig2Context* pJbig2Context,
-                             std::unique_ptr<CFX_Deletable>* pContextHolder,
-                             uint32_t width,
-                             uint32_t height,
-                             CPDF_StreamAcc* src_stream,
-                             CPDF_StreamAcc* global_stream,
-                             uint8_t* dest_buf,
-                             uint32_t dest_pitch,
-                             IFX_Pause* pPause);
+  FXCODEC_STATUS StartDecode(
+      CCodec_Jbig2Context* pJbig2Context,
+      std::unique_ptr<JBig2_DocumentContext>* pContextHolder,
+      uint32_t width,
+      uint32_t height,
+      CPDF_StreamAcc* src_stream,
+      CPDF_StreamAcc* global_stream,
+      uint8_t* dest_buf,
+      uint32_t dest_pitch,
+      IFX_Pause* pPause);
   FXCODEC_STATUS ContinueDecode(CCodec_Jbig2Context* pJbig2Context,
                                 IFX_Pause* pPause);
 };
diff --git a/core/fxcodec/codec/fx_codec_jbig.cpp b/core/fxcodec/codec/fx_codec_jbig.cpp
index 8f2d07f..adc57fd 100644
--- a/core/fxcodec/codec/fx_codec_jbig.cpp
+++ b/core/fxcodec/codec/fx_codec_jbig.cpp
@@ -9,32 +9,20 @@
 #include <list>
 
 #include "core/fpdfapi/fpdf_parser/include/cpdf_stream_acc.h"
+#include "core/fxcodec/include/JBig2_DocumentContext.h"
 #include "core/fxcodec/jbig2/JBig2_Context.h"
 #include "core/fxcodec/jbig2/JBig2_Image.h"
 #include "core/fxcrt/include/fx_memory.h"
 
-// Holds per-document JBig2 related data.
-class JBig2DocumentContext : public CFX_Deletable {
- public:
-  std::list<CJBig2_CachePair>* GetSymbolDictCache() {
-    return &m_SymbolDictCache;
-  }
+JBig2_DocumentContext::JBig2_DocumentContext() {}
 
-  ~JBig2DocumentContext() override {
-    for (auto it : m_SymbolDictCache) {
-      delete it.second;
-    }
-  }
+JBig2_DocumentContext::~JBig2_DocumentContext() {}
 
- private:
-  std::list<CJBig2_CachePair> m_SymbolDictCache;
-};
-
-JBig2DocumentContext* GetJBig2DocumentContext(
-    std::unique_ptr<CFX_Deletable>* pContextHolder) {
-  if (!pContextHolder->get())
-    pContextHolder->reset(new JBig2DocumentContext());
-  return static_cast<JBig2DocumentContext*>(pContextHolder->get());
+JBig2_DocumentContext* GetJBig2DocumentContext(
+    std::unique_ptr<JBig2_DocumentContext>* pContextHolder) {
+  if (!pContextHolder)
+    pContextHolder->reset(new JBig2_DocumentContext());
+  return pContextHolder->get();
 }
 
 CCodec_Jbig2Context::CCodec_Jbig2Context()
@@ -52,7 +40,7 @@
 
 FXCODEC_STATUS CCodec_Jbig2Module::StartDecode(
     CCodec_Jbig2Context* pJbig2Context,
-    std::unique_ptr<CFX_Deletable>* pContextHolder,
+    std::unique_ptr<JBig2_DocumentContext>* pContextHolder,
     uint32_t width,
     uint32_t height,
     CPDF_StreamAcc* src_stream,
@@ -63,7 +51,7 @@
   if (!pJbig2Context)
     return FXCODEC_STATUS_ERR_PARAMS;
 
-  JBig2DocumentContext* pJBig2DocumentContext =
+  JBig2_DocumentContext* pJBig2DocumentContext =
       GetJBig2DocumentContext(pContextHolder);
   pJbig2Context->m_width = width;
   pJbig2Context->m_height = height;
diff --git a/core/fxcodec/include/JBig2_DocumentContext.h b/core/fxcodec/include/JBig2_DocumentContext.h
new file mode 100644
index 0000000..d49bdfa
--- /dev/null
+++ b/core/fxcodec/include/JBig2_DocumentContext.h
@@ -0,0 +1,34 @@
+// Copyright 2016 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_INCLUDE_JBIG2_DOCUMENTCONTEXT_H_
+#define CORE_FXCODEC_INCLUDE_JBIG2_DOCUMENTCONTEXT_H_
+
+#include <list>
+#include <memory>
+#include <utility>
+
+class CJBig2_SymbolDict;
+
+using CJBig2_CacheKey = std::pair<uint32_t, uint32_t>;
+using CJBig2_CachePair =
+    std::pair<CJBig2_CacheKey, std::unique_ptr<CJBig2_SymbolDict>>;
+
+// Holds per-document JBig2 related data.
+class JBig2_DocumentContext {
+ public:
+  JBig2_DocumentContext();
+  ~JBig2_DocumentContext();
+
+  std::list<CJBig2_CachePair>* GetSymbolDictCache() {
+    return &m_SymbolDictCache;
+  }
+
+ private:
+  std::list<CJBig2_CachePair> m_SymbolDictCache;
+};
+
+#endif  // CORE_FXCODEC_INCLUDE_JBIG2_DOCUMENTCONTEXT_H_
diff --git a/core/fxcodec/jbig2/JBig2_Context.cpp b/core/fxcodec/jbig2/JBig2_Context.cpp
index 1e4c35a..256ce39 100644
--- a/core/fxcodec/jbig2/JBig2_Context.cpp
+++ b/core/fxcodec/jbig2/JBig2_Context.cpp
@@ -591,7 +591,8 @@
       if (it->first == key) {
         std::unique_ptr<CJBig2_SymbolDict> copy(it->second->DeepCopy());
         pSegment->m_Result.sd = copy.release();
-        m_pSymbolDictCache->push_front(*it);
+        m_pSymbolDictCache->push_front(
+            CJBig2_CachePair(key, std::move(it->second)));
         m_pSymbolDictCache->erase(it);
         cache_hit = true;
         break;
@@ -621,11 +622,10 @@
           pSegment->m_Result.sd->DeepCopy();
       int size = pdfium::CollectionSize<int>(*m_pSymbolDictCache);
       while (size >= kSymbolDictCacheMaxSize) {
-        delete m_pSymbolDictCache->back().second;
         m_pSymbolDictCache->pop_back();
         --size;
       }
-      m_pSymbolDictCache->push_front(CJBig2_CachePair(key, value.release()));
+      m_pSymbolDictCache->push_front(CJBig2_CachePair(key, std::move(value)));
     }
   }
   if (wFlags & 0x0200) {
diff --git a/core/fxcodec/jbig2/JBig2_Context.h b/core/fxcodec/jbig2/JBig2_Context.h
index 1577b22..a0e1a8f 100644
--- a/core/fxcodec/jbig2/JBig2_Context.h
+++ b/core/fxcodec/jbig2/JBig2_Context.h
@@ -25,8 +25,8 @@
 
 // Cache is keyed by the ObjNum of a stream and an index within the stream.
 using CJBig2_CacheKey = std::pair<uint32_t, uint32_t>;
-// NB: CJBig2_SymbolDict* is owned.
-using CJBig2_CachePair = std::pair<CJBig2_CacheKey, CJBig2_SymbolDict*>;
+using CJBig2_CachePair =
+    std::pair<CJBig2_CacheKey, std::unique_ptr<CJBig2_SymbolDict>>;
 
 #define JBIG2_SUCCESS 0
 #define JBIG2_FAILED -1
diff --git a/core/fxcrt/include/fx_memory.h b/core/fxcrt/include/fx_memory.h
index 53e6b9d..a3eba2f 100644
--- a/core/fxcrt/include/fx_memory.h
+++ b/core/fxcrt/include/fx_memory.h
@@ -107,11 +107,6 @@
   return std::unique_ptr<T>(ptr);
 }
 
-class CFX_Deletable {
- public:
-  virtual ~CFX_Deletable() {}
-};
-
 #endif  // __cplusplus
 
 #endif  // CORE_FXCRT_INCLUDE_FX_MEMORY_H_
diff --git a/pdfium.gyp b/pdfium.gyp
index 21b63aa..7d09085 100644
--- a/pdfium.gyp
+++ b/pdfium.gyp
@@ -480,8 +480,6 @@
         'third_party/third_party.gyp:fx_zlib',
       ],
       'sources': [
-        'core/fxcodec/include/fx_codec.h',
-        'core/fxcodec/include/fx_codec_def.h',
         'core/fxcodec/codec/ccodec_basicmodule.h',
         'core/fxcodec/codec/ccodec_faxmodule.h',
         'core/fxcodec/codec/ccodec_flatemodule.h',
@@ -498,6 +496,9 @@
         'core/fxcodec/codec/fx_codec_jbig.cpp',
         'core/fxcodec/codec/fx_codec_jpeg.cpp',
         'core/fxcodec/codec/fx_codec_jpx_opj.cpp',
+        'core/fxcodec/include/JBig2_DocumentContext.h',
+        'core/fxcodec/include/fx_codec.h',
+        'core/fxcodec/include/fx_codec_def.h',
         'core/fxcodec/jbig2/JBig2_ArithDecoder.cpp',
         'core/fxcodec/jbig2/JBig2_ArithDecoder.h',
         'core/fxcodec/jbig2/JBig2_ArithIntDecoder.cpp',