diff options
author | tommycli@chromium.org <tommycli@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-06-02 17:28:10 +0000 |
---|---|---|
committer | tommycli@chromium.org <tommycli@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-06-02 17:28:10 +0000 |
commit | c0b5eb0b631fbdaff5561bb908a54479c7621a22 (patch) | |
tree | 749ab8d70be32bc399163d7e830d7baf982cf0fd /extensions/browser/blob_holder.cc | |
parent | 78d4695996b6aeb9f9be2e25cbff16c237a5ed15 (diff) | |
download | chromium_src-c0b5eb0b631fbdaff5561bb908a54479c7621a22.zip chromium_src-c0b5eb0b631fbdaff5561bb908a54479c7621a22.tar.gz chromium_src-c0b5eb0b631fbdaff5561bb908a54479c7621a22.tar.bz2 |
Blobs: Catching browser-process created Blobs in extension code.
This is a spinoff of https://codereview.chromium.org/266373006/, Patchset 11.
BUG=304290
Review URL: https://codereview.chromium.org/280393003
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@274268 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'extensions/browser/blob_holder.cc')
-rw-r--r-- | extensions/browser/blob_holder.cc | 85 |
1 files changed, 85 insertions, 0 deletions
diff --git a/extensions/browser/blob_holder.cc b/extensions/browser/blob_holder.cc new file mode 100644 index 0000000..5f73953 --- /dev/null +++ b/extensions/browser/blob_holder.cc @@ -0,0 +1,85 @@ +// Copyright 2014 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "extensions/browser/blob_holder.h" + +#include <algorithm> +#include <utility> + +#include "base/logging.h" +#include "content/public/browser/blob_handle.h" +#include "content/public/browser/browser_thread.h" +#include "content/public/browser/render_process_host.h" + +namespace extensions { + +namespace { + +// Address to this variable used as the user data key. +const int kBlobHolderUserDataKey = 0; +} + +// static +BlobHolder* BlobHolder::FromRenderProcessHost( + content::RenderProcessHost* render_process_host) { + DCHECK_CURRENTLY_ON(content::BrowserThread::UI); + DCHECK(render_process_host); + BlobHolder* existing = static_cast<BlobHolder*>( + render_process_host->GetUserData(&kBlobHolderUserDataKey)); + + if (existing) + return existing; + + BlobHolder* new_instance = new BlobHolder(render_process_host); + render_process_host->SetUserData(&kBlobHolderUserDataKey, new_instance); + return new_instance; +} + +BlobHolder::~BlobHolder() { + DCHECK_CURRENTLY_ON(content::BrowserThread::UI); +} + +void BlobHolder::HoldBlobReference(scoped_ptr<content::BlobHandle> blob) { + DCHECK_CURRENTLY_ON(content::BrowserThread::UI); + DCHECK(!ContainsBlobHandle(blob.get())); + + held_blobs_.insert( + make_pair(blob->GetUUID(), make_linked_ptr(blob.release()))); +} + +BlobHolder::BlobHolder(content::RenderProcessHost* render_process_host) + : render_process_host_(render_process_host) { + DCHECK_CURRENTLY_ON(content::BrowserThread::UI); +} + +bool BlobHolder::ContainsBlobHandle(content::BlobHandle* handle) const { + DCHECK_CURRENTLY_ON(content::BrowserThread::UI); + for (BlobHandleMultimap::const_iterator it = held_blobs_.begin(); + it != held_blobs_.end(); + ++it) { + if (it->second.get() == handle) + return true; + } + + return false; +} + +void BlobHolder::DropBlobs(const std::vector<std::string>& blob_uuids) { + DCHECK_CURRENTLY_ON(content::BrowserThread::UI); + for (std::vector<std::string>::const_iterator uuid_it = blob_uuids.begin(); + uuid_it != blob_uuids.end(); + ++uuid_it) { + BlobHandleMultimap::iterator it = held_blobs_.find(*uuid_it); + + if (it != held_blobs_.end()) { + held_blobs_.erase(it); + } else { + DLOG(ERROR) << "Tried to release a Blob we don't have ownership to." + << "UUID: " << *uuid_it; + render_process_host_->ReceivedBadMessage(); + } + } +} + +} // namespace extensions |