Index: pdf/pdfium/pdfium_engine.cc |
diff --git a/pdf/pdfium/pdfium_engine.cc b/pdf/pdfium/pdfium_engine.cc |
index 80b7d2d818b279f4f95c6f2af131d939d048ee7f..11c5afc32afedbad6b4cb46973d5290c735fa1da 100644 |
--- a/pdf/pdfium/pdfium_engine.cc |
+++ b/pdf/pdfium/pdfium_engine.cc |
@@ -17,6 +17,7 @@ |
#include "base/lazy_instance.h" |
#include "base/logging.h" |
#include "base/macros.h" |
+#include "base/memory/ptr_util.h" |
#include "base/numerics/safe_conversions.h" |
#include "base/stl_util.h" |
#include "base/strings/string_number_conversions.h" |
@@ -30,6 +31,7 @@ |
#include "pdf/pdfium/pdfium_api_string_buffer_adapter.h" |
#include "pdf/pdfium/pdfium_mem_buffer_file_read.h" |
#include "pdf/pdfium/pdfium_mem_buffer_file_write.h" |
+#include "pdf/url_loader_wrapper_impl.h" |
#include "ppapi/c/pp_errors.h" |
#include "ppapi/c/pp_input_event.h" |
#include "ppapi/c/ppb_core.h" |
@@ -537,7 +539,6 @@ PDFiumEngine::PDFiumEngine(PDFEngine::Client* client) |
: client_(client), |
current_zoom_(1.0), |
current_rotation_(0), |
- doc_loader_(this), |
password_tries_remaining_(0), |
doc_(nullptr), |
form_(nullptr), |
@@ -564,15 +565,15 @@ PDFiumEngine::PDFiumEngine(PDFEngine::Client* client) |
file_access_.m_FileLen = 0; |
file_access_.m_GetBlock = &GetBlock; |
- file_access_.m_Param = &doc_loader_; |
+ file_access_.m_Param = this; |
file_availability_.version = 1; |
file_availability_.IsDataAvail = &IsDataAvail; |
- file_availability_.loader = &doc_loader_; |
+ file_availability_.engine = this; |
download_hints_.version = 1; |
download_hints_.AddSegment = &AddSegment; |
- download_hints_.loader = &doc_loader_; |
+ download_hints_.engine = this; |
// Initialize FPDF_FORMFILLINFO member variables. Deriving from this struct |
// allows the static callbacks to be able to cast the FPDF_FORMFILLINFO in |
@@ -844,22 +845,22 @@ int PDFiumEngine::Form_GetLanguage(FPDF_FORMFILLINFO* param, |
int PDFiumEngine::GetBlock(void* param, unsigned long position, |
unsigned char* buffer, unsigned long size) { |
- DocumentLoader* loader = static_cast<DocumentLoader*>(param); |
- return loader->GetBlock(position, size, buffer); |
+ PDFiumEngine* engine = static_cast<PDFiumEngine*>(param); |
+ return engine->doc_loader_->GetBlock(position, size, buffer); |
} |
FPDF_BOOL PDFiumEngine::IsDataAvail(FX_FILEAVAIL* param, |
size_t offset, size_t size) { |
PDFiumEngine::FileAvail* file_avail = |
static_cast<PDFiumEngine::FileAvail*>(param); |
- return file_avail->loader->IsDataAvailable(offset, size); |
+ return file_avail->engine->doc_loader_->IsDataAvailable(offset, size); |
} |
void PDFiumEngine::AddSegment(FX_DOWNLOADHINTS* param, |
size_t offset, size_t size) { |
PDFiumEngine::DownloadHints* download_hints = |
static_cast<PDFiumEngine::DownloadHints*>(param); |
- return download_hints->loader->RequestData(offset, size); |
+ return download_hints->engine->doc_loader_->RequestData(offset, size); |
} |
bool PDFiumEngine::New(const char* url, |
@@ -994,15 +995,27 @@ void PDFiumEngine::PostPaint() { |
bool PDFiumEngine::HandleDocumentLoad(const pp::URLLoader& loader) { |
password_tries_remaining_ = kMaxPasswordTries; |
- return doc_loader_.Init(loader, url_, headers_); |
+ process_when_pending_request_complete_ = true; |
+ auto loader_wrapper = |
+ base::MakeUnique<URLLoaderWrapperImpl>(GetPluginInstance(), loader); |
+ loader_wrapper->SetResponseHeaders(headers_); |
+ |
+ doc_loader_ = base::MakeUnique<DocumentLoader>(this); |
+ if (doc_loader_->Init(std::move(loader_wrapper), url_)) { |
+ // request initial data. |
+ doc_loader_->RequestData(0, 1); |
+ return true; |
+ } |
+ return false; |
} |
pp::Instance* PDFiumEngine::GetPluginInstance() { |
return client_->GetPluginInstance(); |
} |
-pp::URLLoader PDFiumEngine::CreateURLLoader() { |
- return client_->CreateURLLoader(); |
+std::unique_ptr<URLLoaderWrapper> PDFiumEngine::CreateURLLoader() { |
+ return base::MakeUnique<URLLoaderWrapperImpl>(GetPluginInstance(), |
+ client_->CreateURLLoader()); |
} |
void PDFiumEngine::AppendPage(PDFEngine* engine, int index) { |
@@ -1027,35 +1040,32 @@ void PDFiumEngine::SetScrollPosition(const pp::Point& position) { |
} |
#endif |
-bool PDFiumEngine::IsProgressiveLoad() { |
- return doc_loader_.is_partial_document(); |
-} |
- |
std::string PDFiumEngine::GetMetadata(const std::string& key) { |
return GetDocumentMetadata(doc(), key); |
} |
-void PDFiumEngine::OnPartialDocumentLoaded() { |
- file_access_.m_FileLen = doc_loader_.document_size(); |
+void PDFiumEngine::OnPendingRequestComplete() { |
+ if (!process_when_pending_request_complete_) |
+ return; |
if (!fpdf_availability_) { |
+ file_access_.m_FileLen = doc_loader_->GetDocumentSize(); |
fpdf_availability_ = FPDFAvail_Create(&file_availability_, &file_access_); |
DCHECK(fpdf_availability_); |
+ // Currently engine does not deal efficiently with some non-linearized |
+ // files. |
+ // See http://code.google.com/p/chromium/issues/detail?id=59400 |
+ // To improve user experience we download entire file for non-linearized |
+ // PDF. |
+ if (FPDFAvail_IsLinearized(fpdf_availability_) != PDF_LINEARIZED) { |
+ // Wait complete document. |
+ process_when_pending_request_complete_ = false; |
+ FPDFAvail_Destroy(fpdf_availability_); |
+ fpdf_availability_ = nullptr; |
+ return; |
+ } |
} |
- // Currently engine does not deal efficiently with some non-linearized files. |
- // See http://code.google.com/p/chromium/issues/detail?id=59400 |
- // To improve user experience we download entire file for non-linearized PDF. |
- if (!FPDFAvail_IsLinearized(fpdf_availability_)) { |
- doc_loader_.RequestData(0, doc_loader_.document_size()); |
- return; |
- } |
- |
- LoadDocument(); |
-} |
- |
-void PDFiumEngine::OnPendingRequestComplete() { |
- if (!doc_ || !form_) { |
- DCHECK(fpdf_availability_); |
+ if (!doc_) { |
LoadDocument(); |
return; |
} |
@@ -1077,26 +1087,51 @@ void PDFiumEngine::OnPendingRequestComplete() { |
} |
void PDFiumEngine::OnNewDataAvailable() { |
- client_->DocumentLoadProgress(doc_loader_.GetAvailableData(), |
- doc_loader_.document_size()); |
+ const float progress = doc_loader_->GetProgress(); |
+ if (progress < 0.001) { |
+ client_->DocumentLoadProgress(0, 0); |
+ } else { |
+ client_->DocumentLoadProgress(progress * 10000, 10000); |
+ } |
} |
void PDFiumEngine::OnDocumentComplete() { |
- if (!doc_ || !form_) { |
- file_access_.m_FileLen = doc_loader_.document_size(); |
- if (!fpdf_availability_) { |
- fpdf_availability_ = FPDFAvail_Create(&file_availability_, &file_access_); |
- DCHECK(fpdf_availability_); |
- } |
- LoadDocument(); |
- return; |
+ if (doc_) { |
+ return FinishLoadingDocument(); |
+ } |
+ file_access_.m_FileLen = doc_loader_->GetDocumentSize(); |
+ if (!fpdf_availability_) { |
+ fpdf_availability_ = FPDFAvail_Create(&file_availability_, &file_access_); |
+ DCHECK(fpdf_availability_); |
} |
+ LoadDocument(); |
+} |
- FinishLoadingDocument(); |
+void PDFiumEngine::OnDocumentCanceled() { |
+ OnDocumentComplete(); |
+} |
+ |
+void PDFiumEngine::CancelBrowserDownload() { |
+ client_->CancelBrowserDownload(); |
} |
void PDFiumEngine::FinishLoadingDocument() { |
- DCHECK(doc_loader_.IsDocumentComplete() && doc_); |
+ DCHECK(doc_loader_->IsDocumentComplete() && doc_); |
+ |
+ if (!form_) { |
+ int form_status = |
+ FPDFAvail_IsFormAvail(fpdf_availability_, &download_hints_); |
+ if (form_status != PDF_FORM_NOTAVAIL) { |
+ form_ = FPDFDOC_InitFormFillEnvironment( |
+ doc_, static_cast<FPDF_FORMFILLINFO*>(this)); |
+#if defined(PDF_ENABLE_XFA) |
+ FPDF_LoadXFA(doc_); |
+#endif |
+ |
+ FPDF_SetFormFieldHighlightColor(form_, 0, kFormHighlightColor); |
+ FPDF_SetFormFieldHighlightAlpha(form_, kFormHighlightAlpha); |
+ } |
+ } |
bool need_update = false; |
for (size_t i = 0; i < pages_.size(); ++i) { |
@@ -1308,7 +1343,7 @@ pp::Buffer_Dev PDFiumEngine::PrintPagesAsRasterPDF( |
return pp::Buffer_Dev(); |
// If document is not downloaded yet, disable printing. |
- if (doc_ && !doc_loader_.IsDocumentComplete()) |
+ if (doc_ && !doc_loader_->IsDocumentComplete()) |
return pp::Buffer_Dev(); |
FPDF_DOCUMENT output_doc = FPDF_CreateNewDocument(); |
@@ -2453,7 +2488,7 @@ void PDFiumEngine::AppendBlankPages(int num_pages) { |
void PDFiumEngine::LoadDocument() { |
// Check if the document is ready for loading. If it isn't just bail for now, |
// we will call LoadDocument() again later. |
- if (!doc_ && !doc_loader_.IsDocumentComplete() && |
+ if (!doc_ && !doc_loader_->IsDocumentComplete() && |
!FPDFAvail_IsDocAvail(fpdf_availability_, &download_hints_)) { |
return; |
} |
@@ -2492,7 +2527,7 @@ bool PDFiumEngine::TryLoadingDoc(const std::string& password, |
password_cstr = password.c_str(); |
password_tries_remaining_--; |
} |
- if (doc_loader_.IsDocumentComplete() && |
+ if (doc_loader_->IsDocumentComplete() && |
!FPDFAvail_IsLinearized(fpdf_availability_)) { |
doc_ = FPDF_LoadCustomDocument(&file_access_, password_cstr); |
} else { |
@@ -2550,26 +2585,7 @@ void PDFiumEngine::ContinueLoadingDocument(const std::string& password) { |
permissions_ = FPDF_GetDocPermissions(doc_); |
permissions_handler_revision_ = FPDF_GetSecurityHandlerRevision(doc_); |
- if (!form_) { |
- int form_status = |
- FPDFAvail_IsFormAvail(fpdf_availability_, &download_hints_); |
- bool doc_complete = doc_loader_.IsDocumentComplete(); |
- // Try again if the data is not available and the document hasn't finished |
- // downloading. |
- if (form_status == PDF_FORM_NOTAVAIL && !doc_complete) |
- return; |
- |
- form_ = FPDFDOC_InitFormFillEnvironment( |
- doc_, static_cast<FPDF_FORMFILLINFO*>(this)); |
-#if defined(PDF_ENABLE_XFA) |
- FPDF_LoadXFA(doc_); |
-#endif |
- |
- FPDF_SetFormFieldHighlightColor(form_, 0, kFormHighlightColor); |
- FPDF_SetFormFieldHighlightAlpha(form_, kFormHighlightAlpha); |
- } |
- |
- if (!doc_loader_.IsDocumentComplete()) { |
+ if (!doc_loader_->IsDocumentComplete()) { |
// Check if the first page is available. In a linearized PDF, that is not |
// always page 0. Doing this gives us the default page size, since when the |
// document is available, the first page is available as well. |
@@ -2578,7 +2594,7 @@ void PDFiumEngine::ContinueLoadingDocument(const std::string& password) { |
LoadPageInfo(false); |
- if (doc_loader_.IsDocumentComplete()) |
+ if (doc_loader_->IsDocumentComplete()) |
FinishLoadingDocument(); |
} |
@@ -2588,7 +2604,7 @@ void PDFiumEngine::LoadPageInfo(bool reload) { |
document_size_ = pp::Size(); |
std::vector<pp::Rect> page_rects; |
int page_count = FPDF_GetPageCount(doc_); |
- bool doc_complete = doc_loader_.IsDocumentComplete(); |
+ bool doc_complete = doc_loader_->IsDocumentComplete(); |
bool is_linear = FPDFAvail_IsLinearized(fpdf_availability_) == PDF_LINEARIZED; |
for (int i = 0; i < page_count; ++i) { |
if (i != 0) { |
@@ -2645,10 +2661,12 @@ void PDFiumEngine::LoadPageInfo(bool reload) { |
} |
void PDFiumEngine::CalculateVisiblePages() { |
+ if (!doc_loader_) |
+ return; |
// Clear pending requests queue, since it may contain requests to the pages |
// that are already invisible (after scrolling for example). |
pending_pages_.clear(); |
- doc_loader_.ClearPendingRequests(); |
+ doc_loader_->ClearPendingRequests(); |
visible_pages_.clear(); |
pp::Rect visible_rect(plugin_size_); |
@@ -2709,7 +2727,7 @@ void PDFiumEngine::ScrollToPage(int page) { |
} |
bool PDFiumEngine::CheckPageAvailable(int index, std::vector<int>* pending) { |
- if (!doc_ || !form_) |
+ if (!doc_) |
return false; |
const int num_pages = static_cast<int>(pages_.size()); |