| Index: net/base/upload_data.h
 | 
| diff --git a/net/base/upload_data.h b/net/base/upload_data.h
 | 
| index 3aab835b56e51e940fcee0c8cffc2999b27c136c..d01b435c517e96a28a0f88f839ccc5238d3bc971 100644
 | 
| --- a/net/base/upload_data.h
 | 
| +++ b/net/base/upload_data.h
 | 
| @@ -9,6 +9,7 @@
 | 
|  
 | 
|  #include "base/basictypes.h"
 | 
|  #include "base/file_path.h"
 | 
| +#include "base/platform_file.h"
 | 
|  #include "base/ref_counted.h"
 | 
|  #include "testing/gtest/include/gtest/gtest_prod.h"
 | 
|  
 | 
| @@ -26,7 +27,8 @@ class UploadData : public base::RefCounted<UploadData> {
 | 
|    class Element {
 | 
|     public:
 | 
|      Element() : type_(TYPE_BYTES), file_range_offset_(0),
 | 
| -                file_range_length_(kuint64max),
 | 
| +                file_range_length_(0),
 | 
| +                file_(base::kInvalidPlatformFileValue),
 | 
|                  override_content_length_(false) {
 | 
|      }
 | 
|  
 | 
| @@ -45,19 +47,42 @@ class UploadData : public base::RefCounted<UploadData> {
 | 
|        SetToFilePathRange(path, 0, kuint64max);
 | 
|      }
 | 
|  
 | 
| -    void SetToFilePathRange(const FilePath& path,
 | 
| -                            uint64 offset, uint64 length) {
 | 
| -      type_ = TYPE_FILE;
 | 
| -      file_path_ = path;
 | 
| -      file_range_offset_ = offset;
 | 
| -      file_range_length_ = length;
 | 
| -    }
 | 
| +    void SetToFilePathRange(const FilePath& path, uint64 offset, uint64 length);
 | 
|  
 | 
|      // Returns the byte-length of the element.  For files that do not exist, 0
 | 
|      // is returned.  This is done for consistency with Mozilla.
 | 
| -    uint64 GetContentLength() const;
 | 
| +    uint64 GetContentLength() const {
 | 
| +      if (override_content_length_)
 | 
| +        return content_length_;
 | 
| +
 | 
| +      if (type_ == TYPE_BYTES) {
 | 
| +        return bytes_.size();
 | 
| +      } else {
 | 
| +        return file_range_length_;
 | 
| +      }
 | 
| +    }
 | 
| +
 | 
| +    // For a TYPE_FILE, return a handle to the file. The caller does not take
 | 
| +    // ownership and should not close the file handle.
 | 
| +    base::PlatformFile platform_file() const;
 | 
| +
 | 
| +    // For a TYPE_FILE, this closes the file handle. It's a fatal error to call
 | 
| +    // platform_file() after this.
 | 
| +    void Close();
 | 
|  
 | 
|     private:
 | 
| +    // type_ == TYPE_BYTES:
 | 
| +    //   bytes_ is valid
 | 
| +    // type_ == TYPE_FILE:
 | 
| +    //   file_path_ should always be valid.
 | 
| +    //
 | 
| +    //   platform_file() may be invalid, in which case file_range_* are 0 and
 | 
| +    //   file_ is invalid. This occurs when we cannot open the requested file.
 | 
| +    //
 | 
| +    //   Else, then file_range_* are within range of the length of the file
 | 
| +    //   that we found when opening the file. Also, the sum of offset and
 | 
| +    //   length will not overflow a uint64. file_ will be handle to the file.
 | 
| +
 | 
|      // Allows tests to override the result of GetContentLength.
 | 
|      void SetContentLength(uint64 content_length) {
 | 
|        override_content_length_ = true;
 | 
| @@ -69,6 +94,7 @@ class UploadData : public base::RefCounted<UploadData> {
 | 
|      FilePath file_path_;
 | 
|      uint64 file_range_offset_;
 | 
|      uint64 file_range_length_;
 | 
| +    base::PlatformFile file_;
 | 
|      bool override_content_length_;
 | 
|      uint64 content_length_;
 | 
|  
 | 
| @@ -109,6 +135,9 @@ class UploadData : public base::RefCounted<UploadData> {
 | 
|      elements_.swap(*elements);
 | 
|    }
 | 
|  
 | 
| +  // CloseFiles closes the file handles of all Elements of type TYPE_FILE.
 | 
| +  void CloseFiles();
 | 
| +
 | 
|    // Identifies a particular upload instance, which is used by the cache to
 | 
|    // formulate a cache key.  This value should be unique across browser
 | 
|    // sessions.  A value of 0 is used to indicate an unspecified identifier.
 | 
| 
 |