Home | History | Annotate | Download | only in android
      1 // Copyright 2013 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #ifndef CONTENT_RENDERER_MEDIA_ANDROID_MEDIA_INFO_LOADER_H_
      6 #define CONTENT_RENDERER_MEDIA_ANDROID_MEDIA_INFO_LOADER_H_
      7 
      8 #include <string>
      9 
     10 #include "base/callback.h"
     11 #include "base/memory/scoped_ptr.h"
     12 #include "base/time/time.h"
     13 #include "content/common/content_export.h"
     14 #include "content/renderer/media/active_loader.h"
     15 #include "third_party/WebKit/public/platform/WebURLLoaderClient.h"
     16 #include "third_party/WebKit/public/web/WebMediaPlayer.h"
     17 #include "url/gurl.h"
     18 
     19 namespace WebKit {
     20 class WebFrame;
     21 class WebURLLoader;
     22 class WebURLRequest;
     23 }
     24 
     25 namespace content {
     26 
     27 // This class provides additional information about a media URL. Currently it
     28 // can be used to determine if a media URL has a single security origin and
     29 // whether the URL passes a CORS access check.
     30 class CONTENT_EXPORT MediaInfoLoader : private WebKit::WebURLLoaderClient {
     31  public:
     32   // Status codes for start operations on MediaInfoLoader.
     33   enum Status {
     34     // The operation failed, which may have been due to:
     35     //   - Page navigation
     36     //   - Server replied 4xx/5xx
     37     //   - The response was invalid
     38     //   - Connection was terminated
     39     //
     40     // At this point you should delete the loader.
     41     kFailed,
     42 
     43     // Everything went as planned.
     44     kOk,
     45   };
     46 
     47   // Start loading information about the given media URL.
     48   // |url| - URL for the media resource to be loaded.
     49   // |cors_mode| - HTML media element's crossorigin attribute.
     50   // |ready_cb| - Called when media info has finished or failed loading.
     51   typedef base::Callback<void(Status)> ReadyCB;
     52   MediaInfoLoader(
     53       const GURL& url,
     54       WebKit::WebMediaPlayer::CORSMode cors_mode,
     55       const ReadyCB& ready_cb);
     56   virtual ~MediaInfoLoader();
     57 
     58   // Start loading media info.
     59   void Start(WebKit::WebFrame* frame);
     60 
     61   // Returns true if the media resource has a single origin, false otherwise.
     62   // Only valid to call after the loader becomes ready.
     63   bool HasSingleOrigin() const;
     64 
     65   // Returns true if the media resource passed a CORS access control check.
     66   // Only valid to call after the loader becomes ready.
     67   bool DidPassCORSAccessCheck() const;
     68 
     69  private:
     70   friend class MediaInfoLoaderTest;
     71 
     72   // WebKit::WebURLLoaderClient implementation.
     73   virtual void willSendRequest(
     74       WebKit::WebURLLoader* loader,
     75       WebKit::WebURLRequest& newRequest,
     76       const WebKit::WebURLResponse& redirectResponse);
     77   virtual void didSendData(
     78       WebKit::WebURLLoader* loader,
     79       unsigned long long bytesSent,
     80       unsigned long long totalBytesToBeSent);
     81   virtual void didReceiveResponse(
     82       WebKit::WebURLLoader* loader,
     83       const WebKit::WebURLResponse& response);
     84   virtual void didDownloadData(
     85       WebKit::WebURLLoader* loader,
     86       int data_length);
     87   virtual void didReceiveData(
     88       WebKit::WebURLLoader* loader,
     89       const char* data,
     90       int data_length,
     91       int encoded_data_length);
     92   virtual void didReceiveCachedMetadata(
     93       WebKit::WebURLLoader* loader,
     94       const char* data, int dataLength);
     95   virtual void didFinishLoading(
     96       WebKit::WebURLLoader* loader,
     97       double finishTime);
     98   virtual void didFail(
     99       WebKit::WebURLLoader* loader,
    100       const WebKit::WebURLError&);
    101 
    102   void DidBecomeReady(Status status);
    103 
    104   // Injected WebURLLoader instance for testing purposes.
    105   scoped_ptr<WebKit::WebURLLoader> test_loader_;
    106 
    107   // Keeps track of an active WebURLLoader and associated state.
    108   scoped_ptr<ActiveLoader> active_loader_;
    109 
    110   bool loader_failed_;
    111   GURL url_;
    112   WebKit::WebMediaPlayer::CORSMode cors_mode_;
    113   bool single_origin_;
    114 
    115   ReadyCB ready_cb_;
    116   base::TimeTicks start_time_;
    117 
    118   DISALLOW_COPY_AND_ASSIGN(MediaInfoLoader);
    119 };
    120 
    121 }  // namespace content
    122 
    123 #endif  // CONTENT_RENDERER_MEDIA_ANDROID_MEDIA_INFO_LOADER_H_
    124