Chromium Code Reviews| Index: ui/base/clipboard/clipboard.cc |
| diff --git a/ui/base/clipboard/clipboard.cc b/ui/base/clipboard/clipboard.cc |
| index d20d85414ea620649a91e45cd368b27a79fe3e3b..d505ec6145e2cc0017f8dc695b6244de8bbe33fd 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::DestroyClipboards() { |
| + base::AutoLock lock(g_clipboard_map_lock.Get()); |
| + |
| + ClipboardMap* clipboard_map = g_clipboard_map.Pointer(); |
| + for (ClipboardMap::iterator it = clipboard_map->begin(); |
| + it != clipboard_map->end(); ++it) { |
| + delete it->second; |
|
jam
2012/09/05 17:42:28
the comment in the header says each clipboard will
Elliot Glaysher
2012/09/05 18:07:22
The comment was wrong (and I think impossible).
T
|
| + } |
| + |
| + clipboard_map->clear(); |
| +} |
| + |
| 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())) |