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

Side by Side Diff: components/favicon/core/favicon_handler_unittest.cc

Issue 2799273002: Add support to process favicons from Web Manifests (Closed)
Patch Set: Reverted fieldtrial_testing_config.json Created 3 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 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/favicon/core/favicon_handler.h" 5 #include "components/favicon/core/favicon_handler.h"
6 6
7 #include <stddef.h> 7 #include <stddef.h>
8 8
9 #include <map> 9 #include <map>
10 #include <memory> 10 #include <memory>
11 #include <set> 11 #include <set>
12 #include <vector> 12 #include <vector>
13 13
14 #include "base/macros.h" 14 #include "base/macros.h"
15 #include "base/memory/ptr_util.h" 15 #include "base/memory/ptr_util.h"
16 #include "base/run_loop.h" 16 #include "base/run_loop.h"
17 #include "base/strings/stringprintf.h" 17 #include "base/strings/stringprintf.h"
18 #include "base/test/histogram_tester.h" 18 #include "base/test/histogram_tester.h"
19 #include "base/test/scoped_feature_list.h"
19 #include "base/test/scoped_task_environment.h" 20 #include "base/test/scoped_task_environment.h"
20 #include "base/test/test_simple_task_runner.h" 21 #include "base/test/test_simple_task_runner.h"
21 #include "components/favicon/core/favicon_driver.h" 22 #include "components/favicon/core/favicon_driver.h"
22 #include "components/favicon/core/test/mock_favicon_service.h" 23 #include "components/favicon/core/test/mock_favicon_service.h"
23 #include "testing/gmock/include/gmock/gmock.h" 24 #include "testing/gmock/include/gmock/gmock.h"
24 #include "testing/gtest/include/gtest/gtest.h" 25 #include "testing/gtest/include/gtest/gtest.h"
25 #include "third_party/skia/include/core/SkBitmap.h" 26 #include "third_party/skia/include/core/SkBitmap.h"
26 #include "third_party/skia/include/core/SkColor.h" 27 #include "third_party/skia/include/core/SkColor.h"
27 #include "ui/base/layout.h" 28 #include "ui/base/layout.h"
28 #include "ui/gfx/codec/png_codec.h" 29 #include "ui/gfx/codec/png_codec.h"
29 #include "ui/gfx/favicon_size.h" 30 #include "ui/gfx/favicon_size.h"
30 #include "ui/gfx/image/image.h" 31 #include "ui/gfx/image/image.h"
31 32
32 namespace favicon { 33 namespace favicon {
33 namespace { 34 namespace {
34 35
35 using favicon_base::FAVICON; 36 using favicon_base::FAVICON;
36 using favicon_base::FaviconRawBitmapResult; 37 using favicon_base::FaviconRawBitmapResult;
37 using favicon_base::TOUCH_ICON; 38 using favicon_base::TOUCH_ICON;
38 using favicon_base::TOUCH_PRECOMPOSED_ICON; 39 using favicon_base::TOUCH_PRECOMPOSED_ICON;
39 using testing::Assign; 40 using testing::Assign;
41 using testing::Contains;
40 using testing::ElementsAre; 42 using testing::ElementsAre;
41 using testing::InSequence; 43 using testing::InSequence;
42 using testing::Invoke; 44 using testing::Invoke;
43 using testing::IsEmpty; 45 using testing::IsEmpty;
46 using testing::Not;
44 using testing::Return; 47 using testing::Return;
45 using testing::_; 48 using testing::_;
46 49
47 using DownloadOutcome = FaviconHandler::DownloadOutcome; 50 using DownloadOutcome = FaviconHandler::DownloadOutcome;
48 using IntVector = std::vector<int>; 51 using IntVector = std::vector<int>;
49 using URLVector = std::vector<GURL>; 52 using URLVector = std::vector<GURL>;
50 using BitmapVector = std::vector<SkBitmap>; 53 using BitmapVector = std::vector<SkBitmap>;
51 using SizeVector = std::vector<gfx::Size>; 54 using SizeVector = std::vector<gfx::Size>;
52 55
53 MATCHER_P2(ImageSizeIs, width, height, "") { 56 MATCHER_P2(ImageSizeIs, width, height, "") {
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after
110 // Fake that implements the calls to FaviconHandler::Delegate's DownloadImage(), 113 // Fake that implements the calls to FaviconHandler::Delegate's DownloadImage(),
111 // delegated to this class through MockDelegate. 114 // delegated to this class through MockDelegate.
112 class FakeImageDownloader { 115 class FakeImageDownloader {
113 public: 116 public:
114 struct Response { 117 struct Response {
115 int http_status_code = 404; 118 int http_status_code = 404;
116 BitmapVector bitmaps; 119 BitmapVector bitmaps;
117 SizeVector original_bitmap_sizes; 120 SizeVector original_bitmap_sizes;
118 }; 121 };
119 122
120 FakeImageDownloader() : next_download_id_(1) {} 123 // |downloads| must not be nullptr and must outlive this object.
124 FakeImageDownloader(URLVector* downloads)
125 : downloads_(downloads), next_download_id_(1) {}
121 126
122 // Implementation of FaviconHalder::Delegate's DownloadImage(). If a given 127 // Implementation of FaviconHalder::Delegate's DownloadImage(). If a given
123 // URL is not known (i.e. not previously added via Add()), it produces 404s. 128 // URL is not known (i.e. not previously added via Add()), it produces 404s.
124 int DownloadImage(const GURL& url, 129 int DownloadImage(const GURL& url,
125 int max_image_size, 130 int max_image_size,
126 FaviconHandler::Delegate::ImageDownloadCallback callback) { 131 FaviconHandler::Delegate::ImageDownloadCallback callback) {
127 downloads_.push_back(url); 132 downloads_->push_back(url);
128 133
129 const Response& response = responses_[url]; 134 const Response& response = responses_[url];
130 int download_id = next_download_id_++; 135 int download_id = next_download_id_++;
131 base::Closure bound_callback = 136 base::Closure bound_callback =
132 base::Bind(callback, download_id, response.http_status_code, url, 137 base::Bind(callback, download_id, response.http_status_code, url,
133 response.bitmaps, response.original_bitmap_sizes); 138 response.bitmaps, response.original_bitmap_sizes);
134 if (url == manual_callback_url_) 139 if (url == manual_callback_url_)
135 manual_callback_ = bound_callback; 140 manual_callback_ = bound_callback;
136 else 141 else
137 base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE, bound_callback); 142 base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE, bound_callback);
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
177 // Triggers the response for a download previously selected for manual 182 // Triggers the response for a download previously selected for manual
178 // triggering via SetRunCallbackManuallyForUrl(). 183 // triggering via SetRunCallbackManuallyForUrl().
179 bool RunCallbackManually() { 184 bool RunCallbackManually() {
180 if (!HasPendingManualCallback()) 185 if (!HasPendingManualCallback())
181 return false; 186 return false;
182 manual_callback_.Run(); 187 manual_callback_.Run();
183 manual_callback_.Reset(); 188 manual_callback_.Reset();
184 return true; 189 return true;
185 } 190 }
186 191
187 // Returns pending and completed download URLs.
188 const URLVector& downloads() const { return downloads_; }
189
190 void ClearDownloads() { downloads_.clear(); }
191
192 private: 192 private:
193 URLVector* downloads_;
193 int next_download_id_; 194 int next_download_id_;
194 195
195 // Pending and completed download URLs.
196 URLVector downloads_;
197
198 // URL to disable automatic callbacks for. 196 // URL to disable automatic callbacks for.
199 GURL manual_callback_url_; 197 GURL manual_callback_url_;
200 198
201 // Callback for DownloadImage() request for |manual_callback_url_|. 199 // Callback for DownloadImage() request for |manual_callback_url_|.
202 base::Closure manual_callback_; 200 base::Closure manual_callback_;
203 201
204 // Registered responses. 202 // Registered responses.
205 std::map<GURL, Response> responses_; 203 std::map<GURL, Response> responses_;
206 204
207 DISALLOW_COPY_AND_ASSIGN(FakeImageDownloader); 205 DISALLOW_COPY_AND_ASSIGN(FakeImageDownloader);
208 }; 206 };
209 207
208 // Fake that implements the calls to FaviconHandler::Delegate's
209 // DownloadManifest(), delegated to this class through MockDelegate.
210 class FakeManifestDownloader {
211 public:
212 struct Response {
213 std::vector<favicon::FaviconURL> favicon_urls;
214 };
215
216 // |downloads| must not be nullptr and must outlive this object.
217 FakeManifestDownloader(URLVector* downloads) : downloads_(downloads) {}
218
219 // Implementation of FaviconHalder::Delegate's DownloadManifest(). If a given
pkotwicz 2017/05/12 06:13:29 Nit: FaviconHalder -> FaviconHandler
220 // URL is not known (i.e. not previously added via Add()), it produces 404s.
221 void DownloadManifest(
222 const GURL& url,
223 FaviconHandler::Delegate::ManifestDownloadCallback callback) {
224 downloads_->push_back(url);
225
226 const Response& response = responses_[url];
227 base::Closure bound_callback = base::Bind(callback, response.favicon_urls);
228 if (url == manual_callback_url_)
229 manual_callback_ = bound_callback;
230 else
231 base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE, bound_callback);
232 }
233
234 void Add(const GURL& manifest_url,
235 const std::vector<favicon::FaviconURL>& favicon_urls) {
236 Response response;
237 response.favicon_urls = favicon_urls;
238 responses_[manifest_url] = response;
239 }
240
241 void AddError(const GURL& manifest_url) {
242 responses_[manifest_url] = Response();
243 }
244
245 // Disables automatic callback for |url|. This is useful for emulating a
246 // download taking a long time. The callback for DownloadManifest() will be
247 // stored in |manual_callback_|.
248 void SetRunCallbackManuallyForUrl(const GURL& url) {
249 manual_callback_url_ = url;
250 }
251
252 // Returns whether an ongoing download exists for a url previously selected
253 // via SetRunCallbackManuallyForUrl().
254 bool HasPendingManualCallback() { return !manual_callback_.is_null(); }
255
256 // Triggers the response for a download previously selected for manual
257 // triggering via SetRunCallbackManuallyForUrl().
258 bool RunCallbackManually() {
259 if (!HasPendingManualCallback())
260 return false;
261 manual_callback_.Run();
262 manual_callback_.Reset();
263 return true;
264 }
265
266 private:
267 URLVector* downloads_;
268
269 // URL to disable automatic callbacks for.
270 GURL manual_callback_url_;
271
272 // Callback for DownloadManifest() request for |manual_callback_url_|.
273 base::Closure manual_callback_;
274
275 // Registered responses.
276 std::map<GURL, Response> responses_;
277
278 DISALLOW_COPY_AND_ASSIGN(FakeManifestDownloader);
279 };
280
210 class MockDelegate : public FaviconHandler::Delegate { 281 class MockDelegate : public FaviconHandler::Delegate {
211 public: 282 public:
212 MockDelegate() { 283 MockDelegate()
284 : fake_image_downloader_(&downloads_),
285 fake_manifest_downloader_(&downloads_) {
213 // Delegate image downloading to FakeImageDownloader. 286 // Delegate image downloading to FakeImageDownloader.
214 ON_CALL(*this, DownloadImage(_, _, _)) 287 ON_CALL(*this, DownloadImage(_, _, _))
215 .WillByDefault(Invoke(&fake_image_downloader_, 288 .WillByDefault(Invoke(&fake_image_downloader_,
216 &FakeImageDownloader::DownloadImage)); 289 &FakeImageDownloader::DownloadImage));
290 // Delegate manifest downloading to FakeManifestDownloader.
291 ON_CALL(*this, DownloadManifest(_, _))
292 .WillByDefault(Invoke(&fake_manifest_downloader_,
293 &FakeManifestDownloader::DownloadManifest));
217 } 294 }
218 295
219 MOCK_METHOD3(DownloadImage, 296 MOCK_METHOD3(DownloadImage,
220 int(const GURL& url, 297 int(const GURL& url,
221 int max_image_size, 298 int max_image_size,
222 ImageDownloadCallback callback)); 299 ImageDownloadCallback callback));
300 MOCK_METHOD2(DownloadManifest,
301 void(const GURL& url, ManifestDownloadCallback callback));
223 MOCK_METHOD0(IsOffTheRecord, bool()); 302 MOCK_METHOD0(IsOffTheRecord, bool());
224 MOCK_METHOD1(IsBookmarked, bool(const GURL& url)); 303 MOCK_METHOD1(IsBookmarked, bool(const GURL& url));
225 MOCK_METHOD5(OnFaviconUpdated, 304 MOCK_METHOD5(OnFaviconUpdated,
226 void(const GURL& page_url, 305 void(const GURL& page_url,
227 FaviconDriverObserver::NotificationIconType type, 306 FaviconDriverObserver::NotificationIconType type,
228 const GURL& icon_url, 307 const GURL& icon_url,
229 bool icon_url_changed, 308 bool icon_url_changed,
230 const gfx::Image& image)); 309 const gfx::Image& image));
231 310
232 FakeImageDownloader& fake_image_downloader() { 311 FakeImageDownloader& fake_image_downloader() {
233 return fake_image_downloader_; 312 return fake_image_downloader_;
234 } 313 }
235 314
236 // Convenience getter for test readability. Returns pending and completed 315 FakeManifestDownloader& fake_manifest_downloader() {
237 // download URLs. 316 return fake_manifest_downloader_;
238 const URLVector& downloads() const {
239 return fake_image_downloader_.downloads();
240 } 317 }
241 318
319 // Returns pending and completed download URLs.
320 const URLVector& downloads() const { return downloads_; }
321
322 void ClearDownloads() { downloads_.clear(); }
323
242 private: 324 private:
325 // Pending and completed download URLs.
326 URLVector downloads_;
243 FakeImageDownloader fake_image_downloader_; 327 FakeImageDownloader fake_image_downloader_;
328 FakeManifestDownloader fake_manifest_downloader_;
244 }; 329 };
245 330
246 // FakeFaviconService mimics a FaviconService backend that allows setting up 331 // FakeFaviconService mimics a FaviconService backend that allows setting up
247 // test data stored via Store(). If Store() has not been called for a 332 // test data stored via Store(). If Store() has not been called for a
248 // particular URL, the callback is called with empty database results. 333 // particular URL, the callback is called with empty database results.
249 class FakeFaviconService { 334 class FakeFaviconService {
250 public: 335 public:
251 FakeFaviconService() 336 FakeFaviconService()
252 : manual_callback_task_runner_(new base::TestSimpleTaskRunner()) {} 337 : manual_callback_task_runner_(new base::TestSimpleTaskRunner()) {}
253 338
(...skipping 143 matching lines...) Expand 10 before | Expand all | Expand 10 after
397 // a downloaded bitmap in FaviconHandler::OnDidDownloadFavicon(). 482 // a downloaded bitmap in FaviconHandler::OnDidDownloadFavicon().
398 // Force the values of the scale factors so that the tests produce the same 483 // Force the values of the scale factors so that the tests produce the same
399 // results on all platforms. 484 // results on all platforms.
400 scoped_set_supported_scale_factors_.reset( 485 scoped_set_supported_scale_factors_.reset(
401 new ui::test::ScopedSetSupportedScaleFactors({ui::SCALE_FACTOR_100P})); 486 new ui::test::ScopedSetSupportedScaleFactors({ui::SCALE_FACTOR_100P}));
402 } 487 }
403 488
404 bool VerifyAndClearExpectations() { 489 bool VerifyAndClearExpectations() {
405 base::RunLoop().RunUntilIdle(); 490 base::RunLoop().RunUntilIdle();
406 favicon_service_.fake()->ClearDbRequests(); 491 favicon_service_.fake()->ClearDbRequests();
407 delegate_.fake_image_downloader().ClearDownloads(); 492 delegate_.ClearDownloads();
408 return testing::Mock::VerifyAndClearExpectations(&favicon_service_) && 493 return testing::Mock::VerifyAndClearExpectations(&favicon_service_) &&
409 testing::Mock::VerifyAndClearExpectations(&delegate_); 494 testing::Mock::VerifyAndClearExpectations(&delegate_);
410 } 495 }
411 496
412 // Creates a new handler and feeds in the page URL and the candidates. 497 // Creates a new handler and feeds in the page URL and the candidates.
413 // Returns the handler in case tests want to exercise further steps. 498 // Returns the handler in case tests want to exercise further steps.
414 std::unique_ptr<FaviconHandler> RunHandlerWithCandidates( 499 std::unique_ptr<FaviconHandler> RunHandlerWithCandidates(
415 FaviconDriverObserver::NotificationIconType handler_type, 500 FaviconDriverObserver::NotificationIconType handler_type,
416 const std::vector<favicon::FaviconURL>& candidates) { 501 const std::vector<favicon::FaviconURL>& candidates,
502 const base::Optional<GURL>& manifest_url = base::nullopt) {
417 auto handler = base::MakeUnique<FaviconHandler>(&favicon_service_, 503 auto handler = base::MakeUnique<FaviconHandler>(&favicon_service_,
418 &delegate_, handler_type); 504 &delegate_, handler_type);
419 handler->FetchFavicon(kPageURL); 505 handler->FetchFavicon(kPageURL);
420 // The first RunUntilIdle() causes the FaviconService lookups be faster than 506 // The first RunUntilIdle() causes the FaviconService lookups be faster than
421 // OnUpdateCandidates(), which is the most likely scenario. 507 // OnUpdateCandidates(), which is the most likely scenario.
422 base::RunLoop().RunUntilIdle(); 508 base::RunLoop().RunUntilIdle();
423 handler->OnUpdateCandidates(kPageURL, candidates); 509 handler->OnUpdateCandidates(kPageURL, candidates, manifest_url);
424 base::RunLoop().RunUntilIdle(); 510 base::RunLoop().RunUntilIdle();
425 return handler; 511 return handler;
426 } 512 }
427 513
428 // Same as above, but for the simplest case where all types are FAVICON and 514 // Same as above, but for the simplest case where all types are FAVICON and
429 // no sizes are provided, using a FaviconHandler of type NON_TOUCH_16_DIP. 515 // no sizes are provided, using a FaviconHandler of type NON_TOUCH_16_DIP.
430 std::unique_ptr<FaviconHandler> RunHandlerWithSimpleFaviconCandidates( 516 std::unique_ptr<FaviconHandler> RunHandlerWithSimpleFaviconCandidates(
431 const std::vector<GURL>& urls) { 517 const std::vector<GURL>& urls,
518 const base::Optional<GURL>& manifest_url = base::nullopt) {
432 std::vector<favicon::FaviconURL> candidates; 519 std::vector<favicon::FaviconURL> candidates;
433 for (const GURL& url : urls) { 520 for (const GURL& url : urls) {
434 candidates.emplace_back(url, FAVICON, kEmptySizes); 521 candidates.emplace_back(url, FAVICON, kEmptySizes);
435 } 522 }
436 return RunHandlerWithCandidates(FaviconDriverObserver::NON_TOUCH_16_DIP, 523 return RunHandlerWithCandidates(FaviconDriverObserver::NON_TOUCH_16_DIP,
437 candidates); 524 candidates, manifest_url);
438 } 525 }
439 526
440 base::test::ScopedTaskEnvironment scoped_task_environment_; 527 base::test::ScopedTaskEnvironment scoped_task_environment_;
441 std::unique_ptr<ui::test::ScopedSetSupportedScaleFactors> 528 std::unique_ptr<ui::test::ScopedSetSupportedScaleFactors>
442 scoped_set_supported_scale_factors_; 529 scoped_set_supported_scale_factors_;
443 testing::NiceMock<MockFaviconServiceWithFake> favicon_service_; 530 testing::NiceMock<MockFaviconServiceWithFake> favicon_service_;
444 testing::NiceMock<MockDelegate> delegate_; 531 testing::NiceMock<MockDelegate> delegate_;
445 }; 532 };
446 533
447 TEST_F(FaviconHandlerTest, GetFaviconFromHistory) { 534 TEST_F(FaviconHandlerTest, GetFaviconFromHistory) {
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
497 ASSERT_TRUE(favicon_service_.fake()->RunCallbackManually()); 584 ASSERT_TRUE(favicon_service_.fake()->RunCallbackManually());
498 ASSERT_TRUE(VerifyAndClearExpectations()); 585 ASSERT_TRUE(VerifyAndClearExpectations());
499 586
500 EXPECT_CALL(favicon_service_, SetFavicons(kPageURL, kIconURL16x16, FAVICON, 587 EXPECT_CALL(favicon_service_, SetFavicons(kPageURL, kIconURL16x16, FAVICON,
501 ImageSizeIs(16, 16))); 588 ImageSizeIs(16, 16)));
502 EXPECT_CALL(delegate_, OnFaviconUpdated( 589 EXPECT_CALL(delegate_, OnFaviconUpdated(
503 kPageURL, FaviconDriverObserver::NON_TOUCH_16_DIP, 590 kPageURL, FaviconDriverObserver::NON_TOUCH_16_DIP,
504 kIconURL16x16, /*icon_url_changed=*/true, _)); 591 kIconURL16x16, /*icon_url_changed=*/true, _));
505 // Feed in favicons now that the database lookup is completed. 592 // Feed in favicons now that the database lookup is completed.
506 handler.OnUpdateCandidates(kPageURL, 593 handler.OnUpdateCandidates(kPageURL,
507 {FaviconURL(kIconURL16x16, FAVICON, kEmptySizes)}); 594 {FaviconURL(kIconURL16x16, FAVICON, kEmptySizes)},
595 base::nullopt);
508 base::RunLoop().RunUntilIdle(); 596 base::RunLoop().RunUntilIdle();
509 597
510 EXPECT_THAT(favicon_service_.fake()->db_requests(), 598 EXPECT_THAT(favicon_service_.fake()->db_requests(),
511 ElementsAre(kIconURL16x16)); 599 ElementsAre(kIconURL16x16));
512 EXPECT_THAT(delegate_.downloads(), ElementsAre(kIconURL16x16)); 600 EXPECT_THAT(delegate_.downloads(), ElementsAre(kIconURL16x16));
513 } 601 }
514 602
515 // Test that the FaviconHandler process finishes when: 603 // Test that the FaviconHandler process finishes when:
516 // - There is data in the database for neither the page URL nor the icon URL. 604 // - There is data in the database for neither the page URL nor the icon URL.
517 // AND 605 // AND
518 // - FaviconService::GetFaviconForPageURL() callback returns after 606 // - FaviconService::GetFaviconForPageURL() callback returns after
519 // FaviconHandler::OnUpdateCandidates() is called. 607 // FaviconHandler::OnUpdateCandidates() is called.
520 TEST_F(FaviconHandlerTest, DownloadUnknownFaviconIfCandidatesFaster) { 608 TEST_F(FaviconHandlerTest, DownloadUnknownFaviconIfCandidatesFaster) {
521 // Defer the database lookup completion to control the exact timing. 609 // Defer the database lookup completion to control the exact timing.
522 favicon_service_.fake()->SetRunCallbackManuallyForUrl(kPageURL); 610 favicon_service_.fake()->SetRunCallbackManuallyForUrl(kPageURL);
523 611
524 EXPECT_CALL(favicon_service_, SetFavicons(_, _, _, _)).Times(0); 612 EXPECT_CALL(favicon_service_, SetFavicons(_, _, _, _)).Times(0);
525 EXPECT_CALL(delegate_, OnFaviconUpdated(_, _, _, _, _)).Times(0); 613 EXPECT_CALL(delegate_, OnFaviconUpdated(_, _, _, _, _)).Times(0);
526 614
527 FaviconHandler handler(&favicon_service_, &delegate_, 615 FaviconHandler handler(&favicon_service_, &delegate_,
528 FaviconDriverObserver::NON_TOUCH_16_DIP); 616 FaviconDriverObserver::NON_TOUCH_16_DIP);
529 handler.FetchFavicon(kPageURL); 617 handler.FetchFavicon(kPageURL);
530 base::RunLoop().RunUntilIdle(); 618 base::RunLoop().RunUntilIdle();
531 // Feed in favicons before completing the database lookup. 619 // Feed in favicons before completing the database lookup.
532 handler.OnUpdateCandidates(kPageURL, 620 handler.OnUpdateCandidates(kPageURL,
533 {FaviconURL(kIconURL16x16, FAVICON, kEmptySizes)}); 621 {FaviconURL(kIconURL16x16, FAVICON, kEmptySizes)},
622 base::nullopt);
534 623
535 ASSERT_TRUE(VerifyAndClearExpectations()); 624 ASSERT_TRUE(VerifyAndClearExpectations());
536 // Database lookup for |kPageURL| is ongoing. 625 // Database lookup for |kPageURL| is ongoing.
537 ASSERT_TRUE(favicon_service_.fake()->HasPendingManualCallback()); 626 ASSERT_TRUE(favicon_service_.fake()->HasPendingManualCallback());
538 627
539 EXPECT_CALL(favicon_service_, SetFavicons(kPageURL, kIconURL16x16, FAVICON, 628 EXPECT_CALL(favicon_service_, SetFavicons(kPageURL, kIconURL16x16, FAVICON,
540 ImageSizeIs(16, 16))); 629 ImageSizeIs(16, 16)));
541 EXPECT_CALL(delegate_, OnFaviconUpdated(_, _, kIconURL16x16, _, _)); 630 EXPECT_CALL(delegate_, OnFaviconUpdated(_, _, kIconURL16x16, _, _));
542 631
543 // Complete the lookup for |kPageURL|. 632 // Complete the lookup for |kPageURL|.
(...skipping 193 matching lines...) Expand 10 before | Expand all | Expand 10 after
737 std::unique_ptr<FaviconHandler> handler = 826 std::unique_ptr<FaviconHandler> handler =
738 RunHandlerWithSimpleFaviconCandidates({kIconURL1, kIconURL2}); 827 RunHandlerWithSimpleFaviconCandidates({kIconURL1, kIconURL2});
739 828
740 ASSERT_TRUE(VerifyAndClearExpectations()); 829 ASSERT_TRUE(VerifyAndClearExpectations());
741 ASSERT_TRUE(delegate_.fake_image_downloader().HasPendingManualCallback()); 830 ASSERT_TRUE(delegate_.fake_image_downloader().HasPendingManualCallback());
742 831
743 // Favicon update should invalidate the ongoing download. 832 // Favicon update should invalidate the ongoing download.
744 EXPECT_CALL(favicon_service_, SetFavicons(_, kIconURL3, _, _)); 833 EXPECT_CALL(favicon_service_, SetFavicons(_, kIconURL3, _, _));
745 EXPECT_CALL(delegate_, OnFaviconUpdated(_, _, kIconURL3, _, _)); 834 EXPECT_CALL(delegate_, OnFaviconUpdated(_, _, kIconURL3, _, _));
746 835
747 handler->OnUpdateCandidates(kPageURL, 836 handler->OnUpdateCandidates(
748 {FaviconURL(kIconURL3, FAVICON, kEmptySizes)}); 837 kPageURL, {FaviconURL(kIconURL3, FAVICON, kEmptySizes)}, base::nullopt);
749 838
750 // Finalizes download, which should be thrown away as the favicon URLs were 839 // Finalizes download, which should be thrown away as the favicon URLs were
751 // updated. 840 // updated.
752 EXPECT_TRUE(delegate_.fake_image_downloader().RunCallbackManually()); 841 EXPECT_TRUE(delegate_.fake_image_downloader().RunCallbackManually());
753 base::RunLoop().RunUntilIdle(); 842 base::RunLoop().RunUntilIdle();
754 843
755 EXPECT_THAT(favicon_service_.fake()->db_requests(), ElementsAre(kIconURL3)); 844 EXPECT_THAT(favicon_service_.fake()->db_requests(), ElementsAre(kIconURL3));
756 EXPECT_THAT(delegate_.downloads(), ElementsAre(kIconURL3)); 845 EXPECT_THAT(delegate_.downloads(), ElementsAre(kIconURL3));
757 } 846 }
758 847
(...skipping 15 matching lines...) Expand all
774 RunHandlerWithSimpleFaviconCandidates(URLVector{kIconURL1}); 863 RunHandlerWithSimpleFaviconCandidates(URLVector{kIconURL1});
775 864
776 ASSERT_TRUE(VerifyAndClearExpectations()); 865 ASSERT_TRUE(VerifyAndClearExpectations());
777 ASSERT_TRUE(favicon_service_.fake()->HasPendingManualCallback()); 866 ASSERT_TRUE(favicon_service_.fake()->HasPendingManualCallback());
778 867
779 // SetFavicons() and OnFaviconUpdated() should be called for the new icon URL 868 // SetFavicons() and OnFaviconUpdated() should be called for the new icon URL
780 // and not |kIconURL1|. 869 // and not |kIconURL1|.
781 EXPECT_CALL(favicon_service_, SetFavicons(_, kIconURL2, _, _)); 870 EXPECT_CALL(favicon_service_, SetFavicons(_, kIconURL2, _, _));
782 EXPECT_CALL(delegate_, OnFaviconUpdated(_, _, kIconURL2, _, _)); 871 EXPECT_CALL(delegate_, OnFaviconUpdated(_, _, kIconURL2, _, _));
783 872
784 handler->OnUpdateCandidates(kPageURL, 873 handler->OnUpdateCandidates(
785 {FaviconURL(kIconURL2, FAVICON, kEmptySizes)}); 874 kPageURL, {FaviconURL(kIconURL2, FAVICON, kEmptySizes)}, base::nullopt);
786 875
787 // Finalizes the DB lookup, which should be thrown away as the favicon URLs 876 // Finalizes the DB lookup, which should be thrown away as the favicon URLs
788 // were updated. 877 // were updated.
789 EXPECT_TRUE(favicon_service_.fake()->RunCallbackManually()); 878 EXPECT_TRUE(favicon_service_.fake()->RunCallbackManually());
790 base::RunLoop().RunUntilIdle(); 879 base::RunLoop().RunUntilIdle();
791 880
792 EXPECT_THAT(favicon_service_.fake()->db_requests(), ElementsAre(kIconURL2)); 881 EXPECT_THAT(favicon_service_.fake()->db_requests(), ElementsAre(kIconURL2));
793 EXPECT_THAT(delegate_.downloads(), ElementsAre(kIconURL2)); 882 EXPECT_THAT(delegate_.downloads(), ElementsAre(kIconURL2));
794 } 883 }
795 884
(...skipping 16 matching lines...) Expand all
812 std::unique_ptr<FaviconHandler> handler = RunHandlerWithCandidates( 901 std::unique_ptr<FaviconHandler> handler = RunHandlerWithCandidates(
813 FaviconDriverObserver::NON_TOUCH_16_DIP, favicon_urls); 902 FaviconDriverObserver::NON_TOUCH_16_DIP, favicon_urls);
814 903
815 ASSERT_THAT(favicon_service_.fake()->db_requests(), 904 ASSERT_THAT(favicon_service_.fake()->db_requests(),
816 ElementsAre(kPageURL, kIconURL64x64, kSlowLoadingIconURL)); 905 ElementsAre(kPageURL, kIconURL64x64, kSlowLoadingIconURL));
817 ASSERT_TRUE(VerifyAndClearExpectations()); 906 ASSERT_TRUE(VerifyAndClearExpectations());
818 ASSERT_TRUE(delegate_.fake_image_downloader().HasPendingManualCallback()); 907 ASSERT_TRUE(delegate_.fake_image_downloader().HasPendingManualCallback());
819 908
820 // Calling OnUpdateCandidates() with the same icon URLs should have no effect, 909 // Calling OnUpdateCandidates() with the same icon URLs should have no effect,
821 // despite the ongoing download. 910 // despite the ongoing download.
822 handler->OnUpdateCandidates(kPageURL, favicon_urls); 911 handler->OnUpdateCandidates(kPageURL, favicon_urls, base::nullopt);
823 base::RunLoop().RunUntilIdle(); 912 base::RunLoop().RunUntilIdle();
824 EXPECT_THAT(favicon_service_.fake()->db_requests(), IsEmpty()); 913 EXPECT_THAT(favicon_service_.fake()->db_requests(), IsEmpty());
825 EXPECT_THAT(delegate_.downloads(), IsEmpty()); 914 EXPECT_THAT(delegate_.downloads(), IsEmpty());
826 915
827 // Complete the download. 916 // Complete the download.
828 EXPECT_CALL(favicon_service_, SetFavicons(_, _, _, _)); 917 EXPECT_CALL(favicon_service_, SetFavicons(_, _, _, _));
829 EXPECT_CALL(delegate_, OnFaviconUpdated(_, _, _, _, _)); 918 EXPECT_CALL(delegate_, OnFaviconUpdated(_, _, _, _, _));
830 EXPECT_TRUE(delegate_.fake_image_downloader().RunCallbackManually()); 919 EXPECT_TRUE(delegate_.fake_image_downloader().RunCallbackManually());
831 base::RunLoop().RunUntilIdle(); 920 base::RunLoop().RunUntilIdle();
832 EXPECT_THAT(delegate_.downloads(), IsEmpty()); 921 EXPECT_THAT(delegate_.downloads(), IsEmpty());
(...skipping 13 matching lines...) Expand all
846 935
847 // Ongoing database lookup. 936 // Ongoing database lookup.
848 ASSERT_THAT(favicon_service_.fake()->db_requests(), 937 ASSERT_THAT(favicon_service_.fake()->db_requests(),
849 ElementsAre(kPageURL, kIconURL64x64)); 938 ElementsAre(kPageURL, kIconURL64x64));
850 ASSERT_THAT(delegate_.downloads(), IsEmpty()); 939 ASSERT_THAT(delegate_.downloads(), IsEmpty());
851 ASSERT_TRUE(VerifyAndClearExpectations()); 940 ASSERT_TRUE(VerifyAndClearExpectations());
852 ASSERT_TRUE(favicon_service_.fake()->HasPendingManualCallback()); 941 ASSERT_TRUE(favicon_service_.fake()->HasPendingManualCallback());
853 942
854 // Calling OnUpdateCandidates() with the same icon URLs should have no effect, 943 // Calling OnUpdateCandidates() with the same icon URLs should have no effect,
855 // despite the ongoing DB lookup. 944 // despite the ongoing DB lookup.
856 handler->OnUpdateCandidates(kPageURL, favicon_urls); 945 handler->OnUpdateCandidates(kPageURL, favicon_urls, base::nullopt);
857 base::RunLoop().RunUntilIdle(); 946 base::RunLoop().RunUntilIdle();
858 EXPECT_THAT(favicon_service_.fake()->db_requests(), IsEmpty()); 947 EXPECT_THAT(favicon_service_.fake()->db_requests(), IsEmpty());
859 EXPECT_THAT(delegate_.downloads(), IsEmpty()); 948 EXPECT_THAT(delegate_.downloads(), IsEmpty());
860 949
861 // Complete the lookup. 950 // Complete the lookup.
862 EXPECT_CALL(favicon_service_, SetFavicons(_, _, _, _)); 951 EXPECT_CALL(favicon_service_, SetFavicons(_, _, _, _));
863 EXPECT_CALL(delegate_, OnFaviconUpdated(_, _, _, _, _)); 952 EXPECT_CALL(delegate_, OnFaviconUpdated(_, _, _, _, _));
864 EXPECT_TRUE(favicon_service_.fake()->RunCallbackManually()); 953 EXPECT_TRUE(favicon_service_.fake()->RunCallbackManually());
865 base::RunLoop().RunUntilIdle(); 954 base::RunLoop().RunUntilIdle();
866 EXPECT_THAT(delegate_.downloads(), ElementsAre(kIconURL64x64)); 955 EXPECT_THAT(delegate_.downloads(), ElementsAre(kIconURL64x64));
(...skipping 10 matching lines...) Expand all
877 966
878 std::unique_ptr<FaviconHandler> handler = RunHandlerWithCandidates( 967 std::unique_ptr<FaviconHandler> handler = RunHandlerWithCandidates(
879 FaviconDriverObserver::NON_TOUCH_16_DIP, favicon_urls); 968 FaviconDriverObserver::NON_TOUCH_16_DIP, favicon_urls);
880 969
881 ASSERT_TRUE(VerifyAndClearExpectations()); 970 ASSERT_TRUE(VerifyAndClearExpectations());
882 971
883 // Calling OnUpdateCandidates() with identical data should be a no-op. 972 // Calling OnUpdateCandidates() with identical data should be a no-op.
884 EXPECT_CALL(delegate_, OnFaviconUpdated(_, _, _, _, _)).Times(0); 973 EXPECT_CALL(delegate_, OnFaviconUpdated(_, _, _, _, _)).Times(0);
885 EXPECT_CALL(favicon_service_, SetFavicons(_, _, _, _)).Times(0); 974 EXPECT_CALL(favicon_service_, SetFavicons(_, _, _, _)).Times(0);
886 975
887 handler->OnUpdateCandidates(kPageURL, favicon_urls); 976 handler->OnUpdateCandidates(kPageURL, favicon_urls, base::nullopt);
888 base::RunLoop().RunUntilIdle(); 977 base::RunLoop().RunUntilIdle();
889 EXPECT_THAT(favicon_service_.fake()->db_requests(), IsEmpty()); 978 EXPECT_THAT(favicon_service_.fake()->db_requests(), IsEmpty());
890 EXPECT_THAT(delegate_.downloads(), IsEmpty()); 979 EXPECT_THAT(delegate_.downloads(), IsEmpty());
891 } 980 }
892 981
893 // Fixes crbug.com/544560 982 // Fixes crbug.com/544560
894 // Tests that Delegate::OnFaviconUpdated() is called if: 983 // Tests that Delegate::OnFaviconUpdated() is called if:
895 // - The best icon on the initial page is not the last icon. 984 // - The best icon on the initial page is not the last icon.
896 // - All of the initial page's icons are downloaded. 985 // - All of the initial page's icons are downloaded.
897 // AND 986 // AND
(...skipping 21 matching lines...) Expand all
919 // database and downloaded. |kIconURL2| should have been fetched from the 1008 // database and downloaded. |kIconURL2| should have been fetched from the
920 // database and downloaded last. 1009 // database and downloaded last.
921 ASSERT_THAT(delegate_.downloads(), ElementsAre(kIconURL1, kIconURL2)); 1010 ASSERT_THAT(delegate_.downloads(), ElementsAre(kIconURL1, kIconURL2));
922 ASSERT_THAT(favicon_service_.fake()->db_requests(), 1011 ASSERT_THAT(favicon_service_.fake()->db_requests(),
923 ElementsAre(kPageURL, kIconURL1, kIconURL2)); 1012 ElementsAre(kPageURL, kIconURL1, kIconURL2));
924 ASSERT_TRUE(VerifyAndClearExpectations()); 1013 ASSERT_TRUE(VerifyAndClearExpectations());
925 1014
926 // Simulate the page changing it's icon URL to just |kIconURL2| via 1015 // Simulate the page changing it's icon URL to just |kIconURL2| via
927 // Javascript. 1016 // Javascript.
928 EXPECT_CALL(delegate_, OnFaviconUpdated(_, _, kIconURL2, _, _)); 1017 EXPECT_CALL(delegate_, OnFaviconUpdated(_, _, kIconURL2, _, _));
929 handler->OnUpdateCandidates(kPageURL, 1018 handler->OnUpdateCandidates(
930 {FaviconURL(kIconURL2, FAVICON, kEmptySizes)}); 1019 kPageURL, {FaviconURL(kIconURL2, FAVICON, kEmptySizes)}, base::nullopt);
931 base::RunLoop().RunUntilIdle(); 1020 base::RunLoop().RunUntilIdle();
932 } 1021 }
933 1022
934 // Test the favicon which is selected when the web page provides several 1023 // Test the favicon which is selected when the web page provides several
935 // favicons and none of the favicons are cached in history. 1024 // favicons and none of the favicons are cached in history.
936 // The goal of this test is to be more of an integration test than 1025 // The goal of this test is to be more of an integration test than
937 // SelectFaviconFramesTest.*. 1026 // SelectFaviconFramesTest.*.
938 class FaviconHandlerMultipleFaviconsTest : public FaviconHandlerTest { 1027 class FaviconHandlerMultipleFaviconsTest : public FaviconHandlerTest {
939 protected: 1028 protected:
940 FaviconHandlerMultipleFaviconsTest() { 1029 FaviconHandlerMultipleFaviconsTest() {
(...skipping 422 matching lines...) Expand 10 before | Expand all | Expand 10 after
1363 .WillByDefault(Return(true)); 1452 .WillByDefault(Return(true));
1364 1453
1365 RunHandlerWithSimpleFaviconCandidates({k404IconURL}); 1454 RunHandlerWithSimpleFaviconCandidates({k404IconURL});
1366 1455
1367 EXPECT_THAT( 1456 EXPECT_THAT(
1368 histogram_tester.GetAllSamples("Favicons.DownloadOutcome"), 1457 histogram_tester.GetAllSamples("Favicons.DownloadOutcome"),
1369 ElementsAre(base::Bucket(static_cast<int>(DownloadOutcome::SKIPPED), 1458 ElementsAre(base::Bucket(static_cast<int>(DownloadOutcome::SKIPPED),
1370 /*expected_count=*/1))); 1459 /*expected_count=*/1)));
1371 } 1460 }
1372 1461
1462 // Test that the support for Web Manifest is disabled by default, unless the
1463 // feature is enabled.
1464 TEST_F(FaviconHandlerTest, IgnoreWebManifestByDefault) {
1465 const GURL kManifestURL("http://www.google.com/manifest.json");
1466
1467 RunHandlerWithSimpleFaviconCandidates({kIconURL16x16}, kManifestURL);
1468 EXPECT_THAT(favicon_service_.fake()->db_requests(),
1469 Not(Contains(kManifestURL)));
1470 EXPECT_THAT(delegate_.downloads(), Not(Contains(kManifestURL)));
1471 }
1472
1473 class FaviconHandlerManifestsEnabledTest : public FaviconHandlerTest {
1474 protected:
1475 FaviconHandlerManifestsEnabledTest() {
1476 override_features_.InitAndEnableFeature(kFaviconsFromWebManifest);
1477 }
1478
1479 private:
1480 base::test::ScopedFeatureList override_features_;
pkotwicz 2017/05/12 07:20:26 Nit: DISALLOW_COPY_AND_ASSIGN(FaviconHandlerManife
mastiz 2017/05/12 13:31:33 Done, although it's unnecessary because the base c
1481 };
1482
1483 // Test that a favicon corresponding to a web manifest is reported when:
1484 // - There is data in the favicon database for the manifest URL.
1485 // AND
1486 // - FaviconService::OnFaviconDataForManifestFromFaviconService() runs before
1487 // FaviconHandler::OnUpdateCandidates() is called.
pkotwicz 2017/05/12 07:20:26 You mean FaviconHandler::OnFaviconDataForInitialUR
mastiz 2017/05/12 13:31:33 Done.
1488 TEST_F(FaviconHandlerManifestsEnabledTest,
1489 GetFaviconFromManifestInHistoryIfCandidatesSlower) {
1490 const GURL kManifestURL("http://www.google.com/manifest.json");
1491
1492 favicon_service_.fake()->Store(kPageURL, kManifestURL,
1493 CreateRawBitmapResult(kManifestURL));
1494
1495 EXPECT_CALL(favicon_service_, UnableToDownloadFavicon(_)).Times(0);
1496
1497 EXPECT_CALL(favicon_service_,
1498 UpdateFaviconMappingsAndFetch(_, kManifestURL, FAVICON,
1499 /*desired_size_in_dip=*/16, _, _));
1500 EXPECT_CALL(delegate_,
1501 OnFaviconUpdated(_, FaviconDriverObserver::NON_TOUCH_16_DIP,
1502 kManifestURL, _, _))
1503 .Times(2);
1504
1505 RunHandlerWithSimpleFaviconCandidates({kIconURL12x12}, kManifestURL);
1506 EXPECT_THAT(favicon_service_.fake()->db_requests(),
1507 ElementsAre(kPageURL, kManifestURL));
1508 EXPECT_THAT(delegate_.downloads(), IsEmpty());
1509 }
1510
1511 // Test that a favicon corresponding to a web manifest is reported when:
1512 // - There is data in the favicon database for the manifest URL.
1513 // AND
1514 // - FaviconHandler::OnUpdateCandidates() is called before
1515 // FaviconService::OnFaviconDataForManifestFromFaviconService() runs.
pkotwicz 2017/05/12 07:20:26 You mean FaviconHandler::OnFaviconDataForInitialUR
mastiz 2017/05/12 13:31:33 Done.
1516 TEST_F(FaviconHandlerManifestsEnabledTest,
1517 GetFaviconFromManifestInHistoryIfCandidatesFaster) {
1518 const GURL kManifestURL("http://www.google.com/manifest.json");
1519
1520 favicon_service_.fake()->Store(kPageURL, kManifestURL,
1521 CreateRawBitmapResult(kManifestURL));
1522
1523 EXPECT_CALL(favicon_service_, UnableToDownloadFavicon(_)).Times(0);
1524
1525 EXPECT_CALL(favicon_service_,
1526 UpdateFaviconMappingsAndFetch(_, kManifestURL, FAVICON,
1527 /*desired_size_in_dip=*/16, _, _));
1528 EXPECT_CALL(delegate_,
1529 OnFaviconUpdated(_, FaviconDriverObserver::NON_TOUCH_16_DIP,
1530 kManifestURL, _, _))
1531 .Times(2);
1532
1533 FaviconHandler handler(&favicon_service_, &delegate_,
1534 FaviconDriverObserver::NON_TOUCH_16_DIP);
1535 handler.FetchFavicon(kPageURL);
1536 // Feed in candidates without processing posted tasks (RunUntilIdle()).
1537 handler.OnUpdateCandidates(kPageURL,
1538 {FaviconURL(kIconURL12x12, FAVICON, kEmptySizes)},
1539 kManifestURL);
1540 base::RunLoop().RunUntilIdle();
1541
1542 EXPECT_THAT(favicon_service_.fake()->db_requests(),
1543 ElementsAre(kPageURL, kManifestURL));
1544 EXPECT_THAT(delegate_.downloads(), IsEmpty());
1545 }
1546
1547 // Test that a favicon corresponding to a web manifest is reported when there is
1548 // data in the database for neither the page URL nor the manifest URL.
1549 TEST_F(FaviconHandlerManifestsEnabledTest, GetFaviconFromUnknownManifest) {
1550 const GURL kManifestURL("http://www.google.com/manifest.json");
1551 const std::vector<favicon::FaviconURL> kManifestIcons = {
1552 FaviconURL(kIconURL16x16, FAVICON, kEmptySizes),
1553 };
1554
1555 delegate_.fake_manifest_downloader().Add(kManifestURL, kManifestIcons);
1556
1557 EXPECT_CALL(favicon_service_, UnableToDownloadFavicon(_)).Times(0);
1558
1559 EXPECT_CALL(favicon_service_, SetFavicons(_, kManifestURL, FAVICON, _));
1560 EXPECT_CALL(delegate_, OnFaviconUpdated(_, _, kManifestURL, _, _));
1561
1562 RunHandlerWithSimpleFaviconCandidates({kIconURL12x12}, kManifestURL);
1563 EXPECT_THAT(favicon_service_.fake()->db_requests(),
1564 ElementsAre(kPageURL, kManifestURL));
1565 EXPECT_THAT(delegate_.downloads(), ElementsAre(kManifestURL, kIconURL16x16));
1566 }
1567
1568 // Test that the manifest and icon are redownloaded if the icon cached for the
1569 // page URL expired.
1570 TEST_F(FaviconHandlerManifestsEnabledTest, GetFaviconFromExpiredManifest) {
1571 const GURL kManifestURL("http://www.google.com/manifest.json");
1572 const std::vector<favicon::FaviconURL> kManifestIcons = {
1573 FaviconURL(kIconURL64x64, FAVICON, kEmptySizes),
1574 };
1575
1576 favicon_service_.fake()->Store(kPageURL, kManifestURL,
1577 CreateRawBitmapResult(kManifestURL, FAVICON,
1578 /*expired=*/true));
1579 delegate_.fake_manifest_downloader().Add(kManifestURL, kManifestIcons);
1580
1581 // The third notification is unnecessary, but allows simplifying the code.
1582 EXPECT_CALL(delegate_, OnFaviconUpdated(_, _, kManifestURL, _, _)).Times(3);
1583 EXPECT_CALL(favicon_service_, SetFavicons(_, kManifestURL, _, _));
1584
1585 RunHandlerWithSimpleFaviconCandidates({kIconURL12x12}, kManifestURL);
1586 EXPECT_THAT(favicon_service_.fake()->db_requests(),
1587 ElementsAre(kPageURL, kManifestURL));
1588 EXPECT_THAT(delegate_.downloads(), ElementsAre(kManifestURL, kIconURL64x64));
1589 }
1590
1591 // Test that the manifest and icon are redownloaded if the icon cached for the
1592 // manifest URL expired, which was observed during a visit to a different page
1593 // URL.
1594 TEST_F(FaviconHandlerManifestsEnabledTest,
1595 GetFaviconFromExpiredManifestLinkedFromOtherPage) {
1596 const GURL kSomePreviousPageURL("https://www.google.com/previous");
1597 const GURL kManifestURL("http://www.google.com/manifest.json");
1598 const std::vector<favicon::FaviconURL> kManifestIcons = {
1599 FaviconURL(kIconURL64x64, FAVICON, kEmptySizes),
1600 };
1601
1602 favicon_service_.fake()->Store(kSomePreviousPageURL, kManifestURL,
1603 CreateRawBitmapResult(kManifestURL, FAVICON,
1604 /*expired=*/true));
1605 delegate_.fake_manifest_downloader().Add(kManifestURL, kManifestIcons);
1606
1607 EXPECT_CALL(delegate_, OnFaviconUpdated(_, _, kManifestURL, _, _)).Times(2);
1608 EXPECT_CALL(favicon_service_, SetFavicons(_, kManifestURL, _, _));
1609
1610 RunHandlerWithSimpleFaviconCandidates({kIconURL12x12}, kManifestURL);
1611 EXPECT_THAT(favicon_service_.fake()->db_requests(),
1612 ElementsAre(kPageURL, kManifestURL));
1613 EXPECT_THAT(delegate_.downloads(), ElementsAre(kManifestURL, kIconURL64x64));
1614 }
1615
1616 // Test that a favicon corresponding to a web manifest is reported when:
1617 // - There is data in the database for neither the page URL nor the manifest
1618 // URL.
1619 // - There is data in the database for the icon URL listed in the manifest.
1620 TEST_F(FaviconHandlerManifestsEnabledTest,
1621 GetFaviconFromUnknownManifestButKnownIcon) {
1622 const GURL kSomePreviousPageURL("https://www.google.com/previous");
1623 const GURL kManifestURL("http://www.google.com/manifest.json");
1624 const std::vector<favicon::FaviconURL> kManifestIcons = {
1625 FaviconURL(kIconURL16x16, FAVICON, kEmptySizes),
1626 };
1627
1628 favicon_service_.fake()->Store(kSomePreviousPageURL, kIconURL16x16,
1629 CreateRawBitmapResult(kIconURL16x16));
1630 delegate_.fake_manifest_downloader().Add(kManifestURL, kManifestIcons);
1631
1632 EXPECT_CALL(favicon_service_, SetFavicons(_, kManifestURL, FAVICON, _));
pkotwicz 2017/05/12 07:20:26 We don't care about the icon type here
mastiz 2017/05/12 13:31:33 Done.
1633 EXPECT_CALL(delegate_, OnFaviconUpdated(_, _, kManifestURL, _, _));
1634
1635 RunHandlerWithSimpleFaviconCandidates(URLVector(), kManifestURL);
1636 EXPECT_THAT(favicon_service_.fake()->db_requests(),
1637 ElementsAre(kPageURL, kManifestURL));
1638 // In the current implementation, the icon is downloaded although it's in the
1639 // database. This is because the icon has been cached earlier using the icon
1640 // URL instead of the manifest's URL.
pkotwicz 2017/05/12 07:20:26 How about: "This is because FaviconHandler only ch
mastiz 2017/05/12 13:31:33 Done.
1641 EXPECT_THAT(delegate_.downloads(), ElementsAre(kManifestURL, kIconURL16x16));
1642 }
1643
1644 // Test that attempting to download a manifest that returns a 404 gets
1645 // blacklisted via UnableToDownloadFavicon() AND that the regular favicon is
1646 // selected as fallback.
1647 TEST_F(FaviconHandlerManifestsEnabledTest, UnknownManifestReturning404) {
1648 const GURL kManifestURL("http://www.google.com/manifest.json");
1649
1650 EXPECT_CALL(favicon_service_, UnableToDownloadFavicon(kManifestURL));
1651 EXPECT_CALL(favicon_service_, SetFavicons(_, kIconURL12x12, FAVICON, _));
pkotwicz 2017/05/12 07:20:26 We don't care about the icon type here either
mastiz 2017/05/12 13:31:33 Done.
1652
1653 RunHandlerWithSimpleFaviconCandidates({kIconURL12x12}, kManifestURL);
1654 EXPECT_THAT(favicon_service_.fake()->db_requests(),
1655 ElementsAre(kPageURL, kManifestURL, kIconURL12x12));
1656 EXPECT_THAT(delegate_.downloads(), ElementsAre(kManifestURL, kIconURL12x12));
1657 }
1658
1659 // Test that a manifest that was previously blacklisted via
1660 // UnableToDownloadFavicon() is ignored and that the regular favicon is selected
1661 // as fallback.
1662 TEST_F(FaviconHandlerManifestsEnabledTest, IgnoreManifestWithPrior404) {
1663 const GURL kManifestURL("http://www.google.com/manifest.json");
1664
1665 ON_CALL(favicon_service_, WasUnableToDownloadFavicon(kManifestURL))
1666 .WillByDefault(Return(true));
1667
1668 EXPECT_CALL(favicon_service_, SetFavicons(_, kIconURL12x12, FAVICON, _));
1669
1670 RunHandlerWithSimpleFaviconCandidates({kIconURL12x12}, kManifestURL);
1671 EXPECT_THAT(favicon_service_.fake()->db_requests(),
1672 ElementsAre(kPageURL, kIconURL12x12));
1673 EXPECT_THAT(delegate_.downloads(), ElementsAre(kIconURL12x12));
1674 }
1675
1676 // Test that the regular favicon is selected when:
1677 // - The page links to a Web Manifest.
1678 // - The Web Manifest does not contain any icon URLs (it is not a 404).
1679 // - The page has an icon URL provided via a <link rel="icon"> tag.
1680 // - The database does not know about the page URL, manifest URL or icon URL.
1681 TEST_F(FaviconHandlerManifestsEnabledTest, UnknownManifestWithoutIcons) {
1682 const GURL kManifestURL("http://www.google.com/manifest.json");
1683
1684 delegate_.fake_manifest_downloader().Add(kManifestURL,
1685 std::vector<favicon::FaviconURL>());
1686
1687 // UnableToDownloadFavicon() is expected to prevent repeated downloads of the
1688 // same manifest (which is not otherwise cached, since it doesn't contain
1689 // icons).
1690 EXPECT_CALL(favicon_service_, UnableToDownloadFavicon(kManifestURL));
1691 EXPECT_CALL(favicon_service_, SetFavicons(_, kIconURL12x12, FAVICON, _));
1692
1693 RunHandlerWithSimpleFaviconCandidates({kIconURL12x12}, kManifestURL);
1694 EXPECT_THAT(favicon_service_.fake()->db_requests(),
1695 ElementsAre(kPageURL, kManifestURL, kIconURL12x12));
1696 EXPECT_THAT(delegate_.downloads(), ElementsAre(kManifestURL, kIconURL12x12));
1697 }
1698
1699 // Test that the regular favicon is selected when:
1700 // - The page links to a Web Manifest.
1701 // - The Web Manifest does not contain any icon URLs (it is not a 404).
1702 // - The page has an icon URL provided via a <link rel="icon"> tag.
1703 // - The database does not know about the page URL.
1704 // - The database does not know about the manifest URL.
1705 // - The database knows about the icon URL.
1706 TEST_F(FaviconHandlerManifestsEnabledTest,
1707 UnknownManifestWithoutIconsAndKnownRegularIcons) {
1708 const GURL kSomePreviousPageURL("https://www.google.com/previous");
1709 const GURL kManifestURL("http://www.google.com/manifest.json");
1710
1711 delegate_.fake_manifest_downloader().Add(kManifestURL,
1712 std::vector<favicon::FaviconURL>());
1713 favicon_service_.fake()->Store(kSomePreviousPageURL, kIconURL12x12,
1714 CreateRawBitmapResult(kIconURL12x12));
1715
1716 EXPECT_CALL(favicon_service_, SetFavicons(_, _, _, _)).Times(0);
1717
1718 // UnableToDownloadFavicon() is expected to prevent repeated downloads of the
1719 // same manifest (which is not otherwise cached, since it doesn't contain
1720 // icons).
1721 EXPECT_CALL(favicon_service_, UnableToDownloadFavicon(kManifestURL));
1722 EXPECT_CALL(favicon_service_,
1723 UpdateFaviconMappingsAndFetch(_, kManifestURL, _, _, _, _));
1724 EXPECT_CALL(favicon_service_,
1725 UpdateFaviconMappingsAndFetch(_, kIconURL12x12, _, _, _, _));
1726 EXPECT_CALL(delegate_, OnFaviconUpdated(_, _, kIconURL12x12, _, _));
1727
1728 RunHandlerWithSimpleFaviconCandidates({kIconURL12x12}, kManifestURL);
1729 EXPECT_THAT(favicon_service_.fake()->db_requests(),
1730 ElementsAre(kPageURL, kManifestURL, kIconURL12x12));
1731 EXPECT_THAT(delegate_.downloads(), ElementsAre(kManifestURL));
1732 }
1733
1734 // Test that Delegate::OnFaviconUpdated() is called if a page uses Javascript to
1735 // modify the page's <link rel="manifest"> tag to point to a different manifest.
1736 TEST_F(FaviconHandlerManifestsEnabledTest, ManifestUpdateViaJavascript) {
1737 const GURL kManifestURL1("http://www.google.com/manifest1.json");
1738 const GURL kManifestURL2("http://www.google.com/manifest2.json");
1739 const std::vector<favicon::FaviconURL> kManifestIcons1 = {
1740 FaviconURL(kIconURL64x64, FAVICON, kEmptySizes),
1741 };
1742 const std::vector<favicon::FaviconURL> kManifestIcons2 = {
1743 FaviconURL(kIconURL10x10, FAVICON, kEmptySizes),
1744 };
1745
1746 delegate_.fake_manifest_downloader().Add(kManifestURL1, kManifestIcons1);
1747 delegate_.fake_manifest_downloader().Add(kManifestURL2, kManifestIcons2);
1748
1749 std::unique_ptr<FaviconHandler> handler =
1750 RunHandlerWithSimpleFaviconCandidates({kIconURL12x12}, kManifestURL1);
1751 ASSERT_THAT(favicon_service_.fake()->db_requests(),
1752 ElementsAre(kPageURL, kManifestURL1));
1753 EXPECT_THAT(delegate_.downloads(), ElementsAre(kManifestURL1, kIconURL64x64));
1754 ASSERT_TRUE(VerifyAndClearExpectations());
1755
1756 // Simulate the page changing it's manifest URL via Javascript.
1757 EXPECT_CALL(delegate_, OnFaviconUpdated(_, _, kManifestURL2, _, _));
1758 handler->OnUpdateCandidates(kPageURL,
1759 {FaviconURL(kIconURL12x12, FAVICON, kEmptySizes)},
1760 kManifestURL2);
1761 base::RunLoop().RunUntilIdle();
1762 ASSERT_THAT(favicon_service_.fake()->db_requests(),
1763 ElementsAre(kManifestURL2));
1764 EXPECT_THAT(delegate_.downloads(), ElementsAre(kManifestURL2, kIconURL10x10));
1765 }
1766
1767 // Test that Delegate::OnFaviconUpdated() is called if a page uses Javascript to
1768 // remove the page's <link rel="manifest"> tag (i.e. no web manifest) WHILE a
1769 // lookup to the history database is ongoing for the manifest URL.
1770 TEST_F(FaviconHandlerManifestsEnabledTest,
1771 RemoveManifestViaJavascriptWhileHistoryQuery) {
1772 const GURL kManifestURL("http://www.google.com/manifest.json");
1773 const std::vector<favicon::FaviconURL> kManifestIcons = {
1774 FaviconURL(kIconURL64x64, FAVICON, kEmptySizes),
1775 };
1776
1777 delegate_.fake_manifest_downloader().Add(kManifestURL, kManifestIcons);
1778 // Defer the database lookup completion such that RunUntilIdle() doesn't
1779 // complete it.
1780 favicon_service_.fake()->SetRunCallbackManuallyForUrl(kManifestURL);
1781
1782 std::unique_ptr<FaviconHandler> handler =
1783 RunHandlerWithSimpleFaviconCandidates({kIconURL12x12}, kManifestURL);
1784 ASSERT_THAT(favicon_service_.fake()->db_requests(),
1785 ElementsAre(kPageURL, kManifestURL));
1786 // Database lookup for |kManifestURL1| is ongoing.
1787 ASSERT_TRUE(favicon_service_.fake()->HasPendingManualCallback());
1788
1789 // Simulate the page changing it's manifest URL to empty via Javascript.
1790 EXPECT_CALL(delegate_, OnFaviconUpdated(_, _, kIconURL12x12, _, _));
1791 handler->OnUpdateCandidates(kPageURL,
1792 {FaviconURL(kIconURL12x12, FAVICON, kEmptySizes)},
1793 base::nullopt);
1794 // Complete the lookup.
1795 EXPECT_TRUE(favicon_service_.fake()->RunCallbackManually());
1796 base::RunLoop().RunUntilIdle();
1797 ASSERT_THAT(favicon_service_.fake()->db_requests(),
1798 ElementsAre(kPageURL, kManifestURL, kIconURL12x12));
1799 EXPECT_THAT(delegate_.downloads(), ElementsAre(kIconURL12x12));
1800 }
1801
1802 // Test that Delegate::OnFaviconUpdated() is called a page without manifest uses
1803 // Javascript to add a <link rel="manifest"> tag (i.e. a new web manifest) WHILE
1804 // a lookup to the history database is ongoing for the icon URL.
1805 TEST_F(FaviconHandlerManifestsEnabledTest,
1806 AddManifestViaJavascriptWhileHistoryQuery) {
1807 const GURL kManifestURL("http://www.google.com/manifest.json");
1808 const std::vector<favicon::FaviconURL> kManifestIcons = {
1809 FaviconURL(kIconURL64x64, FAVICON, kEmptySizes),
1810 };
1811
1812 delegate_.fake_manifest_downloader().Add(kManifestURL, kManifestIcons);
1813 // Defer the database lookup completion such that RunUntilIdle() doesn't
1814 // complete it.
1815 favicon_service_.fake()->SetRunCallbackManuallyForUrl(kIconURL12x12);
1816
1817 std::unique_ptr<FaviconHandler> handler =
1818 RunHandlerWithSimpleFaviconCandidates({kIconURL12x12});
1819 ASSERT_THAT(favicon_service_.fake()->db_requests(),
1820 ElementsAre(kPageURL, kIconURL12x12));
1821 // Database lookup for |kIconURL12x12| is ongoing.
1822 ASSERT_TRUE(favicon_service_.fake()->HasPendingManualCallback());
1823
1824 // Simulate the page changing it's manifest URL to |kManifestURL| via
1825 // Javascript.
1826 EXPECT_CALL(delegate_, OnFaviconUpdated(_, _, kManifestURL, _, _));
1827 handler->OnUpdateCandidates(kPageURL,
1828 {FaviconURL(kIconURL12x12, FAVICON, kEmptySizes)},
1829 kManifestURL);
1830 // Complete the lookup.
1831 EXPECT_TRUE(favicon_service_.fake()->RunCallbackManually());
1832 base::RunLoop().RunUntilIdle();
1833 ASSERT_THAT(favicon_service_.fake()->db_requests(),
1834 ElementsAre(kPageURL, kIconURL12x12, kManifestURL));
1835 EXPECT_THAT(delegate_.downloads(), ElementsAre(kManifestURL, kIconURL64x64));
1836 }
1837
1373 } // namespace 1838 } // namespace
1374 } // namespace favicon 1839 } // namespace favicon
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698