| 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 "chrome/browser/history/history_backend.h" | 5 #include "chrome/browser/history/history_backend.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 #include <set> | 8 #include <set> |
| 9 #include <vector> | 9 #include <vector> |
| 10 | 10 |
| (...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 83 // This must be a separate object since HistoryBackend manages its lifetime. | 83 // This must be a separate object since HistoryBackend manages its lifetime. |
| 84 // This just forwards the messages we're interested in to the test object. | 84 // This just forwards the messages we're interested in to the test object. |
| 85 class HistoryBackendTestDelegate : public HistoryBackend::Delegate { | 85 class HistoryBackendTestDelegate : public HistoryBackend::Delegate { |
| 86 public: | 86 public: |
| 87 explicit HistoryBackendTestDelegate(HistoryBackendTestBase* test) | 87 explicit HistoryBackendTestDelegate(HistoryBackendTestBase* test) |
| 88 : test_(test) {} | 88 : test_(test) {} |
| 89 | 89 |
| 90 virtual void NotifyProfileError(sql::InitStatus init_status) OVERRIDE {} | 90 virtual void NotifyProfileError(sql::InitStatus init_status) OVERRIDE {} |
| 91 virtual void SetInMemoryBackend( | 91 virtual void SetInMemoryBackend( |
| 92 scoped_ptr<InMemoryHistoryBackend> backend) OVERRIDE; | 92 scoped_ptr<InMemoryHistoryBackend> backend) OVERRIDE; |
| 93 virtual void NotifyFaviconChanged(const std::set<GURL>& urls) OVERRIDE; |
| 93 virtual void BroadcastNotifications( | 94 virtual void BroadcastNotifications( |
| 94 int type, | 95 int type, |
| 95 scoped_ptr<HistoryDetails> details) OVERRIDE; | 96 scoped_ptr<HistoryDetails> details) OVERRIDE; |
| 96 virtual void DBLoaded() OVERRIDE; | 97 virtual void DBLoaded() OVERRIDE; |
| 97 virtual void NotifyVisitDBObserversOnAddVisit( | 98 virtual void NotifyVisitDBObserversOnAddVisit( |
| 98 const BriefVisitInfo& info) OVERRIDE {} | 99 const BriefVisitInfo& info) OVERRIDE {} |
| 99 | 100 |
| 100 private: | 101 private: |
| 101 // Not owned by us. | 102 // Not owned by us. |
| 102 HistoryBackendTestBase* test_; | 103 HistoryBackendTestBase* test_; |
| 103 | 104 |
| 104 DISALLOW_COPY_AND_ASSIGN(HistoryBackendTestDelegate); | 105 DISALLOW_COPY_AND_ASSIGN(HistoryBackendTestDelegate); |
| 105 }; | 106 }; |
| 106 | 107 |
| 107 class HistoryBackendTestBase : public testing::Test { | 108 class HistoryBackendTestBase : public testing::Test { |
| 108 public: | 109 public: |
| 109 typedef std::vector<std::pair<int, HistoryDetails*> > NotificationList; | 110 typedef std::vector<std::pair<int, HistoryDetails*> > NotificationList; |
| 110 | 111 |
| 111 HistoryBackendTestBase() | 112 HistoryBackendTestBase() |
| 112 : loaded_(false), | 113 : loaded_(false), |
| 114 favicon_changed_notifications_(0), |
| 113 ui_thread_(content::BrowserThread::UI, &message_loop_) {} | 115 ui_thread_(content::BrowserThread::UI, &message_loop_) {} |
| 114 | 116 |
| 115 virtual ~HistoryBackendTestBase() { | 117 virtual ~HistoryBackendTestBase() { |
| 116 STLDeleteValues(&broadcasted_notifications_); | 118 STLDeleteValues(&broadcasted_notifications_); |
| 117 } | 119 } |
| 118 | 120 |
| 119 protected: | 121 protected: |
| 122 int favicon_changed_notifications() const { |
| 123 return favicon_changed_notifications_; |
| 124 } |
| 125 |
| 126 void ClearFaviconChangedNotificationCounter() { |
| 127 favicon_changed_notifications_ = 0; |
| 128 } |
| 129 |
| 120 int num_broadcasted_notifications() const { | 130 int num_broadcasted_notifications() const { |
| 121 return broadcasted_notifications_.size(); | 131 return broadcasted_notifications_.size(); |
| 122 } | 132 } |
| 123 | 133 |
| 124 const NotificationList& broadcasted_notifications() const { | 134 const NotificationList& broadcasted_notifications() const { |
| 125 return broadcasted_notifications_; | 135 return broadcasted_notifications_; |
| 126 } | 136 } |
| 127 | 137 |
| 128 void ClearBroadcastedNotifications() { | 138 void ClearBroadcastedNotifications() { |
| 129 STLDeleteValues(&broadcasted_notifications_); | 139 STLDeleteValues(&broadcasted_notifications_); |
| 130 } | 140 } |
| 131 | 141 |
| 132 base::FilePath test_dir() { | 142 base::FilePath test_dir() { |
| 133 return test_dir_; | 143 return test_dir_; |
| 134 } | 144 } |
| 135 | 145 |
| 146 void NotifyFaviconChanged(const std::set<GURL>& changed_favicons) { |
| 147 ++favicon_changed_notifications_; |
| 148 } |
| 149 |
| 136 void BroadcastNotifications(int type, scoped_ptr<HistoryDetails> details) { | 150 void BroadcastNotifications(int type, scoped_ptr<HistoryDetails> details) { |
| 137 // Send the notifications directly to the in-memory database. | 151 // Send the notifications directly to the in-memory database. |
| 138 content::Details<HistoryDetails> det(details.get()); | 152 content::Details<HistoryDetails> det(details.get()); |
| 139 mem_backend_->Observe( | 153 mem_backend_->Observe( |
| 140 type, content::Source<HistoryBackendTestBase>(NULL), det); | 154 type, content::Source<HistoryBackendTestBase>(NULL), det); |
| 141 | 155 |
| 142 // The backend passes ownership of the details pointer to us. | 156 // The backend passes ownership of the details pointer to us. |
| 143 broadcasted_notifications_.push_back( | 157 broadcasted_notifications_.push_back( |
| 144 std::make_pair(type, details.release())); | 158 std::make_pair(type, details.release())); |
| 145 } | 159 } |
| (...skipping 25 matching lines...) Expand all Loading... |
| 171 base::RunLoop().RunUntilIdle(); | 185 base::RunLoop().RunUntilIdle(); |
| 172 history_client_.ClearAllBookmarks(); | 186 history_client_.ClearAllBookmarks(); |
| 173 } | 187 } |
| 174 | 188 |
| 175 void SetInMemoryBackend(scoped_ptr<InMemoryHistoryBackend> backend) { | 189 void SetInMemoryBackend(scoped_ptr<InMemoryHistoryBackend> backend) { |
| 176 mem_backend_.swap(backend); | 190 mem_backend_.swap(backend); |
| 177 } | 191 } |
| 178 | 192 |
| 179 // The types and details of notifications which were broadcasted. | 193 // The types and details of notifications which were broadcasted. |
| 180 NotificationList broadcasted_notifications_; | 194 NotificationList broadcasted_notifications_; |
| 195 int favicon_changed_notifications_; |
| 181 | 196 |
| 182 base::MessageLoop message_loop_; | 197 base::MessageLoop message_loop_; |
| 183 base::FilePath test_dir_; | 198 base::FilePath test_dir_; |
| 184 content::TestBrowserThread ui_thread_; | 199 content::TestBrowserThread ui_thread_; |
| 185 | 200 |
| 186 DISALLOW_COPY_AND_ASSIGN(HistoryBackendTestBase); | 201 DISALLOW_COPY_AND_ASSIGN(HistoryBackendTestBase); |
| 187 }; | 202 }; |
| 188 | 203 |
| 189 void HistoryBackendTestDelegate::SetInMemoryBackend( | 204 void HistoryBackendTestDelegate::SetInMemoryBackend( |
| 190 scoped_ptr<InMemoryHistoryBackend> backend) { | 205 scoped_ptr<InMemoryHistoryBackend> backend) { |
| 191 test_->SetInMemoryBackend(backend.Pass()); | 206 test_->SetInMemoryBackend(backend.Pass()); |
| 192 } | 207 } |
| 193 | 208 |
| 209 void HistoryBackendTestDelegate::NotifyFaviconChanged( |
| 210 const std::set<GURL>& changed_favicons) { |
| 211 test_->NotifyFaviconChanged(changed_favicons); |
| 212 } |
| 213 |
| 194 void HistoryBackendTestDelegate::BroadcastNotifications( | 214 void HistoryBackendTestDelegate::BroadcastNotifications( |
| 195 int type, | 215 int type, |
| 196 scoped_ptr<HistoryDetails> details) { | 216 scoped_ptr<HistoryDetails> details) { |
| 197 test_->BroadcastNotifications(type, details.Pass()); | 217 test_->BroadcastNotifications(type, details.Pass()); |
| 198 } | 218 } |
| 199 | 219 |
| 200 void HistoryBackendTestDelegate::DBLoaded() { | 220 void HistoryBackendTestDelegate::DBLoaded() { |
| 201 test_->loaded_ = true; | 221 test_->loaded_ = true; |
| 202 } | 222 } |
| 203 | 223 |
| (...skipping 1455 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1659 EXPECT_EQ(mapping_id, icon_mappings[0].mapping_id); | 1679 EXPECT_EQ(mapping_id, icon_mappings[0].mapping_id); |
| 1660 } | 1680 } |
| 1661 | 1681 |
| 1662 // Test that calling SetFavicons() with FaviconBitmapData of different pixel | 1682 // Test that calling SetFavicons() with FaviconBitmapData of different pixel |
| 1663 // sizes than the initially passed in FaviconBitmapData deletes the no longer | 1683 // sizes than the initially passed in FaviconBitmapData deletes the no longer |
| 1664 // used favicon bitmaps. | 1684 // used favicon bitmaps. |
| 1665 TEST_F(HistoryBackendTest, SetFaviconsDeleteBitmaps) { | 1685 TEST_F(HistoryBackendTest, SetFaviconsDeleteBitmaps) { |
| 1666 const GURL page_url("http://www.google.com/"); | 1686 const GURL page_url("http://www.google.com/"); |
| 1667 const GURL icon_url("http://www.google.com/icon"); | 1687 const GURL icon_url("http://www.google.com/icon"); |
| 1668 | 1688 |
| 1689 ClearFaviconChangedNotificationCounter(); |
| 1669 std::vector<favicon_base::FaviconRawBitmapData> favicon_bitmap_data; | 1690 std::vector<favicon_base::FaviconRawBitmapData> favicon_bitmap_data; |
| 1670 GenerateFaviconBitmapData(icon_url, GetEdgeSizesSmallAndLarge(), | 1691 GenerateFaviconBitmapData(icon_url, GetEdgeSizesSmallAndLarge(), |
| 1671 &favicon_bitmap_data); | 1692 &favicon_bitmap_data); |
| 1672 backend_->SetFavicons(page_url, favicon_base::FAVICON, favicon_bitmap_data); | 1693 backend_->SetFavicons(page_url, favicon_base::FAVICON, favicon_bitmap_data); |
| 1673 | 1694 |
| 1674 // Test initial state. | 1695 // Test initial state. |
| 1675 std::vector<IconMapping> icon_mappings; | 1696 std::vector<IconMapping> icon_mappings; |
| 1676 EXPECT_TRUE(GetSortedIconMappingsForPageURL(page_url, &icon_mappings)); | 1697 EXPECT_TRUE(GetSortedIconMappingsForPageURL(page_url, &icon_mappings)); |
| 1677 EXPECT_EQ(1u, icon_mappings.size()); | 1698 EXPECT_EQ(1u, icon_mappings.size()); |
| 1678 EXPECT_EQ(icon_url, icon_mappings[0].icon_url); | 1699 EXPECT_EQ(icon_url, icon_mappings[0].icon_url); |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1717 favicon_bitmap_data.clear(); | 1738 favicon_bitmap_data.clear(); |
| 1718 backend_->SetFavicons(page_url, favicon_base::FAVICON, favicon_bitmap_data); | 1739 backend_->SetFavicons(page_url, favicon_base::FAVICON, favicon_bitmap_data); |
| 1719 | 1740 |
| 1720 EXPECT_FALSE(backend_->thumbnail_db_->GetFaviconBitmap(large_bitmap_id, NULL, | 1741 EXPECT_FALSE(backend_->thumbnail_db_->GetFaviconBitmap(large_bitmap_id, NULL, |
| 1721 NULL, NULL)); | 1742 NULL, NULL)); |
| 1722 icon_mappings.clear(); | 1743 icon_mappings.clear(); |
| 1723 EXPECT_FALSE(backend_->thumbnail_db_->GetIconMappingsForPageURL(page_url, | 1744 EXPECT_FALSE(backend_->thumbnail_db_->GetIconMappingsForPageURL(page_url, |
| 1724 &icon_mappings)); | 1745 &icon_mappings)); |
| 1725 | 1746 |
| 1726 // Notifications should have been broadcast for each call to SetFavicons(). | 1747 // Notifications should have been broadcast for each call to SetFavicons(). |
| 1727 EXPECT_EQ(3, num_broadcasted_notifications()); | 1748 EXPECT_EQ(3, favicon_changed_notifications()); |
| 1728 } | 1749 } |
| 1729 | 1750 |
| 1730 // Test updating a single favicon bitmap's data via SetFavicons. | 1751 // Test updating a single favicon bitmap's data via SetFavicons. |
| 1731 TEST_F(HistoryBackendTest, SetFaviconsReplaceBitmapData) { | 1752 TEST_F(HistoryBackendTest, SetFaviconsReplaceBitmapData) { |
| 1732 const GURL page_url("http://www.google.com/"); | 1753 const GURL page_url("http://www.google.com/"); |
| 1733 const GURL icon_url("http://www.google.com/icon"); | 1754 const GURL icon_url("http://www.google.com/icon"); |
| 1734 | 1755 |
| 1756 ClearFaviconChangedNotificationCounter(); |
| 1735 std::vector<unsigned char> data_initial; | 1757 std::vector<unsigned char> data_initial; |
| 1736 data_initial.push_back('a'); | 1758 data_initial.push_back('a'); |
| 1737 | 1759 |
| 1738 favicon_base::FaviconRawBitmapData bitmap_data_element; | 1760 favicon_base::FaviconRawBitmapData bitmap_data_element; |
| 1739 bitmap_data_element.bitmap_data = | 1761 bitmap_data_element.bitmap_data = |
| 1740 base::RefCountedBytes::TakeVector(&data_initial); | 1762 base::RefCountedBytes::TakeVector(&data_initial); |
| 1741 bitmap_data_element.pixel_size = kSmallSize; | 1763 bitmap_data_element.pixel_size = kSmallSize; |
| 1742 bitmap_data_element.icon_url = icon_url; | 1764 bitmap_data_element.icon_url = icon_url; |
| 1743 std::vector<favicon_base::FaviconRawBitmapData> favicon_bitmap_data; | 1765 std::vector<favicon_base::FaviconRawBitmapData> favicon_bitmap_data; |
| 1744 favicon_bitmap_data.push_back(bitmap_data_element); | 1766 favicon_bitmap_data.push_back(bitmap_data_element); |
| 1745 | 1767 |
| 1746 // Add bitmap to the database. | 1768 // Add bitmap to the database. |
| 1747 backend_->SetFavicons(page_url, favicon_base::FAVICON, favicon_bitmap_data); | 1769 backend_->SetFavicons(page_url, favicon_base::FAVICON, favicon_bitmap_data); |
| 1748 | 1770 |
| 1749 favicon_base::FaviconID original_favicon_id = | 1771 favicon_base::FaviconID original_favicon_id = |
| 1750 backend_->thumbnail_db_->GetFaviconIDForFaviconURL( | 1772 backend_->thumbnail_db_->GetFaviconIDForFaviconURL( |
| 1751 icon_url, favicon_base::FAVICON, NULL); | 1773 icon_url, favicon_base::FAVICON, NULL); |
| 1752 EXPECT_NE(0, original_favicon_id); | 1774 EXPECT_NE(0, original_favicon_id); |
| 1753 FaviconBitmap original_favicon_bitmap; | 1775 FaviconBitmap original_favicon_bitmap; |
| 1754 EXPECT_TRUE( | 1776 EXPECT_TRUE( |
| 1755 GetOnlyFaviconBitmap(original_favicon_id, &original_favicon_bitmap)); | 1777 GetOnlyFaviconBitmap(original_favicon_id, &original_favicon_bitmap)); |
| 1756 EXPECT_TRUE(BitmapDataEqual('a', original_favicon_bitmap.bitmap_data)); | 1778 EXPECT_TRUE(BitmapDataEqual('a', original_favicon_bitmap.bitmap_data)); |
| 1757 | 1779 |
| 1758 EXPECT_EQ(1, num_broadcasted_notifications()); | 1780 EXPECT_EQ(1, favicon_changed_notifications()); |
| 1759 | 1781 |
| 1760 // Call SetFavicons() with completely identical data. | 1782 // Call SetFavicons() with completely identical data. |
| 1761 std::vector<unsigned char> updated_data; | 1783 std::vector<unsigned char> updated_data; |
| 1762 updated_data.push_back('a'); | 1784 updated_data.push_back('a'); |
| 1763 favicon_bitmap_data[0].bitmap_data = new base::RefCountedBytes(updated_data); | 1785 favicon_bitmap_data[0].bitmap_data = new base::RefCountedBytes(updated_data); |
| 1764 backend_->SetFavicons(page_url, favicon_base::FAVICON, favicon_bitmap_data); | 1786 backend_->SetFavicons(page_url, favicon_base::FAVICON, favicon_bitmap_data); |
| 1765 | 1787 |
| 1766 favicon_base::FaviconID updated_favicon_id = | 1788 favicon_base::FaviconID updated_favicon_id = |
| 1767 backend_->thumbnail_db_->GetFaviconIDForFaviconURL( | 1789 backend_->thumbnail_db_->GetFaviconIDForFaviconURL( |
| 1768 icon_url, favicon_base::FAVICON, NULL); | 1790 icon_url, favicon_base::FAVICON, NULL); |
| 1769 EXPECT_NE(0, updated_favicon_id); | 1791 EXPECT_NE(0, updated_favicon_id); |
| 1770 FaviconBitmap updated_favicon_bitmap; | 1792 FaviconBitmap updated_favicon_bitmap; |
| 1771 EXPECT_TRUE( | 1793 EXPECT_TRUE( |
| 1772 GetOnlyFaviconBitmap(updated_favicon_id, &updated_favicon_bitmap)); | 1794 GetOnlyFaviconBitmap(updated_favicon_id, &updated_favicon_bitmap)); |
| 1773 EXPECT_TRUE(BitmapDataEqual('a', updated_favicon_bitmap.bitmap_data)); | 1795 EXPECT_TRUE(BitmapDataEqual('a', updated_favicon_bitmap.bitmap_data)); |
| 1774 | 1796 |
| 1775 // Because the bitmap data is byte equivalent, no notifications should have | 1797 // Because the bitmap data is byte equivalent, no notifications should have |
| 1776 // been broadcasted. | 1798 // been broadcasted. |
| 1777 EXPECT_EQ(1, num_broadcasted_notifications()); | 1799 EXPECT_EQ(1, favicon_changed_notifications()); |
| 1778 | 1800 |
| 1779 // Call SetFavicons() with identical data but a different bitmap. | 1801 // Call SetFavicons() with identical data but a different bitmap. |
| 1780 updated_data[0] = 'b'; | 1802 updated_data[0] = 'b'; |
| 1781 favicon_bitmap_data[0].bitmap_data = new base::RefCountedBytes(updated_data); | 1803 favicon_bitmap_data[0].bitmap_data = new base::RefCountedBytes(updated_data); |
| 1782 backend_->SetFavicons(page_url, favicon_base::FAVICON, favicon_bitmap_data); | 1804 backend_->SetFavicons(page_url, favicon_base::FAVICON, favicon_bitmap_data); |
| 1783 | 1805 |
| 1784 updated_favicon_id = backend_->thumbnail_db_->GetFaviconIDForFaviconURL( | 1806 updated_favicon_id = backend_->thumbnail_db_->GetFaviconIDForFaviconURL( |
| 1785 icon_url, favicon_base::FAVICON, NULL); | 1807 icon_url, favicon_base::FAVICON, NULL); |
| 1786 EXPECT_NE(0, updated_favicon_id); | 1808 EXPECT_NE(0, updated_favicon_id); |
| 1787 EXPECT_TRUE( | 1809 EXPECT_TRUE( |
| 1788 GetOnlyFaviconBitmap(updated_favicon_id, &updated_favicon_bitmap)); | 1810 GetOnlyFaviconBitmap(updated_favicon_id, &updated_favicon_bitmap)); |
| 1789 EXPECT_TRUE(BitmapDataEqual('b', updated_favicon_bitmap.bitmap_data)); | 1811 EXPECT_TRUE(BitmapDataEqual('b', updated_favicon_bitmap.bitmap_data)); |
| 1790 | 1812 |
| 1791 // There should be no churn in FaviconIDs or FaviconBitmapIds even though | 1813 // There should be no churn in FaviconIDs or FaviconBitmapIds even though |
| 1792 // the bitmap data changed. | 1814 // the bitmap data changed. |
| 1793 EXPECT_EQ(original_favicon_bitmap.icon_id, updated_favicon_bitmap.icon_id); | 1815 EXPECT_EQ(original_favicon_bitmap.icon_id, updated_favicon_bitmap.icon_id); |
| 1794 EXPECT_EQ(original_favicon_bitmap.bitmap_id, | 1816 EXPECT_EQ(original_favicon_bitmap.bitmap_id, |
| 1795 updated_favicon_bitmap.bitmap_id); | 1817 updated_favicon_bitmap.bitmap_id); |
| 1796 | 1818 |
| 1797 // A notification should have been broadcasted as the favicon bitmap data has | 1819 // A notification should have been broadcasted as the favicon bitmap data has |
| 1798 // changed. | 1820 // changed. |
| 1799 EXPECT_EQ(2, num_broadcasted_notifications()); | 1821 EXPECT_EQ(2, favicon_changed_notifications()); |
| 1800 } | 1822 } |
| 1801 | 1823 |
| 1802 // Test that if two pages share the same FaviconID, changing the favicon for | 1824 // Test that if two pages share the same FaviconID, changing the favicon for |
| 1803 // one page does not affect the other. | 1825 // one page does not affect the other. |
| 1804 TEST_F(HistoryBackendTest, SetFaviconsSameFaviconURLForTwoPages) { | 1826 TEST_F(HistoryBackendTest, SetFaviconsSameFaviconURLForTwoPages) { |
| 1805 GURL icon_url("http://www.google.com/favicon.ico"); | 1827 GURL icon_url("http://www.google.com/favicon.ico"); |
| 1806 GURL icon_url_new("http://www.google.com/favicon2.ico"); | 1828 GURL icon_url_new("http://www.google.com/favicon2.ico"); |
| 1807 GURL page_url1("http://www.google.com"); | 1829 GURL page_url1("http://www.google.com"); |
| 1808 GURL page_url2("http://www.google.ca"); | 1830 GURL page_url2("http://www.google.ca"); |
| 1809 | 1831 |
| 1832 ClearFaviconChangedNotificationCounter(); |
| 1810 std::vector<favicon_base::FaviconRawBitmapData> favicon_bitmap_data; | 1833 std::vector<favicon_base::FaviconRawBitmapData> favicon_bitmap_data; |
| 1811 GenerateFaviconBitmapData(icon_url, GetEdgeSizesSmallAndLarge(), | 1834 GenerateFaviconBitmapData(icon_url, GetEdgeSizesSmallAndLarge(), |
| 1812 &favicon_bitmap_data); | 1835 &favicon_bitmap_data); |
| 1813 | 1836 |
| 1814 backend_->SetFavicons(page_url1, favicon_base::FAVICON, favicon_bitmap_data); | 1837 backend_->SetFavicons(page_url1, favicon_base::FAVICON, favicon_bitmap_data); |
| 1815 | 1838 |
| 1816 std::vector<GURL> icon_urls; | 1839 std::vector<GURL> icon_urls; |
| 1817 icon_urls.push_back(icon_url); | 1840 icon_urls.push_back(icon_url); |
| 1818 | 1841 |
| 1819 std::vector<favicon_base::FaviconRawBitmapResult> bitmap_results; | 1842 std::vector<favicon_base::FaviconRawBitmapResult> bitmap_results; |
| (...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1863 EXPECT_EQ(1u, icon_mappings.size()); | 1886 EXPECT_EQ(1u, icon_mappings.size()); |
| 1864 EXPECT_EQ(favicon_id, icon_mappings[0].icon_id); | 1887 EXPECT_EQ(favicon_id, icon_mappings[0].icon_id); |
| 1865 | 1888 |
| 1866 favicon_bitmaps.clear(); | 1889 favicon_bitmaps.clear(); |
| 1867 EXPECT_TRUE(backend_->thumbnail_db_->GetFaviconBitmaps(favicon_id, | 1890 EXPECT_TRUE(backend_->thumbnail_db_->GetFaviconBitmaps(favicon_id, |
| 1868 &favicon_bitmaps)); | 1891 &favicon_bitmaps)); |
| 1869 EXPECT_EQ(2u, favicon_bitmaps.size()); | 1892 EXPECT_EQ(2u, favicon_bitmaps.size()); |
| 1870 | 1893 |
| 1871 // A notification should have been broadcast for each call to SetFavicons() | 1894 // A notification should have been broadcast for each call to SetFavicons() |
| 1872 // and each call to UpdateFaviconMappingsAndFetch(). | 1895 // and each call to UpdateFaviconMappingsAndFetch(). |
| 1873 EXPECT_EQ(3, num_broadcasted_notifications()); | 1896 EXPECT_EQ(3, favicon_changed_notifications()); |
| 1874 } | 1897 } |
| 1875 | 1898 |
| 1876 // Test that no notifications are broadcast as a result of calling | 1899 // Test that no notifications are broadcast as a result of calling |
| 1877 // UpdateFaviconMappingsAndFetch() for an icon URL which is already | 1900 // UpdateFaviconMappingsAndFetch() for an icon URL which is already |
| 1878 // mapped to the passed in page URL. | 1901 // mapped to the passed in page URL. |
| 1879 TEST_F(HistoryBackendTest, UpdateFaviconMappingsAndFetchNoChange) { | 1902 TEST_F(HistoryBackendTest, UpdateFaviconMappingsAndFetchNoChange) { |
| 1880 GURL page_url("http://www.google.com"); | 1903 GURL page_url("http://www.google.com"); |
| 1881 GURL icon_url("http://www.google.com/favicon.ico"); | 1904 GURL icon_url("http://www.google.com/favicon.ico"); |
| 1882 std::vector<favicon_base::FaviconRawBitmapData> favicon_bitmap_data; | 1905 std::vector<favicon_base::FaviconRawBitmapData> favicon_bitmap_data; |
| 1883 GenerateFaviconBitmapData(icon_url, GetEdgeSizesSmall(), | 1906 GenerateFaviconBitmapData(icon_url, GetEdgeSizesSmall(), |
| 1884 &favicon_bitmap_data); | 1907 &favicon_bitmap_data); |
| 1885 | 1908 |
| 1909 ClearFaviconChangedNotificationCounter(); |
| 1886 backend_->SetFavicons(page_url, favicon_base::FAVICON, favicon_bitmap_data); | 1910 backend_->SetFavicons(page_url, favicon_base::FAVICON, favicon_bitmap_data); |
| 1887 | 1911 |
| 1888 favicon_base::FaviconID icon_id = | 1912 favicon_base::FaviconID icon_id = |
| 1889 backend_->thumbnail_db_->GetFaviconIDForFaviconURL( | 1913 backend_->thumbnail_db_->GetFaviconIDForFaviconURL( |
| 1890 icon_url, favicon_base::FAVICON, NULL); | 1914 icon_url, favicon_base::FAVICON, NULL); |
| 1891 EXPECT_NE(0, icon_id); | 1915 EXPECT_NE(0, icon_id); |
| 1892 EXPECT_EQ(1, num_broadcasted_notifications()); | 1916 EXPECT_EQ(1, favicon_changed_notifications()); |
| 1893 | 1917 |
| 1894 std::vector<GURL> icon_urls; | 1918 std::vector<GURL> icon_urls; |
| 1895 icon_urls.push_back(icon_url); | 1919 icon_urls.push_back(icon_url); |
| 1896 | 1920 |
| 1897 std::vector<favicon_base::FaviconRawBitmapResult> bitmap_results; | 1921 std::vector<favicon_base::FaviconRawBitmapResult> bitmap_results; |
| 1898 backend_->UpdateFaviconMappingsAndFetch(page_url, | 1922 backend_->UpdateFaviconMappingsAndFetch(page_url, |
| 1899 icon_urls, | 1923 icon_urls, |
| 1900 favicon_base::FAVICON, | 1924 favicon_base::FAVICON, |
| 1901 GetEdgeSizesSmallAndLarge(), | 1925 GetEdgeSizesSmallAndLarge(), |
| 1902 &bitmap_results); | 1926 &bitmap_results); |
| 1903 | 1927 |
| 1904 EXPECT_EQ(icon_id, | 1928 EXPECT_EQ(icon_id, |
| 1905 backend_->thumbnail_db_->GetFaviconIDForFaviconURL( | 1929 backend_->thumbnail_db_->GetFaviconIDForFaviconURL( |
| 1906 icon_url, favicon_base::FAVICON, NULL)); | 1930 icon_url, favicon_base::FAVICON, NULL)); |
| 1907 | 1931 |
| 1908 // No notification should have been broadcast as no icon mapping, favicon, | 1932 // No notification should have been broadcast as no icon mapping, favicon, |
| 1909 // or favicon bitmap was updated, added or removed. | 1933 // or favicon bitmap was updated, added or removed. |
| 1910 EXPECT_EQ(1, num_broadcasted_notifications()); | 1934 EXPECT_EQ(1, favicon_changed_notifications()); |
| 1911 } | 1935 } |
| 1912 | 1936 |
| 1913 // Test repeatedly calling MergeFavicon(). |page_url| is initially not known | 1937 // Test repeatedly calling MergeFavicon(). |page_url| is initially not known |
| 1914 // to the database. | 1938 // to the database. |
| 1915 TEST_F(HistoryBackendTest, MergeFaviconPageURLNotInDB) { | 1939 TEST_F(HistoryBackendTest, MergeFaviconPageURLNotInDB) { |
| 1916 GURL page_url("http://www.google.com"); | 1940 GURL page_url("http://www.google.com"); |
| 1917 GURL icon_url("http:/www.google.com/favicon.ico"); | 1941 GURL icon_url("http:/www.google.com/favicon.ico"); |
| 1918 | 1942 |
| 1919 std::vector<unsigned char> data; | 1943 std::vector<unsigned char> data; |
| 1920 data.push_back('a'); | 1944 data.push_back('a'); |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1956 EXPECT_TRUE(BitmapDataEqual('b', favicon_bitmap.bitmap_data)); | 1980 EXPECT_TRUE(BitmapDataEqual('b', favicon_bitmap.bitmap_data)); |
| 1957 EXPECT_EQ(kSmallSize, favicon_bitmap.pixel_size); | 1981 EXPECT_EQ(kSmallSize, favicon_bitmap.pixel_size); |
| 1958 } | 1982 } |
| 1959 | 1983 |
| 1960 // Test calling MergeFavicon() when |page_url| is known to the database. | 1984 // Test calling MergeFavicon() when |page_url| is known to the database. |
| 1961 TEST_F(HistoryBackendTest, MergeFaviconPageURLInDB) { | 1985 TEST_F(HistoryBackendTest, MergeFaviconPageURLInDB) { |
| 1962 GURL page_url("http://www.google.com"); | 1986 GURL page_url("http://www.google.com"); |
| 1963 GURL icon_url1("http:/www.google.com/favicon.ico"); | 1987 GURL icon_url1("http:/www.google.com/favicon.ico"); |
| 1964 GURL icon_url2("http://www.google.com/favicon2.ico"); | 1988 GURL icon_url2("http://www.google.com/favicon2.ico"); |
| 1965 | 1989 |
| 1990 ClearFaviconChangedNotificationCounter(); |
| 1966 std::vector<favicon_base::FaviconRawBitmapData> favicon_bitmap_data; | 1991 std::vector<favicon_base::FaviconRawBitmapData> favicon_bitmap_data; |
| 1967 GenerateFaviconBitmapData(icon_url1, GetEdgeSizesSmall(), | 1992 GenerateFaviconBitmapData(icon_url1, GetEdgeSizesSmall(), |
| 1968 &favicon_bitmap_data); | 1993 &favicon_bitmap_data); |
| 1969 | 1994 |
| 1970 backend_->SetFavicons(page_url, favicon_base::FAVICON, favicon_bitmap_data); | 1995 backend_->SetFavicons(page_url, favicon_base::FAVICON, favicon_bitmap_data); |
| 1971 | 1996 |
| 1972 // Test initial state. | 1997 // Test initial state. |
| 1973 std::vector<IconMapping> icon_mappings; | 1998 std::vector<IconMapping> icon_mappings; |
| 1974 EXPECT_TRUE(backend_->thumbnail_db_->GetIconMappingsForPageURL(page_url, | 1999 EXPECT_TRUE(backend_->thumbnail_db_->GetIconMappingsForPageURL(page_url, |
| 1975 &icon_mappings)); | 2000 &icon_mappings)); |
| 1976 EXPECT_EQ(1u, icon_mappings.size()); | 2001 EXPECT_EQ(1u, icon_mappings.size()); |
| 1977 EXPECT_EQ(icon_url1, icon_mappings[0].icon_url); | 2002 EXPECT_EQ(icon_url1, icon_mappings[0].icon_url); |
| 1978 | 2003 |
| 1979 FaviconBitmap favicon_bitmap; | 2004 FaviconBitmap favicon_bitmap; |
| 1980 EXPECT_TRUE(GetOnlyFaviconBitmap(icon_mappings[0].icon_id, &favicon_bitmap)); | 2005 EXPECT_TRUE(GetOnlyFaviconBitmap(icon_mappings[0].icon_id, &favicon_bitmap)); |
| 1981 EXPECT_NE(base::Time(), favicon_bitmap.last_updated); | 2006 EXPECT_NE(base::Time(), favicon_bitmap.last_updated); |
| 1982 EXPECT_TRUE(BitmapDataEqual('a', favicon_bitmap.bitmap_data)); | 2007 EXPECT_TRUE(BitmapDataEqual('a', favicon_bitmap.bitmap_data)); |
| 1983 EXPECT_EQ(kSmallSize, favicon_bitmap.pixel_size); | 2008 EXPECT_EQ(kSmallSize, favicon_bitmap.pixel_size); |
| 1984 | 2009 |
| 1985 EXPECT_EQ(1, num_broadcasted_notifications()); | 2010 EXPECT_EQ(1, favicon_changed_notifications()); |
| 1986 | 2011 |
| 1987 // 1) Merge identical favicon bitmap. | 2012 // 1) Merge identical favicon bitmap. |
| 1988 std::vector<unsigned char> data; | 2013 std::vector<unsigned char> data; |
| 1989 data.push_back('a'); | 2014 data.push_back('a'); |
| 1990 scoped_refptr<base::RefCountedBytes> bitmap_data( | 2015 scoped_refptr<base::RefCountedBytes> bitmap_data( |
| 1991 new base::RefCountedBytes(data)); | 2016 new base::RefCountedBytes(data)); |
| 1992 backend_->MergeFavicon( | 2017 backend_->MergeFavicon( |
| 1993 page_url, icon_url1, favicon_base::FAVICON, bitmap_data, kSmallSize); | 2018 page_url, icon_url1, favicon_base::FAVICON, bitmap_data, kSmallSize); |
| 1994 | 2019 |
| 1995 // All the data should stay the same and no notifications should have been | 2020 // All the data should stay the same and no notifications should have been |
| 1996 // sent. | 2021 // sent. |
| 1997 icon_mappings.clear(); | 2022 icon_mappings.clear(); |
| 1998 EXPECT_TRUE(backend_->thumbnail_db_->GetIconMappingsForPageURL(page_url, | 2023 EXPECT_TRUE(backend_->thumbnail_db_->GetIconMappingsForPageURL(page_url, |
| 1999 &icon_mappings)); | 2024 &icon_mappings)); |
| 2000 EXPECT_EQ(1u, icon_mappings.size()); | 2025 EXPECT_EQ(1u, icon_mappings.size()); |
| 2001 EXPECT_EQ(icon_url1, icon_mappings[0].icon_url); | 2026 EXPECT_EQ(icon_url1, icon_mappings[0].icon_url); |
| 2002 | 2027 |
| 2003 EXPECT_TRUE(GetOnlyFaviconBitmap(icon_mappings[0].icon_id, &favicon_bitmap)); | 2028 EXPECT_TRUE(GetOnlyFaviconBitmap(icon_mappings[0].icon_id, &favicon_bitmap)); |
| 2004 EXPECT_NE(base::Time(), favicon_bitmap.last_updated); | 2029 EXPECT_NE(base::Time(), favicon_bitmap.last_updated); |
| 2005 EXPECT_TRUE(BitmapDataEqual('a', favicon_bitmap.bitmap_data)); | 2030 EXPECT_TRUE(BitmapDataEqual('a', favicon_bitmap.bitmap_data)); |
| 2006 EXPECT_EQ(kSmallSize, favicon_bitmap.pixel_size); | 2031 EXPECT_EQ(kSmallSize, favicon_bitmap.pixel_size); |
| 2007 | 2032 |
| 2008 EXPECT_EQ(1, num_broadcasted_notifications()); | 2033 EXPECT_EQ(1, favicon_changed_notifications()); |
| 2009 | 2034 |
| 2010 // 2) Merge favicon bitmap of the same size. | 2035 // 2) Merge favicon bitmap of the same size. |
| 2011 data[0] = 'b'; | 2036 data[0] = 'b'; |
| 2012 bitmap_data = new base::RefCountedBytes(data); | 2037 bitmap_data = new base::RefCountedBytes(data); |
| 2013 backend_->MergeFavicon( | 2038 backend_->MergeFavicon( |
| 2014 page_url, icon_url1, favicon_base::FAVICON, bitmap_data, kSmallSize); | 2039 page_url, icon_url1, favicon_base::FAVICON, bitmap_data, kSmallSize); |
| 2015 | 2040 |
| 2016 // The small favicon bitmap at |icon_url1| should be overwritten. | 2041 // The small favicon bitmap at |icon_url1| should be overwritten. |
| 2017 icon_mappings.clear(); | 2042 icon_mappings.clear(); |
| 2018 EXPECT_TRUE(backend_->thumbnail_db_->GetIconMappingsForPageURL(page_url, | 2043 EXPECT_TRUE(backend_->thumbnail_db_->GetIconMappingsForPageURL(page_url, |
| (...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2072 EXPECT_TRUE(BitmapDataEqual('c', favicon_bitmaps[0].bitmap_data)); | 2097 EXPECT_TRUE(BitmapDataEqual('c', favicon_bitmaps[0].bitmap_data)); |
| 2073 EXPECT_EQ(kTinySize, favicon_bitmaps[0].pixel_size); | 2098 EXPECT_EQ(kTinySize, favicon_bitmaps[0].pixel_size); |
| 2074 // The favicon being merged should take precedence over the preexisting | 2099 // The favicon being merged should take precedence over the preexisting |
| 2075 // favicon bitmaps. | 2100 // favicon bitmaps. |
| 2076 EXPECT_NE(base::Time(), favicon_bitmaps[1].last_updated); | 2101 EXPECT_NE(base::Time(), favicon_bitmaps[1].last_updated); |
| 2077 EXPECT_TRUE(BitmapDataEqual('d', favicon_bitmaps[1].bitmap_data)); | 2102 EXPECT_TRUE(BitmapDataEqual('d', favicon_bitmaps[1].bitmap_data)); |
| 2078 EXPECT_EQ(kSmallSize, favicon_bitmaps[1].pixel_size); | 2103 EXPECT_EQ(kSmallSize, favicon_bitmaps[1].pixel_size); |
| 2079 | 2104 |
| 2080 // A notification should have been broadcast for each call to SetFavicons() | 2105 // A notification should have been broadcast for each call to SetFavicons() |
| 2081 // and MergeFavicon(). | 2106 // and MergeFavicon(). |
| 2082 EXPECT_EQ(4, num_broadcasted_notifications()); | 2107 EXPECT_EQ(4, favicon_changed_notifications()); |
| 2083 } | 2108 } |
| 2084 | 2109 |
| 2085 // Test calling MergeFavicon() when |icon_url| is known to the database but not | 2110 // Test calling MergeFavicon() when |icon_url| is known to the database but not |
| 2086 // mapped to |page_url|. | 2111 // mapped to |page_url|. |
| 2087 TEST_F(HistoryBackendTest, MergeFaviconIconURLMappedToDifferentPageURL) { | 2112 TEST_F(HistoryBackendTest, MergeFaviconIconURLMappedToDifferentPageURL) { |
| 2088 GURL page_url1("http://www.google.com"); | 2113 GURL page_url1("http://www.google.com"); |
| 2089 GURL page_url2("http://news.google.com"); | 2114 GURL page_url2("http://news.google.com"); |
| 2090 GURL page_url3("http://maps.google.com"); | 2115 GURL page_url3("http://maps.google.com"); |
| 2091 GURL icon_url("http:/www.google.com/favicon.ico"); | 2116 GURL icon_url("http:/www.google.com/favicon.ico"); |
| 2092 | 2117 |
| 2118 ClearFaviconChangedNotificationCounter(); |
| 2093 std::vector<favicon_base::FaviconRawBitmapData> favicon_bitmap_data; | 2119 std::vector<favicon_base::FaviconRawBitmapData> favicon_bitmap_data; |
| 2094 GenerateFaviconBitmapData(icon_url, GetEdgeSizesSmall(), | 2120 GenerateFaviconBitmapData(icon_url, GetEdgeSizesSmall(), |
| 2095 &favicon_bitmap_data); | 2121 &favicon_bitmap_data); |
| 2096 | 2122 |
| 2097 backend_->SetFavicons(page_url1, favicon_base::FAVICON, favicon_bitmap_data); | 2123 backend_->SetFavicons(page_url1, favicon_base::FAVICON, favicon_bitmap_data); |
| 2098 | 2124 |
| 2099 // Test initial state. | 2125 // Test initial state. |
| 2100 std::vector<IconMapping> icon_mappings; | 2126 std::vector<IconMapping> icon_mappings; |
| 2101 EXPECT_TRUE(backend_->thumbnail_db_->GetIconMappingsForPageURL(page_url1, | 2127 EXPECT_TRUE(backend_->thumbnail_db_->GetIconMappingsForPageURL(page_url1, |
| 2102 &icon_mappings)); | 2128 &icon_mappings)); |
| (...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2157 EXPECT_EQ(favicon_id, icon_mappings[0].icon_id); | 2183 EXPECT_EQ(favicon_id, icon_mappings[0].icon_id); |
| 2158 | 2184 |
| 2159 icon_mappings.clear(); | 2185 icon_mappings.clear(); |
| 2160 EXPECT_TRUE(backend_->thumbnail_db_->GetIconMappingsForPageURL(page_url3, | 2186 EXPECT_TRUE(backend_->thumbnail_db_->GetIconMappingsForPageURL(page_url3, |
| 2161 &icon_mappings)); | 2187 &icon_mappings)); |
| 2162 EXPECT_EQ(1u, icon_mappings.size()); | 2188 EXPECT_EQ(1u, icon_mappings.size()); |
| 2163 EXPECT_EQ(favicon_id, icon_mappings[0].icon_id); | 2189 EXPECT_EQ(favicon_id, icon_mappings[0].icon_id); |
| 2164 | 2190 |
| 2165 // A notification should have been broadcast for each call to SetFavicons() | 2191 // A notification should have been broadcast for each call to SetFavicons() |
| 2166 // and MergeFavicon(). | 2192 // and MergeFavicon(). |
| 2167 EXPECT_EQ(3, num_broadcasted_notifications()); | 2193 EXPECT_EQ(3, favicon_changed_notifications()); |
| 2168 } | 2194 } |
| 2169 | 2195 |
| 2170 // Test that MergeFavicon() does not add more than | 2196 // Test that MergeFavicon() does not add more than |
| 2171 // |kMaxFaviconBitmapsPerIconURL| to a favicon. | 2197 // |kMaxFaviconBitmapsPerIconURL| to a favicon. |
| 2172 TEST_F(HistoryBackendTest, MergeFaviconMaxFaviconBitmapsPerIconURL) { | 2198 TEST_F(HistoryBackendTest, MergeFaviconMaxFaviconBitmapsPerIconURL) { |
| 2173 GURL page_url("http://www.google.com"); | 2199 GURL page_url("http://www.google.com"); |
| 2174 std::string icon_url_string("http://www.google.com/favicon.ico"); | 2200 std::string icon_url_string("http://www.google.com/favicon.ico"); |
| 2175 size_t replace_index = icon_url_string.size() - 1; | 2201 size_t replace_index = icon_url_string.size() - 1; |
| 2176 | 2202 |
| 2177 std::vector<unsigned char> data; | 2203 std::vector<unsigned char> data; |
| (...skipping 1158 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3336 // Verify that the second term is no longer returned as result, and also check | 3362 // Verify that the second term is no longer returned as result, and also check |
| 3337 // at the low level that it is gone for good. The term corresponding to the | 3363 // at the low level that it is gone for good. The term corresponding to the |
| 3338 // first URLRow should not be affected. | 3364 // first URLRow should not be affected. |
| 3339 EXPECT_EQ(1u, GetNumberOfMatchingSearchTerms(kTestKeywordId, term1)); | 3365 EXPECT_EQ(1u, GetNumberOfMatchingSearchTerms(kTestKeywordId, term1)); |
| 3340 EXPECT_EQ(0u, GetNumberOfMatchingSearchTerms(kTestKeywordId, term2)); | 3366 EXPECT_EQ(0u, GetNumberOfMatchingSearchTerms(kTestKeywordId, term2)); |
| 3341 EXPECT_TRUE(mem_backend_->db()->GetKeywordSearchTermRow(row1.id(), NULL)); | 3367 EXPECT_TRUE(mem_backend_->db()->GetKeywordSearchTermRow(row1.id(), NULL)); |
| 3342 EXPECT_FALSE(mem_backend_->db()->GetKeywordSearchTermRow(row2.id(), NULL)); | 3368 EXPECT_FALSE(mem_backend_->db()->GetKeywordSearchTermRow(row2.id(), NULL)); |
| 3343 } | 3369 } |
| 3344 | 3370 |
| 3345 } // namespace history | 3371 } // namespace history |
| OLD | NEW |