| 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 <algorithm> | 5 #include <algorithm> |
| 6 #include <set> | 6 #include <set> |
| 7 #include <vector> | 7 #include <vector> |
| 8 | 8 |
| 9 #include "base/basictypes.h" | 9 #include "base/basictypes.h" |
| 10 #include "base/bind.h" | 10 #include "base/bind.h" |
| 11 #include "base/bind_helpers.h" | 11 #include "base/bind_helpers.h" |
| 12 #include "base/command_line.h" | 12 #include "base/command_line.h" |
| 13 #include "base/file_util.h" | 13 #include "base/file_util.h" |
| 14 #include "base/files/file_path.h" | 14 #include "base/files/file_path.h" |
| 15 #include "base/memory/ref_counted.h" | 15 #include "base/memory/ref_counted.h" |
| 16 #include "base/memory/scoped_ptr.h" | 16 #include "base/memory/scoped_ptr.h" |
| 17 #include "base/path_service.h" | 17 #include "base/path_service.h" |
| 18 #include "base/string16.h" | 18 #include "base/string16.h" |
| 19 #include "base/strings/string_number_conversions.h" | 19 #include "base/strings/string_number_conversions.h" |
| 20 #include "base/utf_string_conversions.h" | 20 #include "base/utf_string_conversions.h" |
| 21 #include "chrome/browser/bookmarks/bookmark_model.h" | 21 #include "chrome/browser/bookmarks/bookmark_model.h" |
| 22 #include "chrome/browser/bookmarks/bookmark_model_factory.h" |
| 22 #include "chrome/browser/bookmarks/bookmark_utils.h" | 23 #include "chrome/browser/bookmarks/bookmark_utils.h" |
| 24 #include "chrome/browser/favicon/favicon_changed_details.h" |
| 23 #include "chrome/browser/favicon/imported_favicon_usage.h" | 25 #include "chrome/browser/favicon/imported_favicon_usage.h" |
| 24 #include "chrome/browser/history/history_backend.h" | 26 #include "chrome/browser/history/history_backend.h" |
| 25 #include "chrome/browser/history/history_notifications.h" | 27 #include "chrome/browser/history/history_notifications.h" |
| 28 #include "chrome/browser/history/history_service.h" |
| 29 #include "chrome/browser/history/history_service_factory.h" |
| 26 #include "chrome/browser/history/in_memory_database.h" | 30 #include "chrome/browser/history/in_memory_database.h" |
| 27 #include "chrome/browser/history/in_memory_history_backend.h" | 31 #include "chrome/browser/history/in_memory_history_backend.h" |
| 28 #include "chrome/browser/history/visit_filter.h" | 32 #include "chrome/browser/history/visit_filter.h" |
| 29 #include "chrome/common/chrome_constants.h" | 33 #include "chrome/common/chrome_constants.h" |
| 30 #include "chrome/common/chrome_paths.h" | 34 #include "chrome/common/chrome_paths.h" |
| 31 #include "chrome/common/chrome_switches.h" | 35 #include "chrome/common/chrome_switches.h" |
| 32 #include "chrome/common/thumbnail_score.h" | 36 #include "chrome/common/thumbnail_score.h" |
| 37 #include "chrome/test/base/testing_profile.h" |
| 38 #include "chrome/test/base/ui_test_utils.h" |
| 33 #include "chrome/tools/profiles/thumbnail-inl.h" | 39 #include "chrome/tools/profiles/thumbnail-inl.h" |
| 34 #include "content/public/browser/notification_details.h" | 40 #include "content/public/browser/notification_details.h" |
| 35 #include "content/public/browser/notification_source.h" | 41 #include "content/public/browser/notification_source.h" |
| 42 #include "content/public/test/test_browser_thread.h" |
| 36 #include "googleurl/src/gurl.h" | 43 #include "googleurl/src/gurl.h" |
| 37 #include "testing/gtest/include/gtest/gtest.h" | 44 #include "testing/gtest/include/gtest/gtest.h" |
| 38 #include "third_party/skia/include/core/SkBitmap.h" | 45 #include "third_party/skia/include/core/SkBitmap.h" |
| 39 #include "ui/gfx/codec/jpeg_codec.h" | 46 #include "ui/gfx/codec/jpeg_codec.h" |
| 40 #include "ui/gfx/image/image.h" | 47 #include "ui/gfx/image/image.h" |
| 41 | 48 |
| 42 using base::Time; | 49 using base::Time; |
| 43 using base::TimeDelta; | 50 using base::TimeDelta; |
| 44 | 51 |
| 45 // This file only tests functionality where it is most convenient to call the | 52 // This file only tests functionality where it is most convenient to call the |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 78 // This must be a separate object since HistoryBackend manages its lifetime. | 85 // This must be a separate object since HistoryBackend manages its lifetime. |
| 79 // This just forwards the messages we're interested in to the test object. | 86 // This just forwards the messages we're interested in to the test object. |
| 80 class HistoryBackendTestDelegate : public HistoryBackend::Delegate { | 87 class HistoryBackendTestDelegate : public HistoryBackend::Delegate { |
| 81 public: | 88 public: |
| 82 explicit HistoryBackendTestDelegate(HistoryBackendTest* test) : test_(test) {} | 89 explicit HistoryBackendTestDelegate(HistoryBackendTest* test) : test_(test) {} |
| 83 | 90 |
| 84 virtual void NotifyProfileError(int backend_id, | 91 virtual void NotifyProfileError(int backend_id, |
| 85 sql::InitStatus init_status) OVERRIDE {} | 92 sql::InitStatus init_status) OVERRIDE {} |
| 86 virtual void SetInMemoryBackend(int backend_id, | 93 virtual void SetInMemoryBackend(int backend_id, |
| 87 InMemoryHistoryBackend* backend) OVERRIDE; | 94 InMemoryHistoryBackend* backend) OVERRIDE; |
| 95 virtual void SendFaviconChangedNotification( |
| 96 chrome::FaviconChangedDetails* details) OVERRIDE; |
| 88 virtual void BroadcastNotifications(int type, | 97 virtual void BroadcastNotifications(int type, |
| 89 HistoryDetails* details) OVERRIDE; | 98 HistoryDetails* details) OVERRIDE; |
| 90 virtual void DBLoaded(int backend_id) OVERRIDE; | 99 virtual void DBLoaded(int backend_id) OVERRIDE; |
| 91 virtual void StartTopSitesMigration(int backend_id) OVERRIDE; | 100 virtual void StartTopSitesMigration(int backend_id) OVERRIDE; |
| 92 virtual void NotifyVisitDBObserversOnAddVisit( | 101 virtual void NotifyVisitDBObserversOnAddVisit( |
| 93 const BriefVisitInfo& info) OVERRIDE {} | 102 const BriefVisitInfo& info) OVERRIDE {} |
| 94 | 103 |
| 95 private: | 104 private: |
| 96 // Not owned by us. | 105 // Not owned by us. |
| 97 HistoryBackendTest* test_; | 106 HistoryBackendTest* test_; |
| (...skipping 13 matching lines...) Expand all Loading... |
| 111 AddRequest(request, this); | 120 AddRequest(request, this); |
| 112 return request->handle(); | 121 return request->handle(); |
| 113 } | 122 } |
| 114 }; | 123 }; |
| 115 | 124 |
| 116 class HistoryBackendTest : public testing::Test { | 125 class HistoryBackendTest : public testing::Test { |
| 117 public: | 126 public: |
| 118 HistoryBackendTest() | 127 HistoryBackendTest() |
| 119 : bookmark_model_(NULL), | 128 : bookmark_model_(NULL), |
| 120 loaded_(false), | 129 loaded_(false), |
| 121 num_broadcasted_notifications_(0) { | 130 num_favicon_notifications_(0), |
| 131 num_broadcasted_notifications_(0), |
| 132 ui_thread_(content::BrowserThread::UI, &message_loop_) { |
| 122 } | 133 } |
| 123 | 134 |
| 124 virtual ~HistoryBackendTest() { | 135 virtual ~HistoryBackendTest() { |
| 125 } | 136 } |
| 126 | 137 |
| 127 // Callback for QueryMostVisited. | 138 // Callback for QueryMostVisited. |
| 128 void OnQueryMostVisited(CancelableRequestProvider::Handle handle, | 139 void OnQueryMostVisited(CancelableRequestProvider::Handle handle, |
| 129 history::MostVisitedURLList data) { | 140 history::MostVisitedURLList data) { |
| 130 most_visited_list_.swap(data); | 141 most_visited_list_.swap(data); |
| 131 } | 142 } |
| 132 | 143 |
| 133 // Callback for QueryFiltered. | 144 // Callback for QueryFiltered. |
| 134 void OnQueryFiltered(CancelableRequestProvider::Handle handle, | 145 void OnQueryFiltered(CancelableRequestProvider::Handle handle, |
| 135 const history::FilteredURLList& data) { | 146 const history::FilteredURLList& data) { |
| 136 filtered_list_ = data; | 147 filtered_list_ = data; |
| 137 } | 148 } |
| 138 | 149 |
| 139 const history::MostVisitedURLList& get_most_visited_list() const { | 150 const history::MostVisitedURLList& get_most_visited_list() const { |
| 140 return most_visited_list_; | 151 return most_visited_list_; |
| 141 } | 152 } |
| 142 | 153 |
| 143 const history::FilteredURLList& get_filtered_list() const { | 154 const history::FilteredURLList& get_filtered_list() const { |
| 144 return filtered_list_; | 155 return filtered_list_; |
| 145 } | 156 } |
| 146 | 157 |
| 158 int num_favicon_notifications() const { return num_favicon_notifications_; } |
| 159 |
| 147 int num_broadcasted_notifications() const { | 160 int num_broadcasted_notifications() const { |
| 148 return num_broadcasted_notifications_; | 161 return num_broadcasted_notifications_; |
| 149 } | 162 } |
| 150 | 163 |
| 151 protected: | 164 protected: |
| 152 scoped_refptr<HistoryBackend> backend_; // Will be NULL on init failure. | 165 scoped_refptr<HistoryBackend> backend_; // Will be NULL on init failure. |
| 153 scoped_ptr<InMemoryHistoryBackend> mem_backend_; | 166 scoped_ptr<InMemoryHistoryBackend> mem_backend_; |
| 154 | 167 |
| 155 void AddRedirectChain(const char* sequence[], int page_id) { | 168 void AddRedirectChain(const char* sequence[], int page_id) { |
| 156 AddRedirectChainWithTransitionAndTime(sequence, page_id, | 169 AddRedirectChainWithTransitionAndTime(sequence, page_id, |
| (...skipping 227 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 384 backend_->Closing(); | 397 backend_->Closing(); |
| 385 backend_ = NULL; | 398 backend_ = NULL; |
| 386 mem_backend_.reset(); | 399 mem_backend_.reset(); |
| 387 file_util::Delete(test_dir_, true); | 400 file_util::Delete(test_dir_, true); |
| 388 } | 401 } |
| 389 | 402 |
| 390 void SetInMemoryBackend(int backend_id, InMemoryHistoryBackend* backend) { | 403 void SetInMemoryBackend(int backend_id, InMemoryHistoryBackend* backend) { |
| 391 mem_backend_.reset(backend); | 404 mem_backend_.reset(backend); |
| 392 } | 405 } |
| 393 | 406 |
| 407 void SendFaviconChangedNotification(chrome::FaviconChangedDetails* details) { |
| 408 ++num_favicon_notifications_; |
| 409 // The backend passes ownership of the details pointer to us. |
| 410 delete details; |
| 411 } |
| 412 |
| 394 void BroadcastNotifications(int type, | 413 void BroadcastNotifications(int type, |
| 395 HistoryDetails* details) { | 414 HistoryDetails* details) { |
| 396 ++num_broadcasted_notifications_; | 415 ++num_broadcasted_notifications_; |
| 397 | 416 |
| 398 // Send the notifications directly to the in-memory database. | 417 // Send the notifications directly to the in-memory database. |
| 399 content::Details<HistoryDetails> det(details); | 418 content::Details<HistoryDetails> det(details); |
| 400 mem_backend_->Observe(type, content::Source<HistoryBackendTest>(NULL), det); | 419 mem_backend_->Observe(type, content::Source<HistoryBackendTest>(NULL), det); |
| 401 | 420 |
| 402 // The backend passes ownership of the details pointer to us. | 421 // The backend passes ownership of the details pointer to us. |
| 403 delete details; | 422 delete details; |
| 404 } | 423 } |
| 405 | 424 |
| 425 // The number of chrome::NOTIFICATION_FAVICON_CHANGED notifications that were |
| 426 // dispatched. |
| 427 int num_favicon_notifications_; |
| 428 |
| 406 // The number of notifications which were broadcasted. | 429 // The number of notifications which were broadcasted. |
| 407 int num_broadcasted_notifications_; | 430 int num_broadcasted_notifications_; |
| 408 | 431 |
| 409 MessageLoop message_loop_; | 432 MessageLoop message_loop_; |
| 433 content::TestBrowserThread ui_thread_; |
| 410 base::FilePath test_dir_; | 434 base::FilePath test_dir_; |
| 411 history::MostVisitedURLList most_visited_list_; | 435 history::MostVisitedURLList most_visited_list_; |
| 412 history::FilteredURLList filtered_list_; | 436 history::FilteredURLList filtered_list_; |
| 413 }; | 437 }; |
| 414 | 438 |
| 415 void HistoryBackendTestDelegate::SetInMemoryBackend(int backend_id, | 439 void HistoryBackendTestDelegate::SetInMemoryBackend(int backend_id, |
| 416 InMemoryHistoryBackend* backend) { | 440 InMemoryHistoryBackend* backend) { |
| 417 test_->SetInMemoryBackend(backend_id, backend); | 441 test_->SetInMemoryBackend(backend_id, backend); |
| 418 } | 442 } |
| 419 | 443 |
| 444 void HistoryBackendTestDelegate::SendFaviconChangedNotification( |
| 445 chrome::FaviconChangedDetails* details) { |
| 446 test_->SendFaviconChangedNotification(details); |
| 447 } |
| 448 |
| 420 void HistoryBackendTestDelegate::BroadcastNotifications( | 449 void HistoryBackendTestDelegate::BroadcastNotifications( |
| 421 int type, | 450 int type, |
| 422 HistoryDetails* details) { | 451 HistoryDetails* details) { |
| 423 test_->BroadcastNotifications(type, details); | 452 test_->BroadcastNotifications(type, details); |
| 424 } | 453 } |
| 425 | 454 |
| 426 void HistoryBackendTestDelegate::DBLoaded(int backend_id) { | 455 void HistoryBackendTestDelegate::DBLoaded(int backend_id) { |
| 427 test_->loaded_ = true; | 456 test_->loaded_ = true; |
| 428 } | 457 } |
| 429 | 458 |
| (...skipping 1039 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1469 favicon_bitmap_data.clear(); | 1498 favicon_bitmap_data.clear(); |
| 1470 backend_->SetFavicons(page_url, chrome::FAVICON, favicon_bitmap_data); | 1499 backend_->SetFavicons(page_url, chrome::FAVICON, favicon_bitmap_data); |
| 1471 | 1500 |
| 1472 EXPECT_FALSE(backend_->thumbnail_db_->GetFaviconBitmap(large_bitmap_id, NULL, | 1501 EXPECT_FALSE(backend_->thumbnail_db_->GetFaviconBitmap(large_bitmap_id, NULL, |
| 1473 NULL, NULL)); | 1502 NULL, NULL)); |
| 1474 icon_mappings.clear(); | 1503 icon_mappings.clear(); |
| 1475 EXPECT_FALSE(backend_->thumbnail_db_->GetIconMappingsForPageURL(page_url, | 1504 EXPECT_FALSE(backend_->thumbnail_db_->GetIconMappingsForPageURL(page_url, |
| 1476 &icon_mappings)); | 1505 &icon_mappings)); |
| 1477 | 1506 |
| 1478 // Notifications should have been broadcast for each call to SetFavicons(). | 1507 // Notifications should have been broadcast for each call to SetFavicons(). |
| 1479 EXPECT_EQ(3, num_broadcasted_notifications()); | 1508 EXPECT_EQ(3, num_favicon_notifications()); |
| 1480 } | 1509 } |
| 1481 | 1510 |
| 1482 // Test updating a single favicon bitmap's data via SetFavicons. | 1511 // Test updating a single favicon bitmap's data via SetFavicons. |
| 1483 TEST_F(HistoryBackendTest, SetFaviconsReplaceBitmapData) { | 1512 TEST_F(HistoryBackendTest, SetFaviconsReplaceBitmapData) { |
| 1484 const GURL page_url("http://www.google.com/"); | 1513 const GURL page_url("http://www.google.com/"); |
| 1485 const GURL icon_url("http://www.google.com/icon"); | 1514 const GURL icon_url("http://www.google.com/icon"); |
| 1486 | 1515 |
| 1487 std::vector<unsigned char> data_initial; | 1516 std::vector<unsigned char> data_initial; |
| 1488 data_initial.push_back('a'); | 1517 data_initial.push_back('a'); |
| 1489 | 1518 |
| (...skipping 10 matching lines...) Expand all Loading... |
| 1500 | 1529 |
| 1501 chrome::FaviconID original_favicon_id = | 1530 chrome::FaviconID original_favicon_id = |
| 1502 backend_->thumbnail_db_->GetFaviconIDForFaviconURL( | 1531 backend_->thumbnail_db_->GetFaviconIDForFaviconURL( |
| 1503 icon_url, chrome::FAVICON, NULL); | 1532 icon_url, chrome::FAVICON, NULL); |
| 1504 EXPECT_NE(0, original_favicon_id); | 1533 EXPECT_NE(0, original_favicon_id); |
| 1505 FaviconBitmap original_favicon_bitmap; | 1534 FaviconBitmap original_favicon_bitmap; |
| 1506 EXPECT_TRUE( | 1535 EXPECT_TRUE( |
| 1507 GetOnlyFaviconBitmap(original_favicon_id, &original_favicon_bitmap)); | 1536 GetOnlyFaviconBitmap(original_favicon_id, &original_favicon_bitmap)); |
| 1508 EXPECT_TRUE(BitmapDataEqual('a', original_favicon_bitmap.bitmap_data)); | 1537 EXPECT_TRUE(BitmapDataEqual('a', original_favicon_bitmap.bitmap_data)); |
| 1509 | 1538 |
| 1510 EXPECT_EQ(1, num_broadcasted_notifications()); | 1539 EXPECT_EQ(1, num_favicon_notifications()); |
| 1511 | 1540 |
| 1512 // Call SetFavicons() with completely identical data. | 1541 // Call SetFavicons() with completely identical data. |
| 1513 std::vector<unsigned char> updated_data; | 1542 std::vector<unsigned char> updated_data; |
| 1514 updated_data.push_back('a'); | 1543 updated_data.push_back('a'); |
| 1515 favicon_bitmap_data[0].bitmap_data = new base::RefCountedBytes(updated_data); | 1544 favicon_bitmap_data[0].bitmap_data = new base::RefCountedBytes(updated_data); |
| 1516 backend_->SetFavicons(page_url, chrome::FAVICON, favicon_bitmap_data); | 1545 backend_->SetFavicons(page_url, chrome::FAVICON, favicon_bitmap_data); |
| 1517 | 1546 |
| 1518 chrome::FaviconID updated_favicon_id = | 1547 chrome::FaviconID updated_favicon_id = |
| 1519 backend_->thumbnail_db_->GetFaviconIDForFaviconURL( | 1548 backend_->thumbnail_db_->GetFaviconIDForFaviconURL( |
| 1520 icon_url, chrome::FAVICON, NULL); | 1549 icon_url, chrome::FAVICON, NULL); |
| 1521 EXPECT_NE(0, updated_favicon_id); | 1550 EXPECT_NE(0, updated_favicon_id); |
| 1522 FaviconBitmap updated_favicon_bitmap; | 1551 FaviconBitmap updated_favicon_bitmap; |
| 1523 EXPECT_TRUE( | 1552 EXPECT_TRUE( |
| 1524 GetOnlyFaviconBitmap(updated_favicon_id, &updated_favicon_bitmap)); | 1553 GetOnlyFaviconBitmap(updated_favicon_id, &updated_favicon_bitmap)); |
| 1525 EXPECT_TRUE(BitmapDataEqual('a', updated_favicon_bitmap.bitmap_data)); | 1554 EXPECT_TRUE(BitmapDataEqual('a', updated_favicon_bitmap.bitmap_data)); |
| 1526 | 1555 |
| 1527 // Because the bitmap data is byte equivalent, no notifications should have | 1556 // Because the bitmap data is byte equivalent, no notifications should have |
| 1528 // been broadcasted. | 1557 // been broadcasted. |
| 1529 EXPECT_EQ(1, num_broadcasted_notifications()); | 1558 EXPECT_EQ(1, num_favicon_notifications()); |
| 1530 | 1559 |
| 1531 // Call SetFavicons() with identical data but a different bitmap. | 1560 // Call SetFavicons() with identical data but a different bitmap. |
| 1532 updated_data[0] = 'b'; | 1561 updated_data[0] = 'b'; |
| 1533 favicon_bitmap_data[0].bitmap_data = new base::RefCountedBytes(updated_data); | 1562 favicon_bitmap_data[0].bitmap_data = new base::RefCountedBytes(updated_data); |
| 1534 backend_->SetFavicons(page_url, chrome::FAVICON, favicon_bitmap_data); | 1563 backend_->SetFavicons(page_url, chrome::FAVICON, favicon_bitmap_data); |
| 1535 | 1564 |
| 1536 updated_favicon_id = | 1565 updated_favicon_id = |
| 1537 backend_->thumbnail_db_->GetFaviconIDForFaviconURL( | 1566 backend_->thumbnail_db_->GetFaviconIDForFaviconURL( |
| 1538 icon_url, chrome::FAVICON, NULL); | 1567 icon_url, chrome::FAVICON, NULL); |
| 1539 EXPECT_NE(0, updated_favicon_id); | 1568 EXPECT_NE(0, updated_favicon_id); |
| 1540 EXPECT_TRUE( | 1569 EXPECT_TRUE( |
| 1541 GetOnlyFaviconBitmap(updated_favicon_id, &updated_favicon_bitmap)); | 1570 GetOnlyFaviconBitmap(updated_favicon_id, &updated_favicon_bitmap)); |
| 1542 EXPECT_TRUE(BitmapDataEqual('b', updated_favicon_bitmap.bitmap_data)); | 1571 EXPECT_TRUE(BitmapDataEqual('b', updated_favicon_bitmap.bitmap_data)); |
| 1543 | 1572 |
| 1544 // There should be no churn in FaviconIDs or FaviconBitmapIds even though | 1573 // There should be no churn in FaviconIDs or FaviconBitmapIds even though |
| 1545 // the bitmap data changed. | 1574 // the bitmap data changed. |
| 1546 EXPECT_EQ(original_favicon_bitmap.icon_id, updated_favicon_bitmap.icon_id); | 1575 EXPECT_EQ(original_favicon_bitmap.icon_id, updated_favicon_bitmap.icon_id); |
| 1547 EXPECT_EQ(original_favicon_bitmap.bitmap_id, | 1576 EXPECT_EQ(original_favicon_bitmap.bitmap_id, |
| 1548 updated_favicon_bitmap.bitmap_id); | 1577 updated_favicon_bitmap.bitmap_id); |
| 1549 | 1578 |
| 1550 // A notification should have been broadcasted as the favicon bitmap data has | 1579 // A notification should have been broadcasted as the favicon bitmap data has |
| 1551 // changed. | 1580 // changed. |
| 1552 EXPECT_EQ(2, num_broadcasted_notifications()); | 1581 EXPECT_EQ(2, num_favicon_notifications()); |
| 1553 } | 1582 } |
| 1554 | 1583 |
| 1555 // Test that if two pages share the same FaviconID, changing the favicon for | 1584 // Test that if two pages share the same FaviconID, changing the favicon for |
| 1556 // one page does not affect the other. | 1585 // one page does not affect the other. |
| 1557 TEST_F(HistoryBackendTest, SetFaviconsSameFaviconURLForTwoPages) { | 1586 TEST_F(HistoryBackendTest, SetFaviconsSameFaviconURLForTwoPages) { |
| 1558 GURL icon_url("http://www.google.com/favicon.ico"); | 1587 GURL icon_url("http://www.google.com/favicon.ico"); |
| 1559 GURL icon_url_new("http://www.google.com/favicon2.ico"); | 1588 GURL icon_url_new("http://www.google.com/favicon2.ico"); |
| 1560 GURL page_url1("http://www.google.com"); | 1589 GURL page_url1("http://www.google.com"); |
| 1561 GURL page_url2("http://www.google.ca"); | 1590 GURL page_url2("http://www.google.ca"); |
| 1562 | 1591 |
| (...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1614 EXPECT_EQ(1u, icon_mappings.size()); | 1643 EXPECT_EQ(1u, icon_mappings.size()); |
| 1615 EXPECT_EQ(favicon_id, icon_mappings[0].icon_id); | 1644 EXPECT_EQ(favicon_id, icon_mappings[0].icon_id); |
| 1616 | 1645 |
| 1617 favicon_bitmaps.clear(); | 1646 favicon_bitmaps.clear(); |
| 1618 EXPECT_TRUE(backend_->thumbnail_db_->GetFaviconBitmaps(favicon_id, | 1647 EXPECT_TRUE(backend_->thumbnail_db_->GetFaviconBitmaps(favicon_id, |
| 1619 &favicon_bitmaps)); | 1648 &favicon_bitmaps)); |
| 1620 EXPECT_EQ(2u, favicon_bitmaps.size()); | 1649 EXPECT_EQ(2u, favicon_bitmaps.size()); |
| 1621 | 1650 |
| 1622 // A notification should have been broadcast for each call to SetFavicons() | 1651 // A notification should have been broadcast for each call to SetFavicons() |
| 1623 // and each call to UpdateFaviconMappingsAndFetch(). | 1652 // and each call to UpdateFaviconMappingsAndFetch(). |
| 1624 EXPECT_EQ(3, num_broadcasted_notifications()); | 1653 EXPECT_EQ(3, num_favicon_notifications()); |
| 1625 } | 1654 } |
| 1626 | 1655 |
| 1627 // Test that no notifications are broadcast as a result of calling | 1656 // Test that no notifications are broadcast as a result of calling |
| 1628 // UpdateFaviconMappingsAndFetch() for an icon URL which is already | 1657 // UpdateFaviconMappingsAndFetch() for an icon URL which is already |
| 1629 // mapped to the passed in page URL. | 1658 // mapped to the passed in page URL. |
| 1630 TEST_F(HistoryBackendTest, UpdateFaviconMappingsAndFetchNoChange) { | 1659 TEST_F(HistoryBackendTest, UpdateFaviconMappingsAndFetchNoChange) { |
| 1631 GURL page_url("http://www.google.com"); | 1660 GURL page_url("http://www.google.com"); |
| 1632 GURL icon_url("http://www.google.com/favicon.ico"); | 1661 GURL icon_url("http://www.google.com/favicon.ico"); |
| 1633 std::vector<chrome::FaviconBitmapData> favicon_bitmap_data; | 1662 std::vector<chrome::FaviconBitmapData> favicon_bitmap_data; |
| 1634 GenerateFaviconBitmapData(icon_url, GetSizesSmall(), &favicon_bitmap_data); | 1663 GenerateFaviconBitmapData(icon_url, GetSizesSmall(), &favicon_bitmap_data); |
| 1635 | 1664 |
| 1636 backend_->SetFavicons(page_url, chrome::FAVICON, favicon_bitmap_data); | 1665 backend_->SetFavicons(page_url, chrome::FAVICON, favicon_bitmap_data); |
| 1637 | 1666 |
| 1638 chrome::FaviconID icon_id = | 1667 chrome::FaviconID icon_id = |
| 1639 backend_->thumbnail_db_->GetFaviconIDForFaviconURL( | 1668 backend_->thumbnail_db_->GetFaviconIDForFaviconURL( |
| 1640 icon_url, chrome::FAVICON, NULL); | 1669 icon_url, chrome::FAVICON, NULL); |
| 1641 EXPECT_NE(0, icon_id); | 1670 EXPECT_NE(0, icon_id); |
| 1642 EXPECT_EQ(1, num_broadcasted_notifications()); | 1671 EXPECT_EQ(1, num_favicon_notifications()); |
| 1643 | 1672 |
| 1644 std::vector<GURL> icon_urls; | 1673 std::vector<GURL> icon_urls; |
| 1645 icon_urls.push_back(icon_url); | 1674 icon_urls.push_back(icon_url); |
| 1646 | 1675 |
| 1647 std::vector<chrome::FaviconBitmapResult> bitmap_results; | 1676 std::vector<chrome::FaviconBitmapResult> bitmap_results; |
| 1648 backend_->UpdateFaviconMappingsAndFetch( | 1677 backend_->UpdateFaviconMappingsAndFetch( |
| 1649 page_url, icon_urls, chrome::FAVICON, kSmallSize.width(), | 1678 page_url, icon_urls, chrome::FAVICON, kSmallSize.width(), |
| 1650 GetScaleFactors1x2x(), &bitmap_results); | 1679 GetScaleFactors1x2x(), &bitmap_results); |
| 1651 | 1680 |
| 1652 EXPECT_EQ(icon_id, backend_->thumbnail_db_->GetFaviconIDForFaviconURL( | 1681 EXPECT_EQ(icon_id, backend_->thumbnail_db_->GetFaviconIDForFaviconURL( |
| 1653 icon_url, chrome::FAVICON, NULL)); | 1682 icon_url, chrome::FAVICON, NULL)); |
| 1654 | 1683 |
| 1655 // No notification should have been broadcast as no icon mapping, favicon, | 1684 // No notification should have been broadcast as no icon mapping, favicon, |
| 1656 // or favicon bitmap was updated, added or removed. | 1685 // or favicon bitmap was updated, added or removed. |
| 1657 EXPECT_EQ(1, num_broadcasted_notifications()); | 1686 EXPECT_EQ(1, num_favicon_notifications()); |
| 1658 } | 1687 } |
| 1659 | 1688 |
| 1660 // Test repeatedly calling MergeFavicon(). |page_url| is initially not known | 1689 // Test repeatedly calling MergeFavicon(). |page_url| is initially not known |
| 1661 // to the database. | 1690 // to the database. |
| 1662 TEST_F(HistoryBackendTest, MergeFaviconPageURLNotInDB) { | 1691 TEST_F(HistoryBackendTest, MergeFaviconPageURLNotInDB) { |
| 1663 GURL page_url("http://www.google.com"); | 1692 GURL page_url("http://www.google.com"); |
| 1664 GURL icon_url("http:/www.google.com/favicon.ico"); | 1693 GURL icon_url("http:/www.google.com/favicon.ico"); |
| 1665 | 1694 |
| 1666 std::vector<unsigned char> data; | 1695 std::vector<unsigned char> data; |
| 1667 data.push_back('a'); | 1696 data.push_back('a'); |
| (...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1722 &icon_mappings)); | 1751 &icon_mappings)); |
| 1723 EXPECT_EQ(1u, icon_mappings.size()); | 1752 EXPECT_EQ(1u, icon_mappings.size()); |
| 1724 EXPECT_EQ(icon_url1, icon_mappings[0].icon_url); | 1753 EXPECT_EQ(icon_url1, icon_mappings[0].icon_url); |
| 1725 | 1754 |
| 1726 FaviconBitmap favicon_bitmap; | 1755 FaviconBitmap favicon_bitmap; |
| 1727 EXPECT_TRUE(GetOnlyFaviconBitmap(icon_mappings[0].icon_id, &favicon_bitmap)); | 1756 EXPECT_TRUE(GetOnlyFaviconBitmap(icon_mappings[0].icon_id, &favicon_bitmap)); |
| 1728 EXPECT_NE(base::Time(), favicon_bitmap.last_updated); | 1757 EXPECT_NE(base::Time(), favicon_bitmap.last_updated); |
| 1729 EXPECT_TRUE(BitmapDataEqual('a', favicon_bitmap.bitmap_data)); | 1758 EXPECT_TRUE(BitmapDataEqual('a', favicon_bitmap.bitmap_data)); |
| 1730 EXPECT_EQ(kSmallSize, favicon_bitmap.pixel_size); | 1759 EXPECT_EQ(kSmallSize, favicon_bitmap.pixel_size); |
| 1731 | 1760 |
| 1732 EXPECT_EQ(1, num_broadcasted_notifications()); | 1761 EXPECT_EQ(1, num_favicon_notifications()); |
| 1733 | 1762 |
| 1734 // 1) Merge identical favicon bitmap. | 1763 // 1) Merge identical favicon bitmap. |
| 1735 std::vector<unsigned char> data; | 1764 std::vector<unsigned char> data; |
| 1736 data.push_back('a'); | 1765 data.push_back('a'); |
| 1737 scoped_refptr<base::RefCountedBytes> bitmap_data( | 1766 scoped_refptr<base::RefCountedBytes> bitmap_data( |
| 1738 new base::RefCountedBytes(data)); | 1767 new base::RefCountedBytes(data)); |
| 1739 backend_->MergeFavicon( | 1768 backend_->MergeFavicon( |
| 1740 page_url, icon_url1, chrome::FAVICON, bitmap_data, kSmallSize); | 1769 page_url, icon_url1, chrome::FAVICON, bitmap_data, kSmallSize); |
| 1741 | 1770 |
| 1742 // All the data should stay the same and no notifications should have been | 1771 // All the data should stay the same and no notifications should have been |
| 1743 // sent. | 1772 // sent. |
| 1744 icon_mappings.clear(); | 1773 icon_mappings.clear(); |
| 1745 EXPECT_TRUE(backend_->thumbnail_db_->GetIconMappingsForPageURL(page_url, | 1774 EXPECT_TRUE(backend_->thumbnail_db_->GetIconMappingsForPageURL(page_url, |
| 1746 &icon_mappings)); | 1775 &icon_mappings)); |
| 1747 EXPECT_EQ(1u, icon_mappings.size()); | 1776 EXPECT_EQ(1u, icon_mappings.size()); |
| 1748 EXPECT_EQ(icon_url1, icon_mappings[0].icon_url); | 1777 EXPECT_EQ(icon_url1, icon_mappings[0].icon_url); |
| 1749 | 1778 |
| 1750 EXPECT_TRUE(GetOnlyFaviconBitmap(icon_mappings[0].icon_id, &favicon_bitmap)); | 1779 EXPECT_TRUE(GetOnlyFaviconBitmap(icon_mappings[0].icon_id, &favicon_bitmap)); |
| 1751 EXPECT_NE(base::Time(), favicon_bitmap.last_updated); | 1780 EXPECT_NE(base::Time(), favicon_bitmap.last_updated); |
| 1752 EXPECT_TRUE(BitmapDataEqual('a', favicon_bitmap.bitmap_data)); | 1781 EXPECT_TRUE(BitmapDataEqual('a', favicon_bitmap.bitmap_data)); |
| 1753 EXPECT_EQ(kSmallSize, favicon_bitmap.pixel_size); | 1782 EXPECT_EQ(kSmallSize, favicon_bitmap.pixel_size); |
| 1754 | 1783 |
| 1755 EXPECT_EQ(1, num_broadcasted_notifications()); | 1784 EXPECT_EQ(1, num_favicon_notifications()); |
| 1756 | 1785 |
| 1757 // 2) Merge favicon bitmap of the same size. | 1786 // 2) Merge favicon bitmap of the same size. |
| 1758 data[0] = 'b'; | 1787 data[0] = 'b'; |
| 1759 bitmap_data = new base::RefCountedBytes(data); | 1788 bitmap_data = new base::RefCountedBytes(data); |
| 1760 backend_->MergeFavicon( | 1789 backend_->MergeFavicon( |
| 1761 page_url, icon_url1, chrome::FAVICON, bitmap_data, kSmallSize); | 1790 page_url, icon_url1, chrome::FAVICON, bitmap_data, kSmallSize); |
| 1762 | 1791 |
| 1763 // The small favicon bitmap at |icon_url1| should be overwritten. | 1792 // The small favicon bitmap at |icon_url1| should be overwritten. |
| 1764 icon_mappings.clear(); | 1793 icon_mappings.clear(); |
| 1765 EXPECT_TRUE(backend_->thumbnail_db_->GetIconMappingsForPageURL(page_url, | 1794 EXPECT_TRUE(backend_->thumbnail_db_->GetIconMappingsForPageURL(page_url, |
| (...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1819 EXPECT_TRUE(BitmapDataEqual('c', favicon_bitmaps[0].bitmap_data)); | 1848 EXPECT_TRUE(BitmapDataEqual('c', favicon_bitmaps[0].bitmap_data)); |
| 1820 EXPECT_EQ(kTinySize, favicon_bitmaps[0].pixel_size); | 1849 EXPECT_EQ(kTinySize, favicon_bitmaps[0].pixel_size); |
| 1821 // The favicon being merged should take precedence over the preexisting | 1850 // The favicon being merged should take precedence over the preexisting |
| 1822 // favicon bitmaps. | 1851 // favicon bitmaps. |
| 1823 EXPECT_NE(base::Time(), favicon_bitmaps[1].last_updated); | 1852 EXPECT_NE(base::Time(), favicon_bitmaps[1].last_updated); |
| 1824 EXPECT_TRUE(BitmapDataEqual('d', favicon_bitmaps[1].bitmap_data)); | 1853 EXPECT_TRUE(BitmapDataEqual('d', favicon_bitmaps[1].bitmap_data)); |
| 1825 EXPECT_EQ(kSmallSize, favicon_bitmaps[1].pixel_size); | 1854 EXPECT_EQ(kSmallSize, favicon_bitmaps[1].pixel_size); |
| 1826 | 1855 |
| 1827 // A notification should have been broadcast for each call to SetFavicons() | 1856 // A notification should have been broadcast for each call to SetFavicons() |
| 1828 // and MergeFavicon(). | 1857 // and MergeFavicon(). |
| 1829 EXPECT_EQ(4, num_broadcasted_notifications()); | 1858 EXPECT_EQ(4, num_favicon_notifications()); |
| 1830 } | 1859 } |
| 1831 | 1860 |
| 1832 // Test calling MergeFavicon() when |icon_url| is known to the database but not | 1861 // Test calling MergeFavicon() when |icon_url| is known to the database but not |
| 1833 // mapped to |page_url|. | 1862 // mapped to |page_url|. |
| 1834 TEST_F(HistoryBackendTest, MergeFaviconIconURLMappedToDifferentPageURL) { | 1863 TEST_F(HistoryBackendTest, MergeFaviconIconURLMappedToDifferentPageURL) { |
| 1835 GURL page_url1("http://www.google.com"); | 1864 GURL page_url1("http://www.google.com"); |
| 1836 GURL page_url2("http://news.google.com"); | 1865 GURL page_url2("http://news.google.com"); |
| 1837 GURL page_url3("http://maps.google.com"); | 1866 GURL page_url3("http://maps.google.com"); |
| 1838 GURL icon_url("http:/www.google.com/favicon.ico"); | 1867 GURL icon_url("http:/www.google.com/favicon.ico"); |
| 1839 | 1868 |
| (...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1904 EXPECT_EQ(favicon_id, icon_mappings[0].icon_id); | 1933 EXPECT_EQ(favicon_id, icon_mappings[0].icon_id); |
| 1905 | 1934 |
| 1906 icon_mappings.clear(); | 1935 icon_mappings.clear(); |
| 1907 EXPECT_TRUE(backend_->thumbnail_db_->GetIconMappingsForPageURL(page_url3, | 1936 EXPECT_TRUE(backend_->thumbnail_db_->GetIconMappingsForPageURL(page_url3, |
| 1908 &icon_mappings)); | 1937 &icon_mappings)); |
| 1909 EXPECT_EQ(1u, icon_mappings.size()); | 1938 EXPECT_EQ(1u, icon_mappings.size()); |
| 1910 EXPECT_EQ(favicon_id, icon_mappings[0].icon_id); | 1939 EXPECT_EQ(favicon_id, icon_mappings[0].icon_id); |
| 1911 | 1940 |
| 1912 // A notification should have been broadcast for each call to SetFavicons() | 1941 // A notification should have been broadcast for each call to SetFavicons() |
| 1913 // and MergeFavicon(). | 1942 // and MergeFavicon(). |
| 1914 EXPECT_EQ(3, num_broadcasted_notifications()); | 1943 EXPECT_EQ(3, num_favicon_notifications()); |
| 1915 } | 1944 } |
| 1916 | 1945 |
| 1917 // Test that MergeFavicon() does not add more than | 1946 // Test that MergeFavicon() does not add more than |
| 1918 // |kMaxFaviconBitmapsPerIconURL| to a favicon. | 1947 // |kMaxFaviconBitmapsPerIconURL| to a favicon. |
| 1919 TEST_F(HistoryBackendTest, MergeFaviconMaxFaviconBitmapsPerIconURL) { | 1948 TEST_F(HistoryBackendTest, MergeFaviconMaxFaviconBitmapsPerIconURL) { |
| 1920 GURL page_url("http://www.google.com"); | 1949 GURL page_url("http://www.google.com"); |
| 1921 std::string icon_url_string("http://www.google.com/favicon.ico"); | 1950 std::string icon_url_string("http://www.google.com/favicon.ico"); |
| 1922 size_t replace_index = icon_url_string.size() - 1; | 1951 size_t replace_index = icon_url_string.size() - 1; |
| 1923 | 1952 |
| 1924 std::vector<unsigned char> data; | 1953 std::vector<unsigned char> data; |
| (...skipping 849 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2774 ASSERT_EQ(2u, data.size()); | 2803 ASSERT_EQ(2u, data.size()); |
| 2775 EXPECT_EQ(url2.spec(), data[0]->GetURL().spec()); | 2804 EXPECT_EQ(url2.spec(), data[0]->GetURL().spec()); |
| 2776 EXPECT_EQ(url2_id, data[0]->GetID()); | 2805 EXPECT_EQ(url2_id, data[0]->GetID()); |
| 2777 EXPECT_EQ(segment2_time_delta.InHours(), data[0]->duration().InHours()); | 2806 EXPECT_EQ(segment2_time_delta.InHours(), data[0]->duration().InHours()); |
| 2778 | 2807 |
| 2779 EXPECT_EQ(url1.spec(), data[1]->GetURL().spec()); | 2808 EXPECT_EQ(url1.spec(), data[1]->GetURL().spec()); |
| 2780 EXPECT_EQ(url1_id, data[1]->GetID()); | 2809 EXPECT_EQ(url1_id, data[1]->GetID()); |
| 2781 EXPECT_EQ(segment1_time_delta.InHours(), data[1]->duration().InHours()); | 2810 EXPECT_EQ(segment1_time_delta.InHours(), data[1]->duration().InHours()); |
| 2782 } | 2811 } |
| 2783 | 2812 |
| 2813 // Simple test that removes a bookmark. This test exercises the code paths in |
| 2814 // History that block till bookmark bar model is loaded. |
| 2815 TEST_F(HistoryBackendTest, RemoveNotification) { |
| 2816 scoped_ptr<TestingProfile> profile(new TestingProfile()); |
| 2817 profile->CreateHistoryService(false, false); |
| 2818 profile->CreateBookmarkModel(true); |
| 2819 |
| 2820 BookmarkModel* model = BookmarkModelFactory::GetForProfile(profile.get()); |
| 2821 ui_test_utils::WaitForBookmarkModelToLoad(model); |
| 2822 |
| 2823 // Add a URL. |
| 2824 GURL url("http://www.google.com"); |
| 2825 bookmark_utils::AddIfNotBookmarked(model, url, string16()); |
| 2826 |
| 2827 HistoryService* service = HistoryServiceFactory::GetForProfile( |
| 2828 profile.get(), Profile::EXPLICIT_ACCESS); |
| 2829 service->AddPage(url, |
| 2830 base::Time::Now(), |
| 2831 NULL, |
| 2832 1, |
| 2833 GURL(), |
| 2834 RedirectList(), |
| 2835 content::PAGE_TRANSITION_TYPED, |
| 2836 SOURCE_BROWSED, |
| 2837 false); |
| 2838 |
| 2839 // This won't actually delete the URL, rather it'll empty out the visits. |
| 2840 // This triggers blocking on the BookmarkModel. |
| 2841 service->DeleteURL(url); |
| 2842 } |
| 2843 |
| 2784 } // namespace history | 2844 } // namespace history |
| OLD | NEW |