Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(207)

Side by Side Diff: chrome/browser/history/thumbnail_database.cc

Issue 10802066: Adds support for saving favicon size into history database. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 8 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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 "chrome/browser/history/thumbnail_database.h" 5 #include "chrome/browser/history/thumbnail_database.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <string> 8 #include <string>
9 9
10 #include "base/command_line.h" 10 #include "base/command_line.h"
11 #include "base/file_util.h" 11 #include "base/file_util.h"
12 #include "base/memory/ref_counted_memory.h" 12 #include "base/memory/ref_counted_memory.h"
13 #include "base/string_util.h" 13 #include "base/string_util.h"
14 #include "base/time.h" 14 #include "base/time.h"
15 #include "base/utf_string_conversions.h" 15 #include "base/utf_string_conversions.h"
16 #include "chrome/browser/diagnostics/sqlite_diagnostics.h" 16 #include "chrome/browser/diagnostics/sqlite_diagnostics.h"
17 #include "chrome/browser/history/history_publisher.h" 17 #include "chrome/browser/history/history_publisher.h"
18 #include "chrome/browser/history/top_sites.h" 18 #include "chrome/browser/history/top_sites.h"
19 #include "chrome/browser/history/url_database.h" 19 #include "chrome/browser/history/url_database.h"
20 #include "chrome/common/thumbnail_score.h" 20 #include "chrome/common/thumbnail_score.h"
21 #include "sql/statement.h" 21 #include "sql/statement.h"
22 #include "sql/transaction.h" 22 #include "sql/transaction.h"
23 #include "ui/gfx/favicon_size.h" 23 #include "ui/gfx/favicon_size.h"
24 #include "ui/gfx/image/image_util.h" 24 #include "ui/gfx/image/image_util.h"
25 #include "ui/gfx/size.h"
25 26
26 #if defined(OS_MACOSX) 27 #if defined(OS_MACOSX)
27 #include "base/mac/mac_util.h" 28 #include "base/mac/mac_util.h"
28 #endif 29 #endif
29 30
30 static void FillIconMapping(const sql::Statement& statement, 31 static void FillIconMapping(const sql::Statement& statement,
31 const GURL& page_url, 32 const GURL& page_url,
32 history::IconMapping* icon_mapping) { 33 history::IconMapping* icon_mapping) {
33 icon_mapping->mapping_id = statement.ColumnInt64(0); 34 icon_mapping->mapping_id = statement.ColumnInt64(0);
34 icon_mapping->icon_id = statement.ColumnInt64(1); 35 icon_mapping->icon_id = statement.ColumnInt64(1);
35 icon_mapping->icon_type = 36 icon_mapping->icon_type =
36 static_cast<history::IconType>(statement.ColumnInt(2)); 37 static_cast<history::IconType>(statement.ColumnInt(2));
38 icon_mapping->icon_pixel_size =
39 gfx::Size(statement.ColumnInt(3), statement.ColumnInt(4));
37 icon_mapping->page_url = page_url; 40 icon_mapping->page_url = page_url;
38 } 41 }
39 42
40 namespace history { 43 namespace history {
41 44
42 // Version number of the database. 45 // Version number of the database.
43 static const int kCurrentVersionNumber = 6; 46 static const int kCurrentVersionNumber = 6;
44 static const int kCompatibleVersionNumber = 6; 47 static const int kCompatibleVersionNumber = 6;
45 48
46 // Use 90 quality (out of 100) which is pretty high, because we're very 49 // Use 90 quality (out of 100) which is pretty high, because we're very
(...skipping 349 matching lines...) Expand 10 before | Expand all | Expand 10 after
396 bool ThumbnailDatabase::SetFaviconLastUpdateTime(FaviconID icon_id, 399 bool ThumbnailDatabase::SetFaviconLastUpdateTime(FaviconID icon_id,
397 base::Time time) { 400 base::Time time) {
398 sql::Statement statement(db_.GetCachedStatement(SQL_FROM_HERE, 401 sql::Statement statement(db_.GetCachedStatement(SQL_FROM_HERE,
399 "UPDATE favicons SET last_updated=? WHERE id=?")); 402 "UPDATE favicons SET last_updated=? WHERE id=?"));
400 statement.BindInt64(0, time.ToTimeT()); 403 statement.BindInt64(0, time.ToTimeT());
401 statement.BindInt64(1, icon_id); 404 statement.BindInt64(1, icon_id);
402 405
403 return statement.Run(); 406 return statement.Run();
404 } 407 }
405 408
406 FaviconID ThumbnailDatabase::GetFaviconIDForFaviconURL(const GURL& icon_url, 409 void ThumbnailDatabase::GetFaviconIDsForFaviconURL(
407 int required_icon_type, 410 const GURL& icon_url,
408 IconType* icon_type) { 411 int required_icon_type,
412 std::vector<FaviconIDAndSize>* favicon_id_size_listing) {
409 sql::Statement statement(db_.GetCachedStatement(SQL_FROM_HERE, 413 sql::Statement statement(db_.GetCachedStatement(SQL_FROM_HERE,
410 "SELECT id, icon_type FROM favicons WHERE url=? AND (icon_type & ? > 0) " 414 "SELECT id, icon_type, width, height FROM favicons "
411 "ORDER BY icon_type DESC")); 415 "WHERE url=? AND (icon_type & ? > 0) ORDER BY icon_type DESC"));
412 statement.BindString(0, URLDatabase::GURLToDatabaseURL(icon_url)); 416 statement.BindString(0, URLDatabase::GURLToDatabaseURL(icon_url));
413 statement.BindInt(1, required_icon_type); 417 statement.BindInt(1, required_icon_type);
414 418
415 if (!statement.Step()) 419 IconType chosen_icon_type = INVALID_ICON;
416 return 0; // not cached 420 while (statement.Step()) {
421 IconType icon_type = static_cast<IconType>(statement.ColumnInt(1));
422 if (chosen_icon_type == INVALID_ICON)
423 chosen_icon_type = icon_type;
424 else if (icon_type != chosen_icon_type)
425 break;
417 426
418 if (icon_type) 427 FaviconIDAndSize favicon_id_size;
419 *icon_type = static_cast<IconType>(statement.ColumnInt(1)); 428 favicon_id_size.icon_id = statement.ColumnInt64(0);
420 return statement.ColumnInt64(0); 429 favicon_id_size.icon_size = gfx::Size(statement.ColumnInt(2),
430 statement.ColumnInt(3));
431 favicon_id_size_listing->push_back(favicon_id_size);
432 }
421 } 433 }
422 434
423 bool ThumbnailDatabase::GetFavicon( 435 bool ThumbnailDatabase::GetFavicon(
424 FaviconID icon_id, 436 FaviconID icon_id,
425 base::Time* last_updated, 437 base::Time* last_updated,
426 std::vector<unsigned char>* png_icon_data, 438 std::vector<unsigned char>* png_icon_data,
427 GURL* icon_url, 439 GURL* icon_url,
440 gfx::Size* pixel_size,
428 IconType* icon_type) { 441 IconType* icon_type) {
429 DCHECK(icon_id); 442 DCHECK(icon_id);
430 443
431 sql::Statement statement(db_.GetCachedStatement(SQL_FROM_HERE, 444 sql::Statement statement(db_.GetCachedStatement(SQL_FROM_HERE,
432 "SELECT last_updated, image_data, url, icon_type " 445 "SELECT last_updated, image_data, url, icon_type, width, height "
433 "FROM favicons WHERE id=?")); 446 "FROM favicons WHERE id=?"));
434 statement.BindInt64(0, icon_id); 447 statement.BindInt64(0, icon_id);
435 448
436 if (!statement.Step()) 449 if (!statement.Step())
437 return false; // No entry for the id. 450 return false; // No entry for the id.
438 451
439 if (last_updated) 452 if (last_updated)
440 *last_updated = base::Time::FromTimeT(statement.ColumnInt64(0)); 453 *last_updated = base::Time::FromTimeT(statement.ColumnInt64(0));
441 if (statement.ColumnByteLength(1) > 0) 454 if (statement.ColumnByteLength(1) > 0)
442 statement.ColumnBlobAsVector(1, png_icon_data); 455 statement.ColumnBlobAsVector(1, png_icon_data);
443 if (icon_url) 456 if (icon_url)
444 *icon_url = GURL(statement.ColumnString(2)); 457 *icon_url = GURL(statement.ColumnString(2));
445 if (icon_type) 458 if (icon_type)
446 *icon_type = static_cast<history::IconType>(statement.ColumnInt(3)); 459 *icon_type = static_cast<history::IconType>(statement.ColumnInt(3));
460 if (pixel_size)
461 *pixel_size = gfx::Size(statement.ColumnInt(4), statement.ColumnInt(5));
447 462
448 return true; 463 return true;
449 } 464 }
450 465
451 FaviconID ThumbnailDatabase::AddFavicon(const GURL& icon_url, 466 FaviconID ThumbnailDatabase::AddFavicon(const GURL& icon_url,
467 const gfx::Size& pixel_size,
452 IconType icon_type) { 468 IconType icon_type) {
453 int default_size = icon_type == FAVICON ? gfx::kFaviconSize : 0;
454 sql::Statement statement(db_.GetCachedStatement(SQL_FROM_HERE, 469 sql::Statement statement(db_.GetCachedStatement(SQL_FROM_HERE,
455 "INSERT INTO favicons (url, icon_type, width, height) VALUES " 470 "INSERT INTO favicons (url, icon_type, width, height) VALUES "
456 "(?, ?, ?, ?)")); 471 "(?, ?, ?, ?)"));
457 statement.BindString(0, URLDatabase::GURLToDatabaseURL(icon_url)); 472 statement.BindString(0, URLDatabase::GURLToDatabaseURL(icon_url));
458 statement.BindInt(1, icon_type); 473 statement.BindInt(1, icon_type);
459 statement.BindInt(2, default_size); 474 statement.BindInt(2, pixel_size.width());
460 statement.BindInt(3, default_size); 475 statement.BindInt(3, pixel_size.height());
461 476
462 if (!statement.Run()) 477 if (!statement.Run())
463 return 0; 478 return 0;
464 return db_.GetLastInsertRowId(); 479 return db_.GetLastInsertRowId();
465 } 480 }
466 481
467 bool ThumbnailDatabase::DeleteFavicon(FaviconID id) { 482 bool ThumbnailDatabase::DeleteFavicon(FaviconID id) {
468 sql::Statement statement(db_.GetCachedStatement(SQL_FROM_HERE, 483 sql::Statement statement(db_.GetCachedStatement(SQL_FROM_HERE,
469 "DELETE FROM favicons WHERE id = ?")); 484 "DELETE FROM favicons WHERE id = ?"));
470 statement.BindInt64(0, id); 485 statement.BindInt64(0, id);
471 486
472 return statement.Run(); 487 return statement.Run();
473 } 488 }
474 489
475 bool ThumbnailDatabase::GetIconMappingForPageURL(const GURL& page_url, 490 bool ThumbnailDatabase::GetIconMappingsForPageURL(
476 IconType required_icon_type, 491 const GURL& page_url,
477 IconMapping* icon_mapping) { 492 int required_icon_types,
478 std::vector<IconMapping> icon_mappings; 493 std::vector<IconMapping>* icon_mappings) {
479 if (!GetIconMappingsForPageURL(page_url, &icon_mappings)) 494 std::vector<IconMapping> unfiltered_icon_mappings;
495 if (!GetIconMappingsForPageURL(page_url, &unfiltered_icon_mappings))
480 return false; 496 return false;
481 497
482 for (std::vector<IconMapping>::iterator m = icon_mappings.begin(); 498 for (std::vector<IconMapping>::iterator m = unfiltered_icon_mappings.begin();
483 m != icon_mappings.end(); ++m) { 499 m != unfiltered_icon_mappings.end(); ++m) {
484 if (m->icon_type == required_icon_type) { 500 if (m->icon_type & required_icon_types) {
485 if (icon_mapping != NULL) 501 if (icon_mappings == NULL)
486 *icon_mapping = *m; 502 return true;
487 return true; 503
504 icon_mappings->push_back(*m);
488 } 505 }
489 } 506 }
490 507
491 return false; 508 return (icon_mappings == NULL) ? false : !icon_mappings->empty();
492 } 509 }
493 510
494 bool ThumbnailDatabase::GetIconMappingsForPageURL( 511 bool ThumbnailDatabase::GetIconMappingsForPageURL(
495 const GURL& page_url, 512 const GURL& page_url,
496 std::vector<IconMapping>* mapping_data) { 513 std::vector<IconMapping>* mapping_data) {
497 sql::Statement statement(db_.GetCachedStatement(SQL_FROM_HERE, 514 sql::Statement statement(db_.GetCachedStatement(SQL_FROM_HERE,
498 "SELECT icon_mapping.id, icon_mapping.icon_id, favicons.icon_type " 515 "SELECT icon_mapping.id, icon_mapping.icon_id, favicons.icon_type, "
516 "favicons.width, favicons.height "
499 "FROM icon_mapping " 517 "FROM icon_mapping "
500 "INNER JOIN favicons " 518 "INNER JOIN favicons "
501 "ON icon_mapping.icon_id = favicons.id " 519 "ON icon_mapping.icon_id = favicons.id "
502 "WHERE icon_mapping.page_url=? " 520 "WHERE icon_mapping.page_url=? "
503 "ORDER BY favicons.icon_type DESC")); 521 "ORDER BY favicons.icon_type DESC"));
504 statement.BindString(0, URLDatabase::GURLToDatabaseURL(page_url)); 522 statement.BindString(0, URLDatabase::GURLToDatabaseURL(page_url));
505 523
506 bool result = false; 524 bool result = false;
507 while (statement.Step()) { 525 while (statement.Step()) {
508 result = true; 526 result = true;
(...skipping 311 matching lines...) Expand 10 before | Expand all | Expand 10 after
820 // have width & height of 16px. 838 // have width & height of 16px.
821 success &= db_.Execute( 839 success &= db_.Execute(
822 "UPDATE favicons SET width='16', height='16' WHERE icon_type='1'"); 840 "UPDATE favicons SET width='16', height='16' WHERE icon_type='1'");
823 841
824 meta_table_.SetVersionNumber(6); 842 meta_table_.SetVersionNumber(6);
825 meta_table_.SetCompatibleVersionNumber(std::min(6, kCompatibleVersionNumber)); 843 meta_table_.SetCompatibleVersionNumber(std::min(6, kCompatibleVersionNumber));
826 return success; 844 return success;
827 } 845 }
828 846
829 } // namespace history 847 } // namespace history
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698