| 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 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 85 // This must be a separate object since HistoryBackend manages its lifetime. | 85 // This must be a separate object since HistoryBackend manages its lifetime. |
| 86 // This just forwards the messages we're interested in to the test object. | 86 // This just forwards the messages we're interested in to the test object. |
| 87 class HistoryBackendTestDelegate : public HistoryBackend::Delegate { | 87 class HistoryBackendTestDelegate : public HistoryBackend::Delegate { |
| 88 public: | 88 public: |
| 89 explicit HistoryBackendTestDelegate(HistoryBackendTestBase* test) | 89 explicit HistoryBackendTestDelegate(HistoryBackendTestBase* test) |
| 90 : test_(test) {} | 90 : test_(test) {} |
| 91 | 91 |
| 92 virtual void NotifyProfileError(sql::InitStatus init_status) OVERRIDE {} | 92 virtual void NotifyProfileError(sql::InitStatus init_status) OVERRIDE {} |
| 93 virtual void SetInMemoryBackend( | 93 virtual void SetInMemoryBackend( |
| 94 scoped_ptr<InMemoryHistoryBackend> backend) OVERRIDE; | 94 scoped_ptr<InMemoryHistoryBackend> backend) OVERRIDE; |
| 95 virtual void NotifyFaviconChanged(const std::set<GURL>& urls) OVERRIDE; |
| 95 virtual void BroadcastNotifications( | 96 virtual void BroadcastNotifications( |
| 96 int type, | 97 int type, |
| 97 scoped_ptr<HistoryDetails> details) OVERRIDE; | 98 scoped_ptr<HistoryDetails> details) OVERRIDE; |
| 98 virtual void DBLoaded() OVERRIDE; | 99 virtual void DBLoaded() OVERRIDE; |
| 99 virtual void NotifyVisitDBObserversOnAddVisit( | 100 virtual void NotifyVisitDBObserversOnAddVisit( |
| 100 const BriefVisitInfo& info) OVERRIDE {} | 101 const BriefVisitInfo& info) OVERRIDE {} |
| 101 | 102 |
| 102 private: | 103 private: |
| 103 // Not owned by us. | 104 // Not owned by us. |
| 104 HistoryBackendTestBase* test_; | 105 HistoryBackendTestBase* test_; |
| 105 | 106 |
| 106 DISALLOW_COPY_AND_ASSIGN(HistoryBackendTestDelegate); | 107 DISALLOW_COPY_AND_ASSIGN(HistoryBackendTestDelegate); |
| 107 }; | 108 }; |
| 108 | 109 |
| 109 class HistoryBackendTestBase : public testing::Test { | 110 class HistoryBackendTestBase : public testing::Test { |
| 110 public: | 111 public: |
| 111 typedef std::vector<std::pair<int, HistoryDetails*> > NotificationList; | 112 typedef std::vector<std::pair<int, HistoryDetails*> > NotificationList; |
| 112 | 113 |
| 113 HistoryBackendTestBase() | 114 HistoryBackendTestBase() |
| 114 : loaded_(false), | 115 : loaded_(false), |
| 116 favicon_changed_notifications_(0), |
| 115 ui_thread_(content::BrowserThread::UI, &message_loop_) {} | 117 ui_thread_(content::BrowserThread::UI, &message_loop_) {} |
| 116 | 118 |
| 117 virtual ~HistoryBackendTestBase() { | 119 virtual ~HistoryBackendTestBase() { |
| 118 STLDeleteValues(&broadcasted_notifications_); | 120 STLDeleteValues(&broadcasted_notifications_); |
| 119 } | 121 } |
| 120 | 122 |
| 121 protected: | 123 protected: |
| 124 int favicon_changed_notifications() const { |
| 125 return favicon_changed_notifications_; |
| 126 } |
| 127 |
| 128 void ClearFaviconChangedNotificationCounter() { |
| 129 favicon_changed_notifications_ = 0; |
| 130 } |
| 131 |
| 122 int num_broadcasted_notifications() const { | 132 int num_broadcasted_notifications() const { |
| 123 return broadcasted_notifications_.size(); | 133 return broadcasted_notifications_.size(); |
| 124 } | 134 } |
| 125 | 135 |
| 126 const NotificationList& broadcasted_notifications() const { | 136 const NotificationList& broadcasted_notifications() const { |
| 127 return broadcasted_notifications_; | 137 return broadcasted_notifications_; |
| 128 } | 138 } |
| 129 | 139 |
| 130 void ClearBroadcastedNotifications() { | 140 void ClearBroadcastedNotifications() { |
| 131 STLDeleteValues(&broadcasted_notifications_); | 141 STLDeleteValues(&broadcasted_notifications_); |
| 132 } | 142 } |
| 133 | 143 |
| 134 base::FilePath test_dir() { | 144 base::FilePath test_dir() { |
| 135 return test_dir_; | 145 return test_dir_; |
| 136 } | 146 } |
| 137 | 147 |
| 148 void NotifyFaviconChanged(const std::set<GURL>& changed_favicons) { |
| 149 ++favicon_changed_notifications_; |
| 150 } |
| 151 |
| 138 void BroadcastNotifications(int type, scoped_ptr<HistoryDetails> details) { | 152 void BroadcastNotifications(int type, scoped_ptr<HistoryDetails> details) { |
| 139 // Send the notifications directly to the in-memory database. | 153 // Send the notifications directly to the in-memory database. |
| 140 content::Details<HistoryDetails> det(details.get()); | 154 content::Details<HistoryDetails> det(details.get()); |
| 141 mem_backend_->Observe( | 155 mem_backend_->Observe( |
| 142 type, content::Source<HistoryBackendTestBase>(NULL), det); | 156 type, content::Source<HistoryBackendTestBase>(NULL), det); |
| 143 | 157 |
| 144 // The backend passes ownership of the details pointer to us. | 158 // The backend passes ownership of the details pointer to us. |
| 145 broadcasted_notifications_.push_back( | 159 broadcasted_notifications_.push_back( |
| 146 std::make_pair(type, details.release())); | 160 std::make_pair(type, details.release())); |
| 147 } | 161 } |
| 148 | 162 |
| 149 history::HistoryClientFakeBookmarks history_client_; | 163 history::HistoryClientFakeBookmarks history_client_; |
| 150 scoped_refptr<HistoryBackend> backend_; // Will be NULL on init failure. | 164 scoped_refptr<HistoryBackend> backend_; // Will be NULL on init failure. |
| 151 scoped_ptr<InMemoryHistoryBackend> mem_backend_; | 165 scoped_ptr<InMemoryHistoryBackend> mem_backend_; |
| 152 bool loaded_; | 166 bool loaded_; |
| 153 | 167 |
| 154 private: | 168 private: |
| 155 friend class HistoryBackendTestDelegate; | 169 friend class HistoryBackendTestDelegate; |
| 156 | 170 |
| 157 // testing::Test | 171 // testing::Test |
| 158 virtual void SetUp() { | 172 virtual void SetUp() { |
| 173 ClearFaviconChangedNotificationCounter(); |
| 159 if (!base::CreateNewTempDirectory(FILE_PATH_LITERAL("BackendTest"), | 174 if (!base::CreateNewTempDirectory(FILE_PATH_LITERAL("BackendTest"), |
| 160 &test_dir_)) | 175 &test_dir_)) |
| 161 return; | 176 return; |
| 162 backend_ = new HistoryBackend( | 177 backend_ = new HistoryBackend( |
| 163 test_dir_, new HistoryBackendTestDelegate(this), &history_client_); | 178 test_dir_, new HistoryBackendTestDelegate(this), &history_client_); |
| 164 backend_->Init(std::string(), false); | 179 backend_->Init(std::string(), false); |
| 165 } | 180 } |
| 166 | 181 |
| 167 virtual void TearDown() { | 182 virtual void TearDown() { |
| 168 if (backend_.get()) | 183 if (backend_.get()) |
| 169 backend_->Closing(); | 184 backend_->Closing(); |
| 170 backend_ = NULL; | 185 backend_ = NULL; |
| 171 mem_backend_.reset(); | 186 mem_backend_.reset(); |
| 172 base::DeleteFile(test_dir_, true); | 187 base::DeleteFile(test_dir_, true); |
| 173 base::RunLoop().RunUntilIdle(); | 188 base::RunLoop().RunUntilIdle(); |
| 174 history_client_.ClearAllBookmarks(); | 189 history_client_.ClearAllBookmarks(); |
| 175 } | 190 } |
| 176 | 191 |
| 177 void SetInMemoryBackend(scoped_ptr<InMemoryHistoryBackend> backend) { | 192 void SetInMemoryBackend(scoped_ptr<InMemoryHistoryBackend> backend) { |
| 178 mem_backend_.swap(backend); | 193 mem_backend_.swap(backend); |
| 179 } | 194 } |
| 180 | 195 |
| 181 // The types and details of notifications which were broadcasted. | 196 // The types and details of notifications which were broadcasted. |
| 182 NotificationList broadcasted_notifications_; | 197 NotificationList broadcasted_notifications_; |
| 198 int favicon_changed_notifications_; |
| 183 | 199 |
| 184 base::MessageLoop message_loop_; | 200 base::MessageLoop message_loop_; |
| 185 base::FilePath test_dir_; | 201 base::FilePath test_dir_; |
| 186 content::TestBrowserThread ui_thread_; | 202 content::TestBrowserThread ui_thread_; |
| 187 | 203 |
| 188 DISALLOW_COPY_AND_ASSIGN(HistoryBackendTestBase); | 204 DISALLOW_COPY_AND_ASSIGN(HistoryBackendTestBase); |
| 189 }; | 205 }; |
| 190 | 206 |
| 191 void HistoryBackendTestDelegate::SetInMemoryBackend( | 207 void HistoryBackendTestDelegate::SetInMemoryBackend( |
| 192 scoped_ptr<InMemoryHistoryBackend> backend) { | 208 scoped_ptr<InMemoryHistoryBackend> backend) { |
| 193 test_->SetInMemoryBackend(backend.Pass()); | 209 test_->SetInMemoryBackend(backend.Pass()); |
| 194 } | 210 } |
| 195 | 211 |
| 212 void HistoryBackendTestDelegate::NotifyFaviconChanged( |
| 213 const std::set<GURL>& changed_favicons) { |
| 214 test_->NotifyFaviconChanged(changed_favicons); |
| 215 } |
| 216 |
| 196 void HistoryBackendTestDelegate::BroadcastNotifications( | 217 void HistoryBackendTestDelegate::BroadcastNotifications( |
| 197 int type, | 218 int type, |
| 198 scoped_ptr<HistoryDetails> details) { | 219 scoped_ptr<HistoryDetails> details) { |
| 199 test_->BroadcastNotifications(type, details.Pass()); | 220 test_->BroadcastNotifications(type, details.Pass()); |
| 200 } | 221 } |
| 201 | 222 |
| 202 void HistoryBackendTestDelegate::DBLoaded() { | 223 void HistoryBackendTestDelegate::DBLoaded() { |
| 203 test_->loaded_ = true; | 224 test_->loaded_ = true; |
| 204 } | 225 } |
| 205 | 226 |
| (...skipping 1435 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1641 EXPECT_TRUE(BitmapColorEqual(SK_ColorWHITE, bitmap_data_out)); | 1662 EXPECT_TRUE(BitmapColorEqual(SK_ColorWHITE, bitmap_data_out)); |
| 1642 EXPECT_EQ(kLargeSize, pixel_size_out); | 1663 EXPECT_EQ(kLargeSize, pixel_size_out); |
| 1643 | 1664 |
| 1644 icon_mappings.clear(); | 1665 icon_mappings.clear(); |
| 1645 EXPECT_TRUE(backend_->thumbnail_db_->GetIconMappingsForPageURL(page_url, | 1666 EXPECT_TRUE(backend_->thumbnail_db_->GetIconMappingsForPageURL(page_url, |
| 1646 &icon_mappings)); | 1667 &icon_mappings)); |
| 1647 EXPECT_EQ(1u, icon_mappings.size()); | 1668 EXPECT_EQ(1u, icon_mappings.size()); |
| 1648 EXPECT_EQ(favicon_id, icon_mappings[0].icon_id); | 1669 EXPECT_EQ(favicon_id, icon_mappings[0].icon_id); |
| 1649 | 1670 |
| 1650 // Notifications should have been broadcast for each call to SetFavicons(). | 1671 // Notifications should have been broadcast for each call to SetFavicons(). |
| 1651 EXPECT_EQ(2, num_broadcasted_notifications()); | 1672 EXPECT_EQ(2, favicon_changed_notifications()); |
| 1652 } | 1673 } |
| 1653 | 1674 |
| 1654 // Test updating a single favicon bitmap's data via SetFavicons. | 1675 // Test updating a single favicon bitmap's data via SetFavicons. |
| 1655 TEST_F(HistoryBackendTest, SetFaviconsReplaceBitmapData) { | 1676 TEST_F(HistoryBackendTest, SetFaviconsReplaceBitmapData) { |
| 1656 const GURL page_url("http://www.google.com/"); | 1677 const GURL page_url("http://www.google.com/"); |
| 1657 const GURL icon_url("http://www.google.com/icon"); | 1678 const GURL icon_url("http://www.google.com/icon"); |
| 1658 std::vector<SkBitmap> bitmaps; | 1679 std::vector<SkBitmap> bitmaps; |
| 1659 bitmaps.push_back(CreateBitmap(SK_ColorBLUE, kSmallEdgeSize)); | 1680 bitmaps.push_back(CreateBitmap(SK_ColorBLUE, kSmallEdgeSize)); |
| 1660 | 1681 |
| 1661 // Add bitmap to the database. | 1682 // Add bitmap to the database. |
| 1662 backend_->SetFavicons(page_url, favicon_base::FAVICON, icon_url, bitmaps); | 1683 backend_->SetFavicons(page_url, favicon_base::FAVICON, icon_url, bitmaps); |
| 1663 | 1684 |
| 1664 favicon_base::FaviconID original_favicon_id = | 1685 favicon_base::FaviconID original_favicon_id = |
| 1665 backend_->thumbnail_db_->GetFaviconIDForFaviconURL( | 1686 backend_->thumbnail_db_->GetFaviconIDForFaviconURL( |
| 1666 icon_url, favicon_base::FAVICON, NULL); | 1687 icon_url, favicon_base::FAVICON, NULL); |
| 1667 EXPECT_NE(0, original_favicon_id); | 1688 EXPECT_NE(0, original_favicon_id); |
| 1668 FaviconBitmap original_favicon_bitmap; | 1689 FaviconBitmap original_favicon_bitmap; |
| 1669 EXPECT_TRUE( | 1690 EXPECT_TRUE( |
| 1670 GetOnlyFaviconBitmap(original_favicon_id, &original_favicon_bitmap)); | 1691 GetOnlyFaviconBitmap(original_favicon_id, &original_favicon_bitmap)); |
| 1671 EXPECT_TRUE( | 1692 EXPECT_TRUE( |
| 1672 BitmapColorEqual(SK_ColorBLUE, original_favicon_bitmap.bitmap_data)); | 1693 BitmapColorEqual(SK_ColorBLUE, original_favicon_bitmap.bitmap_data)); |
| 1673 | 1694 |
| 1674 EXPECT_EQ(1, num_broadcasted_notifications()); | 1695 EXPECT_EQ(1, favicon_changed_notifications()); |
| 1675 | 1696 |
| 1676 // Call SetFavicons() with completely identical data. | 1697 // Call SetFavicons() with completely identical data. |
| 1677 bitmaps[0] = CreateBitmap(SK_ColorBLUE, kSmallEdgeSize); | 1698 bitmaps[0] = CreateBitmap(SK_ColorBLUE, kSmallEdgeSize); |
| 1678 backend_->SetFavicons(page_url, favicon_base::FAVICON, icon_url, bitmaps); | 1699 backend_->SetFavicons(page_url, favicon_base::FAVICON, icon_url, bitmaps); |
| 1679 | 1700 |
| 1680 favicon_base::FaviconID updated_favicon_id = | 1701 favicon_base::FaviconID updated_favicon_id = |
| 1681 backend_->thumbnail_db_->GetFaviconIDForFaviconURL( | 1702 backend_->thumbnail_db_->GetFaviconIDForFaviconURL( |
| 1682 icon_url, favicon_base::FAVICON, NULL); | 1703 icon_url, favicon_base::FAVICON, NULL); |
| 1683 EXPECT_NE(0, updated_favicon_id); | 1704 EXPECT_NE(0, updated_favicon_id); |
| 1684 FaviconBitmap updated_favicon_bitmap; | 1705 FaviconBitmap updated_favicon_bitmap; |
| 1685 EXPECT_TRUE( | 1706 EXPECT_TRUE( |
| 1686 GetOnlyFaviconBitmap(updated_favicon_id, &updated_favicon_bitmap)); | 1707 GetOnlyFaviconBitmap(updated_favicon_id, &updated_favicon_bitmap)); |
| 1687 EXPECT_TRUE( | 1708 EXPECT_TRUE( |
| 1688 BitmapColorEqual(SK_ColorBLUE, updated_favicon_bitmap.bitmap_data)); | 1709 BitmapColorEqual(SK_ColorBLUE, updated_favicon_bitmap.bitmap_data)); |
| 1689 | 1710 |
| 1690 // Because the bitmap data is byte equivalent, no notifications should have | 1711 // Because the bitmap data is byte equivalent, no notifications should have |
| 1691 // been broadcasted. | 1712 // been broadcasted. |
| 1692 EXPECT_EQ(1, num_broadcasted_notifications()); | 1713 EXPECT_EQ(1, favicon_changed_notifications()); |
| 1693 | 1714 |
| 1694 // Call SetFavicons() with a different bitmap of the same size. | 1715 // Call SetFavicons() with a different bitmap of the same size. |
| 1695 bitmaps[0] = CreateBitmap(SK_ColorWHITE, kSmallEdgeSize); | 1716 bitmaps[0] = CreateBitmap(SK_ColorWHITE, kSmallEdgeSize); |
| 1696 backend_->SetFavicons(page_url, favicon_base::FAVICON, icon_url, bitmaps); | 1717 backend_->SetFavicons(page_url, favicon_base::FAVICON, icon_url, bitmaps); |
| 1697 | 1718 |
| 1698 updated_favicon_id = backend_->thumbnail_db_->GetFaviconIDForFaviconURL( | 1719 updated_favicon_id = backend_->thumbnail_db_->GetFaviconIDForFaviconURL( |
| 1699 icon_url, favicon_base::FAVICON, NULL); | 1720 icon_url, favicon_base::FAVICON, NULL); |
| 1700 EXPECT_NE(0, updated_favicon_id); | 1721 EXPECT_NE(0, updated_favicon_id); |
| 1701 EXPECT_TRUE( | 1722 EXPECT_TRUE( |
| 1702 GetOnlyFaviconBitmap(updated_favicon_id, &updated_favicon_bitmap)); | 1723 GetOnlyFaviconBitmap(updated_favicon_id, &updated_favicon_bitmap)); |
| 1703 EXPECT_TRUE( | 1724 EXPECT_TRUE( |
| 1704 BitmapColorEqual(SK_ColorWHITE, updated_favicon_bitmap.bitmap_data)); | 1725 BitmapColorEqual(SK_ColorWHITE, updated_favicon_bitmap.bitmap_data)); |
| 1705 | 1726 |
| 1706 // There should be no churn in FaviconIDs or FaviconBitmapIds even though | 1727 // There should be no churn in FaviconIDs or FaviconBitmapIds even though |
| 1707 // the bitmap data changed. | 1728 // the bitmap data changed. |
| 1708 EXPECT_EQ(original_favicon_bitmap.icon_id, updated_favicon_bitmap.icon_id); | 1729 EXPECT_EQ(original_favicon_bitmap.icon_id, updated_favicon_bitmap.icon_id); |
| 1709 EXPECT_EQ(original_favicon_bitmap.bitmap_id, | 1730 EXPECT_EQ(original_favicon_bitmap.bitmap_id, |
| 1710 updated_favicon_bitmap.bitmap_id); | 1731 updated_favicon_bitmap.bitmap_id); |
| 1711 | 1732 |
| 1712 // A notification should have been broadcasted as the favicon bitmap data has | 1733 // A notification should have been broadcasted as the favicon bitmap data has |
| 1713 // changed. | 1734 // changed. |
| 1714 EXPECT_EQ(2, num_broadcasted_notifications()); | 1735 EXPECT_EQ(2, favicon_changed_notifications()); |
| 1715 } | 1736 } |
| 1716 | 1737 |
| 1717 // Test that if two pages share the same FaviconID, changing the favicon for | 1738 // Test that if two pages share the same FaviconID, changing the favicon for |
| 1718 // one page does not affect the other. | 1739 // one page does not affect the other. |
| 1719 TEST_F(HistoryBackendTest, SetFaviconsSameFaviconURLForTwoPages) { | 1740 TEST_F(HistoryBackendTest, SetFaviconsSameFaviconURLForTwoPages) { |
| 1720 GURL icon_url("http://www.google.com/favicon.ico"); | 1741 GURL icon_url("http://www.google.com/favicon.ico"); |
| 1721 GURL icon_url_new("http://www.google.com/favicon2.ico"); | 1742 GURL icon_url_new("http://www.google.com/favicon2.ico"); |
| 1722 GURL page_url1("http://www.google.com"); | 1743 GURL page_url1("http://www.google.com"); |
| 1723 GURL page_url2("http://www.google.ca"); | 1744 GURL page_url2("http://www.google.ca"); |
| 1724 std::vector<SkBitmap> bitmaps; | 1745 std::vector<SkBitmap> bitmaps; |
| (...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1778 EXPECT_EQ(1u, icon_mappings.size()); | 1799 EXPECT_EQ(1u, icon_mappings.size()); |
| 1779 EXPECT_EQ(favicon_id, icon_mappings[0].icon_id); | 1800 EXPECT_EQ(favicon_id, icon_mappings[0].icon_id); |
| 1780 | 1801 |
| 1781 favicon_bitmaps.clear(); | 1802 favicon_bitmaps.clear(); |
| 1782 EXPECT_TRUE(backend_->thumbnail_db_->GetFaviconBitmaps(favicon_id, | 1803 EXPECT_TRUE(backend_->thumbnail_db_->GetFaviconBitmaps(favicon_id, |
| 1783 &favicon_bitmaps)); | 1804 &favicon_bitmaps)); |
| 1784 EXPECT_EQ(2u, favicon_bitmaps.size()); | 1805 EXPECT_EQ(2u, favicon_bitmaps.size()); |
| 1785 | 1806 |
| 1786 // A notification should have been broadcast for each call to SetFavicons() | 1807 // A notification should have been broadcast for each call to SetFavicons() |
| 1787 // and each call to UpdateFaviconMappingsAndFetch(). | 1808 // and each call to UpdateFaviconMappingsAndFetch(). |
| 1788 EXPECT_EQ(3, num_broadcasted_notifications()); | 1809 EXPECT_EQ(3, favicon_changed_notifications()); |
| 1789 } | 1810 } |
| 1790 | 1811 |
| 1791 // Test that no notifications are broadcast as a result of calling | 1812 // Test that no notifications are broadcast as a result of calling |
| 1792 // UpdateFaviconMappingsAndFetch() for an icon URL which is already | 1813 // UpdateFaviconMappingsAndFetch() for an icon URL which is already |
| 1793 // mapped to the passed in page URL. | 1814 // mapped to the passed in page URL. |
| 1794 TEST_F(HistoryBackendTest, UpdateFaviconMappingsAndFetchNoChange) { | 1815 TEST_F(HistoryBackendTest, UpdateFaviconMappingsAndFetchNoChange) { |
| 1795 GURL page_url("http://www.google.com"); | 1816 GURL page_url("http://www.google.com"); |
| 1796 GURL icon_url("http://www.google.com/favicon.ico"); | 1817 GURL icon_url("http://www.google.com/favicon.ico"); |
| 1797 std::vector<SkBitmap> bitmaps; | 1818 std::vector<SkBitmap> bitmaps; |
| 1798 bitmaps.push_back(CreateBitmap(SK_ColorBLUE, kSmallEdgeSize)); | 1819 bitmaps.push_back(CreateBitmap(SK_ColorBLUE, kSmallEdgeSize)); |
| 1799 | 1820 |
| 1800 backend_->SetFavicons(page_url, favicon_base::FAVICON, icon_url, bitmaps); | 1821 backend_->SetFavicons(page_url, favicon_base::FAVICON, icon_url, bitmaps); |
| 1801 | 1822 |
| 1802 favicon_base::FaviconID icon_id = | 1823 favicon_base::FaviconID icon_id = |
| 1803 backend_->thumbnail_db_->GetFaviconIDForFaviconURL( | 1824 backend_->thumbnail_db_->GetFaviconIDForFaviconURL( |
| 1804 icon_url, favicon_base::FAVICON, NULL); | 1825 icon_url, favicon_base::FAVICON, NULL); |
| 1805 EXPECT_NE(0, icon_id); | 1826 EXPECT_NE(0, icon_id); |
| 1806 EXPECT_EQ(1, num_broadcasted_notifications()); | 1827 EXPECT_EQ(1, favicon_changed_notifications()); |
| 1807 | 1828 |
| 1808 std::vector<GURL> icon_urls; | 1829 std::vector<GURL> icon_urls; |
| 1809 icon_urls.push_back(icon_url); | 1830 icon_urls.push_back(icon_url); |
| 1810 | 1831 |
| 1811 std::vector<favicon_base::FaviconRawBitmapResult> bitmap_results; | 1832 std::vector<favicon_base::FaviconRawBitmapResult> bitmap_results; |
| 1812 backend_->UpdateFaviconMappingsAndFetch(page_url, | 1833 backend_->UpdateFaviconMappingsAndFetch(page_url, |
| 1813 icon_urls, | 1834 icon_urls, |
| 1814 favicon_base::FAVICON, | 1835 favicon_base::FAVICON, |
| 1815 GetEdgeSizesSmallAndLarge(), | 1836 GetEdgeSizesSmallAndLarge(), |
| 1816 &bitmap_results); | 1837 &bitmap_results); |
| 1817 | 1838 |
| 1818 EXPECT_EQ(icon_id, | 1839 EXPECT_EQ(icon_id, |
| 1819 backend_->thumbnail_db_->GetFaviconIDForFaviconURL( | 1840 backend_->thumbnail_db_->GetFaviconIDForFaviconURL( |
| 1820 icon_url, favicon_base::FAVICON, NULL)); | 1841 icon_url, favicon_base::FAVICON, NULL)); |
| 1821 | 1842 |
| 1822 // No notification should have been broadcast as no icon mapping, favicon, | 1843 // No notification should have been broadcast as no icon mapping, favicon, |
| 1823 // or favicon bitmap was updated, added or removed. | 1844 // or favicon bitmap was updated, added or removed. |
| 1824 EXPECT_EQ(1, num_broadcasted_notifications()); | 1845 EXPECT_EQ(1, favicon_changed_notifications()); |
| 1825 } | 1846 } |
| 1826 | 1847 |
| 1827 // Test repeatedly calling MergeFavicon(). |page_url| is initially not known | 1848 // Test repeatedly calling MergeFavicon(). |page_url| is initially not known |
| 1828 // to the database. | 1849 // to the database. |
| 1829 TEST_F(HistoryBackendTest, MergeFaviconPageURLNotInDB) { | 1850 TEST_F(HistoryBackendTest, MergeFaviconPageURLNotInDB) { |
| 1830 GURL page_url("http://www.google.com"); | 1851 GURL page_url("http://www.google.com"); |
| 1831 GURL icon_url("http:/www.google.com/favicon.ico"); | 1852 GURL icon_url("http:/www.google.com/favicon.ico"); |
| 1832 | 1853 |
| 1833 std::vector<unsigned char> data; | 1854 std::vector<unsigned char> data; |
| 1834 data.push_back('a'); | 1855 data.push_back('a'); |
| (...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1887 &icon_mappings)); | 1908 &icon_mappings)); |
| 1888 EXPECT_EQ(1u, icon_mappings.size()); | 1909 EXPECT_EQ(1u, icon_mappings.size()); |
| 1889 EXPECT_EQ(icon_url1, icon_mappings[0].icon_url); | 1910 EXPECT_EQ(icon_url1, icon_mappings[0].icon_url); |
| 1890 | 1911 |
| 1891 FaviconBitmap favicon_bitmap; | 1912 FaviconBitmap favicon_bitmap; |
| 1892 EXPECT_TRUE(GetOnlyFaviconBitmap(icon_mappings[0].icon_id, &favicon_bitmap)); | 1913 EXPECT_TRUE(GetOnlyFaviconBitmap(icon_mappings[0].icon_id, &favicon_bitmap)); |
| 1893 EXPECT_NE(base::Time(), favicon_bitmap.last_updated); | 1914 EXPECT_NE(base::Time(), favicon_bitmap.last_updated); |
| 1894 EXPECT_TRUE(BitmapColorEqual(SK_ColorBLUE, favicon_bitmap.bitmap_data)); | 1915 EXPECT_TRUE(BitmapColorEqual(SK_ColorBLUE, favicon_bitmap.bitmap_data)); |
| 1895 EXPECT_EQ(kSmallSize, favicon_bitmap.pixel_size); | 1916 EXPECT_EQ(kSmallSize, favicon_bitmap.pixel_size); |
| 1896 | 1917 |
| 1897 EXPECT_EQ(1, num_broadcasted_notifications()); | 1918 EXPECT_EQ(1, favicon_changed_notifications()); |
| 1898 | 1919 |
| 1899 // 1) Merge identical favicon bitmap. | 1920 // 1) Merge identical favicon bitmap. |
| 1900 std::vector<unsigned char> data; | 1921 std::vector<unsigned char> data; |
| 1901 gfx::PNGCodec::EncodeBGRASkBitmap(bitmaps[0], false, &data); | 1922 gfx::PNGCodec::EncodeBGRASkBitmap(bitmaps[0], false, &data); |
| 1902 scoped_refptr<base::RefCountedBytes> bitmap_data( | 1923 scoped_refptr<base::RefCountedBytes> bitmap_data( |
| 1903 new base::RefCountedBytes(data)); | 1924 new base::RefCountedBytes(data)); |
| 1904 backend_->MergeFavicon( | 1925 backend_->MergeFavicon( |
| 1905 page_url, icon_url1, favicon_base::FAVICON, bitmap_data, kSmallSize); | 1926 page_url, icon_url1, favicon_base::FAVICON, bitmap_data, kSmallSize); |
| 1906 | 1927 |
| 1907 // All the data should stay the same and no notifications should have been | 1928 // All the data should stay the same and no notifications should have been |
| 1908 // sent. | 1929 // sent. |
| 1909 icon_mappings.clear(); | 1930 icon_mappings.clear(); |
| 1910 EXPECT_TRUE(backend_->thumbnail_db_->GetIconMappingsForPageURL(page_url, | 1931 EXPECT_TRUE(backend_->thumbnail_db_->GetIconMappingsForPageURL(page_url, |
| 1911 &icon_mappings)); | 1932 &icon_mappings)); |
| 1912 EXPECT_EQ(1u, icon_mappings.size()); | 1933 EXPECT_EQ(1u, icon_mappings.size()); |
| 1913 EXPECT_EQ(icon_url1, icon_mappings[0].icon_url); | 1934 EXPECT_EQ(icon_url1, icon_mappings[0].icon_url); |
| 1914 | 1935 |
| 1915 EXPECT_TRUE(GetOnlyFaviconBitmap(icon_mappings[0].icon_id, &favicon_bitmap)); | 1936 EXPECT_TRUE(GetOnlyFaviconBitmap(icon_mappings[0].icon_id, &favicon_bitmap)); |
| 1916 EXPECT_NE(base::Time(), favicon_bitmap.last_updated); | 1937 EXPECT_NE(base::Time(), favicon_bitmap.last_updated); |
| 1917 EXPECT_TRUE(BitmapColorEqual(SK_ColorBLUE, favicon_bitmap.bitmap_data)); | 1938 EXPECT_TRUE(BitmapColorEqual(SK_ColorBLUE, favicon_bitmap.bitmap_data)); |
| 1918 EXPECT_EQ(kSmallSize, favicon_bitmap.pixel_size); | 1939 EXPECT_EQ(kSmallSize, favicon_bitmap.pixel_size); |
| 1919 | 1940 |
| 1920 EXPECT_EQ(1, num_broadcasted_notifications()); | 1941 EXPECT_EQ(1, favicon_changed_notifications()); |
| 1921 | 1942 |
| 1922 // 2) Merge favicon bitmap of the same size. | 1943 // 2) Merge favicon bitmap of the same size. |
| 1923 data.clear(); | 1944 data.clear(); |
| 1924 data.push_back('b'); | 1945 data.push_back('b'); |
| 1925 bitmap_data = new base::RefCountedBytes(data); | 1946 bitmap_data = new base::RefCountedBytes(data); |
| 1926 backend_->MergeFavicon( | 1947 backend_->MergeFavicon( |
| 1927 page_url, icon_url1, favicon_base::FAVICON, bitmap_data, kSmallSize); | 1948 page_url, icon_url1, favicon_base::FAVICON, bitmap_data, kSmallSize); |
| 1928 | 1949 |
| 1929 // The small favicon bitmap at |icon_url1| should be overwritten. | 1950 // The small favicon bitmap at |icon_url1| should be overwritten. |
| 1930 icon_mappings.clear(); | 1951 icon_mappings.clear(); |
| (...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1985 EXPECT_TRUE(BitmapDataEqual('c', favicon_bitmaps[0].bitmap_data)); | 2006 EXPECT_TRUE(BitmapDataEqual('c', favicon_bitmaps[0].bitmap_data)); |
| 1986 EXPECT_EQ(kTinySize, favicon_bitmaps[0].pixel_size); | 2007 EXPECT_EQ(kTinySize, favicon_bitmaps[0].pixel_size); |
| 1987 // The favicon being merged should take precedence over the preexisting | 2008 // The favicon being merged should take precedence over the preexisting |
| 1988 // favicon bitmaps. | 2009 // favicon bitmaps. |
| 1989 EXPECT_NE(base::Time(), favicon_bitmaps[1].last_updated); | 2010 EXPECT_NE(base::Time(), favicon_bitmaps[1].last_updated); |
| 1990 EXPECT_TRUE(BitmapDataEqual('d', favicon_bitmaps[1].bitmap_data)); | 2011 EXPECT_TRUE(BitmapDataEqual('d', favicon_bitmaps[1].bitmap_data)); |
| 1991 EXPECT_EQ(kSmallSize, favicon_bitmaps[1].pixel_size); | 2012 EXPECT_EQ(kSmallSize, favicon_bitmaps[1].pixel_size); |
| 1992 | 2013 |
| 1993 // A notification should have been broadcast for each call to SetFavicons() | 2014 // A notification should have been broadcast for each call to SetFavicons() |
| 1994 // and MergeFavicon(). | 2015 // and MergeFavicon(). |
| 1995 EXPECT_EQ(4, num_broadcasted_notifications()); | 2016 EXPECT_EQ(4, favicon_changed_notifications()); |
| 1996 } | 2017 } |
| 1997 | 2018 |
| 1998 // Test calling MergeFavicon() when |icon_url| is known to the database but not | 2019 // Test calling MergeFavicon() when |icon_url| is known to the database but not |
| 1999 // mapped to |page_url|. | 2020 // mapped to |page_url|. |
| 2000 TEST_F(HistoryBackendTest, MergeFaviconIconURLMappedToDifferentPageURL) { | 2021 TEST_F(HistoryBackendTest, MergeFaviconIconURLMappedToDifferentPageURL) { |
| 2001 GURL page_url1("http://www.google.com"); | 2022 GURL page_url1("http://www.google.com"); |
| 2002 GURL page_url2("http://news.google.com"); | 2023 GURL page_url2("http://news.google.com"); |
| 2003 GURL page_url3("http://maps.google.com"); | 2024 GURL page_url3("http://maps.google.com"); |
| 2004 GURL icon_url("http:/www.google.com/favicon.ico"); | 2025 GURL icon_url("http:/www.google.com/favicon.ico"); |
| 2005 std::vector<SkBitmap> bitmaps; | 2026 std::vector<SkBitmap> bitmaps; |
| (...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2070 EXPECT_EQ(favicon_id, icon_mappings[0].icon_id); | 2091 EXPECT_EQ(favicon_id, icon_mappings[0].icon_id); |
| 2071 | 2092 |
| 2072 icon_mappings.clear(); | 2093 icon_mappings.clear(); |
| 2073 EXPECT_TRUE(backend_->thumbnail_db_->GetIconMappingsForPageURL(page_url3, | 2094 EXPECT_TRUE(backend_->thumbnail_db_->GetIconMappingsForPageURL(page_url3, |
| 2074 &icon_mappings)); | 2095 &icon_mappings)); |
| 2075 EXPECT_EQ(1u, icon_mappings.size()); | 2096 EXPECT_EQ(1u, icon_mappings.size()); |
| 2076 EXPECT_EQ(favicon_id, icon_mappings[0].icon_id); | 2097 EXPECT_EQ(favicon_id, icon_mappings[0].icon_id); |
| 2077 | 2098 |
| 2078 // A notification should have been broadcast for each call to SetFavicons() | 2099 // A notification should have been broadcast for each call to SetFavicons() |
| 2079 // and MergeFavicon(). | 2100 // and MergeFavicon(). |
| 2080 EXPECT_EQ(3, num_broadcasted_notifications()); | 2101 EXPECT_EQ(3, favicon_changed_notifications()); |
| 2081 } | 2102 } |
| 2082 | 2103 |
| 2083 // Test that MergeFavicon() does not add more than | 2104 // Test that MergeFavicon() does not add more than |
| 2084 // |kMaxFaviconBitmapsPerIconURL| to a favicon. | 2105 // |kMaxFaviconBitmapsPerIconURL| to a favicon. |
| 2085 TEST_F(HistoryBackendTest, MergeFaviconMaxFaviconBitmapsPerIconURL) { | 2106 TEST_F(HistoryBackendTest, MergeFaviconMaxFaviconBitmapsPerIconURL) { |
| 2086 GURL page_url("http://www.google.com"); | 2107 GURL page_url("http://www.google.com"); |
| 2087 std::string icon_url_string("http://www.google.com/favicon.ico"); | 2108 std::string icon_url_string("http://www.google.com/favicon.ico"); |
| 2088 size_t replace_index = icon_url_string.size() - 1; | 2109 size_t replace_index = icon_url_string.size() - 1; |
| 2089 | 2110 |
| 2090 std::vector<unsigned char> data; | 2111 std::vector<unsigned char> data; |
| (...skipping 1103 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3194 // Verify that the second term is no longer returned as result, and also check | 3215 // Verify that the second term is no longer returned as result, and also check |
| 3195 // at the low level that it is gone for good. The term corresponding to the | 3216 // at the low level that it is gone for good. The term corresponding to the |
| 3196 // first URLRow should not be affected. | 3217 // first URLRow should not be affected. |
| 3197 EXPECT_EQ(1u, GetNumberOfMatchingSearchTerms(kTestKeywordId, term1)); | 3218 EXPECT_EQ(1u, GetNumberOfMatchingSearchTerms(kTestKeywordId, term1)); |
| 3198 EXPECT_EQ(0u, GetNumberOfMatchingSearchTerms(kTestKeywordId, term2)); | 3219 EXPECT_EQ(0u, GetNumberOfMatchingSearchTerms(kTestKeywordId, term2)); |
| 3199 EXPECT_TRUE(mem_backend_->db()->GetKeywordSearchTermRow(row1.id(), NULL)); | 3220 EXPECT_TRUE(mem_backend_->db()->GetKeywordSearchTermRow(row1.id(), NULL)); |
| 3200 EXPECT_FALSE(mem_backend_->db()->GetKeywordSearchTermRow(row2.id(), NULL)); | 3221 EXPECT_FALSE(mem_backend_->db()->GetKeywordSearchTermRow(row2.id(), NULL)); |
| 3201 } | 3222 } |
| 3202 | 3223 |
| 3203 } // namespace history | 3224 } // namespace history |
| OLD | NEW |