Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 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 <set> | 5 #include <set> |
| 6 #include <utility> | 6 #include <utility> |
| 7 | 7 |
| 8 #include "base/bind.h" | 8 #include "base/bind.h" |
| 9 #include "base/location.h" | 9 #include "base/location.h" |
| 10 #include "base/single_thread_task_runner.h" | 10 #include "base/single_thread_task_runner.h" |
| (...skipping 149 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 160 base::TimeDelta::FromSeconds(kUrlMappingTimeoutSeconds)) | 160 base::TimeDelta::FromSeconds(kUrlMappingTimeoutSeconds)) |
| 161 return true; | 161 return true; |
| 162 return false; | 162 return false; |
| 163 } | 163 } |
| 164 | 164 |
| 165 void UrlData::set_last_modified(base::Time last_modified) { | 165 void UrlData::set_last_modified(base::Time last_modified) { |
| 166 DCHECK(thread_checker_.CalledOnValidThread()); | 166 DCHECK(thread_checker_.CalledOnValidThread()); |
| 167 last_modified_ = last_modified; | 167 last_modified_ = last_modified; |
| 168 } | 168 } |
| 169 | 169 |
| 170 void UrlData::set_etag(const std::string& etag) { | |
| 171 DCHECK(thread_checker_.CalledOnValidThread()); | |
| 172 etag_ = etag; | |
| 173 } | |
| 174 | |
| 170 void UrlData::set_range_supported() { | 175 void UrlData::set_range_supported() { |
| 171 DCHECK(thread_checker_.CalledOnValidThread()); | 176 DCHECK(thread_checker_.CalledOnValidThread()); |
| 172 range_supported_ = true; | 177 range_supported_ = true; |
| 173 } | 178 } |
| 174 | 179 |
| 175 ResourceMultiBuffer* UrlData::multibuffer() { | 180 ResourceMultiBuffer* UrlData::multibuffer() { |
| 176 DCHECK(thread_checker_.CalledOnValidThread()); | 181 DCHECK(thread_checker_.CalledOnValidThread()); |
| 177 return &multibuffer_; | 182 return &multibuffer_; |
| 178 } | 183 } |
| 179 | 184 |
| (...skipping 28 matching lines...) Expand all Loading... | |
| 208 return i->second; | 213 return i->second; |
| 209 } | 214 } |
| 210 return NewUrlData(gurl, cors_mode); | 215 return NewUrlData(gurl, cors_mode); |
| 211 } | 216 } |
| 212 | 217 |
| 213 scoped_refptr<UrlData> UrlIndex::NewUrlData(const GURL& url, | 218 scoped_refptr<UrlData> UrlIndex::NewUrlData(const GURL& url, |
| 214 UrlData::CORSMode cors_mode) { | 219 UrlData::CORSMode cors_mode) { |
| 215 return new UrlData(url, cors_mode, weak_factory_.GetWeakPtr()); | 220 return new UrlData(url, cors_mode, weak_factory_.GetWeakPtr()); |
| 216 } | 221 } |
| 217 | 222 |
| 223 namespace { | |
| 224 bool IsStrongEtag(const std::string& etag) { | |
| 225 return etag.size() > 2 && etag[0] == '"'; | |
| 226 } | |
| 227 | |
| 228 bool IsNewDataForSameResource(const scoped_refptr<UrlData>& new_entry, | |
| 229 const scoped_refptr<UrlData>& old_entry) { | |
| 230 if (IsStrongEtag(new_entry->etag()) && IsStrongEtag(old_entry->etag())) { | |
| 231 if (new_entry->etag() != old_entry->etag()) | |
| 232 return true; | |
| 233 } | |
| 234 if (!new_entry->last_modified().is_null()) { | |
| 235 if (new_entry->last_modified() != old_entry->last_modified()) | |
| 236 return true; | |
| 237 } | |
| 238 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
| |
| 239 } | |
| 240 }; | |
| 241 | |
| 218 scoped_refptr<UrlData> UrlIndex::TryInsert( | 242 scoped_refptr<UrlData> UrlIndex::TryInsert( |
| 219 const scoped_refptr<UrlData>& url_data) { | 243 const scoped_refptr<UrlData>& url_data) { |
| 220 scoped_refptr<UrlData>* by_url_slot; | 244 scoped_refptr<UrlData>* by_url_slot; |
| 221 bool urldata_valid = url_data->Valid(); | 245 bool urldata_valid = url_data->Valid(); |
| 222 if (urldata_valid) { | 246 if (urldata_valid) { |
| 223 by_url_slot = &by_url_.insert(std::make_pair(url_data->key(), url_data)) | 247 by_url_slot = &by_url_.insert(std::make_pair(url_data->key(), url_data)) |
| 224 .first->second; | 248 .first->second; |
| 225 } else { | 249 } else { |
| 226 std::map<UrlData::KeyType, scoped_refptr<UrlData>>::iterator iter; | 250 std::map<UrlData::KeyType, scoped_refptr<UrlData>>::iterator iter; |
| 227 iter = by_url_.find(url_data->key()); | 251 iter = by_url_.find(url_data->key()); |
| 228 if (iter == by_url_.end()) | 252 if (iter == by_url_.end()) |
| 229 return url_data; | 253 return url_data; |
| 230 by_url_slot = &iter->second; | 254 by_url_slot = &iter->second; |
| 231 } | 255 } |
| 232 if (*by_url_slot == url_data) | 256 if (*by_url_slot == url_data) |
| 233 return url_data; | 257 return url_data; |
| 234 | 258 |
| 235 // TODO(hubbe): Support etag validation. | 259 if (IsNewDataForSameResource(url_data, *by_url_slot)) { |
| 236 if (!url_data->last_modified().is_null()) { | 260 if (urldata_valid) |
| 237 if ((*by_url_slot)->last_modified() != url_data->last_modified()) { | 261 *by_url_slot = url_data; |
| 238 if (urldata_valid) | 262 return url_data; |
| 239 *by_url_slot = url_data; | |
| 240 return url_data; | |
| 241 } | |
| 242 } | 263 } |
| 264 | |
| 243 // Check if we should replace the in-cache url data with our url data. | 265 // Check if we should replace the in-cache url data with our url data. |
| 244 if (urldata_valid) { | 266 if (urldata_valid) { |
| 245 if ((!(*by_url_slot)->Valid() || | 267 if ((!(*by_url_slot)->Valid() || |
| 246 url_data->CachedSize() > (*by_url_slot)->CachedSize())) { | 268 url_data->CachedSize() > (*by_url_slot)->CachedSize())) { |
| 247 *by_url_slot = url_data; | 269 *by_url_slot = url_data; |
| 248 } else { | 270 } else { |
| 249 (*by_url_slot)->MergeFrom(url_data); | 271 (*by_url_slot)->MergeFrom(url_data); |
| 250 } | 272 } |
| 251 } | 273 } |
| 252 return *by_url_slot; | 274 return *by_url_slot; |
| 253 } | 275 } |
| 254 | 276 |
| 255 } // namespace media | 277 } // namespace media |
| OLD | NEW |