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

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

Issue 2558573002: Revert "reland of Improve linearized pdf load/show time." (Closed)
Patch Set: Changes to make tests pass ... Created 4 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 unified diff | Download patch
« no previous file with comments | « pdf/pdfium/pdfium_engine.h ('k') | pdf/preview_mode_client.h » ('j') | 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 14 matching lines...) Expand all
25 #include "base/strings/string_piece.h" 25 #include "base/strings/string_piece.h"
26 #include "base/strings/string_util.h" 26 #include "base/strings/string_util.h"
27 #include "base/strings/utf_string_conversions.h" 27 #include "base/strings/utf_string_conversions.h"
28 #include "gin/array_buffer.h" 28 #include "gin/array_buffer.h"
29 #include "gin/public/gin_embedders.h" 29 #include "gin/public/gin_embedders.h"
30 #include "gin/public/isolate_holder.h" 30 #include "gin/public/isolate_holder.h"
31 #include "pdf/draw_utils.h" 31 #include "pdf/draw_utils.h"
32 #include "pdf/pdfium/pdfium_api_string_buffer_adapter.h" 32 #include "pdf/pdfium/pdfium_api_string_buffer_adapter.h"
33 #include "pdf/pdfium/pdfium_mem_buffer_file_read.h" 33 #include "pdf/pdfium/pdfium_mem_buffer_file_read.h"
34 #include "pdf/pdfium/pdfium_mem_buffer_file_write.h" 34 #include "pdf/pdfium/pdfium_mem_buffer_file_write.h"
35 #include "pdf/url_loader_wrapper_impl.h"
36 #include "ppapi/c/pp_errors.h" 35 #include "ppapi/c/pp_errors.h"
37 #include "ppapi/c/pp_input_event.h" 36 #include "ppapi/c/pp_input_event.h"
38 #include "ppapi/c/ppb_core.h" 37 #include "ppapi/c/ppb_core.h"
39 #include "ppapi/c/private/ppb_pdf.h" 38 #include "ppapi/c/private/ppb_pdf.h"
40 #include "ppapi/cpp/dev/memory_dev.h" 39 #include "ppapi/cpp/dev/memory_dev.h"
41 #include "ppapi/cpp/input_event.h" 40 #include "ppapi/cpp/input_event.h"
42 #include "ppapi/cpp/instance.h" 41 #include "ppapi/cpp/instance.h"
43 #include "ppapi/cpp/module.h" 42 #include "ppapi/cpp/module.h"
44 #include "ppapi/cpp/private/pdf.h" 43 #include "ppapi/cpp/private/pdf.h"
45 #include "ppapi/cpp/trusted/browser_font_trusted.h" 44 #include "ppapi/cpp/trusted/browser_font_trusted.h"
(...skipping 616 matching lines...) Expand 10 before | Expand all | Expand 10 after
662 } 661 }
663 662
664 PDFEngine* PDFEngine::Create(PDFEngine::Client* client) { 663 PDFEngine* PDFEngine::Create(PDFEngine::Client* client) {
665 return new PDFiumEngine(client); 664 return new PDFiumEngine(client);
666 } 665 }
667 666
668 PDFiumEngine::PDFiumEngine(PDFEngine::Client* client) 667 PDFiumEngine::PDFiumEngine(PDFEngine::Client* client)
669 : client_(client), 668 : client_(client),
670 current_zoom_(1.0), 669 current_zoom_(1.0),
671 current_rotation_(0), 670 current_rotation_(0),
671 doc_loader_(this),
672 password_tries_remaining_(0), 672 password_tries_remaining_(0),
673 doc_(nullptr), 673 doc_(nullptr),
674 form_(nullptr), 674 form_(nullptr),
675 defer_page_unload_(false), 675 defer_page_unload_(false),
676 selecting_(false), 676 selecting_(false),
677 mouse_down_state_(PDFiumPage::NONSELECTABLE_AREA, 677 mouse_down_state_(PDFiumPage::NONSELECTABLE_AREA,
678 PDFiumPage::LinkTarget()), 678 PDFiumPage::LinkTarget()),
679 next_page_to_search_(-1), 679 next_page_to_search_(-1),
680 last_page_to_search_(-1), 680 last_page_to_search_(-1),
681 last_character_index_to_search_(-1), 681 last_character_index_to_search_(-1),
682 permissions_(0), 682 permissions_(0),
683 permissions_handler_revision_(-1), 683 permissions_handler_revision_(-1),
684 fpdf_availability_(nullptr), 684 fpdf_availability_(nullptr),
685 next_timer_id_(0), 685 next_timer_id_(0),
686 last_page_mouse_down_(-1), 686 last_page_mouse_down_(-1),
687 most_visible_page_(-1), 687 most_visible_page_(-1),
688 called_do_document_action_(false), 688 called_do_document_action_(false),
689 render_grayscale_(false), 689 render_grayscale_(false),
690 render_annots_(true), 690 render_annots_(true),
691 progressive_paint_timeout_(0), 691 progressive_paint_timeout_(0),
692 getting_password_(false) { 692 getting_password_(false) {
693 find_factory_.Initialize(this); 693 find_factory_.Initialize(this);
694 password_factory_.Initialize(this); 694 password_factory_.Initialize(this);
695 695
696 file_access_.m_FileLen = 0; 696 file_access_.m_FileLen = 0;
697 file_access_.m_GetBlock = &GetBlock; 697 file_access_.m_GetBlock = &GetBlock;
698 file_access_.m_Param = this; 698 file_access_.m_Param = &doc_loader_;
699 699
700 file_availability_.version = 1; 700 file_availability_.version = 1;
701 file_availability_.IsDataAvail = &IsDataAvail; 701 file_availability_.IsDataAvail = &IsDataAvail;
702 file_availability_.engine = this; 702 file_availability_.loader = &doc_loader_;
703 703
704 download_hints_.version = 1; 704 download_hints_.version = 1;
705 download_hints_.AddSegment = &AddSegment; 705 download_hints_.AddSegment = &AddSegment;
706 download_hints_.engine = this; 706 download_hints_.loader = &doc_loader_;
707 707
708 // Initialize FPDF_FORMFILLINFO member variables. Deriving from this struct 708 // Initialize FPDF_FORMFILLINFO member variables. Deriving from this struct
709 // allows the static callbacks to be able to cast the FPDF_FORMFILLINFO in 709 // allows the static callbacks to be able to cast the FPDF_FORMFILLINFO in
710 // callbacks to ourself instead of maintaining a map of them to 710 // callbacks to ourself instead of maintaining a map of them to
711 // PDFiumEngine. 711 // PDFiumEngine.
712 FPDF_FORMFILLINFO::version = 1; 712 FPDF_FORMFILLINFO::version = 1;
713 FPDF_FORMFILLINFO::m_pJsPlatform = this; 713 FPDF_FORMFILLINFO::m_pJsPlatform = this;
714 FPDF_FORMFILLINFO::Release = nullptr; 714 FPDF_FORMFILLINFO::Release = nullptr;
715 FPDF_FORMFILLINFO::FFI_Invalidate = Form_Invalidate; 715 FPDF_FORMFILLINFO::FFI_Invalidate = Form_Invalidate;
716 FPDF_FORMFILLINFO::FFI_OutputSelectedRect = Form_OutputSelectedRect; 716 FPDF_FORMFILLINFO::FFI_OutputSelectedRect = Form_OutputSelectedRect;
(...skipping 249 matching lines...) Expand 10 before | Expand all | Expand 10 after
966 int PDFiumEngine::Form_GetLanguage(FPDF_FORMFILLINFO* param, 966 int PDFiumEngine::Form_GetLanguage(FPDF_FORMFILLINFO* param,
967 void* language, 967 void* language,
968 int length) { 968 int length) {
969 return 0; 969 return 0;
970 } 970 }
971 971
972 #endif // defined(PDF_ENABLE_XFA) 972 #endif // defined(PDF_ENABLE_XFA)
973 973
974 int PDFiumEngine::GetBlock(void* param, unsigned long position, 974 int PDFiumEngine::GetBlock(void* param, unsigned long position,
975 unsigned char* buffer, unsigned long size) { 975 unsigned char* buffer, unsigned long size) {
976 PDFiumEngine* engine = static_cast<PDFiumEngine*>(param); 976 DocumentLoader* loader = static_cast<DocumentLoader*>(param);
977 return engine->doc_loader_->GetBlock(position, size, buffer); 977 return loader->GetBlock(position, size, buffer);
978 } 978 }
979 979
980 FPDF_BOOL PDFiumEngine::IsDataAvail(FX_FILEAVAIL* param, 980 FPDF_BOOL PDFiumEngine::IsDataAvail(FX_FILEAVAIL* param,
981 size_t offset, size_t size) { 981 size_t offset, size_t size) {
982 PDFiumEngine::FileAvail* file_avail = 982 PDFiumEngine::FileAvail* file_avail =
983 static_cast<PDFiumEngine::FileAvail*>(param); 983 static_cast<PDFiumEngine::FileAvail*>(param);
984 return file_avail->engine->doc_loader_->IsDataAvailable(offset, size); 984 return file_avail->loader->IsDataAvailable(offset, size);
985 } 985 }
986 986
987 void PDFiumEngine::AddSegment(FX_DOWNLOADHINTS* param, 987 void PDFiumEngine::AddSegment(FX_DOWNLOADHINTS* param,
988 size_t offset, size_t size) { 988 size_t offset, size_t size) {
989 PDFiumEngine::DownloadHints* download_hints = 989 PDFiumEngine::DownloadHints* download_hints =
990 static_cast<PDFiumEngine::DownloadHints*>(param); 990 static_cast<PDFiumEngine::DownloadHints*>(param);
991 return download_hints->engine->doc_loader_->RequestData(offset, size); 991 return download_hints->loader->RequestData(offset, size);
992 } 992 }
993 993
994 bool PDFiumEngine::New(const char* url, 994 bool PDFiumEngine::New(const char* url,
995 const char* headers) { 995 const char* headers) {
996 url_ = url; 996 url_ = url;
997 if (headers) 997 if (headers)
998 headers_ = headers; 998 headers_ = headers;
999 else 999 else
1000 headers_.clear(); 1000 headers_.clear();
1001 return true; 1001 return true;
(...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after
1116 FPDF_RenderPage_Close( 1116 FPDF_RenderPage_Close(
1117 pages_[progressive_paints_[i].page_index]->GetPage()); 1117 pages_[progressive_paints_[i].page_index]->GetPage());
1118 FPDFBitmap_Destroy(progressive_paints_[i].bitmap); 1118 FPDFBitmap_Destroy(progressive_paints_[i].bitmap);
1119 progressive_paints_.erase(progressive_paints_.begin() + i); 1119 progressive_paints_.erase(progressive_paints_.begin() + i);
1120 --i; 1120 --i;
1121 } 1121 }
1122 } 1122 }
1123 1123
1124 bool PDFiumEngine::HandleDocumentLoad(const pp::URLLoader& loader) { 1124 bool PDFiumEngine::HandleDocumentLoad(const pp::URLLoader& loader) {
1125 password_tries_remaining_ = kMaxPasswordTries; 1125 password_tries_remaining_ = kMaxPasswordTries;
1126 process_when_pending_request_complete_ = true; 1126 return doc_loader_.Init(loader, url_, headers_);
1127 auto loader_wrapper =
1128 base::MakeUnique<URLLoaderWrapperImpl>(GetPluginInstance(), loader);
1129 loader_wrapper->SetResponseHeaders(headers_);
1130
1131 doc_loader_ = base::MakeUnique<DocumentLoader>(this);
1132 if (doc_loader_->Init(std::move(loader_wrapper), url_)) {
1133 // request initial data.
1134 doc_loader_->RequestData(0, 1);
1135 return true;
1136 }
1137 return false;
1138 } 1127 }
1139 1128
1140 pp::Instance* PDFiumEngine::GetPluginInstance() { 1129 pp::Instance* PDFiumEngine::GetPluginInstance() {
1141 return client_->GetPluginInstance(); 1130 return client_->GetPluginInstance();
1142 } 1131 }
1143 1132
1144 std::unique_ptr<URLLoaderWrapper> PDFiumEngine::CreateURLLoader() { 1133 pp::URLLoader PDFiumEngine::CreateURLLoader() {
1145 return base::MakeUnique<URLLoaderWrapperImpl>(GetPluginInstance(), 1134 return client_->CreateURLLoader();
1146 client_->CreateURLLoader());
1147 } 1135 }
1148 1136
1149 void PDFiumEngine::AppendPage(PDFEngine* engine, int index) { 1137 void PDFiumEngine::AppendPage(PDFEngine* engine, int index) {
1150 // Unload and delete the blank page before appending. 1138 // Unload and delete the blank page before appending.
1151 pages_[index]->Unload(); 1139 pages_[index]->Unload();
1152 pages_[index]->set_calculated_links(false); 1140 pages_[index]->set_calculated_links(false);
1153 pp::Size curr_page_size = GetPageSize(index); 1141 pp::Size curr_page_size = GetPageSize(index);
1154 FPDFPage_Delete(doc_, index); 1142 FPDFPage_Delete(doc_, index);
1155 FPDF_ImportPages(doc_, 1143 FPDF_ImportPages(doc_,
1156 static_cast<PDFiumEngine*>(engine)->doc(), 1144 static_cast<PDFiumEngine*>(engine)->doc(),
1157 "1", 1145 "1",
1158 index); 1146 index);
1159 pp::Size new_page_size = GetPageSize(index); 1147 pp::Size new_page_size = GetPageSize(index);
1160 if (curr_page_size != new_page_size) 1148 if (curr_page_size != new_page_size)
1161 LoadPageInfo(true); 1149 LoadPageInfo(true);
1162 client_->Invalidate(GetPageScreenRect(index)); 1150 client_->Invalidate(GetPageScreenRect(index));
1163 } 1151 }
1164 1152
1165 #if defined(PDF_ENABLE_XFA) 1153 #if defined(PDF_ENABLE_XFA)
1166 void PDFiumEngine::SetScrollPosition(const pp::Point& position) { 1154 void PDFiumEngine::SetScrollPosition(const pp::Point& position) {
1167 position_ = position; 1155 position_ = position;
1168 } 1156 }
1169 #endif 1157 #endif
1170 1158
1159 bool PDFiumEngine::IsProgressiveLoad() {
1160 return doc_loader_.is_partial_document();
1161 }
1162
1171 std::string PDFiumEngine::GetMetadata(const std::string& key) { 1163 std::string PDFiumEngine::GetMetadata(const std::string& key) {
1172 return GetDocumentMetadata(doc(), key); 1164 return GetDocumentMetadata(doc(), key);
1173 } 1165 }
1174 1166
1175 void PDFiumEngine::OnPendingRequestComplete() { 1167 void PDFiumEngine::OnPartialDocumentLoaded() {
1176 if (!process_when_pending_request_complete_) 1168 file_access_.m_FileLen = doc_loader_.document_size();
1177 return;
1178 if (!fpdf_availability_) { 1169 if (!fpdf_availability_) {
1179 file_access_.m_FileLen = doc_loader_->GetDocumentSize();
1180 fpdf_availability_ = FPDFAvail_Create(&file_availability_, &file_access_); 1170 fpdf_availability_ = FPDFAvail_Create(&file_availability_, &file_access_);
1181 DCHECK(fpdf_availability_); 1171 DCHECK(fpdf_availability_);
1182 // Currently engine does not deal efficiently with some non-linearized
1183 // files.
1184 // See http://code.google.com/p/chromium/issues/detail?id=59400
1185 // To improve user experience we download entire file for non-linearized
1186 // PDF.
1187 if (FPDFAvail_IsLinearized(fpdf_availability_) != PDF_LINEARIZED) {
1188 // Wait complete document.
1189 process_when_pending_request_complete_ = false;
1190 FPDFAvail_Destroy(fpdf_availability_);
1191 fpdf_availability_ = nullptr;
1192 return;
1193 }
1194 } 1172 }
1195 1173
1196 if (!doc_) { 1174 // Currently engine does not deal efficiently with some non-linearized files.
1175 // See http://code.google.com/p/chromium/issues/detail?id=59400
1176 // To improve user experience we download entire file for non-linearized PDF.
1177 if (!FPDFAvail_IsLinearized(fpdf_availability_)) {
1178 doc_loader_.RequestData(0, doc_loader_.document_size());
1179 return;
1180 }
1181
1182 LoadDocument();
1183 }
1184
1185 void PDFiumEngine::OnPendingRequestComplete() {
1186 if (!doc_ || !form_) {
1187 DCHECK(fpdf_availability_);
1197 LoadDocument(); 1188 LoadDocument();
1198 return; 1189 return;
1199 } 1190 }
1200 1191
1201 // LoadDocument() will result in |pending_pages_| being reset so there's no 1192 // LoadDocument() will result in |pending_pages_| being reset so there's no
1202 // need to run the code below in that case. 1193 // need to run the code below in that case.
1203 bool update_pages = false; 1194 bool update_pages = false;
1204 std::vector<int> still_pending; 1195 std::vector<int> still_pending;
1205 for (int pending_page : pending_pages_) { 1196 for (int pending_page : pending_pages_) {
1206 if (CheckPageAvailable(pending_page, &still_pending)) { 1197 if (CheckPageAvailable(pending_page, &still_pending)) {
1207 update_pages = true; 1198 update_pages = true;
1208 if (IsPageVisible(pending_page)) 1199 if (IsPageVisible(pending_page))
1209 client_->Invalidate(GetPageScreenRect(pending_page)); 1200 client_->Invalidate(GetPageScreenRect(pending_page));
1210 } 1201 }
1211 } 1202 }
1212 pending_pages_.swap(still_pending); 1203 pending_pages_.swap(still_pending);
1213 if (update_pages) 1204 if (update_pages)
1214 LoadPageInfo(true); 1205 LoadPageInfo(true);
1215 } 1206 }
1216 1207
1217 void PDFiumEngine::OnNewDataAvailable() { 1208 void PDFiumEngine::OnNewDataAvailable() {
1218 if (!doc_loader_->GetDocumentSize()) { 1209 client_->DocumentLoadProgress(doc_loader_.GetAvailableData(),
1219 client_->DocumentLoadProgress(doc_loader_->count_of_bytes_received(), 0); 1210 doc_loader_.document_size());
1211 }
1212
1213 void PDFiumEngine::OnDocumentFailed() {
1214 client_->DocumentLoadFailed();
1215 }
1216
1217 void PDFiumEngine::OnDocumentComplete() {
1218 if (!doc_ || !form_) {
1219 file_access_.m_FileLen = doc_loader_.document_size();
1220 if (!fpdf_availability_) {
1221 fpdf_availability_ = FPDFAvail_Create(&file_availability_, &file_access_);
1222 DCHECK(fpdf_availability_);
1223 }
1224 LoadDocument();
1220 return; 1225 return;
1221 } 1226 }
1222 1227
1223 const float progress = doc_loader_->GetProgress(); 1228 FinishLoadingDocument();
1224 DCHECK_GE(progress, 0.0);
1225 DCHECK_LE(progress, 1.0);
1226 client_->DocumentLoadProgress(progress * 10000, 10000);
1227 }
1228
1229 void PDFiumEngine::OnDocumentComplete() {
1230 if (doc_) {
1231 return FinishLoadingDocument();
1232 }
1233 file_access_.m_FileLen = doc_loader_->GetDocumentSize();
1234 if (!fpdf_availability_) {
1235 fpdf_availability_ = FPDFAvail_Create(&file_availability_, &file_access_);
1236 DCHECK(fpdf_availability_);
1237 }
1238 LoadDocument();
1239 }
1240
1241 void PDFiumEngine::OnDocumentCanceled() {
1242 if (visible_pages_.empty())
1243 client_->DocumentLoadFailed();
1244 else
1245 OnDocumentComplete();
1246 }
1247
1248 void PDFiumEngine::CancelBrowserDownload() {
1249 client_->CancelBrowserDownload();
1250 } 1229 }
1251 1230
1252 void PDFiumEngine::FinishLoadingDocument() { 1231 void PDFiumEngine::FinishLoadingDocument() {
1253 DCHECK(doc_loader_->IsDocumentComplete() && doc_); 1232 DCHECK(doc_loader_.IsDocumentComplete() && doc_);
1254
1255 if (!form_) {
1256 int form_status =
1257 FPDFAvail_IsFormAvail(fpdf_availability_, &download_hints_);
1258 if (form_status != PDF_FORM_NOTAVAIL) {
1259 form_ = FPDFDOC_InitFormFillEnvironment(
1260 doc_, static_cast<FPDF_FORMFILLINFO*>(this));
1261 #if defined(PDF_ENABLE_XFA)
1262 FPDF_LoadXFA(doc_);
1263 #endif
1264
1265 FPDF_SetFormFieldHighlightColor(form_, 0, kFormHighlightColor);
1266 FPDF_SetFormFieldHighlightAlpha(form_, kFormHighlightAlpha);
1267 }
1268 }
1269 1233
1270 bool need_update = false; 1234 bool need_update = false;
1271 for (size_t i = 0; i < pages_.size(); ++i) { 1235 for (size_t i = 0; i < pages_.size(); ++i) {
1272 if (pages_[i]->available()) 1236 if (pages_[i]->available())
1273 continue; 1237 continue;
1274 1238
1275 pages_[i]->set_available(true); 1239 pages_[i]->set_available(true);
1276 // We still need to call IsPageAvail() even if the whole document is 1240 // We still need to call IsPageAvail() even if the whole document is
1277 // already downloaded. 1241 // already downloaded.
1278 FPDFAvail_IsPageAvail(fpdf_availability_, i, &download_hints_); 1242 FPDFAvail_IsPageAvail(fpdf_availability_, i, &download_hints_);
(...skipping 191 matching lines...) Expand 10 before | Expand all | Expand 10 after
1470 return temp_doc; 1434 return temp_doc;
1471 } 1435 }
1472 1436
1473 pp::Buffer_Dev PDFiumEngine::PrintPagesAsRasterPDF( 1437 pp::Buffer_Dev PDFiumEngine::PrintPagesAsRasterPDF(
1474 const PP_PrintPageNumberRange_Dev* page_ranges, uint32_t page_range_count, 1438 const PP_PrintPageNumberRange_Dev* page_ranges, uint32_t page_range_count,
1475 const PP_PrintSettings_Dev& print_settings) { 1439 const PP_PrintSettings_Dev& print_settings) {
1476 if (!page_range_count) 1440 if (!page_range_count)
1477 return pp::Buffer_Dev(); 1441 return pp::Buffer_Dev();
1478 1442
1479 // If document is not downloaded yet, disable printing. 1443 // If document is not downloaded yet, disable printing.
1480 if (doc_ && !doc_loader_->IsDocumentComplete()) 1444 if (doc_ && !doc_loader_.IsDocumentComplete())
1481 return pp::Buffer_Dev(); 1445 return pp::Buffer_Dev();
1482 1446
1483 FPDF_DOCUMENT output_doc = FPDF_CreateNewDocument(); 1447 FPDF_DOCUMENT output_doc = FPDF_CreateNewDocument();
1484 if (!output_doc) 1448 if (!output_doc)
1485 return pp::Buffer_Dev(); 1449 return pp::Buffer_Dev();
1486 1450
1487 SaveSelectedFormForPrint(); 1451 SaveSelectedFormForPrint();
1488 1452
1489 std::vector<PDFiumPage> pages_to_print; 1453 std::vector<PDFiumPage> pages_to_print;
1490 // width and height of source PDF pages. 1454 // width and height of source PDF pages.
(...skipping 1122 matching lines...) Expand 10 before | Expand all | Expand 10 after
2613 } 2577 }
2614 2578
2615 CalculateVisiblePages(); 2579 CalculateVisiblePages();
2616 if (document_size_ != old_document_size) 2580 if (document_size_ != old_document_size)
2617 client_->DocumentSizeUpdated(document_size_); 2581 client_->DocumentSizeUpdated(document_size_);
2618 } 2582 }
2619 2583
2620 void PDFiumEngine::LoadDocument() { 2584 void PDFiumEngine::LoadDocument() {
2621 // Check if the document is ready for loading. If it isn't just bail for now, 2585 // Check if the document is ready for loading. If it isn't just bail for now,
2622 // we will call LoadDocument() again later. 2586 // we will call LoadDocument() again later.
2623 if (!doc_ && !doc_loader_->IsDocumentComplete() && 2587 if (!doc_ && !doc_loader_.IsDocumentComplete() &&
2624 !FPDFAvail_IsDocAvail(fpdf_availability_, &download_hints_)) { 2588 !FPDFAvail_IsDocAvail(fpdf_availability_, &download_hints_)) {
2625 return; 2589 return;
2626 } 2590 }
2627 2591
2628 // If we're in the middle of getting a password, just return. We will retry 2592 // If we're in the middle of getting a password, just return. We will retry
2629 // loading the document after we get the password anyway. 2593 // loading the document after we get the password anyway.
2630 if (getting_password_) 2594 if (getting_password_)
2631 return; 2595 return;
2632 2596
2633 ScopedUnsupportedFeature scoped_unsupported_feature(this); 2597 ScopedUnsupportedFeature scoped_unsupported_feature(this);
(...skipping 18 matching lines...) Expand all
2652 // call may have failed, so call it again for good measure. 2616 // call may have failed, so call it again for good measure.
2653 FPDFAvail_IsDocAvail(fpdf_availability_, &download_hints_); 2617 FPDFAvail_IsDocAvail(fpdf_availability_, &download_hints_);
2654 return true; 2618 return true;
2655 } 2619 }
2656 2620
2657 const char* password_cstr = nullptr; 2621 const char* password_cstr = nullptr;
2658 if (!password.empty()) { 2622 if (!password.empty()) {
2659 password_cstr = password.c_str(); 2623 password_cstr = password.c_str();
2660 password_tries_remaining_--; 2624 password_tries_remaining_--;
2661 } 2625 }
2662 if (doc_loader_->IsDocumentComplete() && 2626 if (doc_loader_.IsDocumentComplete() &&
2663 !FPDFAvail_IsLinearized(fpdf_availability_)) { 2627 !FPDFAvail_IsLinearized(fpdf_availability_)) {
2664 doc_ = FPDF_LoadCustomDocument(&file_access_, password_cstr); 2628 doc_ = FPDF_LoadCustomDocument(&file_access_, password_cstr);
2665 } else { 2629 } else {
2666 doc_ = FPDFAvail_GetDocument(fpdf_availability_, password_cstr); 2630 doc_ = FPDFAvail_GetDocument(fpdf_availability_, password_cstr);
2667 } 2631 }
2632
2668 if (!doc_) { 2633 if (!doc_) {
2669 if (FPDF_GetLastError() == FPDF_ERR_PASSWORD) 2634 if (FPDF_GetLastError() == FPDF_ERR_PASSWORD)
2670 *needs_password = true; 2635 *needs_password = true;
2671 return false; 2636 return false;
2672 } 2637 }
2673 2638
2674 // Always call FPDFAvail_IsDocAvail() so PDFium initializes internal data 2639 // Always call FPDFAvail_IsDocAvail() so PDFium initializes internal data
2675 // structures. 2640 // structures.
2676 FPDFAvail_IsDocAvail(fpdf_availability_, &download_hints_); 2641 FPDFAvail_IsDocAvail(fpdf_availability_, &download_hints_);
2677 return true; 2642 return true;
(...skipping 20 matching lines...) Expand all
2698 ScopedUnsupportedFeature scoped_unsupported_feature(this); 2663 ScopedUnsupportedFeature scoped_unsupported_feature(this);
2699 ScopedSubstFont scoped_subst_font(this); 2664 ScopedSubstFont scoped_subst_font(this);
2700 2665
2701 bool needs_password = false; 2666 bool needs_password = false;
2702 bool loaded = TryLoadingDoc(password, &needs_password); 2667 bool loaded = TryLoadingDoc(password, &needs_password);
2703 bool password_incorrect = !loaded && needs_password && !password.empty(); 2668 bool password_incorrect = !loaded && needs_password && !password.empty();
2704 if (password_incorrect && password_tries_remaining_ > 0) { 2669 if (password_incorrect && password_tries_remaining_ > 0) {
2705 GetPasswordAndLoad(); 2670 GetPasswordAndLoad();
2706 return; 2671 return;
2707 } 2672 }
2708
2709 if (!doc_) { 2673 if (!doc_) {
2710 client_->DocumentLoadFailed(); 2674 client_->DocumentLoadFailed();
2711 return; 2675 return;
2712 } 2676 }
2713 2677
2714 if (FPDFDoc_GetPageMode(doc_) == PAGEMODE_USEOUTLINES) 2678 if (FPDFDoc_GetPageMode(doc_) == PAGEMODE_USEOUTLINES)
2715 client_->DocumentHasUnsupportedFeature("Bookmarks"); 2679 client_->DocumentHasUnsupportedFeature("Bookmarks");
2716 2680
2717 permissions_ = FPDF_GetDocPermissions(doc_); 2681 permissions_ = FPDF_GetDocPermissions(doc_);
2718 permissions_handler_revision_ = FPDF_GetSecurityHandlerRevision(doc_); 2682 permissions_handler_revision_ = FPDF_GetSecurityHandlerRevision(doc_);
2719 2683
2720 if (!doc_loader_->IsDocumentComplete()) { 2684 if (!form_) {
2685 int form_status =
2686 FPDFAvail_IsFormAvail(fpdf_availability_, &download_hints_);
2687 bool doc_complete = doc_loader_.IsDocumentComplete();
2688 // Try again if the data is not available and the document hasn't finished
2689 // downloading.
2690 if (form_status == PDF_FORM_NOTAVAIL && !doc_complete)
2691 return;
2692
2693 form_ = FPDFDOC_InitFormFillEnvironment(
2694 doc_, static_cast<FPDF_FORMFILLINFO*>(this));
2695 #if defined(PDF_ENABLE_XFA)
2696 FPDF_LoadXFA(doc_);
2697 #endif
2698
2699 FPDF_SetFormFieldHighlightColor(form_, 0, kFormHighlightColor);
2700 FPDF_SetFormFieldHighlightAlpha(form_, kFormHighlightAlpha);
2701 }
2702
2703 if (!doc_loader_.IsDocumentComplete()) {
2721 // Check if the first page is available. In a linearized PDF, that is not 2704 // Check if the first page is available. In a linearized PDF, that is not
2722 // always page 0. Doing this gives us the default page size, since when the 2705 // always page 0. Doing this gives us the default page size, since when the
2723 // document is available, the first page is available as well. 2706 // document is available, the first page is available as well.
2724 CheckPageAvailable(FPDFAvail_GetFirstPageNum(doc_), &pending_pages_); 2707 CheckPageAvailable(FPDFAvail_GetFirstPageNum(doc_), &pending_pages_);
2725 } 2708 }
2726 2709
2727 LoadPageInfo(false); 2710 LoadPageInfo(false);
2728 2711
2729 if (doc_loader_->IsDocumentComplete()) 2712 if (doc_loader_.IsDocumentComplete())
2730 FinishLoadingDocument(); 2713 FinishLoadingDocument();
2731 } 2714 }
2732 2715
2733 void PDFiumEngine::LoadPageInfo(bool reload) { 2716 void PDFiumEngine::LoadPageInfo(bool reload) {
2734 if (!doc_loader_)
2735 return;
2736 pending_pages_.clear(); 2717 pending_pages_.clear();
2737 pp::Size old_document_size = document_size_; 2718 pp::Size old_document_size = document_size_;
2738 document_size_ = pp::Size(); 2719 document_size_ = pp::Size();
2739 std::vector<pp::Rect> page_rects; 2720 std::vector<pp::Rect> page_rects;
2740 int page_count = FPDF_GetPageCount(doc_); 2721 int page_count = FPDF_GetPageCount(doc_);
2741 bool doc_complete = doc_loader_->IsDocumentComplete(); 2722 bool doc_complete = doc_loader_.IsDocumentComplete();
2742 bool is_linear = FPDFAvail_IsLinearized(fpdf_availability_) == PDF_LINEARIZED; 2723 bool is_linear = FPDFAvail_IsLinearized(fpdf_availability_) == PDF_LINEARIZED;
2743 for (int i = 0; i < page_count; ++i) { 2724 for (int i = 0; i < page_count; ++i) {
2744 if (i != 0) { 2725 if (i != 0) {
2745 // Add space for horizontal separator. 2726 // Add space for horizontal separator.
2746 document_size_.Enlarge(0, kPageSeparatorThickness); 2727 document_size_.Enlarge(0, kPageSeparatorThickness);
2747 } 2728 }
2748 2729
2749 // Get page availability. If |reload| == true, then the document has been 2730 // Get page availability. If |reload| == true, then the document has been
2750 // constructed already. Get page availability flag from already existing 2731 // constructed already. Get page availability flag from already existing
2751 // PDFiumPage class. 2732 // PDFiumPage class.
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
2788 pages_.push_back(base::MakeUnique<PDFiumPage>(this, i, page_rect, false)); 2769 pages_.push_back(base::MakeUnique<PDFiumPage>(this, i, page_rect, false));
2789 } 2770 }
2790 } 2771 }
2791 2772
2792 CalculateVisiblePages(); 2773 CalculateVisiblePages();
2793 if (document_size_ != old_document_size) 2774 if (document_size_ != old_document_size)
2794 client_->DocumentSizeUpdated(document_size_); 2775 client_->DocumentSizeUpdated(document_size_);
2795 } 2776 }
2796 2777
2797 void PDFiumEngine::CalculateVisiblePages() { 2778 void PDFiumEngine::CalculateVisiblePages() {
2798 if (!doc_loader_)
2799 return;
2800 // Clear pending requests queue, since it may contain requests to the pages 2779 // Clear pending requests queue, since it may contain requests to the pages
2801 // that are already invisible (after scrolling for example). 2780 // that are already invisible (after scrolling for example).
2802 pending_pages_.clear(); 2781 pending_pages_.clear();
2803 doc_loader_->ClearPendingRequests(); 2782 doc_loader_.ClearPendingRequests();
2804 2783
2805 visible_pages_.clear(); 2784 visible_pages_.clear();
2806 pp::Rect visible_rect(plugin_size_); 2785 pp::Rect visible_rect(plugin_size_);
2807 for (size_t i = 0; i < pages_.size(); ++i) { 2786 for (size_t i = 0; i < pages_.size(); ++i) {
2808 // Check an entire PageScreenRect, since we might need to repaint side 2787 // Check an entire PageScreenRect, since we might need to repaint side
2809 // borders and shadows even if the page itself is not visible. 2788 // borders and shadows even if the page itself is not visible.
2810 // For example, when user use pdf with different page sizes and zoomed in 2789 // For example, when user use pdf with different page sizes and zoomed in
2811 // outside page area. 2790 // outside page area.
2812 if (visible_rect.Intersects(GetPageScreenRect(i))) { 2791 if (visible_rect.Intersects(GetPageScreenRect(i))) {
2813 visible_pages_.push_back(i); 2792 visible_pages_.push_back(i);
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
2854 2833
2855 void PDFiumEngine::ScrollToPage(int page) { 2834 void PDFiumEngine::ScrollToPage(int page) {
2856 if (!PageIndexInBounds(page)) 2835 if (!PageIndexInBounds(page))
2857 return; 2836 return;
2858 2837
2859 in_flight_visible_page_ = page; 2838 in_flight_visible_page_ = page;
2860 client_->ScrollToPage(page); 2839 client_->ScrollToPage(page);
2861 } 2840 }
2862 2841
2863 bool PDFiumEngine::CheckPageAvailable(int index, std::vector<int>* pending) { 2842 bool PDFiumEngine::CheckPageAvailable(int index, std::vector<int>* pending) {
2864 if (!doc_) 2843 if (!doc_ || !form_)
2865 return false; 2844 return false;
2866 2845
2867 const int num_pages = static_cast<int>(pages_.size()); 2846 const int num_pages = static_cast<int>(pages_.size());
2868 if (index < num_pages && pages_[index]->available()) 2847 if (index < num_pages && pages_[index]->available())
2869 return true; 2848 return true;
2870 2849
2871 if (!FPDFAvail_IsPageAvail(fpdf_availability_, index, &download_hints_)) { 2850 if (!FPDFAvail_IsPageAvail(fpdf_availability_, index, &download_hints_)) {
2872 if (!base::ContainsValue(*pending, index)) 2851 if (!base::ContainsValue(*pending, index))
2873 pending->push_back(index); 2852 pending->push_back(index);
2874 return false; 2853 return false;
(...skipping 1284 matching lines...) Expand 10 before | Expand all | Expand 10 after
4159 FPDF_DOCUMENT doc = 4138 FPDF_DOCUMENT doc =
4160 FPDF_LoadMemDocument(pdf_buffer, pdf_buffer_size, nullptr); 4139 FPDF_LoadMemDocument(pdf_buffer, pdf_buffer_size, nullptr);
4161 if (!doc) 4140 if (!doc)
4162 return false; 4141 return false;
4163 bool success = FPDF_GetPageSizeByIndex(doc, page_number, width, height) != 0; 4142 bool success = FPDF_GetPageSizeByIndex(doc, page_number, width, height) != 0;
4164 FPDF_CloseDocument(doc); 4143 FPDF_CloseDocument(doc);
4165 return success; 4144 return success;
4166 } 4145 }
4167 4146
4168 } // namespace chrome_pdf 4147 } // namespace chrome_pdf
OLDNEW
« no previous file with comments | « pdf/pdfium/pdfium_engine.h ('k') | pdf/preview_mode_client.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698