diff options
author | weili <weili@chromium.org> | 2016-08-23 21:10:57 -0700 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2016-08-23 21:10:57 -0700 |
commit | 0dadcc6fdab7ad1f2ee95d763f31aad5d3534f93 (patch) | |
tree | d62cd8cc5b33e8b3707bbdb6eb5bbf6269f52110 /testing/embedder_test.cpp | |
parent | e07edce5b253bc4f2bef6888c5b1cbf0b320a919 (diff) | |
download | pdfium-0dadcc6fdab7ad1f2ee95d763f31aad5d3534f93.tar.xz |
Fix page leaks in an embedder test
Embedder test's delegate function GetPage() calls FPDF_LoadPage() to
load a page which may be already loaded by embedder test itself.
Thus the page's ref count is increased unnecessarily.
This causes the page to be leaked. Fix this by putting the page map in
embedder test class and guarantee the page is loaded only once.
Also, fix leaks in this embedder tests by unloading the loaded pages to
properly release the resource.
BUG=pdfium:242
Review-Url: https://codereview.chromium.org/2258333002
Diffstat (limited to 'testing/embedder_test.cpp')
-rw-r--r-- | testing/embedder_test.cpp | 36 |
1 files changed, 13 insertions, 23 deletions
diff --git a/testing/embedder_test.cpp b/testing/embedder_test.cpp index b1207fba82..e10e2a81e8 100644 --- a/testing/embedder_test.cpp +++ b/testing/embedder_test.cpp @@ -242,21 +242,19 @@ int EmbedderTest::GetPageCount() { } FPDF_PAGE EmbedderTest::LoadPage(int page_number) { + // First check whether it is loaded already. + auto it = page_map_.find(page_number); + if (it != page_map_.end()) + return it->second; + FPDF_PAGE page = FPDF_LoadPage(document_, page_number); if (!page) { return nullptr; } FORM_OnAfterLoadPage(page, form_handle_); FORM_DoPageAAction(page, form_handle_, FPDFPAGE_AACTION_OPEN); - return page; -} - -FPDF_PAGE EmbedderTest::LoadAndCachePage(int page_number) { - FPDF_PAGE page = delegate_->GetPage(form_handle_, document_, page_number); - if (!page) { - return nullptr; - } - FORM_DoPageAAction(page, form_handle_, FPDFPAGE_AACTION_OPEN); + // Cache the page. + page_map_[page_number] = page; return page; } @@ -278,20 +276,12 @@ void EmbedderTest::UnloadPage(FPDF_PAGE page) { FPDF_ClosePage(page); } -FPDF_PAGE EmbedderTest::Delegate::GetPage(FPDF_FORMHANDLE form_handle, +FPDF_PAGE EmbedderTest::Delegate::GetPage(FPDF_FORMFILLINFO* info, FPDF_DOCUMENT document, int page_index) { - auto it = m_pageMap.find(page_index); - if (it != m_pageMap.end()) { - return it->second; - } - FPDF_PAGE page = FPDF_LoadPage(document, page_index); - if (!page) { - return nullptr; - } - m_pageMap[page_index] = page; - FORM_OnAfterLoadPage(page, form_handle); - return page; + EmbedderTest* test = static_cast<EmbedderTest*>(info); + auto it = test->page_map_.find(page_index); + return it != test->page_map_.end() ? it->second : nullptr; } // static @@ -329,8 +319,8 @@ void EmbedderTest::KillTimerTrampoline(FPDF_FORMFILLINFO* info, int id) { FPDF_PAGE EmbedderTest::GetPageTrampoline(FPDF_FORMFILLINFO* info, FPDF_DOCUMENT document, int page_index) { - EmbedderTest* test = static_cast<EmbedderTest*>(info); - return test->delegate_->GetPage(test->form_handle(), document, page_index); + return static_cast<EmbedderTest*>(info)->delegate_->GetPage(info, document, + page_index); } // Can't use gtest-provided main since we need to stash the path to the |