OLD | NEW |
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include <map> | 5 #include <map> |
6 #include <string> | 6 #include <string> |
7 #include <vector> | 7 #include <vector> |
8 | 8 |
9 #include "base/bind.h" | 9 #include "base/bind.h" |
10 #include "base/bind_helpers.h" | 10 #include "base/bind_helpers.h" |
(...skipping 28 matching lines...) Expand all Loading... |
39 const char* kImageData[kTotalImages] = {"abcde", "12345"}; | 39 const char* kImageData[kTotalImages] = {"abcde", "12345"}; |
40 | 40 |
41 const string GetImageName(int page_num, int image_num) { | 41 const string GetImageName(int page_num, int image_num) { |
42 return base::IntToString(page_num) + "_" + base::IntToString(image_num); | 42 return base::IntToString(page_num) + "_" + base::IntToString(image_num); |
43 } | 43 } |
44 | 44 |
45 scoped_ptr<base::ListValue> CreateDistilledValueReturnedFromJS( | 45 scoped_ptr<base::ListValue> CreateDistilledValueReturnedFromJS( |
46 const string& title, | 46 const string& title, |
47 const string& content, | 47 const string& content, |
48 const vector<int>& image_indices, | 48 const vector<int>& image_indices, |
49 const string& next_page_url) { | 49 const string& next_page_url, |
| 50 const string& prev_page_url = "") { |
50 scoped_ptr<base::ListValue> list(new base::ListValue()); | 51 scoped_ptr<base::ListValue> list(new base::ListValue()); |
51 | 52 |
52 list->AppendString(title); | 53 list->AppendString(title); |
53 list->AppendString(content); | 54 list->AppendString(content); |
54 list->AppendString(next_page_url); | 55 list->AppendString(next_page_url); |
| 56 list->AppendString(prev_page_url); |
55 for (size_t i = 0; i < image_indices.size(); ++i) { | 57 for (size_t i = 0; i < image_indices.size(); ++i) { |
56 list->AppendString(kImageURLs[image_indices[i]]); | 58 list->AppendString(kImageURLs[image_indices[i]]); |
57 } | 59 } |
58 return list.Pass(); | 60 return list.Pass(); |
59 } | 61 } |
60 | 62 |
61 } // namespace | 63 } // namespace |
62 | 64 |
63 namespace dom_distiller { | 65 namespace dom_distiller { |
64 | 66 |
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
142 MockDistillerPage* distiller_page = new MockDistillerPage(delegate); | 144 MockDistillerPage* distiller_page = new MockDistillerPage(delegate); |
143 EXPECT_CALL(*distiller_page, InitImpl()); | 145 EXPECT_CALL(*distiller_page, InitImpl()); |
144 EXPECT_CALL(*distiller_page, LoadURLImpl(kurl)) | 146 EXPECT_CALL(*distiller_page, LoadURLImpl(kurl)) |
145 .WillOnce(testing::InvokeWithoutArgs(distiller_page, | 147 .WillOnce(testing::InvokeWithoutArgs(distiller_page, |
146 &DistillerPage::OnLoadURLDone)); | 148 &DistillerPage::OnLoadURLDone)); |
147 EXPECT_CALL(*distiller_page, ExecuteJavaScriptImpl(_)).WillOnce( | 149 EXPECT_CALL(*distiller_page, ExecuteJavaScriptImpl(_)).WillOnce( |
148 DistillerPageOnExecuteJavaScriptDone(distiller_page, kurl, list)); | 150 DistillerPageOnExecuteJavaScriptDone(distiller_page, kurl, list)); |
149 return distiller_page; | 151 return distiller_page; |
150 } | 152 } |
151 | 153 |
152 ACTION_P3(CreateMockDistillerPages, lists, kurls, num_pages) { | 154 ACTION_P4(CreateMockDistillerPages, lists, kurls, num_pages, start_page_num) { |
153 DistillerPage::Delegate* delegate = arg0; | 155 DistillerPage::Delegate* delegate = arg0; |
154 MockDistillerPage* distiller_page = new MockDistillerPage(delegate); | 156 MockDistillerPage* distiller_page = new MockDistillerPage(delegate); |
155 EXPECT_CALL(*distiller_page, InitImpl()); | 157 EXPECT_CALL(*distiller_page, InitImpl()); |
156 { | 158 { |
157 testing::InSequence s; | 159 testing::InSequence s; |
| 160 // Distiller prefers distilling past pages first. E.g. when distillation |
| 161 // starts on page 2 then pages are distilled in the order: 2, 1, 0, 3, 4. |
| 162 vector<int> page_nums; |
| 163 for (int page = start_page_num; page >= 0; --page) |
| 164 page_nums.push_back(page); |
| 165 for (int page = start_page_num + 1; page < num_pages; ++page) |
| 166 page_nums.push_back(page); |
158 | 167 |
159 for (int page = 0; page < num_pages; ++page) { | 168 for (size_t page_num = 0; page_num < page_nums.size(); ++page_num) { |
| 169 int page = page_nums[page_num]; |
160 GURL url = GURL(kurls[page]); | 170 GURL url = GURL(kurls[page]); |
161 EXPECT_CALL(*distiller_page, LoadURLImpl(url)) | 171 EXPECT_CALL(*distiller_page, LoadURLImpl(url)) |
162 .WillOnce(testing::InvokeWithoutArgs(distiller_page, | 172 .WillOnce(testing::InvokeWithoutArgs(distiller_page, |
163 &DistillerPage::OnLoadURLDone)); | 173 &DistillerPage::OnLoadURLDone)); |
164 EXPECT_CALL(*distiller_page, ExecuteJavaScriptImpl(_)) | 174 EXPECT_CALL(*distiller_page, ExecuteJavaScriptImpl(_)) |
165 .WillOnce(DistillerPageOnExecuteJavaScriptDone( | 175 .WillOnce(DistillerPageOnExecuteJavaScriptDone( |
166 distiller_page, url, lists[page].get())); | 176 distiller_page, url, lists[page].get())); |
167 } | 177 } |
168 } | 178 } |
169 return distiller_page; | 179 return distiller_page; |
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
240 for (int i = 0; i < kNumPages; ++i) { | 250 for (int i = 0; i < kNumPages; ++i) { |
241 string next_page_url = ""; | 251 string next_page_url = ""; |
242 if (i + 1 < kNumPages) | 252 if (i + 1 < kNumPages) |
243 next_page_url = page_urls[i + 1]; | 253 next_page_url = page_urls[i + 1]; |
244 | 254 |
245 list[i] = CreateDistilledValueReturnedFromJS( | 255 list[i] = CreateDistilledValueReturnedFromJS( |
246 kTitle, content[i], image_indices[i], next_page_url); | 256 kTitle, content[i], image_indices[i], next_page_url); |
247 } | 257 } |
248 | 258 |
249 EXPECT_CALL(page_factory_, CreateDistillerPageMock(_)) | 259 EXPECT_CALL(page_factory_, CreateDistillerPageMock(_)) |
250 .WillOnce(CreateMockDistillerPages(list, page_urls, kNumPages)); | 260 .WillOnce(CreateMockDistillerPages(list, page_urls, kNumPages, 0)); |
251 | 261 |
252 distiller_.reset(new DistillerImpl(page_factory_, url_fetcher_factory_)); | 262 distiller_.reset(new DistillerImpl(page_factory_, url_fetcher_factory_)); |
253 distiller_->Init(); | 263 distiller_->Init(); |
254 distiller_->DistillPage( | 264 distiller_->DistillPage( |
255 GURL(page_urls[0]), | 265 GURL(page_urls[0]), |
256 base::Bind(&DistillerTest::OnDistillPageDone, base::Unretained(this))); | 266 base::Bind(&DistillerTest::OnDistillPageDone, base::Unretained(this))); |
257 base::MessageLoop::current()->RunUntilIdle(); | 267 base::MessageLoop::current()->RunUntilIdle(); |
258 EXPECT_EQ(kTitle, article_proto_->title()); | 268 EXPECT_EQ(kTitle, article_proto_->title()); |
259 EXPECT_EQ(article_proto_->pages_size(), kNumPages); | 269 EXPECT_EQ(article_proto_->pages_size(), kNumPages); |
260 for (int page_num = 0; page_num < kNumPages; ++page_num) { | 270 for (int page_num = 0; page_num < kNumPages; ++page_num) { |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
303 for (size_t page_num = 0; page_num < kMaxPagesInArticle; ++page_num) { | 313 for (size_t page_num = 0; page_num < kMaxPagesInArticle; ++page_num) { |
304 page_urls[page_num] = url_prefix + base::IntToString(page_num + 1); | 314 page_urls[page_num] = url_prefix + base::IntToString(page_num + 1); |
305 string content = "Content for page:" + base::IntToString(page_num); | 315 string content = "Content for page:" + base::IntToString(page_num); |
306 string next_page_url = url_prefix + base::IntToString(page_num + 2); | 316 string next_page_url = url_prefix + base::IntToString(page_num + 2); |
307 list[page_num] = CreateDistilledValueReturnedFromJS( | 317 list[page_num] = CreateDistilledValueReturnedFromJS( |
308 kTitle, content, vector<int>(), next_page_url); | 318 kTitle, content, vector<int>(), next_page_url); |
309 } | 319 } |
310 | 320 |
311 EXPECT_CALL(page_factory_, CreateDistillerPageMock(_)) | 321 EXPECT_CALL(page_factory_, CreateDistillerPageMock(_)) |
312 .WillOnce(CreateMockDistillerPages( | 322 .WillOnce(CreateMockDistillerPages( |
313 list, page_urls, static_cast<int>(kMaxPagesInArticle))); | 323 list, page_urls, static_cast<int>(kMaxPagesInArticle), 0)); |
314 | 324 |
315 distiller_.reset(new DistillerImpl(page_factory_, url_fetcher_factory_)); | 325 distiller_.reset(new DistillerImpl(page_factory_, url_fetcher_factory_)); |
316 | 326 |
317 distiller_->SetMaxNumPagesInArticle(kMaxPagesInArticle); | 327 distiller_->SetMaxNumPagesInArticle(kMaxPagesInArticle); |
318 | 328 |
319 distiller_->Init(); | 329 distiller_->Init(); |
320 distiller_->DistillPage( | 330 distiller_->DistillPage( |
321 GURL(page_urls[0]), | 331 GURL(page_urls[0]), |
322 base::Bind(&DistillerTest::OnDistillPageDone, base::Unretained(this))); | 332 base::Bind(&DistillerTest::OnDistillPageDone, base::Unretained(this))); |
323 base::MessageLoop::current()->RunUntilIdle(); | 333 base::MessageLoop::current()->RunUntilIdle(); |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
359 distilled_values[page_num] = CreateDistilledValueReturnedFromJS( | 369 distilled_values[page_num] = CreateDistilledValueReturnedFromJS( |
360 kTitle, content[page_num], vector<int>(), next_page_url); | 370 kTitle, content[page_num], vector<int>(), next_page_url); |
361 } else { | 371 } else { |
362 distilled_values[page_num].reset(base::Value::CreateNullValue()); | 372 distilled_values[page_num].reset(base::Value::CreateNullValue()); |
363 } | 373 } |
364 } | 374 } |
365 | 375 |
366 // Expect only calls till the failed page number. | 376 // Expect only calls till the failed page number. |
367 EXPECT_CALL(page_factory_, CreateDistillerPageMock(_)) | 377 EXPECT_CALL(page_factory_, CreateDistillerPageMock(_)) |
368 .WillOnce(CreateMockDistillerPages( | 378 .WillOnce(CreateMockDistillerPages( |
369 distilled_values, page_urls, failed_page_num + 1)); | 379 distilled_values, page_urls, failed_page_num + 1, 0)); |
370 | 380 |
371 distiller_.reset(new DistillerImpl(page_factory_, url_fetcher_factory_)); | 381 distiller_.reset(new DistillerImpl(page_factory_, url_fetcher_factory_)); |
372 distiller_->Init(); | 382 distiller_->Init(); |
373 distiller_->DistillPage( | 383 distiller_->DistillPage( |
374 GURL(page_urls[0]), | 384 GURL(page_urls[0]), |
375 base::Bind(&DistillerTest::OnDistillPageDone, base::Unretained(this))); | 385 base::Bind(&DistillerTest::OnDistillPageDone, base::Unretained(this))); |
376 base::MessageLoop::current()->RunUntilIdle(); | 386 base::MessageLoop::current()->RunUntilIdle(); |
377 EXPECT_EQ(kTitle, article_proto_->title()); | 387 EXPECT_EQ(kTitle, article_proto_->title()); |
378 EXPECT_EQ(article_proto_->pages_size(), failed_page_num); | 388 EXPECT_EQ(article_proto_->pages_size(), failed_page_num); |
379 for (int page_num = 0; page_num < failed_page_num; ++page_num) { | 389 for (int page_num = 0; page_num < failed_page_num; ++page_num) { |
380 const DistilledPageProto& page = article_proto_->pages(page_num); | 390 const DistilledPageProto& page = article_proto_->pages(page_num); |
381 EXPECT_EQ(content[page_num], page.html()); | 391 EXPECT_EQ(content[page_num], page.html()); |
382 EXPECT_EQ(page_urls[page_num], page.url()); | 392 EXPECT_EQ(page_urls[page_num], page.url()); |
383 } | 393 } |
384 } | 394 } |
385 | 395 |
| 396 TEST_F(DistillerTest, DistillPreviousPage) { |
| 397 base::MessageLoopForUI loop; |
| 398 const int kNumPages = 8; |
| 399 string content[kNumPages]; |
| 400 string page_urls[kNumPages]; |
| 401 scoped_ptr<base::Value> distilled_values[kNumPages]; |
| 402 |
| 403 // The page number of the article on which distillation starts. |
| 404 int start_page_number = 3; |
| 405 string url_prefix = "http://a.com/"; |
| 406 for (int page_no = 0; page_no < kNumPages; ++page_no) { |
| 407 page_urls[page_no] = url_prefix + base::IntToString(page_no); |
| 408 content[page_no] = "Content for page:" + base::IntToString(page_no); |
| 409 string next_page_url = (page_no + 1 < kNumPages) |
| 410 ? url_prefix + base::IntToString(page_no + 1) |
| 411 : ""; |
| 412 string prev_page_url = (page_no > 0) ? page_urls[page_no - 1] : ""; |
| 413 distilled_values[page_no] = CreateDistilledValueReturnedFromJS( |
| 414 kTitle, content[page_no], vector<int>(), next_page_url, prev_page_url); |
| 415 } |
| 416 |
| 417 EXPECT_CALL(page_factory_, CreateDistillerPageMock(_)) |
| 418 .WillOnce(CreateMockDistillerPages( |
| 419 distilled_values, page_urls, kNumPages, start_page_number)); |
| 420 |
| 421 distiller_.reset(new DistillerImpl(page_factory_, url_fetcher_factory_)); |
| 422 distiller_->Init(); |
| 423 distiller_->DistillPage( |
| 424 GURL(page_urls[start_page_number]), |
| 425 base::Bind(&DistillerTest::OnDistillPageDone, base::Unretained(this))); |
| 426 base::MessageLoop::current()->RunUntilIdle(); |
| 427 EXPECT_EQ(kTitle, article_proto_->title()); |
| 428 EXPECT_EQ(kNumPages, article_proto_->pages_size()); |
| 429 for (int page_no = 0; page_no < kNumPages; ++page_no) { |
| 430 const DistilledPageProto& page = article_proto_->pages(page_no); |
| 431 EXPECT_EQ(content[page_no], page.html()); |
| 432 EXPECT_EQ(page_urls[page_no], page.url()); |
| 433 } |
| 434 } |
| 435 |
386 } // namespace dom_distiller | 436 } // namespace dom_distiller |
OLD | NEW |