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

Unified Diff: fpdfsdk/fpdf_dataavail_embeddertest.cpp

Issue 2483633002: Do not load main cross refs for first page in linearized pdf. (Closed)
Patch Set: Fix XFA pages availability.` Created 4 years, 1 month 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
Index: fpdfsdk/fpdf_dataavail_embeddertest.cpp
diff --git a/fpdfsdk/fpdf_dataavail_embeddertest.cpp b/fpdfsdk/fpdf_dataavail_embeddertest.cpp
index 47ba54bcdeb3891a76c9c29bbb9113b19308cc45..36627e8fdab73f717e32fe75da9cf86de2fe0634 100644
--- a/fpdfsdk/fpdf_dataavail_embeddertest.cpp
+++ b/fpdfsdk/fpdf_dataavail_embeddertest.cpp
@@ -45,13 +45,22 @@ class TestAsyncLoader : public FX_DOWNLOADHINTS, FX_FILEAVAIL {
return requested_segments_;
}
- void ClearRequestedSegments() { requested_segments_.clear(); }
+ size_t max_requested_bound() const { return max_requested_bound_; }
+
+ void ClearRequestedSegments() {
+ requested_segments_.clear();
+ max_requested_bound_ = 0;
+ }
bool is_new_data_available() const { return is_new_data_available_; }
void set_is_new_data_available(bool is_new_data_available) {
is_new_data_available_ = is_new_data_available;
}
+ size_t max_already_available_bound() const {
+ return available_ranges_.empty() ? 0 : available_ranges_.rbegin()->second;
+ }
+
private:
void SetDataAvailable(size_t start, size_t size) {
if (size == 0)
@@ -109,6 +118,7 @@ class TestAsyncLoader : public FX_DOWNLOADHINTS, FX_FILEAVAIL {
void AddSegmentImpl(size_t offset, size_t size) {
requested_segments_.push_back(std::make_pair(offset, size));
+ max_requested_bound_ = std::max(max_requested_bound_, offset + size);
}
bool IsDataAvailImpl(size_t offset, size_t size) {
@@ -143,6 +153,7 @@ class TestAsyncLoader : public FX_DOWNLOADHINTS, FX_FILEAVAIL {
std::unique_ptr<char, pdfium::FreeDeleter> file_contents_;
size_t file_length_;
std::vector<std::pair<size_t, size_t>> requested_segments_;
+ size_t max_requested_bound_ = 0;
bool is_new_data_available_ = true;
using Range = std::pair<size_t, size_t>;
@@ -185,3 +196,42 @@ TEST_F(FPDFDataAvailEmbeddertest, LoadUsingHintTables) {
EXPECT_TRUE(page);
UnloadPage(page);
}
+
+TEST_F(FPDFDataAvailEmbeddertest,
+ DoNotLoadMainCrossRefForFirstPageIfLinearized) {
+ TestAsyncLoader loader("feature_linearized_loading.pdf");
+ avail_ = FPDFAvail_Create(loader.file_avail(), loader.file_access());
+ ASSERT_EQ(PDF_DATA_AVAIL, FPDFAvail_IsDocAvail(avail_, loader.hints()));
+ document_ = FPDFAvail_GetDocument(avail_, nullptr);
+ ASSERT_TRUE(document_);
+ const int first_page_num = FPDFAvail_GetFirstPageNum(document_);
Lei Zhang 2016/11/09 08:51:12 Might as well check the result since we have it?
snake 2016/11/09 12:41:49 We always should have it. For this test is not mat
+
+ // The main cross ref table should not be processed.
+ // (It is always at file end)
+ EXPECT_GT(loader.file_access()->m_FileLen,
+ loader.max_already_available_bound());
+
+ // No new data available, to took the download request.
Lei Zhang 2016/11/09 08:51:12 "to took the download request" doesn't parse.
snake 2016/11/09 12:41:49 Done.
+ loader.set_is_new_data_available(false);
+ FPDFAvail_IsPageAvail(avail_, first_page_num, loader.hints());
Lei Zhang 2016/11/09 08:51:12 Do you care about the return value?
snake 2016/11/09 12:41:49 No. For first call this is not matter. (Currently
+
+ // The main cross ref table should not be requested.
+ // (It is always at file end)
+ EXPECT_GT(loader.file_access()->m_FileLen, loader.max_requested_bound());
+
+ // Allow parse page.
+ loader.set_is_new_data_available(true);
+ ASSERT_EQ(PDF_DATA_AVAIL,
+ FPDFAvail_IsPageAvail(avail_, first_page_num, loader.hints()));
+
+ // The main cross ref table should not be processed.
+ // (It is always at file end)
+ EXPECT_GT(loader.file_access()->m_FileLen,
+ loader.max_already_available_bound());
+
+ // Prevent loading data, while page loading.
+ loader.set_is_new_data_available(false);
+ FPDF_PAGE page = LoadPage(first_page_num);
+ EXPECT_TRUE(page);
+ UnloadPage(page);
+}
« core/fpdfapi/parser/cpdf_data_avail.cpp ('K') | « core/fpdfapi/parser/cpdf_parser.cpp ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698