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