| Index: components/history/core/browser/history_backend.cc
 | 
| diff --git a/components/history/core/browser/history_backend.cc b/components/history/core/browser/history_backend.cc
 | 
| index 1c4aa6a0436526c8c33c228708c1e585b47a3127..a05f7546b203cc7a1b7a96ccf06d04dbdbbbd126 100644
 | 
| --- a/components/history/core/browser/history_backend.cc
 | 
| +++ b/components/history/core/browser/history_backend.cc
 | 
| @@ -1636,8 +1636,9 @@ void HistoryBackend::MergeFavicon(
 | 
|        thumbnail_db_->DeleteFaviconBitmap(bitmap_id_sizes[0].bitmap_id);
 | 
|        favicon_sizes.erase(favicon_sizes.begin());
 | 
|      }
 | 
| -    thumbnail_db_->AddFaviconBitmap(favicon_id, bitmap_data, base::Time::Now(),
 | 
| -                                    pixel_size);
 | 
| +    thumbnail_db_->AddFaviconBitmap(favicon_id, bitmap_data,
 | 
| +                                    FaviconBitmapType::ON_VISIT,
 | 
| +                                    base::Time::Now(), pixel_size);
 | 
|      favicon_sizes.push_back(pixel_size);
 | 
|    }
 | 
|  
 | 
| @@ -1698,9 +1699,10 @@ void HistoryBackend::MergeFavicon(
 | 
|  
 | 
|        // Add the favicon bitmap as expired as it is not consistent with the
 | 
|        // merged in data.
 | 
| -      thumbnail_db_->AddFaviconBitmap(
 | 
| -          favicon_id, bitmaps_to_copy[j].bitmap_data, base::Time(),
 | 
| -          bitmaps_to_copy[j].pixel_size);
 | 
| +      thumbnail_db_->AddFaviconBitmap(favicon_id,
 | 
| +                                      bitmaps_to_copy[j].bitmap_data,
 | 
| +                                      FaviconBitmapType::ON_VISIT, base::Time(),
 | 
| +                                      bitmaps_to_copy[j].pixel_size);
 | 
|        favicon_sizes.push_back(bitmaps_to_copy[j].pixel_size);
 | 
|        favicon_bitmaps_copied = true;
 | 
|  
 | 
| @@ -1733,14 +1735,13 @@ void HistoryBackend::SetFavicons(const GURL& page_url,
 | 
|                                   const GURL& icon_url,
 | 
|                                   const std::vector<SkBitmap>& bitmaps) {
 | 
|    SetFaviconsImpl(page_url, icon_type, icon_url, bitmaps,
 | 
| -                  /*bitmaps_are_expired=*/false);
 | 
| +                  FaviconBitmapType::ON_VISIT);
 | 
|  }
 | 
|  
 | 
| -bool HistoryBackend::SetLastResortFavicons(
 | 
| -    const GURL& page_url,
 | 
| -    favicon_base::IconType icon_type,
 | 
| -    const GURL& icon_url,
 | 
| -    const std::vector<SkBitmap>& bitmaps) {
 | 
| +bool HistoryBackend::SetOnDemandFavicons(const GURL& page_url,
 | 
| +                                         favicon_base::IconType icon_type,
 | 
| +                                         const GURL& icon_url,
 | 
| +                                         const std::vector<SkBitmap>& bitmaps) {
 | 
|    if (!thumbnail_db_ || !db_)
 | 
|      return false;
 | 
|  
 | 
| @@ -1751,7 +1752,7 @@ bool HistoryBackend::SetLastResortFavicons(
 | 
|    }
 | 
|  
 | 
|    return SetFaviconsImpl(page_url, icon_type, icon_url, bitmaps,
 | 
| -                         /*bitmaps_are_expired=*/true);
 | 
| +                         FaviconBitmapType::ON_DEMAND);
 | 
|  }
 | 
|  
 | 
