media_info_loader.h revision eb525c5499e34cc9c4b825d6d9e75bb07cc06ace
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"
147d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "googleurl/src/gurl.h"
157d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/platform/WebURLLoaderClient.h"
16eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "third_party/WebKit/public/web/WebMediaPlayer.h"
177d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "webkit/renderer/media/active_loader.h"
187d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
197d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)namespace WebKit {
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.
30eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochclass CONTENT_EXPORT MediaInfoLoader : private WebKit::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,
547d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      WebKit::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.
597d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  void Start(WebKit::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)
727d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // WebKit::WebURLLoaderClient implementation.
737d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  virtual void willSendRequest(
747d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      WebKit::WebURLLoader* loader,
757d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      WebKit::WebURLRequest& newRequest,
767d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      const WebKit::WebURLResponse& redirectResponse);
777d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  virtual void didSendData(
787d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      WebKit::WebURLLoader* loader,
797d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      unsigned long long bytesSent,
807d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      unsigned long long totalBytesToBeSent);
817d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  virtual void didReceiveResponse(
827d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      WebKit::WebURLLoader* loader,
837d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      const WebKit::WebURLResponse& response);
847d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  virtual void didDownloadData(
857d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      WebKit::WebURLLoader* loader,
867d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      int data_length);
877d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  virtual void didReceiveData(
887d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      WebKit::WebURLLoader* loader,
897d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      const char* data,
907d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      int data_length,
917d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      int encoded_data_length);
927d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  virtual void didReceiveCachedMetadata(
937d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      WebKit::WebURLLoader* loader,
947d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      const char* data, int dataLength);
957d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  virtual void didFinishLoading(
967d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      WebKit::WebURLLoader* loader,
977d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      double finishTime);
987d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  virtual void didFail(
997d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      WebKit::WebURLLoader* loader,
1007d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      const WebKit::WebURLError&);
1017d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1027d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  void DidBecomeReady(Status status);
1037d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1047d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // Injected WebURLLoader instance for testing purposes.
1057d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  scoped_ptr<WebKit::WebURLLoader> test_loader_;
1067d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1077d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // Keeps track of an active WebURLLoader and associated state.
108eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  scoped_ptr<webkit_media::ActiveLoader> active_loader_;
1097d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1107d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  bool loader_failed_;
1117d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  GURL url_;
1127d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  WebKit::WebMediaPlayer::CORSMode cors_mode_;
1137d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  bool single_origin_;
1147d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1157d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  ReadyCB ready_cb_;
1167d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  base::TimeTicks start_time_;
1177d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1187d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(MediaInfoLoader);
1197d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)};
1207d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
121eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}  // namespace content
1227d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
123eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#endif  // CONTENT_RENDERER_MEDIA_ANDROID_MEDIA_INFO_LOADER_H_
124