diff options
author | nshkrob@chromium.org <nshkrob@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-06-14 16:55:40 +0000 |
---|---|---|
committer | nshkrob@chromium.org <nshkrob@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-06-14 16:55:40 +0000 |
commit | ba545ceadf4c6653cad4926cb97bad774f777cbc (patch) | |
tree | d95242fbd7cbc0347d798dd9d94362754507babe /chrome/browser/history | |
parent | 039693ab6904a8c36bb3808fadbc2022ab7b4935 (diff) | |
download | chromium_src-ba545ceadf4c6653cad4926cb97bad774f777cbc.zip chromium_src-ba545ceadf4c6653cad4926cb97bad774f777cbc.tar.gz chromium_src-ba545ceadf4c6653cad4926cb97bad774f777cbc.tar.bz2 |
Move all database accesses to the DB thread.
The database now returns all urls and thumbnails in a single request.
BUG=None
TEST=TopSitesTest
Review URL: http://codereview.chromium.org/2764007
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@49692 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser/history')
-rw-r--r-- | chrome/browser/history/top_sites.cc | 70 | ||||
-rw-r--r-- | chrome/browser/history/top_sites.h | 24 | ||||
-rw-r--r-- | chrome/browser/history/top_sites_database.cc | 51 | ||||
-rw-r--r-- | chrome/browser/history/top_sites_database.h | 20 | ||||
-rw-r--r-- | chrome/browser/history/top_sites_unittest.cc | 78 |
5 files changed, 161 insertions, 82 deletions
diff --git a/chrome/browser/history/top_sites.cc b/chrome/browser/history/top_sites.cc index 84695d9..10b998fa 100644 --- a/chrome/browser/history/top_sites.cc +++ b/chrome/browser/history/top_sites.cc @@ -8,6 +8,7 @@ #include "base/file_util.h" #include "base/logging.h" +#include "chrome/browser/chrome_thread.h" #include "chrome/browser/profile.h" #include "chrome/browser/history/top_sites_database.h" #include "chrome/browser/history/history_notifications.h" @@ -40,10 +41,13 @@ TopSites::~TopSites() { void TopSites::Init(const FilePath& db_name) { db_path_ = db_name; db_.reset(new TopSitesDatabaseImpl()); - if (!db_->Init(db_name)) + if (!db_->Init(db_name)) { + NOTREACHED() << "Failed to initialize database."; return; + } - ReadDatabase(); + ChromeThread::PostTask(ChromeThread::DB, FROM_HERE, NewRunnableMethod( + this, &TopSites::ReadDatabase)); // Start the one-shot timer. timer_.Start(base::TimeDelta::FromSeconds(kUpdateIntervalSecs), this, @@ -51,20 +55,22 @@ void TopSites::Init(const FilePath& db_name) { } void TopSites::ReadDatabase() { + DCHECK(ChromeThread::CurrentlyOn(ChromeThread::DB)); + std::map<GURL, Images> thumbnails; + DCHECK(db_.get()); { AutoLock lock(lock_); - MostVisitedURLList top_urls = db_->GetTopURLs(); + MostVisitedURLList top_urls; + db_->GetPageThumbnails(&top_urls, &thumbnails); StoreMostVisited(&top_urls); } // Lock is released here. for (size_t i = 0; i < top_sites_.size(); i++) { MostVisitedURL url = top_sites_[i]; - Images thumbnail; - if (db_->GetPageThumbnail(url, &thumbnail)) { - SetPageThumbnailNoDB(url.url, thumbnail.thumbnail, - thumbnail.thumbnail_score); - } + Images thumbnail = thumbnails[url.url]; + SetPageThumbnailNoDB(url.url, thumbnail.thumbnail, + thumbnail.thumbnail_score); } } @@ -95,10 +101,20 @@ bool TopSites::SetPageThumbnail(const GURL& url, size_t index = found->second; MostVisitedURL& most_visited = top_sites_[index]; - db_->SetPageThumbnail(most_visited, index, top_images_[most_visited.url]); + ChromeThread::PostTask(ChromeThread::DB, FROM_HERE, NewRunnableMethod( + this, &TopSites::WriteThumbnailToDB, + most_visited, index, top_images_[most_visited.url])); return true; } +void TopSites::WriteThumbnailToDB(const MostVisitedURL& url, + int url_rank, + const TopSites::Images& thumbnail) { + DCHECK(db_.get()); + DCHECK(ChromeThread::CurrentlyOn(ChromeThread::DB)); + db_->SetPageThumbnail(url, url_rank, thumbnail); +} + // private bool TopSites::SetPageThumbnailNoDB(const GURL& url, const RefCountedBytes* thumbnail_data, @@ -145,15 +161,15 @@ bool TopSites::GetPageThumbnail(const GURL& url, RefCountedBytes** data) const { return true; } -void TopSites::UpdateMostVisited(MostVisitedURLList* most_visited) { - lock_.AssertAcquired(); +void TopSites::UpdateMostVisited(MostVisitedURLList most_visited) { + DCHECK(ChromeThread::CurrentlyOn(ChromeThread::DB)); // TODO(brettw) filter for blacklist! if (!top_sites_.empty()) { std::vector<size_t> added; // Indices into most_visited. std::vector<size_t> deleted; // Indices into top_sites_. std::vector<size_t> moved; // Indices into most_visited. - DiffMostVisited(top_sites_, *most_visited, &added, &deleted, &moved); + DiffMostVisited(top_sites_, most_visited, &added, &deleted, &moved); // #added == #deleted; #added + #moved = total. last_num_urls_changed_ = added.size() + moved.size(); @@ -175,16 +191,17 @@ void TopSites::UpdateMostVisited(MostVisitedURLList* most_visited) { if (db_.get()) { // Write both added and moved urls. for (size_t i = 0; i < added.size(); i++) { - MostVisitedURL added_url = (*most_visited)[added[i]]; + MostVisitedURL added_url = most_visited[added[i]]; db_->SetPageThumbnail(added_url, added[i], Images()); } for (size_t i = 0; i < moved.size(); i++) { - MostVisitedURL moved_url = (*most_visited)[moved[i]]; + MostVisitedURL moved_url = most_visited[moved[i]]; db_->SetPageThumbnail(moved_url, moved[i], Images()); } } } - StoreMostVisited(most_visited); + AutoLock lock(lock_); + StoreMostVisited(&most_visited); } void TopSites::StoreMostVisited(MostVisitedURLList* most_visited) { @@ -315,8 +332,8 @@ base::TimeDelta TopSites::GetUpdateDelay() { void TopSites::OnTopSitesAvailable( CancelableRequestProvider::Handle handle, MostVisitedURLList pages) { - AutoLock lock(lock_); - UpdateMostVisited(&pages); + ChromeThread::PostTask(ChromeThread::DB, FROM_HERE, NewRunnableMethod( + this, &TopSites::UpdateMostVisited, pages)); } void TopSites::SetMockHistoryService(MockHistoryService* mhs) { @@ -333,15 +350,20 @@ void TopSites::Observe(NotificationType type, Details<history::URLsDeletedDetails> deleted_details(details); if (deleted_details->all_history) { - db_.reset(new TopSitesDatabaseImpl()); - // TODO(nshkrob): delete file in background (FILE) thread. - file_util::Delete(db_path_, false); - if (!db_->Init(db_path_)) { - NOTREACHED() << "Failed to initialize database."; - return; - } + ChromeThread::PostTask(ChromeThread::DB, FROM_HERE, + NewRunnableMethod(this, &TopSites::ResetDatabase)); } StartQueryForMostVisited(); } +void TopSites::ResetDatabase() { + DCHECK(ChromeThread::CurrentlyOn(ChromeThread::DB)); + db_.reset(new TopSitesDatabaseImpl()); + file_util::Delete(db_path_, false); + if (!db_->Init(db_path_)) { + NOTREACHED() << "Failed to initialize database."; + return; + } +} + } // namespace history diff --git a/chrome/browser/history/top_sites.h b/chrome/browser/history/top_sites.h index b049ab3..cbcd7f5 100644 --- a/chrome/browser/history/top_sites.h +++ b/chrome/browser/history/top_sites.h @@ -108,8 +108,6 @@ class TopSites : public NotificationObserver, void OnTopSitesAvailable(CancelableRequestProvider::Handle handle, MostVisitedURLList data); - // Updates the top sites list and writes the difference to disk. - void UpdateMostVisited(MostVisitedURLList* most_visited); // Saves the set of the top URLs visited by this user. The 0th item is the // most popular. // DANGER! This will clear all data from the input argument. @@ -147,10 +145,6 @@ class TopSites : public NotificationObserver, std::vector<size_t>* deleted_urls, std::vector<size_t>* moved_urls); - // Reads the database from disk. Called on startup to get the last - // known top sites. - void ReadDatabase(); - // For testing with a HistoryService mock. void SetMockHistoryService(MockHistoryService* mhs); @@ -163,6 +157,24 @@ class TopSites : public NotificationObserver, // Uses num_urls_changed base::TimeDelta GetUpdateDelay(); + // The following methods must be run on the DB thread since they + // access the database. + + // Reads the database from disk. Called on startup to get the last + // known top sites. + void ReadDatabase(); + + // Write a thumbnail to database. + void WriteThumbnailToDB(const MostVisitedURL& url, + int url_rank, + const TopSites::Images& thumbnail); + + // Updates the top sites list and writes the difference to disk. + void UpdateMostVisited(MostVisitedURLList most_visited); + + // Deletes the database file, then reinitializes the database. + void ResetDatabase(); + Profile* profile_; // A mockup to use for testing. If NULL, use the real HistoryService // from the profile_. See SetMockHistoryService. diff --git a/chrome/browser/history/top_sites_database.cc b/chrome/browser/history/top_sites_database.cc index 39493f6..680abb8 100644 --- a/chrome/browser/history/top_sites_database.cc +++ b/chrome/browser/history/top_sites_database.cc @@ -46,34 +46,45 @@ bool TopSitesDatabaseImpl::InitThumbnailTable() { return true; } -MostVisitedURLList TopSitesDatabaseImpl::GetTopURLs() { - MostVisitedURLList result; - sql::Statement select_statement(db_.GetCachedStatement( +void TopSitesDatabaseImpl::GetPageThumbnails(MostVisitedURLList* urls, + std::map<GURL, + TopSites::Images>* thumbnails) { + sql::Statement statement(db_.GetCachedStatement( SQL_FROM_HERE, - "SELECT url, url_rank, title, redirects " - "FROM thumbnails ORDER BY url_rank")); + "SELECT url, url_rank, title, thumbnail, redirects, " + "boring_score, good_clipping, at_top, last_updated " + "FROM thumbnails ORDER BY url_rank ")); - if (!select_statement) { + if (!statement) { LOG(WARNING) << db_.GetErrorMessage(); - return result; + return; } - int row_count = 0; - int max_rank = -1; // -1 is for the case of empty DB. - while (select_statement.Step()) { + urls->clear(); + thumbnails->clear(); + + while (statement.Step()) { // Results are sorted by url_rank. MostVisitedURL url; - GURL gurl(select_statement.ColumnString(0)); + GURL gurl(statement.ColumnString(0)); url.url = gurl; - url.title = select_statement.ColumnString16(2); - std::string redirects = select_statement.ColumnString(3); + url.title = statement.ColumnString16(2); + std::string redirects = statement.ColumnString(4); SetRedirects(redirects, &url); - result.push_back(url); + urls->push_back(url); + + std::vector<unsigned char> data; + statement.ColumnBlobAsVector(3, &data); + TopSites::Images thumbnail; + thumbnail.thumbnail = RefCountedBytes::TakeVector(&data); + thumbnail.thumbnail_score.boring_score = statement.ColumnDouble(5); + thumbnail.thumbnail_score.good_clipping = statement.ColumnBool(6); + thumbnail.thumbnail_score.at_top = statement.ColumnBool(7); + thumbnail.thumbnail_score.time_at_snapshot = + base::Time::FromInternalValue(statement.ColumnInt64(8)); + + (*thumbnails)[gurl] = thumbnail; } - DCHECK(select_statement.Succeeded()); - DCHECK_EQ(max_rank + 1, row_count); - - return result; } // static @@ -174,7 +185,7 @@ void TopSitesDatabaseImpl::SetPageThumbnail(const MostVisitedURL& url, transaction.Commit(); } -bool TopSitesDatabaseImpl::GetPageThumbnail(const MostVisitedURL& url, +bool TopSitesDatabaseImpl::GetPageThumbnail(const GURL& url, TopSites::Images* thumbnail) { sql::Statement statement(db_.GetCachedStatement( SQL_FROM_HERE, @@ -186,7 +197,7 @@ bool TopSitesDatabaseImpl::GetPageThumbnail(const MostVisitedURL& url, return false; } - statement.BindString(0, url.url.spec()); + statement.BindString(0, url.spec()); if (!statement.Step()) return false; diff --git a/chrome/browser/history/top_sites_database.h b/chrome/browser/history/top_sites_database.h index 86b053f..dcdc5877 100644 --- a/chrome/browser/history/top_sites_database.h +++ b/chrome/browser/history/top_sites_database.h @@ -5,6 +5,7 @@ #ifndef CHROME_BROWSER_HISTORY_TOP_SITES_DATABASE_H_ #define CHROME_BROWSER_HISTORY_TOP_SITES_DATABASE_H_ +#include <map> #include <string> #include <vector> @@ -34,7 +35,9 @@ class TopSitesDatabase { } // Returns a list of all URLs currently in the table. - virtual MostVisitedURLList GetTopURLs() = 0; + virtual void GetPageThumbnails(MostVisitedURLList* urls, + std::map<GURL, + TopSites::Images>* thumbnails) = 0; // Set a thumbnail for a URL. |url_rank| is the position of the URL // in the list of TopURLs, zero-based. @@ -44,8 +47,14 @@ class TopSitesDatabase { int url_rank, const TopSites::Images& thumbnail) = 0; + // Convenience wrapper. + bool GetPageThumbnail(const MostVisitedURL& url, + TopSites::Images* thumbnail) { + return GetPageThumbnail(url.url, thumbnail); + } + // Get a thumbnail for a given page. Returns true iff we have the thumbnail. - virtual bool GetPageThumbnail(const MostVisitedURL& url, + virtual bool GetPageThumbnail(const GURL& url, TopSites::Images* thumbnail) = 0; // Remove the record for this URL. Returns true iff removed successfully. @@ -64,8 +73,9 @@ class TopSitesDatabaseImpl : public TopSitesDatabase { // Thumbnails ---------------------------------------------------------------- // Returns a list of all URLs currently in the table. - virtual MostVisitedURLList GetTopURLs(); - + // WARNING: clears both input arguments. + virtual void GetPageThumbnails(MostVisitedURLList* urls, + std::map<GURL, TopSites::Images>* thumbnails); // Set a thumbnail for a URL. |url_rank| is the position of the URL // in the list of TopURLs, zero-based. // If the URL is not in the table, add it. If it is, replace its @@ -75,7 +85,7 @@ class TopSitesDatabaseImpl : public TopSitesDatabase { const TopSites::Images& thumbnail); // Get a thumbnail for a given page. Returns true iff we have the thumbnail. - virtual bool GetPageThumbnail(const MostVisitedURL& url, + virtual bool GetPageThumbnail(const GURL& url, TopSites::Images* thumbnail); // Remove the record for this URL. Returns true iff removed successfully. diff --git a/chrome/browser/history/top_sites_unittest.cc b/chrome/browser/history/top_sites_unittest.cc index 698ac1d..7dcb1ab 100644 --- a/chrome/browser/history/top_sites_unittest.cc +++ b/chrome/browser/history/top_sites_unittest.cc @@ -133,9 +133,11 @@ class MockHistoryServiceImpl : public TopSites::MockHistoryService { // A mockup of a TopSitesDatabase used for testing TopSites. class MockTopSitesDatabaseImpl : public TopSitesDatabase { public: - virtual MostVisitedURLList GetTopURLs() { + virtual void GetPageThumbnails(MostVisitedURLList* urls, + std::map<GURL, TopSites::Images>* thumbnails) { // Return a copy of the vector. - return top_sites_list_; + *urls = top_sites_list_; + *thumbnails = thumbnails_map_; } virtual void SetPageThumbnail(const MostVisitedURL& url, int url_rank, @@ -162,10 +164,10 @@ class MockTopSitesDatabaseImpl : public TopSitesDatabase { } // Get a thumbnail for a given page. Returns true iff we have the thumbnail. - virtual bool GetPageThumbnail(const MostVisitedURL& url, + virtual bool GetPageThumbnail(const GURL& url, TopSites::Images* thumbnail) { std::map<GURL, TopSites::Images>::const_iterator found = - thumbnails_map_.find(url.url); + thumbnails_map_.find(url); if (found == thumbnails_map_.end()) return false; // No thumbnail for this URL. @@ -341,6 +343,7 @@ TEST_F(TopSitesTest, SetPageThumbnail) { } TEST_F(TopSitesTest, GetMostVisited) { + ChromeThread db_loop(ChromeThread::DB, MessageLoop::current()); GURL news("http://news.google.com/"); GURL google("http://google.com/"); @@ -350,14 +353,15 @@ TEST_F(TopSitesTest, GetMostVisited) { top_sites().SetMockHistoryService(&hs); top_sites().StartQueryForMostVisited(); - + MessageLoop::current()->RunAllPending(); MostVisitedURLList results = top_sites().GetMostVisitedURLs(); - EXPECT_EQ(2u, results.size()); + ASSERT_EQ(2u, results.size()); EXPECT_EQ(news, results[0].url); EXPECT_EQ(google, results[1].url); } TEST_F(TopSitesTest, MockDatabase) { + ChromeThread db_loop(ChromeThread::DB, MessageLoop::current()); MockTopSitesDatabaseImpl* db = new MockTopSitesDatabaseImpl; // |db| is destroyed when the top_sites is destroyed in TearDown. top_sites().db_.reset(db); @@ -378,7 +382,7 @@ TEST_F(TopSitesTest, MockDatabase) { top_sites().ReadDatabase(); MostVisitedURLList result = top_sites().GetMostVisitedURLs(); - EXPECT_EQ(1u, result.size()); + ASSERT_EQ(1u, result.size()); EXPECT_EQ(asdf_url, result[0].url); EXPECT_EQ(asdf_title, result[0].title); @@ -393,7 +397,7 @@ TEST_F(TopSitesTest, MockDatabase) { top_sites().ReadDatabase(); result = top_sites().GetMostVisitedURLs(); - EXPECT_EQ(2u, result.size()); + ASSERT_EQ(2u, result.size()); EXPECT_EQ(google_url, result[0].url); EXPECT_EQ(google_title, result[0].title); EXPECT_EQ(asdf_url, result[1].url); @@ -407,9 +411,11 @@ TEST_F(TopSitesTest, MockDatabase) { // This writes the new data to the DB. top_sites().StartQueryForMostVisited(); + MessageLoop::current()->RunAllPending(); - result = db->GetTopURLs(); - EXPECT_EQ(2u, result.size()); + std::map<GURL, TopSites::Images> thumbnails; + db->GetPageThumbnails(&result, &thumbnails); + ASSERT_EQ(2u, result.size()); EXPECT_EQ(google_title, result[0].title); EXPECT_EQ(news_title, result[1].title); } @@ -437,11 +443,13 @@ TEST_F(TopSitesTest, TopSitesDB) { db.SetPageThumbnail(url, 0, thumbnail); TopSites::Images result; - EXPECT_TRUE(db.GetPageThumbnail(url, &result)); + EXPECT_TRUE(db.GetPageThumbnail(url.url, &result)); EXPECT_EQ(thumbnail.thumbnail->data.size(), result.thumbnail->data.size()); EXPECT_TRUE(ThumbnailsAreEqual(thumbnail.thumbnail, result.thumbnail)); - MostVisitedURLList urls = db.GetTopURLs(); + MostVisitedURLList urls; + std::map<GURL, TopSites::Images> thumbnails; + db.GetPageThumbnails(&urls, &thumbnails); ASSERT_EQ(1u, urls.size()); EXPECT_EQ(asdf_url, urls[0].url); EXPECT_EQ(asdf_title, urls[0].title); @@ -451,7 +459,7 @@ TEST_F(TopSitesTest, TopSitesDB) { // Add google at rank 1 - no rank shifting. db.SetPageThumbnail(url, 1, thumbnail); - urls = db.GetTopURLs(); + db.GetPageThumbnails(&urls, &thumbnails); ASSERT_EQ(2u, urls.size()); EXPECT_EQ(asdf_url, urls[0].url); EXPECT_EQ(asdf_title, urls[0].title); @@ -463,16 +471,15 @@ TEST_F(TopSitesTest, TopSitesDB) { // Add news at rank 1 - shift google to rank 2. db.SetPageThumbnail(url, 1, thumbnail); - urls = db.GetTopURLs(); + db.GetPageThumbnails(&urls, &thumbnails); ASSERT_EQ(3u, urls.size()); EXPECT_EQ(asdf_url, urls[0].url); EXPECT_EQ(news_url, urls[1].url); EXPECT_EQ(google_url, urls[2].url); - db.GetTopURLs(); // Move news at rank 0 - shift the rest up. db.SetPageThumbnail(url, 0, thumbnail); - urls = db.GetTopURLs(); + db.GetPageThumbnails(&urls, &thumbnails); ASSERT_EQ(3u, urls.size()); EXPECT_EQ(news_url, urls[0].url); EXPECT_EQ(asdf_url, urls[1].url); @@ -480,7 +487,7 @@ TEST_F(TopSitesTest, TopSitesDB) { // Move news at rank 2 - shift the rest down. db.SetPageThumbnail(url, 2, thumbnail); - urls = db.GetTopURLs(); + db.GetPageThumbnails(&urls, &thumbnails); ASSERT_EQ(3u, urls.size()); EXPECT_EQ(asdf_url, urls[0].url); EXPECT_EQ(google_url, urls[1].url); @@ -490,7 +497,7 @@ TEST_F(TopSitesTest, TopSitesDB) { url.url = asdf_url; db.RemoveURL(url); - urls = db.GetTopURLs(); + db.GetPageThumbnails(&urls, &thumbnails); ASSERT_EQ(2u, urls.size()); EXPECT_EQ(google_url, urls[0].url); EXPECT_EQ(news_url, urls[1].url); @@ -498,6 +505,7 @@ TEST_F(TopSitesTest, TopSitesDB) { // Test TopSites with a real database. TEST_F(TopSitesTest, RealDatabase) { + ChromeThread db_loop(ChromeThread::DB, MessageLoop::current()); TopSitesDatabaseImpl* db = new TopSitesDatabaseImpl; ASSERT_TRUE(db->Init(file_name())); @@ -527,8 +535,13 @@ TEST_F(TopSitesTest, RealDatabase) { EXPECT_EQ(asdf_url, result[0].url); EXPECT_EQ(asdf_title, result[0].title); + TopSites::Images img_result; + db->GetPageThumbnail(asdf_url, &img_result); + EXPECT_TRUE(img_result.thumbnail != NULL); + EXPECT_TRUE(ThumbnailsAreEqual(random_thumbnail(), img_result.thumbnail)); + RefCountedBytes* thumbnail_result; - top_sites().GetPageThumbnail(asdf_url, &thumbnail_result); + EXPECT_TRUE(top_sites().GetPageThumbnail(asdf_url, &thumbnail_result)); EXPECT_TRUE(thumbnail_result != NULL); EXPECT_TRUE(ThumbnailsAreEqual(random_thumbnail(), thumbnail_result)); @@ -550,7 +563,7 @@ TEST_F(TopSitesTest, RealDatabase) { ASSERT_EQ(2u, result.size()); EXPECT_EQ(google1_url, result[0].url); EXPECT_EQ(google_title, result[0].title); - top_sites().GetPageThumbnail(google1_url, &thumbnail_result); + EXPECT_TRUE(top_sites().GetPageThumbnail(google1_url, &thumbnail_result)); EXPECT_TRUE(ThumbnailsAreEqual(google_thumbnail(), thumbnail_result)); ASSERT_EQ(3u, result[0].redirects.size()); EXPECT_EQ(google1_url, result[0].redirects[0]); @@ -568,8 +581,10 @@ TEST_F(TopSitesTest, RealDatabase) { // This requests data from History Service and writes it to the DB. top_sites().StartQueryForMostVisited(); + MessageLoop::current()->RunAllPending(); - result = db->GetTopURLs(); + std::map<GURL, TopSites::Images> thumbnails; + db->GetPageThumbnails(&result, &thumbnails); ASSERT_EQ(2u, result.size()); EXPECT_EQ(google_title, result[0].title); EXPECT_EQ(news_title, result[1].title); @@ -589,8 +604,11 @@ TEST_F(TopSitesTest, RealDatabase) { medium_score)); RefCountedBytes* out_1; TopSites::Images out_2; - top_sites().GetPageThumbnail(google1_url, &out_1); - db->GetPageThumbnail(url2, &out_2); + EXPECT_TRUE(top_sites().GetPageThumbnail(google1_url, &out_1)); + + MessageLoop::current()->RunAllPending(); + + db->GetPageThumbnail(url2.url, &out_2); EXPECT_TRUE(ThumbnailsAreEqual(out_1, out_2.thumbnail)); scoped_ptr<SkBitmap> google_bitmap( @@ -599,23 +617,26 @@ TEST_F(TopSitesTest, RealDatabase) { // 2. Set to google - low score. EXPECT_FALSE(top_sites().SetPageThumbnail(google1_url, - *google_bitmap, - low_score)); + *google_bitmap, + low_score)); // 3. Set to google - high score. EXPECT_TRUE(top_sites().SetPageThumbnail(google1_url, *google_bitmap, high_score)); // Check that the thumbnail was updated. - top_sites().GetPageThumbnail(google1_url, &out_1); + EXPECT_TRUE(top_sites().GetPageThumbnail(google1_url, &out_1)); EXPECT_FALSE(ThumbnailsAreEqual(out_1, out_2.thumbnail)); + MessageLoop::current()->RunAllPending(); + // Read the new thumbnail from the DB - should match what's in TopSites. - db->GetPageThumbnail(url2, &out_2); + db->GetPageThumbnail(url2.url, &out_2); EXPECT_TRUE(ThumbnailsAreEqual(out_1, out_2.thumbnail)); EXPECT_TRUE(high_score.Equals(out_2.thumbnail_score)); } TEST_F(TopSitesTest, DeleteNotifications) { + ChromeThread db_loop(ChromeThread::DB, MessageLoop::current()); GURL google1_url("http://google.com"); GURL google2_url("http://google.com/redirect"); GURL google3_url("http://www.google.com"); @@ -632,6 +653,7 @@ TEST_F(TopSitesTest, DeleteNotifications) { top_sites().SetMockHistoryService(&hs); top_sites().StartQueryForMostVisited(); + MessageLoop::current()->RunAllPending(); MostVisitedURLList result = top_sites().GetMostVisitedURLs(); ASSERT_EQ(2u, result.size()); @@ -643,6 +665,7 @@ TEST_F(TopSitesTest, DeleteNotifications) { top_sites().Observe(NotificationType::HISTORY_URLS_DELETED, Source<Profile> (&profile()), (const NotificationDetails&)details); + MessageLoop::current()->RunAllPending(); result = top_sites().GetMostVisitedURLs(); ASSERT_EQ(1u, result.size()); @@ -653,6 +676,7 @@ TEST_F(TopSitesTest, DeleteNotifications) { top_sites().Observe(NotificationType::HISTORY_URLS_DELETED, Source<Profile> (&profile()), (const NotificationDetails&)details); + MessageLoop::current()->RunAllPending(); result = top_sites().GetMostVisitedURLs(); ASSERT_EQ(0u, result.size()); } |