| 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 "components/dom_distiller/core/distiller.h" | 5 #include "components/dom_distiller/core/distiller.h" |
| 6 | 6 |
| 7 #include <stddef.h> | 7 #include <stddef.h> |
| 8 |
| 8 #include <algorithm> | 9 #include <algorithm> |
| 9 #include <map> | 10 #include <map> |
| 11 #include <memory> |
| 10 #include <string> | 12 #include <string> |
| 11 #include <utility> | 13 #include <utility> |
| 12 #include <vector> | 14 #include <vector> |
| 13 | 15 |
| 14 #include "base/bind.h" | 16 #include "base/bind.h" |
| 15 #include "base/bind_helpers.h" | 17 #include "base/bind_helpers.h" |
| 16 #include "base/location.h" | 18 #include "base/location.h" |
| 17 #include "base/macros.h" | 19 #include "base/macros.h" |
| 18 #include "base/memory/scoped_ptr.h" | |
| 19 #include "base/message_loop/message_loop.h" | 20 #include "base/message_loop/message_loop.h" |
| 20 #include "base/single_thread_task_runner.h" | 21 #include "base/single_thread_task_runner.h" |
| 21 #include "base/strings/string_number_conversions.h" | 22 #include "base/strings/string_number_conversions.h" |
| 22 #include "base/thread_task_runner_handle.h" | 23 #include "base/thread_task_runner_handle.h" |
| 23 #include "base/values.h" | 24 #include "base/values.h" |
| 24 #include "components/dom_distiller/core/article_distillation_update.h" | 25 #include "components/dom_distiller/core/article_distillation_update.h" |
| 25 #include "components/dom_distiller/core/distiller_page.h" | 26 #include "components/dom_distiller/core/distiller_page.h" |
| 26 #include "components/dom_distiller/core/fake_distiller_page.h" | 27 #include "components/dom_distiller/core/fake_distiller_page.h" |
| 27 #include "components/dom_distiller/core/proto/distilled_article.pb.h" | 28 #include "components/dom_distiller/core/proto/distilled_article.pb.h" |
| 28 #include "components/dom_distiller/core/proto/distilled_page.pb.h" | 29 #include "components/dom_distiller/core/proto/distilled_page.pb.h" |
| (...skipping 22 matching lines...) Expand all Loading... |
| 51 const char* kImageURLs[kTotalImages] = {"http://a.com/img1.jpg", | 52 const char* kImageURLs[kTotalImages] = {"http://a.com/img1.jpg", |
| 52 "http://a.com/img2.jpg", | 53 "http://a.com/img2.jpg", |
| 53 "./bad_url_should_fail"}; | 54 "./bad_url_should_fail"}; |
| 54 const char* kImageData[kTotalImages] = {"abcde", "12345", "VWXYZ"}; | 55 const char* kImageData[kTotalImages] = {"abcde", "12345", "VWXYZ"}; |
| 55 const char kDebugLog[] = "Debug Log"; | 56 const char kDebugLog[] = "Debug Log"; |
| 56 | 57 |
| 57 const string GetImageName(int page_num, int image_num) { | 58 const string GetImageName(int page_num, int image_num) { |
| 58 return base::IntToString(page_num) + "_" + base::IntToString(image_num); | 59 return base::IntToString(page_num) + "_" + base::IntToString(image_num); |
| 59 } | 60 } |
| 60 | 61 |
| 61 scoped_ptr<base::Value> CreateDistilledValueReturnedFromJS( | 62 std::unique_ptr<base::Value> CreateDistilledValueReturnedFromJS( |
| 62 const string& title, | 63 const string& title, |
| 63 const string& content, | 64 const string& content, |
| 64 const vector<int>& image_indices, | 65 const vector<int>& image_indices, |
| 65 const string& next_page_url, | 66 const string& next_page_url, |
| 66 const string& prev_page_url = "") { | 67 const string& prev_page_url = "") { |
| 67 DomDistillerResult result; | 68 DomDistillerResult result; |
| 68 result.set_title(title); | 69 result.set_title(title); |
| 69 result.mutable_distilled_content()->set_html(content); | 70 result.mutable_distilled_content()->set_html(content); |
| 70 result.mutable_pagination_info()->set_next_page(next_page_url); | 71 result.mutable_pagination_info()->set_next_page(next_page_url); |
| 71 result.mutable_pagination_info()->set_prev_page(prev_page_url); | 72 result.mutable_pagination_info()->set_prev_page(prev_page_url); |
| (...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 150 string GenerateNextPageUrl(const std::string& url_prefix, size_t page_num, | 151 string GenerateNextPageUrl(const std::string& url_prefix, size_t page_num, |
| 151 size_t pages_size) { | 152 size_t pages_size) { |
| 152 return page_num + 1 < pages_size ? | 153 return page_num + 1 < pages_size ? |
| 153 url_prefix + base::SizeTToString(page_num + 1) : ""; | 154 url_prefix + base::SizeTToString(page_num + 1) : ""; |
| 154 } | 155 } |
| 155 | 156 |
| 156 string GeneratePrevPageUrl(const std::string& url_prefix, size_t page_num) { | 157 string GeneratePrevPageUrl(const std::string& url_prefix, size_t page_num) { |
| 157 return page_num > 0 ? url_prefix + base::SizeTToString(page_num - 1) : ""; | 158 return page_num > 0 ? url_prefix + base::SizeTToString(page_num - 1) : ""; |
| 158 } | 159 } |
| 159 | 160 |
| 160 scoped_ptr<MultipageDistillerData> CreateMultipageDistillerDataWithoutImages( | 161 std::unique_ptr<MultipageDistillerData> |
| 161 size_t pages_size) { | 162 CreateMultipageDistillerDataWithoutImages(size_t pages_size) { |
| 162 scoped_ptr<MultipageDistillerData> result(new MultipageDistillerData()); | 163 std::unique_ptr<MultipageDistillerData> result(new MultipageDistillerData()); |
| 163 string url_prefix = kURL; | 164 string url_prefix = kURL; |
| 164 for (size_t page_num = 0; page_num < pages_size; ++page_num) { | 165 for (size_t page_num = 0; page_num < pages_size; ++page_num) { |
| 165 result->page_urls.push_back(url_prefix + base::SizeTToString(page_num)); | 166 result->page_urls.push_back(url_prefix + base::SizeTToString(page_num)); |
| 166 result->content.push_back("Content for page:" + | 167 result->content.push_back("Content for page:" + |
| 167 base::SizeTToString(page_num)); | 168 base::SizeTToString(page_num)); |
| 168 result->image_ids.push_back(vector<int>()); | 169 result->image_ids.push_back(vector<int>()); |
| 169 string next_page_url = | 170 string next_page_url = |
| 170 GenerateNextPageUrl(url_prefix, page_num, pages_size); | 171 GenerateNextPageUrl(url_prefix, page_num, pages_size); |
| 171 string prev_page_url = | 172 string prev_page_url = |
| 172 GeneratePrevPageUrl(url_prefix, page_num); | 173 GeneratePrevPageUrl(url_prefix, page_num); |
| 173 scoped_ptr<base::Value> distilled_value = | 174 std::unique_ptr<base::Value> distilled_value = |
| 174 CreateDistilledValueReturnedFromJS(kTitle, | 175 CreateDistilledValueReturnedFromJS(kTitle, result->content[page_num], |
| 175 result->content[page_num], | |
| 176 result->image_ids[page_num], | 176 result->image_ids[page_num], |
| 177 next_page_url, | 177 next_page_url, prev_page_url); |
| 178 prev_page_url); | |
| 179 result->distilled_values.push_back(distilled_value.release()); | 178 result->distilled_values.push_back(distilled_value.release()); |
| 180 } | 179 } |
| 181 return result; | 180 return result; |
| 182 } | 181 } |
| 183 | 182 |
| 184 void VerifyArticleProtoMatchesMultipageData( | 183 void VerifyArticleProtoMatchesMultipageData( |
| 185 const dom_distiller::DistilledArticleProto* article_proto, | 184 const dom_distiller::DistilledArticleProto* article_proto, |
| 186 const MultipageDistillerData* distiller_data, | 185 const MultipageDistillerData* distiller_data, |
| 187 size_t distilled_pages_size, | 186 size_t distilled_pages_size, |
| 188 size_t total_pages_size) { | 187 size_t total_pages_size) { |
| (...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 268 MockDistillerURLFetcherFactory() : DistillerURLFetcherFactory(NULL) {} | 267 MockDistillerURLFetcherFactory() : DistillerURLFetcherFactory(NULL) {} |
| 269 virtual ~MockDistillerURLFetcherFactory() {} | 268 virtual ~MockDistillerURLFetcherFactory() {} |
| 270 | 269 |
| 271 MOCK_CONST_METHOD0(CreateDistillerURLFetcher, DistillerURLFetcher*()); | 270 MOCK_CONST_METHOD0(CreateDistillerURLFetcher, DistillerURLFetcher*()); |
| 272 }; | 271 }; |
| 273 | 272 |
| 274 class DistillerTest : public testing::Test { | 273 class DistillerTest : public testing::Test { |
| 275 public: | 274 public: |
| 276 ~DistillerTest() override {} | 275 ~DistillerTest() override {} |
| 277 | 276 |
| 278 void OnDistillArticleDone(scoped_ptr<DistilledArticleProto> proto) { | 277 void OnDistillArticleDone(std::unique_ptr<DistilledArticleProto> proto) { |
| 279 article_proto_ = std::move(proto); | 278 article_proto_ = std::move(proto); |
| 280 } | 279 } |
| 281 | 280 |
| 282 void OnDistillArticleUpdate(const ArticleDistillationUpdate& article_update) { | 281 void OnDistillArticleUpdate(const ArticleDistillationUpdate& article_update) { |
| 283 in_sequence_updates_.push_back(article_update); | 282 in_sequence_updates_.push_back(article_update); |
| 284 } | 283 } |
| 285 | 284 |
| 286 void DistillPage(const std::string& url, | 285 void DistillPage(const std::string& url, |
| 287 scoped_ptr<DistillerPage> distiller_page) { | 286 std::unique_ptr<DistillerPage> distiller_page) { |
| 288 distiller_->DistillPage(GURL(url), std::move(distiller_page), | 287 distiller_->DistillPage(GURL(url), std::move(distiller_page), |
| 289 base::Bind(&DistillerTest::OnDistillArticleDone, | 288 base::Bind(&DistillerTest::OnDistillArticleDone, |
| 290 base::Unretained(this)), | 289 base::Unretained(this)), |
| 291 base::Bind(&DistillerTest::OnDistillArticleUpdate, | 290 base::Bind(&DistillerTest::OnDistillArticleUpdate, |
| 292 base::Unretained(this))); | 291 base::Unretained(this))); |
| 293 } | 292 } |
| 294 | 293 |
| 295 protected: | 294 protected: |
| 296 scoped_ptr<DistillerImpl> distiller_; | 295 std::unique_ptr<DistillerImpl> distiller_; |
| 297 scoped_ptr<DistilledArticleProto> article_proto_; | 296 std::unique_ptr<DistilledArticleProto> article_proto_; |
| 298 std::vector<ArticleDistillationUpdate> in_sequence_updates_; | 297 std::vector<ArticleDistillationUpdate> in_sequence_updates_; |
| 299 MockDistillerPageFactory page_factory_; | 298 MockDistillerPageFactory page_factory_; |
| 300 TestDistillerURLFetcherFactory url_fetcher_factory_; | 299 TestDistillerURLFetcherFactory url_fetcher_factory_; |
| 301 }; | 300 }; |
| 302 | 301 |
| 303 ACTION_P3(DistillerPageOnDistillationDone, distiller_page, url, result) { | 302 ACTION_P3(DistillerPageOnDistillationDone, distiller_page, url, result) { |
| 304 distiller_page->OnDistillationDone(url, result); | 303 distiller_page->OnDistillationDone(url, result); |
| 305 } | 304 } |
| 306 | 305 |
| 307 scoped_ptr<DistillerPage> CreateMockDistillerPage(const base::Value* result, | 306 std::unique_ptr<DistillerPage> CreateMockDistillerPage( |
| 308 const GURL& url) { | 307 const base::Value* result, |
| 308 const GURL& url) { |
| 309 MockDistillerPage* distiller_page = new MockDistillerPage(); | 309 MockDistillerPage* distiller_page = new MockDistillerPage(); |
| 310 EXPECT_CALL(*distiller_page, DistillPageImpl(url, _)) | 310 EXPECT_CALL(*distiller_page, DistillPageImpl(url, _)) |
| 311 .WillOnce(DistillerPageOnDistillationDone(distiller_page, url, result)); | 311 .WillOnce(DistillerPageOnDistillationDone(distiller_page, url, result)); |
| 312 return scoped_ptr<DistillerPage>(distiller_page); | 312 return std::unique_ptr<DistillerPage>(distiller_page); |
| 313 } | 313 } |
| 314 | 314 |
| 315 scoped_ptr<DistillerPage> CreateMockDistillerPageWithPendingJSCallback( | 315 std::unique_ptr<DistillerPage> CreateMockDistillerPageWithPendingJSCallback( |
| 316 MockDistillerPage** distiller_page_ptr, | 316 MockDistillerPage** distiller_page_ptr, |
| 317 const GURL& url) { | 317 const GURL& url) { |
| 318 MockDistillerPage* distiller_page = new MockDistillerPage(); | 318 MockDistillerPage* distiller_page = new MockDistillerPage(); |
| 319 *distiller_page_ptr = distiller_page; | 319 *distiller_page_ptr = distiller_page; |
| 320 EXPECT_CALL(*distiller_page, DistillPageImpl(url, _)); | 320 EXPECT_CALL(*distiller_page, DistillPageImpl(url, _)); |
| 321 return scoped_ptr<DistillerPage>(distiller_page); | 321 return std::unique_ptr<DistillerPage>(distiller_page); |
| 322 } | 322 } |
| 323 | 323 |
| 324 scoped_ptr<DistillerPage> CreateMockDistillerPages( | 324 std::unique_ptr<DistillerPage> CreateMockDistillerPages( |
| 325 MultipageDistillerData* distiller_data, | 325 MultipageDistillerData* distiller_data, |
| 326 size_t pages_size, | 326 size_t pages_size, |
| 327 int start_page_num) { | 327 int start_page_num) { |
| 328 MockDistillerPage* distiller_page = new MockDistillerPage(); | 328 MockDistillerPage* distiller_page = new MockDistillerPage(); |
| 329 { | 329 { |
| 330 testing::InSequence s; | 330 testing::InSequence s; |
| 331 vector<int> page_nums = GetPagesInSequence(start_page_num, pages_size); | 331 vector<int> page_nums = GetPagesInSequence(start_page_num, pages_size); |
| 332 for (size_t page_num = 0; page_num < pages_size; ++page_num) { | 332 for (size_t page_num = 0; page_num < pages_size; ++page_num) { |
| 333 int page = page_nums[page_num]; | 333 int page = page_nums[page_num]; |
| 334 GURL url = GURL(distiller_data->page_urls[page]); | 334 GURL url = GURL(distiller_data->page_urls[page]); |
| 335 EXPECT_CALL(*distiller_page, DistillPageImpl(url, _)) | 335 EXPECT_CALL(*distiller_page, DistillPageImpl(url, _)) |
| 336 .WillOnce(DistillerPageOnDistillationDone( | 336 .WillOnce(DistillerPageOnDistillationDone( |
| 337 distiller_page, url, distiller_data->distilled_values[page])); | 337 distiller_page, url, distiller_data->distilled_values[page])); |
| 338 } | 338 } |
| 339 } | 339 } |
| 340 return scoped_ptr<DistillerPage>(distiller_page); | 340 return std::unique_ptr<DistillerPage>(distiller_page); |
| 341 } | 341 } |
| 342 | 342 |
| 343 TEST_F(DistillerTest, DistillPage) { | 343 TEST_F(DistillerTest, DistillPage) { |
| 344 base::MessageLoopForUI loop; | 344 base::MessageLoopForUI loop; |
| 345 scoped_ptr<base::Value> result = | 345 std::unique_ptr<base::Value> result = |
| 346 CreateDistilledValueReturnedFromJS(kTitle, kContent, vector<int>(), ""); | 346 CreateDistilledValueReturnedFromJS(kTitle, kContent, vector<int>(), ""); |
| 347 distiller_.reset( | 347 distiller_.reset( |
| 348 new DistillerImpl(url_fetcher_factory_, DomDistillerOptions())); | 348 new DistillerImpl(url_fetcher_factory_, DomDistillerOptions())); |
| 349 DistillPage(kURL, CreateMockDistillerPage(result.get(), GURL(kURL))); | 349 DistillPage(kURL, CreateMockDistillerPage(result.get(), GURL(kURL))); |
| 350 base::MessageLoop::current()->RunUntilIdle(); | 350 base::MessageLoop::current()->RunUntilIdle(); |
| 351 EXPECT_EQ(kTitle, article_proto_->title()); | 351 EXPECT_EQ(kTitle, article_proto_->title()); |
| 352 ASSERT_EQ(article_proto_->pages_size(), 1); | 352 ASSERT_EQ(article_proto_->pages_size(), 1); |
| 353 const DistilledPageProto& first_page = article_proto_->pages(0); | 353 const DistilledPageProto& first_page = article_proto_->pages(0); |
| 354 EXPECT_EQ(kContent, first_page.html()); | 354 EXPECT_EQ(kContent, first_page.html()); |
| 355 EXPECT_EQ(kURL, first_page.url()); | 355 EXPECT_EQ(kURL, first_page.url()); |
| 356 } | 356 } |
| 357 | 357 |
| 358 TEST_F(DistillerTest, DistillPageWithDebugInfo) { | 358 TEST_F(DistillerTest, DistillPageWithDebugInfo) { |
| 359 base::MessageLoopForUI loop; | 359 base::MessageLoopForUI loop; |
| 360 DomDistillerResult dd_result; | 360 DomDistillerResult dd_result; |
| 361 dd_result.mutable_debug_info()->set_log(kDebugLog); | 361 dd_result.mutable_debug_info()->set_log(kDebugLog); |
| 362 scoped_ptr<base::Value> result = | 362 std::unique_ptr<base::Value> result = |
| 363 dom_distiller::proto::json::DomDistillerResult::WriteToValue(dd_result); | 363 dom_distiller::proto::json::DomDistillerResult::WriteToValue(dd_result); |
| 364 distiller_.reset( | 364 distiller_.reset( |
| 365 new DistillerImpl(url_fetcher_factory_, DomDistillerOptions())); | 365 new DistillerImpl(url_fetcher_factory_, DomDistillerOptions())); |
| 366 DistillPage(kURL, CreateMockDistillerPage(result.get(), GURL(kURL))); | 366 DistillPage(kURL, CreateMockDistillerPage(result.get(), GURL(kURL))); |
| 367 base::MessageLoop::current()->RunUntilIdle(); | 367 base::MessageLoop::current()->RunUntilIdle(); |
| 368 const DistilledPageProto& first_page = article_proto_->pages(0); | 368 const DistilledPageProto& first_page = article_proto_->pages(0); |
| 369 EXPECT_EQ(kDebugLog, first_page.debug_info().log()); | 369 EXPECT_EQ(kDebugLog, first_page.debug_info().log()); |
| 370 } | 370 } |
| 371 | 371 |
| 372 void SetTimingEntry(TimingEntry* entry, const std::string& name, double time) { | 372 void SetTimingEntry(TimingEntry* entry, const std::string& name, double time) { |
| 373 entry->set_name(name); | 373 entry->set_name(name); |
| 374 entry->set_time(time); | 374 entry->set_time(time); |
| 375 } | 375 } |
| 376 | 376 |
| 377 TEST_F(DistillerTest, DistillPageWithTimingInfo) { | 377 TEST_F(DistillerTest, DistillPageWithTimingInfo) { |
| 378 base::MessageLoopForUI loop; | 378 base::MessageLoopForUI loop; |
| 379 DomDistillerResult dd_result; | 379 DomDistillerResult dd_result; |
| 380 dd_result.mutable_timing_info()->set_total_time(1.0); | 380 dd_result.mutable_timing_info()->set_total_time(1.0); |
| 381 dd_result.mutable_timing_info()->set_markup_parsing_time(2.0); | 381 dd_result.mutable_timing_info()->set_markup_parsing_time(2.0); |
| 382 dd_result.mutable_timing_info()->set_document_construction_time(3.0); | 382 dd_result.mutable_timing_info()->set_document_construction_time(3.0); |
| 383 dd_result.mutable_timing_info()->set_article_processing_time(4.0); | 383 dd_result.mutable_timing_info()->set_article_processing_time(4.0); |
| 384 dd_result.mutable_timing_info()->set_formatting_time(5.0); | 384 dd_result.mutable_timing_info()->set_formatting_time(5.0); |
| 385 SetTimingEntry( | 385 SetTimingEntry( |
| 386 dd_result.mutable_timing_info()->add_other_times(), "time0", 6.0); | 386 dd_result.mutable_timing_info()->add_other_times(), "time0", 6.0); |
| 387 SetTimingEntry( | 387 SetTimingEntry( |
| 388 dd_result.mutable_timing_info()->add_other_times(), "time1", 7.0); | 388 dd_result.mutable_timing_info()->add_other_times(), "time1", 7.0); |
| 389 scoped_ptr<base::Value> result = | 389 std::unique_ptr<base::Value> result = |
| 390 dom_distiller::proto::json::DomDistillerResult::WriteToValue(dd_result); | 390 dom_distiller::proto::json::DomDistillerResult::WriteToValue(dd_result); |
| 391 distiller_.reset( | 391 distiller_.reset( |
| 392 new DistillerImpl(url_fetcher_factory_, DomDistillerOptions())); | 392 new DistillerImpl(url_fetcher_factory_, DomDistillerOptions())); |
| 393 DistillPage(kURL, CreateMockDistillerPage(result.get(), GURL(kURL))); | 393 DistillPage(kURL, CreateMockDistillerPage(result.get(), GURL(kURL))); |
| 394 base::MessageLoop::current()->RunUntilIdle(); | 394 base::MessageLoop::current()->RunUntilIdle(); |
| 395 const DistilledPageProto& first_page = article_proto_->pages(0); | 395 const DistilledPageProto& first_page = article_proto_->pages(0); |
| 396 std::map<std::string, double> timings; | 396 std::map<std::string, double> timings; |
| 397 for (int i = 0; i < first_page.timing_info_size(); ++i) { | 397 for (int i = 0; i < first_page.timing_info_size(); ++i) { |
| 398 DistilledPageProto::TimingInfo timing = first_page.timing_info(i); | 398 DistilledPageProto::TimingInfo timing = first_page.timing_info(i); |
| 399 timings[timing.name()] = timing.time(); | 399 timings[timing.name()] = timing.time(); |
| 400 } | 400 } |
| 401 EXPECT_EQ(7u, timings.size()); | 401 EXPECT_EQ(7u, timings.size()); |
| 402 EXPECT_EQ(1.0, timings["total"]); | 402 EXPECT_EQ(1.0, timings["total"]); |
| 403 EXPECT_EQ(2.0, timings["markup_parsing"]); | 403 EXPECT_EQ(2.0, timings["markup_parsing"]); |
| 404 EXPECT_EQ(3.0, timings["document_construction"]); | 404 EXPECT_EQ(3.0, timings["document_construction"]); |
| 405 EXPECT_EQ(4.0, timings["article_processing"]); | 405 EXPECT_EQ(4.0, timings["article_processing"]); |
| 406 EXPECT_EQ(5.0, timings["formatting"]); | 406 EXPECT_EQ(5.0, timings["formatting"]); |
| 407 EXPECT_EQ(6.0, timings["time0"]); | 407 EXPECT_EQ(6.0, timings["time0"]); |
| 408 EXPECT_EQ(7.0, timings["time1"]); | 408 EXPECT_EQ(7.0, timings["time1"]); |
| 409 } | 409 } |
| 410 | 410 |
| 411 TEST_F(DistillerTest, DistillPageWithImages) { | 411 TEST_F(DistillerTest, DistillPageWithImages) { |
| 412 base::MessageLoopForUI loop; | 412 base::MessageLoopForUI loop; |
| 413 vector<int> image_indices; | 413 vector<int> image_indices; |
| 414 image_indices.push_back(0); | 414 image_indices.push_back(0); |
| 415 image_indices.push_back(1); | 415 image_indices.push_back(1); |
| 416 image_indices.push_back(2); | 416 image_indices.push_back(2); |
| 417 scoped_ptr<base::Value> result = | 417 std::unique_ptr<base::Value> result = |
| 418 CreateDistilledValueReturnedFromJS(kTitle, kContent, image_indices, ""); | 418 CreateDistilledValueReturnedFromJS(kTitle, kContent, image_indices, ""); |
| 419 distiller_.reset( | 419 distiller_.reset( |
| 420 new DistillerImpl(url_fetcher_factory_, DomDistillerOptions())); | 420 new DistillerImpl(url_fetcher_factory_, DomDistillerOptions())); |
| 421 DistillPage(kURL, CreateMockDistillerPage(result.get(), GURL(kURL))); | 421 DistillPage(kURL, CreateMockDistillerPage(result.get(), GURL(kURL))); |
| 422 base::MessageLoop::current()->RunUntilIdle(); | 422 base::MessageLoop::current()->RunUntilIdle(); |
| 423 EXPECT_EQ(kTitle, article_proto_->title()); | 423 EXPECT_EQ(kTitle, article_proto_->title()); |
| 424 ASSERT_EQ(article_proto_->pages_size(), 1); | 424 ASSERT_EQ(article_proto_->pages_size(), 1); |
| 425 const DistilledPageProto& first_page = article_proto_->pages(0); | 425 const DistilledPageProto& first_page = article_proto_->pages(0); |
| 426 EXPECT_EQ(kContent, first_page.html()); | 426 EXPECT_EQ(kContent, first_page.html()); |
| 427 EXPECT_EQ(kURL, first_page.url()); | 427 EXPECT_EQ(kURL, first_page.url()); |
| 428 ASSERT_EQ(2, first_page.image_size()); | 428 ASSERT_EQ(2, first_page.image_size()); |
| 429 EXPECT_EQ(kImageData[0], first_page.image(0).data()); | 429 EXPECT_EQ(kImageData[0], first_page.image(0).data()); |
| 430 EXPECT_EQ(kImageURLs[0], first_page.image(0).url()); | 430 EXPECT_EQ(kImageURLs[0], first_page.image(0).url()); |
| 431 EXPECT_EQ(GetImageName(1, 0), first_page.image(0).name()); | 431 EXPECT_EQ(GetImageName(1, 0), first_page.image(0).name()); |
| 432 EXPECT_EQ(kImageData[1], first_page.image(1).data()); | 432 EXPECT_EQ(kImageData[1], first_page.image(1).data()); |
| 433 EXPECT_EQ(kImageURLs[1], first_page.image(1).url()); | 433 EXPECT_EQ(kImageURLs[1], first_page.image(1).url()); |
| 434 EXPECT_EQ(GetImageName(1, 1), first_page.image(1).name()); | 434 EXPECT_EQ(GetImageName(1, 1), first_page.image(1).name()); |
| 435 } | 435 } |
| 436 | 436 |
| 437 TEST_F(DistillerTest, DistillMultiplePages) { | 437 TEST_F(DistillerTest, DistillMultiplePages) { |
| 438 base::MessageLoopForUI loop; | 438 base::MessageLoopForUI loop; |
| 439 const size_t kNumPages = 8; | 439 const size_t kNumPages = 8; |
| 440 scoped_ptr<MultipageDistillerData> distiller_data = | 440 std::unique_ptr<MultipageDistillerData> distiller_data = |
| 441 CreateMultipageDistillerDataWithoutImages(kNumPages); | 441 CreateMultipageDistillerDataWithoutImages(kNumPages); |
| 442 | 442 |
| 443 // Add images. | 443 // Add images. |
| 444 int next_image_number = 0; | 444 int next_image_number = 0; |
| 445 for (size_t page_num = 0; page_num < kNumPages; ++page_num) { | 445 for (size_t page_num = 0; page_num < kNumPages; ++page_num) { |
| 446 // Each page has different number of images. | 446 // Each page has different number of images. |
| 447 size_t tot_images = (page_num + kTotalImages) % (kTotalImages + 1); | 447 size_t tot_images = (page_num + kTotalImages) % (kTotalImages + 1); |
| 448 vector<int> image_indices; | 448 vector<int> image_indices; |
| 449 for (size_t img_num = 0; img_num < tot_images; img_num++) { | 449 for (size_t img_num = 0; img_num < tot_images; img_num++) { |
| 450 image_indices.push_back(next_image_number); | 450 image_indices.push_back(next_image_number); |
| 451 next_image_number = (next_image_number + 1) % kTotalImages; | 451 next_image_number = (next_image_number + 1) % kTotalImages; |
| 452 } | 452 } |
| 453 distiller_data->image_ids.push_back(image_indices); | 453 distiller_data->image_ids.push_back(image_indices); |
| 454 } | 454 } |
| 455 | 455 |
| 456 distiller_.reset( | 456 distiller_.reset( |
| 457 new DistillerImpl(url_fetcher_factory_, DomDistillerOptions())); | 457 new DistillerImpl(url_fetcher_factory_, DomDistillerOptions())); |
| 458 DistillPage(distiller_data->page_urls[0], | 458 DistillPage(distiller_data->page_urls[0], |
| 459 CreateMockDistillerPages(distiller_data.get(), kNumPages, 0)); | 459 CreateMockDistillerPages(distiller_data.get(), kNumPages, 0)); |
| 460 base::MessageLoop::current()->RunUntilIdle(); | 460 base::MessageLoop::current()->RunUntilIdle(); |
| 461 VerifyArticleProtoMatchesMultipageData( | 461 VerifyArticleProtoMatchesMultipageData( |
| 462 article_proto_.get(), distiller_data.get(), kNumPages, kNumPages); | 462 article_proto_.get(), distiller_data.get(), kNumPages, kNumPages); |
| 463 } | 463 } |
| 464 | 464 |
| 465 TEST_F(DistillerTest, DistillLinkLoop) { | 465 TEST_F(DistillerTest, DistillLinkLoop) { |
| 466 base::MessageLoopForUI loop; | 466 base::MessageLoopForUI loop; |
| 467 // Create a loop, the next page is same as the current page. This could | 467 // Create a loop, the next page is same as the current page. This could |
| 468 // happen if javascript misparses a next page link. | 468 // happen if javascript misparses a next page link. |
| 469 scoped_ptr<base::Value> result = | 469 std::unique_ptr<base::Value> result = |
| 470 CreateDistilledValueReturnedFromJS(kTitle, kContent, vector<int>(), kURL); | 470 CreateDistilledValueReturnedFromJS(kTitle, kContent, vector<int>(), kURL); |
| 471 distiller_.reset( | 471 distiller_.reset( |
| 472 new DistillerImpl(url_fetcher_factory_, DomDistillerOptions())); | 472 new DistillerImpl(url_fetcher_factory_, DomDistillerOptions())); |
| 473 DistillPage(kURL, CreateMockDistillerPage(result.get(), GURL(kURL))); | 473 DistillPage(kURL, CreateMockDistillerPage(result.get(), GURL(kURL))); |
| 474 base::MessageLoop::current()->RunUntilIdle(); | 474 base::MessageLoop::current()->RunUntilIdle(); |
| 475 EXPECT_EQ(kTitle, article_proto_->title()); | 475 EXPECT_EQ(kTitle, article_proto_->title()); |
| 476 EXPECT_EQ(article_proto_->pages_size(), 1); | 476 EXPECT_EQ(article_proto_->pages_size(), 1); |
| 477 } | 477 } |
| 478 | 478 |
| 479 TEST_F(DistillerTest, CheckMaxPageLimitExtraPage) { | 479 TEST_F(DistillerTest, CheckMaxPageLimitExtraPage) { |
| 480 base::MessageLoopForUI loop; | 480 base::MessageLoopForUI loop; |
| 481 const size_t kMaxPagesInArticle = 10; | 481 const size_t kMaxPagesInArticle = 10; |
| 482 scoped_ptr<MultipageDistillerData> distiller_data = | 482 std::unique_ptr<MultipageDistillerData> distiller_data = |
| 483 CreateMultipageDistillerDataWithoutImages(kMaxPagesInArticle); | 483 CreateMultipageDistillerDataWithoutImages(kMaxPagesInArticle); |
| 484 | 484 |
| 485 // Note: Next page url of the last page of article is set. So distiller will | 485 // Note: Next page url of the last page of article is set. So distiller will |
| 486 // try to do kMaxPagesInArticle + 1 calls if the max article limit does not | 486 // try to do kMaxPagesInArticle + 1 calls if the max article limit does not |
| 487 // work. | 487 // work. |
| 488 scoped_ptr<base::Value> last_page_data = | 488 std::unique_ptr<base::Value> last_page_data = |
| 489 CreateDistilledValueReturnedFromJS( | 489 CreateDistilledValueReturnedFromJS( |
| 490 kTitle, | 490 kTitle, distiller_data->content[kMaxPagesInArticle - 1], |
| 491 distiller_data->content[kMaxPagesInArticle - 1], | 491 vector<int>(), "", distiller_data->page_urls[kMaxPagesInArticle - 2]); |
| 492 vector<int>(), | |
| 493 "", | |
| 494 distiller_data->page_urls[kMaxPagesInArticle - 2]); | |
| 495 | 492 |
| 496 distiller_data->distilled_values.pop_back(); | 493 distiller_data->distilled_values.pop_back(); |
| 497 distiller_data->distilled_values.push_back(last_page_data.release()); | 494 distiller_data->distilled_values.push_back(last_page_data.release()); |
| 498 | 495 |
| 499 distiller_.reset( | 496 distiller_.reset( |
| 500 new DistillerImpl(url_fetcher_factory_, DomDistillerOptions())); | 497 new DistillerImpl(url_fetcher_factory_, DomDistillerOptions())); |
| 501 | 498 |
| 502 distiller_->SetMaxNumPagesInArticle(kMaxPagesInArticle); | 499 distiller_->SetMaxNumPagesInArticle(kMaxPagesInArticle); |
| 503 | 500 |
| 504 DistillPage( | 501 DistillPage( |
| 505 distiller_data->page_urls[0], | 502 distiller_data->page_urls[0], |
| 506 CreateMockDistillerPages(distiller_data.get(), kMaxPagesInArticle, 0)); | 503 CreateMockDistillerPages(distiller_data.get(), kMaxPagesInArticle, 0)); |
| 507 base::MessageLoop::current()->RunUntilIdle(); | 504 base::MessageLoop::current()->RunUntilIdle(); |
| 508 EXPECT_EQ(kTitle, article_proto_->title()); | 505 EXPECT_EQ(kTitle, article_proto_->title()); |
| 509 EXPECT_EQ(kMaxPagesInArticle, | 506 EXPECT_EQ(kMaxPagesInArticle, |
| 510 static_cast<size_t>(article_proto_->pages_size())); | 507 static_cast<size_t>(article_proto_->pages_size())); |
| 511 } | 508 } |
| 512 | 509 |
| 513 TEST_F(DistillerTest, CheckMaxPageLimitExactLimit) { | 510 TEST_F(DistillerTest, CheckMaxPageLimitExactLimit) { |
| 514 base::MessageLoopForUI loop; | 511 base::MessageLoopForUI loop; |
| 515 const size_t kMaxPagesInArticle = 10; | 512 const size_t kMaxPagesInArticle = 10; |
| 516 scoped_ptr<MultipageDistillerData> distiller_data = | 513 std::unique_ptr<MultipageDistillerData> distiller_data = |
| 517 CreateMultipageDistillerDataWithoutImages(kMaxPagesInArticle); | 514 CreateMultipageDistillerDataWithoutImages(kMaxPagesInArticle); |
| 518 | 515 |
| 519 distiller_.reset( | 516 distiller_.reset( |
| 520 new DistillerImpl(url_fetcher_factory_, DomDistillerOptions())); | 517 new DistillerImpl(url_fetcher_factory_, DomDistillerOptions())); |
| 521 | 518 |
| 522 // Check if distilling an article with exactly the page limit works. | 519 // Check if distilling an article with exactly the page limit works. |
| 523 distiller_->SetMaxNumPagesInArticle(kMaxPagesInArticle); | 520 distiller_->SetMaxNumPagesInArticle(kMaxPagesInArticle); |
| 524 | 521 |
| 525 DistillPage( | 522 DistillPage( |
| 526 distiller_data->page_urls[0], | 523 distiller_data->page_urls[0], |
| 527 CreateMockDistillerPages(distiller_data.get(), kMaxPagesInArticle, 0)); | 524 CreateMockDistillerPages(distiller_data.get(), kMaxPagesInArticle, 0)); |
| 528 base::MessageLoop::current()->RunUntilIdle(); | 525 base::MessageLoop::current()->RunUntilIdle(); |
| 529 EXPECT_EQ(kTitle, article_proto_->title()); | 526 EXPECT_EQ(kTitle, article_proto_->title()); |
| 530 EXPECT_EQ(kMaxPagesInArticle, | 527 EXPECT_EQ(kMaxPagesInArticle, |
| 531 static_cast<size_t>(article_proto_->pages_size())); | 528 static_cast<size_t>(article_proto_->pages_size())); |
| 532 } | 529 } |
| 533 | 530 |
| 534 TEST_F(DistillerTest, SinglePageDistillationFailure) { | 531 TEST_F(DistillerTest, SinglePageDistillationFailure) { |
| 535 base::MessageLoopForUI loop; | 532 base::MessageLoopForUI loop; |
| 536 // To simulate failure return a null value. | 533 // To simulate failure return a null value. |
| 537 scoped_ptr<base::Value> null_value = base::Value::CreateNullValue(); | 534 std::unique_ptr<base::Value> null_value = base::Value::CreateNullValue(); |
| 538 distiller_.reset( | 535 distiller_.reset( |
| 539 new DistillerImpl(url_fetcher_factory_, DomDistillerOptions())); | 536 new DistillerImpl(url_fetcher_factory_, DomDistillerOptions())); |
| 540 DistillPage(kURL, CreateMockDistillerPage(null_value.get(), GURL(kURL))); | 537 DistillPage(kURL, CreateMockDistillerPage(null_value.get(), GURL(kURL))); |
| 541 base::MessageLoop::current()->RunUntilIdle(); | 538 base::MessageLoop::current()->RunUntilIdle(); |
| 542 EXPECT_EQ("", article_proto_->title()); | 539 EXPECT_EQ("", article_proto_->title()); |
| 543 EXPECT_EQ(0, article_proto_->pages_size()); | 540 EXPECT_EQ(0, article_proto_->pages_size()); |
| 544 } | 541 } |
| 545 | 542 |
| 546 TEST_F(DistillerTest, MultiplePagesDistillationFailure) { | 543 TEST_F(DistillerTest, MultiplePagesDistillationFailure) { |
| 547 base::MessageLoopForUI loop; | 544 base::MessageLoopForUI loop; |
| 548 const size_t kNumPages = 8; | 545 const size_t kNumPages = 8; |
| 549 scoped_ptr<MultipageDistillerData> distiller_data = | 546 std::unique_ptr<MultipageDistillerData> distiller_data = |
| 550 CreateMultipageDistillerDataWithoutImages(kNumPages); | 547 CreateMultipageDistillerDataWithoutImages(kNumPages); |
| 551 | 548 |
| 552 // The page number of the failed page. | 549 // The page number of the failed page. |
| 553 size_t failed_page_num = 3; | 550 size_t failed_page_num = 3; |
| 554 // reset distilled data of the failed page. | 551 // reset distilled data of the failed page. |
| 555 distiller_data->distilled_values.erase( | 552 distiller_data->distilled_values.erase( |
| 556 distiller_data->distilled_values.begin() + failed_page_num); | 553 distiller_data->distilled_values.begin() + failed_page_num); |
| 557 distiller_data->distilled_values.insert( | 554 distiller_data->distilled_values.insert( |
| 558 distiller_data->distilled_values.begin() + failed_page_num, | 555 distiller_data->distilled_values.begin() + failed_page_num, |
| 559 base::Value::CreateNullValue().release()); | 556 base::Value::CreateNullValue().release()); |
| 560 // Expect only calls till the failed page number. | 557 // Expect only calls till the failed page number. |
| 561 distiller_.reset( | 558 distiller_.reset( |
| 562 new DistillerImpl(url_fetcher_factory_, DomDistillerOptions())); | 559 new DistillerImpl(url_fetcher_factory_, DomDistillerOptions())); |
| 563 DistillPage( | 560 DistillPage( |
| 564 distiller_data->page_urls[0], | 561 distiller_data->page_urls[0], |
| 565 CreateMockDistillerPages(distiller_data.get(), failed_page_num + 1, 0)); | 562 CreateMockDistillerPages(distiller_data.get(), failed_page_num + 1, 0)); |
| 566 base::MessageLoop::current()->RunUntilIdle(); | 563 base::MessageLoop::current()->RunUntilIdle(); |
| 567 EXPECT_EQ(kTitle, article_proto_->title()); | 564 EXPECT_EQ(kTitle, article_proto_->title()); |
| 568 VerifyArticleProtoMatchesMultipageData( | 565 VerifyArticleProtoMatchesMultipageData( |
| 569 article_proto_.get(), distiller_data.get(), failed_page_num, kNumPages); | 566 article_proto_.get(), distiller_data.get(), failed_page_num, kNumPages); |
| 570 } | 567 } |
| 571 | 568 |
| 572 TEST_F(DistillerTest, DistillPreviousPage) { | 569 TEST_F(DistillerTest, DistillPreviousPage) { |
| 573 base::MessageLoopForUI loop; | 570 base::MessageLoopForUI loop; |
| 574 const size_t kNumPages = 8; | 571 const size_t kNumPages = 8; |
| 575 | 572 |
| 576 // The page number of the article on which distillation starts. | 573 // The page number of the article on which distillation starts. |
| 577 int start_page_num = 3; | 574 int start_page_num = 3; |
| 578 scoped_ptr<MultipageDistillerData> distiller_data = | 575 std::unique_ptr<MultipageDistillerData> distiller_data = |
| 579 CreateMultipageDistillerDataWithoutImages(kNumPages); | 576 CreateMultipageDistillerDataWithoutImages(kNumPages); |
| 580 | 577 |
| 581 distiller_.reset( | 578 distiller_.reset( |
| 582 new DistillerImpl(url_fetcher_factory_, DomDistillerOptions())); | 579 new DistillerImpl(url_fetcher_factory_, DomDistillerOptions())); |
| 583 DistillPage(distiller_data->page_urls[start_page_num], | 580 DistillPage(distiller_data->page_urls[start_page_num], |
| 584 CreateMockDistillerPages(distiller_data.get(), kNumPages, | 581 CreateMockDistillerPages(distiller_data.get(), kNumPages, |
| 585 start_page_num)); | 582 start_page_num)); |
| 586 base::MessageLoop::current()->RunUntilIdle(); | 583 base::MessageLoop::current()->RunUntilIdle(); |
| 587 VerifyArticleProtoMatchesMultipageData( | 584 VerifyArticleProtoMatchesMultipageData( |
| 588 article_proto_.get(), distiller_data.get(), kNumPages, kNumPages); | 585 article_proto_.get(), distiller_data.get(), kNumPages, kNumPages); |
| 589 } | 586 } |
| 590 | 587 |
| 591 TEST_F(DistillerTest, IncrementalUpdates) { | 588 TEST_F(DistillerTest, IncrementalUpdates) { |
| 592 base::MessageLoopForUI loop; | 589 base::MessageLoopForUI loop; |
| 593 const size_t kNumPages = 8; | 590 const size_t kNumPages = 8; |
| 594 | 591 |
| 595 // The page number of the article on which distillation starts. | 592 // The page number of the article on which distillation starts. |
| 596 int start_page_num = 3; | 593 int start_page_num = 3; |
| 597 scoped_ptr<MultipageDistillerData> distiller_data = | 594 std::unique_ptr<MultipageDistillerData> distiller_data = |
| 598 CreateMultipageDistillerDataWithoutImages(kNumPages); | 595 CreateMultipageDistillerDataWithoutImages(kNumPages); |
| 599 | 596 |
| 600 distiller_.reset( | 597 distiller_.reset( |
| 601 new DistillerImpl(url_fetcher_factory_, DomDistillerOptions())); | 598 new DistillerImpl(url_fetcher_factory_, DomDistillerOptions())); |
| 602 DistillPage(distiller_data->page_urls[start_page_num], | 599 DistillPage(distiller_data->page_urls[start_page_num], |
| 603 CreateMockDistillerPages(distiller_data.get(), kNumPages, | 600 CreateMockDistillerPages(distiller_data.get(), kNumPages, |
| 604 start_page_num)); | 601 start_page_num)); |
| 605 base::MessageLoop::current()->RunUntilIdle(); | 602 base::MessageLoop::current()->RunUntilIdle(); |
| 606 EXPECT_EQ(kTitle, article_proto_->title()); | 603 EXPECT_EQ(kTitle, article_proto_->title()); |
| 607 ASSERT_EQ(kNumPages, static_cast<size_t>(article_proto_->pages_size())); | 604 ASSERT_EQ(kNumPages, static_cast<size_t>(article_proto_->pages_size())); |
| 608 EXPECT_EQ(kNumPages, in_sequence_updates_.size()); | 605 EXPECT_EQ(kNumPages, in_sequence_updates_.size()); |
| 609 | 606 |
| 610 VerifyIncrementalUpdatesMatch( | 607 VerifyIncrementalUpdatesMatch( |
| 611 distiller_data.get(), kNumPages, in_sequence_updates_, start_page_num); | 608 distiller_data.get(), kNumPages, in_sequence_updates_, start_page_num); |
| 612 } | 609 } |
| 613 | 610 |
| 614 TEST_F(DistillerTest, IncrementalUpdatesDoNotDeleteFinalArticle) { | 611 TEST_F(DistillerTest, IncrementalUpdatesDoNotDeleteFinalArticle) { |
| 615 base::MessageLoopForUI loop; | 612 base::MessageLoopForUI loop; |
| 616 const size_t kNumPages = 8; | 613 const size_t kNumPages = 8; |
| 617 int start_page_num = 3; | 614 int start_page_num = 3; |
| 618 scoped_ptr<MultipageDistillerData> distiller_data = | 615 std::unique_ptr<MultipageDistillerData> distiller_data = |
| 619 CreateMultipageDistillerDataWithoutImages(kNumPages); | 616 CreateMultipageDistillerDataWithoutImages(kNumPages); |
| 620 | 617 |
| 621 distiller_.reset( | 618 distiller_.reset( |
| 622 new DistillerImpl(url_fetcher_factory_, DomDistillerOptions())); | 619 new DistillerImpl(url_fetcher_factory_, DomDistillerOptions())); |
| 623 DistillPage(distiller_data->page_urls[start_page_num], | 620 DistillPage(distiller_data->page_urls[start_page_num], |
| 624 CreateMockDistillerPages(distiller_data.get(), kNumPages, | 621 CreateMockDistillerPages(distiller_data.get(), kNumPages, |
| 625 start_page_num)); | 622 start_page_num)); |
| 626 base::MessageLoop::current()->RunUntilIdle(); | 623 base::MessageLoop::current()->RunUntilIdle(); |
| 627 EXPECT_EQ(kNumPages, in_sequence_updates_.size()); | 624 EXPECT_EQ(kNumPages, in_sequence_updates_.size()); |
| 628 | 625 |
| 629 in_sequence_updates_.clear(); | 626 in_sequence_updates_.clear(); |
| 630 | 627 |
| 631 // Should still be able to access article and pages. | 628 // Should still be able to access article and pages. |
| 632 VerifyArticleProtoMatchesMultipageData( | 629 VerifyArticleProtoMatchesMultipageData( |
| 633 article_proto_.get(), distiller_data.get(), kNumPages, kNumPages); | 630 article_proto_.get(), distiller_data.get(), kNumPages, kNumPages); |
| 634 } | 631 } |
| 635 | 632 |
| 636 TEST_F(DistillerTest, DeletingArticleDoesNotInterfereWithUpdates) { | 633 TEST_F(DistillerTest, DeletingArticleDoesNotInterfereWithUpdates) { |
| 637 base::MessageLoopForUI loop; | 634 base::MessageLoopForUI loop; |
| 638 const size_t kNumPages = 8; | 635 const size_t kNumPages = 8; |
| 639 scoped_ptr<MultipageDistillerData> distiller_data = | 636 std::unique_ptr<MultipageDistillerData> distiller_data = |
| 640 CreateMultipageDistillerDataWithoutImages(kNumPages); | 637 CreateMultipageDistillerDataWithoutImages(kNumPages); |
| 641 // The page number of the article on which distillation starts. | 638 // The page number of the article on which distillation starts. |
| 642 int start_page_num = 3; | 639 int start_page_num = 3; |
| 643 | 640 |
| 644 distiller_.reset( | 641 distiller_.reset( |
| 645 new DistillerImpl(url_fetcher_factory_, DomDistillerOptions())); | 642 new DistillerImpl(url_fetcher_factory_, DomDistillerOptions())); |
| 646 DistillPage(distiller_data->page_urls[start_page_num], | 643 DistillPage(distiller_data->page_urls[start_page_num], |
| 647 CreateMockDistillerPages(distiller_data.get(), kNumPages, | 644 CreateMockDistillerPages(distiller_data.get(), kNumPages, |
| 648 start_page_num)); | 645 start_page_num)); |
| 649 base::MessageLoop::current()->RunUntilIdle(); | 646 base::MessageLoop::current()->RunUntilIdle(); |
| 650 EXPECT_EQ(kNumPages, in_sequence_updates_.size()); | 647 EXPECT_EQ(kNumPages, in_sequence_updates_.size()); |
| 651 EXPECT_EQ(kTitle, article_proto_->title()); | 648 EXPECT_EQ(kTitle, article_proto_->title()); |
| 652 ASSERT_EQ(kNumPages, static_cast<size_t>(article_proto_->pages_size())); | 649 ASSERT_EQ(kNumPages, static_cast<size_t>(article_proto_->pages_size())); |
| 653 | 650 |
| 654 // Delete the article. | 651 // Delete the article. |
| 655 article_proto_.reset(); | 652 article_proto_.reset(); |
| 656 VerifyIncrementalUpdatesMatch( | 653 VerifyIncrementalUpdatesMatch( |
| 657 distiller_data.get(), kNumPages, in_sequence_updates_, start_page_num); | 654 distiller_data.get(), kNumPages, in_sequence_updates_, start_page_num); |
| 658 } | 655 } |
| 659 | 656 |
| 660 TEST_F(DistillerTest, CancelWithDelayedImageFetchCallback) { | 657 TEST_F(DistillerTest, CancelWithDelayedImageFetchCallback) { |
| 661 base::MessageLoopForUI loop; | 658 base::MessageLoopForUI loop; |
| 662 vector<int> image_indices; | 659 vector<int> image_indices; |
| 663 image_indices.push_back(0); | 660 image_indices.push_back(0); |
| 664 scoped_ptr<base::Value> distilled_value = | 661 std::unique_ptr<base::Value> distilled_value = |
| 665 CreateDistilledValueReturnedFromJS(kTitle, kContent, image_indices, ""); | 662 CreateDistilledValueReturnedFromJS(kTitle, kContent, image_indices, ""); |
| 666 TestDistillerURLFetcher* delayed_fetcher = new TestDistillerURLFetcher(true); | 663 TestDistillerURLFetcher* delayed_fetcher = new TestDistillerURLFetcher(true); |
| 667 MockDistillerURLFetcherFactory mock_url_fetcher_factory; | 664 MockDistillerURLFetcherFactory mock_url_fetcher_factory; |
| 668 EXPECT_CALL(mock_url_fetcher_factory, CreateDistillerURLFetcher()) | 665 EXPECT_CALL(mock_url_fetcher_factory, CreateDistillerURLFetcher()) |
| 669 .WillOnce(Return(delayed_fetcher)); | 666 .WillOnce(Return(delayed_fetcher)); |
| 670 distiller_.reset( | 667 distiller_.reset( |
| 671 new DistillerImpl(mock_url_fetcher_factory, DomDistillerOptions())); | 668 new DistillerImpl(mock_url_fetcher_factory, DomDistillerOptions())); |
| 672 DistillPage(kURL, CreateMockDistillerPage(distilled_value.get(), GURL(kURL))); | 669 DistillPage(kURL, CreateMockDistillerPage(distilled_value.get(), GURL(kURL))); |
| 673 base::MessageLoop::current()->RunUntilIdle(); | 670 base::MessageLoop::current()->RunUntilIdle(); |
| 674 | 671 |
| 675 // Post callback from the url fetcher and then delete the distiller. | 672 // Post callback from the url fetcher and then delete the distiller. |
| 676 delayed_fetcher->PostCallbackTask(); | 673 delayed_fetcher->PostCallbackTask(); |
| 677 distiller_.reset(); | 674 distiller_.reset(); |
| 678 | 675 |
| 679 base::MessageLoop::current()->RunUntilIdle(); | 676 base::MessageLoop::current()->RunUntilIdle(); |
| 680 } | 677 } |
| 681 | 678 |
| 682 TEST_F(DistillerTest, CancelWithDelayedJSCallback) { | 679 TEST_F(DistillerTest, CancelWithDelayedJSCallback) { |
| 683 base::MessageLoopForUI loop; | 680 base::MessageLoopForUI loop; |
| 684 scoped_ptr<base::Value> distilled_value = | 681 std::unique_ptr<base::Value> distilled_value = |
| 685 CreateDistilledValueReturnedFromJS(kTitle, kContent, vector<int>(), ""); | 682 CreateDistilledValueReturnedFromJS(kTitle, kContent, vector<int>(), ""); |
| 686 MockDistillerPage* distiller_page = NULL; | 683 MockDistillerPage* distiller_page = NULL; |
| 687 distiller_.reset( | 684 distiller_.reset( |
| 688 new DistillerImpl(url_fetcher_factory_, DomDistillerOptions())); | 685 new DistillerImpl(url_fetcher_factory_, DomDistillerOptions())); |
| 689 DistillPage(kURL, | 686 DistillPage(kURL, |
| 690 CreateMockDistillerPageWithPendingJSCallback(&distiller_page, | 687 CreateMockDistillerPageWithPendingJSCallback(&distiller_page, |
| 691 GURL(kURL))); | 688 GURL(kURL))); |
| 692 base::MessageLoop::current()->RunUntilIdle(); | 689 base::MessageLoop::current()->RunUntilIdle(); |
| 693 | 690 |
| 694 ASSERT_TRUE(distiller_page); | 691 ASSERT_TRUE(distiller_page); |
| 695 // Post the task to execute javascript and then delete the distiller. | 692 // Post the task to execute javascript and then delete the distiller. |
| 696 distiller_page->OnDistillationDone(GURL(kURL), distilled_value.get()); | 693 distiller_page->OnDistillationDone(GURL(kURL), distilled_value.get()); |
| 697 distiller_.reset(); | 694 distiller_.reset(); |
| 698 | 695 |
| 699 base::MessageLoop::current()->RunUntilIdle(); | 696 base::MessageLoop::current()->RunUntilIdle(); |
| 700 } | 697 } |
| 701 | 698 |
| 702 } // namespace dom_distiller | 699 } // namespace dom_distiller |
| OLD | NEW |