Home | History | Annotate | Download | only in blob
      1 // Copyright (c) 2013 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #ifndef WEBKIT_BROWSER_BLOB_BLOB_STORAGE_CONTEXT_H_
      6 #define WEBKIT_BROWSER_BLOB_BLOB_STORAGE_CONTEXT_H_
      7 
      8 #include <map>
      9 #include <string>
     10 
     11 #include "base/memory/ref_counted.h"
     12 #include "base/memory/scoped_ptr.h"
     13 #include "base/memory/weak_ptr.h"
     14 #include "webkit/browser/blob/blob_data_handle.h"
     15 #include "webkit/browser/webkit_storage_browser_export.h"
     16 #include "webkit/common/blob/blob_data.h"
     17 
     18 class GURL;
     19 
     20 namespace base {
     21 class FilePath;
     22 class Time;
     23 }
     24 
     25 namespace content {
     26 class BlobStorageHost;
     27 }
     28 
     29 namespace webkit_blob {
     30 
     31 class BlobDataHandle;
     32 
     33 // This class handles the logistics of blob Storage within the browser process,
     34 // and maintains a mapping from blob uuid to the data. The class is single
     35 // threaded and should only be used on the IO thread.
     36 // In chromium, there is one instance per profile.
     37 class WEBKIT_STORAGE_BROWSER_EXPORT BlobStorageContext
     38     : public base::SupportsWeakPtr<BlobStorageContext> {
     39  public:
     40   BlobStorageContext();
     41   ~BlobStorageContext();
     42 
     43   scoped_ptr<BlobDataHandle> GetBlobDataFromUUID(const std::string& uuid);
     44   scoped_ptr<BlobDataHandle> GetBlobDataFromPublicURL(const GURL& url);
     45 
     46   // Useful for coining blobs from within the browser process. If the
     47   // blob cannot be added due to memory consumption, returns NULL.
     48   scoped_ptr<BlobDataHandle> AddFinishedBlob(const BlobData* blob_data);
     49 
     50   // Useful for coining blob urls from within the browser process.
     51   bool RegisterPublicBlobURL(const GURL& url, const std::string& uuid);
     52   void RevokePublicBlobURL(const GURL& url);
     53 
     54  private:
     55   friend class content::BlobStorageHost;
     56   friend class BlobDataHandle::BlobDataHandleShared;
     57   friend class ViewBlobInternalsJob;
     58 
     59   enum EntryFlags {
     60     BEING_BUILT = 1 << 0,
     61     EXCEEDED_MEMORY = 1 << 1,
     62   };
     63 
     64   struct BlobMapEntry {
     65     int refcount;
     66     int flags;
     67     scoped_refptr<BlobData> data;
     68 
     69     BlobMapEntry();
     70     BlobMapEntry(int refcount, int flags, BlobData* data);
     71     ~BlobMapEntry();
     72   };
     73 
     74   typedef std::map<std::string, BlobMapEntry>
     75       BlobMap;
     76   typedef std::map<GURL, std::string> BlobURLMap;
     77 
     78   void StartBuildingBlob(const std::string& uuid);
     79   void AppendBlobDataItem(const std::string& uuid,
     80                           const BlobData::Item& data_item);
     81   void FinishBuildingBlob(const std::string& uuid, const std::string& type);
     82   void CancelBuildingBlob(const std::string& uuid);
     83   void IncrementBlobRefCount(const std::string& uuid);
     84   void DecrementBlobRefCount(const std::string& uuid);
     85 
     86   bool ExpandStorageItems(BlobData* target_blob_data,
     87                           BlobData* src_blob_data,
     88                           uint64 offset,
     89                           uint64 length);
     90   bool AppendBytesItem(BlobData* target_blob_data,
     91                        const char* data, int64 length);
     92   void AppendFileItem(BlobData* target_blob_data,
     93                       const base::FilePath& file_path,
     94                       uint64 offset, uint64 length,
     95                       const base::Time& expected_modification_time);
     96   void AppendFileSystemFileItem(
     97       BlobData* target_blob_data,
     98       const GURL& url, uint64 offset, uint64 length,
     99       const base::Time& expected_modification_time);
    100 
    101   bool IsInUse(const std::string& uuid);
    102   bool IsBeingBuilt(const std::string& uuid);
    103   bool IsUrlRegistered(const GURL& blob_url);
    104 
    105   BlobMap blob_map_;
    106   BlobURLMap public_blob_urls_;
    107 
    108   // Used to keep track of how much memory is being utilized for blob data,
    109   // we count only the items of TYPE_DATA which are held in memory and not
    110   // items of TYPE_FILE.
    111   int64 memory_usage_;
    112 
    113   DISALLOW_COPY_AND_ASSIGN(BlobStorageContext);
    114 };
    115 
    116 }  // namespace webkit_blob
    117 
    118 #endif  // WEBKIT_BROWSER_BLOB_BLOB_STORAGE_CONTEXT_H_
    119