|  void HistoryBackend::SetFaviconsOutOfDateForPage(const GURL& page_url) {
 | 
| @@ -1768,6 +1769,14 @@ void HistoryBackend::SetFaviconsOutOfDateForPage(const GURL& page_url) {
 | 
|    ScheduleCommit();
 | 
|  }
 | 
|  
 | 
| +void HistoryBackend::TouchOnDemandFavicon(const GURL& icon_url) {
 | 
| +  if (!thumbnail_db_)
 | 
| +    return;
 | 
| +
 | 
| +  thumbnail_db_->TouchOnDemandFavicon(icon_url, Time::Now());
 | 
| +  ScheduleCommit();
 | 
| +}
 | 
| +
 | 
|  void HistoryBackend::SetImportedFavicons(
 | 
|      const favicon_base::FaviconUsageDataList& favicon_usage) {
 | 
|    if (!db_ || !thumbnail_db_)
 | 
| @@ -1787,8 +1796,8 @@ void HistoryBackend::SetImportedFavicons(
 | 
|        // TODO(pkotwicz): Pass in real pixel size.
 | 
|        favicon_id = thumbnail_db_->AddFavicon(
 | 
|            favicon_usage[i].favicon_url, favicon_base::FAVICON,
 | 
| -          new base::RefCountedBytes(favicon_usage[i].png_data), now,
 | 
| -          gfx::Size());
 | 
| +          new base::RefCountedBytes(favicon_usage[i].png_data),
 | 
| +          FaviconBitmapType::ON_VISIT, now, gfx::Size());
 | 
|      }
 | 
|  
 | 
|      // Save the mapping from all the URLs to the favicon.
 | 
| @@ -1833,7 +1842,7 @@ bool HistoryBackend::SetFaviconsImpl(const GURL& page_url,
 | 
|                                       favicon_base::IconType icon_type,
 | 
|                                       const GURL& icon_url,
 | 
|                                       const std::vector<SkBitmap>& bitmaps,
 | 
| -                                     bool bitmaps_are_expired) {
 | 
| +                                     FaviconBitmapType type) {
 | 
|    if (!thumbnail_db_ || !db_)
 | 
|      return false;
 | 
|  
 | 
| @@ -1849,11 +1858,9 @@ bool HistoryBackend::SetFaviconsImpl(const GURL& page_url,
 | 
|    }
 | 
|  
 | 
|    bool favicon_data_modified = false;
 | 
| -  if (favicon_created || !bitmaps_are_expired)
 | 
| -    favicon_data_modified = SetFaviconBitmaps(icon_id, bitmaps);
 | 
| -
 | 
| -  if (favicon_created && bitmaps_are_expired)
 | 
| -    thumbnail_db_->SetFaviconOutOfDate(icon_id);
 | 
| +  if (favicon_created || type == FaviconBitmapType::ON_VISIT) {
 | 
| +    favicon_data_modified = SetFaviconBitmaps(icon_id, bitmaps, type);
 | 
| +  }
 | 
|  
 | 
|    std::vector<favicon_base::FaviconID> icon_ids(1u, icon_id);
 | 
|    bool mapping_changed =
 | 
| @@ -1907,7 +1914,8 @@ void HistoryBackend::UpdateFaviconMappingsAndFetchImpl(
 | 
|  }
 | 
|  
 | 
|  bool HistoryBackend::SetFaviconBitmaps(favicon_base::FaviconID icon_id,
 | 
| -                                       const std::vector<SkBitmap>& bitmaps) {
 | 
| +                                       const std::vector<SkBitmap>& bitmaps,
 | 
| +                                       FaviconBitmapType type) {
 | 
|    std::vector<FaviconBitmapIDSize> bitmap_id_sizes;
 | 
|    thumbnail_db_->GetFaviconBitmapIDSizes(icon_id, &bitmap_id_sizes);
 | 
|  
 | 
| @@ -1944,11 +1952,12 @@ bool HistoryBackend::SetFaviconBitmaps(favicon_base::FaviconID icon_id,
 | 
|      } else {
 | 
|        if (!favicon_bitmaps_changed &&
 | 
|            IsFaviconBitmapDataEqual(bitmap_id, match_it->first)) {
 | 
| -        thumbnail_db_->SetFaviconBitmapLastUpdateTime(bitmap_id,
 | 
| -                                                      base::Time::Now());
 | 
| +        thumbnail_db_->SetFaviconBitmapLastUpdateTime(
 | 
| +            bitmap_id, base::Time::Now() /* new last updated time */);
 | 
|        } else {
 | 
| -        thumbnail_db_->SetFaviconBitmap(bitmap_id, match_it->first,
 | 
| -                                        base::Time::Now());
 | 
| +        thumbnail_db_->SetFaviconBitmap(
 | 
| +            bitmap_id, match_it->first,
 | 
| +            base::Time::Now() /* new last updated time */);
 | 
|          favicon_bitmaps_changed = true;
 | 
|        }
 | 
|        to_add.erase(match_it);
 | 
| @@ -1956,8 +1965,10 @@ bool HistoryBackend::SetFaviconBitmaps(favicon_base::FaviconID icon_id,
 | 
|    }
 | 
|  
 | 
|    for (size_t i = 0; i < to_add.size(); ++i) {
 | 
| -    thumbnail_db_->AddFaviconBitmap(icon_id, to_add[i].first, base::Time::Now(),
 | 
| -                                    to_add[i].second);
 | 
| +    thumbnail_db_->AddFaviconBitmap(
 | 
| +        icon_id, to_add[i].first, type,
 | 
| +        base::Time::Now() /* new last updated / last requested time */,
 | 
| +        to_add[i].second);
 | 
|  
 | 
|      favicon_bitmaps_changed = true;
 | 
|    }
 | 
| 
 |