1ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved. 221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen// Use of this source code is governed by a BSD-style license that can be 321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen// found in the LICENSE file. 421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#ifndef WEBKIT_GLUE_MEDIA_BUFFERED_RESOURCE_LOADER_H_ 621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#define WEBKIT_GLUE_MEDIA_BUFFERED_RESOURCE_LOADER_H_ 721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include <string> 921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 1021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "base/callback.h" 11ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/memory/scoped_ptr.h" 1221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "base/timer.h" 1321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "googleurl/src/gurl.h" 1421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "media/base/seekable_buffer.h" 1521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "net/base/file_stream.h" 1672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "third_party/WebKit/Source/WebKit/chromium/public/WebFrame.h" 1772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "third_party/WebKit/Source/WebKit/chromium/public/WebURLLoader.h" 1872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "third_party/WebKit/Source/WebKit/chromium/public/WebURLLoaderClient.h" 1972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "third_party/WebKit/Source/WebKit/chromium/public/WebURLRequest.h" 2021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "webkit/glue/media/web_data_source.h" 2121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "webkit/glue/webmediaplayer_impl.h" 2221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 2321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsennamespace webkit_glue { 2421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 2521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsenconst int64 kPositionNotSpecified = -1; 2621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 2721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsenconst char kHttpScheme[] = "http"; 2821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsenconst char kHttpsScheme[] = "https"; 2921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsenconst char kDataScheme[] = "data"; 3021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 3121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen// This class works inside demuxer thread and render thread. It contains a 3221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen// WebURLLoader and does the actual resource loading. This object does 3321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen// buffering internally, it defers the resource loading if buffer is full 3421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen// and un-defers the resource loading if it is under buffered. 3521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsenclass BufferedResourceLoader : 3621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen public base::RefCountedThreadSafe<BufferedResourceLoader>, 3721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen public WebKit::WebURLLoaderClient { 3821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen public: 39ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // kNeverDefer - Aggresively buffer; never defer loading while paused. 40ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // kReadThenDefer - Request only enough data to fulfill read requests. 41ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // kThresholdDefer - Try to keep amount of buffered data at a threshold. 42ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen enum DeferStrategy { 43ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen kNeverDefer, 44ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen kReadThenDefer, 45ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen kThresholdDefer, 46ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen }; 47ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 4821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen typedef Callback0::Type NetworkEventCallback; 4921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 5021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen // |url| - URL for the resource to be loaded. 5121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen // |first_byte_position| - First byte to start loading from, 5221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen // |kPositionNotSpecified| for not specified. 5321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen // |last_byte_position| - Last byte to be loaded, 5421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen // |kPositionNotSpecified| for not specified. 5521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen BufferedResourceLoader(const GURL& url, 5621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen int64 first_byte_position, 5721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen int64 last_byte_position); 5821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 5921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen // Start the resource loading with the specified URL and range. 6021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen // This method operates in asynchronous mode. Once there's a response from the 6121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen // server, success or fail |callback| is called with the result. 6221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen // |callback| is called with the following values: 6321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen // - net::OK 6421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen // The request has started successfully. 6521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen // - net::ERR_FAILED 6621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen // The request has failed because of an error with the network. 6721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen // - net::ERR_INVALID_RESPONSE 6821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen // An invalid response is received from the server. 6921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen // - (Anything else) 7021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen // An error code that indicates the request has failed. 7121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen // |event_callback| is called when the response is completed, data is 7221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen // received, the request is suspended or resumed. 7321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen virtual void Start(net::CompletionCallback* callback, 7421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen NetworkEventCallback* event_callback, 7521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen WebKit::WebFrame* frame); 7621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 7721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen // Stop this loader, cancels and request and release internal buffer. 7821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen virtual void Stop(); 7921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 8021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen // Reads the specified |read_size| from |position| into |buffer| and when 8121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen // the operation is done invoke |callback| with number of bytes read or an 8221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen // error code. 8321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen // |callback| is called with the following values: 8421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen // - (Anything greater than or equal 0) 8521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen // Read was successful with the indicated number of bytes read. 8621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen // - net::ERR_FAILED 8721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen // The read has failed because of an error with the network. 8821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen // - net::ERR_CACHE_MISS 8921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen // The read was made too far away from the current buffered position. 9021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen virtual void Read(int64 position, int read_size, 9121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen uint8* buffer, net::CompletionCallback* callback); 9221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 9321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen // Returns the position of the last byte buffered. Returns 9421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen // |kPositionNotSpecified| if such value is not available. 9521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen virtual int64 GetBufferedPosition(); 9621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 9721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen // Gets the content length in bytes of the instance after this loader has been 9821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen // started. If this value is |kPositionNotSpecified|, then content length is 9921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen // unknown. 10021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen virtual int64 content_length(); 10121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 10221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen // Gets the original size of the file requested. If this value is 10321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen // |kPositionNotSpecified|, then the size is unknown. 10421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen virtual int64 instance_size(); 10521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 106ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Returns true if the server supports byte range requests. 107ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen virtual bool range_supported(); 10821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 10921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen // Returns true if network is currently active. 11021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen virtual bool network_activity(); 11121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 11221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen // Returns resulting URL. 11321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen virtual const GURL& url(); 11421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 11521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen // Used to inject a mock used for unittests. 11621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen virtual void SetURLLoaderForTest(WebKit::WebURLLoader* mock_loader); 11721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 11821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen // WebKit::WebURLLoaderClient implementation. 11921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen virtual void willSendRequest( 12021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen WebKit::WebURLLoader* loader, 12121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen WebKit::WebURLRequest& newRequest, 12221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen const WebKit::WebURLResponse& redirectResponse); 12321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen virtual void didSendData( 12421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen WebKit::WebURLLoader* loader, 12521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen unsigned long long bytesSent, 12621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen unsigned long long totalBytesToBeSent); 12721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen virtual void didReceiveResponse( 12821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen WebKit::WebURLLoader* loader, 12921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen const WebKit::WebURLResponse& response); 13021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen virtual void didDownloadData( 13121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen WebKit::WebURLLoader* loader, 132ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen int data_length); 13321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen virtual void didReceiveData( 13421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen WebKit::WebURLLoader* loader, 13521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen const char* data, 136ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen int data_length, 137ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen int encoded_data_length); 13821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen virtual void didReceiveCachedMetadata( 13921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen WebKit::WebURLLoader* loader, 14021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen const char* data, int dataLength); 14121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen virtual void didFinishLoading( 14221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen WebKit::WebURLLoader* loader, 14321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen double finishTime); 14421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen virtual void didFail( 14521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen WebKit::WebURLLoader* loader, 14621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen const WebKit::WebURLError&); 14721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 14872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen bool HasSingleOrigin() const; 14972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 150ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Sets the defer strategy to the given value. 151ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen void UpdateDeferStrategy(DeferStrategy strategy); 152ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 15321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen protected: 15421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen friend class base::RefCountedThreadSafe<BufferedResourceLoader>; 15521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen virtual ~BufferedResourceLoader(); 15621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 15721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen private: 15821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen friend class BufferedResourceLoaderTest; 15921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 160ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Toggles whether the resource loading is deferred or not. 161ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Returns true if a network event was fired. 162ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen bool ToggleDeferring(); 16321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 164ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Returns true if we should defer resource loading, based 165ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // on current buffering scheme. 166ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen bool ShouldEnableDefer(); 167ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 168ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Returns true if we should enable resource loading, based 169ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // on current buffering scheme. 170ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen bool ShouldDisableDefer(); 171ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 172ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Updates deferring behavior based on current buffering scheme. 173ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen void UpdateDeferBehavior(); 17421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 17521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen // Returns true if the current read request can be fulfilled by what is in 17621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen // the buffer. 17721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen bool CanFulfillRead(); 17821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 17921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen // Returns true if the current read request will be fulfilled in the future. 18021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen bool WillFulfillRead(); 18121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 18221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen // Method that does the actual read and calls the |read_callback_|, assuming 18321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen // the request range is in |buffer_|. 18421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen void ReadInternal(); 18521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 18621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen // If we have made a range request, verify the response from the server. 18721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen bool VerifyPartialResponse(const WebKit::WebURLResponse& response); 18821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 18921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen // Returns the value for a range request header using parameters 19021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen // |first_byte_position| and |last_byte_position|. Negative numbers other 19121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen // than |kPositionNotSpecified| are not allowed for |first_byte_position| and 19221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen // |last_byte_position|. |first_byte_position| should always be less than or 19321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen // equal to |last_byte_position| if they are both not |kPositionNotSpecified|. 19421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen // Empty string is returned on invalid parameters. 19521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen std::string GenerateHeaders(int64 first_byte_position, 19621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen int64 last_byte_position); 19721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 19821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen // Done with read. Invokes the read callback and reset parameters for the 19921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen // read request. 20021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen void DoneRead(int error); 20121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 20221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen // Done with start. Invokes the start callback and reset it. 20321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen void DoneStart(int error); 20421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 20521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen // Calls |event_callback_| in terms of a network event. 20621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen void NotifyNetworkEvent(); 20721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 20821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen bool HasPendingRead() { return read_callback_.get() != NULL; } 20921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 210ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Helper function that returns true if a range request was specified. 211ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen bool IsRangeRequest() const; 212ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 21321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen // A sliding window of buffer. 21421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen scoped_ptr<media::SeekableBuffer> buffer_; 21521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 21621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen // True if resource loading was deferred. 21721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen bool deferred_; 21821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 219ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Current buffering algorithm in place for resource loading. 220ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen DeferStrategy defer_strategy_; 22121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 22221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen // True if resource loading has completed. 22321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen bool completed_; 22421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 22521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen // True if a range request was made. 22621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen bool range_requested_; 22721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 228ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // True if Range header is supported. 229ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen bool range_supported_; 23021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 23121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen // Does the work of loading and sends data back to this client. 23221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen scoped_ptr<WebKit::WebURLLoader> url_loader_; 23321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 23421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen GURL url_; 23521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen int64 first_byte_position_; 23621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen int64 last_byte_position_; 23772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen bool single_origin_; 23821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 23921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen // Callback method that listens to network events. 24021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen scoped_ptr<NetworkEventCallback> event_callback_; 24121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 24221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen // Members used during request start. 24321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen scoped_ptr<net::CompletionCallback> start_callback_; 24421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen int64 offset_; 24521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen int64 content_length_; 24621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen int64 instance_size_; 24721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 24821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen // Members used during a read operation. They should be reset after each 24921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen // read has completed or failed. 25021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen scoped_ptr<net::CompletionCallback> read_callback_; 25121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen int64 read_position_; 25221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen int read_size_; 25321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen uint8* read_buffer_; 25421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 25521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen // Offsets of the requested first byte and last byte in |buffer_|. They are 25621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen // written by Read(). 25721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen int first_offset_; 25821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen int last_offset_; 25921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 26021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen // Used to ensure mocks for unittests are used instead of reset in Start(). 26121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen bool keep_test_loader_; 26221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 26321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen DISALLOW_COPY_AND_ASSIGN(BufferedResourceLoader); 26421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen}; 26521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 26621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen} // namespace webkit_glue 26721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 26821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#endif // WEBKIT_GLUE_MEDIA_BUFFERED_RESOURCE_LOADER_H_ 269