blob: 49ac373de4780e33ea9eb003a68897b0ace0ff58 [file] [log] [blame]
Artem Stryginaf1b43422017-09-12 18:48:241// 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
Lei Zhange98901a2018-04-25 23:23:595#include "pdf/document_loader_impl.h"
Artem Stryginaf1b43422017-09-12 18:48:246
Lei Zhang02a3a0f2017-12-11 20:25:487#include <algorithm>
Artem Stryginaf1b43422017-09-12 18:48:248#include <memory>
9#include <string>
Lei Zhang533165f2018-02-27 19:09:1010#include <vector>
Artem Stryginaf1b43422017-09-12 18:48:2411
Hans Wennborg5078d102020-04-29 18:26:4612#include "base/check.h"
Artem Stryginaf1b43422017-09-12 18:48:2413#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"
17
18using ::testing::_;
19using ::testing::Mock;
Artem Stryginaf1b43422017-09-12 18:48:2420using ::testing::NiceMock;
21using ::testing::Return;
Lei Zhangad086172020-06-30 05:53:4622using ::testing::Sequence;
Artem Stryginaf1b43422017-09-12 18:48:2423
24namespace chrome_pdf {
25
26namespace {
27
Lei Zhange98901a2018-04-25 23:23:5928constexpr uint32_t kDefaultRequestSize =
29 DocumentLoaderImpl::kDefaultRequestSize;
Lei Zhang533165f2018-02-27 19:09:1030
Artem Stryginaf1b43422017-09-12 18:48:2431class TestURLLoader : public URLLoaderWrapper {
32 public:
33 class LoaderData {
34 public:
Chris Watkinsda547692017-11-30 03:49:2435 LoaderData() = default;
Artem Stryginaf1b43422017-09-12 18:48:2436 ~LoaderData() {
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.
40 if (IsWaitRead())
41 CallReadCallback(-1);
42 if (IsWaitOpen())
43 CallOpenCallback(-1);
44 }
45
46 int content_length() const { return content_length_; }
47 void set_content_length(int content_length) {
48 content_length_ = content_length;
49 }
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;
53 }
54 bool content_encoded() const { return content_encoded_; }
55 void set_content_encoded(bool content_encoded) {
56 content_encoded_ = content_encoded;
57 }
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;
61 }
62 const std::string& content_disposition() const {
63 return content_disposition_;
64 }
65 void set_content_disposition(const std::string& content_disposition) {
66 content_disposition_ = content_disposition;
67 }
68 const std::string& multipart_boundary() const {
69 return multipart_boundary_;
70 }
71 void set_multipart_boundary(const std::string& multipart_boundary) {
72 multipart_boundary_ = multipart_boundary;
73 }
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;
77 }
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;
87 }
88
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_; }
93
94 void SetReadCallback(const pp::CompletionCallback& read_callback,
95 char* buffer,
96 int buffer_size) {
97 did_read_callback_ = read_callback;
98 buffer_ = buffer;
99 buffer_size_ = buffer_size;
100 }
101
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);
106 }
107
108 void CallOpenCallback(int result) {
109 DCHECK(IsWaitOpen());
110 did_open_callback_.RunAndClear(result);
111 }
112
113 void CallReadCallback(int result) {
114 DCHECK(IsWaitRead());
115 did_read_callback_.RunAndClear(result);
116 }
117
118 private:
119 pp::CompletionCallback did_open_callback_;
120 pp::CompletionCallback did_read_callback_;
121 char* buffer_ = nullptr;
122 int buffer_size_ = 0;
123
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;
133 bool closed_ = true;
134 gfx::Range open_byte_range_ = gfx::Range::InvalidRange();
135
136 DISALLOW_COPY_AND_ASSIGN(LoaderData);
137 };
138
139 explicit TestURLLoader(LoaderData* data) : data_(data) {
140 data_->set_closed(false);
141 }
142
143 ~TestURLLoader() override { Close(); }
144
145 int GetContentLength() const override { return data_->content_length(); }
146
147 bool IsAcceptRangesBytes() const override {
148 return data_->accept_ranges_bytes();
149 }
150
151 bool IsContentEncoded() const override { return data_->content_encoded(); }
152
153 std::string GetContentType() const override { return data_->content_type(); }
154
155 std::string GetContentDisposition() const override {
156 return data_->content_disposition();
157 }
158
159 int GetStatusCode() const override { return data_->status_code(); }
160
161 bool IsMultipart() const override { return data_->is_multipart(); }
162
Lei Zhang02a3a0f2017-12-11 20:25:48163 bool GetByteRangeStart(int* start) const override {
Artem Stryginaf1b43422017-09-12 18:48:24164 *start = data_->byte_range().start();
Artem Stryginaf1b43422017-09-12 18:48:24165 return data_->byte_range().IsValid();
166 }
167
168 void Close() override { data_->set_closed(true); }
169
170 void OpenRange(const std::string& url,
171 const std::string& referrer_url,
172 uint32_t position,
173 uint32_t size,
174 const pp::CompletionCallback& cc) override {
175 data_->SetOpenCallback(cc, gfx::Range(position, position + size));
176 }
177
178 void ReadResponseBody(char* buffer,
179 int buffer_size,
180 const pp::CompletionCallback& cc) override {
181 data_->SetReadCallback(cc, buffer, buffer_size);
182 }
183
184 bool GetDownloadProgress(int64_t* bytes_received,
185 int64_t* total_bytes_to_be_received) const override {
186 return false;
187 }
188
189 private:
190 LoaderData* data_;
191
192 DISALLOW_COPY_AND_ASSIGN(TestURLLoader);
193};
194
195class TestClient : public DocumentLoader::Client {
196 public:
197 TestClient() { full_page_loader_data()->set_content_type("application/pdf"); }
Chris Watkinsda547692017-11-30 03:49:24198 ~TestClient() override = default;
Artem Stryginaf1b43422017-09-12 18:48:24199
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()));
205 }
206 void OnPendingRequestComplete() override {}
207 void OnNewDataReceived() override {}
208 void OnDocumentComplete() override {}
209 void OnDocumentCanceled() override {}
Artem Stryginaf1b43422017-09-12 18:48:24210
211 std::unique_ptr<URLLoaderWrapper> CreateFullPageLoader() {
212 return std::unique_ptr<URLLoaderWrapper>(
213 new TestURLLoader(full_page_loader_data()));
214 }
215
216 TestURLLoader::LoaderData* full_page_loader_data() {
217 return &full_page_loader_data_;
218 }
219 TestURLLoader::LoaderData* partial_loader_data() {
220 return &partial_loader_data_;
221 }
222
223 void SetCanUsePartialLoading() {
224 full_page_loader_data()->set_content_length(10 * 1024 * 1024);
225 full_page_loader_data()->set_content_encoded(false);
226 full_page_loader_data()->set_accept_ranges_bytes(true);
227 }
228
229 void SendAllPartialData() {
230 partial_loader_data_.set_byte_range(partial_loader_data_.open_byte_range());
231 partial_loader_data_.CallOpenCallback(0);
232 uint32_t length = partial_loader_data_.byte_range().length();
233 while (length > 0) {
Henrique Nakashima1c5da8e2018-10-05 21:56:43234 constexpr uint32_t max_part_len = kDefaultRequestSize;
Artem Stryginaf1b43422017-09-12 18:48:24235 const uint32_t part_len = std::min(length, max_part_len);
236 partial_loader_data_.CallReadCallback(part_len);
237 length -= part_len;
238 }
239 if (partial_loader_data_.IsWaitRead()) {
240 partial_loader_data_.CallReadCallback(0);
241 }
242 }
243
244 private:
245 TestURLLoader::LoaderData full_page_loader_data_;
246 TestURLLoader::LoaderData partial_loader_data_;
247
248 DISALLOW_COPY_AND_ASSIGN(TestClient);
249};
250
251class MockClient : public TestClient {
252 public:
Chris Watkinsda547692017-11-30 03:49:24253 MockClient() = default;
Artem Stryginaf1b43422017-09-12 18:48:24254
255 MOCK_METHOD0(OnPendingRequestComplete, void());
256 MOCK_METHOD0(OnNewDataReceived, void());
257 MOCK_METHOD0(OnDocumentComplete, void());
258 MOCK_METHOD0(OnDocumentCanceled, void());
259
260 private:
261 DISALLOW_COPY_AND_ASSIGN(MockClient);
262};
263
264} // namespace
265
Lei Zhange98901a2018-04-25 23:23:59266using DocumentLoaderImplTest = ::testing::Test;
Artem Stryginaf1b43422017-09-12 18:48:24267
Lei Zhange98901a2018-04-25 23:23:59268TEST_F(DocumentLoaderImplTest, PartialLoadingEnabled) {
Artem Stryginaf1b43422017-09-12 18:48:24269 TestClient client;
270 client.SetCanUsePartialLoading();
Lei Zhange98901a2018-04-25 23:23:59271 DocumentLoaderImpl loader(&client);
Artem Stryginaf1b43422017-09-12 18:48:24272 loader.Init(client.CreateFullPageLoader(), "http://url.com");
273 loader.RequestData(1000000, 1);
274 EXPECT_FALSE(loader.is_partial_loader_active());
275 // Always send initial data from FullPageLoader.
Lei Zhang533165f2018-02-27 19:09:10276 client.full_page_loader_data()->CallReadCallback(kDefaultRequestSize);
Artem Stryginaf1b43422017-09-12 18:48:24277 EXPECT_TRUE(loader.is_partial_loader_active());
278}
279
Lei Zhange98901a2018-04-25 23:23:59280TEST_F(DocumentLoaderImplTest, PartialLoadingDisabledOnSmallFiles) {
Artem Stryginaf1b43422017-09-12 18:48:24281 TestClient client;
282 client.SetCanUsePartialLoading();
Lei Zhang533165f2018-02-27 19:09:10283 client.full_page_loader_data()->set_content_length(kDefaultRequestSize * 2);
Lei Zhange98901a2018-04-25 23:23:59284 DocumentLoaderImpl loader(&client);
Artem Stryginaf1b43422017-09-12 18:48:24285 loader.Init(client.CreateFullPageLoader(), "http://url.com");
286 loader.RequestData(1000000, 1);
287 EXPECT_FALSE(loader.is_partial_loader_active());
288 // Always send initial data from FullPageLoader.
Lei Zhang533165f2018-02-27 19:09:10289 client.full_page_loader_data()->CallReadCallback(kDefaultRequestSize);
Artem Stryginaf1b43422017-09-12 18:48:24290 EXPECT_FALSE(loader.is_partial_loader_active());
291}
292
Lei Zhange98901a2018-04-25 23:23:59293TEST_F(DocumentLoaderImplTest, PartialLoadingDisabledIfContentEncoded) {
Artem Stryginaf1b43422017-09-12 18:48:24294 TestClient client;
295 client.SetCanUsePartialLoading();
296 client.full_page_loader_data()->set_content_encoded(true);
Lei Zhange98901a2018-04-25 23:23:59297 DocumentLoaderImpl loader(&client);
Artem Stryginaf1b43422017-09-12 18:48:24298 loader.Init(client.CreateFullPageLoader(), "http://url.com");
299 loader.RequestData(1000000, 1);
300 EXPECT_FALSE(loader.is_partial_loader_active());
301 // Always send initial data from FullPageLoader.
Lei Zhang533165f2018-02-27 19:09:10302 client.full_page_loader_data()->CallReadCallback(kDefaultRequestSize);
Artem Stryginaf1b43422017-09-12 18:48:24303 EXPECT_FALSE(loader.is_partial_loader_active());
304}
305
Lei Zhange98901a2018-04-25 23:23:59306TEST_F(DocumentLoaderImplTest, PartialLoadingDisabledNoAcceptRangeBytes) {
Artem Stryginaf1b43422017-09-12 18:48:24307 TestClient client;
308 client.SetCanUsePartialLoading();
309 client.full_page_loader_data()->set_accept_ranges_bytes(false);
Lei Zhange98901a2018-04-25 23:23:59310 DocumentLoaderImpl loader(&client);
Artem Stryginaf1b43422017-09-12 18:48:24311 loader.Init(client.CreateFullPageLoader(), "http://url.com");
312 loader.RequestData(1000000, 1);
313 EXPECT_FALSE(loader.is_partial_loader_active());
314 // Always send initial data from FullPageLoader.
Lei Zhang533165f2018-02-27 19:09:10315 client.full_page_loader_data()->CallReadCallback(kDefaultRequestSize);
Artem Stryginaf1b43422017-09-12 18:48:24316 EXPECT_FALSE(loader.is_partial_loader_active());
317}
318
Lei Zhange98901a2018-04-25 23:23:59319TEST_F(DocumentLoaderImplTest, PartialLoadingReallyDisabledRequestFromBegin) {
Artem Stryginaf1b43422017-09-12 18:48:24320 TestClient client;
Lei Zhange98901a2018-04-25 23:23:59321 DocumentLoaderImpl loader(&client);
Artem Stryginaf1b43422017-09-12 18:48:24322 client.SetCanUsePartialLoading();
323 loader.SetPartialLoadingEnabled(false);
324 loader.Init(client.CreateFullPageLoader(), "http://url.com");
325 // We should not start partial loading if requested data is beside full page
326 // loading position.
Lei Zhang533165f2018-02-27 19:09:10327 loader.RequestData(kDefaultRequestSize, 1);
Artem Stryginaf1b43422017-09-12 18:48:24328 EXPECT_FALSE(loader.is_partial_loader_active());
329 // Always send initial data from FullPageLoader.
Lei Zhang533165f2018-02-27 19:09:10330 client.full_page_loader_data()->CallReadCallback(kDefaultRequestSize);
Artem Stryginaf1b43422017-09-12 18:48:24331 EXPECT_FALSE(loader.is_partial_loader_active());
332}
333
Lei Zhange98901a2018-04-25 23:23:59334TEST_F(DocumentLoaderImplTest, PartialLoadingReallyDisabledRequestFromMiddle) {
Artem Stryginaf1b43422017-09-12 18:48:24335 TestClient client;
336 client.SetCanUsePartialLoading();
Lei Zhange98901a2018-04-25 23:23:59337 DocumentLoaderImpl loader(&client);
Artem Stryginaf1b43422017-09-12 18:48:24338 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.
Lei Zhang533165f2018-02-27 19:09:10343 client.full_page_loader_data()->CallReadCallback(kDefaultRequestSize);
Artem Stryginaf1b43422017-09-12 18:48:24344 EXPECT_FALSE(loader.is_partial_loader_active());
345}
346
Lei Zhange98901a2018-04-25 23:23:59347TEST_F(DocumentLoaderImplTest, PartialLoadingSimple) {
Artem Stryginaf1b43422017-09-12 18:48:24348 TestClient client;
349 client.SetCanUsePartialLoading();
350
Lei Zhange98901a2018-04-25 23:23:59351 DocumentLoaderImpl loader(&client);
Artem Stryginaf1b43422017-09-12 18:48:24352 loader.Init(client.CreateFullPageLoader(), "http://url.com");
353
354 // While we have no requests, we should not start partial loading.
355 EXPECT_FALSE(loader.is_partial_loader_active());
356
357 loader.RequestData(5000000, 1);
358
359 EXPECT_FALSE(client.partial_loader_data()->IsWaitOpen());
360 EXPECT_FALSE(loader.is_partial_loader_active());
361
362 // Always send initial data from FullPageLoader.
Lei Zhang533165f2018-02-27 19:09:10363 client.full_page_loader_data()->CallReadCallback(kDefaultRequestSize);
Artem Stryginaf1b43422017-09-12 18:48:24364
365 // Partial loader should request headers.
366 EXPECT_TRUE(client.partial_loader_data()->IsWaitOpen());
367 EXPECT_TRUE(loader.is_partial_loader_active());
368 // Loader should be stopped.
369 EXPECT_TRUE(client.full_page_loader_data()->closed());
370
371 EXPECT_EQ("{4980736,10485760}",
372 client.partial_loader_data()->open_byte_range().ToString());
373}
374
Lei Zhange98901a2018-04-25 23:23:59375TEST_F(DocumentLoaderImplTest, PartialLoadingBackOrder) {
Artem Stryginaf1b43422017-09-12 18:48:24376 TestClient client;
377 client.SetCanUsePartialLoading();
378
Lei Zhange98901a2018-04-25 23:23:59379 DocumentLoaderImpl loader(&client);
Artem Stryginaf1b43422017-09-12 18:48:24380 loader.Init(client.CreateFullPageLoader(), "http://url.com");
381
382 // While we have no requests, we should not start partial loading.
383 EXPECT_FALSE(loader.is_partial_loader_active());
384
385 loader.RequestData(client.full_page_loader_data()->content_length() - 1, 1);
386
387 EXPECT_FALSE(client.partial_loader_data()->IsWaitOpen());
388 EXPECT_FALSE(loader.is_partial_loader_active());
389
390 // Always send initial data from FullPageLoader.
Lei Zhang533165f2018-02-27 19:09:10391 client.full_page_loader_data()->CallReadCallback(kDefaultRequestSize);
Artem Stryginaf1b43422017-09-12 18:48:24392
393 // Partial loader should request headers.
394 EXPECT_TRUE(client.partial_loader_data()->IsWaitOpen());
395 EXPECT_TRUE(loader.is_partial_loader_active());
396 // Loader should be stopped.
397 EXPECT_TRUE(client.full_page_loader_data()->closed());
398
399 // Requested range should be enlarged.
400 EXPECT_GT(client.partial_loader_data()->open_byte_range().length(), 1u);
401 EXPECT_EQ("{9830400,10485760}",
402 client.partial_loader_data()->open_byte_range().ToString());
403}
404
Lei Zhange98901a2018-04-25 23:23:59405TEST_F(DocumentLoaderImplTest, CompleteWithoutPartial) {
Artem Stryginaf1b43422017-09-12 18:48:24406 TestClient client;
407 client.SetCanUsePartialLoading();
Lei Zhange98901a2018-04-25 23:23:59408 DocumentLoaderImpl loader(&client);
Artem Stryginaf1b43422017-09-12 18:48:24409 loader.Init(client.CreateFullPageLoader(), "http://url.com");
410 EXPECT_FALSE(client.full_page_loader_data()->closed());
411 while (client.full_page_loader_data()->IsWaitRead()) {
412 client.full_page_loader_data()->CallReadCallback(1000);
413 }
414 EXPECT_TRUE(loader.IsDocumentComplete());
415 EXPECT_TRUE(client.full_page_loader_data()->closed());
416}
417
Lei Zhange98901a2018-04-25 23:23:59418TEST_F(DocumentLoaderImplTest, ErrorDownloadFullDocument) {
Artem Stryginaf1b43422017-09-12 18:48:24419 TestClient client;
420 client.SetCanUsePartialLoading();
Lei Zhange98901a2018-04-25 23:23:59421 DocumentLoaderImpl loader(&client);
Artem Stryginaf1b43422017-09-12 18:48:24422 loader.Init(client.CreateFullPageLoader(), "http://url.com");
423 EXPECT_TRUE(client.full_page_loader_data()->IsWaitRead());
424 EXPECT_FALSE(client.full_page_loader_data()->closed());
425 client.full_page_loader_data()->CallReadCallback(-3);
426 EXPECT_TRUE(client.full_page_loader_data()->closed());
427 EXPECT_FALSE(loader.IsDocumentComplete());
428}
429
Lei Zhange98901a2018-04-25 23:23:59430TEST_F(DocumentLoaderImplTest, CompleteNoContentLength) {
Artem Stryginaf1b43422017-09-12 18:48:24431 TestClient client;
Lei Zhange98901a2018-04-25 23:23:59432 DocumentLoaderImpl loader(&client);
Artem Stryginaf1b43422017-09-12 18:48:24433 loader.Init(client.CreateFullPageLoader(), "http://url.com");
434 EXPECT_FALSE(client.full_page_loader_data()->closed());
435 for (int i = 0; i < 10; ++i) {
436 EXPECT_TRUE(client.full_page_loader_data()->IsWaitRead());
437 client.full_page_loader_data()->CallReadCallback(1000);
438 }
439 EXPECT_TRUE(client.full_page_loader_data()->IsWaitRead());
440 client.full_page_loader_data()->CallReadCallback(0);
441 EXPECT_EQ(10000ul, loader.GetDocumentSize());
442 EXPECT_TRUE(loader.IsDocumentComplete());
443 EXPECT_TRUE(client.full_page_loader_data()->closed());
444}
445
Lei Zhange98901a2018-04-25 23:23:59446TEST_F(DocumentLoaderImplTest, CompleteWithPartial) {
Artem Stryginaf1b43422017-09-12 18:48:24447 TestClient client;
448 client.SetCanUsePartialLoading();
Lei Zhang533165f2018-02-27 19:09:10449 client.full_page_loader_data()->set_content_length(kDefaultRequestSize * 20);
Lei Zhange98901a2018-04-25 23:23:59450 DocumentLoaderImpl loader(&client);
Artem Stryginaf1b43422017-09-12 18:48:24451 loader.Init(client.CreateFullPageLoader(), "http://url.com");
Lei Zhang533165f2018-02-27 19:09:10452 loader.RequestData(19 * kDefaultRequestSize, kDefaultRequestSize);
Artem Stryginaf1b43422017-09-12 18:48:24453 EXPECT_FALSE(client.full_page_loader_data()->closed());
454 EXPECT_FALSE(client.partial_loader_data()->IsWaitRead());
455 EXPECT_FALSE(client.partial_loader_data()->IsWaitOpen());
456
457 // Always send initial data from FullPageLoader.
Lei Zhang533165f2018-02-27 19:09:10458 client.full_page_loader_data()->CallReadCallback(kDefaultRequestSize);
Artem Stryginaf1b43422017-09-12 18:48:24459 EXPECT_TRUE(client.full_page_loader_data()->closed());
460 EXPECT_FALSE(client.partial_loader_data()->closed());
461
462 client.SendAllPartialData();
463 // Now we should send other document data.
464 client.SendAllPartialData();
465 EXPECT_TRUE(client.full_page_loader_data()->closed());
466 EXPECT_TRUE(client.partial_loader_data()->closed());
467}
468
Lei Zhange98901a2018-04-25 23:23:59469TEST_F(DocumentLoaderImplTest, PartialRequestLastChunk) {
Henrique Nakashima1c5da8e2018-10-05 21:56:43470 constexpr uint32_t kLastChunkSize = 300;
Artem Stryginaf1b43422017-09-12 18:48:24471 TestClient client;
472 client.SetCanUsePartialLoading();
Lei Zhang533165f2018-02-27 19:09:10473 client.full_page_loader_data()->set_content_length(kDefaultRequestSize * 20 +
474 kLastChunkSize);
Lei Zhange98901a2018-04-25 23:23:59475 DocumentLoaderImpl loader(&client);
Artem Stryginaf1b43422017-09-12 18:48:24476 loader.Init(client.CreateFullPageLoader(), "http://url.com");
Lei Zhang533165f2018-02-27 19:09:10477 loader.RequestData(20 * kDefaultRequestSize, 1);
Artem Stryginaf1b43422017-09-12 18:48:24478
479 // Always send initial data from FullPageLoader.
Lei Zhang533165f2018-02-27 19:09:10480 client.full_page_loader_data()->CallReadCallback(kDefaultRequestSize);
Artem Stryginaf1b43422017-09-12 18:48:24481
482 EXPECT_TRUE(client.partial_loader_data()->IsWaitOpen());
483 EXPECT_EQ(
484 static_cast<int>(client.partial_loader_data()->open_byte_range().end()),
485 client.full_page_loader_data()->content_length());
486 client.partial_loader_data()->set_byte_range(
487 client.partial_loader_data()->open_byte_range());
488 client.partial_loader_data()->CallOpenCallback(0);
489 uint32_t data_length = client.partial_loader_data()->byte_range().length();
Lei Zhang533165f2018-02-27 19:09:10490 while (data_length > kDefaultRequestSize) {
491 client.partial_loader_data()->CallReadCallback(kDefaultRequestSize);
492 data_length -= kDefaultRequestSize;
Artem Stryginaf1b43422017-09-12 18:48:24493 }
494 EXPECT_EQ(kLastChunkSize, data_length);
495 client.partial_loader_data()->CallReadCallback(kLastChunkSize);
Lei Zhang533165f2018-02-27 19:09:10496 EXPECT_TRUE(loader.IsDataAvailable(kDefaultRequestSize * 20, kLastChunkSize));
Artem Stryginaf1b43422017-09-12 18:48:24497}
498
Lei Zhange98901a2018-04-25 23:23:59499TEST_F(DocumentLoaderImplTest, DocumentSize) {
Artem Stryginaf1b43422017-09-12 18:48:24500 TestClient client;
501 client.SetCanUsePartialLoading();
502 client.full_page_loader_data()->set_content_length(123456789);
Lei Zhange98901a2018-04-25 23:23:59503 DocumentLoaderImpl loader(&client);
Artem Stryginaf1b43422017-09-12 18:48:24504 loader.Init(client.CreateFullPageLoader(), "http://url.com");
505 EXPECT_EQ(static_cast<int>(loader.GetDocumentSize()),
506 client.full_page_loader_data()->content_length());
507}
508
Lei Zhange98901a2018-04-25 23:23:59509TEST_F(DocumentLoaderImplTest, DocumentSizeNoContentLength) {
Artem Stryginaf1b43422017-09-12 18:48:24510 TestClient client;
Lei Zhange98901a2018-04-25 23:23:59511 DocumentLoaderImpl loader(&client);
Artem Stryginaf1b43422017-09-12 18:48:24512 loader.Init(client.CreateFullPageLoader(), "http://url.com");
513 EXPECT_EQ(0ul, loader.GetDocumentSize());
Lei Zhang533165f2018-02-27 19:09:10514 client.full_page_loader_data()->CallReadCallback(kDefaultRequestSize);
Artem Stryginaf1b43422017-09-12 18:48:24515 client.full_page_loader_data()->CallReadCallback(1000);
516 client.full_page_loader_data()->CallReadCallback(500);
517 client.full_page_loader_data()->CallReadCallback(0);
Lei Zhang533165f2018-02-27 19:09:10518 EXPECT_EQ(kDefaultRequestSize + 1000ul + 500ul, loader.GetDocumentSize());
Artem Stryginaf1b43422017-09-12 18:48:24519 EXPECT_TRUE(loader.IsDocumentComplete());
520}
521
Lei Zhange98901a2018-04-25 23:23:59522TEST_F(DocumentLoaderImplTest, ClearPendingRequests) {
Artem Stryginaf1b43422017-09-12 18:48:24523 TestClient client;
524 client.SetCanUsePartialLoading();
Lei Zhang533165f2018-02-27 19:09:10525 client.full_page_loader_data()->set_content_length(kDefaultRequestSize * 100 +
526 58383);
Lei Zhange98901a2018-04-25 23:23:59527 DocumentLoaderImpl loader(&client);
Artem Stryginaf1b43422017-09-12 18:48:24528 loader.Init(client.CreateFullPageLoader(), "http://url.com");
Lei Zhang533165f2018-02-27 19:09:10529 loader.RequestData(17 * kDefaultRequestSize + 100, 10);
Artem Stryginaf1b43422017-09-12 18:48:24530 loader.ClearPendingRequests();
Lei Zhang533165f2018-02-27 19:09:10531 loader.RequestData(15 * kDefaultRequestSize + 200, 20);
Artem Stryginaf1b43422017-09-12 18:48:24532 // pending requests are accumulating, and will be processed after initial data
533 // load.
534 EXPECT_FALSE(client.partial_loader_data()->IsWaitOpen());
535
536 // Send initial data from FullPageLoader.
Lei Zhang533165f2018-02-27 19:09:10537 client.full_page_loader_data()->CallReadCallback(kDefaultRequestSize);
Artem Stryginaf1b43422017-09-12 18:48:24538
539 {
540 EXPECT_TRUE(client.partial_loader_data()->IsWaitOpen());
Henrique Nakashima1c5da8e2018-10-05 21:56:43541 constexpr gfx::Range range_requested(15 * kDefaultRequestSize,
542 16 * kDefaultRequestSize);
Artem Stryginaf1b43422017-09-12 18:48:24543 EXPECT_EQ(range_requested.start(),
544 client.partial_loader_data()->open_byte_range().start());
545 EXPECT_LE(range_requested.end(),
546 client.partial_loader_data()->open_byte_range().end());
547 client.partial_loader_data()->set_byte_range(
548 client.partial_loader_data()->open_byte_range());
549 }
550 // clear requests before Open callback.
551 loader.ClearPendingRequests();
552 // Current request should continue loading.
553 EXPECT_TRUE(client.partial_loader_data()->IsWaitOpen());
554 client.partial_loader_data()->CallOpenCallback(0);
Lei Zhang533165f2018-02-27 19:09:10555 client.partial_loader_data()->CallReadCallback(kDefaultRequestSize);
Artem Stryginaf1b43422017-09-12 18:48:24556 EXPECT_FALSE(client.partial_loader_data()->closed());
557 // Current request should continue loading, because no other request queued.
558
Lei Zhang533165f2018-02-27 19:09:10559 loader.RequestData(18 * kDefaultRequestSize + 200, 20);
Artem Stryginaf1b43422017-09-12 18:48:24560 // Requests queue is processed only on receiving data.
Lei Zhang533165f2018-02-27 19:09:10561 client.partial_loader_data()->CallReadCallback(kDefaultRequestSize);
Artem Stryginaf1b43422017-09-12 18:48:24562 // New request within close distance from the one currently loading. Loading
563 // isn't restarted.
564 EXPECT_FALSE(client.partial_loader_data()->IsWaitOpen());
565
566 loader.ClearPendingRequests();
567 // request again two.
Lei Zhang533165f2018-02-27 19:09:10568 loader.RequestData(60 * kDefaultRequestSize + 100, 10);
569 loader.RequestData(35 * kDefaultRequestSize + 200, 20);
Artem Stryginaf1b43422017-09-12 18:48:24570 // Requests queue is processed only on receiving data.
Lei Zhang533165f2018-02-27 19:09:10571 client.partial_loader_data()->CallReadCallback(kDefaultRequestSize);
Artem Stryginaf1b43422017-09-12 18:48:24572 {
573 // new requset not with in close distance from current loading.
574 // Loading should be restarted.
575 EXPECT_TRUE(client.partial_loader_data()->IsWaitOpen());
576 // The first requested chunk should be processed.
Henrique Nakashima1c5da8e2018-10-05 21:56:43577 constexpr gfx::Range range_requested(35 * kDefaultRequestSize,
578 36 * kDefaultRequestSize);
Artem Stryginaf1b43422017-09-12 18:48:24579 EXPECT_EQ(range_requested.start(),
580 client.partial_loader_data()->open_byte_range().start());
581 EXPECT_LE(range_requested.end(),
582 client.partial_loader_data()->open_byte_range().end());
583 client.partial_loader_data()->set_byte_range(
584 client.partial_loader_data()->open_byte_range());
585 }
586 EXPECT_TRUE(client.partial_loader_data()->IsWaitOpen());
587 client.partial_loader_data()->CallOpenCallback(0);
588 // Override pending requests.
589 loader.ClearPendingRequests();
Lei Zhang533165f2018-02-27 19:09:10590 loader.RequestData(70 * kDefaultRequestSize + 100, 10);
Artem Stryginaf1b43422017-09-12 18:48:24591
592 // Requests queue is processed only on receiving data.
Lei Zhang533165f2018-02-27 19:09:10593 client.partial_loader_data()->CallReadCallback(kDefaultRequestSize);
Artem Stryginaf1b43422017-09-12 18:48:24594 {
595 // New requset not with in close distance from current loading.
596 // Loading should be restarted .
597 EXPECT_TRUE(client.partial_loader_data()->IsWaitOpen());
598 // The first requested chunk should be processed.
Henrique Nakashima1c5da8e2018-10-05 21:56:43599 constexpr gfx::Range range_requested(70 * kDefaultRequestSize,
600 71 * kDefaultRequestSize);
Artem Stryginaf1b43422017-09-12 18:48:24601 EXPECT_EQ(range_requested.start(),
602 client.partial_loader_data()->open_byte_range().start());
603 EXPECT_LE(range_requested.end(),
604 client.partial_loader_data()->open_byte_range().end());
605 client.partial_loader_data()->set_byte_range(
606 client.partial_loader_data()->open_byte_range());
607 }
608 EXPECT_TRUE(client.partial_loader_data()->IsWaitOpen());
609}
610
Lei Zhange98901a2018-04-25 23:23:59611TEST_F(DocumentLoaderImplTest, GetBlock) {
Lei Zhang533165f2018-02-27 19:09:10612 std::vector<char> buffer(kDefaultRequestSize);
Artem Stryginaf1b43422017-09-12 18:48:24613 TestClient client;
614 client.SetCanUsePartialLoading();
Lei Zhang533165f2018-02-27 19:09:10615 client.full_page_loader_data()->set_content_length(kDefaultRequestSize * 20 +
616 58383);
Lei Zhange98901a2018-04-25 23:23:59617 DocumentLoaderImpl loader(&client);
Artem Stryginaf1b43422017-09-12 18:48:24618 loader.Init(client.CreateFullPageLoader(), "http://url.com");
619 EXPECT_FALSE(loader.GetBlock(0, 1000, buffer.data()));
Lei Zhang533165f2018-02-27 19:09:10620 client.full_page_loader_data()->CallReadCallback(kDefaultRequestSize);
Artem Stryginaf1b43422017-09-12 18:48:24621 EXPECT_TRUE(loader.GetBlock(0, 1000, buffer.data()));
Lei Zhang533165f2018-02-27 19:09:10622 EXPECT_FALSE(loader.GetBlock(kDefaultRequestSize, 1500, buffer.data()));
623 client.full_page_loader_data()->CallReadCallback(kDefaultRequestSize);
624 EXPECT_TRUE(loader.GetBlock(kDefaultRequestSize, 1500, buffer.data()));
Artem Stryginaf1b43422017-09-12 18:48:24625
Lei Zhang533165f2018-02-27 19:09:10626 EXPECT_FALSE(loader.GetBlock(17 * kDefaultRequestSize, 3000, buffer.data()));
627 loader.RequestData(17 * kDefaultRequestSize + 100, 10);
628 EXPECT_FALSE(loader.GetBlock(17 * kDefaultRequestSize, 3000, buffer.data()));
Artem Stryginaf1b43422017-09-12 18:48:24629
630 // Requests queue is processed only on receiving data.
Lei Zhang533165f2018-02-27 19:09:10631 client.full_page_loader_data()->CallReadCallback(kDefaultRequestSize);
Artem Stryginaf1b43422017-09-12 18:48:24632
633 client.SendAllPartialData();
Lei Zhang533165f2018-02-27 19:09:10634 EXPECT_TRUE(loader.GetBlock(17 * kDefaultRequestSize, 3000, buffer.data()));
Artem Stryginaf1b43422017-09-12 18:48:24635}
636
Lei Zhange98901a2018-04-25 23:23:59637TEST_F(DocumentLoaderImplTest, IsDataAvailable) {
Artem Stryginaf1b43422017-09-12 18:48:24638 TestClient client;
639 client.SetCanUsePartialLoading();
Lei Zhang533165f2018-02-27 19:09:10640 client.full_page_loader_data()->set_content_length(kDefaultRequestSize * 20 +
641 58383);
Lei Zhange98901a2018-04-25 23:23:59642 DocumentLoaderImpl loader(&client);
Artem Stryginaf1b43422017-09-12 18:48:24643 loader.Init(client.CreateFullPageLoader(), "http://url.com");
644 EXPECT_FALSE(loader.IsDataAvailable(0, 1000));
Lei Zhang533165f2018-02-27 19:09:10645 client.full_page_loader_data()->CallReadCallback(kDefaultRequestSize);
Artem Stryginaf1b43422017-09-12 18:48:24646 EXPECT_TRUE(loader.IsDataAvailable(0, 1000));
Lei Zhang533165f2018-02-27 19:09:10647 EXPECT_FALSE(loader.IsDataAvailable(kDefaultRequestSize, 1500));
648 client.full_page_loader_data()->CallReadCallback(kDefaultRequestSize);
649 EXPECT_TRUE(loader.IsDataAvailable(kDefaultRequestSize, 1500));
Artem Stryginaf1b43422017-09-12 18:48:24650
Lei Zhang533165f2018-02-27 19:09:10651 EXPECT_FALSE(loader.IsDataAvailable(17 * kDefaultRequestSize, 3000));
652 loader.RequestData(17 * kDefaultRequestSize + 100, 10);
653 EXPECT_FALSE(loader.IsDataAvailable(17 * kDefaultRequestSize, 3000));
Artem Stryginaf1b43422017-09-12 18:48:24654
655 // Requests queue is processed only on receiving data.
Lei Zhang533165f2018-02-27 19:09:10656 client.full_page_loader_data()->CallReadCallback(kDefaultRequestSize);
Artem Stryginaf1b43422017-09-12 18:48:24657
658 client.SendAllPartialData();
Lei Zhang533165f2018-02-27 19:09:10659 EXPECT_TRUE(loader.IsDataAvailable(17 * kDefaultRequestSize, 3000));
Artem Stryginaf1b43422017-09-12 18:48:24660}
661
Lei Zhange98901a2018-04-25 23:23:59662TEST_F(DocumentLoaderImplTest, RequestData) {
Artem Stryginaf1b43422017-09-12 18:48:24663 TestClient client;
664 client.SetCanUsePartialLoading();
Lei Zhang533165f2018-02-27 19:09:10665 client.full_page_loader_data()->set_content_length(kDefaultRequestSize * 100 +
666 58383);
Lei Zhange98901a2018-04-25 23:23:59667 DocumentLoaderImpl loader(&client);
Artem Stryginaf1b43422017-09-12 18:48:24668 loader.Init(client.CreateFullPageLoader(), "http://url.com");
Lei Zhang533165f2018-02-27 19:09:10669 loader.RequestData(37 * kDefaultRequestSize + 200, 10);
670 loader.RequestData(25 * kDefaultRequestSize + 600, 100);
671 loader.RequestData(13 * kDefaultRequestSize + 900, 500);
Artem Stryginaf1b43422017-09-12 18:48:24672
673 // Send initial data from FullPageLoader.
Lei Zhang533165f2018-02-27 19:09:10674 client.full_page_loader_data()->CallReadCallback(kDefaultRequestSize);
Artem Stryginaf1b43422017-09-12 18:48:24675
676 {
677 EXPECT_TRUE(client.partial_loader_data()->IsWaitOpen());
Henrique Nakashima1c5da8e2018-10-05 21:56:43678 constexpr gfx::Range range_requested(13 * kDefaultRequestSize,
679 14 * kDefaultRequestSize);
Artem Stryginaf1b43422017-09-12 18:48:24680 EXPECT_EQ(range_requested.start(),
681 client.partial_loader_data()->open_byte_range().start());
682 EXPECT_LE(range_requested.end(),
683 client.partial_loader_data()->open_byte_range().end());
684 client.partial_loader_data()->set_byte_range(
685 client.partial_loader_data()->open_byte_range());
686 }
687 client.partial_loader_data()->CallOpenCallback(0);
688 // Override pending requests.
689 loader.ClearPendingRequests();
Lei Zhang533165f2018-02-27 19:09:10690 loader.RequestData(38 * kDefaultRequestSize + 200, 10);
691 loader.RequestData(26 * kDefaultRequestSize + 600, 100);
Artem Stryginaf1b43422017-09-12 18:48:24692 // Requests queue is processed only on receiving data.
Lei Zhang533165f2018-02-27 19:09:10693 client.partial_loader_data()->CallReadCallback(kDefaultRequestSize);
Artem Stryginaf1b43422017-09-12 18:48:24694 {
695 EXPECT_TRUE(client.partial_loader_data()->IsWaitOpen());
Henrique Nakashima1c5da8e2018-10-05 21:56:43696 constexpr gfx::Range range_requested(26 * kDefaultRequestSize,
697 27 * kDefaultRequestSize);
Artem Stryginaf1b43422017-09-12 18:48:24698 EXPECT_EQ(range_requested.start(),
699 client.partial_loader_data()->open_byte_range().start());
700 EXPECT_LE(range_requested.end(),
701 client.partial_loader_data()->open_byte_range().end());
702 client.partial_loader_data()->set_byte_range(
703 client.partial_loader_data()->open_byte_range());
704 }
705 client.partial_loader_data()->CallOpenCallback(0);
706 // Override pending requests.
707 loader.ClearPendingRequests();
Lei Zhang533165f2018-02-27 19:09:10708 loader.RequestData(39 * kDefaultRequestSize + 200, 10);
Artem Stryginaf1b43422017-09-12 18:48:24709 // Requests queue is processed only on receiving data.
Lei Zhang533165f2018-02-27 19:09:10710 client.partial_loader_data()->CallReadCallback(kDefaultRequestSize);
Artem Stryginaf1b43422017-09-12 18:48:24711 {
712 EXPECT_TRUE(client.partial_loader_data()->IsWaitOpen());
Henrique Nakashima1c5da8e2018-10-05 21:56:43713 constexpr gfx::Range range_requested(39 * kDefaultRequestSize,
714 40 * kDefaultRequestSize);
Artem Stryginaf1b43422017-09-12 18:48:24715 EXPECT_EQ(range_requested.start(),
716 client.partial_loader_data()->open_byte_range().start());
717 EXPECT_LE(range_requested.end(),
718 client.partial_loader_data()->open_byte_range().end());
719 client.partial_loader_data()->set_byte_range(
720 client.partial_loader_data()->open_byte_range());
721 }
722 // Fill all gaps.
723 while (!loader.IsDocumentComplete()) {
724 client.SendAllPartialData();
725 }
726 EXPECT_TRUE(client.partial_loader_data()->closed());
727}
728
Lei Zhange98901a2018-04-25 23:23:59729TEST_F(DocumentLoaderImplTest, DoNotLoadAvailablePartialData) {
Artem Stryginaf1b43422017-09-12 18:48:24730 TestClient client;
731 client.SetCanUsePartialLoading();
Lei Zhang533165f2018-02-27 19:09:10732 client.full_page_loader_data()->set_content_length(kDefaultRequestSize * 20 +
733 58383);
Lei Zhange98901a2018-04-25 23:23:59734 DocumentLoaderImpl loader(&client);
Artem Stryginaf1b43422017-09-12 18:48:24735 loader.Init(client.CreateFullPageLoader(), "http://url.com");
736 // Send initial data from FullPageLoader.
Lei Zhang533165f2018-02-27 19:09:10737 client.full_page_loader_data()->CallReadCallback(kDefaultRequestSize);
Artem Stryginaf1b43422017-09-12 18:48:24738
739 // Send more data from FullPageLoader.
Lei Zhang533165f2018-02-27 19:09:10740 client.full_page_loader_data()->CallReadCallback(kDefaultRequestSize);
Artem Stryginaf1b43422017-09-12 18:48:24741
Lei Zhang533165f2018-02-27 19:09:10742 loader.RequestData(2 * kDefaultRequestSize + 200, 10);
Artem Stryginaf1b43422017-09-12 18:48:24743
744 // Send more data from FullPageLoader.
Lei Zhang533165f2018-02-27 19:09:10745 client.full_page_loader_data()->CallReadCallback(kDefaultRequestSize);
Artem Stryginaf1b43422017-09-12 18:48:24746
747 // Partial loading should not have started for already available data.
748 EXPECT_TRUE(client.partial_loader_data()->closed());
749}
750
Lei Zhange98901a2018-04-25 23:23:59751TEST_F(DocumentLoaderImplTest, DoNotLoadDataAfterComplete) {
Artem Stryginaf1b43422017-09-12 18:48:24752 TestClient client;
753 client.SetCanUsePartialLoading();
Lei Zhang533165f2018-02-27 19:09:10754 client.full_page_loader_data()->set_content_length(kDefaultRequestSize * 20);
Lei Zhange98901a2018-04-25 23:23:59755 DocumentLoaderImpl loader(&client);
Artem Stryginaf1b43422017-09-12 18:48:24756 loader.Init(client.CreateFullPageLoader(), "http://url.com");
757
758 for (int i = 0; i < 20; ++i) {
Lei Zhang533165f2018-02-27 19:09:10759 client.full_page_loader_data()->CallReadCallback(kDefaultRequestSize);
Artem Stryginaf1b43422017-09-12 18:48:24760 }
761
762 EXPECT_TRUE(loader.IsDocumentComplete());
763
Lei Zhang533165f2018-02-27 19:09:10764 loader.RequestData(17 * kDefaultRequestSize + 200, 10);
Artem Stryginaf1b43422017-09-12 18:48:24765
766 EXPECT_TRUE(client.partial_loader_data()->closed());
767 EXPECT_TRUE(client.full_page_loader_data()->closed());
768}
769
Lei Zhange98901a2018-04-25 23:23:59770TEST_F(DocumentLoaderImplTest, DoNotLoadPartialDataAboveDocumentSize) {
Artem Stryginaf1b43422017-09-12 18:48:24771 TestClient client;
772 client.SetCanUsePartialLoading();
Lei Zhang533165f2018-02-27 19:09:10773 client.full_page_loader_data()->set_content_length(kDefaultRequestSize * 20);
Lei Zhange98901a2018-04-25 23:23:59774 DocumentLoaderImpl loader(&client);
Artem Stryginaf1b43422017-09-12 18:48:24775 loader.Init(client.CreateFullPageLoader(), "http://url.com");
776
Lei Zhang533165f2018-02-27 19:09:10777 loader.RequestData(20 * kDefaultRequestSize + 200, 10);
Artem Stryginaf1b43422017-09-12 18:48:24778
779 // Send initial data from FullPageLoader.
Lei Zhang533165f2018-02-27 19:09:10780 client.full_page_loader_data()->CallReadCallback(kDefaultRequestSize);
Artem Stryginaf1b43422017-09-12 18:48:24781
782 EXPECT_TRUE(client.partial_loader_data()->closed());
783}
784
Lei Zhange98901a2018-04-25 23:23:59785TEST_F(DocumentLoaderImplTest, MergePendingRequests) {
Artem Stryginaf1b43422017-09-12 18:48:24786 TestClient client;
787 client.SetCanUsePartialLoading();
Lei Zhang533165f2018-02-27 19:09:10788 client.full_page_loader_data()->set_content_length(kDefaultRequestSize * 50 +
789 58383);
Lei Zhange98901a2018-04-25 23:23:59790 DocumentLoaderImpl loader(&client);
Artem Stryginaf1b43422017-09-12 18:48:24791 loader.Init(client.CreateFullPageLoader(), "http://url.com");
Lei Zhang533165f2018-02-27 19:09:10792 loader.RequestData(17 * kDefaultRequestSize + 200, 10);
793 loader.RequestData(16 * kDefaultRequestSize + 600, 100);
Artem Stryginaf1b43422017-09-12 18:48:24794
795 // Send initial data from FullPageLoader.
Lei Zhang533165f2018-02-27 19:09:10796 client.full_page_loader_data()->CallReadCallback(kDefaultRequestSize);
Artem Stryginaf1b43422017-09-12 18:48:24797
Henrique Nakashima1c5da8e2018-10-05 21:56:43798 constexpr gfx::Range range_requested(16 * kDefaultRequestSize,
799 18 * kDefaultRequestSize);
Artem Stryginaf1b43422017-09-12 18:48:24800 EXPECT_EQ(range_requested.start(),
801 client.partial_loader_data()->open_byte_range().start());
802 EXPECT_LE(range_requested.end(),
803 client.partial_loader_data()->open_byte_range().end());
804
805 EXPECT_TRUE(client.partial_loader_data()->IsWaitOpen());
806
807 // Fill all gaps.
808 while (!loader.IsDocumentComplete()) {
809 client.SendAllPartialData();
810 }
811 EXPECT_TRUE(client.partial_loader_data()->closed());
812}
813
Lei Zhange98901a2018-04-25 23:23:59814TEST_F(DocumentLoaderImplTest, PartialStopOnStatusCodeError) {
Artem Stryginaf1b43422017-09-12 18:48:24815 TestClient client;
816 client.SetCanUsePartialLoading();
Lei Zhang533165f2018-02-27 19:09:10817 client.full_page_loader_data()->set_content_length(kDefaultRequestSize * 20);
Lei Zhange98901a2018-04-25 23:23:59818 DocumentLoaderImpl loader(&client);
Artem Stryginaf1b43422017-09-12 18:48:24819 loader.Init(client.CreateFullPageLoader(), "http://url.com");
820
Lei Zhang533165f2018-02-27 19:09:10821 loader.RequestData(17 * kDefaultRequestSize + 200, 10);
Artem Stryginaf1b43422017-09-12 18:48:24822
823 // Send initial data from FullPageLoader.
Lei Zhang533165f2018-02-27 19:09:10824 client.full_page_loader_data()->CallReadCallback(kDefaultRequestSize);
Artem Stryginaf1b43422017-09-12 18:48:24825
826 EXPECT_TRUE(client.partial_loader_data()->IsWaitOpen());
827 client.partial_loader_data()->set_status_code(404);
828 client.partial_loader_data()->CallOpenCallback(0);
829 EXPECT_TRUE(client.partial_loader_data()->closed());
830}
831
Lei Zhange98901a2018-04-25 23:23:59832TEST_F(DocumentLoaderImplTest,
Artem Stryginaf1b43422017-09-12 18:48:24833 PartialAsFullDocumentLoadingRangeRequestNoRangeField) {
834 TestClient client;
835 client.SetCanUsePartialLoading();
Lei Zhang533165f2018-02-27 19:09:10836 client.full_page_loader_data()->set_content_length(kDefaultRequestSize * 20);
Lei Zhange98901a2018-04-25 23:23:59837 DocumentLoaderImpl loader(&client);
Artem Stryginaf1b43422017-09-12 18:48:24838 loader.Init(client.CreateFullPageLoader(), "http://url.com");
839
Lei Zhang533165f2018-02-27 19:09:10840 loader.RequestData(17 * kDefaultRequestSize + 200, 10);
Artem Stryginaf1b43422017-09-12 18:48:24841
842 // Send initial data from FullPageLoader.
Lei Zhang533165f2018-02-27 19:09:10843 client.full_page_loader_data()->CallReadCallback(kDefaultRequestSize);
Artem Stryginaf1b43422017-09-12 18:48:24844
845 EXPECT_TRUE(client.partial_loader_data()->IsWaitOpen());
846 client.partial_loader_data()->set_byte_range(gfx::Range::InvalidRange());
847 client.partial_loader_data()->CallOpenCallback(0);
848 EXPECT_FALSE(client.partial_loader_data()->closed());
849 // Partial loader is used to load the whole page, like full page loader.
850 EXPECT_FALSE(loader.is_partial_loader_active());
851}
852
Lei Zhange98901a2018-04-25 23:23:59853TEST_F(DocumentLoaderImplTest, PartialMultiPart) {
Artem Stryginaf1b43422017-09-12 18:48:24854 TestClient client;
855 client.SetCanUsePartialLoading();
Lei Zhang533165f2018-02-27 19:09:10856 client.full_page_loader_data()->set_content_length(kDefaultRequestSize * 20);
Lei Zhange98901a2018-04-25 23:23:59857 DocumentLoaderImpl loader(&client);
Artem Stryginaf1b43422017-09-12 18:48:24858 loader.Init(client.CreateFullPageLoader(), "http://url.com");
859
Lei Zhang533165f2018-02-27 19:09:10860 loader.RequestData(17 * kDefaultRequestSize + 200, 10);
Artem Stryginaf1b43422017-09-12 18:48:24861
862 // Send initial data from FullPageLoader.
Lei Zhang533165f2018-02-27 19:09:10863 client.full_page_loader_data()->CallReadCallback(kDefaultRequestSize);
Artem Stryginaf1b43422017-09-12 18:48:24864
865 EXPECT_TRUE(client.partial_loader_data()->IsWaitOpen());
866 client.partial_loader_data()->set_is_multipart(true);
867 client.partial_loader_data()->CallOpenCallback(0);
868 client.partial_loader_data()->set_byte_range(
Lei Zhang533165f2018-02-27 19:09:10869 gfx::Range(17 * kDefaultRequestSize, 18 * kDefaultRequestSize));
870 client.partial_loader_data()->CallReadCallback(kDefaultRequestSize);
871 EXPECT_TRUE(
872 loader.IsDataAvailable(17 * kDefaultRequestSize, kDefaultRequestSize));
Artem Stryginaf1b43422017-09-12 18:48:24873}
874
Lei Zhange98901a2018-04-25 23:23:59875TEST_F(DocumentLoaderImplTest, PartialMultiPartRangeError) {
Artem Stryginaf1b43422017-09-12 18:48:24876 TestClient client;
877 client.SetCanUsePartialLoading();
Lei Zhang533165f2018-02-27 19:09:10878 client.full_page_loader_data()->set_content_length(kDefaultRequestSize * 20);
Lei Zhange98901a2018-04-25 23:23:59879 DocumentLoaderImpl loader(&client);
Artem Stryginaf1b43422017-09-12 18:48:24880 loader.Init(client.CreateFullPageLoader(), "http://url.com");
881
Lei Zhang533165f2018-02-27 19:09:10882 loader.RequestData(17 * kDefaultRequestSize + 200, 10);
Artem Stryginaf1b43422017-09-12 18:48:24883
884 // Send initial data from FullPageLoader.
Lei Zhang533165f2018-02-27 19:09:10885 client.full_page_loader_data()->CallReadCallback(kDefaultRequestSize);
Artem Stryginaf1b43422017-09-12 18:48:24886
887 EXPECT_TRUE(client.partial_loader_data()->IsWaitOpen());
888 client.partial_loader_data()->set_is_multipart(true);
889 client.partial_loader_data()->CallOpenCallback(0);
890 client.partial_loader_data()->set_byte_range(gfx::Range::InvalidRange());
Lei Zhang533165f2018-02-27 19:09:10891 client.partial_loader_data()->CallReadCallback(kDefaultRequestSize);
892 EXPECT_FALSE(
893 loader.IsDataAvailable(17 * kDefaultRequestSize, kDefaultRequestSize));
Artem Stryginaf1b43422017-09-12 18:48:24894 EXPECT_TRUE(client.partial_loader_data()->closed());
895}
896
Lei Zhange98901a2018-04-25 23:23:59897TEST_F(DocumentLoaderImplTest, PartialConnectionErrorOnOpen) {
Artem Stryginaf1b43422017-09-12 18:48:24898 TestClient client;
899 client.SetCanUsePartialLoading();
Lei Zhang533165f2018-02-27 19:09:10900 client.full_page_loader_data()->set_content_length(kDefaultRequestSize * 20);
Lei Zhange98901a2018-04-25 23:23:59901 DocumentLoaderImpl loader(&client);
Artem Stryginaf1b43422017-09-12 18:48:24902 loader.Init(client.CreateFullPageLoader(), "http://url.com");
903
Lei Zhang533165f2018-02-27 19:09:10904 loader.RequestData(17 * kDefaultRequestSize + 200, 10);
Artem Stryginaf1b43422017-09-12 18:48:24905
906 // Send initial data from FullPageLoader.
Lei Zhang533165f2018-02-27 19:09:10907 client.full_page_loader_data()->CallReadCallback(kDefaultRequestSize);
Artem Stryginaf1b43422017-09-12 18:48:24908
909 EXPECT_TRUE(client.partial_loader_data()->IsWaitOpen());
910 client.partial_loader_data()->CallOpenCallback(-3);
911 EXPECT_TRUE(client.partial_loader_data()->closed());
912
913 // Partial loading should not restart after any error.
Lei Zhang533165f2018-02-27 19:09:10914 loader.RequestData(18 * kDefaultRequestSize + 200, 10);
Artem Stryginaf1b43422017-09-12 18:48:24915
916 EXPECT_FALSE(client.partial_loader_data()->IsWaitOpen());
917 EXPECT_TRUE(client.partial_loader_data()->closed());
918}
919
Lei Zhange98901a2018-04-25 23:23:59920TEST_F(DocumentLoaderImplTest, PartialConnectionErrorOnRead) {
Artem Stryginaf1b43422017-09-12 18:48:24921 TestClient client;
922 client.SetCanUsePartialLoading();
Lei Zhang533165f2018-02-27 19:09:10923 client.full_page_loader_data()->set_content_length(kDefaultRequestSize * 20);
Lei Zhange98901a2018-04-25 23:23:59924 DocumentLoaderImpl loader(&client);
Artem Stryginaf1b43422017-09-12 18:48:24925 loader.Init(client.CreateFullPageLoader(), "http://url.com");
926
Lei Zhang533165f2018-02-27 19:09:10927 loader.RequestData(17 * kDefaultRequestSize + 200, 10);
Artem Stryginaf1b43422017-09-12 18:48:24928
929 // Send initial data from FullPageLoader.
Lei Zhang533165f2018-02-27 19:09:10930 client.full_page_loader_data()->CallReadCallback(kDefaultRequestSize);
Artem Stryginaf1b43422017-09-12 18:48:24931
932 EXPECT_TRUE(client.partial_loader_data()->IsWaitOpen());
933 client.partial_loader_data()->set_byte_range(
Lei Zhang533165f2018-02-27 19:09:10934 gfx::Range(17 * kDefaultRequestSize, 18 * kDefaultRequestSize));
Artem Stryginaf1b43422017-09-12 18:48:24935 client.partial_loader_data()->CallOpenCallback(0);
936 EXPECT_TRUE(client.partial_loader_data()->IsWaitRead());
937 client.partial_loader_data()->CallReadCallback(-3);
938 EXPECT_TRUE(client.partial_loader_data()->closed());
939
940 // Partial loading should not restart after any error.
Lei Zhang533165f2018-02-27 19:09:10941 loader.RequestData(18 * kDefaultRequestSize + 200, 10);
Artem Stryginaf1b43422017-09-12 18:48:24942
943 EXPECT_FALSE(client.partial_loader_data()->IsWaitOpen());
944 EXPECT_TRUE(client.partial_loader_data()->closed());
945}
946
Lei Zhange98901a2018-04-25 23:23:59947TEST_F(DocumentLoaderImplTest, ClientCompleteCallbacks) {
Artem Stryginaf1b43422017-09-12 18:48:24948 MockClient client;
949 client.SetCanUsePartialLoading();
Lei Zhang533165f2018-02-27 19:09:10950 client.full_page_loader_data()->set_content_length(kDefaultRequestSize * 20);
Lei Zhange98901a2018-04-25 23:23:59951 DocumentLoaderImpl loader(&client);
Artem Stryginaf1b43422017-09-12 18:48:24952 loader.Init(client.CreateFullPageLoader(), "http://url.com");
953
954 EXPECT_CALL(client, OnDocumentComplete()).Times(0);
Lei Zhang533165f2018-02-27 19:09:10955 for (int i = 0; i < 19; ++i)
956 client.full_page_loader_data()->CallReadCallback(kDefaultRequestSize);
Artem Stryginaf1b43422017-09-12 18:48:24957 Mock::VerifyAndClear(&client);
958
959 EXPECT_CALL(client, OnDocumentComplete()).Times(1);
Lei Zhang533165f2018-02-27 19:09:10960 client.full_page_loader_data()->CallReadCallback(kDefaultRequestSize);
Artem Stryginaf1b43422017-09-12 18:48:24961 Mock::VerifyAndClear(&client);
962}
963
Lei Zhange98901a2018-04-25 23:23:59964TEST_F(DocumentLoaderImplTest, ClientCompleteCallbacksNoContentLength) {
Artem Stryginaf1b43422017-09-12 18:48:24965 MockClient client;
Lei Zhange98901a2018-04-25 23:23:59966 DocumentLoaderImpl loader(&client);
Artem Stryginaf1b43422017-09-12 18:48:24967 loader.Init(client.CreateFullPageLoader(), "http://url.com");
968
969 EXPECT_CALL(client, OnDocumentCanceled()).Times(0);
970 EXPECT_CALL(client, OnDocumentComplete()).Times(0);
Lei Zhang533165f2018-02-27 19:09:10971 for (int i = 0; i < 20; ++i)
972 client.full_page_loader_data()->CallReadCallback(kDefaultRequestSize);
Artem Stryginaf1b43422017-09-12 18:48:24973 Mock::VerifyAndClear(&client);
974
975 EXPECT_CALL(client, OnDocumentCanceled()).Times(0);
976 EXPECT_CALL(client, OnDocumentComplete()).Times(1);
977 client.full_page_loader_data()->CallReadCallback(0);
978 Mock::VerifyAndClear(&client);
979}
980
Lei Zhange98901a2018-04-25 23:23:59981TEST_F(DocumentLoaderImplTest, ClientCancelCallback) {
Artem Stryginaf1b43422017-09-12 18:48:24982 MockClient client;
983 client.SetCanUsePartialLoading();
Lei Zhang533165f2018-02-27 19:09:10984 client.full_page_loader_data()->set_content_length(kDefaultRequestSize * 20);
Lei Zhange98901a2018-04-25 23:23:59985 DocumentLoaderImpl loader(&client);
Artem Stryginaf1b43422017-09-12 18:48:24986 loader.Init(client.CreateFullPageLoader(), "http://url.com");
987
988 EXPECT_CALL(client, OnDocumentCanceled()).Times(0);
989 EXPECT_CALL(client, OnDocumentComplete()).Times(0);
Lei Zhang533165f2018-02-27 19:09:10990 for (int i = 0; i < 10; ++i)
991 client.full_page_loader_data()->CallReadCallback(kDefaultRequestSize);
Artem Stryginaf1b43422017-09-12 18:48:24992 Mock::VerifyAndClear(&client);
993
994 EXPECT_CALL(client, OnDocumentComplete()).Times(0);
995 EXPECT_CALL(client, OnDocumentCanceled()).Times(1);
996 client.full_page_loader_data()->CallReadCallback(-3);
997 Mock::VerifyAndClear(&client);
998}
999
Lei Zhange98901a2018-04-25 23:23:591000TEST_F(DocumentLoaderImplTest, NewDataAvailable) {
Artem Stryginaf1b43422017-09-12 18:48:241001 MockClient client;
1002 client.SetCanUsePartialLoading();
Lei Zhang533165f2018-02-27 19:09:101003 client.full_page_loader_data()->set_content_length(kDefaultRequestSize * 20);
Lei Zhange98901a2018-04-25 23:23:591004 DocumentLoaderImpl loader(&client);
Artem Stryginaf1b43422017-09-12 18:48:241005 loader.Init(client.CreateFullPageLoader(), "http://url.com");
1006
1007 EXPECT_CALL(client, OnNewDataReceived()).Times(1);
Lei Zhang533165f2018-02-27 19:09:101008 client.full_page_loader_data()->CallReadCallback(kDefaultRequestSize);
Artem Stryginaf1b43422017-09-12 18:48:241009 Mock::VerifyAndClear(&client);
1010
1011 EXPECT_CALL(client, OnNewDataReceived()).Times(1);
Lei Zhang533165f2018-02-27 19:09:101012 client.full_page_loader_data()->CallReadCallback(kDefaultRequestSize - 100);
Artem Stryginaf1b43422017-09-12 18:48:241013 Mock::VerifyAndClear(&client);
1014
1015 EXPECT_CALL(client, OnNewDataReceived()).Times(1);
1016 client.full_page_loader_data()->CallReadCallback(100);
1017 Mock::VerifyAndClear(&client);
1018}
1019
Lei Zhange98901a2018-04-25 23:23:591020TEST_F(DocumentLoaderImplTest, ClientPendingRequestCompleteFullLoader) {
Artem Stryginaf1b43422017-09-12 18:48:241021 MockClient client;
1022 client.SetCanUsePartialLoading();
Lei Zhange98901a2018-04-25 23:23:591023 DocumentLoaderImpl loader(&client);
Artem Stryginaf1b43422017-09-12 18:48:241024 loader.Init(client.CreateFullPageLoader(), "http://url.com");
1025
1026 loader.RequestData(1000, 4000);
1027
1028 EXPECT_CALL(client, OnPendingRequestComplete()).Times(1);
Lei Zhang533165f2018-02-27 19:09:101029 client.full_page_loader_data()->CallReadCallback(kDefaultRequestSize);
Artem Stryginaf1b43422017-09-12 18:48:241030 Mock::VerifyAndClear(&client);
1031}
1032
Lei Zhange98901a2018-04-25 23:23:591033TEST_F(DocumentLoaderImplTest, ClientPendingRequestCompletePartialLoader) {
Artem Stryginaf1b43422017-09-12 18:48:241034 MockClient client;
1035 client.SetCanUsePartialLoading();
Lei Zhange98901a2018-04-25 23:23:591036 DocumentLoaderImpl loader(&client);
Artem Stryginaf1b43422017-09-12 18:48:241037 loader.Init(client.CreateFullPageLoader(), "http://url.com");
1038
1039 EXPECT_CALL(client, OnPendingRequestComplete()).Times(1);
Lei Zhang533165f2018-02-27 19:09:101040 loader.RequestData(15 * kDefaultRequestSize + 4000, 4000);
Artem Stryginaf1b43422017-09-12 18:48:241041
1042 // Always send initial data from FullPageLoader.
Lei Zhang533165f2018-02-27 19:09:101043 client.full_page_loader_data()->CallReadCallback(kDefaultRequestSize);
Artem Stryginaf1b43422017-09-12 18:48:241044
1045 client.SendAllPartialData();
1046 Mock::VerifyAndClear(&client);
1047}
1048
Lei Zhange98901a2018-04-25 23:23:591049TEST_F(DocumentLoaderImplTest,
1050 ClientPendingRequestCompletePartialAndFullLoader) {
Artem Stryginaf1b43422017-09-12 18:48:241051 MockClient client;
1052 client.SetCanUsePartialLoading();
Lei Zhange98901a2018-04-25 23:23:591053 DocumentLoaderImpl loader(&client);
Artem Stryginaf1b43422017-09-12 18:48:241054 loader.Init(client.CreateFullPageLoader(), "http://url.com");
1055
1056 EXPECT_CALL(client, OnPendingRequestComplete()).Times(1);
Lei Zhang533165f2018-02-27 19:09:101057 loader.RequestData(16 * kDefaultRequestSize + 4000, 4000);
1058 loader.RequestData(4 * kDefaultRequestSize + 4000, 4000);
Artem Stryginaf1b43422017-09-12 18:48:241059
Lei Zhang533165f2018-02-27 19:09:101060 for (int i = 0; i < 5; ++i)
1061 client.full_page_loader_data()->CallReadCallback(kDefaultRequestSize);
Artem Stryginaf1b43422017-09-12 18:48:241062
1063 Mock::VerifyAndClear(&client);
1064
1065 EXPECT_CALL(client, OnPendingRequestComplete()).Times(1);
1066 client.SendAllPartialData();
1067 Mock::VerifyAndClear(&client);
1068}
1069
Artem Strygin2cf20af42018-06-14 14:26:531070TEST_F(DocumentLoaderImplTest, IgnoreDataMoreThanExpectedWithPartial) {
1071 static constexpr uint32_t kDocSize = kDefaultRequestSize * 80 - 321;
1072 TestClient client;
1073 client.SetCanUsePartialLoading();
1074 client.full_page_loader_data()->set_content_length(kDocSize);
1075 DocumentLoaderImpl loader(&client);
1076 loader.Init(client.CreateFullPageLoader(), "http://url.com");
1077 // Request data at and.
1078 loader.RequestData(kDocSize - 100, 100);
1079
1080 // Always send initial data from FullPageLoader.
1081 client.full_page_loader_data()->CallReadCallback(kDefaultRequestSize);
1082 EXPECT_TRUE(client.full_page_loader_data()->closed());
1083 EXPECT_FALSE(client.partial_loader_data()->closed());
1084
1085 // Request data at middle to continue loading partial, but not all remaining
1086 // data.
1087 loader.RequestData(kDocSize / 2, 100);
1088
1089 // Fill data at the end, the partial loding should be started for second
1090 // requested data after receive data for first request.
1091 client.SendAllPartialData();
1092
1093 ASSERT_TRUE(client.partial_loader_data()->IsWaitOpen());
1094 // Process second request.
1095 const uint32_t expected_length =
1096 client.partial_loader_data()->open_byte_range().length();
1097
1098 // Send data.
1099 client.partial_loader_data()->set_byte_range(
1100 client.partial_loader_data()->open_byte_range());
1101 client.partial_loader_data()->CallOpenCallback(0);
1102 uint32_t length = expected_length;
1103 while (length > 0) {
Henrique Nakashima1c5da8e2018-10-05 21:56:431104 constexpr uint32_t max_part_len = kDefaultRequestSize;
Artem Strygin2cf20af42018-06-14 14:26:531105 const uint32_t part_len = std::min(length, max_part_len);
1106 client.partial_loader_data()->CallReadCallback(part_len);
1107 length -= part_len;
1108 }
1109
1110 // The partial loading should be finished for current chunks sequence, if
1111 // expected range was received, and remaining sequence should start loading.
1112 EXPECT_FALSE(client.partial_loader_data()->IsWaitRead());
1113 ASSERT_TRUE(client.partial_loader_data()->IsWaitOpen());
1114
1115 // Send other document data.
1116 client.SendAllPartialData();
1117 // The downloads should be finished.
1118 EXPECT_TRUE(client.full_page_loader_data()->closed());
1119 EXPECT_TRUE(client.partial_loader_data()->closed());
1120}
1121
1122TEST_F(DocumentLoaderImplTest, IgnoreDataMoreThanExpectedWithPartialAtFileEnd) {
1123 static constexpr uint32_t kExtraSize = 100;
1124 static constexpr uint32_t kRealSize = kDefaultRequestSize * 20 - 300;
1125 static constexpr uint32_t kDocSize = kRealSize - kExtraSize;
1126 TestClient client;
1127 client.SetCanUsePartialLoading();
1128 client.full_page_loader_data()->set_content_length(kDocSize);
1129 DocumentLoaderImpl loader(&client);
1130 loader.Init(client.CreateFullPageLoader(), "http://url.com");
1131 // Request data at middle.
1132 static constexpr uint32_t kFirstPartial = kDefaultRequestSize * 11;
1133 loader.RequestData(kFirstPartial, kDefaultRequestSize);
1134
1135 // Always send initial data from FullPageLoader.
1136 client.full_page_loader_data()->CallReadCallback(kDefaultRequestSize);
1137 EXPECT_TRUE(client.full_page_loader_data()->closed());
1138 EXPECT_FALSE(client.partial_loader_data()->closed());
1139
1140 // Send data to file end and extra non expected data.
1141 client.partial_loader_data()->set_byte_range(
1142 gfx::Range(kFirstPartial, kRealSize));
1143 client.partial_loader_data()->CallOpenCallback(0);
1144 uint32_t length = client.partial_loader_data()->byte_range().length();
1145 while (length > 0) {
Henrique Nakashima1c5da8e2018-10-05 21:56:431146 constexpr uint32_t max_part_len = kDefaultRequestSize;
Artem Strygin2cf20af42018-06-14 14:26:531147 const uint32_t part_len = std::min(length, max_part_len);
1148 client.partial_loader_data()->CallReadCallback(part_len);
1149 length -= part_len;
1150 }
1151
1152 // The partial loading should be finished for current chunks sequence, if
1153 // eof was reached, and remaining sequence should start loading.
1154 EXPECT_FALSE(client.partial_loader_data()->IsWaitRead());
1155 EXPECT_EQ(gfx::Range(kDefaultRequestSize, kFirstPartial),
1156 client.partial_loader_data()->open_byte_range());
1157
1158 // Send other document data.
1159 client.SendAllPartialData();
1160 // The downloads should be finished.
1161 EXPECT_TRUE(client.full_page_loader_data()->closed());
1162 EXPECT_TRUE(client.partial_loader_data()->closed());
1163}
1164
Artem Stryginaf1b43422017-09-12 18:48:241165} // namespace chrome_pdf