media_info_loader.h revision f2477e01787aa58f445919b809d89e252beef54f
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" 147dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "content/renderer/media/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" 177dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "url/gurl.h" 187d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 19f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)namespace blink { 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. 30f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)class CONTENT_EXPORT MediaInfoLoader : private blink::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, 54f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::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. 59f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) void Start(blink::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) 72f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // blink::WebURLLoaderClient implementation. 737d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) virtual void willSendRequest( 74f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebURLLoader* loader, 75f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebURLRequest& newRequest, 76f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const blink::WebURLResponse& redirectResponse); 777d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) virtual void didSendData( 78f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebURLLoader* loader, 797d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) unsigned long long bytesSent, 807d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) unsigned long long totalBytesToBeSent); 817d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) virtual void didReceiveResponse( 82f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebURLLoader* loader, 83f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const blink::WebURLResponse& response); 847d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) virtual void didDownloadData( 85f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebURLLoader* loader, 8658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) int data_length, 8758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) int encodedDataLength); 887d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) virtual void didReceiveData( 89f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebURLLoader* loader, 907d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) const char* data, 917d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) int data_length, 927d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) int encoded_data_length); 937d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) virtual void didReceiveCachedMetadata( 94f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebURLLoader* loader, 957d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) const char* data, int dataLength); 967d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) virtual void didFinishLoading( 97f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebURLLoader* loader, 987d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) double finishTime); 997d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) virtual void didFail( 100f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebURLLoader* loader, 101f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const blink::WebURLError&); 1027d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 1037d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) void DidBecomeReady(Status status); 1047d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 1057d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // Injected WebURLLoader instance for testing purposes. 106f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) scoped_ptr<blink::WebURLLoader> test_loader_; 1077d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 1087d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // Keeps track of an active WebURLLoader and associated state. 1097dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch scoped_ptr<ActiveLoader> active_loader_; 1107d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 1117d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) bool loader_failed_; 1127d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) GURL url_; 113f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebMediaPlayer::CORSMode cors_mode_; 1147d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) bool single_origin_; 1157d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 1167d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) ReadyCB ready_cb_; 1177d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) base::TimeTicks start_time_; 1187d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 1197d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(MediaInfoLoader); 1207d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}; 1217d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 122eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} // namespace content 1237d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 124eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#endif // CONTENT_RENDERER_MEDIA_ANDROID_MEDIA_INFO_LOADER_H_ 125