Index: ui/base/clipboard/clipboard.cc |
diff --git a/ui/base/clipboard/clipboard.cc b/ui/base/clipboard/clipboard.cc |
index d20d85414ea620649a91e45cd368b27a79fe3e3b..b793f6ed03e2d0419e548a9f3aaedc8df340a55a 100644 |
--- a/ui/base/clipboard/clipboard.cc |
+++ b/ui/base/clipboard/clipboard.cc |
@@ -4,8 +4,10 @@ |
#include "ui/base/clipboard/clipboard.h" |
+#include "base/lazy_instance.h" |
#include "base/logging.h" |
#include "base/memory/scoped_ptr.h" |
+#include "base/synchronization/lock.h" |
#include "ui/gfx/size.h" |
namespace ui { |
@@ -72,6 +74,15 @@ bool ValidateAndMapSharedBitmap(const Clipboard::ObjectMapParams& params, |
return true; |
} |
+// 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 |
const char Clipboard::kMimeTypeText[] = "text/plain"; |
@@ -81,6 +92,33 @@ const char Clipboard::kMimeTypeHTML[] = "text/html"; |
const char Clipboard::kMimeTypeRTF[] = "text/rtf"; |
const char Clipboard::kMimeTypePNG[] = "image/png"; |
+// static |
+Clipboard* Clipboard::GetForCurrentThread() { |
+ base::AutoLock lock(g_clipboard_map_lock.Get()); |
+ |
+ base::PlatformThreadId id = base::PlatformThread::CurrentId(); |
+ ClipboardMap* clipboard_map = g_clipboard_map.Pointer(); |
+ ClipboardMap::iterator it = clipboard_map->find(id); |
+ if (it != clipboard_map->end()) |
+ return it->second; |
+ |
+ Clipboard* clipboard = new ui::Clipboard; |
+ 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())) |