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..c0f1428ce8397ba632c2cac2f25b0dc1fcf1f001 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,25 @@ scoped_refptr<UrlData> UrlIndex::NewUrlData(const GURL& url, |
| return new UrlData(url, cors_mode, weak_factory_.GetWeakPtr()); |
| } |
| +namespace { |
| +bool IsStrongEtag(const std::string& etag) { |
| + return etag.size() > 2 && etag[0] == '"'; |
| +} |
| + |
| +bool IsNewDataForSameResource(const scoped_refptr<UrlData>& new_entry, |
| + const scoped_refptr<UrlData>& old_entry) { |
| + if (IsStrongEtag(new_entry->etag()) && IsStrongEtag(old_entry->etag())) { |
| + 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; |
|
Tom Bergan
2016/09/16 19:30:21
Missed this on the first read ... What if the resp
hubbe
2016/09/16 19:33:41
That is exactly what this code does.
(Unless I wro
Tom Bergan
2016/09/16 19:45:36
It is, I misread the meaning of "false" in this co
|
| +} |
| +}; |
| + |
| scoped_refptr<UrlData> UrlIndex::TryInsert( |
| const scoped_refptr<UrlData>& url_data) { |
| scoped_refptr<UrlData>* by_url_slot; |
| @@ -232,14 +256,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() || |