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" 141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "media/blink/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" 176e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "third_party/WebKit/public/web/WebDocument.h" 187dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "url/gurl.h" 197d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 20f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)namespace blink { 217d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)class WebFrame; 227d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)class WebURLLoader; 237d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)class WebURLRequest; 247d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 257d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 26eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochnamespace content { 277d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 287d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// This class provides additional information about a media URL. Currently it 297d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// can be used to determine if a media URL has a single security origin and 307d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// whether the URL passes a CORS access check. 31f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)class CONTENT_EXPORT MediaInfoLoader : private blink::WebURLLoaderClient { 327d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) public: 337d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // Status codes for start operations on MediaInfoLoader. 347d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) enum Status { 357d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // The operation failed, which may have been due to: 367d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // - Page navigation 377d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // - Server replied 4xx/5xx 387d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // - The response was invalid 397d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // - Connection was terminated 407d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // 417d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // At this point you should delete the loader. 427d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) kFailed, 437d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 447d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // Everything went as planned. 457d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) kOk, 467d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) }; 477d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 486e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) // Callback when MediaInfoLoader finishes loading the url. Args: whether URL 496e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) // is successfully loaded, the final URL destination following all the 506e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) // redirect, the first party URL for the final destination, and whether 516e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) // credentials needs to be sent to the final destination. 526e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) typedef base::Callback<void(Status, const GURL&, const GURL&, bool)> ReadyCB; 536e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 547d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // Start loading information about the given media URL. 557d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // |url| - URL for the media resource to be loaded. 567d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // |cors_mode| - HTML media element's crossorigin attribute. 577d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // |ready_cb| - Called when media info has finished or failed loading. 587d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) MediaInfoLoader( 597d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) const GURL& url, 60f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebMediaPlayer::CORSMode cors_mode, 617d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) const ReadyCB& ready_cb); 627d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) virtual ~MediaInfoLoader(); 637d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 647d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // Start loading media info. 65f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) void Start(blink::WebFrame* frame); 667d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 677d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // Returns true if the media resource has a single origin, false otherwise. 687d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // Only valid to call after the loader becomes ready. 697d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) bool HasSingleOrigin() const; 707d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 717d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // Returns true if the media resource passed a CORS access control check. 727d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // Only valid to call after the loader becomes ready. 737d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) bool DidPassCORSAccessCheck() const; 747d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 757d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) private: 767d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) friend class MediaInfoLoaderTest; 777d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 78f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // blink::WebURLLoaderClient implementation. 797d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) virtual void willSendRequest( 80f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebURLLoader* loader, 81f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebURLRequest& newRequest, 82f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const blink::WebURLResponse& redirectResponse); 837d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) virtual void didSendData( 84f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebURLLoader* loader, 857d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) unsigned long long bytesSent, 867d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) unsigned long long totalBytesToBeSent); 877d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) virtual void didReceiveResponse( 88f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebURLLoader* loader, 89f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const blink::WebURLResponse& response); 907d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) virtual void didDownloadData( 91f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebURLLoader* loader, 9258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) int data_length, 9358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) int encodedDataLength); 947d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) virtual void didReceiveData( 95f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebURLLoader* loader, 967d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) const char* data, 977d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) int data_length, 987d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) int encoded_data_length); 997d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) virtual void didReceiveCachedMetadata( 100f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebURLLoader* loader, 1017d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) const char* data, int dataLength); 1027d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) virtual void didFinishLoading( 103f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebURLLoader* loader, 1045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) double finishTime, 1055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int64_t total_encoded_data_length); 1067d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) virtual void didFail( 107f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebURLLoader* loader, 108f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const blink::WebURLError&); 1097d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 1107d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) void DidBecomeReady(Status status); 1117d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 1127d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // Injected WebURLLoader instance for testing purposes. 113f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) scoped_ptr<blink::WebURLLoader> test_loader_; 1147d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 1157d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // Keeps track of an active WebURLLoader and associated state. 1161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_ptr<media::ActiveLoader> active_loader_; 1177d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 1187d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) bool loader_failed_; 1197d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) GURL url_; 1206e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) GURL first_party_url_; 1216e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) bool allow_stored_credentials_; 122f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebMediaPlayer::CORSMode cors_mode_; 1237d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) bool single_origin_; 1247d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 1257d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) ReadyCB ready_cb_; 1267d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) base::TimeTicks start_time_; 1277d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 1287d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(MediaInfoLoader); 1297d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}; 1307d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 131eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} // namespace content 1327d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 133eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#endif // CONTENT_RENDERER_MEDIA_ANDROID_MEDIA_INFO_LOADER_H_ 134