1 // Copyright 2016 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #include "pdf/document_loader_impl.h"
12 #include "base/logging.h"
13 #include "pdf/url_loader_wrapper.h"
14 #include "testing/gmock/include/gmock/gmock.h"
15 #include "testing/gtest/include/gtest/gtest.h"
16 #include "ui/gfx/range/range.h"
19 using ::testing::Mock;
20 using ::testing::Sequence;
21 using ::testing::NiceMock;
22 using ::testing::Return;
24 namespace chrome_pdf {
28 constexpr uint32_t kDefaultRequestSize =
29 DocumentLoaderImpl::kDefaultRequestSize;
31 class TestURLLoader : public URLLoaderWrapper {
35 LoaderData() = default;
37 // We should call callbacks to prevent memory leaks.
38 // The callbacks don't do anything, because the objects that created the
39 // callbacks have been destroyed.
46 int content_length() const { return content_length_; }
47 void set_content_length(int content_length) {
48 content_length_ = content_length;
50 bool accept_ranges_bytes() const { return accept_ranges_bytes_; }
51 void set_accept_ranges_bytes(bool accept_ranges_bytes) {
52 accept_ranges_bytes_ = accept_ranges_bytes;
54 bool content_encoded() const { return content_encoded_; }
55 void set_content_encoded(bool content_encoded) {
56 content_encoded_ = content_encoded;
58 const std::string& content_type() const { return content_type_; }
59 void set_content_type(const std::string& content_type) {
60 content_type_ = content_type;
62 const std::string& content_disposition() const {
63 return content_disposition_;
65 void set_content_disposition(const std::string& content_disposition) {
66 content_disposition_ = content_disposition;
68 const std::string& multipart_boundary() const {
69 return multipart_boundary_;
71 void set_multipart_boundary(const std::string& multipart_boundary) {
72 multipart_boundary_ = multipart_boundary;
74 const gfx::Range& byte_range() const { return byte_range_; }
75 void set_byte_range(const gfx::Range& byte_range) {
76 byte_range_ = byte_range;
78 bool is_multipart() const { return is_multipart_; }
79 void set_is_multipart(bool is_multipart) { is_multipart_ = is_multipart; }
80 int status_code() const { return status_code_; }
81 void set_status_code(int status_code) { status_code_ = status_code; }
82 bool closed() const { return closed_; }
83 void set_closed(bool closed) { closed_ = closed; }
84 const gfx::Range& open_byte_range() const { return open_byte_range_; }
85 void set_open_byte_range(const gfx::Range& open_byte_range) {
86 open_byte_range_ = open_byte_range;
89 bool IsWaitRead() const { return !did_read_callback_.IsOptional(); }
90 bool IsWaitOpen() const { return !did_open_callback_.IsOptional(); }
91 char* buffer() const { return buffer_; }
92 int buffer_size() const { return buffer_size_; }
94 void SetReadCallback(const pp::CompletionCallback& read_callback,
97 did_read_callback_ = read_callback;
99 buffer_size_ = buffer_size;
102 void SetOpenCallback(const pp::CompletionCallback& open_callback,
103 gfx::Range req_byte_range) {
104 did_open_callback_ = open_callback;
105 set_open_byte_range(req_byte_range);
108 void CallOpenCallback(int result) {
109 DCHECK(IsWaitOpen());
110 did_open_callback_.RunAndClear(result);
113 void CallReadCallback(int result) {
114 DCHECK(IsWaitRead());
115 did_read_callback_.RunAndClear(result);
119 pp::CompletionCallback did_open_callback_;
120 pp::CompletionCallback did_read_callback_;
121 char* buffer_ = nullptr;
122 int buffer_size_ = 0;
124 int content_length_ = -1;
125 bool accept_ranges_bytes_ = false;
126 bool content_encoded_ = false;
127 std::string content_type_;
128 std::string content_disposition_;
129 std::string multipart_boundary_;
130 gfx::Range byte_range_ = gfx::Range::InvalidRange();
131 bool is_multipart_ = false;
132 int status_code_ = 0;
134 gfx::Range open_byte_range_ = gfx::Range::InvalidRange();
136 DISALLOW_COPY_AND_ASSIGN(LoaderData);
139 explicit TestURLLoader(LoaderData* data) : data_(data) {
140 data_->set_closed(false);
143 ~TestURLLoader() override { Close(); }
145 int GetContentLength() const override { return data_->content_length(); }
147 bool IsAcceptRangesBytes() const override {
148 return data_->accept_ranges_bytes();
151 bool IsContentEncoded() const override { return data_->content_encoded(); }
153 std::string GetContentType() const override { return data_->content_type(); }
155 std::string GetContentDisposition() const override {
156 return data_->content_disposition();
159 int GetStatusCode() const override { return data_->status_code(); }
161 bool IsMultipart() const override { return data_->is_multipart(); }
163 bool GetByteRangeStart(int* start) const override {
164 *start = data_->byte_range().start();
165 return data_->byte_range().IsValid();
168 void Close() override { data_->set_closed(true); }
170 void OpenRange(const std::string& url,
171 const std::string& referrer_url,
174 const pp::CompletionCallback& cc) override {
175 data_->SetOpenCallback(cc, gfx::Range(position, position + size));
178 void ReadResponseBody(char* buffer,
180 const pp::CompletionCallback& cc) override {
181 data_->SetReadCallback(cc, buffer, buffer_size);
184 bool GetDownloadProgress(int64_t* bytes_received,
185 int64_t* total_bytes_to_be_received) const override {
192 DISALLOW_COPY_AND_ASSIGN(TestURLLoader);
195 class TestClient : public DocumentLoader::Client {
197 TestClient() { full_page_loader_data()->set_content_type("application/pdf"); }
198 ~TestClient() override = default;
200 // DocumentLoader::Client overrides:
201 pp::Instance* GetPluginInstance() override { return nullptr; }
202 std::unique_ptr<URLLoaderWrapper> CreateURLLoader() override {
203 return std::unique_ptr<URLLoaderWrapper>(
204 new TestURLLoader(partial_loader_data()));
206 void OnPendingRequestComplete() override {}
207 void OnNewDataReceived() override {}
208 void OnDocumentComplete() override {}
209 void OnDocumentCanceled() override {}
210 void CancelBrowserDownload() override {}
212 std::unique_ptr<URLLoaderWrapper> CreateFullPageLoader() {
213 return std::unique_ptr<URLLoaderWrapper>(
214 new TestURLLoader(full_page_loader_data()));
217 TestURLLoader::LoaderData* full_page_loader_data() {
218 return &full_page_loader_data_;
220 TestURLLoader::LoaderData* partial_loader_data() {
221 return &partial_loader_data_;
224 void SetCanUsePartialLoading() {
225 full_page_loader_data()->set_content_length(10 * 1024 * 1024);
226 full_page_loader_data()->set_content_encoded(false);
227 full_page_loader_data()->set_accept_ranges_bytes(true);
230 void SendAllPartialData() {
231 partial_loader_data_.set_byte_range(partial_loader_data_.open_byte_range());
232 partial_loader_data_.CallOpenCallback(0);
233 uint32_t length = partial_loader_data_.byte_range().length();
235 constexpr uint32_t max_part_len = kDefaultRequestSize;
236 const uint32_t part_len = std::min(length, max_part_len);
237 partial_loader_data_.CallReadCallback(part_len);
240 if (partial_loader_data_.IsWaitRead()) {
241 partial_loader_data_.CallReadCallback(0);
246 TestURLLoader::LoaderData full_page_loader_data_;
247 TestURLLoader::LoaderData partial_loader_data_;
249 DISALLOW_COPY_AND_ASSIGN(TestClient);
252 class MockClient : public TestClient {
254 MockClient() = default;
256 MOCK_METHOD0(OnPendingRequestComplete, void());
257 MOCK_METHOD0(OnNewDataReceived, void());
258 MOCK_METHOD0(OnDocumentComplete, void());
259 MOCK_METHOD0(OnDocumentCanceled, void());
262 DISALLOW_COPY_AND_ASSIGN(MockClient);
267 using DocumentLoaderImplTest = ::testing::Test;
269 TEST_F(DocumentLoaderImplTest, PartialLoadingEnabled) {
271 client.SetCanUsePartialLoading();
272 DocumentLoaderImpl loader(&client);
273 loader.Init(client.CreateFullPageLoader(), "http://url.com");
274 loader.RequestData(1000000, 1);
275 EXPECT_FALSE(loader.is_partial_loader_active());
276 // Always send initial data from FullPageLoader.
277 client.full_page_loader_data()->CallReadCallback(kDefaultRequestSize);
278 EXPECT_TRUE(loader.is_partial_loader_active());
281 TEST_F(DocumentLoaderImplTest, PartialLoadingDisabledOnSmallFiles) {
283 client.SetCanUsePartialLoading();
284 client.full_page_loader_data()->set_content_length(kDefaultRequestSize * 2);
285 DocumentLoaderImpl loader(&client);
286 loader.Init(client.CreateFullPageLoader(), "http://url.com");
287 loader.RequestData(1000000, 1);
288 EXPECT_FALSE(loader.is_partial_loader_active());
289 // Always send initial data from FullPageLoader.
290 client.full_page_loader_data()->CallReadCallback(kDefaultRequestSize);
291 EXPECT_FALSE(loader.is_partial_loader_active());
294 TEST_F(DocumentLoaderImplTest, PartialLoadingDisabledIfContentEncoded) {
296 client.SetCanUsePartialLoading();
297 client.full_page_loader_data()->set_content_encoded(true);
298 DocumentLoaderImpl loader(&client);
299 loader.Init(client.CreateFullPageLoader(), "http://url.com");
300 loader.RequestData(1000000, 1);
301 EXPECT_FALSE(loader.is_partial_loader_active());
302 // Always send initial data from FullPageLoader.
303 client.full_page_loader_data()->CallReadCallback(kDefaultRequestSize);
304 EXPECT_FALSE(loader.is_partial_loader_active());
307 TEST_F(DocumentLoaderImplTest, PartialLoadingDisabledNoAcceptRangeBytes) {
309 client.SetCanUsePartialLoading();
310 client.full_page_loader_data()->set_accept_ranges_bytes(false);
311 DocumentLoaderImpl loader(&client);
312 loader.Init(client.CreateFullPageLoader(), "http://url.com");
313 loader.RequestData(1000000, 1);
314 EXPECT_FALSE(loader.is_partial_loader_active());
315 // Always send initial data from FullPageLoader.
316 client.full_page_loader_data()->CallReadCallback(kDefaultRequestSize);
317 EXPECT_FALSE(loader.is_partial_loader_active());
320 TEST_F(DocumentLoaderImplTest, PartialLoadingReallyDisabledRequestFromBegin) {
322 DocumentLoaderImpl loader(&client);
323 client.SetCanUsePartialLoading();
324 loader.SetPartialLoadingEnabled(false);
325 loader.Init(client.CreateFullPageLoader(), "http://url.com");
326 // We should not start partial loading if requested data is beside full page
328 loader.RequestData(kDefaultRequestSize, 1);
329 EXPECT_FALSE(loader.is_partial_loader_active());
330 // Always send initial data from FullPageLoader.
331 client.full_page_loader_data()->CallReadCallback(kDefaultRequestSize);
332 EXPECT_FALSE(loader.is_partial_loader_active());
335 TEST_F(DocumentLoaderImplTest, PartialLoadingReallyDisabledRequestFromMiddle) {
337 client.SetCanUsePartialLoading();
338 DocumentLoaderImpl loader(&client);
339 loader.SetPartialLoadingEnabled(false);
340 loader.Init(client.CreateFullPageLoader(), "http://url.com");
341 loader.RequestData(1000000, 1);
342 EXPECT_FALSE(loader.is_partial_loader_active());
343 // Always send initial data from FullPageLoader.
344 client.full_page_loader_data()->CallReadCallback(kDefaultRequestSize);
345 EXPECT_FALSE(loader.is_partial_loader_active());
348 TEST_F(DocumentLoaderImplTest, PartialLoadingSimple) {
350 client.SetCanUsePartialLoading();
352 DocumentLoaderImpl loader(&client);
353 loader.Init(client.CreateFullPageLoader(), "http://url.com");
355 // While we have no requests, we should not start partial loading.
356 EXPECT_FALSE(loader.is_partial_loader_active());
358 loader.RequestData(5000000, 1);
360 EXPECT_FALSE(client.partial_loader_data()->IsWaitOpen());
361 EXPECT_FALSE(loader.is_partial_loader_active());
363 // Always send initial data from FullPageLoader.
364 client.full_page_loader_data()->CallReadCallback(kDefaultRequestSize);
366 // Partial loader should request headers.
367 EXPECT_TRUE(client.partial_loader_data()->IsWaitOpen());
368 EXPECT_TRUE(loader.is_partial_loader_active());
369 // Loader should be stopped.
370 EXPECT_TRUE(client.full_page_loader_data()->closed());
372 EXPECT_EQ("{4980736,10485760}",
373 client.partial_loader_data()->open_byte_range().ToString());
376 TEST_F(DocumentLoaderImplTest, PartialLoadingBackOrder) {
378 client.SetCanUsePartialLoading();
380 DocumentLoaderImpl loader(&client);
381 loader.Init(client.CreateFullPageLoader(), "http://url.com");
383 // While we have no requests, we should not start partial loading.
384 EXPECT_FALSE(loader.is_partial_loader_active());
386 loader.RequestData(client.full_page_loader_data()->content_length() - 1, 1);
388 EXPECT_FALSE(client.partial_loader_data()->IsWaitOpen());
389 EXPECT_FALSE(loader.is_partial_loader_active());
391 // Always send initial data from FullPageLoader.
392 client.full_page_loader_data()->CallReadCallback(kDefaultRequestSize);
394 // Partial loader should request headers.
395 EXPECT_TRUE(client.partial_loader_data()->IsWaitOpen());
396 EXPECT_TRUE(loader.is_partial_loader_active());
397 // Loader should be stopped.
398 EXPECT_TRUE(client.full_page_loader_data()->closed());
400 // Requested range should be enlarged.
401 EXPECT_GT(client.partial_loader_data()->open_byte_range().length(), 1u);
402 EXPECT_EQ("{9830400,10485760}",
403 client.partial_loader_data()->open_byte_range().ToString());
406 TEST_F(DocumentLoaderImplTest, CompleteWithoutPartial) {
408 client.SetCanUsePartialLoading();
409 DocumentLoaderImpl loader(&client);
410 loader.Init(client.CreateFullPageLoader(), "http://url.com");
411 EXPECT_FALSE(client.full_page_loader_data()->closed());
412 while (client.full_page_loader_data()->IsWaitRead()) {
413 client.full_page_loader_data()->CallReadCallback(1000);
415 EXPECT_TRUE(loader.IsDocumentComplete());
416 EXPECT_TRUE(client.full_page_loader_data()->closed());
419 TEST_F(DocumentLoaderImplTest, ErrorDownloadFullDocument) {
421 client.SetCanUsePartialLoading();
422 DocumentLoaderImpl loader(&client);
423 loader.Init(client.CreateFullPageLoader(), "http://url.com");
424 EXPECT_TRUE(client.full_page_loader_data()->IsWaitRead());
425 EXPECT_FALSE(client.full_page_loader_data()->closed());
426 client.full_page_loader_data()->CallReadCallback(-3);
427 EXPECT_TRUE(client.full_page_loader_data()->closed());
428 EXPECT_FALSE(loader.IsDocumentComplete());
431 TEST_F(DocumentLoaderImplTest, CompleteNoContentLength) {
433 DocumentLoaderImpl loader(&client);
434 loader.Init(client.CreateFullPageLoader(), "http://url.com");
435 EXPECT_FALSE(client.full_page_loader_data()->closed());
436 for (int i = 0; i < 10; ++i) {
437 EXPECT_TRUE(client.full_page_loader_data()->IsWaitRead());
438 client.full_page_loader_data()->CallReadCallback(1000);
440 EXPECT_TRUE(client.full_page_loader_data()->IsWaitRead());
441 client.full_page_loader_data()->CallReadCallback(0);
442 EXPECT_EQ(10000ul, loader.GetDocumentSize());
443 EXPECT_TRUE(loader.IsDocumentComplete());
444 EXPECT_TRUE(client.full_page_loader_data()->closed());
447 TEST_F(DocumentLoaderImplTest, CompleteWithPartial) {
449 client.SetCanUsePartialLoading();
450 client.full_page_loader_data()->set_content_length(kDefaultRequestSize * 20);
451 DocumentLoaderImpl loader(&client);
452 loader.Init(client.CreateFullPageLoader(), "http://url.com");
453 loader.RequestData(19 * kDefaultRequestSize, kDefaultRequestSize);
454 EXPECT_FALSE(client.full_page_loader_data()->closed());
455 EXPECT_FALSE(client.partial_loader_data()->IsWaitRead());
456 EXPECT_FALSE(client.partial_loader_data()->IsWaitOpen());
458 // Always send initial data from FullPageLoader.
459 client.full_page_loader_data()->CallReadCallback(kDefaultRequestSize);
460 EXPECT_TRUE(client.full_page_loader_data()->closed());
461 EXPECT_FALSE(client.partial_loader_data()->closed());
463 client.SendAllPartialData();
464 // Now we should send other document data.
465 client.SendAllPartialData();
466 EXPECT_TRUE(client.full_page_loader_data()->closed());
467 EXPECT_TRUE(client.partial_loader_data()->closed());
470 TEST_F(DocumentLoaderImplTest, PartialRequestLastChunk) {
471 constexpr uint32_t kLastChunkSize = 300;
473 client.SetCanUsePartialLoading();
474 client.full_page_loader_data()->set_content_length(kDefaultRequestSize * 20 +
476 DocumentLoaderImpl loader(&client);
477 loader.Init(client.CreateFullPageLoader(), "http://url.com");
478 loader.RequestData(20 * kDefaultRequestSize, 1);
480 // Always send initial data from FullPageLoader.
481 client.full_page_loader_data()->CallReadCallback(kDefaultRequestSize);
483 EXPECT_TRUE(client.partial_loader_data()->IsWaitOpen());
485 static_cast<int>(client.partial_loader_data()->open_byte_range().end()),
486 client.full_page_loader_data()->content_length());
487 client.partial_loader_data()->set_byte_range(
488 client.partial_loader_data()->open_byte_range());
489 client.partial_loader_data()->CallOpenCallback(0);
490 uint32_t data_length = client.partial_loader_data()->byte_range().length();
491 while (data_length > kDefaultRequestSize) {
492 client.partial_loader_data()->CallReadCallback(kDefaultRequestSize);
493 data_length -= kDefaultRequestSize;
495 EXPECT_EQ(kLastChunkSize, data_length);
496 client.partial_loader_data()->CallReadCallback(kLastChunkSize);
497 EXPECT_TRUE(loader.IsDataAvailable(kDefaultRequestSize * 20, kLastChunkSize));
500 TEST_F(DocumentLoaderImplTest, DocumentSize) {
502 client.SetCanUsePartialLoading();
503 client.full_page_loader_data()->set_content_length(123456789);
504 DocumentLoaderImpl loader(&client);
505 loader.Init(client.CreateFullPageLoader(), "http://url.com");
506 EXPECT_EQ(static_cast<int>(loader.GetDocumentSize()),
507 client.full_page_loader_data()->content_length());
510 TEST_F(DocumentLoaderImplTest, DocumentSizeNoContentLength) {
512 DocumentLoaderImpl loader(&client);
513 loader.Init(client.CreateFullPageLoader(), "http://url.com");
514 EXPECT_EQ(0ul, loader.GetDocumentSize());
515 client.full_page_loader_data()->CallReadCallback(kDefaultRequestSize);
516 client.full_page_loader_data()->CallReadCallback(1000);
517 client.full_page_loader_data()->CallReadCallback(500);
518 client.full_page_loader_data()->CallReadCallback(0);
519 EXPECT_EQ(kDefaultRequestSize + 1000ul + 500ul, loader.GetDocumentSize());
520 EXPECT_TRUE(loader.IsDocumentComplete());
523 TEST_F(DocumentLoaderImplTest, ClearPendingRequests) {
525 client.SetCanUsePartialLoading();
526 client.full_page_loader_data()->set_content_length(kDefaultRequestSize * 100 +
528 DocumentLoaderImpl loader(&client);
529 loader.Init(client.CreateFullPageLoader(), "http://url.com");
530 loader.RequestData(17 * kDefaultRequestSize + 100, 10);
531 loader.ClearPendingRequests();
532 loader.RequestData(15 * kDefaultRequestSize + 200, 20);
533 // pending requests are accumulating, and will be processed after initial data
535 EXPECT_FALSE(client.partial_loader_data()->IsWaitOpen());
537 // Send initial data from FullPageLoader.
538 client.full_page_loader_data()->CallReadCallback(kDefaultRequestSize);
541 EXPECT_TRUE(client.partial_loader_data()->IsWaitOpen());
542 constexpr gfx::Range range_requested(15 * kDefaultRequestSize,
543 16 * kDefaultRequestSize);
544 EXPECT_EQ(range_requested.start(),
545 client.partial_loader_data()->open_byte_range().start());
546 EXPECT_LE(range_requested.end(),
547 client.partial_loader_data()->open_byte_range().end());
548 client.partial_loader_data()->set_byte_range(
549 client.partial_loader_data()->open_byte_range());
551 // clear requests before Open callback.
552 loader.ClearPendingRequests();
553 // Current request should continue loading.
554 EXPECT_TRUE(client.partial_loader_data()->IsWaitOpen());
555 client.partial_loader_data()->CallOpenCallback(0);
556 client.partial_loader_data()->CallReadCallback(kDefaultRequestSize);
557 EXPECT_FALSE(client.partial_loader_data()->closed());
558 // Current request should continue loading, because no other request queued.
560 loader.RequestData(18 * kDefaultRequestSize + 200, 20);
561 // Requests queue is processed only on receiving data.
562 client.partial_loader_data()->CallReadCallback(kDefaultRequestSize);
563 // New request within close distance from the one currently loading. Loading
565 EXPECT_FALSE(client.partial_loader_data()->IsWaitOpen());
567 loader.ClearPendingRequests();
568 // request again two.
569 loader.RequestData(60 * kDefaultRequestSize + 100, 10);
570 loader.RequestData(35 * kDefaultRequestSize + 200, 20);
571 // Requests queue is processed only on receiving data.
572 client.partial_loader_data()->CallReadCallback(kDefaultRequestSize);
574 // new requset not with in close distance from current loading.
575 // Loading should be restarted.
576 EXPECT_TRUE(client.partial_loader_data()->IsWaitOpen());
577 // The first requested chunk should be processed.
578 constexpr gfx::Range range_requested(35 * kDefaultRequestSize,
579 36 * kDefaultRequestSize);
580 EXPECT_EQ(range_requested.start(),
581 client.partial_loader_data()->open_byte_range().start());
582 EXPECT_LE(range_requested.end(),
583 client.partial_loader_data()->open_byte_range().end());
584 client.partial_loader_data()->set_byte_range(
585 client.partial_loader_data()->open_byte_range());
587 EXPECT_TRUE(client.partial_loader_data()->IsWaitOpen());
588 client.partial_loader_data()->CallOpenCallback(0);
589 // Override pending requests.
590 loader.ClearPendingRequests();
591 loader.RequestData(70 * kDefaultRequestSize + 100, 10);
593 // Requests queue is processed only on receiving data.
594 client.partial_loader_data()->CallReadCallback(kDefaultRequestSize);
596 // New requset not with in close distance from current loading.
597 // Loading should be restarted .
598 EXPECT_TRUE(client.partial_loader_data()->IsWaitOpen());
599 // The first requested chunk should be processed.
600 constexpr gfx::Range range_requested(70 * kDefaultRequestSize,
601 71 * kDefaultRequestSize);
602 EXPECT_EQ(range_requested.start(),
603 client.partial_loader_data()->open_byte_range().start());
604 EXPECT_LE(range_requested.end(),
605 client.partial_loader_data()->open_byte_range().end());
606 client.partial_loader_data()->set_byte_range(
607 client.partial_loader_data()->open_byte_range());
609 EXPECT_TRUE(client.partial_loader_data()->IsWaitOpen());
612 TEST_F(DocumentLoaderImplTest, GetBlock) {
613 std::vector<char> buffer(kDefaultRequestSize);
615 client.SetCanUsePartialLoading();
616 client.full_page_loader_data()->set_content_length(kDefaultRequestSize * 20 +
618 DocumentLoaderImpl loader(&client);
619 loader.Init(client.CreateFullPageLoader(), "http://url.com");
620 EXPECT_FALSE(loader.GetBlock(0, 1000, buffer.data()));
621 client.full_page_loader_data()->CallReadCallback(kDefaultRequestSize);
622 EXPECT_TRUE(loader.GetBlock(0, 1000, buffer.data()));
623 EXPECT_FALSE(loader.GetBlock(kDefaultRequestSize, 1500, buffer.data()));
624 client.full_page_loader_data()->CallReadCallback(kDefaultRequestSize);
625 EXPECT_TRUE(loader.GetBlock(kDefaultRequestSize, 1500, buffer.data()));
627 EXPECT_FALSE(loader.GetBlock(17 * kDefaultRequestSize, 3000, buffer.data()));
628 loader.RequestData(17 * kDefaultRequestSize + 100, 10);
629 EXPECT_FALSE(loader.GetBlock(17 * kDefaultRequestSize, 3000, buffer.data()));
631 // Requests queue is processed only on receiving data.
632 client.full_page_loader_data()->CallReadCallback(kDefaultRequestSize);
634 client.SendAllPartialData();
635 EXPECT_TRUE(loader.GetBlock(17 * kDefaultRequestSize, 3000, buffer.data()));
638 TEST_F(DocumentLoaderImplTest, IsDataAvailable) {
640 client.SetCanUsePartialLoading();
641 client.full_page_loader_data()->set_content_length(kDefaultRequestSize * 20 +
643 DocumentLoaderImpl loader(&client);
644 loader.Init(client.CreateFullPageLoader(), "http://url.com");
645 EXPECT_FALSE(loader.IsDataAvailable(0, 1000));
646 client.full_page_loader_data()->CallReadCallback(kDefaultRequestSize);
647 EXPECT_TRUE(loader.IsDataAvailable(0, 1000));
648 EXPECT_FALSE(loader.IsDataAvailable(kDefaultRequestSize, 1500));
649 client.full_page_loader_data()->CallReadCallback(kDefaultRequestSize);
650 EXPECT_TRUE(loader.IsDataAvailable(kDefaultRequestSize, 1500));
652 EXPECT_FALSE(loader.IsDataAvailable(17 * kDefaultRequestSize, 3000));
653 loader.RequestData(17 * kDefaultRequestSize + 100, 10);
654 EXPECT_FALSE(loader.IsDataAvailable(17 * kDefaultRequestSize, 3000));
656 // Requests queue is processed only on receiving data.
657 client.full_page_loader_data()->CallReadCallback(kDefaultRequestSize);
659 client.SendAllPartialData();
660 EXPECT_TRUE(loader.IsDataAvailable(17 * kDefaultRequestSize, 3000));
663 TEST_F(DocumentLoaderImplTest, RequestData) {
665 client.SetCanUsePartialLoading();
666 client.full_page_loader_data()->set_content_length(kDefaultRequestSize * 100 +
668 DocumentLoaderImpl loader(&client);
669 loader.Init(client.CreateFullPageLoader(), "http://url.com");
670 loader.RequestData(37 * kDefaultRequestSize + 200, 10);
671 loader.RequestData(25 * kDefaultRequestSize + 600, 100);
672 loader.RequestData(13 * kDefaultRequestSize + 900, 500);
674 // Send initial data from FullPageLoader.
675 client.full_page_loader_data()->CallReadCallback(kDefaultRequestSize);
678 EXPECT_TRUE(client.partial_loader_data()->IsWaitOpen());
679 constexpr gfx::Range range_requested(13 * kDefaultRequestSize,
680 14 * kDefaultRequestSize);
681 EXPECT_EQ(range_requested.start(),
682 client.partial_loader_data()->open_byte_range().start());
683 EXPECT_LE(range_requested.end(),
684 client.partial_loader_data()->open_byte_range().end());
685 client.partial_loader_data()->set_byte_range(
686 client.partial_loader_data()->open_byte_range());
688 client.partial_loader_data()->CallOpenCallback(0);
689 // Override pending requests.
690 loader.ClearPendingRequests();
691 loader.RequestData(38 * kDefaultRequestSize + 200, 10);
692 loader.RequestData(26 * kDefaultRequestSize + 600, 100);
693 // Requests queue is processed only on receiving data.
694 client.partial_loader_data()->CallReadCallback(kDefaultRequestSize);
696 EXPECT_TRUE(client.partial_loader_data()->IsWaitOpen());
697 constexpr gfx::Range range_requested(26 * kDefaultRequestSize,
698 27 * kDefaultRequestSize);
699 EXPECT_EQ(range_requested.start(),
700 client.partial_loader_data()->open_byte_range().start());
701 EXPECT_LE(range_requested.end(),
702 client.partial_loader_data()->open_byte_range().end());
703 client.partial_loader_data()->set_byte_range(
704 client.partial_loader_data()->open_byte_range());
706 client.partial_loader_data()->CallOpenCallback(0);
707 // Override pending requests.
708 loader.ClearPendingRequests();
709 loader.RequestData(39 * kDefaultRequestSize + 200, 10);
710 // Requests queue is processed only on receiving data.
711 client.partial_loader_data()->CallReadCallback(kDefaultRequestSize);
713 EXPECT_TRUE(client.partial_loader_data()->IsWaitOpen());
714 constexpr gfx::Range range_requested(39 * kDefaultRequestSize,
715 40 * kDefaultRequestSize);
716 EXPECT_EQ(range_requested.start(),
717 client.partial_loader_data()->open_byte_range().start());
718 EXPECT_LE(range_requested.end(),
719 client.partial_loader_data()->open_byte_range().end());
720 client.partial_loader_data()->set_byte_range(
721 client.partial_loader_data()->open_byte_range());
724 while (!loader.IsDocumentComplete()) {
725 client.SendAllPartialData();
727 EXPECT_TRUE(client.partial_loader_data()->closed());
730 TEST_F(DocumentLoaderImplTest, DoNotLoadAvailablePartialData) {
732 client.SetCanUsePartialLoading();
733 client.full_page_loader_data()->set_content_length(kDefaultRequestSize * 20 +
735 DocumentLoaderImpl loader(&client);
736 loader.Init(client.CreateFullPageLoader(), "http://url.com");
737 // Send initial data from FullPageLoader.
738 client.full_page_loader_data()->CallReadCallback(kDefaultRequestSize);
740 // Send more data from FullPageLoader.
741 client.full_page_loader_data()->CallReadCallback(kDefaultRequestSize);
743 loader.RequestData(2 * kDefaultRequestSize + 200, 10);
745 // Send more data from FullPageLoader.
746 client.full_page_loader_data()->CallReadCallback(kDefaultRequestSize);
748 // Partial loading should not have started for already available data.
749 EXPECT_TRUE(client.partial_loader_data()->closed());
752 TEST_F(DocumentLoaderImplTest, DoNotLoadDataAfterComplete) {
754 client.SetCanUsePartialLoading();
755 client.full_page_loader_data()->set_content_length(kDefaultRequestSize * 20);
756 DocumentLoaderImpl loader(&client);
757 loader.Init(client.CreateFullPageLoader(), "http://url.com");
759 for (int i = 0; i < 20; ++i) {
760 client.full_page_loader_data()->CallReadCallback(kDefaultRequestSize);
763 EXPECT_TRUE(loader.IsDocumentComplete());
765 loader.RequestData(17 * kDefaultRequestSize + 200, 10);
767 EXPECT_TRUE(client.partial_loader_data()->closed());
768 EXPECT_TRUE(client.full_page_loader_data()->closed());
771 TEST_F(DocumentLoaderImplTest, DoNotLoadPartialDataAboveDocumentSize) {
773 client.SetCanUsePartialLoading();
774 client.full_page_loader_data()->set_content_length(kDefaultRequestSize * 20);
775 DocumentLoaderImpl loader(&client);
776 loader.Init(client.CreateFullPageLoader(), "http://url.com");
778 loader.RequestData(20 * kDefaultRequestSize + 200, 10);
780 // Send initial data from FullPageLoader.
781 client.full_page_loader_data()->CallReadCallback(kDefaultRequestSize);
783 EXPECT_TRUE(client.partial_loader_data()->closed());
786 TEST_F(DocumentLoaderImplTest, MergePendingRequests) {
788 client.SetCanUsePartialLoading();
789 client.full_page_loader_data()->set_content_length(kDefaultRequestSize * 50 +
791 DocumentLoaderImpl loader(&client);
792 loader.Init(client.CreateFullPageLoader(), "http://url.com");
793 loader.RequestData(17 * kDefaultRequestSize + 200, 10);
794 loader.RequestData(16 * kDefaultRequestSize + 600, 100);
796 // Send initial data from FullPageLoader.
797 client.full_page_loader_data()->CallReadCallback(kDefaultRequestSize);
799 constexpr gfx::Range range_requested(16 * kDefaultRequestSize,
800 18 * kDefaultRequestSize);
801 EXPECT_EQ(range_requested.start(),
802 client.partial_loader_data()->open_byte_range().start());
803 EXPECT_LE(range_requested.end(),
804 client.partial_loader_data()->open_byte_range().end());
806 EXPECT_TRUE(client.partial_loader_data()->IsWaitOpen());
809 while (!loader.IsDocumentComplete()) {
810 client.SendAllPartialData();
812 EXPECT_TRUE(client.partial_loader_data()->closed());
815 TEST_F(DocumentLoaderImplTest, PartialStopOnStatusCodeError) {
817 client.SetCanUsePartialLoading();
818 client.full_page_loader_data()->set_content_length(kDefaultRequestSize * 20);
819 DocumentLoaderImpl loader(&client);
820 loader.Init(client.CreateFullPageLoader(), "http://url.com");
822 loader.RequestData(17 * kDefaultRequestSize + 200, 10);
824 // Send initial data from FullPageLoader.
825 client.full_page_loader_data()->CallReadCallback(kDefaultRequestSize);
827 EXPECT_TRUE(client.partial_loader_data()->IsWaitOpen());
828 client.partial_loader_data()->set_status_code(404);
829 client.partial_loader_data()->CallOpenCallback(0);
830 EXPECT_TRUE(client.partial_loader_data()->closed());
833 TEST_F(DocumentLoaderImplTest,
834 PartialAsFullDocumentLoadingRangeRequestNoRangeField) {
836 client.SetCanUsePartialLoading();
837 client.full_page_loader_data()->set_content_length(kDefaultRequestSize * 20);
838 DocumentLoaderImpl loader(&client);
839 loader.Init(client.CreateFullPageLoader(), "http://url.com");
841 loader.RequestData(17 * kDefaultRequestSize + 200, 10);
843 // Send initial data from FullPageLoader.
844 client.full_page_loader_data()->CallReadCallback(kDefaultRequestSize);
846 EXPECT_TRUE(client.partial_loader_data()->IsWaitOpen());
847 client.partial_loader_data()->set_byte_range(gfx::Range::InvalidRange());
848 client.partial_loader_data()->CallOpenCallback(0);
849 EXPECT_FALSE(client.partial_loader_data()->closed());
850 // Partial loader is used to load the whole page, like full page loader.
851 EXPECT_FALSE(loader.is_partial_loader_active());
854 TEST_F(DocumentLoaderImplTest, PartialMultiPart) {
856 client.SetCanUsePartialLoading();
857 client.full_page_loader_data()->set_content_length(kDefaultRequestSize * 20);
858 DocumentLoaderImpl loader(&client);
859 loader.Init(client.CreateFullPageLoader(), "http://url.com");
861 loader.RequestData(17 * kDefaultRequestSize + 200, 10);
863 // Send initial data from FullPageLoader.
864 client.full_page_loader_data()->CallReadCallback(kDefaultRequestSize);
866 EXPECT_TRUE(client.partial_loader_data()->IsWaitOpen());
867 client.partial_loader_data()->set_is_multipart(true);
868 client.partial_loader_data()->CallOpenCallback(0);
869 client.partial_loader_data()->set_byte_range(
870 gfx::Range(17 * kDefaultRequestSize, 18 * kDefaultRequestSize));
871 client.partial_loader_data()->CallReadCallback(kDefaultRequestSize);
873 loader.IsDataAvailable(17 * kDefaultRequestSize, kDefaultRequestSize));
876 TEST_F(DocumentLoaderImplTest, PartialMultiPartRangeError) {
878 client.SetCanUsePartialLoading();
879 client.full_page_loader_data()->set_content_length(kDefaultRequestSize * 20);
880 DocumentLoaderImpl loader(&client);
881 loader.Init(client.CreateFullPageLoader(), "http://url.com");
883 loader.RequestData(17 * kDefaultRequestSize + 200, 10);
885 // Send initial data from FullPageLoader.
886 client.full_page_loader_data()->CallReadCallback(kDefaultRequestSize);
888 EXPECT_TRUE(client.partial_loader_data()->IsWaitOpen());
889 client.partial_loader_data()->set_is_multipart(true);
890 client.partial_loader_data()->CallOpenCallback(0);
891 client.partial_loader_data()->set_byte_range(gfx::Range::InvalidRange());
892 client.partial_loader_data()->CallReadCallback(kDefaultRequestSize);
894 loader.IsDataAvailable(17 * kDefaultRequestSize, kDefaultRequestSize));
895 EXPECT_TRUE(client.partial_loader_data()->closed());
898 TEST_F(DocumentLoaderImplTest, PartialConnectionErrorOnOpen) {
900 client.SetCanUsePartialLoading();
901 client.full_page_loader_data()->set_content_length(kDefaultRequestSize * 20);
902 DocumentLoaderImpl loader(&client);
903 loader.Init(client.CreateFullPageLoader(), "http://url.com");
905 loader.RequestData(17 * kDefaultRequestSize + 200, 10);
907 // Send initial data from FullPageLoader.
908 client.full_page_loader_data()->CallReadCallback(kDefaultRequestSize);
910 EXPECT_TRUE(client.partial_loader_data()->IsWaitOpen());
911 client.partial_loader_data()->CallOpenCallback(-3);
912 EXPECT_TRUE(client.partial_loader_data()->closed());
914 // Partial loading should not restart after any error.
915 loader.RequestData(18 * kDefaultRequestSize + 200, 10);
917 EXPECT_FALSE(client.partial_loader_data()->IsWaitOpen());
918 EXPECT_TRUE(client.partial_loader_data()->closed());
921 TEST_F(DocumentLoaderImplTest, PartialConnectionErrorOnRead) {
923 client.SetCanUsePartialLoading();
924 client.full_page_loader_data()->set_content_length(kDefaultRequestSize * 20);
925 DocumentLoaderImpl loader(&client);
926 loader.Init(client.CreateFullPageLoader(), "http://url.com");
928 loader.RequestData(17 * kDefaultRequestSize + 200, 10);
930 // Send initial data from FullPageLoader.
931 client.full_page_loader_data()->CallReadCallback(kDefaultRequestSize);
933 EXPECT_TRUE(client.partial_loader_data()->IsWaitOpen());
934 client.partial_loader_data()->set_byte_range(
935 gfx::Range(17 * kDefaultRequestSize, 18 * kDefaultRequestSize));
936 client.partial_loader_data()->CallOpenCallback(0);
937 EXPECT_TRUE(client.partial_loader_data()->IsWaitRead());
938 client.partial_loader_data()->CallReadCallback(-3);
939 EXPECT_TRUE(client.partial_loader_data()->closed());
941 // Partial loading should not restart after any error.
942 loader.RequestData(18 * kDefaultRequestSize + 200, 10);
944 EXPECT_FALSE(client.partial_loader_data()->IsWaitOpen());
945 EXPECT_TRUE(client.partial_loader_data()->closed());
948 TEST_F(DocumentLoaderImplTest, ClientCompleteCallbacks) {
950 client.SetCanUsePartialLoading();
951 client.full_page_loader_data()->set_content_length(kDefaultRequestSize * 20);
952 DocumentLoaderImpl loader(&client);
953 loader.Init(client.CreateFullPageLoader(), "http://url.com");
955 EXPECT_CALL(client, OnDocumentComplete()).Times(0);
956 for (int i = 0; i < 19; ++i)
957 client.full_page_loader_data()->CallReadCallback(kDefaultRequestSize);
958 Mock::VerifyAndClear(&client);
960 EXPECT_CALL(client, OnDocumentComplete()).Times(1);
961 client.full_page_loader_data()->CallReadCallback(kDefaultRequestSize);
962 Mock::VerifyAndClear(&client);
965 TEST_F(DocumentLoaderImplTest, ClientCompleteCallbacksNoContentLength) {
967 DocumentLoaderImpl loader(&client);
968 loader.Init(client.CreateFullPageLoader(), "http://url.com");
970 EXPECT_CALL(client, OnDocumentCanceled()).Times(0);
971 EXPECT_CALL(client, OnDocumentComplete()).Times(0);
972 for (int i = 0; i < 20; ++i)
973 client.full_page_loader_data()->CallReadCallback(kDefaultRequestSize);
974 Mock::VerifyAndClear(&client);
976 EXPECT_CALL(client, OnDocumentCanceled()).Times(0);
977 EXPECT_CALL(client, OnDocumentComplete()).Times(1);
978 client.full_page_loader_data()->CallReadCallback(0);
979 Mock::VerifyAndClear(&client);
982 TEST_F(DocumentLoaderImplTest, ClientCancelCallback) {
984 client.SetCanUsePartialLoading();
985 client.full_page_loader_data()->set_content_length(kDefaultRequestSize * 20);
986 DocumentLoaderImpl loader(&client);
987 loader.Init(client.CreateFullPageLoader(), "http://url.com");
989 EXPECT_CALL(client, OnDocumentCanceled()).Times(0);
990 EXPECT_CALL(client, OnDocumentComplete()).Times(0);
991 for (int i = 0; i < 10; ++i)
992 client.full_page_loader_data()->CallReadCallback(kDefaultRequestSize);
993 Mock::VerifyAndClear(&client);
995 EXPECT_CALL(client, OnDocumentComplete()).Times(0);
996 EXPECT_CALL(client, OnDocumentCanceled()).Times(1);
997 client.full_page_loader_data()->CallReadCallback(-3);
998 Mock::VerifyAndClear(&client);
1001 TEST_F(DocumentLoaderImplTest, NewDataAvailable) {
1003 client.SetCanUsePartialLoading();
1004 client.full_page_loader_data()->set_content_length(kDefaultRequestSize * 20);
1005 DocumentLoaderImpl loader(&client);
1006 loader.Init(client.CreateFullPageLoader(), "http://url.com");
1008 EXPECT_CALL(client, OnNewDataReceived()).Times(1);
1009 client.full_page_loader_data()->CallReadCallback(kDefaultRequestSize);
1010 Mock::VerifyAndClear(&client);
1012 EXPECT_CALL(client, OnNewDataReceived()).Times(1);
1013 client.full_page_loader_data()->CallReadCallback(kDefaultRequestSize - 100);
1014 Mock::VerifyAndClear(&client);
1016 EXPECT_CALL(client, OnNewDataReceived()).Times(1);
1017 client.full_page_loader_data()->CallReadCallback(100);
1018 Mock::VerifyAndClear(&client);
1021 TEST_F(DocumentLoaderImplTest, ClientPendingRequestCompleteFullLoader) {
1023 client.SetCanUsePartialLoading();
1024 DocumentLoaderImpl loader(&client);
1025 loader.Init(client.CreateFullPageLoader(), "http://url.com");
1027 loader.RequestData(1000, 4000);
1029 EXPECT_CALL(client, OnPendingRequestComplete()).Times(1);
1030 client.full_page_loader_data()->CallReadCallback(kDefaultRequestSize);
1031 Mock::VerifyAndClear(&client);
1034 TEST_F(DocumentLoaderImplTest, ClientPendingRequestCompletePartialLoader) {
1036 client.SetCanUsePartialLoading();
1037 DocumentLoaderImpl loader(&client);
1038 loader.Init(client.CreateFullPageLoader(), "http://url.com");
1040 EXPECT_CALL(client, OnPendingRequestComplete()).Times(1);
1041 loader.RequestData(15 * kDefaultRequestSize + 4000, 4000);
1043 // Always send initial data from FullPageLoader.
1044 client.full_page_loader_data()->CallReadCallback(kDefaultRequestSize);
1046 client.SendAllPartialData();
1047 Mock::VerifyAndClear(&client);
1050 TEST_F(DocumentLoaderImplTest,
1051 ClientPendingRequestCompletePartialAndFullLoader) {
1053 client.SetCanUsePartialLoading();
1054 DocumentLoaderImpl loader(&client);
1055 loader.Init(client.CreateFullPageLoader(), "http://url.com");
1057 EXPECT_CALL(client, OnPendingRequestComplete()).Times(1);
1058 loader.RequestData(16 * kDefaultRequestSize + 4000, 4000);
1059 loader.RequestData(4 * kDefaultRequestSize + 4000, 4000);
1061 for (int i = 0; i < 5; ++i)
1062 client.full_page_loader_data()->CallReadCallback(kDefaultRequestSize);
1064 Mock::VerifyAndClear(&client);
1066 EXPECT_CALL(client, OnPendingRequestComplete()).Times(1);
1067 client.SendAllPartialData();
1068 Mock::VerifyAndClear(&client);
1071 TEST_F(DocumentLoaderImplTest, IgnoreDataMoreThanExpectedWithPartial) {
1072 static constexpr uint32_t kDocSize = kDefaultRequestSize * 80 - 321;
1074 client.SetCanUsePartialLoading();
1075 client.full_page_loader_data()->set_content_length(kDocSize);
1076 DocumentLoaderImpl loader(&client);
1077 loader.Init(client.CreateFullPageLoader(), "http://url.com");
1078 // Request data at and.
1079 loader.RequestData(kDocSize - 100, 100);
1081 // Always send initial data from FullPageLoader.
1082 client.full_page_loader_data()->CallReadCallback(kDefaultRequestSize);
1083 EXPECT_TRUE(client.full_page_loader_data()->closed());
1084 EXPECT_FALSE(client.partial_loader_data()->closed());
1086 // Request data at middle to continue loading partial, but not all remaining
1088 loader.RequestData(kDocSize / 2, 100);
1090 // Fill data at the end, the partial loding should be started for second
1091 // requested data after receive data for first request.
1092 client.SendAllPartialData();
1094 ASSERT_TRUE(client.partial_loader_data()->IsWaitOpen());
1095 // Process second request.
1096 const uint32_t expected_length =
1097 client.partial_loader_data()->open_byte_range().length();
1100 client.partial_loader_data()->set_byte_range(
1101 client.partial_loader_data()->open_byte_range());
1102 client.partial_loader_data()->CallOpenCallback(0);
1103 uint32_t length = expected_length;
1104 while (length > 0) {
1105 constexpr uint32_t max_part_len = kDefaultRequestSize;
1106 const uint32_t part_len = std::min(length, max_part_len);
1107 client.partial_loader_data()->CallReadCallback(part_len);
1111 // The partial loading should be finished for current chunks sequence, if
1112 // expected range was received, and remaining sequence should start loading.
1113 EXPECT_FALSE(client.partial_loader_data()->IsWaitRead());
1114 ASSERT_TRUE(client.partial_loader_data()->IsWaitOpen());
1116 // Send other document data.
1117 client.SendAllPartialData();
1118 // The downloads should be finished.
1119 EXPECT_TRUE(client.full_page_loader_data()->closed());
1120 EXPECT_TRUE(client.partial_loader_data()->closed());
1123 TEST_F(DocumentLoaderImplTest, IgnoreDataMoreThanExpectedWithPartialAtFileEnd) {
1124 static constexpr uint32_t kExtraSize = 100;
1125 static constexpr uint32_t kRealSize = kDefaultRequestSize * 20 - 300;
1126 static constexpr uint32_t kDocSize = kRealSize - kExtraSize;
1128 client.SetCanUsePartialLoading();
1129 client.full_page_loader_data()->set_content_length(kDocSize);
1130 DocumentLoaderImpl loader(&client);
1131 loader.Init(client.CreateFullPageLoader(), "http://url.com");
1132 // Request data at middle.
1133 static constexpr uint32_t kFirstPartial = kDefaultRequestSize * 11;
1134 loader.RequestData(kFirstPartial, kDefaultRequestSize);
1136 // Always send initial data from FullPageLoader.
1137 client.full_page_loader_data()->CallReadCallback(kDefaultRequestSize);
1138 EXPECT_TRUE(client.full_page_loader_data()->closed());
1139 EXPECT_FALSE(client.partial_loader_data()->closed());
1141 // Send data to file end and extra non expected data.
1142 client.partial_loader_data()->set_byte_range(
1143 gfx::Range(kFirstPartial, kRealSize));
1144 client.partial_loader_data()->CallOpenCallback(0);
1145 uint32_t length = client.partial_loader_data()->byte_range().length();
1146 while (length > 0) {
1147 constexpr uint32_t max_part_len = kDefaultRequestSize;
1148 const uint32_t part_len = std::min(length, max_part_len);
1149 client.partial_loader_data()->CallReadCallback(part_len);
1153 // The partial loading should be finished for current chunks sequence, if
1154 // eof was reached, and remaining sequence should start loading.
1155 EXPECT_FALSE(client.partial_loader_data()->IsWaitRead());
1156 EXPECT_EQ(gfx::Range(kDefaultRequestSize, kFirstPartial),
1157 client.partial_loader_data()->open_byte_range());
1159 // Send other document data.
1160 client.SendAllPartialData();
1161 // The downloads should be finished.
1162 EXPECT_TRUE(client.full_page_loader_data()->closed());
1163 EXPECT_TRUE(client.partial_loader_data()->closed());
1166 } // namespace chrome_pdf