| 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 <stddef.h> | 7 #include <stddef.h> |
| 8 #include <utility> | 8 #include <utility> |
| 9 | 9 |
| 10 #include "base/bind.h" | 10 #include "base/bind.h" |
| 11 #include "base/bits.h" | 11 #include "base/bits.h" |
| 12 #include "base/callback_helpers.h" | 12 #include "base/callback_helpers.h" |
| 13 #include "base/location.h" | 13 #include "base/location.h" |
| 14 #include "base/metrics/histogram.h" | 14 #include "base/metrics/histogram.h" |
| 15 #include "base/single_thread_task_runner.h" | 15 #include "base/single_thread_task_runner.h" |
| 16 #include "base/strings/string_number_conversions.h" | 16 #include "base/strings/string_number_conversions.h" |
| 17 #include "base/strings/string_util.h" | 17 #include "base/strings/string_util.h" |
| 18 #include "base/threading/thread_task_runner_handle.h" | 18 #include "base/threading/thread_task_runner_handle.h" |
| 19 #include "media/blink/active_loader.h" | 19 #include "media/blink/active_loader.h" |
| 20 #include "media/blink/cache_util.h" | 20 #include "media/blink/cache_util.h" |
| 21 #include "media/blink/media_blink_export.h" | 21 #include "media/blink/media_blink_export.h" |
| 22 #include "media/blink/url_index.h" | 22 #include "media/blink/url_index.h" |
| 23 #include "net/http/http_byte_range.h" | 23 #include "net/http/http_byte_range.h" |
| 24 #include "net/http/http_request_headers.h" | 24 #include "net/http/http_request_headers.h" |
| 25 #include "third_party/WebKit/public/platform/WebURLError.h" | 25 #include "third_party/WebKit/public/platform/WebURLError.h" |
| 26 #include "third_party/WebKit/public/platform/WebURLResponse.h" | 26 #include "third_party/WebKit/public/platform/WebURLResponse.h" |
| 27 #include "third_party/WebKit/public/web/WebAssociatedURLLoader.h" |
| 27 | 28 |
| 29 using blink::WebAssociatedURLLoader; |
| 30 using blink::WebAssociatedURLLoaderOptions; |
| 28 using blink::WebFrame; | 31 using blink::WebFrame; |
| 29 using blink::WebString; | 32 using blink::WebString; |
| 30 using blink::WebURLError; | 33 using blink::WebURLError; |
| 31 using blink::WebURLLoader; | |
| 32 using blink::WebURLLoaderOptions; | |
| 33 using blink::WebURLRequest; | 34 using blink::WebURLRequest; |
| 34 using blink::WebURLResponse; | 35 using blink::WebURLResponse; |
| 35 | 36 |
| 36 namespace media { | 37 namespace media { |
| 37 | 38 |
| 38 // The number of milliseconds to wait before retrying a failed load. | 39 // The number of milliseconds to wait before retrying a failed load. |
| 39 const int kLoaderFailedRetryDelayMs = 250; | 40 const int kLoaderFailedRetryDelayMs = 250; |
| 40 | 41 |
| 41 // Each retry, add this many MS to the delay. | 42 // Each retry, add this many MS to the delay. |
| 42 // total delay is: | 43 // total delay is: |
| (...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 89 WebString::fromUTF8(url_data_->etag())); | 90 WebString::fromUTF8(url_data_->etag())); |
| 90 } | 91 } |
| 91 | 92 |
| 92 url_data_->frame()->setReferrerForRequest(request, blink::WebURL()); | 93 url_data_->frame()->setReferrerForRequest(request, blink::WebURL()); |
| 93 | 94 |
| 94 // Disable compression, compression for audio/video doesn't make sense... | 95 // Disable compression, compression for audio/video doesn't make sense... |
| 95 request.setHTTPHeaderField( | 96 request.setHTTPHeaderField( |
| 96 WebString::fromUTF8(net::HttpRequestHeaders::kAcceptEncoding), | 97 WebString::fromUTF8(net::HttpRequestHeaders::kAcceptEncoding), |
| 97 WebString::fromUTF8("identity;q=1, *;q=0")); | 98 WebString::fromUTF8("identity;q=1, *;q=0")); |
| 98 | 99 |
| 99 // Check for our test WebURLLoader. | 100 // Check for our test WebAssociatedURLLoader. |
| 100 std::unique_ptr<WebURLLoader> loader; | 101 std::unique_ptr<WebAssociatedURLLoader> loader; |
| 101 if (test_loader_) { | 102 if (test_loader_) { |
| 102 loader = std::move(test_loader_); | 103 loader = std::move(test_loader_); |
| 103 } else { | 104 } else { |
| 104 WebURLLoaderOptions options; | 105 WebAssociatedURLLoaderOptions options; |
| 105 if (url_data_->cors_mode() == UrlData::CORS_UNSPECIFIED) { | 106 if (url_data_->cors_mode() == UrlData::CORS_UNSPECIFIED) { |
| 106 options.allowCredentials = true; | 107 options.allowCredentials = true; |
| 107 options.crossOriginRequestPolicy = | 108 options.crossOriginRequestPolicy = |
| 108 WebURLLoaderOptions::CrossOriginRequestPolicyAllow; | 109 WebAssociatedURLLoaderOptions::CrossOriginRequestPolicyAllow; |
| 109 } else { | 110 } else { |
| 110 options.exposeAllResponseHeaders = true; | 111 options.exposeAllResponseHeaders = true; |
| 111 // The author header set is empty, no preflight should go ahead. | 112 // The author header set is empty, no preflight should go ahead. |
| 112 options.preflightPolicy = WebURLLoaderOptions::PreventPreflight; | 113 options.preflightPolicy = WebAssociatedURLLoaderOptions::PreventPreflight; |
| 113 options.crossOriginRequestPolicy = | 114 options.crossOriginRequestPolicy = WebAssociatedURLLoaderOptions:: |
| 114 WebURLLoaderOptions::CrossOriginRequestPolicyUseAccessControl; | 115 CrossOriginRequestPolicyUseAccessControl; |
| 115 if (url_data_->cors_mode() == UrlData::CORS_USE_CREDENTIALS) | 116 if (url_data_->cors_mode() == UrlData::CORS_USE_CREDENTIALS) |
| 116 options.allowCredentials = true; | 117 options.allowCredentials = true; |
| 117 } | 118 } |
| 118 loader.reset(url_data_->frame()->createAssociatedURLLoader(options)); | 119 loader.reset(url_data_->frame()->createAssociatedURLLoader(options)); |
| 119 } | 120 } |
| 120 | 121 |
| 121 // Start the resource loading. | 122 // Start the resource loading. |
| 122 loader->loadAsynchronously(request, this); | 123 loader->loadAsynchronously(request, this); |
| 123 active_loader_.reset(new ActiveLoader(std::move(loader))); | 124 active_loader_.reset(new ActiveLoader(std::move(loader))); |
| 124 } | 125 } |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 159 return ret; | 160 return ret; |
| 160 } | 161 } |
| 161 | 162 |
| 162 void ResourceMultiBufferDataProvider::SetDeferred(bool deferred) { | 163 void ResourceMultiBufferDataProvider::SetDeferred(bool deferred) { |
| 163 if (!active_loader_ || active_loader_->deferred() == deferred) | 164 if (!active_loader_ || active_loader_->deferred() == deferred) |
| 164 return; | 165 return; |
| 165 active_loader_->SetDeferred(deferred); | 166 active_loader_->SetDeferred(deferred); |
| 166 } | 167 } |
| 167 | 168 |
| 168 ///////////////////////////////////////////////////////////////////////////// | 169 ///////////////////////////////////////////////////////////////////////////// |
| 169 // WebURLLoaderClient implementation. | 170 // WebAssociatedURLLoaderClient implementation. |
| 170 | 171 |
| 171 bool ResourceMultiBufferDataProvider::willFollowRedirect( | 172 bool ResourceMultiBufferDataProvider::willFollowRedirect( |
| 172 WebURLLoader* loader, | 173 const WebURLRequest& newRequest, |
| 173 WebURLRequest& newRequest, | |
| 174 const WebURLResponse& redirectResponse) { | 174 const WebURLResponse& redirectResponse) { |
| 175 redirects_to_ = newRequest.url(); | 175 redirects_to_ = newRequest.url(); |
| 176 url_data_->set_valid_until(base::Time::Now() + | 176 url_data_->set_valid_until(base::Time::Now() + |
| 177 GetCacheValidUntil(redirectResponse)); | 177 GetCacheValidUntil(redirectResponse)); |
| 178 | 178 |
| 179 // This test is vital for security! | 179 // This test is vital for security! |
| 180 if (cors_mode_ == UrlData::CORS_UNSPECIFIED) { | 180 if (cors_mode_ == UrlData::CORS_UNSPECIFIED) { |
| 181 // We allow the redirect if the origin is the same. | 181 // We allow the redirect if the origin is the same. |
| 182 if (origin_ != redirects_to_.GetOrigin()) { | 182 if (origin_ != redirects_to_.GetOrigin()) { |
| 183 // We also allow the redirect if we don't have any data in the | 183 // We also allow the redirect if we don't have any data in the |
| 184 // cache, as that means that no dangerous data mixing can occur. | 184 // cache, as that means that no dangerous data mixing can occur. |
| 185 if (url_data_->multibuffer()->map().empty() && fifo_.empty()) | 185 if (url_data_->multibuffer()->map().empty() && fifo_.empty()) |
| 186 return true; | 186 return true; |
| 187 | 187 |
| 188 active_loader_ = nullptr; | 188 active_loader_ = nullptr; |
| 189 url_data_->Fail(); | 189 url_data_->Fail(); |
| 190 return false; // "this" may be deleted now. | 190 return false; // "this" may be deleted now. |
| 191 } | 191 } |
| 192 } | 192 } |
| 193 return true; | 193 return true; |
| 194 } | 194 } |
| 195 | 195 |
| 196 void ResourceMultiBufferDataProvider::didSendData( | 196 void ResourceMultiBufferDataProvider::didSendData( |
| 197 WebURLLoader* loader, | |
| 198 unsigned long long bytes_sent, | 197 unsigned long long bytes_sent, |
| 199 unsigned long long total_bytes_to_be_sent) { | 198 unsigned long long total_bytes_to_be_sent) { |
| 200 NOTIMPLEMENTED(); | 199 NOTIMPLEMENTED(); |
| 201 } | 200 } |
| 202 | 201 |
| 203 void ResourceMultiBufferDataProvider::didReceiveResponse( | 202 void ResourceMultiBufferDataProvider::didReceiveResponse( |
| 204 WebURLLoader* loader, | |
| 205 const WebURLResponse& response) { | 203 const WebURLResponse& response) { |
| 206 #if ENABLE_DLOG | 204 #if ENABLE_DLOG |
| 207 string version; | 205 string version; |
| 208 switch (response.httpVersion()) { | 206 switch (response.httpVersion()) { |
| 209 case WebURLResponse::HTTPVersion_0_9: | 207 case WebURLResponse::HTTPVersion_0_9: |
| 210 version = "0.9"; | 208 version = "0.9"; |
| 211 break; | 209 break; |
| 212 case WebURLResponse::HTTPVersion_1_0: | 210 case WebURLResponse::HTTPVersion_1_0: |
| 213 version = "1.0"; | 211 version = "1.0"; |
| 214 break; | 212 break; |
| (...skipping 136 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 351 url_data_->Fail(); | 349 url_data_->Fail(); |
| 352 return; // "this" may be deleted now. | 350 return; // "this" may be deleted now. |
| 353 } | 351 } |
| 354 | 352 |
| 355 if (end_of_file) { | 353 if (end_of_file) { |
| 356 fifo_.push_back(DataBuffer::CreateEOSBuffer()); | 354 fifo_.push_back(DataBuffer::CreateEOSBuffer()); |
| 357 url_data_->multibuffer()->OnDataProviderEvent(this); | 355 url_data_->multibuffer()->OnDataProviderEvent(this); |
| 358 } | 356 } |
| 359 } | 357 } |
| 360 | 358 |
| 361 void ResourceMultiBufferDataProvider::didReceiveData(WebURLLoader* loader, | 359 void ResourceMultiBufferDataProvider::didReceiveData(const char* data, |
| 362 const char* data, | 360 int data_length) { |
| 363 int data_length, | |
| 364 int encoded_data_length, | |
| 365 int encoded_body_length) { | |
| 366 DVLOG(1) << "didReceiveData: " << data_length << " bytes"; | 361 DVLOG(1) << "didReceiveData: " << data_length << " bytes"; |
| 367 DCHECK(!Available()); | 362 DCHECK(!Available()); |
| 368 DCHECK(active_loader_); | 363 DCHECK(active_loader_); |
| 369 DCHECK_GT(data_length, 0); | 364 DCHECK_GT(data_length, 0); |
| 370 | 365 |
| 371 // When we receive data, we allow more retries. | 366 // When we receive data, we allow more retries. |
| 372 retries_ = 0; | 367 retries_ = 0; |
| 373 | 368 |
| 374 while (data_length) { | 369 while (data_length) { |
| 375 if (fifo_.empty() || fifo_.back()->data_size() == block_size()) { | 370 if (fifo_.empty() || fifo_.back()->data_size() == block_size()) { |
| 376 fifo_.push_back(new DataBuffer(block_size())); | 371 fifo_.push_back(new DataBuffer(block_size())); |
| 377 fifo_.back()->set_data_size(0); | 372 fifo_.back()->set_data_size(0); |
| 378 } | 373 } |
| 379 int last_block_size = fifo_.back()->data_size(); | 374 int last_block_size = fifo_.back()->data_size(); |
| 380 int to_append = std::min<int>(data_length, block_size() - last_block_size); | 375 int to_append = std::min<int>(data_length, block_size() - last_block_size); |
| 381 DCHECK_GT(to_append, 0); | 376 DCHECK_GT(to_append, 0); |
| 382 memcpy(fifo_.back()->writable_data() + last_block_size, data, to_append); | 377 memcpy(fifo_.back()->writable_data() + last_block_size, data, to_append); |
| 383 data += to_append; | 378 data += to_append; |
| 384 fifo_.back()->set_data_size(last_block_size + to_append); | 379 fifo_.back()->set_data_size(last_block_size + to_append); |
| 385 data_length -= to_append; | 380 data_length -= to_append; |
| 386 } | 381 } |
| 387 | 382 |
| 388 url_data_->multibuffer()->OnDataProviderEvent(this); | 383 url_data_->multibuffer()->OnDataProviderEvent(this); |
| 389 | 384 |
| 390 // Beware, this object might be deleted here. | 385 // Beware, this object might be deleted here. |
| 391 } | 386 } |
| 392 | 387 |
| 393 void ResourceMultiBufferDataProvider::didDownloadData(WebURLLoader* loader, | 388 void ResourceMultiBufferDataProvider::didDownloadData(int dataLength) { |
| 394 int dataLength, | |
| 395 int encoded_data_length) { | |
| 396 NOTIMPLEMENTED(); | 389 NOTIMPLEMENTED(); |
| 397 } | 390 } |
| 398 | 391 |
| 399 void ResourceMultiBufferDataProvider::didReceiveCachedMetadata( | 392 void ResourceMultiBufferDataProvider::didReceiveCachedMetadata( |
| 400 WebURLLoader* loader, | |
| 401 const char* data, | 393 const char* data, |
| 402 int data_length) { | 394 int data_length) { |
| 403 NOTIMPLEMENTED(); | 395 NOTIMPLEMENTED(); |
| 404 } | 396 } |
| 405 | 397 |
| 406 void ResourceMultiBufferDataProvider::didFinishLoading( | 398 void ResourceMultiBufferDataProvider::didFinishLoading(double finishTime) { |
| 407 WebURLLoader* loader, | |
| 408 double finishTime, | |
| 409 int64_t total_encoded_data_length) { | |
| 410 DVLOG(1) << "didFinishLoading"; | 399 DVLOG(1) << "didFinishLoading"; |
| 411 DCHECK(active_loader_.get()); | 400 DCHECK(active_loader_.get()); |
| 412 DCHECK(!Available()); | 401 DCHECK(!Available()); |
| 413 | 402 |
| 414 // We're done with the loader. | 403 // We're done with the loader. |
| 415 active_loader_.reset(); | 404 active_loader_.reset(); |
| 416 | 405 |
| 417 // If we didn't know the |instance_size_| we do now. | 406 // If we didn't know the |instance_size_| we do now. |
| 418 int64_t size = byte_pos(); | 407 int64_t size = byte_pos(); |
| 419 | 408 |
| (...skipping 18 matching lines...) Expand all Loading... |
| 438 | 427 |
| 439 url_data_->set_length(size); | 428 url_data_->set_length(size); |
| 440 fifo_.push_back(DataBuffer::CreateEOSBuffer()); | 429 fifo_.push_back(DataBuffer::CreateEOSBuffer()); |
| 441 | 430 |
| 442 DCHECK(Available()); | 431 DCHECK(Available()); |
| 443 url_data_->multibuffer()->OnDataProviderEvent(this); | 432 url_data_->multibuffer()->OnDataProviderEvent(this); |
| 444 | 433 |
| 445 // Beware, this object might be deleted here. | 434 // Beware, this object might be deleted here. |
| 446 } | 435 } |
| 447 | 436 |
| 448 void ResourceMultiBufferDataProvider::didFail(WebURLLoader* loader, | 437 void ResourceMultiBufferDataProvider::didFail(const WebURLError& error) { |
| 449 const WebURLError& error) { | |
| 450 DVLOG(1) << "didFail: reason=" << error.reason | 438 DVLOG(1) << "didFail: reason=" << error.reason |
| 451 << ", isCancellation=" << error.isCancellation | 439 << ", isCancellation=" << error.isCancellation |
| 452 << ", domain=" << error.domain.utf8().data() | 440 << ", domain=" << error.domain.utf8().data() |
| 453 << ", localizedDescription=" | 441 << ", localizedDescription=" |
| 454 << error.localizedDescription.utf8().data(); | 442 << error.localizedDescription.utf8().data(); |
| 455 DCHECK(active_loader_.get()); | 443 DCHECK(active_loader_.get()); |
| 456 | 444 |
| 457 if (retries_ < kMaxRetries && pos_ != 0) { | 445 if (retries_ < kMaxRetries && pos_ != 0) { |
| 458 retries_++; | 446 retries_++; |
| 459 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask( | 447 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask( |
| (...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 547 } | 535 } |
| 548 | 536 |
| 549 if (byte_pos() != first_byte_position) { | 537 if (byte_pos() != first_byte_position) { |
| 550 return false; | 538 return false; |
| 551 } | 539 } |
| 552 | 540 |
| 553 return true; | 541 return true; |
| 554 } | 542 } |
| 555 | 543 |
| 556 } // namespace media | 544 } // namespace media |
| OLD | NEW |