1// Copyright 2014 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 EXTENSIONS_BROWSER_BLOB_HOLDER_H_
6#define EXTENSIONS_BROWSER_BLOB_HOLDER_H_
7
8#include <map>
9#include <string>
10#include <vector>
11
12#include "base/memory/linked_ptr.h"
13#include "base/memory/scoped_ptr.h"
14#include "base/supports_user_data.h"
15
16namespace content {
17class BlobHandle;
18class RenderProcessHost;
19}
20
21namespace extensions {
22
23class ExtensionMessageFilter;
24
25// Used for holding onto Blobs created into the browser process until a
26// renderer takes over ownership. This class operates on the UI thread.
27class BlobHolder : public base::SupportsUserData::Data {
28 public:
29  // Will create the BlobHolder if it doesn't already exist.
30  static BlobHolder* FromRenderProcessHost(
31      content::RenderProcessHost* render_process_host);
32
33  virtual ~BlobHolder();
34
35  // Causes BlobHolder to take ownership of |blob|.
36  void HoldBlobReference(scoped_ptr<content::BlobHandle> blob);
37
38 private:
39  typedef std::multimap<std::string, linked_ptr<content::BlobHandle> >
40      BlobHandleMultimap;
41
42  explicit BlobHolder(content::RenderProcessHost* render_process_host);
43
44  // BlobHolder will drop a blob handle for each element in blob_uuids.
45  // If caller wishes to drop multiple references to the same blob,
46  // |blob_uuids| may contain duplicate UUIDs.
47  void DropBlobs(const std::vector<std::string>& blob_uuids);
48  friend class ExtensionMessageFilter;
49
50  bool ContainsBlobHandle(content::BlobHandle* handle) const;
51
52  // A reference to the owner of this class.
53  content::RenderProcessHost* render_process_host_;
54
55  BlobHandleMultimap held_blobs_;
56
57  DISALLOW_COPY_AND_ASSIGN(BlobHolder);
58};
59
60}  // namespace extensions
61
62#endif  // EXTENSIONS_BROWSER_BLOB_HOLDER_H_
63