Keep track of MapFont/DeleteFont calls in SystemFontInfoWrapper. Make sure code that calls out to this test-only font mapper have balanced MapFont and DeleteFont calls. Change-Id: Ib72ac71d65f1fe7bdb60e3efffe329d493704cc9 Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/91951 Reviewed-by: Tom Sepez <tsepez@chromium.org> Commit-Queue: Lei Zhang <thestig@chromium.org>
diff --git a/testing/test_fonts.cpp b/testing/test_fonts.cpp index 452946f..e76b5e4 100644 --- a/testing/test_fonts.cpp +++ b/testing/test_fonts.cpp
@@ -4,6 +4,7 @@ #include "testing/test_fonts.h" +#include <set> #include <utility> #include "core/fxge/cfx_fontmapper.h" @@ -45,7 +46,7 @@ public: explicit SystemFontInfoWrapper(std::unique_ptr<SystemFontInfoIface> impl) : impl_(std::move(impl)) {} - ~SystemFontInfoWrapper() = default; + ~SystemFontInfoWrapper() { CHECK(active_fonts_.empty()); } bool EnumFontList(CFX_FontMapper* pMapper) override { return impl_->EnumFontList(pMapper); @@ -55,8 +56,13 @@ FX_Charset charset, int pitch_family, const ByteString& face) override { - return impl_->MapFont(weight, bItalic, charset, pitch_family, - RenameFontForTesting(face)); + void* font = impl_->MapFont(weight, bItalic, charset, pitch_family, + RenameFontForTesting(face)); + if (font) { + bool inserted = active_fonts_.insert(font).second; + CHECK(inserted); + } + return font; } void* GetFont(const ByteString& face) override { return impl_->GetFont(RenameFontForTesting(face)); @@ -73,10 +79,14 @@ bool GetFontCharset(void* hFont, FX_Charset* charset) override { return impl_->GetFontCharset(hFont, charset); } - void DeleteFont(void* hFont) override { impl_->DeleteFont(hFont); } + void DeleteFont(void* hFont) override { + CHECK(active_fonts_.erase(hFont)); + impl_->DeleteFont(hFont); + } private: std::unique_ptr<SystemFontInfoIface> impl_; + std::set<void*> active_fonts_; }; } // namespace