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

Side by Side Diff: ui/base/clipboard/clipboard.cc

Issue 2011833003: Implement ui::ClipboardMus. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Remove static in test by creating forwarding clipboard subclass. Created 4 years, 6 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 unified diff | Download patch
« no previous file with comments | « ui/base/clipboard/clipboard.h ('k') | ui/base/clipboard/clipboard_android.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "ui/base/clipboard/clipboard.h" 5 #include "ui/base/clipboard/clipboard.h"
6 6
7 #include <iterator> 7 #include <iterator>
8 #include <limits> 8 #include <limits>
9 #include <memory> 9 #include <memory>
10 10
11 #include "base/logging.h" 11 #include "base/logging.h"
12 #include "base/memory/ptr_util.h"
12 #include "third_party/skia/include/core/SkBitmap.h" 13 #include "third_party/skia/include/core/SkBitmap.h"
13 #include "ui/gfx/geometry/size.h" 14 #include "ui/gfx/geometry/size.h"
14 15
15 namespace ui { 16 namespace ui {
16 17
17 base::LazyInstance<Clipboard::AllowedThreadsVector> 18 base::LazyInstance<Clipboard::AllowedThreadsVector>
18 Clipboard::allowed_threads_ = LAZY_INSTANCE_INITIALIZER; 19 Clipboard::allowed_threads_ = LAZY_INSTANCE_INITIALIZER;
19 base::LazyInstance<Clipboard::ClipboardMap> Clipboard::clipboard_map_ = 20 base::LazyInstance<Clipboard::ClipboardMap> Clipboard::clipboard_map_ =
20 LAZY_INSTANCE_INITIALIZER; 21 LAZY_INSTANCE_INITIALIZER;
21 base::LazyInstance<base::Lock>::Leaky Clipboard::clipboard_map_lock_ = 22 base::LazyInstance<base::Lock>::Leaky Clipboard::clipboard_map_lock_ =
22 LAZY_INSTANCE_INITIALIZER; 23 LAZY_INSTANCE_INITIALIZER;
23 24
24 // static 25 // static
25 void Clipboard::SetAllowedThreads( 26 void Clipboard::SetAllowedThreads(
26 const std::vector<base::PlatformThreadId>& allowed_threads) { 27 const std::vector<base::PlatformThreadId>& allowed_threads) {
27 base::AutoLock lock(clipboard_map_lock_.Get()); 28 base::AutoLock lock(clipboard_map_lock_.Get());
28 29
29 allowed_threads_.Get().clear(); 30 allowed_threads_.Get().clear();
30 std::copy(allowed_threads.begin(), allowed_threads.end(), 31 std::copy(allowed_threads.begin(), allowed_threads.end(),
31 std::back_inserter(allowed_threads_.Get())); 32 std::back_inserter(allowed_threads_.Get()));
32 } 33 }
33 34
34 // static 35 // static
36 void Clipboard::SetClipboardForCurrentThread(
37 std::unique_ptr<Clipboard> platform_clipboard) {
38 base::AutoLock lock(clipboard_map_lock_.Get());
39 base::PlatformThreadId id = Clipboard::GetAndValidateThreadID();
40
41 ClipboardMap* clipboard_map = clipboard_map_.Pointer();
42 ClipboardMap::const_iterator it = clipboard_map->find(id);
43 if (it != clipboard_map->end()) {
44 // This shouldn't happen. The clipboard should not already exist.
45 NOTREACHED();
46 }
47 clipboard_map->insert(std::make_pair(id, std::move(platform_clipboard)));
48 }
49
50 // static
35 Clipboard* Clipboard::GetForCurrentThread() { 51 Clipboard* Clipboard::GetForCurrentThread() {
36 base::AutoLock lock(clipboard_map_lock_.Get()); 52 base::AutoLock lock(clipboard_map_lock_.Get());
37 53 base::PlatformThreadId id = GetAndValidateThreadID();
38 base::PlatformThreadId id = base::PlatformThread::CurrentId();
39
40 AllowedThreadsVector* allowed_threads = allowed_threads_.Pointer();
41 if (!allowed_threads->empty()) {
42 bool found = false;
43 for (AllowedThreadsVector::const_iterator it = allowed_threads->begin();
44 it != allowed_threads->end(); ++it) {
45 if (*it == id) {
46 found = true;
47 break;
48 }
49 }
50
51 DCHECK(found);
52 }
53 54
54 ClipboardMap* clipboard_map = clipboard_map_.Pointer(); 55 ClipboardMap* clipboard_map = clipboard_map_.Pointer();
55 ClipboardMap::const_iterator it = clipboard_map->find(id); 56 ClipboardMap::const_iterator it = clipboard_map->find(id);
56 if (it != clipboard_map->end()) 57 if (it != clipboard_map->end())
57 return it->second; 58 return it->second.get();
58 59
59 Clipboard* clipboard = Clipboard::Create(); 60 Clipboard* clipboard = Clipboard::Create();
60 clipboard_map->insert(std::make_pair(id, clipboard)); 61 clipboard_map->insert(std::make_pair(id, base::WrapUnique(clipboard)));
61 return clipboard; 62 return clipboard;
62 } 63 }
63 64
64 void Clipboard::DestroyClipboardForCurrentThread() { 65 void Clipboard::DestroyClipboardForCurrentThread() {
65 base::AutoLock lock(clipboard_map_lock_.Get()); 66 base::AutoLock lock(clipboard_map_lock_.Get());
66 67
67 ClipboardMap* clipboard_map = clipboard_map_.Pointer(); 68 ClipboardMap* clipboard_map = clipboard_map_.Pointer();
68 base::PlatformThreadId id = base::PlatformThread::CurrentId(); 69 base::PlatformThreadId id = base::PlatformThread::CurrentId();
69 ClipboardMap::iterator it = clipboard_map->find(id); 70 ClipboardMap::iterator it = clipboard_map->find(id);
70 if (it != clipboard_map->end()) { 71 if (it != clipboard_map->end())
71 delete it->second;
72 clipboard_map->erase(it); 72 clipboard_map->erase(it);
73 }
74 } 73 }
75 74
76 void Clipboard::DispatchObject(ObjectType type, const ObjectMapParams& params) { 75 void Clipboard::DispatchObject(ObjectType type, const ObjectMapParams& params) {
77 // Ignore writes with empty parameters. 76 // Ignore writes with empty parameters.
78 for (const auto& param : params) { 77 for (const auto& param : params) {
79 if (param.empty()) 78 if (param.empty())
80 return; 79 return;
81 } 80 }
82 81
83 switch (type) { 82 switch (type) {
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
125 std::string(&(params[0].front()), params[0].size())), 124 std::string(&(params[0].front()), params[0].size())),
126 &(params[1].front()), 125 &(params[1].front()),
127 params[1].size()); 126 params[1].size());
128 break; 127 break;
129 128
130 default: 129 default:
131 NOTREACHED(); 130 NOTREACHED();
132 } 131 }
133 } 132 }
134 133
134 base::PlatformThreadId Clipboard::GetAndValidateThreadID() {
135 base::PlatformThreadId id = base::PlatformThread::CurrentId();
136 #ifndef NDEBUG
137 AllowedThreadsVector* allowed_threads = allowed_threads_.Pointer();
138 if (!allowed_threads->empty()) {
139 bool found = false;
140 for (AllowedThreadsVector::const_iterator it = allowed_threads->begin();
141 it != allowed_threads->end(); ++it) {
142 if (*it == id) {
143 found = true;
144 break;
145 }
146 }
147
148 DCHECK(found);
149 }
150 #endif
151
152 return id;
153 }
154
135 } // namespace ui 155 } // namespace ui
OLDNEW
« no previous file with comments | « ui/base/clipboard/clipboard.h ('k') | ui/base/clipboard/clipboard_android.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698