| Index: storage/browser/blob/blob_data_handle.h
 | 
| diff --git a/storage/browser/blob/blob_data_handle.h b/storage/browser/blob/blob_data_handle.h
 | 
| index 3f4529346b103cc0149d0a507494011e867153dc..04c2dbb6a334db6040ca579dc4ad137d0c0ba219 100644
 | 
| --- a/storage/browser/blob/blob_data_handle.h
 | 
| +++ b/storage/browser/blob/blob_data_handle.h
 | 
| @@ -5,6 +5,7 @@
 | 
|  #ifndef STORAGE_BROWSER_BLOB_BLOB_DATA_HANDLE_H_
 | 
|  #define STORAGE_BROWSER_BLOB_BLOB_DATA_HANDLE_H_
 | 
|  
 | 
| +#include <limits>
 | 
|  #include <memory>
 | 
|  #include <string>
 | 
|  
 | 
| @@ -39,10 +40,7 @@ class FileSystemContext;
 | 
|  class STORAGE_EXPORT BlobDataHandle
 | 
|      : public base::SupportsUserData::Data {
 | 
|   public:
 | 
| -  // True means the blob was constructed successfully, and false means that
 | 
| -  // there was an error, which is reported in the second argument.
 | 
| -  using BlobConstructedCallback =
 | 
| -      base::Callback<void(bool, IPCBlobCreationCancelCode)>;
 | 
| +  static constexpr uint64_t kUnknownSize = std::numeric_limits<uint64_t>::max();
 | 
|  
 | 
|    BlobDataHandle(const BlobDataHandle& other);  // May be copied on any thread.
 | 
|    ~BlobDataHandle() override;                   // May be deleted on any thread.
 | 
| @@ -56,13 +54,17 @@ class STORAGE_EXPORT BlobDataHandle
 | 
|    // Must be called on IO thread.
 | 
|    bool IsBroken() const;
 | 
|  
 | 
| +  // Returns the broken reason if this blob is broken.
 | 
| +  // Must be called on IO thread.
 | 
| +  BlobStatus GetBlobStatus() const;
 | 
| +
 | 
|    // The callback will be run on the IO thread when construction of the blob
 | 
|    // is complete. If construction is already complete, then the task is run
 | 
|    // immediately on the current message loop (i.e. IO thread).
 | 
|    // Must be called on IO thread.  Returns if construction successful.
 | 
|    // Calling this multiple times results in registering multiple
 | 
|    // completion callbacks.
 | 
| -  void RunOnConstructionComplete(const BlobConstructedCallback& done);
 | 
| +  void RunOnConstructionComplete(const BlobStatusCallback& done);
 | 
|  
 | 
|    // A BlobReader is used to read the data from the blob.  This object is
 | 
|    // intended to be transient and should not be stored for any extended period
 | 
| @@ -77,6 +79,9 @@ class STORAGE_EXPORT BlobDataHandle
 | 
|    const std::string& content_type() const;
 | 
|    // May be accessed on any thread.
 | 
|    const std::string& content_disposition() const;
 | 
| +  // May be accessed on any thread. In rare cases where the blob is created
 | 
| +  // as a file from javascript, this will be kUnknownSize.
 | 
| +  uint64_t size() const;
 | 
|  
 | 
|    // This call and the destruction of the returned snapshot must be called
 | 
|    // on the IO thread. If the blob is broken, then we return a nullptr here.
 | 
| @@ -94,6 +99,7 @@ class STORAGE_EXPORT BlobDataHandle
 | 
|      BlobDataHandleShared(const std::string& uuid,
 | 
|                           const std::string& content_type,
 | 
|                           const std::string& content_disposition,
 | 
| +                         uint64_t size,
 | 
|                           BlobStorageContext* context);
 | 
|  
 | 
|     private:
 | 
| @@ -106,6 +112,7 @@ class STORAGE_EXPORT BlobDataHandle
 | 
|      const std::string uuid_;
 | 
|      const std::string content_type_;
 | 
|      const std::string content_disposition_;
 | 
| +    const uint64_t size_;
 | 
|      base::WeakPtr<BlobStorageContext> context_;
 | 
|  
 | 
|      DISALLOW_COPY_AND_ASSIGN(BlobDataHandleShared);
 | 
| @@ -115,6 +122,7 @@ class STORAGE_EXPORT BlobDataHandle
 | 
|    BlobDataHandle(const std::string& uuid,
 | 
|                   const std::string& content_type,
 | 
|                   const std::string& content_disposition,
 | 
| +                 uint64_t size,
 | 
|                   BlobStorageContext* context,
 | 
|                   base::SequencedTaskRunner* io_task_runner);
 | 
|  
 | 
| 
 |