media_info_loader.h revision eb525c5499e34cc9c4b825d6d9e75bb07cc06ace
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" 147d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "googleurl/src/gurl.h" 157d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/platform/WebURLLoaderClient.h" 16eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "third_party/WebKit/public/web/WebMediaPlayer.h" 177d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "webkit/renderer/media/active_loader.h" 187d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 197d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)namespace WebKit { 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. 30eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochclass CONTENT_EXPORT MediaInfoLoader : private WebKit::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, 547d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) WebKit::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. 597d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) void Start(WebKit::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) 727d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // WebKit::WebURLLoaderClient implementation. 737d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) virtual void willSendRequest( 747d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) WebKit::WebURLLoader* loader, 757d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) WebKit::WebURLRequest& newRequest, 767d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) const WebKit::WebURLResponse& redirectResponse); 777d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) virtual void didSendData( 787d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) WebKit::WebURLLoader* loader, 797d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) unsigned long long bytesSent, 807d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) unsigned long long totalBytesToBeSent); 817d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) virtual void didReceiveResponse( 827d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) WebKit::WebURLLoader* loader, 837d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) const WebKit::WebURLResponse& response); 847d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) virtual void didDownloadData( 857d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) WebKit::WebURLLoader* loader, 867d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) int data_length); 877d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) virtual void didReceiveData( 887d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) WebKit::WebURLLoader* loader, 897d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) const char* data, 907d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) int data_length, 917d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) int encoded_data_length); 927d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) virtual void didReceiveCachedMetadata( 937d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) WebKit::WebURLLoader* loader, 947d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) const char* data, int dataLength); 957d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) virtual void didFinishLoading( 967d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) WebKit::WebURLLoader* loader, 977d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) double finishTime); 987d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) virtual void didFail( 997d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) WebKit::WebURLLoader* loader, 1007d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) const WebKit::WebURLError&); 1017d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 1027d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) void DidBecomeReady(Status status); 1037d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 1047d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // Injected WebURLLoader instance for testing purposes. 1057d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) scoped_ptr<WebKit::WebURLLoader> test_loader_; 1067d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 1077d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // Keeps track of an active WebURLLoader and associated state. 108eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch scoped_ptr<webkit_media::ActiveLoader> active_loader_; 1097d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 1107d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) bool loader_failed_; 1117d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) GURL url_; 1127d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) WebKit::WebMediaPlayer::CORSMode cors_mode_; 1137d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) bool single_origin_; 1147d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 1157d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) ReadyCB ready_cb_; 1167d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) base::TimeTicks start_time_; 1177d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 1187d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(MediaInfoLoader); 1197d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}; 1207d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 121eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} // namespace content 1227d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 123eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#endif // CONTENT_RENDERER_MEDIA_ANDROID_MEDIA_INFO_LOADER_H_ 124