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 "components/history/core/browser/history_backend.h" | 5 #include "components/history/core/browser/history_backend.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 #include <functional> | 8 #include <functional> |
9 #include <list> | 9 #include <list> |
10 #include <map> | 10 #include <map> |
(...skipping 1414 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1425 const std::vector<GURL>& icon_urls, | 1425 const std::vector<GURL>& icon_urls, |
1426 int icon_types, | 1426 int icon_types, |
1427 const std::vector<int>& desired_sizes, | 1427 const std::vector<int>& desired_sizes, |
1428 std::vector<favicon_base::FaviconRawBitmapResult>* bitmap_results) { | 1428 std::vector<favicon_base::FaviconRawBitmapResult>* bitmap_results) { |
1429 UpdateFaviconMappingsAndFetchImpl(nullptr, icon_urls, icon_types, | 1429 UpdateFaviconMappingsAndFetchImpl(nullptr, icon_urls, icon_types, |
1430 desired_sizes, bitmap_results); | 1430 desired_sizes, bitmap_results); |
1431 } | 1431 } |
1432 | 1432 |
1433 void HistoryBackend::GetLargestFaviconForURL( | 1433 void HistoryBackend::GetLargestFaviconForURL( |
1434 const GURL& page_url, | 1434 const GURL& page_url, |
1435 const std::vector<int>& icon_types, | |
1436 int minimum_size_in_pixels, | |
1437 favicon_base::FaviconRawBitmapResult* favicon_bitmap_result) { | 1435 favicon_base::FaviconRawBitmapResult* favicon_bitmap_result) { |
1438 DCHECK(favicon_bitmap_result); | 1436 DCHECK(favicon_bitmap_result); |
1439 | 1437 |
1440 if (!db_ || !thumbnail_db_) | 1438 if (!db_ || !thumbnail_db_) |
1441 return; | 1439 return; |
1442 | 1440 |
1443 TimeTicks beginning_time = TimeTicks::Now(); | 1441 TimeTicks beginning_time = TimeTicks::Now(); |
1444 | 1442 |
1445 std::vector<IconMapping> icon_mappings; | 1443 std::vector<IconMapping> icon_mappings; |
1446 if (!thumbnail_db_->GetIconMappingsForPageURL(page_url, &icon_mappings) || | 1444 if (!thumbnail_db_->GetIconMappingsForPageURL(page_url, &icon_mappings) || |
1447 icon_mappings.empty()) | 1445 icon_mappings.empty()) |
1448 return; | 1446 return; |
1449 | 1447 |
1450 int required_icon_types = 0; | 1448 // Find the largest bitmap. |
1451 for (std::vector<int>::const_iterator i = icon_types.begin(); | 1449 FaviconBitmap largest_icon; |
1452 i != icon_types.end(); ++i) { | |
1453 required_icon_types |= *i; | |
1454 } | |
1455 | |
1456 // Find the largest bitmap for each IconType placing in | |
1457 // |largest_favicon_bitmaps|. | |
1458 std::map<favicon_base::IconType, FaviconBitmap> largest_favicon_bitmaps; | |
1459 for (std::vector<IconMapping>::const_iterator i = icon_mappings.begin(); | 1450 for (std::vector<IconMapping>::const_iterator i = icon_mappings.begin(); |
1460 i != icon_mappings.end(); ++i) { | 1451 i != icon_mappings.end(); ++i) { |
1461 if (!(i->icon_type & required_icon_types)) | |
1462 continue; | |
1463 std::vector<FaviconBitmapIDSize> bitmap_id_sizes; | 1452 std::vector<FaviconBitmapIDSize> bitmap_id_sizes; |
1464 thumbnail_db_->GetFaviconBitmapIDSizes(i->icon_id, &bitmap_id_sizes); | 1453 thumbnail_db_->GetFaviconBitmapIDSizes(i->icon_id, &bitmap_id_sizes); |
1465 FaviconBitmap& largest = largest_favicon_bitmaps[i->icon_type]; | |
1466 for (std::vector<FaviconBitmapIDSize>::const_iterator j = | 1454 for (std::vector<FaviconBitmapIDSize>::const_iterator j = |
1467 bitmap_id_sizes.begin(); | 1455 bitmap_id_sizes.begin(); |
1468 j != bitmap_id_sizes.end(); ++j) { | 1456 j != bitmap_id_sizes.end(); ++j) { |
1469 if (largest.bitmap_id == 0 || | 1457 if (largest_icon.bitmap_id == 0 || |
1470 (largest.pixel_size.width() < j->pixel_size.width() && | 1458 (largest_icon.pixel_size.width() < j->pixel_size.width() && |
1471 largest.pixel_size.height() < j->pixel_size.height())) { | 1459 largest_icon.pixel_size.height() < j->pixel_size.height())) { |
1472 largest.icon_id = i->icon_id; | 1460 largest_icon.icon_id = i->icon_id; |
1473 largest.bitmap_id = j->bitmap_id; | 1461 largest_icon.bitmap_id = j->bitmap_id; |
1474 largest.pixel_size = j->pixel_size; | 1462 largest_icon.pixel_size = j->pixel_size; |
1475 } | 1463 } |
1476 } | 1464 } |
1477 } | 1465 } |
1478 if (largest_favicon_bitmaps.empty()) | 1466 if (largest_icon.bitmap_id == 0) |
1479 return; | 1467 return; |
1480 | 1468 |
1481 // Find an icon which is larger than minimum_size_in_pixels in the order of | |
1482 // icon_types. | |
1483 FaviconBitmap largest_icon; | |
1484 for (std::vector<int>::const_iterator t = icon_types.begin(); | |
1485 t != icon_types.end(); ++t) { | |
1486 for (std::map<favicon_base::IconType, FaviconBitmap>::const_iterator f = | |
1487 largest_favicon_bitmaps.begin(); | |
1488 f != largest_favicon_bitmaps.end(); ++f) { | |
1489 if (f->first & *t && | |
1490 (largest_icon.bitmap_id == 0 || | |
1491 (largest_icon.pixel_size.height() < f->second.pixel_size.height() && | |
1492 largest_icon.pixel_size.width() < f->second.pixel_size.width()))) { | |
1493 largest_icon = f->second; | |
1494 } | |
1495 } | |
1496 if (largest_icon.pixel_size.width() > minimum_size_in_pixels && | |
1497 largest_icon.pixel_size.height() > minimum_size_in_pixels) | |
1498 break; | |
1499 } | |
1500 | |
1501 GURL icon_url; | 1469 GURL icon_url; |
1502 favicon_base::IconType icon_type; | 1470 favicon_base::IconType icon_type; |
1503 if (!thumbnail_db_->GetFaviconHeader(largest_icon.icon_id, &icon_url, | 1471 if (!thumbnail_db_->GetFaviconHeader(largest_icon.icon_id, &icon_url, |
1504 &icon_type)) { | 1472 &icon_type)) { |
1505 return; | 1473 return; |
1506 } | 1474 } |
1507 | 1475 |
1508 base::Time last_updated; | 1476 base::Time last_updated; |
1509 favicon_base::FaviconRawBitmapResult bitmap_result; | 1477 favicon_base::FaviconRawBitmapResult bitmap_result; |
1510 bitmap_result.icon_url = icon_url; | 1478 bitmap_result.icon_url = icon_url; |
(...skipping 1149 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2660 // transaction is currently open. | 2628 // transaction is currently open. |
2661 db_->CommitTransaction(); | 2629 db_->CommitTransaction(); |
2662 db_->Vacuum(); | 2630 db_->Vacuum(); |
2663 db_->BeginTransaction(); | 2631 db_->BeginTransaction(); |
2664 db_->GetStartDate(&first_recorded_time_); | 2632 db_->GetStartDate(&first_recorded_time_); |
2665 | 2633 |
2666 return true; | 2634 return true; |
2667 } | 2635 } |
2668 | 2636 |
2669 } // namespace history | 2637 } // namespace history |
OLD | NEW |