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/WebMediaPlayer.h"
     16 #include "third_party/WebKit/public/platform/WebURLLoaderClient.h"
     17 #include "url/gurl.h"
     18 
     19 namespace blink {
     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 blink::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       blink::WebMediaPlayer::CORSMode cors_mode,
     55       const ReadyCB& ready_cb);
     56   virtual ~MediaInfoLoader();
     57 
     58   // Start loading media info.
     59   void Start(blink::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   // blink::WebURLLoaderClient implementation.
     73   virtual void willSendRequest(
     74       blink::WebURLLoader* loader,
     75       blink::WebURLRequest& newRequest,
     76       const blink::WebURLResponse& redirectResponse);
     77   virtual void didSendData(
     78       blink::WebURLLoader* loader,
     79       unsigned long long bytesSent,
     80       unsigned long long totalBytesToBeSent);
     81   virtual void didReceiveResponse(
     82       blink::WebURLLoader* loader,
     83       const blink::WebURLResponse& response);
     84   virtual void didDownloadData(
     85       blink::WebURLLoader* loader,
     86       int data_length,
     87       int encodedDataLength);
     88   virtual void didReceiveData(
     89       blink::WebURLLoader* loader,
     90       const char* data,
     91       int data_length,
     92       int encoded_data_length);
     93   virtual void didReceiveCachedMetadata(
     94       blink::WebURLLoader* loader,
     95       const char* data, int dataLength);
     96   virtual void didFinishLoading(
     97       blink::WebURLLoader* loader,
     98       double finishTime);
     99   virtual void didFail(
    100       blink::WebURLLoader* loader,
    101       const blink::WebURLError&);
    102 
    103   void DidBecomeReady(Status status);
    104 
    105   // Injected WebURLLoader instance for testing purposes.
    106   scoped_ptr<blink::WebURLLoader> test_loader_;
    107 
    108   // Keeps track of an active WebURLLoader and associated state.
    109   scoped_ptr<ActiveLoader> active_loader_;
    110 
    111   bool loader_failed_;
    112   GURL url_;
    113   blink::WebMediaPlayer::CORSMode cors_mode_;
    114   bool single_origin_;
    115 
    116   ReadyCB ready_cb_;
    117   base::TimeTicks start_time_;
    118 
    119   DISALLOW_COPY_AND_ASSIGN(MediaInfoLoader);
    120 };
    121 
    122 }  // namespace content
    123 
    124 #endif  // CONTENT_RENDERER_MEDIA_ANDROID_MEDIA_INFO_LOADER_H_
    125