| 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 "media/blink/resource_multibuffer_data_provider.h" | 5 #include "media/blink/resource_multibuffer_data_provider.h" |
| 6 | 6 |
| 7 #include "base/bind.h" | 7 #include "base/bind.h" |
| 8 #include "base/bits.h" | 8 #include "base/bits.h" |
| 9 #include "base/callback_helpers.h" | 9 #include "base/callback_helpers.h" |
| 10 #include "base/message_loop/message_loop.h" | 10 #include "base/message_loop/message_loop.h" |
| (...skipping 199 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 210 base::Time last_modified; | 210 base::Time last_modified; |
| 211 if (base::Time::FromString( | 211 if (base::Time::FromString( |
| 212 response.httpHeaderField("Last-Modified").utf8().data(), | 212 response.httpHeaderField("Last-Modified").utf8().data(), |
| 213 &last_modified)) { | 213 &last_modified)) { |
| 214 destination_url_data->set_last_modified(last_modified); | 214 destination_url_data->set_last_modified(last_modified); |
| 215 } | 215 } |
| 216 | 216 |
| 217 destination_url_data->set_valid_until(base::Time::Now() + | 217 destination_url_data->set_valid_until(base::Time::Now() + |
| 218 GetCacheValidUntil(response)); | 218 GetCacheValidUntil(response)); |
| 219 | 219 |
| 220 uint32 reasons = GetReasonsForUncacheability(response); | 220 uint32_t reasons = GetReasonsForUncacheability(response); |
| 221 destination_url_data->set_cacheable(reasons == 0); | 221 destination_url_data->set_cacheable(reasons == 0); |
| 222 UMA_HISTOGRAM_BOOLEAN("Media.CacheUseful", reasons == 0); | 222 UMA_HISTOGRAM_BOOLEAN("Media.CacheUseful", reasons == 0); |
| 223 int shift = 0; | 223 int shift = 0; |
| 224 int max_enum = base::bits::Log2Ceiling(kMaxReason); | 224 int max_enum = base::bits::Log2Ceiling(kMaxReason); |
| 225 while (reasons) { | 225 while (reasons) { |
| 226 DCHECK_LT(shift, max_enum); // Sanity check. | 226 DCHECK_LT(shift, max_enum); // Sanity check. |
| 227 if (reasons & 0x1) { | 227 if (reasons & 0x1) { |
| 228 UMA_HISTOGRAM_ENUMERATION("Media.UncacheableReason", shift, | 228 UMA_HISTOGRAM_ENUMERATION("Media.UncacheableReason", shift, |
| 229 max_enum); // PRESUBMIT_IGNORE_UMA_MAX | 229 max_enum); // PRESUBMIT_IGNORE_UMA_MAX |
| 230 } | 230 } |
| 231 | 231 |
| 232 reasons >>= 1; | 232 reasons >>= 1; |
| 233 ++shift; | 233 ++shift; |
| 234 } | 234 } |
| 235 | 235 |
| 236 // Expected content length can be |kPositionNotSpecified|, in that case | 236 // Expected content length can be |kPositionNotSpecified|, in that case |
| 237 // |content_length_| is not specified and this is a streaming response. | 237 // |content_length_| is not specified and this is a streaming response. |
| 238 int64 content_length = response.expectedContentLength(); | 238 int64_t content_length = response.expectedContentLength(); |
| 239 | 239 |
| 240 // We make a strong assumption that when we reach here we have either | 240 // We make a strong assumption that when we reach here we have either |
| 241 // received a response from HTTP/HTTPS protocol or the request was | 241 // received a response from HTTP/HTTPS protocol or the request was |
| 242 // successful (in particular range request). So we only verify the partial | 242 // successful (in particular range request). So we only verify the partial |
| 243 // response for HTTP and HTTPS protocol. | 243 // response for HTTP and HTTPS protocol. |
| 244 if (destination_url_data->url().SchemeIsHTTPOrHTTPS()) { | 244 if (destination_url_data->url().SchemeIsHTTPOrHTTPS()) { |
| 245 bool partial_response = (response.httpStatusCode() == kHttpPartialContent); | 245 bool partial_response = (response.httpStatusCode() == kHttpPartialContent); |
| 246 bool ok_response = (response.httpStatusCode() == kHttpOK); | 246 bool ok_response = (response.httpStatusCode() == kHttpOK); |
| 247 | 247 |
| 248 // Check to see whether the server supports byte ranges. | 248 // Check to see whether the server supports byte ranges. |
| (...skipping 164 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 413 // We don't need to continue loading after failure. | 413 // We don't need to continue loading after failure. |
| 414 // | 414 // |
| 415 // Keep it alive until we exit this method so that |error| remains valid. | 415 // Keep it alive until we exit this method so that |error| remains valid. |
| 416 scoped_ptr<ActiveLoader> active_loader = active_loader_.Pass(); | 416 scoped_ptr<ActiveLoader> active_loader = active_loader_.Pass(); |
| 417 url_data_->Fail(); | 417 url_data_->Fail(); |
| 418 } | 418 } |
| 419 } | 419 } |
| 420 | 420 |
| 421 bool ResourceMultiBufferDataProvider::ParseContentRange( | 421 bool ResourceMultiBufferDataProvider::ParseContentRange( |
| 422 const std::string& content_range_str, | 422 const std::string& content_range_str, |
| 423 int64* first_byte_position, | 423 int64_t* first_byte_position, |
| 424 int64* last_byte_position, | 424 int64_t* last_byte_position, |
| 425 int64* instance_size) { | 425 int64_t* instance_size) { |
| 426 const std::string kUpThroughBytesUnit = "bytes "; | 426 const std::string kUpThroughBytesUnit = "bytes "; |
| 427 if (content_range_str.find(kUpThroughBytesUnit) != 0) | 427 if (content_range_str.find(kUpThroughBytesUnit) != 0) |
| 428 return false; | 428 return false; |
| 429 std::string range_spec = | 429 std::string range_spec = |
| 430 content_range_str.substr(kUpThroughBytesUnit.length()); | 430 content_range_str.substr(kUpThroughBytesUnit.length()); |
| 431 size_t dash_offset = range_spec.find("-"); | 431 size_t dash_offset = range_spec.find("-"); |
| 432 size_t slash_offset = range_spec.find("/"); | 432 size_t slash_offset = range_spec.find("/"); |
| 433 | 433 |
| 434 if (dash_offset == std::string::npos || slash_offset == std::string::npos || | 434 if (dash_offset == std::string::npos || slash_offset == std::string::npos || |
| 435 slash_offset < dash_offset || slash_offset + 1 == range_spec.length()) { | 435 slash_offset < dash_offset || slash_offset + 1 == range_spec.length()) { |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 470 return ret; | 470 return ret; |
| 471 } | 471 } |
| 472 | 472 |
| 473 int64_t ResourceMultiBufferDataProvider::block_size() const { | 473 int64_t ResourceMultiBufferDataProvider::block_size() const { |
| 474 int64_t ret = 1; | 474 int64_t ret = 1; |
| 475 return ret << url_data_->multibuffer()->block_size_shift(); | 475 return ret << url_data_->multibuffer()->block_size_shift(); |
| 476 } | 476 } |
| 477 | 477 |
| 478 bool ResourceMultiBufferDataProvider::VerifyPartialResponse( | 478 bool ResourceMultiBufferDataProvider::VerifyPartialResponse( |
| 479 const WebURLResponse& response) { | 479 const WebURLResponse& response) { |
| 480 int64 first_byte_position, last_byte_position, instance_size; | 480 int64_t first_byte_position, last_byte_position, instance_size; |
| 481 if (!ParseContentRange(response.httpHeaderField("Content-Range").utf8(), | 481 if (!ParseContentRange(response.httpHeaderField("Content-Range").utf8(), |
| 482 &first_byte_position, &last_byte_position, | 482 &first_byte_position, &last_byte_position, |
| 483 &instance_size)) { | 483 &instance_size)) { |
| 484 return false; | 484 return false; |
| 485 } | 485 } |
| 486 | 486 |
| 487 if (url_data_->length() == kPositionNotSpecified) { | 487 if (url_data_->length() == kPositionNotSpecified) { |
| 488 url_data_->set_length(instance_size); | 488 url_data_->set_length(instance_size); |
| 489 } | 489 } |
| 490 | 490 |
| 491 if (byte_pos() != first_byte_position) { | 491 if (byte_pos() != first_byte_position) { |
| 492 return false; | 492 return false; |
| 493 } | 493 } |
| 494 | 494 |
| 495 return true; | 495 return true; |
| 496 } | 496 } |
| 497 | 497 |
| 498 } // namespace media | 498 } // namespace media |
| OLD | NEW |