• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 "media/blink/active_loader.h"
15 #include "third_party/WebKit/public/platform/WebMediaPlayer.h"
16 #include "third_party/WebKit/public/platform/WebURLLoaderClient.h"
17 #include "third_party/WebKit/public/web/WebDocument.h"
18 #include "url/gurl.h"
19 
20 namespace blink {
21 class WebFrame;
22 class WebURLLoader;
23 class WebURLRequest;
24 }
25 
26 namespace content {
27 
28 // This class provides additional information about a media URL. Currently it
29 // can be used to determine if a media URL has a single security origin and
30 // whether the URL passes a CORS access check.
31 class CONTENT_EXPORT MediaInfoLoader : private blink::WebURLLoaderClient {
32  public:
33   // Status codes for start operations on MediaInfoLoader.
34   enum Status {
35     // The operation failed, which may have been due to:
36     //   - Page navigation
37     //   - Server replied 4xx/5xx
38     //   - The response was invalid
39     //   - Connection was terminated
40     //
41     // At this point you should delete the loader.
42     kFailed,
43 
44     // Everything went as planned.
45     kOk,
46   };
47 
48   // Callback when MediaInfoLoader finishes loading the url. Args: whether URL
49   // is successfully loaded, the final URL destination following all the
50   // redirect, the first party URL for the final destination, and whether
51   // credentials needs to be sent to the final destination.
52   typedef base::Callback<void(Status, const GURL&, const GURL&, bool)> ReadyCB;
53 
54   // Start loading information about the given media URL.
55   // |url| - URL for the media resource to be loaded.
56   // |cors_mode| - HTML media element's crossorigin attribute.
57   // |ready_cb| - Called when media info has finished or failed loading.
58   MediaInfoLoader(
59       const GURL& url,
60       blink::WebMediaPlayer::CORSMode cors_mode,
61       const ReadyCB& ready_cb);
62   virtual ~MediaInfoLoader();
63 
64   // Start loading media info.
65   void Start(blink::WebFrame* frame);
66 
67   // Returns true if the media resource has a single origin, false otherwise.
68   // Only valid to call after the loader becomes ready.
69   bool HasSingleOrigin() const;
70 
71   // Returns true if the media resource passed a CORS access control check.
72   // Only valid to call after the loader becomes ready.
73   bool DidPassCORSAccessCheck() const;
74 
75  private:
76   friend class MediaInfoLoaderTest;
77 
78   // blink::WebURLLoaderClient implementation.
79   virtual void willSendRequest(
80       blink::WebURLLoader* loader,
81       blink::WebURLRequest& newRequest,
82       const blink::WebURLResponse& redirectResponse);
83   virtual void didSendData(
84       blink::WebURLLoader* loader,
85       unsigned long long bytesSent,
86       unsigned long long totalBytesToBeSent);
87   virtual void didReceiveResponse(
88       blink::WebURLLoader* loader,
89       const blink::WebURLResponse& response);
90   virtual void didDownloadData(
91       blink::WebURLLoader* loader,
92       int data_length,
93       int encodedDataLength);
94   virtual void didReceiveData(
95       blink::WebURLLoader* loader,
96       const char* data,
97       int data_length,
98       int encoded_data_length);
99   virtual void didReceiveCachedMetadata(
100       blink::WebURLLoader* loader,
101       const char* data, int dataLength);
102   virtual void didFinishLoading(
103       blink::WebURLLoader* loader,
104       double finishTime,
105       int64_t total_encoded_data_length);
106   virtual void didFail(
107       blink::WebURLLoader* loader,
108       const blink::WebURLError&);
109 
110   void DidBecomeReady(Status status);
111 
112   // Injected WebURLLoader instance for testing purposes.
113   scoped_ptr<blink::WebURLLoader> test_loader_;
114 
115   // Keeps track of an active WebURLLoader and associated state.
116   scoped_ptr<media::ActiveLoader> active_loader_;
117 
118   bool loader_failed_;
119   GURL url_;
120   GURL first_party_url_;
121   bool allow_stored_credentials_;
122   blink::WebMediaPlayer::CORSMode cors_mode_;
123   bool single_origin_;
124 
125   ReadyCB ready_cb_;
126   base::TimeTicks start_time_;
127 
128   DISALLOW_COPY_AND_ASSIGN(MediaInfoLoader);
129 };
130 
131 }  // namespace content
132 
133 #endif  // CONTENT_RENDERER_MEDIA_ANDROID_MEDIA_INFO_LOADER_H_
134