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