Chromium Code Reviews| Index: ui/base/clipboard/clipboard_aurax11.cc |
| diff --git a/ui/base/clipboard/clipboard_aurax11.cc b/ui/base/clipboard/clipboard_aurax11.cc |
| index 8809d262ffe56a600038452e8d194df8ee10d0ab..71df894f7cf893737c423c7fbff5a24c11d1170f 100644 |
| --- a/ui/base/clipboard/clipboard_aurax11.cc |
| +++ b/ui/base/clipboard/clipboard_aurax11.cc |
| @@ -239,7 +239,7 @@ class Clipboard::AuraX11Details : public base::MessagePumpDispatcher { |
| SelectionRequestor* GetSelectionRequestorForBuffer(Buffer buffer); |
| // Finds the SelectionFormatMap for the incoming selection atom. |
| - SelectionFormatMap* LookupStorageForAtom(::Atom atom); |
| + const SelectionFormatMap& LookupStorageForAtom(::Atom atom); |
| // As we need to collect all the data types before we tell X11 that we own a |
| // particular selection, we create a temporary clipboard mapping that |
| @@ -248,7 +248,8 @@ class Clipboard::AuraX11Details : public base::MessagePumpDispatcher { |
| void CreateNewClipboardData(); |
| // Inserts a mapping into clipboard_data_. |
| - void InsertMapping(const std::string& key, char* data, size_t data_len); |
| + void InsertMapping(const std::string& key, |
| + const scoped_refptr<base::RefCountedMemory>& memory); |
| // Moves the temporary |clipboard_data_| to the long term data storage for |
| // |buffer|. |
| @@ -262,9 +263,8 @@ class Clipboard::AuraX11Details : public base::MessagePumpDispatcher { |
| // selection holder is some other window, we spin up a nested message loop |
| // and do the asynchronous dance with whatever application is holding the |
| // selection. |
| - scoped_ptr<SelectionData> RequestAndWaitForTypes( |
| - Buffer buffer, |
| - const std::vector< ::Atom>& types); |
| + ui::SelectionData RequestAndWaitForTypes(Buffer buffer, |
| + const std::vector< ::Atom>& types); |
| // Retrieves the list of possible data types the current clipboard owner has. |
| // |
| @@ -299,7 +299,7 @@ class Clipboard::AuraX11Details : public base::MessagePumpDispatcher { |
| SelectionRequestor primary_requestor_; |
| // Temporary target map that we write to during DispatchObects. |
| - scoped_ptr<SelectionFormatMap> clipboard_data_; |
| + SelectionFormatMap clipboard_data_; |
| // Objects which offer selection data to other windows. |
| SelectionOwner clipboard_owner_; |
| @@ -349,14 +349,14 @@ Clipboard::AuraX11Details::~AuraX11Details() { |
| return XA_PRIMARY; |
| } |
| -SelectionFormatMap* Clipboard::AuraX11Details::LookupStorageForAtom( |
| +const SelectionFormatMap& Clipboard::AuraX11Details::LookupStorageForAtom( |
| ::Atom atom) { |
| - if (atom == XA_PRIMARY) |
| + if (atom == XA_PRIMARY) { |
| return primary_owner_.selection_format_map(); |
| - else if (atom == atom_cache_.GetAtom(kClipboard)) |
| + } else { |
|
sky
2013/06/24 20:36:18
nit: style guide says no else when you have a retu
Elliot Glaysher
2013/06/24 20:54:35
Changed above instance, too, while I'm here.
|
| + DCHECK_EQ(atom_cache_.GetAtom(kClipboard), atom); |
| return clipboard_owner_.selection_format_map(); |
| - else |
| - return NULL; |
| + } |
| } |
| ui::SelectionRequestor* |
| @@ -368,42 +368,37 @@ Clipboard::AuraX11Details::GetSelectionRequestorForBuffer(Buffer buffer) { |
| } |
| void Clipboard::AuraX11Details::CreateNewClipboardData() { |
| - clipboard_data_.reset(new SelectionFormatMap); |
| + clipboard_data_ = SelectionFormatMap(); |
| } |
| -void Clipboard::AuraX11Details::InsertMapping(const std::string& key, |
| - char* data, |
| - size_t data_len) { |
| +void Clipboard::AuraX11Details::InsertMapping( |
| + const std::string& key, |
| + const scoped_refptr<base::RefCountedMemory>& memory) { |
| ::Atom atom_key = atom_cache_.GetAtom(key.c_str()); |
| - clipboard_data_->Insert(atom_key, data, data_len); |
| + clipboard_data_.Insert(atom_key, memory); |
| } |
| void Clipboard::AuraX11Details::TakeOwnershipOfSelection(Buffer buffer) { |
| if (buffer == BUFFER_STANDARD) |
| - return clipboard_owner_.TakeOwnershipOfSelection(clipboard_data_.Pass()); |
| + return clipboard_owner_.TakeOwnershipOfSelection(clipboard_data_); |
| else |
| - return primary_owner_.TakeOwnershipOfSelection(clipboard_data_.Pass()); |
| + return primary_owner_.TakeOwnershipOfSelection(clipboard_data_); |
| } |
| -scoped_ptr<SelectionData> Clipboard::AuraX11Details::RequestAndWaitForTypes( |
| +SelectionData Clipboard::AuraX11Details::RequestAndWaitForTypes( |
| Buffer buffer, |
| const std::vector< ::Atom>& types) { |
| ::Atom selection_name = LookupSelectionForBuffer(buffer); |
| if (XGetSelectionOwner(x_display_, selection_name) == x_window_) { |
| // We can local fastpath instead of playing the nested message loop game |
| // with the X server. |
| - SelectionFormatMap* format_map = LookupStorageForAtom(selection_name); |
| - DCHECK(format_map); |
| + const SelectionFormatMap& format_map = LookupStorageForAtom(selection_name); |
| for (std::vector< ::Atom>::const_iterator it = types.begin(); |
| it != types.end(); ++it) { |
| - SelectionFormatMap::const_iterator format_map_it = format_map->find(*it); |
| - if (format_map_it != format_map->end()) { |
| - scoped_ptr<SelectionData> data_out(new SelectionData); |
| - data_out->Set(format_map_it->first, format_map_it->second.first, |
| - format_map_it->second.second, false); |
| - return data_out.Pass(); |
| - } |
| + SelectionFormatMap::const_iterator format_map_it = format_map.find(*it); |
| + if (format_map_it != format_map.end()) |
| + return SelectionData(format_map_it->first, format_map_it->second); |
| } |
| } else { |
| TargetList targets = WaitAndGetTargetsList(buffer); |
| @@ -414,7 +409,7 @@ scoped_ptr<SelectionData> Clipboard::AuraX11Details::RequestAndWaitForTypes( |
| return receiver->RequestAndWaitForTypes(intersection); |
| } |
| - return scoped_ptr<SelectionData>(); |
| + return SelectionData(); |
| } |
| TargetList Clipboard::AuraX11Details::WaitAndGetTargetsList( |
| @@ -423,15 +418,14 @@ TargetList Clipboard::AuraX11Details::WaitAndGetTargetsList( |
| std::vector< ::Atom> out; |
| if (XGetSelectionOwner(x_display_, selection_name) == x_window_) { |
| // We can local fastpath and return the list of local targets. |
| - SelectionFormatMap* format_map = LookupStorageForAtom(selection_name); |
| - DCHECK(format_map); |
| + const SelectionFormatMap& format_map = LookupStorageForAtom(selection_name); |
| - for (SelectionFormatMap::const_iterator it = format_map->begin(); |
| - it != format_map->end(); ++it) { |
| + for (SelectionFormatMap::const_iterator it = format_map.begin(); |
| + it != format_map.end(); ++it) { |
| out.push_back(it->first); |
| } |
| } else { |
| - unsigned char* data = NULL; |
| + scoped_refptr<base::RefCountedMemory> data; |
| size_t out_data_items = 0; |
| ::Atom out_type = None; |
| @@ -441,11 +435,9 @@ TargetList Clipboard::AuraX11Details::WaitAndGetTargetsList( |
| NULL, |
| &out_data_items, |
| &out_type)) { |
| - ::Atom* atom_array = reinterpret_cast< ::Atom*>(data); |
| + const ::Atom* atom_array = reinterpret_cast<const ::Atom*>(data->front()); |
| for (size_t i = 0; i < out_data_items; ++i) |
| out.push_back(atom_array[i]); |
| - |
| - XFree(data); |
| } else { |
| // There was no target list. Most Java apps doesn't offer a TARGETS list, |
| // even though they AWT to. They will offer individual text types if you |
| @@ -599,22 +591,20 @@ void Clipboard::ReadAvailableTypes(Buffer buffer, std::vector<string16>* types, |
| types->push_back(UTF8ToUTF16(kMimeTypePNG)); |
| *contains_filenames = false; |
| - scoped_ptr<SelectionData> data(aurax11_details_->RequestAndWaitForTypes( |
| + SelectionData data(aurax11_details_->RequestAndWaitForTypes( |
| buffer, |
| aurax11_details_->GetAtomsForFormat(GetWebCustomDataFormatType()))); |
| - if (!data.get()) |
| - return; |
| - |
| - ReadCustomDataTypes(data->data(), data->size(), types); |
| + if (data.IsValid()) |
| + ReadCustomDataTypes(data.GetData(), data.GetSize(), types); |
| } |
| void Clipboard::ReadText(Buffer buffer, string16* result) const { |
| DCHECK(CalledOnValidThread()); |
| - scoped_ptr<SelectionData> data(aurax11_details_->RequestAndWaitForTypes( |
| + SelectionData data(aurax11_details_->RequestAndWaitForTypes( |
| buffer, aurax11_details_->GetTextAtoms())); |
| - if (data.get()) { |
| - std::string text = data->GetText(); |
| + if (data.IsValid()) { |
| + std::string text = data.GetText(); |
| *result = UTF8ToUTF16(text); |
| } |
| } |
| @@ -622,10 +612,10 @@ void Clipboard::ReadText(Buffer buffer, string16* result) const { |
| void Clipboard::ReadAsciiText(Buffer buffer, std::string* result) const { |
| DCHECK(CalledOnValidThread()); |
| - scoped_ptr<SelectionData> data(aurax11_details_->RequestAndWaitForTypes( |
| + SelectionData data(aurax11_details_->RequestAndWaitForTypes( |
| buffer, aurax11_details_->GetTextAtoms())); |
| - if (data.get()) |
| - result->assign(data->GetText()); |
| + if (data.IsValid()) |
| + result->assign(data.GetText()); |
| } |
| // TODO(estade): handle different charsets. |
| @@ -642,25 +632,24 @@ void Clipboard::ReadHTML(Buffer buffer, |
| *fragment_start = 0; |
| *fragment_end = 0; |
| - scoped_ptr<SelectionData> data(aurax11_details_->RequestAndWaitForTypes( |
| + SelectionData data(aurax11_details_->RequestAndWaitForTypes( |
| buffer, aurax11_details_->GetAtomsForFormat(GetHtmlFormatType()))); |
| - if (!data.get()) |
| - return; |
| + if (data.IsValid()) { |
| + *markup = data.GetHtml(); |
| - *markup = data->GetHtml(); |
| - |
| - *fragment_start = 0; |
| - DCHECK(markup->length() <= kuint32max); |
| - *fragment_end = static_cast<uint32>(markup->length()); |
| + *fragment_start = 0; |
| + DCHECK(markup->length() <= kuint32max); |
| + *fragment_end = static_cast<uint32>(markup->length()); |
| + } |
| } |
| void Clipboard::ReadRTF(Buffer buffer, std::string* result) const { |
| DCHECK(CalledOnValidThread()); |
| - scoped_ptr<SelectionData> data(aurax11_details_->RequestAndWaitForTypes( |
| + SelectionData data(aurax11_details_->RequestAndWaitForTypes( |
| buffer, aurax11_details_->GetAtomsForFormat(GetRtfFormatType()))); |
| - if (data.get()) |
| - data->AssignTo(result); |
| + if (data.IsValid()) |
| + data.AssignTo(result); |
| } |
| SkBitmap Clipboard::ReadImage(Buffer buffer) const { |
| @@ -674,13 +663,11 @@ void Clipboard::ReadCustomData(Buffer buffer, |
| string16* result) const { |
| DCHECK(CalledOnValidThread()); |
| - scoped_ptr<SelectionData> data(aurax11_details_->RequestAndWaitForTypes( |
| + SelectionData data(aurax11_details_->RequestAndWaitForTypes( |
| buffer, |
| aurax11_details_->GetAtomsForFormat(GetWebCustomDataFormatType()))); |
| - if (!data.get()) |
| - return; |
| - |
| - ReadCustomDataForType(data->data(), data->size(), type, result); |
| + if (data.IsValid()) |
| + ReadCustomDataForType(data.GetData(), data.GetSize(), type, result); |
| } |
| void Clipboard::ReadBookmark(string16* title, std::string* url) const { |
| @@ -692,10 +679,10 @@ void Clipboard::ReadBookmark(string16* title, std::string* url) const { |
| void Clipboard::ReadData(const FormatType& format, std::string* result) const { |
| DCHECK(CalledOnValidThread()); |
| - scoped_ptr<SelectionData> data(aurax11_details_->RequestAndWaitForTypes( |
| + SelectionData data(aurax11_details_->RequestAndWaitForTypes( |
| BUFFER_STANDARD, aurax11_details_->GetAtomsForFormat(format))); |
| - if (data.get()) |
| - data->AssignTo(result); |
| + if (data.IsValid()) |
| + data.AssignTo(result); |
| } |
| uint64 Clipboard::GetSequenceNumber(Buffer buffer) { |
| @@ -707,13 +694,14 @@ uint64 Clipboard::GetSequenceNumber(Buffer buffer) { |
| } |
| void Clipboard::WriteText(const char* text_data, size_t text_len) { |
| - char* data = new char[text_len]; |
| - memcpy(data, text_data, text_len); |
| + std::string str(text_data, text_len); |
| + scoped_refptr<base::RefCountedMemory> mem( |
| + base::RefCountedString::TakeString(&str)); |
| - aurax11_details_->InsertMapping(kMimeTypeText, data, text_len); |
| - aurax11_details_->InsertMapping(kText, data, text_len); |
| - aurax11_details_->InsertMapping(kString, data, text_len); |
| - aurax11_details_->InsertMapping(kUtf8String, data, text_len); |
| + aurax11_details_->InsertMapping(kMimeTypeText, mem); |
| + aurax11_details_->InsertMapping(kText, mem); |
| + aurax11_details_->InsertMapping(kString, mem); |
| + aurax11_details_->InsertMapping(kUtf8String, mem); |
| } |
| void Clipboard::WriteHTML(const char* markup_data, |
| @@ -723,16 +711,14 @@ void Clipboard::WriteHTML(const char* markup_data, |
| // TODO(estade): We need to expand relative links with |url_data|. |
| static const char* html_prefix = "<meta http-equiv=\"content-type\" " |
| "content=\"text/html; charset=utf-8\">"; |
| - size_t html_prefix_len = strlen(html_prefix); |
| - size_t total_len = html_prefix_len + markup_len + 1; |
| - |
| - char* data = new char[total_len]; |
| - snprintf(data, total_len, "%s", html_prefix); |
| - memcpy(data + html_prefix_len, markup_data, markup_len); |
| + std::string data = html_prefix; |
| + data += std::string(markup_data, markup_len); |
| // Some programs expect NULL-terminated data. See http://crbug.com/42624 |
| - data[total_len - 1] = '\0'; |
| + data += '\0'; |
| - aurax11_details_->InsertMapping(kMimeTypeHTML, data, total_len); |
| + scoped_refptr<base::RefCountedMemory> mem( |
| + base::RefCountedString::TakeString(&data)); |
| + aurax11_details_->InsertMapping(kMimeTypeHTML, mem); |
| } |
| void Clipboard::WriteRTF(const char* rtf_data, size_t data_len) { |
| @@ -746,18 +732,21 @@ void Clipboard::WriteBookmark(const char* title_data, |
| // Write as a mozilla url (UTF16: URL, newline, title). |
| string16 url = UTF8ToUTF16(std::string(url_data, url_len) + "\n"); |
| string16 title = UTF8ToUTF16(std::string(title_data, title_len)); |
| - int data_len = 2 * (title.length() + url.length()); |
| - char* data = new char[data_len]; |
| - memcpy(data, url.data(), 2 * url.length()); |
| - memcpy(data + 2 * url.length(), title.data(), 2 * title.length()); |
| - aurax11_details_->InsertMapping(kMimeTypeMozillaURL, data, data_len); |
| + std::vector<unsigned char> data; |
| + ui::AddString16ToVector(url, &data); |
| + ui::AddString16ToVector(title, &data); |
| + scoped_refptr<base::RefCountedMemory> mem( |
| + base::RefCountedBytes::TakeVector(&data)); |
| + |
| + aurax11_details_->InsertMapping(kMimeTypeMozillaURL, mem); |
| } |
| // Write an extra flavor that signifies WebKit was the last to modify the |
| // pasteboard. This flavor has no data. |
| void Clipboard::WriteWebSmartPaste() { |
| - aurax11_details_->InsertMapping(kMimeTypeWebkitSmartPaste, NULL, 0); |
| + aurax11_details_->InsertMapping(kMimeTypeWebkitSmartPaste, |
| + scoped_refptr<base::RefCountedMemory>()); |
| } |
| void Clipboard::WriteBitmap(const char* pixel_data, const char* size_data) { |
| @@ -774,9 +763,11 @@ void Clipboard::WriteData(const FormatType& format, |
| // Therefore we must upkeep their integrity. |
| if (format.Equals(GetBitmapFormatType())) |
| return; |
| - char* data = new char[data_len]; |
| - memcpy(data, data_data, data_len); |
| - aurax11_details_->InsertMapping(format.ToString(), data, data_len); |
| + |
| + std::vector<unsigned char> bytes(data_data, data_data + data_len); |
| + scoped_refptr<base::RefCountedMemory> mem( |
| + base::RefCountedBytes::TakeVector(&bytes)); |
| + aurax11_details_->InsertMapping(format.ToString(), mem); |
| } |
| // static |