| OLD | NEW |
| 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/dragdrop/os_exchange_data_provider_aurax11.h" | 5 #include "ui/base/dragdrop/os_exchange_data_provider_aurax11.h" |
| 6 | 6 |
| 7 #include "base/logging.h" | 7 #include "base/logging.h" |
| 8 #include "base/memory/ref_counted_memory.h" |
| 8 #include "base/message_loop/message_pump_aurax11.h" | 9 #include "base/message_loop/message_pump_aurax11.h" |
| 9 #include "base/strings/string_util.h" | 10 #include "base/strings/string_util.h" |
| 10 #include "base/strings/utf_string_conversions.h" | 11 #include "base/strings/utf_string_conversions.h" |
| 11 #include "net/base/net_util.h" | 12 #include "net/base/net_util.h" |
| 12 #include "ui/base/clipboard/clipboard.h" | 13 #include "ui/base/clipboard/clipboard.h" |
| 13 #include "ui/base/clipboard/scoped_clipboard_writer.h" | 14 #include "ui/base/clipboard/scoped_clipboard_writer.h" |
| 14 #include "ui/base/x/selection_utils.h" | 15 #include "ui/base/x/selection_utils.h" |
| 15 #include "ui/base/x/x11_util.h" | 16 #include "ui/base/x/x11_util.h" |
| 16 | 17 |
| 17 // Note: the GetBlah() methods are used immediately by the | 18 // Note: the GetBlah() methods are used immediately by the |
| (...skipping 15 matching lines...) Expand all Loading... |
| 33 Clipboard::kMimeTypeURIList, | 34 Clipboard::kMimeTypeURIList, |
| 34 kMimeTypeMozillaURL, | 35 kMimeTypeMozillaURL, |
| 35 Clipboard::kMimeTypeText, | 36 Clipboard::kMimeTypeText, |
| 36 NULL | 37 NULL |
| 37 }; | 38 }; |
| 38 | 39 |
| 39 } // namespace | 40 } // namespace |
| 40 | 41 |
| 41 OSExchangeDataProviderAuraX11::OSExchangeDataProviderAuraX11( | 42 OSExchangeDataProviderAuraX11::OSExchangeDataProviderAuraX11( |
| 42 ::Window x_window, | 43 ::Window x_window, |
| 43 scoped_ptr<SelectionFormatMap> selection) | 44 const SelectionFormatMap& selection) |
| 44 : x_display_(GetXDisplay()), | 45 : x_display_(GetXDisplay()), |
| 45 x_root_window_(DefaultRootWindow(x_display_)), | 46 x_root_window_(DefaultRootWindow(x_display_)), |
| 46 own_window_(false), | 47 own_window_(false), |
| 47 x_window_(x_window), | 48 x_window_(x_window), |
| 48 atom_cache_(x_display_, kAtomsToCache), | 49 atom_cache_(x_display_, kAtomsToCache), |
| 49 format_map_(selection.Pass()), | 50 format_map_(selection), |
| 50 selection_owner_(x_display_, x_window_, | 51 selection_owner_(x_display_, x_window_, |
| 51 atom_cache_.GetAtom(kDndSelection)) { | 52 atom_cache_.GetAtom(kDndSelection)) { |
| 52 // We don't know all possible MIME types at compile time. | 53 // We don't know all possible MIME types at compile time. |
| 53 atom_cache_.allow_uncached_atoms(); | 54 atom_cache_.allow_uncached_atoms(); |
| 54 } | 55 } |
| 55 | 56 |
| 56 OSExchangeDataProviderAuraX11::OSExchangeDataProviderAuraX11() | 57 OSExchangeDataProviderAuraX11::OSExchangeDataProviderAuraX11() |
| 57 : x_display_(GetXDisplay()), | 58 : x_display_(GetXDisplay()), |
| 58 x_root_window_(DefaultRootWindow(x_display_)), | 59 x_root_window_(DefaultRootWindow(x_display_)), |
| 59 own_window_(true), | 60 own_window_(true), |
| 60 x_window_(XCreateWindow( | 61 x_window_(XCreateWindow( |
| 61 x_display_, | 62 x_display_, |
| 62 x_root_window_, | 63 x_root_window_, |
| 63 -100, -100, 10, 10, // x, y, width, height | 64 -100, -100, 10, 10, // x, y, width, height |
| 64 0, // border width | 65 0, // border width |
| 65 CopyFromParent, // depth | 66 CopyFromParent, // depth |
| 66 InputOnly, | 67 InputOnly, |
| 67 CopyFromParent, // visual | 68 CopyFromParent, // visual |
| 68 0, | 69 0, |
| 69 NULL)), | 70 NULL)), |
| 70 atom_cache_(x_display_, kAtomsToCache), | 71 atom_cache_(x_display_, kAtomsToCache), |
| 71 format_map_(new SelectionFormatMap), | 72 format_map_(), |
| 72 selection_owner_(x_display_, x_window_, | 73 selection_owner_(x_display_, x_window_, |
| 73 atom_cache_.GetAtom(kDndSelection)) { | 74 atom_cache_.GetAtom(kDndSelection)) { |
| 74 // We don't know all possible MIME types at compile time. | 75 // We don't know all possible MIME types at compile time. |
| 75 atom_cache_.allow_uncached_atoms(); | 76 atom_cache_.allow_uncached_atoms(); |
| 76 | 77 |
| 77 XStoreName(x_display_, x_window_, "Chromium Drag & Drop Window"); | 78 XStoreName(x_display_, x_window_, "Chromium Drag & Drop Window"); |
| 78 | 79 |
| 79 base::MessagePumpAuraX11::Current()->AddDispatcherForWindow(this, x_window_); | 80 base::MessagePumpAuraX11::Current()->AddDispatcherForWindow(this, x_window_); |
| 80 } | 81 } |
| 81 | 82 |
| 82 OSExchangeDataProviderAuraX11::~OSExchangeDataProviderAuraX11() { | 83 OSExchangeDataProviderAuraX11::~OSExchangeDataProviderAuraX11() { |
| 83 if (own_window_) { | 84 if (own_window_) { |
| 84 base::MessagePumpAuraX11::Current()->RemoveDispatcherForWindow(x_window_); | 85 base::MessagePumpAuraX11::Current()->RemoveDispatcherForWindow(x_window_); |
| 85 XDestroyWindow(x_display_, x_window_); | 86 XDestroyWindow(x_display_, x_window_); |
| 86 } | 87 } |
| 87 } | 88 } |
| 88 | 89 |
| 89 void OSExchangeDataProviderAuraX11::TakeOwnershipOfSelection() const { | 90 void OSExchangeDataProviderAuraX11::TakeOwnershipOfSelection() const { |
| 90 selection_owner_.TakeOwnershipOfSelection( | 91 selection_owner_.TakeOwnershipOfSelection(format_map_); |
| 91 scoped_ptr<SelectionFormatMap>(format_map_->Clone())); | |
| 92 } | 92 } |
| 93 | 93 |
| 94 void OSExchangeDataProviderAuraX11::RetrieveTargets( | 94 void OSExchangeDataProviderAuraX11::RetrieveTargets( |
| 95 std::vector<Atom>* targets) const { | 95 std::vector<Atom>* targets) const { |
| 96 selection_owner_.RetrieveTargets(targets); | 96 selection_owner_.RetrieveTargets(targets); |
| 97 } | 97 } |
| 98 | 98 |
| 99 scoped_ptr<SelectionFormatMap> | 99 SelectionFormatMap OSExchangeDataProviderAuraX11::GetFormatMap() const { |
| 100 OSExchangeDataProviderAuraX11::CloneFormatMap() const { | 100 // We return the |selection_owner_|'s format map instead of our own in case |
| 101 // We clone the |selection_owner_|'s format map instead of our own in case | |
| 102 // ours has been modified since TakeOwnershipOfSelection() was called. | 101 // ours has been modified since TakeOwnershipOfSelection() was called. |
| 103 return selection_owner_.selection_format_map()->Clone(); | 102 return selection_owner_.selection_format_map(); |
| 104 } | 103 } |
| 105 | 104 |
| 106 void OSExchangeDataProviderAuraX11::SetString(const string16& text_data) { | 105 void OSExchangeDataProviderAuraX11::SetString(const string16& text_data) { |
| 107 std::string utf8 = UTF16ToUTF8(text_data); | 106 std::string utf8 = UTF16ToUTF8(text_data); |
| 107 scoped_refptr<base::RefCountedMemory> mem( |
| 108 base::RefCountedString::TakeString(&utf8)); |
| 108 | 109 |
| 109 // Ownership of |data| is passed to |format_map_|. | 110 format_map_.Insert(atom_cache_.GetAtom(Clipboard::kMimeTypeText), mem); |
| 110 size_t text_len = utf8.size(); | 111 format_map_.Insert(atom_cache_.GetAtom(kText), mem); |
| 111 char* data = new char[text_len]; | 112 format_map_.Insert(atom_cache_.GetAtom(kString), mem); |
| 112 memcpy(data, utf8.c_str(), text_len); | 113 format_map_.Insert(atom_cache_.GetAtom(kUtf8String), mem); |
| 113 | |
| 114 format_map_->Insert( | |
| 115 atom_cache_.GetAtom(Clipboard::kMimeTypeText), data, text_len); | |
| 116 format_map_->Insert( | |
| 117 atom_cache_.GetAtom(kText), data, text_len); | |
| 118 format_map_->Insert( | |
| 119 atom_cache_.GetAtom(kString), data, text_len); | |
| 120 format_map_->Insert( | |
| 121 atom_cache_.GetAtom(kUtf8String), data, text_len); | |
| 122 } | 114 } |
| 123 | 115 |
| 124 void OSExchangeDataProviderAuraX11::SetURL(const GURL& url, | 116 void OSExchangeDataProviderAuraX11::SetURL(const GURL& url, |
| 125 const string16& title) { | 117 const string16& title) { |
| 126 NOTIMPLEMENTED(); | 118 NOTIMPLEMENTED(); |
| 127 } | 119 } |
| 128 | 120 |
| 129 void OSExchangeDataProviderAuraX11::SetFilename(const base::FilePath& path) { | 121 void OSExchangeDataProviderAuraX11::SetFilename(const base::FilePath& path) { |
| 130 NOTIMPLEMENTED(); | 122 NOTIMPLEMENTED(); |
| 131 } | 123 } |
| 132 | 124 |
| 133 void OSExchangeDataProviderAuraX11::SetFilenames( | 125 void OSExchangeDataProviderAuraX11::SetFilenames( |
| 134 const std::vector<OSExchangeData::FileInfo>& filenames) { | 126 const std::vector<OSExchangeData::FileInfo>& filenames) { |
| 135 NOTIMPLEMENTED(); | 127 NOTIMPLEMENTED(); |
| 136 } | 128 } |
| 137 | 129 |
| 138 void OSExchangeDataProviderAuraX11::SetPickledData( | 130 void OSExchangeDataProviderAuraX11::SetPickledData( |
| 139 const OSExchangeData::CustomFormat& format, | 131 const OSExchangeData::CustomFormat& format, |
| 140 const Pickle& data) { | 132 const Pickle& data) { |
| 141 NOTIMPLEMENTED(); | 133 NOTIMPLEMENTED(); |
| 142 } | 134 } |
| 143 | 135 |
| 144 bool OSExchangeDataProviderAuraX11::GetString(string16* result) const { | 136 bool OSExchangeDataProviderAuraX11::GetString(string16* result) const { |
| 145 std::vector< ::Atom> text_atoms = ui::GetTextAtomsFrom(&atom_cache_); | 137 std::vector< ::Atom> text_atoms = ui::GetTextAtomsFrom(&atom_cache_); |
| 146 std::vector< ::Atom> requested_types; | 138 std::vector< ::Atom> requested_types; |
| 147 ui::GetAtomIntersection(text_atoms, GetTargets(), &requested_types); | 139 ui::GetAtomIntersection(text_atoms, GetTargets(), &requested_types); |
| 148 | 140 |
| 149 scoped_ptr<ui::SelectionData> data(format_map_->GetFirstOf(requested_types)); | 141 ui::SelectionData data(format_map_.GetFirstOf(requested_types)); |
| 150 if (data) { | 142 if (data.IsValid()) { |
| 151 std::string text = data->GetText(); | 143 std::string text = data.GetText(); |
| 152 *result = UTF8ToUTF16(text); | 144 *result = UTF8ToUTF16(text); |
| 153 return true; | 145 return true; |
| 154 } | 146 } |
| 155 | 147 |
| 156 return false; | 148 return false; |
| 157 } | 149 } |
| 158 | 150 |
| 159 bool OSExchangeDataProviderAuraX11::GetURLAndTitle(GURL* url, | 151 bool OSExchangeDataProviderAuraX11::GetURLAndTitle(GURL* url, |
| 160 string16* title) const { | 152 string16* title) const { |
| 161 std::vector< ::Atom> url_atoms = ui::GetURLAtomsFrom(&atom_cache_); | 153 std::vector< ::Atom> url_atoms = ui::GetURLAtomsFrom(&atom_cache_); |
| 162 std::vector< ::Atom> requested_types; | 154 std::vector< ::Atom> requested_types; |
| 163 ui::GetAtomIntersection(url_atoms, GetTargets(), &requested_types); | 155 ui::GetAtomIntersection(url_atoms, GetTargets(), &requested_types); |
| 164 | 156 |
| 165 scoped_ptr<ui::SelectionData> data(format_map_->GetFirstOf(requested_types)); | 157 ui::SelectionData data(format_map_.GetFirstOf(requested_types)); |
| 166 if (data) { | 158 if (data.IsValid()) { |
| 167 // TODO(erg): Technically, both of these forms can accept multiple URLs, | 159 // TODO(erg): Technically, both of these forms can accept multiple URLs, |
| 168 // but that doesn't match the assumptions of the rest of the system which | 160 // but that doesn't match the assumptions of the rest of the system which |
| 169 // expect single types. | 161 // expect single types. |
| 170 | 162 |
| 171 if (data->type() == atom_cache_.GetAtom(kMimeTypeMozillaURL)) { | 163 if (data.GetType() == atom_cache_.GetAtom(kMimeTypeMozillaURL)) { |
| 172 // Mozilla URLs are (UTF16: URL, newline, title). | 164 // Mozilla URLs are (UTF16: URL, newline, title). |
| 173 string16 unparsed; | 165 string16 unparsed; |
| 174 data->AssignTo(&unparsed); | 166 data.AssignTo(&unparsed); |
| 175 | 167 |
| 176 std::vector<string16> tokens; | 168 std::vector<string16> tokens; |
| 177 size_t num_tokens = Tokenize(unparsed, ASCIIToUTF16("\n"), &tokens); | 169 size_t num_tokens = Tokenize(unparsed, ASCIIToUTF16("\n"), &tokens); |
| 178 if (num_tokens >= 2) { | 170 if (num_tokens >= 2) { |
| 179 *url = GURL(tokens[0]); | 171 *url = GURL(tokens[0]); |
| 180 *title = tokens[1]; | 172 *title = tokens[1]; |
| 181 return true; | 173 return true; |
| 182 } else { | 174 } else { |
| 183 NOTREACHED() << "Data that claimed to be a Mozilla URL has " | 175 NOTREACHED() << "Data that claimed to be a Mozilla URL has " |
| 184 << num_tokens << " tokens instead of 2."; | 176 << num_tokens << " tokens instead of 2."; |
| 185 } | 177 } |
| 186 } else if (data->type() == atom_cache_.GetAtom( | 178 } else if (data.GetType() == atom_cache_.GetAtom( |
| 187 Clipboard::kMimeTypeURIList)) { | 179 Clipboard::kMimeTypeURIList)) { |
| 188 // uri-lists are newline separated file lists in URL encoding. | 180 // uri-lists are newline separated file lists in URL encoding. |
| 189 std::string unparsed; | 181 std::string unparsed; |
| 190 data->AssignTo(&unparsed); | 182 data.AssignTo(&unparsed); |
| 191 | 183 |
| 192 std::vector<std::string> tokens; | 184 std::vector<std::string> tokens; |
| 193 size_t num_tokens = Tokenize(unparsed, "\n", &tokens); | 185 size_t num_tokens = Tokenize(unparsed, "\n", &tokens); |
| 194 if (!num_tokens) { | 186 if (!num_tokens) { |
| 195 NOTREACHED() << "Empty URI list"; | 187 NOTREACHED() << "Empty URI list"; |
| 196 return false; | 188 return false; |
| 197 } | 189 } |
| 198 | 190 |
| 199 *url = GURL(tokens[0]); | 191 *url = GURL(tokens[0]); |
| 200 *title = string16(); | 192 *title = string16(); |
| (...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 258 NOTIMPLEMENTED(); | 250 NOTIMPLEMENTED(); |
| 259 } | 251 } |
| 260 | 252 |
| 261 bool OSExchangeDataProviderAuraX11::GetHtml(string16* html, | 253 bool OSExchangeDataProviderAuraX11::GetHtml(string16* html, |
| 262 GURL* base_url) const { | 254 GURL* base_url) const { |
| 263 std::vector< ::Atom> url_atoms; | 255 std::vector< ::Atom> url_atoms; |
| 264 url_atoms.push_back(atom_cache_.GetAtom(Clipboard::kMimeTypeHTML)); | 256 url_atoms.push_back(atom_cache_.GetAtom(Clipboard::kMimeTypeHTML)); |
| 265 std::vector< ::Atom> requested_types; | 257 std::vector< ::Atom> requested_types; |
| 266 ui::GetAtomIntersection(url_atoms, GetTargets(), &requested_types); | 258 ui::GetAtomIntersection(url_atoms, GetTargets(), &requested_types); |
| 267 | 259 |
| 268 scoped_ptr<ui::SelectionData> data(format_map_->GetFirstOf(requested_types)); | 260 ui::SelectionData data(format_map_.GetFirstOf(requested_types)); |
| 269 if (data) { | 261 if (data.IsValid()) { |
| 270 *html = data->GetHtml(); | 262 *html = data.GetHtml(); |
| 271 *base_url = GURL(); | 263 *base_url = GURL(); |
| 272 return true; | 264 return true; |
| 273 } | 265 } |
| 274 | 266 |
| 275 return false; | 267 return false; |
| 276 } | 268 } |
| 277 | 269 |
| 278 bool OSExchangeDataProviderAuraX11::HasHtml() const { | 270 bool OSExchangeDataProviderAuraX11::HasHtml() const { |
| 279 std::vector< ::Atom> url_atoms; | 271 std::vector< ::Atom> url_atoms; |
| 280 url_atoms.push_back(atom_cache_.GetAtom(Clipboard::kMimeTypeHTML)); | 272 url_atoms.push_back(atom_cache_.GetAtom(Clipboard::kMimeTypeHTML)); |
| (...skipping 30 matching lines...) Expand all Loading... |
| 311 | 303 |
| 312 return true; | 304 return true; |
| 313 } | 305 } |
| 314 | 306 |
| 315 bool OSExchangeDataProviderAuraX11::GetPlainTextURL(GURL* url) const { | 307 bool OSExchangeDataProviderAuraX11::GetPlainTextURL(GURL* url) const { |
| 316 NOTIMPLEMENTED(); | 308 NOTIMPLEMENTED(); |
| 317 return false; | 309 return false; |
| 318 } | 310 } |
| 319 | 311 |
| 320 std::vector< ::Atom> OSExchangeDataProviderAuraX11::GetTargets() const { | 312 std::vector< ::Atom> OSExchangeDataProviderAuraX11::GetTargets() const { |
| 321 return format_map_->GetTypes(); | 313 return format_map_.GetTypes(); |
| 322 } | 314 } |
| 323 | 315 |
| 324 /////////////////////////////////////////////////////////////////////////////// | 316 /////////////////////////////////////////////////////////////////////////////// |
| 325 // OSExchangeData, public: | 317 // OSExchangeData, public: |
| 326 | 318 |
| 327 // static | 319 // static |
| 328 OSExchangeData::Provider* OSExchangeData::CreateProvider() { | 320 OSExchangeData::Provider* OSExchangeData::CreateProvider() { |
| 329 return new OSExchangeDataProviderAuraX11(); | 321 return new OSExchangeDataProviderAuraX11(); |
| 330 } | 322 } |
| 331 | 323 |
| 332 } // namespace ui | 324 } // namespace ui |
| OLD | NEW |