Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(2007)

Unified Diff: ui/base/clipboard/clipboard.cc

Issue 851853002: It is time. (Closed) Base URL: https://github.com/domokit/mojo.git@master
Patch Set: Trying to reup because the last upload failed. Created 5 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « ui/base/clipboard/clipboard.h ('k') | ui/base/clipboard/clipboard_android.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: ui/base/clipboard/clipboard.cc
diff --git a/ui/base/clipboard/clipboard.cc b/ui/base/clipboard/clipboard.cc
deleted file mode 100644
index 27f747a048fe4dc7b48309346f3024977bb08c5d..0000000000000000000000000000000000000000
--- a/ui/base/clipboard/clipboard.cc
+++ /dev/null
@@ -1,233 +0,0 @@
-// Copyright (c) 2012 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 "ui/base/clipboard/clipboard.h"
-
-#include <iterator>
-#include <limits>
-
-#include "base/lazy_instance.h"
-#include "base/logging.h"
-#include "base/memory/scoped_ptr.h"
-#include "base/synchronization/lock.h"
-#include "third_party/skia/include/core/SkBitmap.h"
-#include "ui/gfx/size.h"
-
-namespace ui {
-
-namespace {
-
-// Valides a shared bitmap on the clipboard.
-// Returns true if the clipboard data makes sense and it's safe to access the
-// bitmap.
-bool ValidateAndMapSharedBitmap(size_t bitmap_bytes,
- base::SharedMemory* bitmap_data) {
- using base::SharedMemory;
-
- if (!bitmap_data || !SharedMemory::IsHandleValid(bitmap_data->handle()))
- return false;
-
- if (!bitmap_data->Map(bitmap_bytes)) {
- PLOG(ERROR) << "Failed to map bitmap memory";
- return false;
- }
- return true;
-}
-
-// A list of allowed threads. By default, this is empty and no thread checking
-// is done (in the unit test case), but a user (like content) can set which
-// threads are allowed to call this method.
-typedef std::vector<base::PlatformThreadId> AllowedThreadsVector;
-static base::LazyInstance<AllowedThreadsVector> g_allowed_threads =
- LAZY_INSTANCE_INITIALIZER;
-
-// Mapping from threads to clipboard objects.
-typedef std::map<base::PlatformThreadId, Clipboard*> ClipboardMap;
-static base::LazyInstance<ClipboardMap> g_clipboard_map =
- LAZY_INSTANCE_INITIALIZER;
-
-// Mutex that controls access to |g_clipboard_map|.
-static base::LazyInstance<base::Lock>::Leaky
- g_clipboard_map_lock = LAZY_INSTANCE_INITIALIZER;
-
-} // namespace
-
-// static
-void Clipboard::SetAllowedThreads(
- const std::vector<base::PlatformThreadId>& allowed_threads) {
- base::AutoLock lock(g_clipboard_map_lock.Get());
-
- g_allowed_threads.Get().clear();
- std::copy(allowed_threads.begin(), allowed_threads.end(),
- std::back_inserter(g_allowed_threads.Get()));
-}
-
-// static
-Clipboard* Clipboard::GetForCurrentThread() {
- base::AutoLock lock(g_clipboard_map_lock.Get());
-
- base::PlatformThreadId id = base::PlatformThread::CurrentId();
-
- AllowedThreadsVector* allowed_threads = g_allowed_threads.Pointer();
- if (!allowed_threads->empty()) {
- bool found = false;
- for (AllowedThreadsVector::const_iterator it = allowed_threads->begin();
- it != allowed_threads->end(); ++it) {
- if (*it == id) {
- found = true;
- break;
- }
- }
-
- DCHECK(found);
- }
-
- ClipboardMap* clipboard_map = g_clipboard_map.Pointer();
- ClipboardMap::iterator it = clipboard_map->find(id);
- if (it != clipboard_map->end())
- return it->second;
-
- Clipboard* clipboard = Clipboard::Create();
- clipboard_map->insert(std::make_pair(id, clipboard));
- return clipboard;
-}
-
-void Clipboard::DestroyClipboardForCurrentThread() {
- base::AutoLock lock(g_clipboard_map_lock.Get());
-
- ClipboardMap* clipboard_map = g_clipboard_map.Pointer();
- base::PlatformThreadId id = base::PlatformThread::CurrentId();
- ClipboardMap::iterator it = clipboard_map->find(id);
- if (it != clipboard_map->end()) {
- delete it->second;
- clipboard_map->erase(it);
- }
-}
-
-void Clipboard::DispatchObject(ObjectType type, const ObjectMapParams& params) {
- // All types apart from CBF_WEBKIT need at least 1 non-empty param.
- if (type != CBF_WEBKIT && (params.empty() || params[0].empty()))
- return;
- // Some other types need a non-empty 2nd param.
- if ((type == CBF_BOOKMARK || type == CBF_SMBITMAP || type == CBF_DATA) &&
- (params.size() != 2 || params[1].empty()))
- return;
- switch (type) {
- case CBF_TEXT:
- WriteText(&(params[0].front()), params[0].size());
- break;
-
- case CBF_HTML:
- if (params.size() == 2) {
- if (params[1].empty())
- return;
- WriteHTML(&(params[0].front()), params[0].size(),
- &(params[1].front()), params[1].size());
- } else if (params.size() == 1) {
- WriteHTML(&(params[0].front()), params[0].size(), NULL, 0);
- }
- break;
-
- case CBF_RTF:
- WriteRTF(&(params[0].front()), params[0].size());
- break;
-
- case CBF_BOOKMARK:
- WriteBookmark(&(params[0].front()), params[0].size(),
- &(params[1].front()), params[1].size());
- break;
-
- case CBF_WEBKIT:
- WriteWebSmartPaste();
- break;
-
- case CBF_SMBITMAP: {
- using base::SharedMemory;
- using base::SharedMemoryHandle;
-
- if (params[0].size() != sizeof(SharedMemory*) ||
- params[1].size() != sizeof(gfx::Size)) {
- return;
- }
-
- SkBitmap bitmap;
- const gfx::Size* unvalidated_size =
- reinterpret_cast<const gfx::Size*>(&params[1].front());
- // Let Skia do some sanity checking for us (no negative widths/heights, no
- // overflows while calculating bytes per row, etc).
- if (!bitmap.setInfo(SkImageInfo::MakeN32Premul(
- unvalidated_size->width(), unvalidated_size->height()))) {
- return;
- }
- // Make sure the size is representable as a signed 32-bit int, so
- // SkBitmap::getSize() won't be truncated.
- if (!sk_64_isS32(bitmap.computeSize64()))
- return;
-
- // It's OK to cast away constness here since we map the handle as
- // read-only.
- const char* raw_bitmap_data_const =
- reinterpret_cast<const char*>(&params[0].front());
- char* raw_bitmap_data = const_cast<char*>(raw_bitmap_data_const);
- scoped_ptr<SharedMemory> bitmap_data(
- *reinterpret_cast<SharedMemory**>(raw_bitmap_data));
-
- if (!ValidateAndMapSharedBitmap(bitmap.getSize(), bitmap_data.get()))
- return;
- bitmap.setPixels(bitmap_data->memory());
-
- WriteBitmap(bitmap);
- break;
- }
-
- case CBF_DATA:
- WriteData(
- FormatType::Deserialize(
- std::string(&(params[0].front()), params[0].size())),
- &(params[1].front()),
- params[1].size());
- break;
-
- default:
- NOTREACHED();
- }
-}
-
-// static
-bool Clipboard::ReplaceSharedMemHandle(ObjectMap* objects,
- base::SharedMemoryHandle bitmap_handle,
- base::ProcessHandle process) {
- using base::SharedMemory;
- bool has_shared_bitmap = false;
-
- for (ObjectMap::iterator iter = objects->begin(); iter != objects->end();
- ++iter) {
- if (iter->first == CBF_SMBITMAP) {
- // The code currently only accepts sending a single bitmap over this way.
- // Fail if we ever encounter more than one shmem bitmap structure to fill.
- if (has_shared_bitmap)
- return false;
-
-#if defined(OS_WIN)
- SharedMemory* bitmap = new SharedMemory(bitmap_handle, true, process);
-#else
- SharedMemory* bitmap = new SharedMemory(bitmap_handle, true);
-#endif
-
- // There must always be two parameters associated with each shmem bitmap.
- if (iter->second.size() != 2)
- return false;
-
- // We store the shared memory object pointer so it can be retrieved by the
- // UI thread (see DispatchObject()).
- iter->second[0].clear();
- for (size_t i = 0; i < sizeof(SharedMemory*); ++i)
- iter->second[0].push_back(reinterpret_cast<char*>(&bitmap)[i]);
- has_shared_bitmap = true;
- }
- }
- return true;
-}
-
-} // namespace ui
« no previous file with comments | « ui/base/clipboard/clipboard.h ('k') | ui/base/clipboard/clipboard_android.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698