| 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 <functional> | 8 #include <functional> |
| 9 #include <list> | 9 #include <list> |
| 10 #include <map> | 10 #include <map> |
| (...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 125 // base::WeakPtrFactory which will handle everything automatically (like we do | 125 // base::WeakPtrFactory which will handle everything automatically (like we do |
| 126 // in ExpireHistoryBackend). | 126 // in ExpireHistoryBackend). |
| 127 class CommitLaterTask : public base::RefCounted<CommitLaterTask> { | 127 class CommitLaterTask : public base::RefCounted<CommitLaterTask> { |
| 128 public: | 128 public: |
| 129 explicit CommitLaterTask(HistoryBackend* history_backend) | 129 explicit CommitLaterTask(HistoryBackend* history_backend) |
| 130 : history_backend_(history_backend) { | 130 : history_backend_(history_backend) { |
| 131 } | 131 } |
| 132 | 132 |
| 133 // The backend will call this function if it is being destroyed so that we | 133 // The backend will call this function if it is being destroyed so that we |
| 134 // release our reference. | 134 // release our reference. |
| 135 void Cancel() { | 135 void Cancel() { history_backend_ = nullptr; } |
| 136 history_backend_ = NULL; | |
| 137 } | |
| 138 | 136 |
| 139 void RunCommit() { | 137 void RunCommit() { |
| 140 if (history_backend_.get()) | 138 if (history_backend_.get()) |
| 141 history_backend_->Commit(); | 139 history_backend_->Commit(); |
| 142 } | 140 } |
| 143 | 141 |
| 144 private: | 142 private: |
| 145 friend class base::RefCounted<CommitLaterTask>; | 143 friend class base::RefCounted<CommitLaterTask>; |
| 146 | 144 |
| 147 ~CommitLaterTask() {} | 145 ~CommitLaterTask() {} |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 180 origin_loop_->PostTask( | 178 origin_loop_->PostTask( |
| 181 FROM_HERE, | 179 FROM_HERE, |
| 182 base::Bind(&RunUnlessCanceled, | 180 base::Bind(&RunUnlessCanceled, |
| 183 base::Bind(&HistoryDBTask::DoneRunOnMainThread, | 181 base::Bind(&HistoryDBTask::DoneRunOnMainThread, |
| 184 base::Unretained(task_.get())), | 182 base::Unretained(task_.get())), |
| 185 is_canceled_)); | 183 is_canceled_)); |
| 186 } | 184 } |
| 187 | 185 |
| 188 // HistoryBackend -------------------------------------------------------------- | 186 // HistoryBackend -------------------------------------------------------------- |
| 189 | 187 |
| 190 HistoryBackend::HistoryBackend(const base::FilePath& history_dir, | 188 HistoryBackend::HistoryBackend(Delegate* delegate, |
| 191 Delegate* delegate, | |
| 192 HistoryClient* history_client) | 189 HistoryClient* history_client) |
| 193 : delegate_(delegate), | 190 : delegate_(delegate), |
| 194 history_dir_(history_dir), | |
| 195 scheduled_kill_db_(false), | 191 scheduled_kill_db_(false), |
| 196 expirer_(this, history_client), | 192 expirer_(this, history_client), |
| 197 recent_redirects_(kMaxRedirectCount), | 193 recent_redirects_(kMaxRedirectCount), |
| 198 backend_destroy_message_loop_(NULL), | 194 backend_destroy_message_loop_(nullptr), |
| 199 segment_queried_(false), | 195 segment_queried_(false), |
| 200 history_client_(history_client) { | 196 history_client_(history_client) { |
| 201 } | 197 } |
| 202 | 198 |
| 203 HistoryBackend::~HistoryBackend() { | 199 HistoryBackend::~HistoryBackend() { |
| 204 DCHECK(!scheduled_commit_.get()) << "Deleting without cleanup"; | 200 DCHECK(!scheduled_commit_.get()) << "Deleting without cleanup"; |
| 205 STLDeleteContainerPointers(queued_history_db_tasks_.begin(), | 201 STLDeleteContainerPointers(queued_history_db_tasks_.begin(), |
| 206 queued_history_db_tasks_.end()); | 202 queued_history_db_tasks_.end()); |
| 207 queued_history_db_tasks_.clear(); | 203 queued_history_db_tasks_.clear(); |
| 208 | 204 |
| (...skipping 120 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 329 // a segment for that one as well. So we end up with google.net and google.com | 325 // a segment for that one as well. So we end up with google.net and google.com |
| 330 // in the segment table, showing as 2 entries in the NTP. | 326 // in the segment table, showing as 2 entries in the NTP. |
| 331 // Note also that we should still be updating the visit count for that segment | 327 // Note also that we should still be updating the visit count for that segment |
| 332 // which we are not doing now. It should be addressed when | 328 // which we are not doing now. It should be addressed when |
| 333 // http://crbug.com/96860 is fixed. | 329 // http://crbug.com/96860 is fixed. |
| 334 if ((t == ui::PAGE_TRANSITION_TYPED || | 330 if ((t == ui::PAGE_TRANSITION_TYPED || |
| 335 t == ui::PAGE_TRANSITION_AUTO_BOOKMARK) && | 331 t == ui::PAGE_TRANSITION_AUTO_BOOKMARK) && |
| 336 (transition_type & ui::PAGE_TRANSITION_FORWARD_BACK) == 0) { | 332 (transition_type & ui::PAGE_TRANSITION_FORWARD_BACK) == 0) { |
| 337 // If so, create or get the segment. | 333 // If so, create or get the segment. |
| 338 std::string segment_name = db_->ComputeSegmentName(url); | 334 std::string segment_name = db_->ComputeSegmentName(url); |
| 339 URLID url_id = db_->GetRowForURL(url, NULL); | 335 URLID url_id = db_->GetRowForURL(url, nullptr); |
| 340 if (!url_id) | 336 if (!url_id) |
| 341 return 0; | 337 return 0; |
| 342 | 338 |
| 343 segment_id = db_->GetSegmentNamed(segment_name); | 339 segment_id = db_->GetSegmentNamed(segment_name); |
| 344 if (!segment_id) { | 340 if (!segment_id) { |
| 345 segment_id = db_->CreateSegment(url_id, segment_name); | 341 segment_id = db_->CreateSegment(url_id, segment_name); |
| 346 if (!segment_id) { | 342 if (!segment_id) { |
| 347 NOTREACHED(); | 343 NOTREACHED(); |
| 348 return 0; | 344 return 0; |
| 349 } | 345 } |
| (...skipping 226 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 576 ScheduleCommit(); | 572 ScheduleCommit(); |
| 577 } | 573 } |
| 578 | 574 |
| 579 void HistoryBackend::InitImpl( | 575 void HistoryBackend::InitImpl( |
| 580 const std::string& languages, | 576 const std::string& languages, |
| 581 const HistoryDatabaseParams& history_database_params) { | 577 const HistoryDatabaseParams& history_database_params) { |
| 582 DCHECK(!db_) << "Initializing HistoryBackend twice"; | 578 DCHECK(!db_) << "Initializing HistoryBackend twice"; |
| 583 // In the rare case where the db fails to initialize a dialog may get shown | 579 // In the rare case where the db fails to initialize a dialog may get shown |
| 584 // the blocks the caller, yet allows other messages through. For this reason | 580 // the blocks the caller, yet allows other messages through. For this reason |
| 585 // we only set db_ to the created database if creation is successful. That | 581 // we only set db_ to the created database if creation is successful. That |
| 586 // way other methods won't do anything as db_ is still NULL. | 582 // way other methods won't do anything as db_ is still null. |
| 587 | 583 |
| 588 TimeTicks beginning_time = TimeTicks::Now(); | 584 TimeTicks beginning_time = TimeTicks::Now(); |
| 589 | 585 |
| 590 // Compute the file names. | 586 // Compute the file names. |
| 591 DCHECK(history_dir_ == history_database_params.history_dir); | 587 history_dir_ = history_database_params.history_dir; |
| 592 base::FilePath history_name = | 588 base::FilePath history_name = history_dir_.Append(history::kHistoryFilename); |
| 593 history_database_params.history_dir.Append(history::kHistoryFilename); | |
| 594 base::FilePath thumbnail_name = GetFaviconsFileName(); | 589 base::FilePath thumbnail_name = GetFaviconsFileName(); |
| 595 base::FilePath archived_name = GetArchivedFileName(); | 590 base::FilePath archived_name = GetArchivedFileName(); |
| 596 | 591 |
| 597 // Delete the old index database files which are no longer used. | 592 // Delete the old index database files which are no longer used. |
| 598 DeleteFTSIndexDatabases(); | 593 DeleteFTSIndexDatabases(); |
| 599 | 594 |
| 600 // History database. | 595 // History database. |
| 601 db_.reset(new HistoryDatabase( | 596 db_.reset(new HistoryDatabase( |
| 602 history_database_params.download_interrupt_reason_none, | 597 history_database_params.download_interrupt_reason_none, |
| 603 history_database_params.download_interrupt_reason_crash)); | 598 history_database_params.download_interrupt_reason_crash)); |
| 604 | 599 |
| 605 // Unretained to avoid a ref loop with db_. | 600 // Unretained to avoid a ref loop with db_. |
| 606 db_->set_error_callback( | 601 db_->set_error_callback( |
| 607 base::Bind(&HistoryBackend::DatabaseErrorCallback, | 602 base::Bind(&HistoryBackend::DatabaseErrorCallback, |
| 608 base::Unretained(this))); | 603 base::Unretained(this))); |
| 609 | 604 |
| 610 sql::InitStatus status = db_->Init(history_name); | 605 sql::InitStatus status = db_->Init(history_name); |
| 611 switch (status) { | 606 switch (status) { |
| 612 case sql::INIT_OK: | 607 case sql::INIT_OK: |
| 613 break; | 608 break; |
| 614 case sql::INIT_FAILURE: { | 609 case sql::INIT_FAILURE: { |
| 615 // A NULL db_ will cause all calls on this object to notice this error | 610 // A null db_ will cause all calls on this object to notice this error |
| 616 // and to not continue. If the error callback scheduled killing the | 611 // and to not continue. If the error callback scheduled killing the |
| 617 // database, the task it posted has not executed yet. Try killing the | 612 // database, the task it posted has not executed yet. Try killing the |
| 618 // database now before we close it. | 613 // database now before we close it. |
| 619 bool kill_db = scheduled_kill_db_; | 614 bool kill_db = scheduled_kill_db_; |
| 620 if (kill_db) | 615 if (kill_db) |
| 621 KillHistoryDatabase(); | 616 KillHistoryDatabase(); |
| 622 UMA_HISTOGRAM_BOOLEAN("History.AttemptedToFixProfileError", kill_db); | 617 UMA_HISTOGRAM_BOOLEAN("History.AttemptedToFixProfileError", kill_db); |
| 623 delegate_->NotifyProfileError(status); | 618 delegate_->NotifyProfileError(status); |
| 624 db_.reset(); | 619 db_.reset(); |
| 625 return; | 620 return; |
| (...skipping 423 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1049 return; | 1044 return; |
| 1050 | 1045 |
| 1051 db_->DeleteAllSearchTermsForKeyword(keyword_id); | 1046 db_->DeleteAllSearchTermsForKeyword(keyword_id); |
| 1052 ScheduleCommit(); | 1047 ScheduleCommit(); |
| 1053 } | 1048 } |
| 1054 | 1049 |
| 1055 void HistoryBackend::DeleteKeywordSearchTermForURL(const GURL& url) { | 1050 void HistoryBackend::DeleteKeywordSearchTermForURL(const GURL& url) { |
| 1056 if (!db_) | 1051 if (!db_) |
| 1057 return; | 1052 return; |
| 1058 | 1053 |
| 1059 URLID url_id = db_->GetRowForURL(url, NULL); | 1054 URLID url_id = db_->GetRowForURL(url, nullptr); |
| 1060 if (!url_id) | 1055 if (!url_id) |
| 1061 return; | 1056 return; |
| 1062 db_->DeleteKeywordSearchTermForURL(url_id); | 1057 db_->DeleteKeywordSearchTermForURL(url_id); |
| 1063 | 1058 |
| 1064 if (delegate_) | 1059 if (delegate_) |
| 1065 delegate_->NotifyKeywordSearchTermDeleted(url_id); | 1060 delegate_->NotifyKeywordSearchTermDeleted(url_id); |
| 1066 | 1061 |
| 1067 ScheduleCommit(); | 1062 ScheduleCommit(); |
| 1068 } | 1063 } |
| 1069 | 1064 |
| (...skipping 182 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1252 options.begin_time <= first_recorded_time_) | 1247 options.begin_time <= first_recorded_time_) |
| 1253 result->set_reached_beginning(true); | 1248 result->set_reached_beginning(true); |
| 1254 } | 1249 } |
| 1255 | 1250 |
| 1256 void HistoryBackend::QueryRedirectsFrom(const GURL& from_url, | 1251 void HistoryBackend::QueryRedirectsFrom(const GURL& from_url, |
| 1257 RedirectList* redirects) { | 1252 RedirectList* redirects) { |
| 1258 redirects->clear(); | 1253 redirects->clear(); |
| 1259 if (!db_) | 1254 if (!db_) |
| 1260 return; | 1255 return; |
| 1261 | 1256 |
| 1262 URLID from_url_id = db_->GetRowForURL(from_url, NULL); | 1257 URLID from_url_id = db_->GetRowForURL(from_url, nullptr); |
| 1263 VisitID cur_visit = db_->GetMostRecentVisitForURL(from_url_id, NULL); | 1258 VisitID cur_visit = db_->GetMostRecentVisitForURL(from_url_id, nullptr); |
| 1264 if (!cur_visit) | 1259 if (!cur_visit) |
| 1265 return; // No visits for URL. | 1260 return; // No visits for URL. |
| 1266 | 1261 |
| 1267 GetRedirectsFromSpecificVisit(cur_visit, redirects); | 1262 GetRedirectsFromSpecificVisit(cur_visit, redirects); |
| 1268 } | 1263 } |
| 1269 | 1264 |
| 1270 void HistoryBackend::QueryRedirectsTo(const GURL& to_url, | 1265 void HistoryBackend::QueryRedirectsTo(const GURL& to_url, |
| 1271 RedirectList* redirects) { | 1266 RedirectList* redirects) { |
| 1272 redirects->clear(); | 1267 redirects->clear(); |
| 1273 if (!db_) | 1268 if (!db_) |
| 1274 return; | 1269 return; |
| 1275 | 1270 |
| 1276 URLID to_url_id = db_->GetRowForURL(to_url, NULL); | 1271 URLID to_url_id = db_->GetRowForURL(to_url, nullptr); |
| 1277 VisitID cur_visit = db_->GetMostRecentVisitForURL(to_url_id, NULL); | 1272 VisitID cur_visit = db_->GetMostRecentVisitForURL(to_url_id, nullptr); |
| 1278 if (!cur_visit) | 1273 if (!cur_visit) |
| 1279 return; // No visits for URL. | 1274 return; // No visits for URL. |
| 1280 | 1275 |
| 1281 GetRedirectsToSpecificVisit(cur_visit, redirects); | 1276 GetRedirectsToSpecificVisit(cur_visit, redirects); |
| 1282 } | 1277 } |
| 1283 | 1278 |
| 1284 void HistoryBackend::GetVisibleVisitCountToHost( | 1279 void HistoryBackend::GetVisibleVisitCountToHost( |
| 1285 const GURL& url, | 1280 const GURL& url, |
| 1286 VisibleVisitCountToHostResult* result) { | 1281 VisibleVisitCountToHostResult* result) { |
| 1287 result->count = 0; | 1282 result->count = 0; |
| (...skipping 160 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1448 } | 1443 } |
| 1449 UMA_HISTOGRAM_COUNTS("History.DeleteFTSIndexDatabases", | 1444 UMA_HISTOGRAM_COUNTS("History.DeleteFTSIndexDatabases", |
| 1450 num_databases_deleted); | 1445 num_databases_deleted); |
| 1451 } | 1446 } |
| 1452 | 1447 |
| 1453 void HistoryBackend::GetFavicons( | 1448 void HistoryBackend::GetFavicons( |
| 1454 const std::vector<GURL>& icon_urls, | 1449 const std::vector<GURL>& icon_urls, |
| 1455 int icon_types, | 1450 int icon_types, |
| 1456 const std::vector<int>& desired_sizes, | 1451 const std::vector<int>& desired_sizes, |
| 1457 std::vector<favicon_base::FaviconRawBitmapResult>* bitmap_results) { | 1452 std::vector<favicon_base::FaviconRawBitmapResult>* bitmap_results) { |
| 1458 UpdateFaviconMappingsAndFetchImpl(NULL, icon_urls, icon_types, desired_sizes, | 1453 UpdateFaviconMappingsAndFetchImpl(nullptr, icon_urls, icon_types, |
| 1459 bitmap_results); | 1454 desired_sizes, bitmap_results); |
| 1460 } | 1455 } |
| 1461 | 1456 |
| 1462 void HistoryBackend::GetLargestFaviconForURL( | 1457 void HistoryBackend::GetLargestFaviconForURL( |
| 1463 const GURL& page_url, | 1458 const GURL& page_url, |
| 1464 const std::vector<int>& icon_types, | 1459 const std::vector<int>& icon_types, |
| 1465 int minimum_size_in_pixels, | 1460 int minimum_size_in_pixels, |
| 1466 favicon_base::FaviconRawBitmapResult* favicon_bitmap_result) { | 1461 favicon_base::FaviconRawBitmapResult* favicon_bitmap_result) { |
| 1467 DCHECK(favicon_bitmap_result); | 1462 DCHECK(favicon_bitmap_result); |
| 1468 | 1463 |
| 1469 if (!db_ || !thumbnail_db_) | 1464 if (!db_ || !thumbnail_db_) |
| (...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1591 void HistoryBackend::MergeFavicon( | 1586 void HistoryBackend::MergeFavicon( |
| 1592 const GURL& page_url, | 1587 const GURL& page_url, |
| 1593 const GURL& icon_url, | 1588 const GURL& icon_url, |
| 1594 favicon_base::IconType icon_type, | 1589 favicon_base::IconType icon_type, |
| 1595 scoped_refptr<base::RefCountedMemory> bitmap_data, | 1590 scoped_refptr<base::RefCountedMemory> bitmap_data, |
| 1596 const gfx::Size& pixel_size) { | 1591 const gfx::Size& pixel_size) { |
| 1597 if (!thumbnail_db_ || !db_) | 1592 if (!thumbnail_db_ || !db_) |
| 1598 return; | 1593 return; |
| 1599 | 1594 |
| 1600 favicon_base::FaviconID favicon_id = | 1595 favicon_base::FaviconID favicon_id = |
| 1601 thumbnail_db_->GetFaviconIDForFaviconURL(icon_url, icon_type, NULL); | 1596 thumbnail_db_->GetFaviconIDForFaviconURL(icon_url, icon_type, nullptr); |
| 1602 | 1597 |
| 1603 if (!favicon_id) { | 1598 if (!favicon_id) { |
| 1604 // There is no favicon at |icon_url|, create it. | 1599 // There is no favicon at |icon_url|, create it. |
| 1605 favicon_id = thumbnail_db_->AddFavicon(icon_url, icon_type); | 1600 favicon_id = thumbnail_db_->AddFavicon(icon_url, icon_type); |
| 1606 } | 1601 } |
| 1607 | 1602 |
| 1608 std::vector<FaviconBitmapIDSize> bitmap_id_sizes; | 1603 std::vector<FaviconBitmapIDSize> bitmap_id_sizes; |
| 1609 thumbnail_db_->GetFaviconBitmapIDSizes(favicon_id, &bitmap_id_sizes); | 1604 thumbnail_db_->GetFaviconBitmapIDSizes(favicon_id, &bitmap_id_sizes); |
| 1610 | 1605 |
| 1611 // If there is already a favicon bitmap of |pixel_size| at |icon_url|, | 1606 // If there is already a favicon bitmap of |pixel_size| at |icon_url|, |
| (...skipping 124 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1736 if (!thumbnail_db_ || !db_) | 1731 if (!thumbnail_db_ || !db_) |
| 1737 return; | 1732 return; |
| 1738 | 1733 |
| 1739 DCHECK_GE(kMaxFaviconBitmapsPerIconURL, bitmaps.size()); | 1734 DCHECK_GE(kMaxFaviconBitmapsPerIconURL, bitmaps.size()); |
| 1740 | 1735 |
| 1741 // Track whether the method modifies or creates any favicon bitmaps, favicons | 1736 // Track whether the method modifies or creates any favicon bitmaps, favicons |
| 1742 // or icon mappings. | 1737 // or icon mappings. |
| 1743 bool data_modified = false; | 1738 bool data_modified = false; |
| 1744 | 1739 |
| 1745 favicon_base::FaviconID icon_id = | 1740 favicon_base::FaviconID icon_id = |
| 1746 thumbnail_db_->GetFaviconIDForFaviconURL(icon_url, icon_type, NULL); | 1741 thumbnail_db_->GetFaviconIDForFaviconURL(icon_url, icon_type, nullptr); |
| 1747 | 1742 |
| 1748 if (!icon_id) { | 1743 if (!icon_id) { |
| 1749 icon_id = thumbnail_db_->AddFavicon(icon_url, icon_type); | 1744 icon_id = thumbnail_db_->AddFavicon(icon_url, icon_type); |
| 1750 data_modified = true; | 1745 data_modified = true; |
| 1751 } | 1746 } |
| 1752 | 1747 |
| 1753 data_modified |= SetFaviconBitmaps(icon_id, bitmaps); | 1748 data_modified |= SetFaviconBitmaps(icon_id, bitmaps); |
| 1754 | 1749 |
| 1755 std::vector<favicon_base::FaviconID> icon_ids(1u, icon_id); | 1750 std::vector<favicon_base::FaviconID> icon_ids(1u, icon_id); |
| 1756 data_modified |= | 1751 data_modified |= |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1798 return; | 1793 return; |
| 1799 | 1794 |
| 1800 Time now = Time::Now(); | 1795 Time now = Time::Now(); |
| 1801 | 1796 |
| 1802 // Track all URLs that had their favicons set or updated. | 1797 // Track all URLs that had their favicons set or updated. |
| 1803 std::set<GURL> favicons_changed; | 1798 std::set<GURL> favicons_changed; |
| 1804 | 1799 |
| 1805 for (size_t i = 0; i < favicon_usage.size(); i++) { | 1800 for (size_t i = 0; i < favicon_usage.size(); i++) { |
| 1806 favicon_base::FaviconID favicon_id = | 1801 favicon_base::FaviconID favicon_id = |
| 1807 thumbnail_db_->GetFaviconIDForFaviconURL( | 1802 thumbnail_db_->GetFaviconIDForFaviconURL( |
| 1808 favicon_usage[i].favicon_url, favicon_base::FAVICON, NULL); | 1803 favicon_usage[i].favicon_url, favicon_base::FAVICON, nullptr); |
| 1809 if (!favicon_id) { | 1804 if (!favicon_id) { |
| 1810 // This favicon doesn't exist yet, so we create it using the given data. | 1805 // This favicon doesn't exist yet, so we create it using the given data. |
| 1811 // TODO(pkotwicz): Pass in real pixel size. | 1806 // TODO(pkotwicz): Pass in real pixel size. |
| 1812 favicon_id = thumbnail_db_->AddFavicon( | 1807 favicon_id = thumbnail_db_->AddFavicon( |
| 1813 favicon_usage[i].favicon_url, | 1808 favicon_usage[i].favicon_url, |
| 1814 favicon_base::FAVICON, | 1809 favicon_base::FAVICON, |
| 1815 new base::RefCountedBytes(favicon_usage[i].png_data), | 1810 new base::RefCountedBytes(favicon_usage[i].png_data), |
| 1816 now, | 1811 now, |
| 1817 gfx::Size()); | 1812 gfx::Size()); |
| 1818 } | 1813 } |
| (...skipping 14 matching lines...) Expand all Loading... |
| 1833 url_info.set_visit_count(0); | 1828 url_info.set_visit_count(0); |
| 1834 url_info.set_typed_count(0); | 1829 url_info.set_typed_count(0); |
| 1835 url_info.set_last_visit(base::Time()); | 1830 url_info.set_last_visit(base::Time()); |
| 1836 url_info.set_hidden(false); | 1831 url_info.set_hidden(false); |
| 1837 db_->AddURL(url_info); | 1832 db_->AddURL(url_info); |
| 1838 thumbnail_db_->AddIconMapping(*url, favicon_id); | 1833 thumbnail_db_->AddIconMapping(*url, favicon_id); |
| 1839 favicons_changed.insert(*url); | 1834 favicons_changed.insert(*url); |
| 1840 } | 1835 } |
| 1841 } else { | 1836 } else { |
| 1842 if (!thumbnail_db_->GetIconMappingsForPageURL( | 1837 if (!thumbnail_db_->GetIconMappingsForPageURL( |
| 1843 *url, favicon_base::FAVICON, NULL)) { | 1838 *url, favicon_base::FAVICON, nullptr)) { |
| 1844 // URL is present in history, update the favicon *only* if it is not | 1839 // URL is present in history, update the favicon *only* if it is not |
| 1845 // set already. | 1840 // set already. |
| 1846 thumbnail_db_->AddIconMapping(*url, favicon_id); | 1841 thumbnail_db_->AddIconMapping(*url, favicon_id); |
| 1847 favicons_changed.insert(*url); | 1842 favicons_changed.insert(*url); |
| 1848 } | 1843 } |
| 1849 } | 1844 } |
| 1850 } | 1845 } |
| 1851 } | 1846 } |
| 1852 | 1847 |
| 1853 if (!favicons_changed.empty()) { | 1848 if (!favicons_changed.empty()) { |
| (...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1975 return favicon_bitmaps_changed; | 1970 return favicon_bitmaps_changed; |
| 1976 } | 1971 } |
| 1977 | 1972 |
| 1978 bool HistoryBackend::IsFaviconBitmapDataEqual( | 1973 bool HistoryBackend::IsFaviconBitmapDataEqual( |
| 1979 FaviconBitmapID bitmap_id, | 1974 FaviconBitmapID bitmap_id, |
| 1980 const scoped_refptr<base::RefCountedMemory>& new_bitmap_data) { | 1975 const scoped_refptr<base::RefCountedMemory>& new_bitmap_data) { |
| 1981 if (!new_bitmap_data.get()) | 1976 if (!new_bitmap_data.get()) |
| 1982 return false; | 1977 return false; |
| 1983 | 1978 |
| 1984 scoped_refptr<base::RefCountedMemory> original_bitmap_data; | 1979 scoped_refptr<base::RefCountedMemory> original_bitmap_data; |
| 1985 thumbnail_db_->GetFaviconBitmap(bitmap_id, | 1980 thumbnail_db_->GetFaviconBitmap(bitmap_id, nullptr, &original_bitmap_data, |
| 1986 NULL, | 1981 nullptr); |
| 1987 &original_bitmap_data, | |
| 1988 NULL); | |
| 1989 return new_bitmap_data->Equals(original_bitmap_data); | 1982 return new_bitmap_data->Equals(original_bitmap_data); |
| 1990 } | 1983 } |
| 1991 | 1984 |
| 1992 bool HistoryBackend::GetFaviconsFromDB( | 1985 bool HistoryBackend::GetFaviconsFromDB( |
| 1993 const GURL& page_url, | 1986 const GURL& page_url, |
| 1994 int icon_types, | 1987 int icon_types, |
| 1995 const std::vector<int>& desired_sizes, | 1988 const std::vector<int>& desired_sizes, |
| 1996 std::vector<favicon_base::FaviconRawBitmapResult>* favicon_bitmap_results) { | 1989 std::vector<favicon_base::FaviconRawBitmapResult>* favicon_bitmap_results) { |
| 1997 DCHECK(favicon_bitmap_results); | 1990 DCHECK(favicon_bitmap_results); |
| 1998 favicon_bitmap_results->clear(); | 1991 favicon_bitmap_results->clear(); |
| (...skipping 228 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2227 scheduled_commit_ = new CommitLaterTask(this); | 2220 scheduled_commit_ = new CommitLaterTask(this); |
| 2228 base::MessageLoop::current()->PostDelayedTask( | 2221 base::MessageLoop::current()->PostDelayedTask( |
| 2229 FROM_HERE, | 2222 FROM_HERE, |
| 2230 base::Bind(&CommitLaterTask::RunCommit, scheduled_commit_.get()), | 2223 base::Bind(&CommitLaterTask::RunCommit, scheduled_commit_.get()), |
| 2231 base::TimeDelta::FromSeconds(kCommitIntervalSeconds)); | 2224 base::TimeDelta::FromSeconds(kCommitIntervalSeconds)); |
| 2232 } | 2225 } |
| 2233 | 2226 |
| 2234 void HistoryBackend::CancelScheduledCommit() { | 2227 void HistoryBackend::CancelScheduledCommit() { |
| 2235 if (scheduled_commit_.get()) { | 2228 if (scheduled_commit_.get()) { |
| 2236 scheduled_commit_->Cancel(); | 2229 scheduled_commit_->Cancel(); |
| 2237 scheduled_commit_ = NULL; | 2230 scheduled_commit_ = nullptr; |
| 2238 } | 2231 } |
| 2239 } | 2232 } |
| 2240 | 2233 |
| 2241 void HistoryBackend::ProcessDBTaskImpl() { | 2234 void HistoryBackend::ProcessDBTaskImpl() { |
| 2242 if (!db_) { | 2235 if (!db_) { |
| 2243 // db went away, release all the refs. | 2236 // db went away, release all the refs. |
| 2244 STLDeleteContainerPointers(queued_history_db_tasks_.begin(), | 2237 STLDeleteContainerPointers(queued_history_db_tasks_.begin(), |
| 2245 queued_history_db_tasks_.end()); | 2238 queued_history_db_tasks_.end()); |
| 2246 queued_history_db_tasks_.clear(); | 2239 queued_history_db_tasks_.clear(); |
| 2247 return; | 2240 return; |
| (...skipping 191 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2439 bool success = db_->Raze(); | 2432 bool success = db_->Raze(); |
| 2440 UMA_HISTOGRAM_BOOLEAN("History.KillHistoryDatabaseResult", success); | 2433 UMA_HISTOGRAM_BOOLEAN("History.KillHistoryDatabaseResult", success); |
| 2441 | 2434 |
| 2442 #if defined(OS_ANDROID) | 2435 #if defined(OS_ANDROID) |
| 2443 // Release AndroidProviderBackend before other objects. | 2436 // Release AndroidProviderBackend before other objects. |
| 2444 android_provider_backend_.reset(); | 2437 android_provider_backend_.reset(); |
| 2445 #endif | 2438 #endif |
| 2446 | 2439 |
| 2447 // The expirer keeps tabs on the active databases. Tell it about the | 2440 // The expirer keeps tabs on the active databases. Tell it about the |
| 2448 // databases which will be closed. | 2441 // databases which will be closed. |
| 2449 expirer_.SetDatabases(NULL, NULL); | 2442 expirer_.SetDatabases(nullptr, nullptr); |
| 2450 | 2443 |
| 2451 // Reopen a new transaction for |db_| for the sake of CloseAllDatabases(). | 2444 // Reopen a new transaction for |db_| for the sake of CloseAllDatabases(). |
| 2452 db_->BeginTransaction(); | 2445 db_->BeginTransaction(); |
| 2453 CloseAllDatabases(); | 2446 CloseAllDatabases(); |
| 2454 } | 2447 } |
| 2455 | 2448 |
| 2456 void HistoryBackend::ProcessDBTask( | 2449 void HistoryBackend::ProcessDBTask( |
| 2457 scoped_ptr<HistoryDBTask> task, | 2450 scoped_ptr<HistoryDBTask> task, |
| 2458 scoped_refptr<base::SingleThreadTaskRunner> origin_loop, | 2451 scoped_refptr<base::SingleThreadTaskRunner> origin_loop, |
| 2459 const base::CancelableTaskTracker::IsCanceledCallback& is_canceled) { | 2452 const base::CancelableTaskTracker::IsCanceledCallback& is_canceled) { |
| (...skipping 210 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2670 info.url_id = visit.url_id; | 2663 info.url_id = visit.url_id; |
| 2671 info.time = visit.visit_time; | 2664 info.time = visit.visit_time; |
| 2672 info.transition = visit.transition; | 2665 info.transition = visit.transition; |
| 2673 // If we don't have a delegate yet during setup or shutdown, we will drop | 2666 // If we don't have a delegate yet during setup or shutdown, we will drop |
| 2674 // these notifications. | 2667 // these notifications. |
| 2675 if (delegate_) | 2668 if (delegate_) |
| 2676 delegate_->NotifyAddVisit(info); | 2669 delegate_->NotifyAddVisit(info); |
| 2677 } | 2670 } |
| 2678 | 2671 |
| 2679 } // namespace history | 2672 } // namespace history |
| OLD | NEW |