Introduce pdfium::FakeUniquePtr for keys to sets of unique ptrs.
Review-Url: https://codereview.chromium.org/2262473002
diff --git a/fpdfsdk/javascript/app.cpp b/fpdfsdk/javascript/app.cpp
index 573de40..f95ec0b 100644
--- a/fpdfsdk/javascript/app.cpp
+++ b/fpdfsdk/javascript/app.cpp
@@ -19,6 +19,7 @@
#include "fpdfsdk/javascript/cjs_context.h"
#include "fpdfsdk/javascript/cjs_runtime.h"
#include "fpdfsdk/javascript/resource.h"
+#include "third_party/base/stl_util.h"
class GlobalTimer : public CJS_Runtime::Observer {
public:
@@ -510,10 +511,9 @@
uint32_t dwInterval = params.size() > 1 ? params[1].ToInt(pRuntime) : 1000;
CPDFDoc_Environment* pApp = pRuntime->GetReaderApp();
- std::unique_ptr<GlobalTimer> timer(
- new GlobalTimer(this, pApp, pRuntime, 0, script, dwInterval, 0));
- GlobalTimer* timerRef = timer.get();
- m_Timers[timerRef] = std::move(timer);
+ GlobalTimer* timerRef =
+ new GlobalTimer(this, pApp, pRuntime, 0, script, dwInterval, 0);
+ m_Timers.insert(std::unique_ptr<GlobalTimer>(timerRef));
v8::Local<v8::Object> pRetObj =
pRuntime->NewFxDynamicObj(CJS_TimerObj::g_nObjDefnID);
@@ -547,10 +547,9 @@
uint32_t dwTimeOut = params.size() > 1 ? params[1].ToInt(pRuntime) : 1000;
CPDFDoc_Environment* pApp = pRuntime->GetReaderApp();
- std::unique_ptr<GlobalTimer> timer(
- new GlobalTimer(this, pApp, pRuntime, 1, script, dwTimeOut, dwTimeOut));
- GlobalTimer* timerRef = timer.get();
- m_Timers[timerRef] = std::move(timer);
+ GlobalTimer* timerRef =
+ new GlobalTimer(this, pApp, pRuntime, 1, script, dwTimeOut, dwTimeOut);
+ m_Timers.insert(std::unique_ptr<GlobalTimer>(timerRef));
v8::Local<v8::Object> pRetObj =
pRuntime->NewFxDynamicObj(CJS_TimerObj::g_nObjDefnID);
@@ -626,7 +625,7 @@
}
void app::CancelProc(GlobalTimer* pTimer) {
- m_Timers.erase(pTimer);
+ m_Timers.erase(pdfium::FakeUniquePtr<GlobalTimer>(pTimer));
}
void app::RunJsScript(CJS_Runtime* pRuntime, const CFX_WideString& wsScript) {
diff --git a/fpdfsdk/javascript/app.h b/fpdfsdk/javascript/app.h
index 911d865..1efd341 100644
--- a/fpdfsdk/javascript/app.h
+++ b/fpdfsdk/javascript/app.h
@@ -7,8 +7,8 @@
#ifndef FPDFSDK_JAVASCRIPT_APP_H_
#define FPDFSDK_JAVASCRIPT_APP_H_
-#include <map>
#include <memory>
+#include <unordered_set>
#include <vector>
#include "fpdfsdk/javascript/JS_Define.h"
@@ -166,7 +166,7 @@
bool m_bCalculate;
bool m_bRuntimeHighLight;
- std::map<GlobalTimer*, std::unique_ptr<GlobalTimer>> m_Timers;
+ std::unordered_set<std::unique_ptr<GlobalTimer>> m_Timers;
};
class CJS_App : public CJS_Object {
diff --git a/third_party/base/stl_util.h b/third_party/base/stl_util.h
index 2d18467..ccf3c09 100644
--- a/third_party/base/stl_util.h
+++ b/third_party/base/stl_util.h
@@ -27,6 +27,15 @@
collection.end();
}
+// Means of generating a key for searching STL collections of std::unique_ptr
+// that avoids the side effect of deleting the pointer.
+template <class T>
+class FakeUniquePtr : public std::unique_ptr<T> {
+ public:
+ using std::unique_ptr<T>::unique_ptr;
+ ~FakeUniquePtr() { std::unique_ptr<T>::release(); }
+};
+
// Convenience routine for "int-fected" code, so that the stl collection
// size_t size() method return values will be checked.
template <typename ResultType, typename Collection>