Chromium Code Reviews| 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); |
| +} |