media_info_loader.h revision f2477e01787aa58f445919b809d89e252beef54f
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#ifndef CONTENT_RENDERER_MEDIA_ANDROID_MEDIA_INFO_LOADER_H_
6eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#define CONTENT_RENDERER_MEDIA_ANDROID_MEDIA_INFO_LOADER_H_
77d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
87d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include <string>
97d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
107d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "base/callback.h"
117d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
12eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/time/time.h"
13eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "content/common/content_export.h"
147dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "content/renderer/media/active_loader.h"
15f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "third_party/WebKit/public/platform/WebMediaPlayer.h"
167d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/platform/WebURLLoaderClient.h"
177dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "url/gurl.h"
187d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
19f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)namespace blink {
207d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)class WebFrame;
217d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)class WebURLLoader;
227d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)class WebURLRequest;
237d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
247d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
25eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochnamespace content {
267d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
277d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// This class provides additional information about a media URL. Currently it
287d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// can be used to determine if a media URL has a single security origin and
297d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// whether the URL passes a CORS access check.
30f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)class CONTENT_EXPORT MediaInfoLoader : private blink::WebURLLoaderClient {
317d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) public:
327d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // Status codes for start operations on MediaInfoLoader.
337d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  enum Status {
347d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    // The operation failed, which may have been due to:
357d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    //   - Page navigation
367d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    //   - Server replied 4xx/5xx
377d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    //   - The response was invalid
387d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    //   - Connection was terminated
397d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    //
407d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    // At this point you should delete the loader.
417d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    kFailed,
427d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
437d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    // Everything went as planned.
447d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    kOk,
457d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  };
467d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
477d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // Start loading information about the given media URL.
487d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // |url| - URL for the media resource to be loaded.
497d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // |cors_mode| - HTML media element's crossorigin attribute.
507d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // |ready_cb| - Called when media info has finished or failed loading.
517d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  typedef base::Callback<void(Status)> ReadyCB;
527d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  MediaInfoLoader(
537d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      const GURL& url,
54f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      blink::WebMediaPlayer::CORSMode cors_mode,
557d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      const ReadyCB& ready_cb);
567d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  virtual ~MediaInfoLoader();
577d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
587d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // Start loading media info.
59f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  void Start(blink::WebFrame* frame);
607d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
617d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // Returns true if the media resource has a single origin, false otherwise.
627d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // Only valid to call after the loader becomes ready.
637d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  bool HasSingleOrigin() const;
647d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
657d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // Returns true if the media resource passed a CORS access control check.
667d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // Only valid to call after the loader becomes ready.
677d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  bool DidPassCORSAccessCheck() const;
687d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
697d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) private:
707d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  friend class MediaInfoLoaderTest;
717d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
72f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // blink::WebURLLoaderClient implementation.
737d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  virtual void willSendRequest(
74f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      blink::WebURLLoader* loader,
75f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      blink::WebURLRequest& newRequest,
76f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      const blink::WebURLResponse& redirectResponse);
777d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  virtual void didSendData(
78f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      blink::WebURLLoader* loader,
797d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      unsigned long long bytesSent,
807d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      unsigned long long totalBytesToBeSent);
817d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  virtual void didReceiveResponse(
82f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      blink::WebURLLoader* loader,
83f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      const blink::WebURLResponse& response);
847d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  virtual void didDownloadData(
85f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      blink::WebURLLoader* loader,
8658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      int data_length,
8758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      int encodedDataLength);
887d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  virtual void didReceiveData(
89f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      blink::WebURLLoader* loader,
907d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      const char* data,
917d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      int data_length,
927d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      int encoded_data_length);
937d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  virtual void didReceiveCachedMetadata(
94f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      blink::WebURLLoader* loader,
957d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      const char* data, int dataLength);
967d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  virtual void didFinishLoading(
97f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      blink::WebURLLoader* loader,
987d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      double finishTime);
997d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  virtual void didFail(
100f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      blink::WebURLLoader* loader,
101f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      const blink::WebURLError&);
1027d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1037d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  void DidBecomeReady(Status status);
1047d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1057d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // Injected WebURLLoader instance for testing purposes.
106f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  scoped_ptr<blink::WebURLLoader> test_loader_;
1077d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1087d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // Keeps track of an active WebURLLoader and associated state.
1097dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  scoped_ptr<ActiveLoader> active_loader_;
1107d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1117d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  bool loader_failed_;
1127d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  GURL url_;
113f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  blink::WebMediaPlayer::CORSMode cors_mode_;
1147d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  bool single_origin_;
1157d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1167d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  ReadyCB ready_cb_;
1177d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  base::TimeTicks start_time_;
1187d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1197d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(MediaInfoLoader);
1207d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)};
1217d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
122eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}  // namespace content
1237d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
124eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#endif  // CONTENT_RENDERER_MEDIA_ANDROID_MEDIA_INFO_LOADER_H_
125