Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1041)

Unified Diff: pdf/pdfium/pdfium_page.cc

Issue 784403004: Do not unload pages while loading of the same pages is in progress. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 6 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « pdf/pdfium/pdfium_page.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: pdf/pdfium/pdfium_page.cc
diff --git a/pdf/pdfium/pdfium_page.cc b/pdf/pdfium/pdfium_page.cc
index d8a5dce5a2a2be4bb08e0a58117a8988c7ea91f1..cd75a1bc3716982bdbcb06ff3707d8f80183ba8a 100644
--- a/pdf/pdfium/pdfium_page.cc
+++ b/pdf/pdfium/pdfium_page.cc
@@ -16,6 +16,8 @@
// Used when doing hit detection.
#define kTolerance 20.0
+namespace {
+
// Dictionary Value key names for returning the accessible page content as JSON.
const char kPageWidth[] = "width";
const char kPageHeight[] = "height";
@@ -33,6 +35,8 @@ const char kTextNodeTypeText[] = "text";
const char kTextNodeTypeURL[] = "url";
const char kDocLinkURLPrefix[] = "#page";
+} // namespace
+
namespace chrome_pdf {
PDFiumPage::PDFiumPage(PDFiumEngine* engine,
@@ -43,15 +47,21 @@ PDFiumPage::PDFiumPage(PDFiumEngine* engine,
page_(NULL),
text_page_(NULL),
index_(i),
+ loading_count_(0),
rect_(r),
calculated_links_(false),
available_(available) {
}
PDFiumPage::~PDFiumPage() {
+ DCHECK_EQ(0, loading_count_);
}
void PDFiumPage::Unload() {
+ // Do not unload while in the middle of a load.
+ if (loading_count_)
+ return;
+
if (text_page_) {
FPDFText_ClosePage(text_page_);
text_page_ = NULL;
@@ -71,6 +81,7 @@ FPDF_PAGE PDFiumPage::GetPage() {
if (!available_)
return NULL;
if (!page_) {
+ ScopedLoadCounter scoped_load(this);
page_ = FPDF_LoadPage(engine_->doc(), index_);
if (page_ && engine_->form()) {
FORM_OnAfterLoadPage(page_, engine_->form());
@@ -83,12 +94,18 @@ FPDF_PAGE PDFiumPage::GetPrintPage() {
ScopedUnsupportedFeature scoped_unsupported_feature(engine_);
if (!available_)
return NULL;
- if (!page_)
+ if (!page_) {
+ ScopedLoadCounter scoped_load(this);
page_ = FPDF_LoadPage(engine_->doc(), index_);
+ }
return page_;
}
void PDFiumPage::ClosePrintPage() {
+ // Do not close |page_| while in the middle of a load.
+ if (loading_count_)
+ return;
+
if (page_) {
FPDF_ClosePage(page_);
page_ = NULL;
@@ -98,8 +115,10 @@ void PDFiumPage::ClosePrintPage() {
FPDF_TEXTPAGE PDFiumPage::GetTextPage() {
if (!available_)
return NULL;
- if (!text_page_)
+ if (!text_page_) {
+ ScopedLoadCounter scoped_load(this);
text_page_ = FPDFText_LoadPage(GetPage());
+ }
return text_page_;
}
@@ -468,6 +487,15 @@ pp::Rect PDFiumPage::PageToScreen(const pp::Point& offset,
new_left, new_top, new_right - new_left + 1, new_bottom - new_top + 1);
}
+PDFiumPage::ScopedLoadCounter::ScopedLoadCounter(PDFiumPage* page)
+ : page_(page) {
+ page_->loading_count_++;
+}
+
+PDFiumPage::ScopedLoadCounter::~ScopedLoadCounter() {
+ page_->loading_count_--;
+}
+
PDFiumPage::Link::Link() {
}
« no previous file with comments | « pdf/pdfium/pdfium_page.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698