Chromium Code Reviews| Index: media/blink/url_index.cc |
| diff --git a/media/blink/url_index.cc b/media/blink/url_index.cc |
| index 97325f07e4ad049539f6e63ea3f4bb2b2882e115..2c52e65bc118cb1cfab01b37b36cad30b0d646a6 100644 |
| --- a/media/blink/url_index.cc |
| +++ b/media/blink/url_index.cc |
| @@ -167,6 +167,11 @@ void UrlData::set_last_modified(base::Time last_modified) { |
| last_modified_ = last_modified; |
| } |
| +void UrlData::set_etag(const std::string& etag) { |
| + DCHECK(thread_checker_.CalledOnValidThread()); |
| + etag_ = etag; |
| +} |
| + |
| void UrlData::set_range_supported() { |
| DCHECK(thread_checker_.CalledOnValidThread()); |
| range_supported_ = true; |
| @@ -215,6 +220,29 @@ scoped_refptr<UrlData> UrlIndex::NewUrlData(const GURL& url, |
| return new UrlData(url, cors_mode, weak_factory_.GetWeakPtr()); |
| } |
| +namespace { |
| +bool HasStrongEtag(const scoped_refptr<UrlData>& entry) { |
|
DaleCurtis
2016/09/13 23:31:52
Don't pass scoped_refptr by const& anymore. I'd ju
hubbe
2016/09/14 00:23:06
Done.
|
| + if (entry->etag().size() < 2) |
| + return false; |
| + if (entry->etag()[0] == 'W' && entry->etag()[1] == '/') |
| + return false; |
| + return true; |
| +} |
| + |
| +bool IsNewDataForSameResource(const scoped_refptr<UrlData>& new_entry, |
| + const scoped_refptr<UrlData>& old_entry) { |
| + if (HasStrongEtag(new_entry) && HasStrongEtag(old_entry)) { |
| + if (new_entry->etag() != old_entry->etag()) |
| + return true; |
| + } |
| + if (!new_entry->last_modified().is_null()) { |
| + if (new_entry->last_modified() != old_entry->last_modified()) |
| + return true; |
| + } |
| + return false; |
| +} |
| +}; |
| + |
| scoped_refptr<UrlData> UrlIndex::TryInsert( |
| const scoped_refptr<UrlData>& url_data) { |
| scoped_refptr<UrlData>* by_url_slot; |
| @@ -232,14 +260,12 @@ scoped_refptr<UrlData> UrlIndex::TryInsert( |
| if (*by_url_slot == url_data) |
| return url_data; |
| - // TODO(hubbe): Support etag validation. |
| - if (!url_data->last_modified().is_null()) { |
| - if ((*by_url_slot)->last_modified() != url_data->last_modified()) { |
| - if (urldata_valid) |
| - *by_url_slot = url_data; |
| - return url_data; |
| - } |
| + if (IsNewDataForSameResource(url_data, *by_url_slot)) { |
| + if (urldata_valid) |
| + *by_url_slot = url_data; |
| + return url_data; |
| } |
| + |
| // Check if we should replace the in-cache url data with our url data. |
| if (urldata_valid) { |
| if ((!(*by_url_slot)->Valid() || |