#include <vector>
-#include "base/file_util.h"
#include "base/files/file_path.h"
+#include "base/files/file_util.h"
#include "base/files/scoped_temp_dir.h"
#include "base/memory/ref_counted.h"
#include "base/strings/stringprintf.h"
#include "base/strings/utf_string_conversions.h"
#include "chrome/browser/bookmarks/bookmark_model_factory.h"
#include "chrome/browser/chrome_notification_types.h"
-#include "chrome/browser/favicon/favicon_changed_details.h"
#include "chrome/browser/history/android/android_time.h"
#include "chrome/browser/history/chrome_history_client.h"
#include "chrome/browser/history/chrome_history_client_factory.h"
#include "content/public/test/test_browser_thread.h"
#include "content/public/test/test_utils.h"
#include "testing/gtest/include/gtest/gtest.h"
+#include "third_party/skia/include/core/SkBitmap.h"
using base::Time;
using base::TimeDelta;
favicon_base::FaviconID favicon_id_;
};
+// Creates a 16x16 bitmap.
+SkBitmap CreateBitmap() {
+ SkBitmap bitmap;
+ bitmap.allocN32Pixels(16, 16);
+ bitmap.eraseColor(SK_ColorBLUE);
+ return bitmap;
+}
+
} // namespace
class AndroidProviderBackendDelegate : public HistoryBackend::Delegate {
virtual void NotifyProfileError(sql::InitStatus init_status) OVERRIDE {}
virtual void SetInMemoryBackend(
scoped_ptr<InMemoryHistoryBackend> backend) OVERRIDE {}
+ virtual void NotifyFaviconChanged(const std::set<GURL>& url) OVERRIDE {
+ favicon_changed_.reset(new std::set<GURL>(url.begin(), url.end()));
+ }
virtual void BroadcastNotifications(
int type,
scoped_ptr<HistoryDetails> details) OVERRIDE {
deleted_details_.reset(
static_cast<URLsDeletedDetails*>(details.release()));
break;
- case chrome::NOTIFICATION_FAVICON_CHANGED:
- favicon_details_.reset(
- static_cast<FaviconChangedDetails*>(details.release()));
- break;
case chrome::NOTIFICATION_HISTORY_URLS_MODIFIED:
modified_details_.reset(
static_cast<URLsModifiedDetails*>(details.release()));
return modified_details_.get();
}
- FaviconChangedDetails* favicon_details() const {
- return favicon_details_.get();
- }
+ std::set<GURL>* favicon_changed() const { return favicon_changed_.get(); }
void ResetDetails() {
deleted_details_.reset();
modified_details_.reset();
- favicon_details_.reset();
+ favicon_changed_.reset();
}
private:
scoped_ptr<URLsDeletedDetails> deleted_details_;
scoped_ptr<URLsModifiedDetails> modified_details_;
- scoped_ptr<FaviconChangedDetails> favicon_details_;
+ scoped_ptr<std::set<GURL> > favicon_changed_;
DISALLOW_COPY_AND_ASSIGN(AndroidProviderBackendDelegate);
};
std::vector<VisitInfo> visits1;
Time last_visited1 = Time::Now() - TimeDelta::FromDays(1);
Time created1 = last_visited1 - TimeDelta::FromDays(20);
- visits1.push_back(VisitInfo(created1, content::PAGE_TRANSITION_LINK));
+ visits1.push_back(VisitInfo(created1, ui::PAGE_TRANSITION_LINK));
visits1.push_back(VisitInfo(last_visited1 - TimeDelta::FromDays(1),
- content::PAGE_TRANSITION_LINK));
- visits1.push_back(VisitInfo(last_visited1, content::PAGE_TRANSITION_LINK));
+ ui::PAGE_TRANSITION_LINK));
+ visits1.push_back(VisitInfo(last_visited1, ui::PAGE_TRANSITION_LINK));
GURL url2("http://www.example.com");
URLID url_id2 = 0;
std::vector<VisitInfo> visits2;
Time last_visited2 = Time::Now();
Time created2 = last_visited2 - TimeDelta::FromDays(10);
- visits2.push_back(VisitInfo(created2, content::PAGE_TRANSITION_LINK));
+ visits2.push_back(VisitInfo(created2, ui::PAGE_TRANSITION_LINK));
visits2.push_back(VisitInfo(last_visited2 - TimeDelta::FromDays(5),
- content::PAGE_TRANSITION_LINK));
- visits2.push_back(VisitInfo(last_visited2, content::PAGE_TRANSITION_LINK));
+ ui::PAGE_TRANSITION_LINK));
+ visits2.push_back(VisitInfo(last_visited2, ui::PAGE_TRANSITION_LINK));
// Add a bookmark which is not in the history.
GURL url3("http://www.bookmark.com");
url_id2 = url_row.id();
// Set favicon to url2.
- std::vector<unsigned char> data;
- data.push_back('1');
- favicon_base::FaviconRawBitmapData bitmap_data_element;
- bitmap_data_element.bitmap_data = new base::RefCountedBytes(data);
- bitmap_data_element.pixel_size = gfx::Size();
- bitmap_data_element.icon_url = GURL();
- std::vector<favicon_base::FaviconRawBitmapData> favicon_bitmap_data;
- favicon_bitmap_data.push_back(bitmap_data_element);
-
- history_backend->SetFavicons(
- url2, favicon_base::FAVICON, favicon_bitmap_data);
+ std::vector<SkBitmap> bitmaps(1u, CreateBitmap());
+ history_backend->SetFavicons(url2, favicon_base::FAVICON, GURL(), bitmaps);
history_backend->Closing();
}
std::vector<VisitInfo> visits1;
Time last_visited1 = Time::Now() - TimeDelta::FromDays(1);
Time created1 = last_visited1 - TimeDelta::FromDays(20);
- visits1.push_back(VisitInfo(created1, content::PAGE_TRANSITION_LINK));
+ visits1.push_back(VisitInfo(created1, ui::PAGE_TRANSITION_LINK));
visits1.push_back(VisitInfo(last_visited1 - TimeDelta::FromDays(1),
- content::PAGE_TRANSITION_LINK));
- visits1.push_back(VisitInfo(last_visited1, content::PAGE_TRANSITION_LINK));
+ ui::PAGE_TRANSITION_LINK));
+ visits1.push_back(VisitInfo(last_visited1, ui::PAGE_TRANSITION_LINK));
GURL url2("http://www.example.com");
std::vector<VisitInfo> visits2;
const base::string16 title2(UTF8ToUTF16("example"));
Time last_visited2 = Time::Now();
Time created2 = last_visited2 - TimeDelta::FromDays(10);
- visits2.push_back(VisitInfo(created2, content::PAGE_TRANSITION_LINK));
+ visits2.push_back(VisitInfo(created2, ui::PAGE_TRANSITION_LINK));
visits2.push_back(VisitInfo(last_visited2 - TimeDelta::FromDays(5),
- content::PAGE_TRANSITION_LINK));
- visits2.push_back(VisitInfo(last_visited2, content::PAGE_TRANSITION_LINK));
+ ui::PAGE_TRANSITION_LINK));
+ visits2.push_back(VisitInfo(last_visited2, ui::PAGE_TRANSITION_LINK));
// Only use the HistoryBackend to generate the test data.
// HistoryBackend will shutdown after that.
ASSERT_EQ(2u, history_backend->UpdateURLs(url_rows));
// Set favicon to url2.
- std::vector<unsigned char> data;
- data.push_back('1');
- favicon_base::FaviconRawBitmapData bitmap_data_element;
- bitmap_data_element.bitmap_data = new base::RefCountedBytes(data);
- bitmap_data_element.pixel_size = gfx::Size();
- bitmap_data_element.icon_url = GURL();
- std::vector<favicon_base::FaviconRawBitmapData> favicon_bitmap_data;
- favicon_bitmap_data.push_back(bitmap_data_element);
-
- history_backend->SetFavicons(
- url2, favicon_base::FAVICON, favicon_bitmap_data);
+ std::vector<SkBitmap> bitmaps(1u, CreateBitmap());
+ history_backend->SetFavicons(url2, favicon_base::FAVICON, GURL(), bitmaps);
history_backend->Closing();
}
delegate_.modified_details()->changed_urls[0].visit_count());
EXPECT_EQ(row1.title(),
delegate_.modified_details()->changed_urls[0].title());
- EXPECT_FALSE(delegate_.favicon_details());
+ EXPECT_FALSE(delegate_.favicon_changed());
content::RunAllPendingInMessageLoop();
ASSERT_EQ(1, bookmark_model_->mobile_node()->child_count());
const BookmarkNode* child = bookmark_model_->mobile_node()->GetChild(0);
delegate_.modified_details()->changed_urls[0].last_visit());
EXPECT_EQ(row2.title(),
delegate_.modified_details()->changed_urls[0].title());
- ASSERT_TRUE(delegate_.favicon_details());
- ASSERT_EQ(1u, delegate_.favicon_details()->urls.size());
- ASSERT_TRUE(delegate_.favicon_details()->urls.end() !=
- delegate_.favicon_details()->urls.find(row2.url()));
+ ASSERT_TRUE(delegate_.favicon_changed());
+ ASSERT_EQ(1u, delegate_.favicon_changed()->size());
+ ASSERT_TRUE(delegate_.favicon_changed()->end() !=
+ delegate_.favicon_changed()->find(row2.url()));
std::vector<HistoryAndBookmarkRow::ColumnID> projections;
projections.push_back(HistoryAndBookmarkRow::ID);
delegate_.deleted_details()->rows[0].last_visit());
EXPECT_EQ(row1.title(),
delegate_.deleted_details()->rows[0].title());
- EXPECT_FALSE(delegate_.favicon_details());
+ EXPECT_FALSE(delegate_.favicon_changed());
std::vector<HistoryAndBookmarkRow::ColumnID> projections;
projections.push_back(HistoryAndBookmarkRow::ID);
delegate_.deleted_details()->rows[0].last_visit());
EXPECT_EQ(row2.title(),
delegate_.deleted_details()->rows[0].title());
- ASSERT_TRUE(delegate_.favicon_details());
- ASSERT_EQ(1u, delegate_.favicon_details()->urls.size());
- ASSERT_TRUE(delegate_.favicon_details()->urls.end() !=
- delegate_.favicon_details()->urls.find(row2.url()));
+ ASSERT_TRUE(delegate_.favicon_changed());
+ ASSERT_EQ(1u, delegate_.favicon_changed()->size());
+ ASSERT_TRUE(delegate_.favicon_changed()->end() !=
+ delegate_.favicon_changed()->find(row2.url()));
ASSERT_EQ(1, deleted_count);
scoped_ptr<AndroidStatement> statement1(backend->QueryHistoryAndBookmarks(
delegate_.modified_details()->changed_urls[0].last_visit()));
EXPECT_EQ(row1.title(),
delegate_.modified_details()->changed_urls[0].title());
- EXPECT_FALSE(delegate_.favicon_details());
+ EXPECT_FALSE(delegate_.favicon_changed());
EXPECT_EQ(1, update_count);
// We shouldn't find orignal url anymore.
delegate_.modified_details()->changed_urls[0].last_visit()));
EXPECT_EQ(update_row2.visit_count(),
delegate_.modified_details()->changed_urls[0].visit_count());
- ASSERT_TRUE(delegate_.favicon_details());
- ASSERT_EQ(2u, delegate_.favicon_details()->urls.size());
- ASSERT_TRUE(delegate_.favicon_details()->urls.end() !=
- delegate_.favicon_details()->urls.find(row2.url()));
- ASSERT_TRUE(delegate_.favicon_details()->urls.end() !=
- delegate_.favicon_details()->urls.find(update_row2.url()));
+ ASSERT_TRUE(delegate_.favicon_changed());
+ ASSERT_EQ(2u, delegate_.favicon_changed()->size());
+ ASSERT_TRUE(delegate_.favicon_changed()->end() !=
+ delegate_.favicon_changed()->find(row2.url()));
+ ASSERT_TRUE(delegate_.favicon_changed()->end() !=
+ delegate_.favicon_changed()->find(update_row2.url()));
EXPECT_EQ(1, update_count);
// We shouldn't find orignal url anymore.
delegate_.modified_details()->changed_urls[0].last_visit()));
EXPECT_EQ(update_row1.visit_count(),
delegate_.modified_details()->changed_urls[0].visit_count());
- EXPECT_FALSE(delegate_.favicon_details());
+ EXPECT_FALSE(delegate_.favicon_changed());
// All visits should be removed, and 5 new visit insertted.
URLRow new_row1;
EXPECT_EQ(ToDatabaseTime(update_row1.last_visit_time()),
ToDatabaseTime(
delegate_.modified_details()->changed_urls[0].last_visit()));
- EXPECT_FALSE(delegate_.favicon_details());
+ EXPECT_FALSE(delegate_.favicon_changed());
URLRow new_row1;
ASSERT_TRUE(history_db_.GetRowForURL(row1.url(), &new_row1));
// Verify notifications.
EXPECT_FALSE(delegate_.deleted_details());
EXPECT_FALSE(delegate_.modified_details());
- ASSERT_TRUE(delegate_.favicon_details());
- ASSERT_EQ(1u, delegate_.favicon_details()->urls.size());
- ASSERT_TRUE(delegate_.favicon_details()->urls.end() !=
- delegate_.favicon_details()->urls.find(row1.url()));
+ ASSERT_TRUE(delegate_.favicon_changed());
+ ASSERT_EQ(1u, delegate_.favicon_changed()->size());
+ ASSERT_TRUE(delegate_.favicon_changed()->end() !=
+ delegate_.favicon_changed()->find(row1.url()));
std::vector<IconMapping> icon_mappings;
EXPECT_TRUE(thumbnail_db_.GetIconMappingsForPageURL(
// Verify notifications.
EXPECT_FALSE(delegate_.deleted_details());
EXPECT_FALSE(delegate_.modified_details());
- ASSERT_TRUE(delegate_.favicon_details());
- ASSERT_EQ(1u, delegate_.favicon_details()->urls.size());
- ASSERT_TRUE(delegate_.favicon_details()->urls.end() !=
- delegate_.favicon_details()->urls.find(row1.url()));
+ ASSERT_TRUE(delegate_.favicon_changed());
+ ASSERT_EQ(1u, delegate_.favicon_changed()->size());
+ ASSERT_TRUE(delegate_.favicon_changed()->end() !=
+ delegate_.favicon_changed()->find(row1.url()));
EXPECT_FALSE(thumbnail_db_.GetIconMappingsForPageURL(
row1.url(), favicon_base::FAVICON, NULL));
delegate_.modified_details()->changed_urls[0].url());
EXPECT_EQ(Time::UnixEpoch(),
delegate_.modified_details()->changed_urls[0].last_visit());
- EXPECT_EQ(1u, delegate_.favicon_details()->urls.size());
+ EXPECT_EQ(1u, delegate_.favicon_changed()->size());
}
TEST_F(AndroidProviderBackendTest, TestMultipleNestingTransaction) {
std::vector<VisitInfo> visits1;
Time last_visited1 = Time::Now() - TimeDelta::FromDays(1);
Time created1 = last_visited1 - TimeDelta::FromDays(20);
- visits1.push_back(VisitInfo(created1, content::PAGE_TRANSITION_LINK));
+ visits1.push_back(VisitInfo(created1, ui::PAGE_TRANSITION_LINK));
visits1.push_back(VisitInfo(last_visited1 - TimeDelta::FromDays(1),
- content::PAGE_TRANSITION_LINK));
- visits1.push_back(VisitInfo(last_visited1, content::PAGE_TRANSITION_LINK));
+ ui::PAGE_TRANSITION_LINK));
+ visits1.push_back(VisitInfo(last_visited1, ui::PAGE_TRANSITION_LINK));
GURL url2("http://www.example.com");
std::vector<VisitInfo> visits2;
const base::string16 title2(UTF8ToUTF16("example"));
Time last_visited2 = Time::Now();
Time created2 = last_visited2 - TimeDelta::FromDays(10);
- visits2.push_back(VisitInfo(created2, content::PAGE_TRANSITION_LINK));
+ visits2.push_back(VisitInfo(created2, ui::PAGE_TRANSITION_LINK));
visits2.push_back(VisitInfo(last_visited2 - TimeDelta::FromDays(5),
- content::PAGE_TRANSITION_LINK));
- visits2.push_back(VisitInfo(last_visited2, content::PAGE_TRANSITION_LINK));
+ ui::PAGE_TRANSITION_LINK));
+ visits2.push_back(VisitInfo(last_visited2, ui::PAGE_TRANSITION_LINK));
// Only use the HistoryBackend to generate the test data.
// HistoryBackend will shutdown after that.
ASSERT_EQ(2u, history_backend->UpdateURLs(url_rows));
// Set favicon to url2.
- std::vector<unsigned char> data;
- data.push_back('1');
- favicon_base::FaviconRawBitmapData bitmap_data_element;
- bitmap_data_element.bitmap_data = new base::RefCountedBytes(data);
- bitmap_data_element.pixel_size = gfx::Size();
- bitmap_data_element.icon_url = GURL();
- std::vector<favicon_base::FaviconRawBitmapData> favicon_bitmap_data;
- favicon_bitmap_data.push_back(bitmap_data_element);
-
- history_backend->SetFavicons(
- url2, favicon_base::FAVICON, favicon_bitmap_data);
+ std::vector<SkBitmap> bitmaps(1u, CreateBitmap());
+ history_backend->SetFavicons(url2, favicon_base::FAVICON, GURL(), bitmaps);
history_backend->Closing();
}
delegate_.modified_details()->changed_urls[0].visit_count());
EXPECT_EQ(row1.title(),
delegate_.modified_details()->changed_urls[0].title());
- EXPECT_FALSE(delegate_.favicon_details());
+ EXPECT_FALSE(delegate_.favicon_changed());
content::RunAllPendingInMessageLoop();
ASSERT_EQ(1, bookmark_model_->mobile_node()->child_count());
const BookmarkNode* child = bookmark_model_->mobile_node()->GetChild(0);
delegate_.modified_details()->changed_urls[0].title());
// Favicon details is still false because thumbnail database wasn't
// initialized, we ignore any changes of favicon.
- ASSERT_FALSE(delegate_.favicon_details());
+ ASSERT_FALSE(delegate_.favicon_changed());
}
TEST_F(AndroidProviderBackendTest, DeleteWithoutThumbnailDB) {
EXPECT_FALSE(delegate_.modified_details());
EXPECT_EQ(2u, delegate_.deleted_details()->rows.size());
// No favicon has been deleted.
- EXPECT_FALSE(delegate_.favicon_details());
+ EXPECT_FALSE(delegate_.favicon_changed());
// No row exists.
std::vector<HistoryAndBookmarkRow::ColumnID> projections;
ASSERT_TRUE(delegate_.modified_details());
ASSERT_EQ(1u, delegate_.modified_details()->changed_urls.size());
// No favicon will be updated as thumbnail database is missing.
- EXPECT_FALSE(delegate_.favicon_details());
+ EXPECT_FALSE(delegate_.favicon_changed());
}
} // namespace history