// Copyright (c) 2011 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // An extremely simple implementation of DataSource that downloads the entire // media resource into memory before signaling that initialization has finished. // Primarily used to test <audio> and <video> with buffering/caching removed // from the equation. #ifndef WEBKIT_GLUE_MEDIA_SIMPLE_DATA_SOURCE_H_ #define WEBKIT_GLUE_MEDIA_SIMPLE_DATA_SOURCE_H_ #include <algorithm> #include <string> #include "base/memory/scoped_ptr.h" #include "base/message_loop.h" #include "media/base/filter_factories.h" #include "media/base/filters.h" #include "third_party/WebKit/Source/WebKit/chromium/public/WebFrame.h" #include "third_party/WebKit/Source/WebKit/chromium/public/WebURLLoader.h" #include "third_party/WebKit/Source/WebKit/chromium/public/WebURLLoaderClient.h" #include "third_party/WebKit/Source/WebKit/chromium/public/WebURLRequest.h" #include "third_party/WebKit/Source/WebKit/chromium/public/WebURLResponse.h" #include "webkit/glue/media/web_data_source.h" class MessageLoop; class WebMediaPlayerDelegateImpl; namespace webkit_glue { class SimpleDataSource : public WebDataSource, public WebKit::WebURLLoaderClient { public: // Creates a DataSourceFactory for building SimpleDataSource objects. static media::DataSourceFactory* CreateFactory( MessageLoop* render_loop, WebKit::WebFrame* frame, WebDataSourceBuildObserverHack* build_observer); SimpleDataSource(MessageLoop* render_loop, WebKit::WebFrame* frame); virtual ~SimpleDataSource(); // media::Filter implementation. virtual void set_host(media::FilterHost* host); virtual void Stop(media::FilterCallback* callback); // media::DataSource implementation. virtual const media::MediaFormat& media_format(); virtual void Read(int64 position, size_t size, uint8* data, ReadCallback* read_callback); virtual bool GetSize(int64* size_out); virtual bool IsStreaming(); virtual void SetPreload(media::Preload preload); // Used to inject a mock used for unittests. virtual void SetURLLoaderForTest(WebKit::WebURLLoader* mock_loader); // WebKit::WebURLLoaderClient implementations. virtual void willSendRequest( WebKit::WebURLLoader* loader, WebKit::WebURLRequest& newRequest, const WebKit::WebURLResponse& redirectResponse); virtual void didSendData( WebKit::WebURLLoader* loader, unsigned long long bytesSent, unsigned long long totalBytesToBeSent); virtual void didReceiveResponse( WebKit::WebURLLoader* loader, const WebKit::WebURLResponse& response); virtual void didDownloadData( WebKit::WebURLLoader* loader, int dataLength); virtual void didReceiveData( WebKit::WebURLLoader* loader, const char* data, int dataLength, int encodedDataLength); virtual void didReceiveCachedMetadata( WebKit::WebURLLoader* loader, const char* data, int dataLength); virtual void didFinishLoading( WebKit::WebURLLoader* loader, double finishTime); virtual void didFail( WebKit::WebURLLoader* loader, const WebKit::WebURLError&); // webkit_glue::WebDataSource implementation. virtual void Initialize(const std::string& url, media::PipelineStatusCallback* callback); virtual void CancelInitialize(); virtual bool HasSingleOrigin(); virtual void Abort(); private: // Updates |url_| and |media_format_| with the given URL. void SetURL(const GURL& url); // Creates and starts the resource loading on the render thread. void StartTask(); // Cancels and deletes the resource loading on the render thread. void CancelTask(); // Perform initialization completion tasks under a lock. void DoneInitialization_Locked(bool success); // Update host() stats like total bytes & buffered bytes. void UpdateHostState(); // Primarily used for asserting the bridge is loading on the render thread. MessageLoop* render_loop_; // A webframe for loading. WebKit::WebFrame* frame_; // Does the work of loading and sends data back to this client. scoped_ptr<WebKit::WebURLLoader> url_loader_; media::MediaFormat media_format_; GURL url_; std::string data_; int64 size_; bool single_origin_; // Simple state tracking variable. enum State { UNINITIALIZED, INITIALIZING, INITIALIZED, STOPPED, }; State state_; // Used for accessing |state_|. base::Lock lock_; // Filter callbacks. scoped_ptr<media::PipelineStatusCallback> initialize_callback_; // Used to ensure mocks for unittests are used instead of reset in Start(). bool keep_test_loader_; DISALLOW_COPY_AND_ASSIGN(SimpleDataSource); }; } // namespace webkit_glue #endif // WEBKIT_GLUE_MEDIA_SIMPLE_DATA_SOURCE_H_