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

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

Issue 2349753003: Improve linearized pdf load/show time. (Closed)
Patch Set: remove useless code. Created 4 years, 3 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
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 12 matching lines...) Expand all
23 #include "base/strings/string_piece.h" 23 #include "base/strings/string_piece.h"
24 #include "base/strings/string_util.h" 24 #include "base/strings/string_util.h"
25 #include "base/strings/utf_string_conversions.h" 25 #include "base/strings/utf_string_conversions.h"
26 #include "gin/array_buffer.h" 26 #include "gin/array_buffer.h"
27 #include "gin/public/gin_embedders.h" 27 #include "gin/public/gin_embedders.h"
28 #include "gin/public/isolate_holder.h" 28 #include "gin/public/isolate_holder.h"
29 #include "pdf/draw_utils.h" 29 #include "pdf/draw_utils.h"
30 #include "pdf/pdfium/pdfium_api_string_buffer_adapter.h" 30 #include "pdf/pdfium/pdfium_api_string_buffer_adapter.h"
31 #include "pdf/pdfium/pdfium_mem_buffer_file_read.h" 31 #include "pdf/pdfium/pdfium_mem_buffer_file_read.h"
32 #include "pdf/pdfium/pdfium_mem_buffer_file_write.h" 32 #include "pdf/pdfium/pdfium_mem_buffer_file_write.h"
33 #include "pdf/url_loader_wrapper_impl.h"
33 #include "ppapi/c/pp_errors.h" 34 #include "ppapi/c/pp_errors.h"
34 #include "ppapi/c/pp_input_event.h" 35 #include "ppapi/c/pp_input_event.h"
35 #include "ppapi/c/ppb_core.h" 36 #include "ppapi/c/ppb_core.h"
36 #include "ppapi/c/private/ppb_pdf.h" 37 #include "ppapi/c/private/ppb_pdf.h"
37 #include "ppapi/cpp/dev/memory_dev.h" 38 #include "ppapi/cpp/dev/memory_dev.h"
38 #include "ppapi/cpp/input_event.h" 39 #include "ppapi/cpp/input_event.h"
39 #include "ppapi/cpp/instance.h" 40 #include "ppapi/cpp/instance.h"
40 #include "ppapi/cpp/module.h" 41 #include "ppapi/cpp/module.h"
41 #include "ppapi/cpp/private/pdf.h" 42 #include "ppapi/cpp/private/pdf.h"
42 #include "ppapi/cpp/trusted/browser_font_trusted.h" 43 #include "ppapi/cpp/trusted/browser_font_trusted.h"
(...skipping 482 matching lines...) Expand 10 before | Expand all | Expand 10 after
525 } 526 }
526 527
527 PDFEngine* PDFEngine::Create(PDFEngine::Client* client) { 528 PDFEngine* PDFEngine::Create(PDFEngine::Client* client) {
528 return new PDFiumEngine(client); 529 return new PDFiumEngine(client);
529 } 530 }
530 531
531 PDFiumEngine::PDFiumEngine(PDFEngine::Client* client) 532 PDFiumEngine::PDFiumEngine(PDFEngine::Client* client)
532 : client_(client), 533 : client_(client),
533 current_zoom_(1.0), 534 current_zoom_(1.0),
534 current_rotation_(0), 535 current_rotation_(0),
535 doc_loader_(this),
536 password_tries_remaining_(0), 536 password_tries_remaining_(0),
537 doc_(nullptr), 537 doc_(nullptr),
538 form_(nullptr), 538 form_(nullptr),
539 defer_page_unload_(false), 539 defer_page_unload_(false),
540 selecting_(false), 540 selecting_(false),
541 mouse_down_state_(PDFiumPage::NONSELECTABLE_AREA, 541 mouse_down_state_(PDFiumPage::NONSELECTABLE_AREA,
542 PDFiumPage::LinkTarget()), 542 PDFiumPage::LinkTarget()),
543 next_page_to_search_(-1), 543 next_page_to_search_(-1),
544 last_page_to_search_(-1), 544 last_page_to_search_(-1),
545 last_character_index_to_search_(-1), 545 last_character_index_to_search_(-1),
546 permissions_(0), 546 permissions_(0),
547 permissions_handler_revision_(-1), 547 permissions_handler_revision_(-1),
548 fpdf_availability_(nullptr), 548 fpdf_availability_(nullptr),
549 next_timer_id_(0), 549 next_timer_id_(0),
550 last_page_mouse_down_(-1), 550 last_page_mouse_down_(-1),
551 most_visible_page_(-1), 551 most_visible_page_(-1),
552 called_do_document_action_(false), 552 called_do_document_action_(false),
553 render_grayscale_(false), 553 render_grayscale_(false),
554 render_annots_(true), 554 render_annots_(true),
555 progressive_paint_timeout_(0), 555 progressive_paint_timeout_(0),
556 getting_password_(false) { 556 getting_password_(false) {
557 find_factory_.Initialize(this); 557 find_factory_.Initialize(this);
558 password_factory_.Initialize(this); 558 password_factory_.Initialize(this);
559 559
560 file_access_.m_FileLen = 0; 560 file_access_.m_FileLen = 0;
561 file_access_.m_GetBlock = &GetBlock; 561 file_access_.m_GetBlock = &GetBlock;
562 file_access_.m_Param = &doc_loader_; 562 file_access_.m_Param = this;
563 563
564 file_availability_.version = 1; 564 file_availability_.version = 1;
565 file_availability_.IsDataAvail = &IsDataAvail; 565 file_availability_.IsDataAvail = &IsDataAvail;
566 file_availability_.loader = &doc_loader_; 566 file_availability_.engine = this;
567 567
568 download_hints_.version = 1; 568 download_hints_.version = 1;
569 download_hints_.AddSegment = &AddSegment; 569 download_hints_.AddSegment = &AddSegment;
570 download_hints_.loader = &doc_loader_; 570 download_hints_.engine = this;
571 571
572 // Initialize FPDF_FORMFILLINFO member variables. Deriving from this struct 572 // Initialize FPDF_FORMFILLINFO member variables. Deriving from this struct
573 // allows the static callbacks to be able to cast the FPDF_FORMFILLINFO in 573 // allows the static callbacks to be able to cast the FPDF_FORMFILLINFO in
574 // callbacks to ourself instead of maintaining a map of them to 574 // callbacks to ourself instead of maintaining a map of them to
575 // PDFiumEngine. 575 // PDFiumEngine.
576 FPDF_FORMFILLINFO::version = 1; 576 FPDF_FORMFILLINFO::version = 1;
577 FPDF_FORMFILLINFO::m_pJsPlatform = this; 577 FPDF_FORMFILLINFO::m_pJsPlatform = this;
578 FPDF_FORMFILLINFO::Release = nullptr; 578 FPDF_FORMFILLINFO::Release = nullptr;
579 FPDF_FORMFILLINFO::FFI_Invalidate = Form_Invalidate; 579 FPDF_FORMFILLINFO::FFI_Invalidate = Form_Invalidate;
580 FPDF_FORMFILLINFO::FFI_OutputSelectedRect = Form_OutputSelectedRect; 580 FPDF_FORMFILLINFO::FFI_OutputSelectedRect = Form_OutputSelectedRect;
(...skipping 251 matching lines...) Expand 10 before | Expand all | Expand 10 after
832 int PDFiumEngine::Form_GetLanguage(FPDF_FORMFILLINFO* param, 832 int PDFiumEngine::Form_GetLanguage(FPDF_FORMFILLINFO* param,
833 void* language, 833 void* language,
834 int length) { 834 int length) {
835 return 0; 835 return 0;
836 } 836 }
837 837
838 #endif // defined(PDF_ENABLE_XFA) 838 #endif // defined(PDF_ENABLE_XFA)
839 839
840 int PDFiumEngine::GetBlock(void* param, unsigned long position, 840 int PDFiumEngine::GetBlock(void* param, unsigned long position,
841 unsigned char* buffer, unsigned long size) { 841 unsigned char* buffer, unsigned long size) {
842 DocumentLoader* loader = static_cast<DocumentLoader*>(param); 842 PDFiumEngine* p_this = static_cast<PDFiumEngine*>(param);
Lei Zhang 2016/10/05 07:18:08 s/p_this/engine/ ?
snake 2016/10/05 14:14:10 Done.
843 return loader->GetBlock(position, size, buffer); 843 return p_this->doc_loader_->GetBlock(position, size, buffer);
844 } 844 }
845 845
846 FPDF_BOOL PDFiumEngine::IsDataAvail(FX_FILEAVAIL* param, 846 FPDF_BOOL PDFiumEngine::IsDataAvail(FX_FILEAVAIL* param,
847 size_t offset, size_t size) { 847 size_t offset, size_t size) {
848 PDFiumEngine::FileAvail* file_avail = 848 PDFiumEngine::FileAvail* file_avail =
849 static_cast<PDFiumEngine::FileAvail*>(param); 849 static_cast<PDFiumEngine::FileAvail*>(param);
850 return file_avail->loader->IsDataAvailable(offset, size); 850 return file_avail->engine->doc_loader_->IsDataAvailable(offset, size);
851 } 851 }
852 852
853 void PDFiumEngine::AddSegment(FX_DOWNLOADHINTS* param, 853 void PDFiumEngine::AddSegment(FX_DOWNLOADHINTS* param,
854 size_t offset, size_t size) { 854 size_t offset, size_t size) {
855 PDFiumEngine::DownloadHints* download_hints = 855 PDFiumEngine::DownloadHints* download_hints =
856 static_cast<PDFiumEngine::DownloadHints*>(param); 856 static_cast<PDFiumEngine::DownloadHints*>(param);
857 return download_hints->loader->RequestData(offset, size); 857 return download_hints->engine->doc_loader_->RequestData(offset, size);
858 } 858 }
859 859
860 bool PDFiumEngine::New(const char* url, 860 bool PDFiumEngine::New(const char* url,
861 const char* headers) { 861 const char* headers) {
862 url_ = url; 862 url_ = url;
863 if (headers) 863 if (headers)
864 headers_ = headers; 864 headers_ = headers;
865 else 865 else
866 headers_.clear(); 866 headers_.clear();
867 return true; 867 return true;
(...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after
982 FPDF_RenderPage_Close( 982 FPDF_RenderPage_Close(
983 pages_[progressive_paints_[i].page_index]->GetPage()); 983 pages_[progressive_paints_[i].page_index]->GetPage());
984 FPDFBitmap_Destroy(progressive_paints_[i].bitmap); 984 FPDFBitmap_Destroy(progressive_paints_[i].bitmap);
985 progressive_paints_.erase(progressive_paints_.begin() + i); 985 progressive_paints_.erase(progressive_paints_.begin() + i);
986 --i; 986 --i;
987 } 987 }
988 } 988 }
989 989
990 bool PDFiumEngine::HandleDocumentLoad(const pp::URLLoader& loader) { 990 bool PDFiumEngine::HandleDocumentLoad(const pp::URLLoader& loader) {
991 password_tries_remaining_ = kMaxPasswordTries; 991 password_tries_remaining_ = kMaxPasswordTries;
992 return doc_loader_.Init(loader, url_, headers_); 992 should_process_pending_request_complete_ = true;
993 URLLoaderWrapperImpl* loader_wrapper_ptr =
Lei Zhang 2016/10/05 07:18:07 Why bother with the raw pointer? Just: auto loade
snake 2016/10/05 14:14:10 Done.
994 new URLLoaderWrapperImpl(GetPluginInstance(), loader);
995 loader_wrapper_ptr->SetResponseHeaders(headers_);
996 std::unique_ptr<URLLoaderWrapper> loader_wrapper(loader_wrapper_ptr);
997 doc_loader_.reset(new DocumentLoader(this));
Lei Zhang 2016/10/05 07:18:08 More base::MakeUnique?
snake 2016/10/05 14:14:10 Done.
998 if (doc_loader_->Init(std::move(loader_wrapper), url_)) {
999 // request initial data.
1000 doc_loader_->RequestData(0, 1);
1001 return true;
1002 }
1003 return false;
993 } 1004 }
994 1005
995 pp::Instance* PDFiumEngine::GetPluginInstance() { 1006 pp::Instance* PDFiumEngine::GetPluginInstance() {
996 return client_->GetPluginInstance(); 1007 return client_->GetPluginInstance();
997 } 1008 }
998 1009
999 pp::URLLoader PDFiumEngine::CreateURLLoader() { 1010 std::unique_ptr<URLLoaderWrapper> PDFiumEngine::CreateURLLoader() {
1000 return client_->CreateURLLoader(); 1011 std::unique_ptr<URLLoaderWrapper> result;
1012 result.reset(new URLLoaderWrapperImpl(GetPluginInstance(),
1013 client_->CreateURLLoader()));
1014
1015 return result;
1001 } 1016 }
1002 1017
1003 void PDFiumEngine::AppendPage(PDFEngine* engine, int index) { 1018 void PDFiumEngine::AppendPage(PDFEngine* engine, int index) {
1004 // Unload and delete the blank page before appending. 1019 // Unload and delete the blank page before appending.
1005 pages_[index]->Unload(); 1020 pages_[index]->Unload();
1006 pages_[index]->set_calculated_links(false); 1021 pages_[index]->set_calculated_links(false);
1007 pp::Size curr_page_size = GetPageSize(index); 1022 pp::Size curr_page_size = GetPageSize(index);
1008 FPDFPage_Delete(doc_, index); 1023 FPDFPage_Delete(doc_, index);
1009 FPDF_ImportPages(doc_, 1024 FPDF_ImportPages(doc_,
1010 static_cast<PDFiumEngine*>(engine)->doc(), 1025 static_cast<PDFiumEngine*>(engine)->doc(),
1011 "1", 1026 "1",
1012 index); 1027 index);
1013 pp::Size new_page_size = GetPageSize(index); 1028 pp::Size new_page_size = GetPageSize(index);
1014 if (curr_page_size != new_page_size) 1029 if (curr_page_size != new_page_size)
1015 LoadPageInfo(true); 1030 LoadPageInfo(true);
1016 client_->Invalidate(GetPageScreenRect(index)); 1031 client_->Invalidate(GetPageScreenRect(index));
1017 } 1032 }
1018 1033
1019 #if defined(PDF_ENABLE_XFA) 1034 #if defined(PDF_ENABLE_XFA)
1020 void PDFiumEngine::SetScrollPosition(const pp::Point& position) { 1035 void PDFiumEngine::SetScrollPosition(const pp::Point& position) {
1021 position_ = position; 1036 position_ = position;
1022 } 1037 }
1023 #endif 1038 #endif
1024 1039
1025 bool PDFiumEngine::IsProgressiveLoad() {
1026 return doc_loader_.is_partial_document();
1027 }
1028
1029 std::string PDFiumEngine::GetMetadata(const std::string& key) { 1040 std::string PDFiumEngine::GetMetadata(const std::string& key) {
1030 return GetDocumentMetadata(doc(), key); 1041 return GetDocumentMetadata(doc(), key);
1031 } 1042 }
1032 1043
1033 void PDFiumEngine::OnPartialDocumentLoaded() { 1044 void PDFiumEngine::OnPendingRequestComplete() {
1034 file_access_.m_FileLen = doc_loader_.document_size(); 1045 if (!should_process_pending_request_complete_)
1046 return;
1035 if (!fpdf_availability_) { 1047 if (!fpdf_availability_) {
1048 file_access_.m_FileLen = doc_loader_->GetDocumentSize();
1036 fpdf_availability_ = FPDFAvail_Create(&file_availability_, &file_access_); 1049 fpdf_availability_ = FPDFAvail_Create(&file_availability_, &file_access_);
1037 DCHECK(fpdf_availability_); 1050 DCHECK(fpdf_availability_);
1051 // Currently engine does not deal efficiently with some non-linearized
1052 // files.
1053 // See http://code.google.com/p/chromium/issues/detail?id=59400
1054 // To improve user experience we download entire file for non-linearized
1055 // PDF.
1056 if (FPDFAvail_IsLinearized(fpdf_availability_) != PDF_LINEARIZED) {
1057 // Wait complete document.
1058 should_process_pending_request_complete_ = false;
1059 FPDFAvail_Destroy(fpdf_availability_);
1060 fpdf_availability_ = nullptr;
1061 return;
1062 }
1038 } 1063 }
1039 1064
1040 // Currently engine does not deal efficiently with some non-linearized files. 1065 if (!doc_) {
1041 // See http://code.google.com/p/chromium/issues/detail?id=59400
1042 // To improve user experience we download entire file for non-linearized PDF.
1043 if (!FPDFAvail_IsLinearized(fpdf_availability_)) {
1044 doc_loader_.RequestData(0, doc_loader_.document_size());
1045 return;
1046 }
1047
1048 LoadDocument();
1049 }
1050
1051 void PDFiumEngine::OnPendingRequestComplete() {
1052 if (!doc_ || !form_) {
1053 DCHECK(fpdf_availability_);
1054 LoadDocument(); 1066 LoadDocument();
1055 return; 1067 return;
1056 } 1068 }
1057 1069
1058 // LoadDocument() will result in |pending_pages_| being reset so there's no 1070 // LoadDocument() will result in |pending_pages_| being reset so there's no
1059 // need to run the code below in that case. 1071 // need to run the code below in that case.
1060 bool update_pages = false; 1072 bool update_pages = false;
1061 std::vector<int> still_pending; 1073 std::vector<int> still_pending;
1062 for (int pending_page : pending_pages_) { 1074 for (int pending_page : pending_pages_) {
1063 if (CheckPageAvailable(pending_page, &still_pending)) { 1075 if (CheckPageAvailable(pending_page, &still_pending)) {
1064 update_pages = true; 1076 update_pages = true;
1065 if (IsPageVisible(pending_page)) 1077 if (IsPageVisible(pending_page))
1066 client_->Invalidate(GetPageScreenRect(pending_page)); 1078 client_->Invalidate(GetPageScreenRect(pending_page));
1067 } 1079 }
1068 } 1080 }
1069 pending_pages_.swap(still_pending); 1081 pending_pages_.swap(still_pending);
1070 if (update_pages) 1082 if (update_pages)
1071 LoadPageInfo(true); 1083 LoadPageInfo(true);
1072 } 1084 }
1073 1085
1074 void PDFiumEngine::OnNewDataAvailable() { 1086 void PDFiumEngine::OnNewDataAvailable() {
1075 client_->DocumentLoadProgress(doc_loader_.GetAvailableData(), 1087 const float progress = doc_loader_->GetProgress();
1076 doc_loader_.document_size()); 1088 if (progress < 0.001) {
1089 client_->DocumentLoadProgress(0, 0);
1090 } else {
1091 client_->DocumentLoadProgress(progress * 10000, 10000);
1092 }
1077 } 1093 }
1078 1094
1079 void PDFiumEngine::OnDocumentComplete() { 1095 void PDFiumEngine::OnDocumentComplete() {
1080 if (!doc_ || !form_) { 1096 if (!doc_) {
Lei Zhang 2016/10/05 07:18:08 In general, if (!foo) { bar(); } else { qux(); } m
snake 2016/10/05 14:14:10 Done.
1081 file_access_.m_FileLen = doc_loader_.document_size(); 1097 file_access_.m_FileLen = doc_loader_->GetDocumentSize();
1082 if (!fpdf_availability_) { 1098 if (!fpdf_availability_) {
1083 fpdf_availability_ = FPDFAvail_Create(&file_availability_, &file_access_); 1099 fpdf_availability_ = FPDFAvail_Create(&file_availability_, &file_access_);
1084 DCHECK(fpdf_availability_); 1100 DCHECK(fpdf_availability_);
1085 } 1101 }
1086 LoadDocument(); 1102 LoadDocument();
1087 return; 1103 } else {
1104 FinishLoadingDocument();
Lei Zhang 2016/10/05 07:18:07 Or how about just: if (doc_) { FinishLoadingDoc
snake 2016/10/05 14:14:10 Done.
1088 } 1105 }
1106 }
1089 1107
1090 FinishLoadingDocument(); 1108 void PDFiumEngine::OnDocumentCanceled() {
1109 OnDocumentComplete();
1110 }
1111
1112 void PDFiumEngine::CancelBrowserDownload() {
1113 client_->CancelBrowserDownload();
1091 } 1114 }
1092 1115
1093 void PDFiumEngine::FinishLoadingDocument() { 1116 void PDFiumEngine::FinishLoadingDocument() {
1094 DCHECK(doc_loader_.IsDocumentComplete() && doc_); 1117 DCHECK(doc_loader_->IsDocumentComplete() && doc_);
1118
1119 if (!form_) {
1120 int form_status =
1121 FPDFAvail_IsFormAvail(fpdf_availability_, &download_hints_);
1122 if (form_status != PDF_FORM_NOTAVAIL) {
1123 form_ = FPDFDOC_InitFormFillEnvironment(
1124 doc_, static_cast<FPDF_FORMFILLINFO*>(this));
1125 #if defined(PDF_ENABLE_XFA)
1126 FPDF_LoadXFA(doc_);
1127 #endif
1128
1129 FPDF_SetFormFieldHighlightColor(form_, 0, kFormHighlightColor);
1130 FPDF_SetFormFieldHighlightAlpha(form_, kFormHighlightAlpha);
1131 }
1132 }
1095 1133
1096 bool need_update = false; 1134 bool need_update = false;
1097 for (size_t i = 0; i < pages_.size(); ++i) { 1135 for (size_t i = 0; i < pages_.size(); ++i) {
1098 if (pages_[i]->available()) 1136 if (pages_[i]->available())
1099 continue; 1137 continue;
1100 1138
1101 pages_[i]->set_available(true); 1139 pages_[i]->set_available(true);
1102 // We still need to call IsPageAvail() even if the whole document is 1140 // We still need to call IsPageAvail() even if the whole document is
1103 // already downloaded. 1141 // already downloaded.
1104 FPDFAvail_IsPageAvail(fpdf_availability_, i, &download_hints_); 1142 FPDFAvail_IsPageAvail(fpdf_availability_, i, &download_hints_);
(...skipping 186 matching lines...) Expand 10 before | Expand all | Expand 10 after
1291 return temp_doc; 1329 return temp_doc;
1292 } 1330 }
1293 1331
1294 pp::Buffer_Dev PDFiumEngine::PrintPagesAsRasterPDF( 1332 pp::Buffer_Dev PDFiumEngine::PrintPagesAsRasterPDF(
1295 const PP_PrintPageNumberRange_Dev* page_ranges, uint32_t page_range_count, 1333 const PP_PrintPageNumberRange_Dev* page_ranges, uint32_t page_range_count,
1296 const PP_PrintSettings_Dev& print_settings) { 1334 const PP_PrintSettings_Dev& print_settings) {
1297 if (!page_range_count) 1335 if (!page_range_count)
1298 return pp::Buffer_Dev(); 1336 return pp::Buffer_Dev();
1299 1337
1300 // If document is not downloaded yet, disable printing. 1338 // If document is not downloaded yet, disable printing.
1301 if (doc_ && !doc_loader_.IsDocumentComplete()) 1339 if (doc_ && !doc_loader_->IsDocumentComplete())
1302 return pp::Buffer_Dev(); 1340 return pp::Buffer_Dev();
1303 1341
1304 FPDF_DOCUMENT output_doc = FPDF_CreateNewDocument(); 1342 FPDF_DOCUMENT output_doc = FPDF_CreateNewDocument();
1305 if (!output_doc) 1343 if (!output_doc)
1306 return pp::Buffer_Dev(); 1344 return pp::Buffer_Dev();
1307 1345
1308 SaveSelectedFormForPrint(); 1346 SaveSelectedFormForPrint();
1309 1347
1310 std::vector<PDFiumPage> pages_to_print; 1348 std::vector<PDFiumPage> pages_to_print;
1311 // width and height of source PDF pages. 1349 // width and height of source PDF pages.
(...skipping 1117 matching lines...) Expand 10 before | Expand all | Expand 10 after
2429 } 2467 }
2430 2468
2431 CalculateVisiblePages(); 2469 CalculateVisiblePages();
2432 if (document_size_ != old_document_size) 2470 if (document_size_ != old_document_size)
2433 client_->DocumentSizeUpdated(document_size_); 2471 client_->DocumentSizeUpdated(document_size_);
2434 } 2472 }
2435 2473
2436 void PDFiumEngine::LoadDocument() { 2474 void PDFiumEngine::LoadDocument() {
2437 // Check if the document is ready for loading. If it isn't just bail for now, 2475 // Check if the document is ready for loading. If it isn't just bail for now,
2438 // we will call LoadDocument() again later. 2476 // we will call LoadDocument() again later.
2439 if (!doc_ && !doc_loader_.IsDocumentComplete() && 2477 if (!doc_ && !doc_loader_->IsDocumentComplete() &&
2440 !FPDFAvail_IsDocAvail(fpdf_availability_, &download_hints_)) { 2478 !FPDFAvail_IsDocAvail(fpdf_availability_, &download_hints_)) {
2441 return; 2479 return;
2442 } 2480 }
2443 2481
2444 // If we're in the middle of getting a password, just return. We will retry 2482 // If we're in the middle of getting a password, just return. We will retry
2445 // loading the document after we get the password anyway. 2483 // loading the document after we get the password anyway.
2446 if (getting_password_) 2484 if (getting_password_)
2447 return; 2485 return;
2448 2486
2449 ScopedUnsupportedFeature scoped_unsupported_feature(this); 2487 ScopedUnsupportedFeature scoped_unsupported_feature(this);
(...skipping 17 matching lines...) Expand all
2467 // call may have failed, so call it again for good measure. 2505 // call may have failed, so call it again for good measure.
2468 FPDFAvail_IsDocAvail(fpdf_availability_, &download_hints_); 2506 FPDFAvail_IsDocAvail(fpdf_availability_, &download_hints_);
2469 return true; 2507 return true;
2470 } 2508 }
2471 2509
2472 const char* password_cstr = nullptr; 2510 const char* password_cstr = nullptr;
2473 if (!password.empty()) { 2511 if (!password.empty()) {
2474 password_cstr = password.c_str(); 2512 password_cstr = password.c_str();
2475 password_tries_remaining_--; 2513 password_tries_remaining_--;
2476 } 2514 }
2477 if (doc_loader_.IsDocumentComplete() && 2515 if (doc_loader_->IsDocumentComplete() &&
2478 !FPDFAvail_IsLinearized(fpdf_availability_)) { 2516 !FPDFAvail_IsLinearized(fpdf_availability_)) {
2479 doc_ = FPDF_LoadCustomDocument(&file_access_, password_cstr); 2517 doc_ = FPDF_LoadCustomDocument(&file_access_, password_cstr);
2480 } else { 2518 } else {
2481 doc_ = FPDFAvail_GetDocument(fpdf_availability_, password_cstr); 2519 doc_ = FPDFAvail_GetDocument(fpdf_availability_, password_cstr);
2482 } 2520 }
2483 if (!doc_) { 2521 if (!doc_) {
2484 if (FPDF_GetLastError() == FPDF_ERR_PASSWORD) 2522 if (FPDF_GetLastError() == FPDF_ERR_PASSWORD)
2485 *needs_password = true; 2523 *needs_password = true;
2486 return false; 2524 return false;
2487 } 2525 }
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
2524 client_->DocumentLoadFailed(); 2562 client_->DocumentLoadFailed();
2525 return; 2563 return;
2526 } 2564 }
2527 2565
2528 if (FPDFDoc_GetPageMode(doc_) == PAGEMODE_USEOUTLINES) 2566 if (FPDFDoc_GetPageMode(doc_) == PAGEMODE_USEOUTLINES)
2529 client_->DocumentHasUnsupportedFeature("Bookmarks"); 2567 client_->DocumentHasUnsupportedFeature("Bookmarks");
2530 2568
2531 permissions_ = FPDF_GetDocPermissions(doc_); 2569 permissions_ = FPDF_GetDocPermissions(doc_);
2532 permissions_handler_revision_ = FPDF_GetSecurityHandlerRevision(doc_); 2570 permissions_handler_revision_ = FPDF_GetSecurityHandlerRevision(doc_);
2533 2571
2534 if (!form_) { 2572 if (!doc_loader_->IsDocumentComplete()) {
2535 int form_status =
2536 FPDFAvail_IsFormAvail(fpdf_availability_, &download_hints_);
2537 bool doc_complete = doc_loader_.IsDocumentComplete();
2538 // Try again if the data is not available and the document hasn't finished
2539 // downloading.
2540 if (form_status == PDF_FORM_NOTAVAIL && !doc_complete)
2541 return;
2542
2543 form_ = FPDFDOC_InitFormFillEnvironment(
2544 doc_, static_cast<FPDF_FORMFILLINFO*>(this));
2545 #if defined(PDF_ENABLE_XFA)
2546 FPDF_LoadXFA(doc_);
2547 #endif
2548
2549 FPDF_SetFormFieldHighlightColor(form_, 0, kFormHighlightColor);
2550 FPDF_SetFormFieldHighlightAlpha(form_, kFormHighlightAlpha);
2551 }
2552
2553 if (!doc_loader_.IsDocumentComplete()) {
2554 // Check if the first page is available. In a linearized PDF, that is not 2573 // Check if the first page is available. In a linearized PDF, that is not
2555 // always page 0. Doing this gives us the default page size, since when the 2574 // always page 0. Doing this gives us the default page size, since when the
2556 // document is available, the first page is available as well. 2575 // document is available, the first page is available as well.
2557 CheckPageAvailable(FPDFAvail_GetFirstPageNum(doc_), &pending_pages_); 2576 CheckPageAvailable(FPDFAvail_GetFirstPageNum(doc_), &pending_pages_);
2558 } 2577 }
2559 2578
2560 LoadPageInfo(false); 2579 LoadPageInfo(false);
2561 2580
2562 if (doc_loader_.IsDocumentComplete()) 2581 if (doc_loader_->IsDocumentComplete())
2563 FinishLoadingDocument(); 2582 FinishLoadingDocument();
2564 } 2583 }
2565 2584
2566 void PDFiumEngine::LoadPageInfo(bool reload) { 2585 void PDFiumEngine::LoadPageInfo(bool reload) {
2567 pending_pages_.clear(); 2586 pending_pages_.clear();
2568 pp::Size old_document_size = document_size_; 2587 pp::Size old_document_size = document_size_;
2569 document_size_ = pp::Size(); 2588 document_size_ = pp::Size();
2570 std::vector<pp::Rect> page_rects; 2589 std::vector<pp::Rect> page_rects;
2571 int page_count = FPDF_GetPageCount(doc_); 2590 int page_count = FPDF_GetPageCount(doc_);
2572 bool doc_complete = doc_loader_.IsDocumentComplete(); 2591 bool doc_complete = doc_loader_->IsDocumentComplete();
2573 bool is_linear = FPDFAvail_IsLinearized(fpdf_availability_) == PDF_LINEARIZED; 2592 bool is_linear = FPDFAvail_IsLinearized(fpdf_availability_) == PDF_LINEARIZED;
2574 for (int i = 0; i < page_count; ++i) { 2593 for (int i = 0; i < page_count; ++i) {
2575 if (i != 0) { 2594 if (i != 0) {
2576 // Add space for horizontal separator. 2595 // Add space for horizontal separator.
2577 document_size_.Enlarge(0, kPageSeparatorThickness); 2596 document_size_.Enlarge(0, kPageSeparatorThickness);
2578 } 2597 }
2579 2598
2580 // Get page availability. If |reload| == true, then the document has been 2599 // Get page availability. If |reload| == true, then the document has been
2581 // constructed already. Get page availability flag from already existing 2600 // constructed already. Get page availability flag from already existing
2582 // PDFiumPage class. 2601 // PDFiumPage class.
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
2619 pages_.push_back(new PDFiumPage(this, i, page_rect, false)); 2638 pages_.push_back(new PDFiumPage(this, i, page_rect, false));
2620 } 2639 }
2621 } 2640 }
2622 2641
2623 CalculateVisiblePages(); 2642 CalculateVisiblePages();
2624 if (document_size_ != old_document_size) 2643 if (document_size_ != old_document_size)
2625 client_->DocumentSizeUpdated(document_size_); 2644 client_->DocumentSizeUpdated(document_size_);
2626 } 2645 }
2627 2646
2628 void PDFiumEngine::CalculateVisiblePages() { 2647 void PDFiumEngine::CalculateVisiblePages() {
2648 if (!doc_loader_)
2649 return;
2629 // Clear pending requests queue, since it may contain requests to the pages 2650 // Clear pending requests queue, since it may contain requests to the pages
2630 // that are already invisible (after scrolling for example). 2651 // that are already invisible (after scrolling for example).
2631 pending_pages_.clear(); 2652 pending_pages_.clear();
2632 doc_loader_.ClearPendingRequests(); 2653 doc_loader_->ClearPendingRequests();
2633 2654
2634 visible_pages_.clear(); 2655 visible_pages_.clear();
2635 pp::Rect visible_rect(plugin_size_); 2656 pp::Rect visible_rect(plugin_size_);
2636 for (size_t i = 0; i < pages_.size(); ++i) { 2657 for (size_t i = 0; i < pages_.size(); ++i) {
2637 // Check an entire PageScreenRect, since we might need to repaint side 2658 // Check an entire PageScreenRect, since we might need to repaint side
2638 // borders and shadows even if the page itself is not visible. 2659 // borders and shadows even if the page itself is not visible.
2639 // For example, when user use pdf with different page sizes and zoomed in 2660 // For example, when user use pdf with different page sizes and zoomed in
2640 // outside page area. 2661 // outside page area.
2641 if (visible_rect.Intersects(GetPageScreenRect(i))) { 2662 if (visible_rect.Intersects(GetPageScreenRect(i))) {
2642 visible_pages_.push_back(i); 2663 visible_pages_.push_back(i);
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
2680 bool PDFiumEngine::IsPageVisible(int index) const { 2701 bool PDFiumEngine::IsPageVisible(int index) const {
2681 return base::ContainsValue(visible_pages_, index); 2702 return base::ContainsValue(visible_pages_, index);
2682 } 2703 }
2683 2704
2684 void PDFiumEngine::ScrollToPage(int page) { 2705 void PDFiumEngine::ScrollToPage(int page) {
2685 in_flight_visible_page_ = page; 2706 in_flight_visible_page_ = page;
2686 client_->ScrollToPage(page); 2707 client_->ScrollToPage(page);
2687 } 2708 }
2688 2709
2689 bool PDFiumEngine::CheckPageAvailable(int index, std::vector<int>* pending) { 2710 bool PDFiumEngine::CheckPageAvailable(int index, std::vector<int>* pending) {
2690 if (!doc_ || !form_) 2711 if (!doc_)
2691 return false; 2712 return false;
2692 2713
2693 const int num_pages = static_cast<int>(pages_.size()); 2714 const int num_pages = static_cast<int>(pages_.size());
2694 if (index < num_pages && pages_[index]->available()) 2715 if (index < num_pages && pages_[index]->available())
2695 return true; 2716 return true;
2696 2717
2697 if (!FPDFAvail_IsPageAvail(fpdf_availability_, index, &download_hints_)) { 2718 if (!FPDFAvail_IsPageAvail(fpdf_availability_, index, &download_hints_)) {
2698 if (!base::ContainsValue(*pending, index)) 2719 if (!base::ContainsValue(*pending, index))
2699 pending->push_back(index); 2720 pending->push_back(index);
2700 return false; 2721 return false;
(...skipping 1274 matching lines...) Expand 10 before | Expand all | Expand 10 after
3975 FPDF_DOCUMENT doc = 3996 FPDF_DOCUMENT doc =
3976 FPDF_LoadMemDocument(pdf_buffer, pdf_buffer_size, nullptr); 3997 FPDF_LoadMemDocument(pdf_buffer, pdf_buffer_size, nullptr);
3977 if (!doc) 3998 if (!doc)
3978 return false; 3999 return false;
3979 bool success = FPDF_GetPageSizeByIndex(doc, page_number, width, height) != 0; 4000 bool success = FPDF_GetPageSizeByIndex(doc, page_number, width, height) != 0;
3980 FPDF_CloseDocument(doc); 4001 FPDF_CloseDocument(doc);
3981 return success; 4002 return success;
3982 } 4003 }
3983 4004
3984 } // namespace chrome_pdf 4005 } // namespace chrome_pdf
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698