| OLD | NEW |
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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 <list> | 7 #include <list> |
| 8 #include <map> | 8 #include <map> |
| 9 #include <set> | 9 #include <set> |
| 10 #include <vector> | 10 #include <vector> |
| (...skipping 1622 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1633 const std::vector<ImportedFavIconUsage>& favicon_usage) { | 1633 const std::vector<ImportedFavIconUsage>& favicon_usage) { |
| 1634 if (!db_.get() || !thumbnail_db_.get()) | 1634 if (!db_.get() || !thumbnail_db_.get()) |
| 1635 return; | 1635 return; |
| 1636 | 1636 |
| 1637 Time now = Time::Now(); | 1637 Time now = Time::Now(); |
| 1638 | 1638 |
| 1639 // Track all URLs that had their favicons set or updated. | 1639 // Track all URLs that had their favicons set or updated. |
| 1640 std::set<GURL> favicons_changed; | 1640 std::set<GURL> favicons_changed; |
| 1641 | 1641 |
| 1642 for (size_t i = 0; i < favicon_usage.size(); i++) { | 1642 for (size_t i = 0; i < favicon_usage.size(); i++) { |
| 1643 FavIconID favicon_id = thumbnail_db_->GetFavIconIDForFavIconURL( | 1643 FaviconID favicon_id = thumbnail_db_->GetFaviconIDForFavIconURL( |
| 1644 favicon_usage[i].favicon_url, history::FAV_ICON, NULL); | 1644 favicon_usage[i].favicon_url, history::FAV_ICON, NULL); |
| 1645 if (!favicon_id) { | 1645 if (!favicon_id) { |
| 1646 // This favicon doesn't exist yet, so we create it using the given data. | 1646 // This favicon doesn't exist yet, so we create it using the given data. |
| 1647 favicon_id = thumbnail_db_->AddFavIcon(favicon_usage[i].favicon_url, | 1647 favicon_id = thumbnail_db_->AddFavIcon(favicon_usage[i].favicon_url, |
| 1648 history::FAV_ICON); | 1648 history::FAV_ICON); |
| 1649 if (!favicon_id) | 1649 if (!favicon_id) |
| 1650 continue; // Unable to add the favicon. | 1650 continue; // Unable to add the favicon. |
| 1651 thumbnail_db_->SetFavicon(favicon_id, | 1651 thumbnail_db_->SetFavicon(favicon_id, |
| 1652 new RefCountedBytes(favicon_usage[i].png_data), now); | 1652 new RefCountedBytes(favicon_usage[i].png_data), now); |
| 1653 } | 1653 } |
| (...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1703 | 1703 |
| 1704 if (request->canceled()) | 1704 if (request->canceled()) |
| 1705 return; | 1705 return; |
| 1706 | 1706 |
| 1707 bool know_favicon = false; | 1707 bool know_favicon = false; |
| 1708 bool expired = true; | 1708 bool expired = true; |
| 1709 scoped_refptr<RefCountedBytes> data; | 1709 scoped_refptr<RefCountedBytes> data; |
| 1710 | 1710 |
| 1711 if (thumbnail_db_.get()) { | 1711 if (thumbnail_db_.get()) { |
| 1712 IconType returned_icon_type; | 1712 IconType returned_icon_type; |
| 1713 const FavIconID favicon_id = | 1713 const FaviconID favicon_id = |
| 1714 thumbnail_db_->GetFavIconIDForFavIconURL( | 1714 thumbnail_db_->GetFaviconIDForFavIconURL( |
| 1715 icon_url, icon_types, &returned_icon_type); | 1715 icon_url, icon_types, &returned_icon_type); |
| 1716 if (favicon_id) { | 1716 if (favicon_id) { |
| 1717 data = new RefCountedBytes; | 1717 data = new RefCountedBytes; |
| 1718 know_favicon = true; | 1718 know_favicon = true; |
| 1719 Time last_updated; | 1719 Time last_updated; |
| 1720 if (thumbnail_db_->GetFavicon(favicon_id, &last_updated, &data->data, | 1720 if (thumbnail_db_->GetFavicon(favicon_id, &last_updated, &data->data, |
| 1721 NULL)) { | 1721 NULL)) { |
| 1722 expired = (Time::Now() - last_updated) > | 1722 expired = (Time::Now() - last_updated) > |
| 1723 TimeDelta::FromDays(kFavIconRefetchDays); | 1723 TimeDelta::FromDays(kFavIconRefetchDays); |
| 1724 } | 1724 } |
| (...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1774 | 1774 |
| 1775 void HistoryBackend::SetFavicon( | 1775 void HistoryBackend::SetFavicon( |
| 1776 const GURL& page_url, | 1776 const GURL& page_url, |
| 1777 const GURL& icon_url, | 1777 const GURL& icon_url, |
| 1778 scoped_refptr<RefCountedMemory> data, | 1778 scoped_refptr<RefCountedMemory> data, |
| 1779 IconType icon_type) { | 1779 IconType icon_type) { |
| 1780 DCHECK(data.get()); | 1780 DCHECK(data.get()); |
| 1781 if (!thumbnail_db_.get() || !db_.get()) | 1781 if (!thumbnail_db_.get() || !db_.get()) |
| 1782 return; | 1782 return; |
| 1783 | 1783 |
| 1784 FavIconID id = thumbnail_db_->GetFavIconIDForFavIconURL( | 1784 FaviconID id = thumbnail_db_->GetFaviconIDForFavIconURL( |
| 1785 icon_url, icon_type, NULL); | 1785 icon_url, icon_type, NULL); |
| 1786 if (!id) | 1786 if (!id) |
| 1787 id = thumbnail_db_->AddFavIcon(icon_url, icon_type); | 1787 id = thumbnail_db_->AddFavIcon(icon_url, icon_type); |
| 1788 | 1788 |
| 1789 // Set the image data. | 1789 // Set the image data. |
| 1790 thumbnail_db_->SetFavicon(id, data, Time::Now()); | 1790 thumbnail_db_->SetFavicon(id, data, Time::Now()); |
| 1791 | 1791 |
| 1792 SetFaviconMapping(page_url, id, icon_type); | 1792 SetFaviconMapping(page_url, id, icon_type); |
| 1793 } | 1793 } |
| 1794 | 1794 |
| 1795 void HistoryBackend::SetFaviconMapping(const GURL& page_url, | 1795 void HistoryBackend::SetFaviconMapping(const GURL& page_url, |
| 1796 FavIconID id, | 1796 FaviconID id, |
| 1797 IconType icon_type) { | 1797 IconType icon_type) { |
| 1798 if (!thumbnail_db_.get()) | 1798 if (!thumbnail_db_.get()) |
| 1799 return; | 1799 return; |
| 1800 | 1800 |
| 1801 // Find all the pages whose favicons we should set, we want to set it for | 1801 // Find all the pages whose favicons we should set, we want to set it for |
| 1802 // all the pages in the redirect chain if it redirected. | 1802 // all the pages in the redirect chain if it redirected. |
| 1803 history::RedirectList dummy_list; | 1803 history::RedirectList dummy_list; |
| 1804 history::RedirectList* redirects; | 1804 history::RedirectList* redirects; |
| 1805 RedirectCache::iterator iter = recent_redirects_.Get(page_url); | 1805 RedirectCache::iterator iter = recent_redirects_.Get(page_url); |
| 1806 if (iter != recent_redirects_.end()) { | 1806 if (iter != recent_redirects_.end()) { |
| 1807 redirects = &iter->second; | 1807 redirects = &iter->second; |
| 1808 | 1808 |
| 1809 // This redirect chain should have the destination URL as the last item. | 1809 // This redirect chain should have the destination URL as the last item. |
| 1810 DCHECK(!redirects->empty()); | 1810 DCHECK(!redirects->empty()); |
| 1811 DCHECK(redirects->back() == page_url); | 1811 DCHECK(redirects->back() == page_url); |
| 1812 } else { | 1812 } else { |
| 1813 // No redirect chain stored, make up one containing the URL we want to we | 1813 // No redirect chain stored, make up one containing the URL we want to we |
| 1814 // can use the same logic below. | 1814 // can use the same logic below. |
| 1815 dummy_list.push_back(page_url); | 1815 dummy_list.push_back(page_url); |
| 1816 redirects = &dummy_list; | 1816 redirects = &dummy_list; |
| 1817 } | 1817 } |
| 1818 | 1818 |
| 1819 std::set<GURL> favicons_changed; | 1819 std::set<GURL> favicons_changed; |
| 1820 | 1820 |
| 1821 // Save page <-> favicon association. | 1821 // Save page <-> favicon association. |
| 1822 for (history::RedirectList::const_iterator i(redirects->begin()); | 1822 for (history::RedirectList::const_iterator i(redirects->begin()); |
| 1823 i != redirects->end(); ++i) { | 1823 i != redirects->end(); ++i) { |
| 1824 FavIconID replaced_id; | 1824 FaviconID replaced_id; |
| 1825 if (AddOrUpdateIconMapping(*i, id, icon_type, &replaced_id)) { | 1825 if (AddOrUpdateIconMapping(*i, id, icon_type, &replaced_id)) { |
| 1826 // The page's favicon ID changed. This means that the one we just | 1826 // The page's favicon ID changed. This means that the one we just |
| 1827 // changed from could have been orphaned, and we need to re-check it. | 1827 // changed from could have been orphaned, and we need to re-check it. |
| 1828 // This is not super fast, but this case will get triggered rarely, | 1828 // This is not super fast, but this case will get triggered rarely, |
| 1829 // since normally a page will always map to the same favicon ID. It | 1829 // since normally a page will always map to the same favicon ID. It |
| 1830 // will mostly happen for favicons we import. | 1830 // will mostly happen for favicons we import. |
| 1831 if (replaced_id && !thumbnail_db_->HasMappingFor(replaced_id)) | 1831 if (replaced_id && !thumbnail_db_->HasMappingFor(replaced_id)) |
| 1832 thumbnail_db_->DeleteFavIcon(replaced_id); | 1832 thumbnail_db_->DeleteFavIcon(replaced_id); |
| 1833 | 1833 |
| 1834 favicons_changed.insert(*i); | 1834 favicons_changed.insert(*i); |
| 1835 } | 1835 } |
| 1836 } | 1836 } |
| 1837 | 1837 |
| 1838 // Send the notification about the changed favicons. | 1838 // Send the notification about the changed favicons. |
| 1839 FavIconChangeDetails* changed_details = new FavIconChangeDetails; | 1839 FavIconChangeDetails* changed_details = new FavIconChangeDetails; |
| 1840 changed_details->urls.swap(favicons_changed); | 1840 changed_details->urls.swap(favicons_changed); |
| 1841 BroadcastNotifications(NotificationType::FAVICON_CHANGED, changed_details); | 1841 BroadcastNotifications(NotificationType::FAVICON_CHANGED, changed_details); |
| 1842 | 1842 |
| 1843 ScheduleCommit(); | 1843 ScheduleCommit(); |
| 1844 } | 1844 } |
| 1845 | 1845 |
| 1846 bool HistoryBackend::AddOrUpdateIconMapping(const GURL& page_url, | 1846 bool HistoryBackend::AddOrUpdateIconMapping(const GURL& page_url, |
| 1847 FavIconID id, | 1847 FaviconID id, |
| 1848 IconType icon_type, | 1848 IconType icon_type, |
| 1849 FavIconID* replaced_icon) { | 1849 FaviconID* replaced_icon) { |
| 1850 *replaced_icon = 0; | 1850 *replaced_icon = 0; |
| 1851 std::vector<IconMapping> icon_mappings; | 1851 std::vector<IconMapping> icon_mappings; |
| 1852 if (!thumbnail_db_->GetIconMappingsForPageURL(page_url, &icon_mappings)) { | 1852 if (!thumbnail_db_->GetIconMappingsForPageURL(page_url, &icon_mappings)) { |
| 1853 // There is no mapping add it directly. | 1853 // There is no mapping add it directly. |
| 1854 thumbnail_db_->AddIconMapping(page_url, id); | 1854 thumbnail_db_->AddIconMapping(page_url, id); |
| 1855 return true; | 1855 return true; |
| 1856 } | 1856 } |
| 1857 // Iterate all matched icon mappings, | 1857 // Iterate all matched icon mappings, |
| 1858 // a. If the given icon id and matched icon id are same, return. | 1858 // a. If the given icon id and matched icon id are same, return. |
| 1859 // b. If the given icon type and matched icon type are same, but icon id | 1859 // b. If the given icon type and matched icon type are same, but icon id |
| (...skipping 307 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2167 | 2167 |
| 2168 // Create the duplicate favicon table, this is where the favicons we want | 2168 // Create the duplicate favicon table, this is where the favicons we want |
| 2169 // to keep will be stored. | 2169 // to keep will be stored. |
| 2170 if (!thumbnail_db_->InitTemporaryFavIconsTable()) | 2170 if (!thumbnail_db_->InitTemporaryFavIconsTable()) |
| 2171 return false; | 2171 return false; |
| 2172 | 2172 |
| 2173 if (!thumbnail_db_->InitTemporaryIconMappingTable()) | 2173 if (!thumbnail_db_->InitTemporaryIconMappingTable()) |
| 2174 return false; | 2174 return false; |
| 2175 | 2175 |
| 2176 // This maps existing favicon IDs to the ones in the temporary table. | 2176 // This maps existing favicon IDs to the ones in the temporary table. |
| 2177 typedef std::map<FavIconID, FavIconID> FavIconMap; | 2177 typedef std::map<FaviconID, FaviconID> FavIconMap; |
| 2178 FavIconMap copied_favicons; | 2178 FavIconMap copied_favicons; |
| 2179 | 2179 |
| 2180 // Copy all unique favicons to the temporary table, and update all the | 2180 // Copy all unique favicons to the temporary table, and update all the |
| 2181 // URLs to have the new IDs. | 2181 // URLs to have the new IDs. |
| 2182 for (std::vector<URLRow>::iterator i = kept_urls->begin(); | 2182 for (std::vector<URLRow>::iterator i = kept_urls->begin(); |
| 2183 i != kept_urls->end(); ++i) { | 2183 i != kept_urls->end(); ++i) { |
| 2184 std::vector<IconMapping> icon_mappings; | 2184 std::vector<IconMapping> icon_mappings; |
| 2185 if (!thumbnail_db_->GetIconMappingsForPageURL(i->url(), &icon_mappings)) | 2185 if (!thumbnail_db_->GetIconMappingsForPageURL(i->url(), &icon_mappings)) |
| 2186 continue; | 2186 continue; |
| 2187 | 2187 |
| 2188 for (std::vector<IconMapping>::iterator m = icon_mappings.begin(); | 2188 for (std::vector<IconMapping>::iterator m = icon_mappings.begin(); |
| 2189 m != icon_mappings.end(); ++m) { | 2189 m != icon_mappings.end(); ++m) { |
| 2190 FavIconID old_id = m->icon_id; | 2190 FaviconID old_id = m->icon_id; |
| 2191 FavIconID new_id; | 2191 FaviconID new_id; |
| 2192 FavIconMap::const_iterator found = copied_favicons.find(old_id); | 2192 FavIconMap::const_iterator found = copied_favicons.find(old_id); |
| 2193 if (found == copied_favicons.end()) { | 2193 if (found == copied_favicons.end()) { |
| 2194 new_id = thumbnail_db_->CopyToTemporaryFavIconTable(old_id); | 2194 new_id = thumbnail_db_->CopyToTemporaryFavIconTable(old_id); |
| 2195 copied_favicons[old_id] = new_id; | 2195 copied_favicons[old_id] = new_id; |
| 2196 } else { | 2196 } else { |
| 2197 // We already encountered a URL that used this favicon, use the ID we | 2197 // We already encountered a URL that used this favicon, use the ID we |
| 2198 // previously got. | 2198 // previously got. |
| 2199 new_id = found->second; | 2199 new_id = found->second; |
| 2200 } | 2200 } |
| 2201 // Add Icon mapping, and we don't care wheteher it suceeded or not. | 2201 // Add Icon mapping, and we don't care wheteher it suceeded or not. |
| (...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2255 return true; | 2255 return true; |
| 2256 } | 2256 } |
| 2257 | 2257 |
| 2258 BookmarkService* HistoryBackend::GetBookmarkService() { | 2258 BookmarkService* HistoryBackend::GetBookmarkService() { |
| 2259 if (bookmark_service_) | 2259 if (bookmark_service_) |
| 2260 bookmark_service_->BlockTillLoaded(); | 2260 bookmark_service_->BlockTillLoaded(); |
| 2261 return bookmark_service_; | 2261 return bookmark_service_; |
| 2262 } | 2262 } |
| 2263 | 2263 |
| 2264 } // namespace history | 2264 } // namespace history |
| OLD | NEW |