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

Unified Diff: pdf/pdfium/pdfium_engine.cc

Issue 863043003: PDF: Add a bunch of DCHECKs to make sure we do not go out of bounds. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 11 months 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_engine.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_engine.cc
diff --git a/pdf/pdfium/pdfium_engine.cc b/pdf/pdfium/pdfium_engine.cc
index 86485e0c8a696628c301cd27ea9420a81bfd4db2..c4e703efe65e47a20f9820b1c788d4c4add59681 100644
--- a/pdf/pdfium/pdfium_engine.cc
+++ b/pdf/pdfium/pdfium_engine.cc
@@ -1052,6 +1052,10 @@ void PDFiumEngine::Paint(const pp::Rect& rect,
pp::ImageData* image_data,
std::vector<pp::Rect>* ready,
std::vector<pp::Rect>* pending) {
+ DCHECK(image_data);
+ DCHECK(ready);
+ DCHECK(pending);
raymes 2015/01/22 22:50:03 Are these actually useful? I've heard various opin
Lei Zhang 2015/01/22 23:00:09 In the case of: DCHECK(ptr_var); ptr_var->Method(
+
pp::Rect leftover = rect;
for (size_t i = 0; i < visible_pages_.size(); ++i) {
int index = visible_pages_[i];
@@ -1070,15 +1074,18 @@ void PDFiumEngine::Paint(const pp::Rect& rect,
if (pages_[index]->available()) {
int progressive = GetProgressiveIndex(index);
- if (progressive != -1 &&
- progressive_paints_[progressive].rect != dirty_in_screen) {
- // The PDFium code can only handle one progressive paint at a time, so
- // queue this up. Previously we used to merge the rects when this
- // happened, but it made scrolling up on complex PDFs very slow since
- // there would be a damaged rect at the top (from scroll) and at the
- // bottom (from toolbar).
- pending->push_back(dirty_in_screen);
- continue;
+ if (progressive != -1) {
+ DCHECK_GE(progressive, 0);
+ DCHECK_LT(static_cast<size_t>(progressive), progressive_paints_.size());
+ if (progressive_paints_[progressive].rect != dirty_in_screen) {
+ // The PDFium code can only handle one progressive paint at a time, so
+ // queue this up. Previously we used to merge the rects when this
+ // happened, but it made scrolling up on complex PDFs very slow since
+ // there would be a damaged rect at the top (from scroll) and at the
+ // bottom (from toolbar).
+ pending->push_back(dirty_in_screen);
+ continue;
+ }
}
if (progressive == -1) {
raymes 2015/01/22 22:50:03 can we make this an "else" branch of the previous
Lei Zhang 2015/01/22 23:00:09 I thought about it, but I can also see the argumen
@@ -2341,7 +2348,7 @@ bool PDFiumEngine::HasPermission(DocumentPermission permission) const {
(permissions_ & kPDFPermissionPrintHighQualityMask) != 0;
default:
return true;
- };
+ }
}
void PDFiumEngine::SelectAll() {
@@ -2838,36 +2845,45 @@ int PDFiumEngine::StartPaint(int page_index, const pp::Rect& dirty) {
bool PDFiumEngine::ContinuePaint(int progressive_index,
pp::ImageData* image_data) {
+ DCHECK_GE(progressive_index, 0);
+ DCHECK_LT(static_cast<size_t>(progressive_index), progressive_paints_.size());
+ DCHECK(image_data);
+
#if defined(OS_LINUX)
g_last_instance_id = client_->GetPluginInstance()->pp_instance();
#endif
int rv;
+ FPDF_BITMAP bitmap = progressive_paints_[progressive_index].bitmap;
int page_index = progressive_paints_[progressive_index].page_index;
+ DCHECK_GE(page_index, 0);
+ DCHECK_LT(static_cast<size_t>(page_index), pages_.size());
+ FPDF_PAGE page = pages_[page_index]->GetPage();
+
last_progressive_start_time_ = base::Time::Now();
- if (progressive_paints_[progressive_index].bitmap) {
- rv = FPDF_RenderPage_Continue(
- pages_[page_index]->GetPage(), static_cast<IFSDK_PAUSE*>(this));
+ if (bitmap) {
+ rv = FPDF_RenderPage_Continue(page, static_cast<IFSDK_PAUSE*>(this));
} else {
pp::Rect dirty = progressive_paints_[progressive_index].rect;
- progressive_paints_[progressive_index].bitmap = CreateBitmap(dirty,
- image_data);
+ bitmap = CreateBitmap(dirty, image_data);
int start_x, start_y, size_x, size_y;
- GetPDFiumRect(
- page_index, dirty, &start_x, &start_y, &size_x, &size_y);
- FPDFBitmap_FillRect(progressive_paints_[progressive_index].bitmap, start_x,
- start_y, size_x, size_y, 0xFFFFFFFF);
+ GetPDFiumRect(page_index, dirty, &start_x, &start_y, &size_x, &size_y);
+ FPDFBitmap_FillRect(bitmap, start_x, start_y, size_x, size_y, 0xFFFFFFFF);
rv = FPDF_RenderPageBitmap_Start(
- progressive_paints_[progressive_index].bitmap,
- pages_[page_index]->GetPage(), start_x, start_y, size_x, size_y,
+ bitmap, page, start_x, start_y, size_x, size_y,
current_rotation_,
GetRenderingFlags(), static_cast<IFSDK_PAUSE*>(this));
+ progressive_paints_[progressive_index].bitmap = bitmap;
}
return rv != FPDF_RENDER_TOBECOUNTINUED;
}
void PDFiumEngine::FinishPaint(int progressive_index,
pp::ImageData* image_data) {
+ DCHECK_GE(progressive_index, 0);
+ DCHECK_LT(static_cast<size_t>(progressive_index), progressive_paints_.size());
+ DCHECK(image_data);
+
int page_index = progressive_paints_[progressive_index].page_index;
pp::Rect dirty_in_screen = progressive_paints_[progressive_index].rect;
FPDF_BITMAP bitmap = progressive_paints_[progressive_index].bitmap;
@@ -2903,6 +2919,9 @@ void PDFiumEngine::CancelPaints() {
}
void PDFiumEngine::FillPageSides(int progressive_index) {
+ DCHECK_GE(progressive_index, 0);
+ DCHECK_LT(static_cast<size_t>(progressive_index), progressive_paints_.size());
+
int page_index = progressive_paints_[progressive_index].page_index;
pp::Rect dirty_in_screen = progressive_paints_[progressive_index].rect;
FPDF_BITMAP bitmap = progressive_paints_[progressive_index].bitmap;
@@ -2949,6 +2968,10 @@ void PDFiumEngine::FillPageSides(int progressive_index) {
void PDFiumEngine::PaintPageShadow(int progressive_index,
pp::ImageData* image_data) {
+ DCHECK_GE(progressive_index, 0);
+ DCHECK_LT(static_cast<size_t>(progressive_index), progressive_paints_.size());
+ DCHECK(image_data);
+
int page_index = progressive_paints_[progressive_index].page_index;
pp::Rect dirty_in_screen = progressive_paints_[progressive_index].rect;
pp::Rect page_rect = pages_[page_index]->rect();
@@ -2973,6 +2996,10 @@ void PDFiumEngine::PaintPageShadow(int progressive_index,
void PDFiumEngine::DrawSelections(int progressive_index,
pp::ImageData* image_data) {
+ DCHECK_GE(progressive_index, 0);
+ DCHECK_LT(static_cast<size_t>(progressive_index), progressive_paints_.size());
+ DCHECK(image_data);
+
int page_index = progressive_paints_[progressive_index].page_index;
pp::Rect dirty_in_screen = progressive_paints_[progressive_index].rect;
« no previous file with comments | « pdf/pdfium/pdfium_engine.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698