17d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved. 27d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 37d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// found in the LICENSE file. 47d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 5eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "content/renderer/media/android/media_info_loader.h" 67d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 77d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "base/bits.h" 87d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "base/callback_helpers.h" 97d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "base/metrics/histogram.h" 107d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/platform/WebURLError.h" 117d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/platform/WebURLLoader.h" 127d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/platform/WebURLResponse.h" 13eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "third_party/WebKit/public/web/WebFrame.h" 147d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 15f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebFrame; 16f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebURLError; 17f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebURLLoader; 18f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebURLLoaderOptions; 19f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebURLRequest; 20f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebURLResponse; 217d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 22eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochnamespace content { 237d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 247d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)static const int kHttpOK = 200; 251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic const int kHttpPartialContentOK = 206; 267d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 277d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)MediaInfoLoader::MediaInfoLoader( 287d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) const GURL& url, 29f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebMediaPlayer::CORSMode cors_mode, 307d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) const ReadyCB& ready_cb) 317d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) : loader_failed_(false), 327d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) url_(url), 336e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) allow_stored_credentials_(false), 347d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) cors_mode_(cors_mode), 357d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) single_origin_(true), 367d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) ready_cb_(ready_cb) {} 377d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 387d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)MediaInfoLoader::~MediaInfoLoader() {} 397d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 40f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void MediaInfoLoader::Start(blink::WebFrame* frame) { 417d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // Make sure we have not started. 427d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) DCHECK(!ready_cb_.is_null()); 437d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) CHECK(frame); 447d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 457d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) start_time_ = base::TimeTicks::Now(); 466e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) first_party_url_ = frame->document().firstPartyForCookies(); 477d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 487d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // Prepare the request. 497d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) WebURLRequest request(url_); 505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // TODO(mkwst): Split this into video/audio. 515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) request.setRequestContext(WebURLRequest::RequestContextVideo); 52f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) frame->setReferrerForRequest(request, blink::WebURL()); 537d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Since we don't actually care about the media data at this time, use a two 551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // byte range request to avoid unnecessarily downloading resources. Not all 561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // servers support HEAD unfortunately, so use a range request; which is no 571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // worse than the previous request+cancel code. See http://crbug.com/400788 581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci request.addHTTPHeaderField("Range", "bytes=0-1"); 591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 607d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) scoped_ptr<WebURLLoader> loader; 617d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (test_loader_) { 627d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) loader = test_loader_.Pass(); 637d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } else { 647d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) WebURLLoaderOptions options; 65f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (cors_mode_ == blink::WebMediaPlayer::CORSModeUnspecified) { 667d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) options.allowCredentials = true; 677d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) options.crossOriginRequestPolicy = 687d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) WebURLLoaderOptions::CrossOriginRequestPolicyAllow; 696e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) allow_stored_credentials_ = true; 707d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } else { 717d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) options.exposeAllResponseHeaders = true; 72f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // The author header set is empty, no preflight should go ahead. 73f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) options.preflightPolicy = WebURLLoaderOptions::PreventPreflight; 747d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) options.crossOriginRequestPolicy = 757d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) WebURLLoaderOptions::CrossOriginRequestPolicyUseAccessControl; 766e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) if (cors_mode_ == blink::WebMediaPlayer::CORSModeUseCredentials) { 777d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) options.allowCredentials = true; 786e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) allow_stored_credentials_ = true; 796e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) } 807d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } 817d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) loader.reset(frame->createAssociatedURLLoader(options)); 827d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } 837d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 847d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // Start the resource loading. 857d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) loader->loadAsynchronously(request, this); 861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci active_loader_.reset(new media::ActiveLoader(loader.Pass())); 877d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 887d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 897d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)///////////////////////////////////////////////////////////////////////////// 90f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// blink::WebURLLoaderClient implementation. 917d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)void MediaInfoLoader::willSendRequest( 927d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) WebURLLoader* loader, 937d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) WebURLRequest& newRequest, 947d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) const WebURLResponse& redirectResponse) { 957d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // The load may have been stopped and |ready_cb| is destroyed. 967d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // In this case we shouldn't do anything. 977d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (ready_cb_.is_null()) { 987d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // Set the url in the request to an invalid value (empty url). 99f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) newRequest.setURL(blink::WebURL()); 1007d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return; 1017d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } 1027d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 1037d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // Only allow |single_origin_| if we haven't seen a different origin yet. 1047d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (single_origin_) 1057d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) single_origin_ = url_.GetOrigin() == GURL(newRequest.url()).GetOrigin(); 1067d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 1077d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) url_ = newRequest.url(); 1086e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) first_party_url_ = newRequest.firstPartyForCookies(); 1096e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) allow_stored_credentials_ = newRequest.allowStoredCredentials(); 1107d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 1117d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 1127d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)void MediaInfoLoader::didSendData( 1137d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) WebURLLoader* loader, 1147d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) unsigned long long bytes_sent, 1157d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) unsigned long long total_bytes_to_be_sent) { 1167d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) NOTIMPLEMENTED(); 1177d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 1187d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 1197d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)void MediaInfoLoader::didReceiveResponse( 1207d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) WebURLLoader* loader, 1217d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) const WebURLResponse& response) { 1227d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) DVLOG(1) << "didReceiveResponse: HTTP/" 1237d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) << (response.httpVersion() == WebURLResponse::HTTP_0_9 ? "0.9" : 1247d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) response.httpVersion() == WebURLResponse::HTTP_1_0 ? "1.0" : 1257d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) response.httpVersion() == WebURLResponse::HTTP_1_1 ? "1.1" : 1267d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) "Unknown") 1277d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) << " " << response.httpStatusCode(); 1287d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) DCHECK(active_loader_.get()); 1291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!url_.SchemeIs(url::kHttpScheme) && !url_.SchemeIs(url::kHttpsScheme)) { 130a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) DidBecomeReady(kOk); 131a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return; 132a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 1331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (response.httpStatusCode() == kHttpOK || 1341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci response.httpStatusCode() == kHttpPartialContentOK) { 1357d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) DidBecomeReady(kOk); 1367d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return; 1377d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } 1387d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) loader_failed_ = true; 1397d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) DidBecomeReady(kFailed); 1407d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 1417d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 1427d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)void MediaInfoLoader::didReceiveData( 1437d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) WebURLLoader* loader, 1447d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) const char* data, 1457d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) int data_length, 1467d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) int encoded_data_length) { 1477d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // Ignored. 1487d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 1497d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 1507d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)void MediaInfoLoader::didDownloadData( 151f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebURLLoader* loader, 15258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) int dataLength, 15358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) int encodedDataLength) { 1547d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) NOTIMPLEMENTED(); 1557d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 1567d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 1577d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)void MediaInfoLoader::didReceiveCachedMetadata( 1587d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) WebURLLoader* loader, 1597d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) const char* data, 1607d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) int data_length) { 1617d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) NOTIMPLEMENTED(); 1627d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 1637d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 1647d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)void MediaInfoLoader::didFinishLoading( 1657d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) WebURLLoader* loader, 1665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) double finishTime, 1675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int64_t total_encoded_data_length) { 1687d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) DCHECK(active_loader_.get()); 1697d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) DidBecomeReady(kOk); 1707d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 1717d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 1727d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)void MediaInfoLoader::didFail( 1737d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) WebURLLoader* loader, 1747d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) const WebURLError& error) { 1757d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) DVLOG(1) << "didFail: reason=" << error.reason 1767d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) << ", isCancellation=" << error.isCancellation 1777d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) << ", domain=" << error.domain.utf8().data() 1787d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) << ", localizedDescription=" 1797d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) << error.localizedDescription.utf8().data(); 1807d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) DCHECK(active_loader_.get()); 1817d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) loader_failed_ = true; 1827d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) DidBecomeReady(kFailed); 1837d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 1847d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 1857d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)bool MediaInfoLoader::HasSingleOrigin() const { 1867d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) DCHECK(ready_cb_.is_null()) 1877d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) << "Must become ready before calling HasSingleOrigin()"; 1887d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return single_origin_; 1897d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 1907d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 1917d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)bool MediaInfoLoader::DidPassCORSAccessCheck() const { 1927d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) DCHECK(ready_cb_.is_null()) 1937d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) << "Must become ready before calling DidPassCORSAccessCheck()"; 1947d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return !loader_failed_ && 195f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) cors_mode_ != blink::WebMediaPlayer::CORSModeUnspecified; 1967d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 1977d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 1987d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)///////////////////////////////////////////////////////////////////////////// 1997d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// Helper methods. 2007d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 2017d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)void MediaInfoLoader::DidBecomeReady(Status status) { 2027d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) UMA_HISTOGRAM_TIMES("Media.InfoLoadDelay", 2037d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) base::TimeTicks::Now() - start_time_); 2047d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) active_loader_.reset(); 2057d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (!ready_cb_.is_null()) 2066e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) base::ResetAndReturn(&ready_cb_).Run(status, url_, first_party_url_, 2076e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) allow_stored_credentials_); 2087d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 2097d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 210eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} // namespace content 211