summaryrefslogtreecommitdiffstats
path: root/chrome/browser/history
diff options
context:
space:
mode:
authornshkrob@chromium.org <nshkrob@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-06-14 16:55:40 +0000
committernshkrob@chromium.org <nshkrob@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-06-14 16:55:40 +0000
commitba545ceadf4c6653cad4926cb97bad774f777cbc (patch)
treed95242fbd7cbc0347d798dd9d94362754507babe /chrome/browser/history
parent039693ab6904a8c36bb3808fadbc2022ab7b4935 (diff)
downloadchromium_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.cc70
-rw-r--r--chrome/browser/history/top_sites.h24
-rw-r--r--chrome/browser/history/top_sites_database.cc51
-rw-r--r--chrome/browser/history/top_sites_database.h20
-rw-r--r--chrome/browser/history/top_sites_unittest.cc78
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());
}