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

Side by Side Diff: pdf/pdfium/pdfium_engine.cc

Issue 2414323003: Validate page index in PDFiumEngine::ScrollToPage(). (Closed)
Patch Set: Created 4 years, 2 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 unified diff | Download patch
« no previous file with comments | « pdf/pdfium/pdfium_engine.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "pdf/pdfium/pdfium_engine.h" 5 #include "pdf/pdfium/pdfium_engine.h"
6 6
7 #include <math.h> 7 #include <math.h>
8 #include <stddef.h> 8 #include <stddef.h>
9 #include <stdint.h> 9 #include <stdint.h>
10 10
(...skipping 2323 matching lines...) Expand 10 before | Expand all | Expand 10 after
2334 void PDFiumEngine::OnCallback(int id) { 2334 void PDFiumEngine::OnCallback(int id) {
2335 if (!timers_.count(id)) 2335 if (!timers_.count(id))
2336 return; 2336 return;
2337 2337
2338 timers_[id].second(id); 2338 timers_[id].second(id);
2339 if (timers_.count(id)) // The callback might delete the timer. 2339 if (timers_.count(id)) // The callback might delete the timer.
2340 client_->ScheduleCallback(id, timers_[id].first); 2340 client_->ScheduleCallback(id, timers_[id].first);
2341 } 2341 }
2342 2342
2343 int PDFiumEngine::GetCharCount(int page_index) { 2343 int PDFiumEngine::GetCharCount(int page_index) {
2344 DCHECK(page_index >= 0 && page_index < static_cast<int>(pages_.size())); 2344 DCHECK(PageIndexInBounds(page_index));
2345 return pages_[page_index]->GetCharCount(); 2345 return pages_[page_index]->GetCharCount();
2346 } 2346 }
2347 2347
2348 pp::FloatRect PDFiumEngine::GetCharBounds(int page_index, int char_index) { 2348 pp::FloatRect PDFiumEngine::GetCharBounds(int page_index, int char_index) {
2349 DCHECK(page_index >= 0 && page_index < static_cast<int>(pages_.size())); 2349 DCHECK(PageIndexInBounds(page_index));
2350 return pages_[page_index]->GetCharBounds(char_index); 2350 return pages_[page_index]->GetCharBounds(char_index);
2351 } 2351 }
2352 2352
2353 uint32_t PDFiumEngine::GetCharUnicode(int page_index, int char_index) { 2353 uint32_t PDFiumEngine::GetCharUnicode(int page_index, int char_index) {
2354 DCHECK(page_index >= 0 && page_index < static_cast<int>(pages_.size())); 2354 DCHECK(PageIndexInBounds(page_index));
2355 return pages_[page_index]->GetCharUnicode(char_index); 2355 return pages_[page_index]->GetCharUnicode(char_index);
2356 } 2356 }
2357 2357
2358 void PDFiumEngine::GetTextRunInfo(int page_index, 2358 void PDFiumEngine::GetTextRunInfo(int page_index,
2359 int start_char_index, 2359 int start_char_index,
2360 uint32_t* out_len, 2360 uint32_t* out_len,
2361 double* out_font_size, 2361 double* out_font_size,
2362 pp::FloatRect* out_bounds) { 2362 pp::FloatRect* out_bounds) {
2363 DCHECK(page_index >= 0 && page_index < static_cast<int>(pages_.size())); 2363 DCHECK(PageIndexInBounds(page_index));
2364 return pages_[page_index]->GetTextRunInfo(start_char_index, out_len, 2364 return pages_[page_index]->GetTextRunInfo(start_char_index, out_len,
2365 out_font_size, out_bounds); 2365 out_font_size, out_bounds);
2366 } 2366 }
2367 2367
2368 bool PDFiumEngine::GetPrintScaling() { 2368 bool PDFiumEngine::GetPrintScaling() {
2369 return !!FPDF_VIEWERREF_GetPrintScaling(doc_); 2369 return !!FPDF_VIEWERREF_GetPrintScaling(doc_);
2370 } 2370 }
2371 2371
2372 int PDFiumEngine::GetCopiesToPrint() { 2372 int PDFiumEngine::GetCopiesToPrint() {
2373 return FPDF_VIEWERREF_GetNumCopies(doc_); 2373 return FPDF_VIEWERREF_GetNumCopies(doc_);
(...skipping 320 matching lines...) Expand 10 before | Expand all | Expand 10 after
2694 } 2694 }
2695 2695
2696 SetCurrentPage(most_visible_page); 2696 SetCurrentPage(most_visible_page);
2697 } 2697 }
2698 2698
2699 bool PDFiumEngine::IsPageVisible(int index) const { 2699 bool PDFiumEngine::IsPageVisible(int index) const {
2700 return base::ContainsValue(visible_pages_, index); 2700 return base::ContainsValue(visible_pages_, index);
2701 } 2701 }
2702 2702
2703 void PDFiumEngine::ScrollToPage(int page) { 2703 void PDFiumEngine::ScrollToPage(int page) {
2704 if (!PageIndexInBounds(page))
2705 return;
2706
2704 in_flight_visible_page_ = page; 2707 in_flight_visible_page_ = page;
2705 client_->ScrollToPage(page); 2708 client_->ScrollToPage(page);
2706 } 2709 }
2707 2710
2708 bool PDFiumEngine::CheckPageAvailable(int index, std::vector<int>* pending) { 2711 bool PDFiumEngine::CheckPageAvailable(int index, std::vector<int>* pending) {
2709 if (!doc_ || !form_) 2712 if (!doc_ || !form_)
2710 return false; 2713 return false;
2711 2714
2712 const int num_pages = static_cast<int>(pages_.size()); 2715 const int num_pages = static_cast<int>(pages_.size());
2713 if (index < num_pages && pages_[index]->available()) 2716 if (index < num_pages && pages_[index]->available())
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
2764 DCHECK_LT(static_cast<size_t>(progressive_index), progressive_paints_.size()); 2767 DCHECK_LT(static_cast<size_t>(progressive_index), progressive_paints_.size());
2765 DCHECK(image_data); 2768 DCHECK(image_data);
2766 2769
2767 #if defined(OS_LINUX) 2770 #if defined(OS_LINUX)
2768 g_last_instance_id = client_->GetPluginInstance()->pp_instance(); 2771 g_last_instance_id = client_->GetPluginInstance()->pp_instance();
2769 #endif 2772 #endif
2770 2773
2771 int rv; 2774 int rv;
2772 FPDF_BITMAP bitmap = progressive_paints_[progressive_index].bitmap; 2775 FPDF_BITMAP bitmap = progressive_paints_[progressive_index].bitmap;
2773 int page_index = progressive_paints_[progressive_index].page_index; 2776 int page_index = progressive_paints_[progressive_index].page_index;
2774 DCHECK_GE(page_index, 0); 2777 DCHECK(PageIndexInBounds(page_index));
2775 DCHECK_LT(static_cast<size_t>(page_index), pages_.size());
2776 FPDF_PAGE page = pages_[page_index]->GetPage(); 2778 FPDF_PAGE page = pages_[page_index]->GetPage();
2777 2779
2778 last_progressive_start_time_ = base::Time::Now(); 2780 last_progressive_start_time_ = base::Time::Now();
2779 if (bitmap) { 2781 if (bitmap) {
2780 rv = FPDF_RenderPage_Continue(page, static_cast<IFSDK_PAUSE*>(this)); 2782 rv = FPDF_RenderPage_Continue(page, static_cast<IFSDK_PAUSE*>(this));
2781 } else { 2783 } else {
2782 pp::Rect dirty = progressive_paints_[progressive_index].rect; 2784 pp::Rect dirty = progressive_paints_[progressive_index].rect;
2783 bitmap = CreateBitmap(dirty, image_data); 2785 bitmap = CreateBitmap(dirty, image_data);
2784 int start_x, start_y, size_x, size_y; 2786 int start_x, start_y, size_x, size_y;
2785 GetPDFiumRect(page_index, dirty, &start_x, &start_y, &size_x, &size_y); 2787 GetPDFiumRect(page_index, dirty, &start_x, &start_y, &size_x, &size_y);
(...skipping 631 matching lines...) Expand 10 before | Expand all | Expand 10 after
3417 client_->ScrollToPage(most_visible_page); 3419 client_->ScrollToPage(most_visible_page);
3418 } 3420 }
3419 3421
3420 void PDFiumEngine::SetSelecting(bool selecting) { 3422 void PDFiumEngine::SetSelecting(bool selecting) {
3421 bool was_selecting = selecting_; 3423 bool was_selecting = selecting_;
3422 selecting_ = selecting; 3424 selecting_ = selecting;
3423 if (selecting_ != was_selecting) 3425 if (selecting_ != was_selecting)
3424 client_->IsSelectingChanged(selecting); 3426 client_->IsSelectingChanged(selecting);
3425 } 3427 }
3426 3428
3429 bool PDFiumEngine::PageIndexInBounds(int index) const {
3430 return index >= 0 && index < static_cast<int>(pages_.size());
3431 }
3432
3427 void PDFiumEngine::Form_Invalidate(FPDF_FORMFILLINFO* param, 3433 void PDFiumEngine::Form_Invalidate(FPDF_FORMFILLINFO* param,
3428 FPDF_PAGE page, 3434 FPDF_PAGE page,
3429 double left, 3435 double left,
3430 double top, 3436 double top,
3431 double right, 3437 double right,
3432 double bottom) { 3438 double bottom) {
3433 PDFiumEngine* engine = static_cast<PDFiumEngine*>(param); 3439 PDFiumEngine* engine = static_cast<PDFiumEngine*>(param);
3434 int page_index = engine->GetVisiblePageIndex(page); 3440 int page_index = engine->GetVisiblePageIndex(page);
3435 if (page_index == -1) { 3441 if (page_index == -1) {
3436 // This can sometime happen when the page is closed because it went off 3442 // This can sometime happen when the page is closed because it went off
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after
3500 } 3506 }
3501 3507
3502 void PDFiumEngine::Form_OnChange(FPDF_FORMFILLINFO* param) { 3508 void PDFiumEngine::Form_OnChange(FPDF_FORMFILLINFO* param) {
3503 // Don't care about. 3509 // Don't care about.
3504 } 3510 }
3505 3511
3506 FPDF_PAGE PDFiumEngine::Form_GetPage(FPDF_FORMFILLINFO* param, 3512 FPDF_PAGE PDFiumEngine::Form_GetPage(FPDF_FORMFILLINFO* param,
3507 FPDF_DOCUMENT document, 3513 FPDF_DOCUMENT document,
3508 int page_index) { 3514 int page_index) {
3509 PDFiumEngine* engine = static_cast<PDFiumEngine*>(param); 3515 PDFiumEngine* engine = static_cast<PDFiumEngine*>(param);
3510 if (page_index < 0 || page_index >= static_cast<int>(engine->pages_.size())) 3516 if (!engine->PageIndexInBounds(page_index))
3511 return nullptr; 3517 return nullptr;
3512 return engine->pages_[page_index]->GetPage(); 3518 return engine->pages_[page_index]->GetPage();
3513 } 3519 }
3514 3520
3515 FPDF_PAGE PDFiumEngine::Form_GetCurrentPage(FPDF_FORMFILLINFO* param, 3521 FPDF_PAGE PDFiumEngine::Form_GetCurrentPage(FPDF_FORMFILLINFO* param,
3516 FPDF_DOCUMENT document) { 3522 FPDF_DOCUMENT document) {
3517 // TODO(jam): find out what this is used for.
3518 PDFiumEngine* engine = static_cast<PDFiumEngine*>(param); 3523 PDFiumEngine* engine = static_cast<PDFiumEngine*>(param);
3519 int index = engine->last_page_mouse_down_; 3524 int index = engine->last_page_mouse_down_;
3520 if (index == -1) { 3525 if (index == -1) {
3521 index = engine->GetMostVisiblePage(); 3526 index = engine->GetMostVisiblePage();
3522 if (index == -1) { 3527 if (index == -1) {
3523 NOTREACHED(); 3528 NOTREACHED();
3524 return nullptr; 3529 return nullptr;
3525 } 3530 }
3526 } 3531 }
3527 3532
(...skipping 475 matching lines...) Expand 10 before | Expand all | Expand 10 after
4003 FPDF_DOCUMENT doc = 4008 FPDF_DOCUMENT doc =
4004 FPDF_LoadMemDocument(pdf_buffer, pdf_buffer_size, nullptr); 4009 FPDF_LoadMemDocument(pdf_buffer, pdf_buffer_size, nullptr);
4005 if (!doc) 4010 if (!doc)
4006 return false; 4011 return false;
4007 bool success = FPDF_GetPageSizeByIndex(doc, page_number, width, height) != 0; 4012 bool success = FPDF_GetPageSizeByIndex(doc, page_number, width, height) != 0;
4008 FPDF_CloseDocument(doc); 4013 FPDF_CloseDocument(doc);
4009 return success; 4014 return success;
4010 } 4015 }
4011 4016
4012 } // namespace chrome_pdf 4017 } // namespace chrome_pdf
OLDNEW
« 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