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

Side by Side Diff: pdf/document_loader_unittest.cc

Issue 2349753003: Improve linearized pdf load/show time. (Closed)
Patch Set: rebase 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 unified diff | Download patch
« no previous file with comments | « pdf/document_loader.cc ('k') | pdf/out_of_process_instance.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(Empty)
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.
4
5 #include "pdf/document_loader.h"
6
7 #include <memory>
8 #include <string>
9
10 #include "base/logging.h"
11 #include "pdf/url_loader_wrapper.h"
12 #include "testing/gmock/include/gmock/gmock.h"
13 #include "testing/gtest/include/gtest/gtest.h"
14 #include "ui/gfx/range/range.h"
15
16 using ::testing::_;
17 using ::testing::Mock;
18 using ::testing::Sequence;
19 using ::testing::NiceMock;
20 using ::testing::Return;
21
22 namespace chrome_pdf {
23
24 namespace {
25
26 class TestURLLoader : public URLLoaderWrapper {
27 public:
28 class LoaderData {
29 public:
30 LoaderData() {}
31
32 int content_length() const { return content_length_; }
33 void set_content_length(int content_length) {
34 content_length_ = content_length;
35 }
36 bool accept_ranges_bytes() const { return accept_ranges_bytes_; }
37 void set_accept_ranges_bytes(bool accept_ranges_bytes) {
38 accept_ranges_bytes_ = accept_ranges_bytes;
39 }
40 bool content_encoded() const { return content_encoded_; }
41 void set_content_encoded(bool content_encoded) {
42 content_encoded_ = content_encoded;
43 }
44 const std::string& content_type() const { return content_type_; }
45 void set_content_type(const std::string& content_type) {
46 content_type_ = content_type;
47 }
48 const std::string& content_disposition() const {
49 return content_disposition_;
50 }
51 void set_content_disposition(const std::string& content_disposition) {
52 content_disposition_ = content_disposition;
53 }
54 const std::string& multipart_boundary() const {
55 return multipart_boundary_;
56 }
57 void set_multipart_boundary(const std::string& multipart_boundary) {
58 multipart_boundary_ = multipart_boundary;
59 }
60 const gfx::Range& byte_range() const { return byte_range_; }
61 void set_byte_range(const gfx::Range& byte_range) {
62 byte_range_ = byte_range;
63 }
64 bool is_multipart() const { return is_multipart_; }
65 void set_is_multipart(bool is_multipart) { is_multipart_ = is_multipart; }
66 int status_code() const { return status_code_; }
67 void set_status_code(int status_code) { status_code_ = status_code; }
68 bool closed() const { return closed_; }
69 void set_closed(bool closed) { closed_ = closed; }
70 const gfx::Range& open_byte_range() const { return open_byte_range_; }
71 void set_open_byte_range(const gfx::Range& open_byte_range) {
72 open_byte_range_ = open_byte_range;
73 }
74
75 bool IsWaitRead() const { return !did_read_callback_.IsOptional(); }
76 bool IsWaitOpen() const { return !did_open_callback_.IsOptional(); }
77 char* buffer() const { return buffer_; }
78 int buffer_size() const { return buffer_size_; }
79
80 void SetReadCallback(const pp::CompletionCallback& read_callback,
81 char* buffer,
82 int buffer_size) {
83 did_read_callback_ = read_callback;
84 buffer_ = buffer;
85 buffer_size_ = buffer_size;
86 }
87
88 void SetOpenCallback(const pp::CompletionCallback& open_callback,
89 gfx::Range req_byte_range) {
90 did_open_callback_ = open_callback;
91 set_open_byte_range(req_byte_range);
92 }
93
94 void CallOpenCallback(int result) {
95 DCHECK(IsWaitOpen());
96 did_open_callback_.RunAndClear(result);
97 }
98
99 void CallReadCallback(int result) {
100 DCHECK(IsWaitRead());
101 did_read_callback_.RunAndClear(result);
102 }
103
104 private:
105 pp::CompletionCallback did_open_callback_;
106 pp::CompletionCallback did_read_callback_;
107 char* buffer_ = nullptr;
108 int buffer_size_ = 0;
109
110 int content_length_ = -1;
111 bool accept_ranges_bytes_ = false;
112 bool content_encoded_ = false;
113 std::string content_type_;
114 std::string content_disposition_;
115 std::string multipart_boundary_;
116 gfx::Range byte_range_ = gfx::Range::InvalidRange();
117 bool is_multipart_ = false;
118 int status_code_ = 0;
119 bool closed_ = true;
120 gfx::Range open_byte_range_ = gfx::Range::InvalidRange();
121
122 DISALLOW_COPY_AND_ASSIGN(LoaderData);
123 };
124
125 explicit TestURLLoader(LoaderData* data) : data_(data) {
126 data_->set_closed(false);
127 }
128
129 ~TestURLLoader() override { Close(); }
130
131 int GetContentLength() const override { return data_->content_length(); }
132
133 bool IsAcceptRangesBytes() const override {
134 return data_->accept_ranges_bytes();
135 }
136
137 bool IsContentEncoded() const override { return data_->content_encoded(); }
138
139 std::string GetContentType() const override { return data_->content_type(); }
140
141 std::string GetContentDisposition() const override {
142 return data_->content_disposition();
143 }
144
145 int GetStatusCode() const override { return data_->status_code(); }
146
147 bool IsMultipart() const override { return data_->is_multipart(); }
148
149 bool GetByteRange(int* start, int* end) const override {
150 *start = data_->byte_range().start();
151 *end = data_->byte_range().end();
152 return data_->byte_range().IsValid();
153 }
154
155 void Close() override { data_->set_closed(true); }
156
157 void OpenRange(const std::string& url,
158 const std::string& referrer_url,
159 uint32_t position,
160 uint32_t size,
161 const pp::CompletionCallback& cc) override {
162 data_->SetOpenCallback(cc, gfx::Range(position, position + size));
163 }
164
165 void ReadResponseBody(char* buffer,
166 int buffer_size,
167 const pp::CompletionCallback& cc) override {
168 data_->SetReadCallback(cc, buffer, buffer_size);
169 }
170
171 bool GetDownloadProgress(int64_t* bytes_received,
172 int64_t* total_bytes_to_be_received) const override {
173 return false;
174 }
175
176 private:
177 LoaderData* data_;
178
179 DISALLOW_COPY_AND_ASSIGN(TestURLLoader);
180 };
181
182 class TestClient : public DocumentLoader::Client {
183 public:
184 TestClient() { full_page_loader_data()->set_content_type("application/pdf"); }
185 ~TestClient() override {}
186
187 // DocumentLoader::Client overrides:
188 pp::Instance* GetPluginInstance() override { return nullptr; }
189 std::unique_ptr<URLLoaderWrapper> CreateURLLoader() override {
190 return std::unique_ptr<URLLoaderWrapper>(
191 new TestURLLoader(partial_loader_data()));
192 }
193 void OnPendingRequestComplete() override {}
194 void OnNewDataAvailable() override {}
195 void OnDocumentComplete() override {}
196 void OnDocumentCanceled() override {}
197 void CancelBrowserDownload() override {}
198
199 std::unique_ptr<URLLoaderWrapper> CreateFullPageLoader() {
200 return std::unique_ptr<URLLoaderWrapper>(
201 new TestURLLoader(full_page_loader_data()));
202 }
203
204 TestURLLoader::LoaderData* full_page_loader_data() {
205 return &full_page_loader_data_;
206 }
207 TestURLLoader::LoaderData* partial_loader_data() {
208 return &partial_loader_data_;
209 }
210
211 void SetCanUsePartialLoading() {
212 full_page_loader_data()->set_content_length(10 * 1024 * 1024);
213 full_page_loader_data()->set_content_encoded(false);
214 full_page_loader_data()->set_accept_ranges_bytes(true);
215 }
216
217 void SendAllPartialData() {
218 partial_loader_data_.set_byte_range(partial_loader_data_.open_byte_range());
219 partial_loader_data_.CallOpenCallback(0);
220 uint32_t length = partial_loader_data_.byte_range().length();
221 while (length > 0) {
222 const uint32_t part_len =
223 std::min(length, DocumentLoader::default_request_size());
224 partial_loader_data_.CallReadCallback(part_len);
225 length -= part_len;
226 }
227 if (partial_loader_data_.IsWaitRead()) {
228 partial_loader_data_.CallReadCallback(0);
229 }
230 }
231
232 private:
233 TestURLLoader::LoaderData full_page_loader_data_;
234 TestURLLoader::LoaderData partial_loader_data_;
235
236 DISALLOW_COPY_AND_ASSIGN(TestClient);
237 };
238
239 class MockClient : public TestClient {
240 public:
241 MockClient() {}
242
243 MOCK_METHOD0(OnPendingRequestComplete, void());
244 MOCK_METHOD0(OnNewDataAvailable, void());
245 MOCK_METHOD0(OnDocumentComplete, void());
246 MOCK_METHOD0(OnDocumentCanceled, void());
247
248 private:
249 DISALLOW_COPY_AND_ASSIGN(MockClient);
250 };
251
252 } // namespace
253
254 class DocumentLoaderTest : public ::testing::Test {
255 public:
256 DocumentLoaderTest() {}
257 ~DocumentLoaderTest() override {}
258 void SetUp() override {}
259 void TearDown() override {}
260 };
261
262 TEST_F(DocumentLoaderTest, PartialLoadingEnabled) {
263 TestClient client;
264 client.SetCanUsePartialLoading();
265 DocumentLoader loader(&client);
266 loader.Init(client.CreateFullPageLoader(), "http://url.com");
267 loader.RequestData(1000000, 1);
268 EXPECT_FALSE(loader.is_partial_loader_active());
269 // Always send initial data from FullPageLoader.
270 client.full_page_loader_data()->CallReadCallback(
271 DocumentLoader::default_request_size());
272 EXPECT_TRUE(loader.is_partial_loader_active());
273 }
274
275 TEST_F(DocumentLoaderTest, PartialLoadingDisabledOnSmallFiles) {
276 TestClient client;
277 client.SetCanUsePartialLoading();
278 client.full_page_loader_data()->set_content_length(
279 DocumentLoader::default_request_size() * 2);
280 DocumentLoader loader(&client);
281 loader.Init(client.CreateFullPageLoader(), "http://url.com");
282 loader.RequestData(1000000, 1);
283 EXPECT_FALSE(loader.is_partial_loader_active());
284 // Always send initial data from FullPageLoader.
285 client.full_page_loader_data()->CallReadCallback(
286 DocumentLoader::default_request_size());
287 EXPECT_FALSE(loader.is_partial_loader_active());
288 }
289
290 TEST_F(DocumentLoaderTest, PartialLoadingDisabledIfContentEncoded) {
291 TestClient client;
292 client.SetCanUsePartialLoading();
293 client.full_page_loader_data()->set_content_encoded(true);
294 DocumentLoader loader(&client);
295 loader.Init(client.CreateFullPageLoader(), "http://url.com");
296 loader.RequestData(1000000, 1);
297 EXPECT_FALSE(loader.is_partial_loader_active());
298 // Always send initial data from FullPageLoader.
299 client.full_page_loader_data()->CallReadCallback(
300 DocumentLoader::default_request_size());
301 EXPECT_FALSE(loader.is_partial_loader_active());
302 }
303
304 TEST_F(DocumentLoaderTest, PartialLoadingDisabledNoAcceptRangeBytes) {
305 TestClient client;
306 client.SetCanUsePartialLoading();
307 client.full_page_loader_data()->set_accept_ranges_bytes(false);
308 DocumentLoader loader(&client);
309 loader.Init(client.CreateFullPageLoader(), "http://url.com");
310 loader.RequestData(1000000, 1);
311 EXPECT_FALSE(loader.is_partial_loader_active());
312 // Always send initial data from FullPageLoader.
313 client.full_page_loader_data()->CallReadCallback(
314 DocumentLoader::default_request_size());
315 EXPECT_FALSE(loader.is_partial_loader_active());
316 }
317
318 TEST_F(DocumentLoaderTest, PartialLoadingReallyDisabledRequestFromBegin) {
319 TestClient client;
320 DocumentLoader loader(&client);
321 client.SetCanUsePartialLoading();
322 loader.SetPartialLoadingEnabled(false);
323 loader.Init(client.CreateFullPageLoader(), "http://url.com");
324 // We should not start partial loading if requested data is beside full page
325 // loading position.
326 loader.RequestData(DocumentLoader::default_request_size(), 1);
327 EXPECT_FALSE(loader.is_partial_loader_active());
328 // Always send initial data from FullPageLoader.
329 client.full_page_loader_data()->CallReadCallback(
330 DocumentLoader::default_request_size());
331 EXPECT_FALSE(loader.is_partial_loader_active());
332 }
333
334 TEST_F(DocumentLoaderTest, PartialLoadingReallyDisabledRequestFromMiddle) {
335 TestClient client;
336 client.SetCanUsePartialLoading();
337 DocumentLoader loader(&client);
338 loader.SetPartialLoadingEnabled(false);
339 loader.Init(client.CreateFullPageLoader(), "http://url.com");
340 loader.RequestData(1000000, 1);
341 EXPECT_FALSE(loader.is_partial_loader_active());
342 // Always send initial data from FullPageLoader.
343 client.full_page_loader_data()->CallReadCallback(
344 DocumentLoader::default_request_size());
345 EXPECT_FALSE(loader.is_partial_loader_active());
346 }
347
348 TEST_F(DocumentLoaderTest, PartialLoadingSimple) {
349 TestClient client;
350 client.SetCanUsePartialLoading();
351
352 DocumentLoader loader(&client);
353 loader.Init(client.CreateFullPageLoader(), "http://url.com");
354
355 // While we have no requests, we should not start partial loading.
356 EXPECT_FALSE(loader.is_partial_loader_active());
357
358 loader.RequestData(5000000, 1);
359
360 EXPECT_FALSE(client.partial_loader_data()->IsWaitOpen());
361 EXPECT_FALSE(loader.is_partial_loader_active());
362
363 // Always send initial data from FullPageLoader.
364 client.full_page_loader_data()->CallReadCallback(
365 DocumentLoader::default_request_size());
366
367 // Partial loader should request headers.
368 EXPECT_TRUE(client.partial_loader_data()->IsWaitOpen());
369 EXPECT_TRUE(loader.is_partial_loader_active());
370 // Loader should be stopped.
371 EXPECT_TRUE(client.full_page_loader_data()->closed());
372
373 EXPECT_EQ("{4980736,10485760}",
374 client.partial_loader_data()->open_byte_range().ToString());
375 }
376
377 TEST_F(DocumentLoaderTest, PartialLoadingBackOrder) {
378 TestClient client;
379 client.SetCanUsePartialLoading();
380
381 DocumentLoader loader(&client);
382 loader.Init(client.CreateFullPageLoader(), "http://url.com");
383
384 // While we have no requests, we should not start partial loading.
385 EXPECT_FALSE(loader.is_partial_loader_active());
386
387 loader.RequestData(client.full_page_loader_data()->content_length() - 1, 1);
388
389 EXPECT_FALSE(client.partial_loader_data()->IsWaitOpen());
390 EXPECT_FALSE(loader.is_partial_loader_active());
391
392 // Always send initial data from FullPageLoader.
393 client.full_page_loader_data()->CallReadCallback(
394 DocumentLoader::default_request_size());
395
396 // Partial loader should request headers.
397 EXPECT_TRUE(client.partial_loader_data()->IsWaitOpen());
398 EXPECT_TRUE(loader.is_partial_loader_active());
399 // Loader should be stopped.
400 EXPECT_TRUE(client.full_page_loader_data()->closed());
401
402 // Requested range should be enlarged.
403 EXPECT_GT(client.partial_loader_data()->open_byte_range().length(), 1u);
404 EXPECT_EQ("{9830400,10485760}",
405 client.partial_loader_data()->open_byte_range().ToString());
406 }
407
408 TEST_F(DocumentLoaderTest, CompleteWithoutPartial) {
409 TestClient client;
410 client.SetCanUsePartialLoading();
411 DocumentLoader loader(&client);
412 loader.Init(client.CreateFullPageLoader(), "http://url.com");
413 EXPECT_FALSE(client.full_page_loader_data()->closed());
414 while (client.full_page_loader_data()->IsWaitRead()) {
415 client.full_page_loader_data()->CallReadCallback(1000);
416 }
417 EXPECT_TRUE(loader.IsDocumentComplete());
418 EXPECT_TRUE(client.full_page_loader_data()->closed());
419 }
420
421 TEST_F(DocumentLoaderTest, ErrorDownloadFullDocument) {
422 TestClient client;
423 client.SetCanUsePartialLoading();
424 DocumentLoader loader(&client);
425 loader.Init(client.CreateFullPageLoader(), "http://url.com");
426 EXPECT_TRUE(client.full_page_loader_data()->IsWaitRead());
427 EXPECT_FALSE(client.full_page_loader_data()->closed());
428 client.full_page_loader_data()->CallReadCallback(-3);
429 EXPECT_TRUE(client.full_page_loader_data()->closed());
430 EXPECT_FALSE(loader.IsDocumentComplete());
431 }
432
433 TEST_F(DocumentLoaderTest, CompleteNoContentLength) {
434 TestClient client;
435 DocumentLoader loader(&client);
436 loader.Init(client.CreateFullPageLoader(), "http://url.com");
437 EXPECT_FALSE(client.full_page_loader_data()->closed());
438 for (int i = 0; i < 10; ++i) {
439 EXPECT_TRUE(client.full_page_loader_data()->IsWaitRead());
440 client.full_page_loader_data()->CallReadCallback(1000);
441 }
442 EXPECT_TRUE(client.full_page_loader_data()->IsWaitRead());
443 client.full_page_loader_data()->CallReadCallback(0);
444 EXPECT_EQ(10000ul, loader.GetDocumentSize());
445 EXPECT_TRUE(loader.IsDocumentComplete());
446 EXPECT_TRUE(client.full_page_loader_data()->closed());
447 }
448
449 TEST_F(DocumentLoaderTest, CompleteWithPartial) {
450 TestClient client;
451 client.SetCanUsePartialLoading();
452 client.full_page_loader_data()->set_content_length(
453 DocumentLoader::default_request_size() * 20);
454 DocumentLoader loader(&client);
455 loader.Init(client.CreateFullPageLoader(), "http://url.com");
456 loader.RequestData(19 * DocumentLoader::default_request_size(),
457 DocumentLoader::default_request_size());
458 EXPECT_FALSE(client.full_page_loader_data()->closed());
459 EXPECT_FALSE(client.partial_loader_data()->IsWaitRead());
460 EXPECT_FALSE(client.partial_loader_data()->IsWaitOpen());
461
462 // Always send initial data from FullPageLoader.
463 client.full_page_loader_data()->CallReadCallback(
464 DocumentLoader::default_request_size());
465 EXPECT_TRUE(client.full_page_loader_data()->closed());
466 EXPECT_FALSE(client.partial_loader_data()->closed());
467
468 client.SendAllPartialData();
469 // Now we should send other document data.
470 client.SendAllPartialData();
471 EXPECT_TRUE(client.full_page_loader_data()->closed());
472 EXPECT_TRUE(client.partial_loader_data()->closed());
473 }
474
475 TEST_F(DocumentLoaderTest, PartialRequestLastChunk) {
476 const uint32_t kLastChunkSize = 300;
477 TestClient client;
478 client.SetCanUsePartialLoading();
479 client.full_page_loader_data()->set_content_length(
480 DocumentLoader::default_request_size() * 20 + kLastChunkSize);
481 DocumentLoader loader(&client);
482 loader.Init(client.CreateFullPageLoader(), "http://url.com");
483 loader.RequestData(20 * DocumentLoader::default_request_size(), 1);
484
485 // Always send initial data from FullPageLoader.
486 client.full_page_loader_data()->CallReadCallback(
487 DocumentLoader::default_request_size());
488
489 EXPECT_TRUE(client.partial_loader_data()->IsWaitOpen());
490 EXPECT_EQ(
491 static_cast<int>(client.partial_loader_data()->open_byte_range().end()),
492 client.full_page_loader_data()->content_length());
493 client.partial_loader_data()->set_byte_range(
494 client.partial_loader_data()->open_byte_range());
495 client.partial_loader_data()->CallOpenCallback(0);
496 uint32_t data_length = client.partial_loader_data()->byte_range().length();
497 while (data_length > DocumentLoader::default_request_size()) {
498 client.partial_loader_data()->CallReadCallback(
499 DocumentLoader::default_request_size());
500 data_length -= DocumentLoader::default_request_size();
501 }
502 EXPECT_EQ(kLastChunkSize, data_length);
503 client.partial_loader_data()->CallReadCallback(kLastChunkSize);
504 EXPECT_TRUE(loader.IsDataAvailable(
505 DocumentLoader::default_request_size() * 20, kLastChunkSize));
506 }
507
508 TEST_F(DocumentLoaderTest, DocumentSize) {
509 TestClient client;
510 client.SetCanUsePartialLoading();
511 client.full_page_loader_data()->set_content_length(123456789);
512 DocumentLoader loader(&client);
513 loader.Init(client.CreateFullPageLoader(), "http://url.com");
514 EXPECT_EQ(static_cast<int>(loader.GetDocumentSize()),
515 client.full_page_loader_data()->content_length());
516 }
517
518 TEST_F(DocumentLoaderTest, DocumentSizeNoContentLength) {
519 TestClient client;
520 DocumentLoader loader(&client);
521 loader.Init(client.CreateFullPageLoader(), "http://url.com");
522 EXPECT_EQ(0ul, loader.GetDocumentSize());
523 client.full_page_loader_data()->CallReadCallback(
524 DocumentLoader::default_request_size());
525 client.full_page_loader_data()->CallReadCallback(1000);
526 client.full_page_loader_data()->CallReadCallback(500);
527 client.full_page_loader_data()->CallReadCallback(0);
528 EXPECT_EQ(DocumentLoader::default_request_size() + 1000ul + 500ul,
529 loader.GetDocumentSize());
530 EXPECT_TRUE(loader.IsDocumentComplete());
531 }
532
533 TEST_F(DocumentLoaderTest, ClearPendingRequests) {
534 TestClient client;
535 client.SetCanUsePartialLoading();
536 client.full_page_loader_data()->set_content_length(
537 DocumentLoader::default_request_size() * 100 + 58383);
538 DocumentLoader loader(&client);
539 loader.Init(client.CreateFullPageLoader(), "http://url.com");
540 loader.RequestData(17 * DocumentLoader::default_request_size() + 100, 10);
541 loader.ClearPendingRequests();
542 loader.RequestData(15 * DocumentLoader::default_request_size() + 200, 20);
543 // pending requests are accumulating, and will be processed after initial data
544 // load.
545 EXPECT_FALSE(client.partial_loader_data()->IsWaitOpen());
546
547 // Send initial data from FullPageLoader.
548 client.full_page_loader_data()->CallReadCallback(
549 DocumentLoader::default_request_size());
550
551 {
552 EXPECT_TRUE(client.partial_loader_data()->IsWaitOpen());
553 const gfx::Range range_requested(
554 15 * DocumentLoader::default_request_size(),
555 16 * DocumentLoader::default_request_size());
556 EXPECT_EQ(range_requested.start(),
557 client.partial_loader_data()->open_byte_range().start());
558 EXPECT_LE(range_requested.end(),
559 client.partial_loader_data()->open_byte_range().end());
560 client.partial_loader_data()->set_byte_range(
561 client.partial_loader_data()->open_byte_range());
562 }
563 // clear requests before Open callback.
564 loader.ClearPendingRequests();
565 // Current request should continue loading.
566 EXPECT_TRUE(client.partial_loader_data()->IsWaitOpen());
567 client.partial_loader_data()->CallOpenCallback(0);
568 client.partial_loader_data()->CallReadCallback(
569 DocumentLoader::default_request_size());
570 EXPECT_FALSE(client.partial_loader_data()->closed());
571 // Current request should continue loading, because no other request queued.
572
573 loader.RequestData(18 * DocumentLoader::default_request_size() + 200, 20);
574 // Requests queue is processed only on receiving data.
575 client.partial_loader_data()->CallReadCallback(
576 DocumentLoader::default_request_size());
577 // New request within close distance from the one currently loading. Loading
578 // isn't restarted.
579 EXPECT_FALSE(client.partial_loader_data()->IsWaitOpen());
580
581 loader.ClearPendingRequests();
582 // request again two.
583 loader.RequestData(60 * DocumentLoader::default_request_size() + 100, 10);
584 loader.RequestData(35 * DocumentLoader::default_request_size() + 200, 20);
585 // Requests queue is processed only on receiving data.
586 client.partial_loader_data()->CallReadCallback(
587 DocumentLoader::default_request_size());
588 {
589 // new requset not with in close distance from current loading.
590 // Loading should be restarted.
591 EXPECT_TRUE(client.partial_loader_data()->IsWaitOpen());
592 // The first requested chunk should be processed.
593 const gfx::Range range_requested(
594 35 * DocumentLoader::default_request_size(),
595 36 * DocumentLoader::default_request_size());
596 EXPECT_EQ(range_requested.start(),
597 client.partial_loader_data()->open_byte_range().start());
598 EXPECT_LE(range_requested.end(),
599 client.partial_loader_data()->open_byte_range().end());
600 client.partial_loader_data()->set_byte_range(
601 client.partial_loader_data()->open_byte_range());
602 }
603 EXPECT_TRUE(client.partial_loader_data()->IsWaitOpen());
604 client.partial_loader_data()->CallOpenCallback(0);
605 // Override pending requests.
606 loader.ClearPendingRequests();
607 loader.RequestData(70 * DocumentLoader::default_request_size() + 100, 10);
608
609 // Requests queue is processed only on receiving data.
610 client.partial_loader_data()->CallReadCallback(
611 DocumentLoader::default_request_size());
612 {
613 // New requset not with in close distance from current loading.
614 // Loading should be restarted .
615 EXPECT_TRUE(client.partial_loader_data()->IsWaitOpen());
616 // The first requested chunk should be processed.
617 const gfx::Range range_requested(
618 70 * DocumentLoader::default_request_size(),
619 71 * DocumentLoader::default_request_size());
620 EXPECT_EQ(range_requested.start(),
621 client.partial_loader_data()->open_byte_range().start());
622 EXPECT_LE(range_requested.end(),
623 client.partial_loader_data()->open_byte_range().end());
624 client.partial_loader_data()->set_byte_range(
625 client.partial_loader_data()->open_byte_range());
626 }
627 EXPECT_TRUE(client.partial_loader_data()->IsWaitOpen());
628 }
629
630 TEST_F(DocumentLoaderTest, GetBlock) {
631 char buffer[DocumentLoader::default_request_size()];
632 TestClient client;
633 client.SetCanUsePartialLoading();
634 client.full_page_loader_data()->set_content_length(
635 DocumentLoader::default_request_size() * 20 + 58383);
636 DocumentLoader loader(&client);
637 loader.Init(client.CreateFullPageLoader(), "http://url.com");
638 EXPECT_FALSE(loader.GetBlock(0, 1000, buffer));
639 client.full_page_loader_data()->CallReadCallback(
640 DocumentLoader::default_request_size());
641 EXPECT_TRUE(loader.GetBlock(0, 1000, buffer));
642 EXPECT_FALSE(
643 loader.GetBlock(DocumentLoader::default_request_size(), 1500, buffer));
644 client.full_page_loader_data()->CallReadCallback(
645 DocumentLoader::default_request_size());
646 EXPECT_TRUE(
647 loader.GetBlock(DocumentLoader::default_request_size(), 1500, buffer));
648
649 EXPECT_FALSE(loader.GetBlock(17 * DocumentLoader::default_request_size(),
650 3000, buffer));
651 loader.RequestData(17 * DocumentLoader::default_request_size() + 100, 10);
652 EXPECT_FALSE(loader.GetBlock(17 * DocumentLoader::default_request_size(),
653 3000, buffer));
654
655 // Requests queue is processed only on receiving data.
656 client.full_page_loader_data()->CallReadCallback(
657 DocumentLoader::default_request_size());
658
659 client.SendAllPartialData();
660 EXPECT_TRUE(loader.GetBlock(17 * DocumentLoader::default_request_size(), 3000,
661 buffer));
662 }
663
664 TEST_F(DocumentLoaderTest, IsDataAvailable) {
665 TestClient client;
666 client.SetCanUsePartialLoading();
667 client.full_page_loader_data()->set_content_length(
668 DocumentLoader::default_request_size() * 20 + 58383);
669 DocumentLoader loader(&client);
670 loader.Init(client.CreateFullPageLoader(), "http://url.com");
671 EXPECT_FALSE(loader.IsDataAvailable(0, 1000));
672 client.full_page_loader_data()->CallReadCallback(
673 DocumentLoader::default_request_size());
674 EXPECT_TRUE(loader.IsDataAvailable(0, 1000));
675 EXPECT_FALSE(
676 loader.IsDataAvailable(DocumentLoader::default_request_size(), 1500));
677 client.full_page_loader_data()->CallReadCallback(
678 DocumentLoader::default_request_size());
679 EXPECT_TRUE(
680 loader.IsDataAvailable(DocumentLoader::default_request_size(), 1500));
681
682 EXPECT_FALSE(loader.IsDataAvailable(
683 17 * DocumentLoader::default_request_size(), 3000));
684 loader.RequestData(17 * DocumentLoader::default_request_size() + 100, 10);
685 EXPECT_FALSE(loader.IsDataAvailable(
686 17 * DocumentLoader::default_request_size(), 3000));
687
688 // Requests queue is processed only on receiving data.
689 client.full_page_loader_data()->CallReadCallback(
690 DocumentLoader::default_request_size());
691
692 client.SendAllPartialData();
693 EXPECT_TRUE(loader.IsDataAvailable(
694 17 * DocumentLoader::default_request_size(), 3000));
695 }
696
697 TEST_F(DocumentLoaderTest, RequestData) {
698 TestClient client;
699 client.SetCanUsePartialLoading();
700 client.full_page_loader_data()->set_content_length(
701 DocumentLoader::default_request_size() * 100 + 58383);
702 DocumentLoader loader(&client);
703 loader.Init(client.CreateFullPageLoader(), "http://url.com");
704 loader.RequestData(37 * DocumentLoader::default_request_size() + 200, 10);
705 loader.RequestData(25 * DocumentLoader::default_request_size() + 600, 100);
706 loader.RequestData(13 * DocumentLoader::default_request_size() + 900, 500);
707
708 // Send initial data from FullPageLoader.
709 client.full_page_loader_data()->CallReadCallback(
710 DocumentLoader::default_request_size());
711
712 {
713 EXPECT_TRUE(client.partial_loader_data()->IsWaitOpen());
714 const gfx::Range range_requested(
715 13 * DocumentLoader::default_request_size(),
716 14 * DocumentLoader::default_request_size());
717 EXPECT_EQ(range_requested.start(),
718 client.partial_loader_data()->open_byte_range().start());
719 EXPECT_LE(range_requested.end(),
720 client.partial_loader_data()->open_byte_range().end());
721 client.partial_loader_data()->set_byte_range(
722 client.partial_loader_data()->open_byte_range());
723 }
724 client.partial_loader_data()->CallOpenCallback(0);
725 // Override pending requests.
726 loader.ClearPendingRequests();
727 loader.RequestData(38 * DocumentLoader::default_request_size() + 200, 10);
728 loader.RequestData(26 * DocumentLoader::default_request_size() + 600, 100);
729 // Requests queue is processed only on receiving data.
730 client.partial_loader_data()->CallReadCallback(
731 DocumentLoader::default_request_size());
732 {
733 EXPECT_TRUE(client.partial_loader_data()->IsWaitOpen());
734 const gfx::Range range_requested(
735 26 * DocumentLoader::default_request_size(),
736 27 * DocumentLoader::default_request_size());
737 EXPECT_EQ(range_requested.start(),
738 client.partial_loader_data()->open_byte_range().start());
739 EXPECT_LE(range_requested.end(),
740 client.partial_loader_data()->open_byte_range().end());
741 client.partial_loader_data()->set_byte_range(
742 client.partial_loader_data()->open_byte_range());
743 }
744 client.partial_loader_data()->CallOpenCallback(0);
745 // Override pending requests.
746 loader.ClearPendingRequests();
747 loader.RequestData(39 * DocumentLoader::default_request_size() + 200, 10);
748 // Requests queue is processed only on receiving data.
749 client.partial_loader_data()->CallReadCallback(
750 DocumentLoader::default_request_size());
751 {
752 EXPECT_TRUE(client.partial_loader_data()->IsWaitOpen());
753 const gfx::Range range_requested(
754 39 * DocumentLoader::default_request_size(),
755 40 * DocumentLoader::default_request_size());
756 EXPECT_EQ(range_requested.start(),
757 client.partial_loader_data()->open_byte_range().start());
758 EXPECT_LE(range_requested.end(),
759 client.partial_loader_data()->open_byte_range().end());
760 client.partial_loader_data()->set_byte_range(
761 client.partial_loader_data()->open_byte_range());
762 }
763 // Fill all gaps.
764 while (!loader.IsDocumentComplete()) {
765 client.SendAllPartialData();
766 }
767 EXPECT_TRUE(client.partial_loader_data()->closed());
768 }
769
770 TEST_F(DocumentLoaderTest, DoNotLoadAvailablePartialData) {
771 TestClient client;
772 client.SetCanUsePartialLoading();
773 client.full_page_loader_data()->set_content_length(
774 DocumentLoader::default_request_size() * 20 + 58383);
775 DocumentLoader loader(&client);
776 loader.Init(client.CreateFullPageLoader(), "http://url.com");
777 // Send initial data from FullPageLoader.
778 client.full_page_loader_data()->CallReadCallback(
779 DocumentLoader::default_request_size());
780
781 // Send more data from FullPageLoader.
782 client.full_page_loader_data()->CallReadCallback(
783 DocumentLoader::default_request_size());
784
785 loader.RequestData(2 * DocumentLoader::default_request_size() + 200, 10);
786
787 // Send more data from FullPageLoader.
788 client.full_page_loader_data()->CallReadCallback(
789 DocumentLoader::default_request_size());
790
791 // Partial loading should not have started for already available data.
792 EXPECT_TRUE(client.partial_loader_data()->closed());
793 }
794
795 TEST_F(DocumentLoaderTest, DoNotLoadDataAfterComplete) {
796 TestClient client;
797 client.SetCanUsePartialLoading();
798 client.full_page_loader_data()->set_content_length(
799 DocumentLoader::default_request_size() * 20);
800 DocumentLoader loader(&client);
801 loader.Init(client.CreateFullPageLoader(), "http://url.com");
802
803 for (int i = 0; i < 20; ++i) {
804 client.full_page_loader_data()->CallReadCallback(
805 DocumentLoader::default_request_size());
806 }
807
808 EXPECT_TRUE(loader.IsDocumentComplete());
809
810 loader.RequestData(17 * DocumentLoader::default_request_size() + 200, 10);
811
812 EXPECT_TRUE(client.partial_loader_data()->closed());
813 EXPECT_TRUE(client.full_page_loader_data()->closed());
814 }
815
816 TEST_F(DocumentLoaderTest, DoNotLoadPartialDataAboveDocumentSize) {
817 TestClient client;
818 client.SetCanUsePartialLoading();
819 client.full_page_loader_data()->set_content_length(
820 DocumentLoader::default_request_size() * 20);
821 DocumentLoader loader(&client);
822 loader.Init(client.CreateFullPageLoader(), "http://url.com");
823
824 loader.RequestData(20 * DocumentLoader::default_request_size() + 200, 10);
825
826 // Send initial data from FullPageLoader.
827 client.full_page_loader_data()->CallReadCallback(
828 DocumentLoader::default_request_size());
829
830 EXPECT_TRUE(client.partial_loader_data()->closed());
831 }
832
833 TEST_F(DocumentLoaderTest, MergePendingRequests) {
834 TestClient client;
835 client.SetCanUsePartialLoading();
836 client.full_page_loader_data()->set_content_length(
837 DocumentLoader::default_request_size() * 50 + 58383);
838 DocumentLoader loader(&client);
839 loader.Init(client.CreateFullPageLoader(), "http://url.com");
840 loader.RequestData(17 * DocumentLoader::default_request_size() + 200, 10);
841 loader.RequestData(16 * DocumentLoader::default_request_size() + 600, 100);
842
843 // Send initial data from FullPageLoader.
844 client.full_page_loader_data()->CallReadCallback(
845 DocumentLoader::default_request_size());
846
847 const gfx::Range range_requested(16 * DocumentLoader::default_request_size(),
848 18 * DocumentLoader::default_request_size());
849 EXPECT_EQ(range_requested.start(),
850 client.partial_loader_data()->open_byte_range().start());
851 EXPECT_LE(range_requested.end(),
852 client.partial_loader_data()->open_byte_range().end());
853
854 EXPECT_TRUE(client.partial_loader_data()->IsWaitOpen());
855
856 // Fill all gaps.
857 while (!loader.IsDocumentComplete()) {
858 client.SendAllPartialData();
859 }
860 EXPECT_TRUE(client.partial_loader_data()->closed());
861 }
862
863 TEST_F(DocumentLoaderTest, PartialStopOnStatusCodeError) {
864 TestClient client;
865 client.SetCanUsePartialLoading();
866 client.full_page_loader_data()->set_content_length(
867 DocumentLoader::default_request_size() * 20);
868 DocumentLoader loader(&client);
869 loader.Init(client.CreateFullPageLoader(), "http://url.com");
870
871 loader.RequestData(17 * DocumentLoader::default_request_size() + 200, 10);
872
873 // Send initial data from FullPageLoader.
874 client.full_page_loader_data()->CallReadCallback(
875 DocumentLoader::default_request_size());
876
877 EXPECT_TRUE(client.partial_loader_data()->IsWaitOpen());
878 client.partial_loader_data()->set_status_code(404);
879 client.partial_loader_data()->CallOpenCallback(0);
880 EXPECT_TRUE(client.partial_loader_data()->closed());
881 }
882
883 TEST_F(DocumentLoaderTest,
884 PartialAsFullDocumentLoadingRangeRequestNoRangeField) {
885 TestClient client;
886 client.SetCanUsePartialLoading();
887 client.full_page_loader_data()->set_content_length(
888 DocumentLoader::default_request_size() * 20);
889 DocumentLoader loader(&client);
890 loader.Init(client.CreateFullPageLoader(), "http://url.com");
891
892 loader.RequestData(17 * DocumentLoader::default_request_size() + 200, 10);
893
894 // Send initial data from FullPageLoader.
895 client.full_page_loader_data()->CallReadCallback(
896 DocumentLoader::default_request_size());
897
898 EXPECT_TRUE(client.partial_loader_data()->IsWaitOpen());
899 client.partial_loader_data()->set_byte_range(gfx::Range::InvalidRange());
900 client.partial_loader_data()->CallOpenCallback(0);
901 EXPECT_FALSE(client.partial_loader_data()->closed());
902 // Partial loader is used to load the whole page, like full page loader.
903 EXPECT_FALSE(loader.is_partial_loader_active());
904 }
905
906 TEST_F(DocumentLoaderTest, PartialMultiPart) {
907 TestClient client;
908 client.SetCanUsePartialLoading();
909 client.full_page_loader_data()->set_content_length(
910 DocumentLoader::default_request_size() * 20);
911 DocumentLoader loader(&client);
912 loader.Init(client.CreateFullPageLoader(), "http://url.com");
913
914 loader.RequestData(17 * DocumentLoader::default_request_size() + 200, 10);
915
916 // Send initial data from FullPageLoader.
917 client.full_page_loader_data()->CallReadCallback(
918 DocumentLoader::default_request_size());
919
920 EXPECT_TRUE(client.partial_loader_data()->IsWaitOpen());
921 client.partial_loader_data()->set_is_multipart(true);
922 client.partial_loader_data()->CallOpenCallback(0);
923 client.partial_loader_data()->set_byte_range(
924 gfx::Range(17 * DocumentLoader::default_request_size(),
925 18 * DocumentLoader::default_request_size()));
926 client.partial_loader_data()->CallReadCallback(
927 DocumentLoader::default_request_size());
928 EXPECT_TRUE(
929 loader.IsDataAvailable(17 * DocumentLoader::default_request_size(),
930 DocumentLoader::default_request_size()));
931 }
932
933 TEST_F(DocumentLoaderTest, PartialMultiPartRangeError) {
934 TestClient client;
935 client.SetCanUsePartialLoading();
936 client.full_page_loader_data()->set_content_length(
937 DocumentLoader::default_request_size() * 20);
938 DocumentLoader loader(&client);
939 loader.Init(client.CreateFullPageLoader(), "http://url.com");
940
941 loader.RequestData(17 * DocumentLoader::default_request_size() + 200, 10);
942
943 // Send initial data from FullPageLoader.
944 client.full_page_loader_data()->CallReadCallback(
945 DocumentLoader::default_request_size());
946
947 EXPECT_TRUE(client.partial_loader_data()->IsWaitOpen());
948 client.partial_loader_data()->set_is_multipart(true);
949 client.partial_loader_data()->CallOpenCallback(0);
950 client.partial_loader_data()->set_byte_range(gfx::Range::InvalidRange());
951 client.partial_loader_data()->CallReadCallback(
952 DocumentLoader::default_request_size());
953 EXPECT_FALSE(
954 loader.IsDataAvailable(17 * DocumentLoader::default_request_size(),
955 DocumentLoader::default_request_size()));
956 EXPECT_TRUE(client.partial_loader_data()->closed());
957 }
958
959 TEST_F(DocumentLoaderTest, PartialConnectionErrorOnOpen) {
960 TestClient client;
961 client.SetCanUsePartialLoading();
962 client.full_page_loader_data()->set_content_length(
963 DocumentLoader::default_request_size() * 20);
964 DocumentLoader loader(&client);
965 loader.Init(client.CreateFullPageLoader(), "http://url.com");
966
967 loader.RequestData(17 * DocumentLoader::default_request_size() + 200, 10);
968
969 // Send initial data from FullPageLoader.
970 client.full_page_loader_data()->CallReadCallback(
971 DocumentLoader::default_request_size());
972
973 EXPECT_TRUE(client.partial_loader_data()->IsWaitOpen());
974 client.partial_loader_data()->CallOpenCallback(-3);
975 EXPECT_TRUE(client.partial_loader_data()->closed());
976
977 // Partial loading should not restart after any error.
978 loader.RequestData(18 * DocumentLoader::default_request_size() + 200, 10);
979
980 EXPECT_FALSE(client.partial_loader_data()->IsWaitOpen());
981 EXPECT_TRUE(client.partial_loader_data()->closed());
982 }
983
984 TEST_F(DocumentLoaderTest, PartialConnectionErrorOnRead) {
985 TestClient client;
986 client.SetCanUsePartialLoading();
987 client.full_page_loader_data()->set_content_length(
988 DocumentLoader::default_request_size() * 20);
989 DocumentLoader loader(&client);
990 loader.Init(client.CreateFullPageLoader(), "http://url.com");
991
992 loader.RequestData(17 * DocumentLoader::default_request_size() + 200, 10);
993
994 // Send initial data from FullPageLoader.
995 client.full_page_loader_data()->CallReadCallback(
996 DocumentLoader::default_request_size());
997
998 EXPECT_TRUE(client.partial_loader_data()->IsWaitOpen());
999 client.partial_loader_data()->set_byte_range(
1000 gfx::Range(17 * DocumentLoader::default_request_size(),
1001 18 * DocumentLoader::default_request_size()));
1002 client.partial_loader_data()->CallOpenCallback(0);
1003 EXPECT_TRUE(client.partial_loader_data()->IsWaitRead());
1004 client.partial_loader_data()->CallReadCallback(-3);
1005 EXPECT_TRUE(client.partial_loader_data()->closed());
1006
1007 // Partial loading should not restart after any error.
1008 loader.RequestData(18 * DocumentLoader::default_request_size() + 200, 10);
1009
1010 EXPECT_FALSE(client.partial_loader_data()->IsWaitOpen());
1011 EXPECT_TRUE(client.partial_loader_data()->closed());
1012 }
1013
1014 TEST_F(DocumentLoaderTest, GetProgress) {
1015 TestClient client;
1016 client.SetCanUsePartialLoading();
1017 client.full_page_loader_data()->set_content_length(
1018 DocumentLoader::default_request_size() * 20);
1019 DocumentLoader loader(&client);
1020 loader.Init(client.CreateFullPageLoader(), "http://url.com");
1021 EXPECT_EQ(0., loader.GetProgress());
1022
1023 for (int i = 0; i < 20; ++i) {
1024 EXPECT_EQ(i * 100 / 20, static_cast<int>(loader.GetProgress() * 100));
1025 client.full_page_loader_data()->CallReadCallback(
1026 DocumentLoader::default_request_size());
1027 }
1028 EXPECT_EQ(1., loader.GetProgress());
1029 }
1030
1031 TEST_F(DocumentLoaderTest, GetProgressNoContentLength) {
1032 TestClient client;
1033 DocumentLoader loader(&client);
1034 loader.Init(client.CreateFullPageLoader(), "http://url.com");
1035 EXPECT_EQ(-1., loader.GetProgress());
1036
1037 for (int i = 0; i < 20; ++i) {
1038 EXPECT_EQ(-1., loader.GetProgress());
1039 client.full_page_loader_data()->CallReadCallback(
1040 DocumentLoader::default_request_size());
1041 }
1042 client.full_page_loader_data()->CallReadCallback(0);
1043 EXPECT_EQ(1., loader.GetProgress());
1044 }
1045
1046 TEST_F(DocumentLoaderTest, ClientCompleteCallbacks) {
1047 MockClient client;
1048 client.SetCanUsePartialLoading();
1049 client.full_page_loader_data()->set_content_length(
1050 DocumentLoader::default_request_size() * 20);
1051 DocumentLoader loader(&client);
1052 loader.Init(client.CreateFullPageLoader(), "http://url.com");
1053
1054 EXPECT_CALL(client, OnDocumentComplete()).Times(0);
1055 for (int i = 0; i < 19; ++i) {
1056 client.full_page_loader_data()->CallReadCallback(
1057 DocumentLoader::default_request_size());
1058 }
1059 Mock::VerifyAndClear(&client);
1060
1061 EXPECT_CALL(client, OnDocumentComplete()).Times(1);
1062 client.full_page_loader_data()->CallReadCallback(
1063 DocumentLoader::default_request_size());
1064 Mock::VerifyAndClear(&client);
1065 }
1066
1067 TEST_F(DocumentLoaderTest, ClientCompleteCallbacksNoContentLength) {
1068 MockClient client;
1069 DocumentLoader loader(&client);
1070 loader.Init(client.CreateFullPageLoader(), "http://url.com");
1071
1072 EXPECT_CALL(client, OnDocumentCanceled()).Times(0);
1073 EXPECT_CALL(client, OnDocumentComplete()).Times(0);
1074 for (int i = 0; i < 20; ++i) {
1075 client.full_page_loader_data()->CallReadCallback(
1076 DocumentLoader::default_request_size());
1077 }
1078 Mock::VerifyAndClear(&client);
1079
1080 EXPECT_CALL(client, OnDocumentCanceled()).Times(0);
1081 EXPECT_CALL(client, OnDocumentComplete()).Times(1);
1082 client.full_page_loader_data()->CallReadCallback(0);
1083 Mock::VerifyAndClear(&client);
1084 }
1085
1086 TEST_F(DocumentLoaderTest, ClientCancelCallback) {
1087 MockClient client;
1088 client.SetCanUsePartialLoading();
1089 client.full_page_loader_data()->set_content_length(
1090 DocumentLoader::default_request_size() * 20);
1091 DocumentLoader loader(&client);
1092 loader.Init(client.CreateFullPageLoader(), "http://url.com");
1093
1094 EXPECT_CALL(client, OnDocumentCanceled()).Times(0);
1095 EXPECT_CALL(client, OnDocumentComplete()).Times(0);
1096 for (int i = 0; i < 10; ++i) {
1097 client.full_page_loader_data()->CallReadCallback(
1098 DocumentLoader::default_request_size());
1099 }
1100 Mock::VerifyAndClear(&client);
1101
1102 EXPECT_CALL(client, OnDocumentComplete()).Times(0);
1103 EXPECT_CALL(client, OnDocumentCanceled()).Times(1);
1104 client.full_page_loader_data()->CallReadCallback(-3);
1105 Mock::VerifyAndClear(&client);
1106 }
1107
1108 TEST_F(DocumentLoaderTest, NewDataAvailable) {
1109 MockClient client;
1110 client.SetCanUsePartialLoading();
1111 client.full_page_loader_data()->set_content_length(
1112 DocumentLoader::default_request_size() * 20);
1113 DocumentLoader loader(&client);
1114 loader.Init(client.CreateFullPageLoader(), "http://url.com");
1115
1116 EXPECT_CALL(client, OnNewDataAvailable()).Times(1);
1117 client.full_page_loader_data()->CallReadCallback(
1118 DocumentLoader::default_request_size());
1119 Mock::VerifyAndClear(&client);
1120
1121 EXPECT_CALL(client, OnNewDataAvailable()).Times(0);
1122 client.full_page_loader_data()->CallReadCallback(
1123 DocumentLoader::default_request_size() - 100);
1124 Mock::VerifyAndClear(&client);
1125
1126 EXPECT_CALL(client, OnNewDataAvailable()).Times(1);
1127 client.full_page_loader_data()->CallReadCallback(100);
1128 Mock::VerifyAndClear(&client);
1129 }
1130
1131 TEST_F(DocumentLoaderTest, ClientPendingRequestCompleteFullLoader) {
1132 MockClient client;
1133 client.SetCanUsePartialLoading();
1134 DocumentLoader loader(&client);
1135 loader.Init(client.CreateFullPageLoader(), "http://url.com");
1136
1137 loader.RequestData(1000, 4000);
1138
1139 EXPECT_CALL(client, OnPendingRequestComplete()).Times(1);
1140 client.full_page_loader_data()->CallReadCallback(
1141 DocumentLoader::default_request_size());
1142 Mock::VerifyAndClear(&client);
1143 }
1144
1145 TEST_F(DocumentLoaderTest, ClientPendingRequestCompletePartialLoader) {
1146 MockClient client;
1147 client.SetCanUsePartialLoading();
1148 DocumentLoader loader(&client);
1149 loader.Init(client.CreateFullPageLoader(), "http://url.com");
1150
1151 EXPECT_CALL(client, OnPendingRequestComplete()).Times(1);
1152 loader.RequestData(15 * DocumentLoader::default_request_size() + 4000, 4000);
1153
1154 // Always send initial data from FullPageLoader.
1155 client.full_page_loader_data()->CallReadCallback(
1156 DocumentLoader::default_request_size());
1157
1158 client.SendAllPartialData();
1159 Mock::VerifyAndClear(&client);
1160 }
1161
1162 TEST_F(DocumentLoaderTest, ClientPendingRequestCompletePartialAndFullLoader) {
1163 MockClient client;
1164 client.SetCanUsePartialLoading();
1165 DocumentLoader loader(&client);
1166 loader.Init(client.CreateFullPageLoader(), "http://url.com");
1167
1168 EXPECT_CALL(client, OnPendingRequestComplete()).Times(1);
1169 loader.RequestData(16 * DocumentLoader::default_request_size() + 4000, 4000);
1170 loader.RequestData(4 * DocumentLoader::default_request_size() + 4000, 4000);
1171
1172 for (int i = 0; i < 5; ++i) {
1173 client.full_page_loader_data()->CallReadCallback(
1174 DocumentLoader::default_request_size());
1175 }
1176
1177 Mock::VerifyAndClear(&client);
1178
1179 EXPECT_CALL(client, OnPendingRequestComplete()).Times(1);
1180 client.SendAllPartialData();
1181 Mock::VerifyAndClear(&client);
1182 }
1183
1184 } // namespace chrome_pdf
OLDNEW
« no previous file with comments | « pdf/document_loader.cc ('k') | pdf/out_of_process_instance.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698