| OLD | NEW |
| 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> |
| (...skipping 20 matching lines...) Expand all Loading... |
| 31 #include "ui/gfx/favicon_size.h" | 31 #include "ui/gfx/favicon_size.h" |
| 32 #include "ui/gfx/image/image.h" | 32 #include "ui/gfx/image/image.h" |
| 33 | 33 |
| 34 namespace favicon { | 34 namespace favicon { |
| 35 namespace { | 35 namespace { |
| 36 | 36 |
| 37 using favicon_base::FAVICON; | 37 using favicon_base::FAVICON; |
| 38 using favicon_base::FaviconRawBitmapResult; | 38 using favicon_base::FaviconRawBitmapResult; |
| 39 using favicon_base::TOUCH_ICON; | 39 using favicon_base::TOUCH_ICON; |
| 40 using favicon_base::TOUCH_PRECOMPOSED_ICON; | 40 using favicon_base::TOUCH_PRECOMPOSED_ICON; |
| 41 using favicon_base::WEB_MANIFEST_ICON; |
| 41 using testing::AnyNumber; | 42 using testing::AnyNumber; |
| 42 using testing::Assign; | 43 using testing::Assign; |
| 43 using testing::Contains; | 44 using testing::Contains; |
| 44 using testing::ElementsAre; | 45 using testing::ElementsAre; |
| 45 using testing::InSequence; | 46 using testing::InSequence; |
| 46 using testing::Invoke; | 47 using testing::Invoke; |
| 47 using testing::IsEmpty; | 48 using testing::IsEmpty; |
| 48 using testing::Not; | 49 using testing::Not; |
| 49 using testing::Return; | 50 using testing::Return; |
| 50 using testing::_; | 51 using testing::_; |
| (...skipping 1433 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1484 DISALLOW_COPY_AND_ASSIGN(FaviconHandlerManifestsEnabledTest); | 1485 DISALLOW_COPY_AND_ASSIGN(FaviconHandlerManifestsEnabledTest); |
| 1485 }; | 1486 }; |
| 1486 | 1487 |
| 1487 // Test that a favicon corresponding to a web manifest is reported when: | 1488 // Test that a favicon corresponding to a web manifest is reported when: |
| 1488 // - There is data in the favicon database for the manifest URL. | 1489 // - There is data in the favicon database for the manifest URL. |
| 1489 // AND | 1490 // AND |
| 1490 // - FaviconService::OnFaviconDataForManifestFromFaviconService() runs before | 1491 // - FaviconService::OnFaviconDataForManifestFromFaviconService() runs before |
| 1491 // FaviconHandler::OnUpdateCandidates() is called. | 1492 // FaviconHandler::OnUpdateCandidates() is called. |
| 1492 TEST_F(FaviconHandlerManifestsEnabledTest, | 1493 TEST_F(FaviconHandlerManifestsEnabledTest, |
| 1493 GetFaviconFromManifestInHistoryIfCandidatesSlower) { | 1494 GetFaviconFromManifestInHistoryIfCandidatesSlower) { |
| 1494 favicon_service_.fake()->Store(kPageURL, kManifestURL, | 1495 favicon_service_.fake()->Store( |
| 1495 CreateRawBitmapResult(kManifestURL)); | 1496 kPageURL, kManifestURL, |
| 1497 CreateRawBitmapResult(kManifestURL, WEB_MANIFEST_ICON)); |
| 1496 | 1498 |
| 1497 EXPECT_CALL(favicon_service_, UnableToDownloadFavicon(_)).Times(0); | 1499 EXPECT_CALL(favicon_service_, UnableToDownloadFavicon(_)).Times(0); |
| 1498 | 1500 |
| 1499 EXPECT_CALL(favicon_service_, | 1501 EXPECT_CALL(favicon_service_, |
| 1500 UpdateFaviconMappingsAndFetch(_, kManifestURL, FAVICON, | 1502 UpdateFaviconMappingsAndFetch(_, kManifestURL, WEB_MANIFEST_ICON, |
| 1501 /*desired_size_in_dip=*/16, _, _)); | 1503 /*desired_size_in_dip=*/16, _, _)); |
| 1502 EXPECT_CALL(delegate_, | 1504 EXPECT_CALL(delegate_, |
| 1503 OnFaviconUpdated(_, FaviconDriverObserver::NON_TOUCH_16_DIP, | 1505 OnFaviconUpdated(_, FaviconDriverObserver::NON_TOUCH_16_DIP, |
| 1504 kManifestURL, _, _)); | 1506 kManifestURL, _, _)); |
| 1505 | 1507 |
| 1506 RunHandlerWithSimpleFaviconCandidates({kIconURL12x12}, kManifestURL); | 1508 RunHandlerWithSimpleFaviconCandidates({kIconURL12x12}, kManifestURL); |
| 1507 EXPECT_THAT(favicon_service_.fake()->db_requests(), | 1509 EXPECT_THAT(favicon_service_.fake()->db_requests(), |
| 1508 ElementsAre(kPageURL, kManifestURL)); | 1510 ElementsAre(kPageURL, kManifestURL)); |
| 1509 EXPECT_THAT(delegate_.downloads(), IsEmpty()); | 1511 EXPECT_THAT(delegate_.downloads(), IsEmpty()); |
| 1510 } | 1512 } |
| 1511 | 1513 |
| 1512 // Test that a favicon corresponding to a web manifest is reported when: | 1514 // Test that a favicon corresponding to a web manifest is reported when: |
| 1513 // - There is data in the favicon database for the manifest URL. | 1515 // - There is data in the favicon database for the manifest URL. |
| 1514 // AND | 1516 // AND |
| 1515 // - FaviconHandler::OnUpdateCandidates() is called before | 1517 // - FaviconHandler::OnUpdateCandidates() is called before |
| 1516 // FaviconService::OnFaviconDataForManifestFromFaviconService() runs. | 1518 // FaviconService::OnFaviconDataForManifestFromFaviconService() runs. |
| 1517 TEST_F(FaviconHandlerManifestsEnabledTest, | 1519 TEST_F(FaviconHandlerManifestsEnabledTest, |
| 1518 GetFaviconFromManifestInHistoryIfCandidatesFaster) { | 1520 GetFaviconFromManifestInHistoryIfCandidatesFaster) { |
| 1519 favicon_service_.fake()->Store(kPageURL, kManifestURL, | 1521 favicon_service_.fake()->Store( |
| 1520 CreateRawBitmapResult(kManifestURL)); | 1522 kPageURL, kManifestURL, |
| 1523 CreateRawBitmapResult(kManifestURL, WEB_MANIFEST_ICON)); |
| 1521 // Defer the database lookup completion to control the exact timing. | 1524 // Defer the database lookup completion to control the exact timing. |
| 1522 favicon_service_.fake()->SetRunCallbackManuallyForUrl(kManifestURL); | 1525 favicon_service_.fake()->SetRunCallbackManuallyForUrl(kManifestURL); |
| 1523 | 1526 |
| 1524 EXPECT_CALL(favicon_service_, UnableToDownloadFavicon(_)).Times(0); | 1527 EXPECT_CALL(favicon_service_, UnableToDownloadFavicon(_)).Times(0); |
| 1525 | 1528 |
| 1526 EXPECT_CALL(favicon_service_, | 1529 EXPECT_CALL(favicon_service_, |
| 1527 UpdateFaviconMappingsAndFetch(_, kManifestURL, FAVICON, | 1530 UpdateFaviconMappingsAndFetch(_, kManifestURL, WEB_MANIFEST_ICON, |
| 1528 /*desired_size_in_dip=*/16, _, _)); | 1531 /*desired_size_in_dip=*/16, _, _)); |
| 1529 EXPECT_CALL(delegate_, | 1532 EXPECT_CALL(delegate_, |
| 1530 OnFaviconUpdated(_, FaviconDriverObserver::NON_TOUCH_16_DIP, | 1533 OnFaviconUpdated(_, FaviconDriverObserver::NON_TOUCH_16_DIP, |
| 1531 kManifestURL, _, _)); | 1534 kManifestURL, _, _)); |
| 1532 | 1535 |
| 1533 std::unique_ptr<FaviconHandler> handler = | 1536 std::unique_ptr<FaviconHandler> handler = |
| 1534 RunHandlerWithSimpleFaviconCandidates({kIconURL12x12}, kManifestURL); | 1537 RunHandlerWithSimpleFaviconCandidates({kIconURL12x12}, kManifestURL); |
| 1535 ASSERT_TRUE(favicon_service_.fake()->HasPendingManualCallback()); | 1538 ASSERT_TRUE(favicon_service_.fake()->HasPendingManualCallback()); |
| 1536 | 1539 |
| 1537 // Complete the lookup. | 1540 // Complete the lookup. |
| 1538 EXPECT_TRUE(favicon_service_.fake()->RunCallbackManually()); | 1541 EXPECT_TRUE(favicon_service_.fake()->RunCallbackManually()); |
| 1539 base::RunLoop().RunUntilIdle(); | 1542 base::RunLoop().RunUntilIdle(); |
| 1540 | 1543 |
| 1541 EXPECT_THAT(favicon_service_.fake()->db_requests(), | 1544 EXPECT_THAT(favicon_service_.fake()->db_requests(), |
| 1542 ElementsAre(kPageURL, kManifestURL)); | 1545 ElementsAre(kPageURL, kManifestURL)); |
| 1543 EXPECT_THAT(delegate_.downloads(), IsEmpty()); | 1546 EXPECT_THAT(delegate_.downloads(), IsEmpty()); |
| 1544 } | 1547 } |
| 1545 | 1548 |
| 1546 // Test that a favicon corresponding to a web manifest is reported when there is | 1549 // Test that a favicon corresponding to a web manifest is reported when there is |
| 1547 // data in the database for neither the page URL nor the manifest URL. | 1550 // data in the database for neither the page URL nor the manifest URL. |
| 1548 TEST_F(FaviconHandlerManifestsEnabledTest, GetFaviconFromUnknownManifest) { | 1551 TEST_F(FaviconHandlerManifestsEnabledTest, GetFaviconFromUnknownManifest) { |
| 1549 const std::vector<favicon::FaviconURL> kManifestIcons = { | 1552 const std::vector<favicon::FaviconURL> kManifestIcons = { |
| 1550 FaviconURL(kIconURL16x16, FAVICON, kEmptySizes), | 1553 FaviconURL(kIconURL16x16, FAVICON, kEmptySizes), |
| 1551 }; | 1554 }; |
| 1552 | 1555 |
| 1553 delegate_.fake_manifest_downloader().Add(kManifestURL, kManifestIcons); | 1556 delegate_.fake_manifest_downloader().Add(kManifestURL, kManifestIcons); |
| 1554 | 1557 |
| 1555 EXPECT_CALL(favicon_service_, UnableToDownloadFavicon(_)).Times(0); | 1558 EXPECT_CALL(favicon_service_, UnableToDownloadFavicon(_)).Times(0); |
| 1556 | 1559 |
| 1557 EXPECT_CALL(favicon_service_, SetFavicons(_, kManifestURL, FAVICON, _)); | 1560 EXPECT_CALL(favicon_service_, |
| 1561 SetFavicons(_, kManifestURL, WEB_MANIFEST_ICON, _)); |
| 1558 EXPECT_CALL(delegate_, OnFaviconUpdated(_, _, kManifestURL, _, _)); | 1562 EXPECT_CALL(delegate_, OnFaviconUpdated(_, _, kManifestURL, _, _)); |
| 1559 | 1563 |
| 1560 RunHandlerWithSimpleFaviconCandidates({kIconURL12x12}, kManifestURL); | 1564 RunHandlerWithSimpleFaviconCandidates({kIconURL12x12}, kManifestURL); |
| 1561 EXPECT_THAT(favicon_service_.fake()->db_requests(), | 1565 EXPECT_THAT(favicon_service_.fake()->db_requests(), |
| 1562 ElementsAre(kPageURL, kManifestURL)); | 1566 ElementsAre(kPageURL, kManifestURL)); |
| 1563 EXPECT_THAT(delegate_.downloads(), ElementsAre(kManifestURL, kIconURL16x16)); | 1567 EXPECT_THAT(delegate_.downloads(), ElementsAre(kManifestURL, kIconURL16x16)); |
| 1564 } | 1568 } |
| 1565 | 1569 |
| 1566 // Test that the manifest and icon are redownloaded if the icon cached for the | 1570 // Test that the manifest and icon are redownloaded if the icon cached for the |
| 1567 // page URL expired. | 1571 // page URL expired. |
| 1568 TEST_F(FaviconHandlerManifestsEnabledTest, GetFaviconFromExpiredManifest) { | 1572 TEST_F(FaviconHandlerManifestsEnabledTest, GetFaviconFromExpiredManifest) { |
| 1569 const std::vector<favicon::FaviconURL> kManifestIcons = { | 1573 const std::vector<favicon::FaviconURL> kManifestIcons = { |
| 1570 FaviconURL(kIconURL64x64, FAVICON, kEmptySizes), | 1574 FaviconURL(kIconURL64x64, FAVICON, kEmptySizes), |
| 1571 }; | 1575 }; |
| 1572 | 1576 |
| 1573 favicon_service_.fake()->Store(kPageURL, kManifestURL, | 1577 favicon_service_.fake()->Store( |
| 1574 CreateRawBitmapResult(kManifestURL, FAVICON, | 1578 kPageURL, kManifestURL, |
| 1575 /*expired=*/true)); | 1579 CreateRawBitmapResult(kManifestURL, WEB_MANIFEST_ICON, |
| 1580 /*expired=*/true)); |
| 1576 delegate_.fake_manifest_downloader().Add(kManifestURL, kManifestIcons); | 1581 delegate_.fake_manifest_downloader().Add(kManifestURL, kManifestIcons); |
| 1577 | 1582 |
| 1578 EXPECT_CALL(delegate_, OnFaviconUpdated(_, _, kManifestURL, _, _)).Times(2); | 1583 EXPECT_CALL(delegate_, OnFaviconUpdated(_, _, kManifestURL, _, _)).Times(2); |
| 1579 EXPECT_CALL(favicon_service_, SetFavicons(_, kManifestURL, _, _)); | 1584 EXPECT_CALL(favicon_service_, SetFavicons(_, kManifestURL, _, _)); |
| 1580 | 1585 |
| 1581 RunHandlerWithSimpleFaviconCandidates({kIconURL12x12}, kManifestURL); | 1586 RunHandlerWithSimpleFaviconCandidates({kIconURL12x12}, kManifestURL); |
| 1582 EXPECT_THAT(favicon_service_.fake()->db_requests(), | 1587 EXPECT_THAT(favicon_service_.fake()->db_requests(), |
| 1583 ElementsAre(kPageURL, kManifestURL)); | 1588 ElementsAre(kPageURL, kManifestURL)); |
| 1584 EXPECT_THAT(delegate_.downloads(), ElementsAre(kManifestURL, kIconURL64x64)); | 1589 EXPECT_THAT(delegate_.downloads(), ElementsAre(kManifestURL, kIconURL64x64)); |
| 1585 } | 1590 } |
| 1586 | 1591 |
| 1587 // Test that the manifest and icon are redownloaded if the icon cached for the | 1592 // Test that the manifest and icon are redownloaded if the icon cached for the |
| 1588 // manifest URL expired, which was observed during a visit to a different page | 1593 // manifest URL expired, which was observed during a visit to a different page |
| 1589 // URL. | 1594 // URL. |
| 1590 TEST_F(FaviconHandlerManifestsEnabledTest, | 1595 TEST_F(FaviconHandlerManifestsEnabledTest, |
| 1591 GetFaviconFromExpiredManifestLinkedFromOtherPage) { | 1596 GetFaviconFromExpiredManifestLinkedFromOtherPage) { |
| 1592 const GURL kSomePreviousPageURL("https://www.google.com/previous"); | 1597 const GURL kSomePreviousPageURL("https://www.google.com/previous"); |
| 1593 const std::vector<favicon::FaviconURL> kManifestIcons = { | 1598 const std::vector<favicon::FaviconURL> kManifestIcons = { |
| 1594 FaviconURL(kIconURL64x64, FAVICON, kEmptySizes), | 1599 FaviconURL(kIconURL64x64, FAVICON, kEmptySizes), |
| 1595 }; | 1600 }; |
| 1596 | 1601 |
| 1597 favicon_service_.fake()->Store(kSomePreviousPageURL, kManifestURL, | 1602 favicon_service_.fake()->Store( |
| 1598 CreateRawBitmapResult(kManifestURL, FAVICON, | 1603 kSomePreviousPageURL, kManifestURL, |
| 1599 /*expired=*/true)); | 1604 CreateRawBitmapResult(kManifestURL, WEB_MANIFEST_ICON, |
| 1605 /*expired=*/true)); |
| 1600 delegate_.fake_manifest_downloader().Add(kManifestURL, kManifestIcons); | 1606 delegate_.fake_manifest_downloader().Add(kManifestURL, kManifestIcons); |
| 1601 | 1607 |
| 1602 EXPECT_CALL(delegate_, OnFaviconUpdated(_, _, kManifestURL, _, _)).Times(2); | 1608 EXPECT_CALL(delegate_, OnFaviconUpdated(_, _, kManifestURL, _, _)).Times(2); |
| 1603 EXPECT_CALL(favicon_service_, SetFavicons(_, kManifestURL, _, _)); | 1609 EXPECT_CALL(favicon_service_, SetFavicons(_, kManifestURL, _, _)); |
| 1604 | 1610 |
| 1605 RunHandlerWithSimpleFaviconCandidates({kIconURL12x12}, kManifestURL); | 1611 RunHandlerWithSimpleFaviconCandidates({kIconURL12x12}, kManifestURL); |
| 1606 EXPECT_THAT(favicon_service_.fake()->db_requests(), | 1612 EXPECT_THAT(favicon_service_.fake()->db_requests(), |
| 1607 ElementsAre(kPageURL, kManifestURL)); | 1613 ElementsAre(kPageURL, kManifestURL)); |
| 1608 EXPECT_THAT(delegate_.downloads(), ElementsAre(kManifestURL, kIconURL64x64)); | 1614 EXPECT_THAT(delegate_.downloads(), ElementsAre(kManifestURL, kIconURL64x64)); |
| 1609 } | 1615 } |
| (...skipping 236 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1846 // - The page doesn't initially link to a Web Manifest. | 1852 // - The page doesn't initially link to a Web Manifest. |
| 1847 // - The page has an icon URL provided via a <link rel="icon"> tag. | 1853 // - The page has an icon URL provided via a <link rel="icon"> tag. |
| 1848 // - The database does not know about the page URL or icon URL. | 1854 // - The database does not know about the page URL or icon URL. |
| 1849 // - While the icon is being downloaded, the page uses Javascript to add a | 1855 // - While the icon is being downloaded, the page uses Javascript to add a |
| 1850 // <link rel="manifest"> tag. | 1856 // <link rel="manifest"> tag. |
| 1851 // - The database has bitmap data for the manifest URL. | 1857 // - The database has bitmap data for the manifest URL. |
| 1852 TEST_F(FaviconHandlerManifestsEnabledTest, | 1858 TEST_F(FaviconHandlerManifestsEnabledTest, |
| 1853 AddKnownManifestViaJavascriptWhileImageDownload) { | 1859 AddKnownManifestViaJavascriptWhileImageDownload) { |
| 1854 const GURL kSomePreviousPageURL("https://www.google.com/previous"); | 1860 const GURL kSomePreviousPageURL("https://www.google.com/previous"); |
| 1855 | 1861 |
| 1856 favicon_service_.fake()->Store(kSomePreviousPageURL, kManifestURL, | 1862 favicon_service_.fake()->Store( |
| 1857 CreateRawBitmapResult(kManifestURL)); | 1863 kSomePreviousPageURL, kManifestURL, |
| 1864 CreateRawBitmapResult(kManifestURL, WEB_MANIFEST_ICON)); |
| 1858 | 1865 |
| 1859 // Defer the image download completion to control the exact timing. | 1866 // Defer the image download completion to control the exact timing. |
| 1860 delegate_.fake_image_downloader().SetRunCallbackManuallyForUrl(kIconURL16x16); | 1867 delegate_.fake_image_downloader().SetRunCallbackManuallyForUrl(kIconURL16x16); |
| 1861 | 1868 |
| 1862 std::unique_ptr<FaviconHandler> handler = | 1869 std::unique_ptr<FaviconHandler> handler = |
| 1863 RunHandlerWithSimpleFaviconCandidates({kIconURL16x16}); | 1870 RunHandlerWithSimpleFaviconCandidates({kIconURL16x16}); |
| 1864 | 1871 |
| 1865 ASSERT_TRUE(VerifyAndClearExpectations()); | 1872 ASSERT_TRUE(VerifyAndClearExpectations()); |
| 1866 ASSERT_TRUE(delegate_.fake_image_downloader().HasPendingManualCallback()); | 1873 ASSERT_TRUE(delegate_.fake_image_downloader().HasPendingManualCallback()); |
| 1867 | 1874 |
| (...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1959 | 1966 |
| 1960 // Complete the download. | 1967 // Complete the download. |
| 1961 EXPECT_CALL(favicon_service_, SetFavicons(_, kManifestURL2, _, _)); | 1968 EXPECT_CALL(favicon_service_, SetFavicons(_, kManifestURL2, _, _)); |
| 1962 EXPECT_CALL(delegate_, OnFaviconUpdated(_, _, kManifestURL2, _, _)); | 1969 EXPECT_CALL(delegate_, OnFaviconUpdated(_, _, kManifestURL2, _, _)); |
| 1963 EXPECT_TRUE(delegate_.fake_image_downloader().RunCallbackManually()); | 1970 EXPECT_TRUE(delegate_.fake_image_downloader().RunCallbackManually()); |
| 1964 base::RunLoop().RunUntilIdle(); | 1971 base::RunLoop().RunUntilIdle(); |
| 1965 } | 1972 } |
| 1966 | 1973 |
| 1967 } // namespace | 1974 } // namespace |
| 1968 } // namespace favicon | 1975 } // namespace favicon |
| OLD | NEW |