selection_utils.cc revision 5d1f7b1de12d16ceb2c938c56701a3e8bfa558f7
1c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Copyright (c) 2013 The Chromium Authors. All rights reserved. 2c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 3c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// found in the LICENSE file. 4c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 5c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "ui/base/x/selection_utils.h" 6c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 7c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include <set> 8c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 9c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/i18n/icu_string_conversions.h" 10c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/logging.h" 115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/strings/string_util.h" 12868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h" 13c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "ui/base/clipboard/clipboard.h" 14eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "ui/base/x/x11_util.h" 1568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "ui/gfx/x/x11_atom_cache.h" 16c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 17c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace ui { 18c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 19c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)const char kMimeTypeMozillaURL[] = "text/x-moz-url"; 20c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)const char kString[] = "STRING"; 21c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)const char kText[] = "TEXT"; 22c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)const char kUtf8String[] = "UTF8_STRING"; 23c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 24c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)const char* kSelectionDataAtoms[] = { 25c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) Clipboard::kMimeTypeHTML, 26c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) kString, 27c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) kText, 28c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) kUtf8String, 29c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) NULL 30c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}; 31c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 32c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)std::vector< ::Atom> GetTextAtomsFrom(const X11AtomCache* atom_cache) { 33c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::vector< ::Atom> atoms; 344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) atoms.push_back(atom_cache->GetAtom(kUtf8String)); 35c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) atoms.push_back(atom_cache->GetAtom(kString)); 36c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) atoms.push_back(atom_cache->GetAtom(kText)); 37c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return atoms; 38c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 39c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 40c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)std::vector< ::Atom> GetURLAtomsFrom(const X11AtomCache* atom_cache) { 41c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::vector< ::Atom> atoms; 42c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) atoms.push_back(atom_cache->GetAtom(Clipboard::kMimeTypeURIList)); 43c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) atoms.push_back(atom_cache->GetAtom(kMimeTypeMozillaURL)); 44c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return atoms; 45c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 46c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)std::vector< ::Atom> GetURIListAtomsFrom(const X11AtomCache* atom_cache) { 485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) std::vector< ::Atom> atoms; 495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) atoms.push_back(atom_cache->GetAtom(Clipboard::kMimeTypeURIList)); 505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return atoms; 515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void GetAtomIntersection(const std::vector< ::Atom>& desired, 544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const std::vector< ::Atom>& offered, 55c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::vector< ::Atom>* output) { 564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) for (std::vector< ::Atom>::const_iterator it = desired.begin(); 574e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) it != desired.end(); ++it) { 584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) std::vector< ::Atom>::const_iterator jt = 594e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) std::find(offered.begin(), offered.end(), *it); 604e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (jt != offered.end()) 614e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) output->push_back(*it); 62c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 63c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 64c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void AddString16ToVector(const base::string16& str, 66eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch std::vector<unsigned char>* bytes) { 67eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const unsigned char* front = 68eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch reinterpret_cast<const unsigned char*>(str.data()); 69eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch bytes->insert(bytes->end(), front, front + (str.size() * 2)); 70eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 71eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)std::vector<std::string> ParseURIList(const SelectionData& data) { 735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // uri-lists are newline separated file lists in URL encoding. 745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) std::string unparsed; 755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) data.AssignTo(&unparsed); 765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) std::vector<std::string> tokens; 785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) Tokenize(unparsed, "\n", &tokens); 795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return tokens; 805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 82eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochstd::string RefCountedMemoryToString( 83eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const scoped_refptr<base::RefCountedMemory>& memory) { 847dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (!memory.get()) { 85eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch NOTREACHED(); 86eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return std::string(); 87eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 88eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 89eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch size_t size = memory->size(); 90eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (!size) 91eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return std::string(); 92eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 93eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const unsigned char* front = memory->front(); 94eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return std::string(reinterpret_cast<const char*>(front), size); 95eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 96eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)base::string16 RefCountedMemoryToString16( 98eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const scoped_refptr<base::RefCountedMemory>& memory) { 997dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (!memory.get()) { 100eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch NOTREACHED(); 1015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return base::string16(); 102eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 103eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 104eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch size_t size = memory->size(); 105eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (!size) 1065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return base::string16(); 107eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 108eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const unsigned char* front = memory->front(); 1095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return base::string16(reinterpret_cast<const base::char16*>(front), size / 2); 110eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 111eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 112c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)/////////////////////////////////////////////////////////////////////////////// 113c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 114c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)SelectionFormatMap::SelectionFormatMap() {} 115c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 116eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochSelectionFormatMap::~SelectionFormatMap() {} 117c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 118eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid SelectionFormatMap::Insert( 119eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ::Atom atom, 120eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const scoped_refptr<base::RefCountedMemory>& item) { 1213551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) data_.erase(atom); 122eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch data_.insert(std::make_pair(atom, item)); 123eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 124eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 125eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochui::SelectionData SelectionFormatMap::GetFirstOf( 126eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const std::vector< ::Atom>& requested_types) const { 127eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch for (std::vector< ::Atom>::const_iterator it = requested_types.begin(); 128eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch it != requested_types.end(); ++it) { 129eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const_iterator data_it = data_.find(*it); 130eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (data_it != data_.end()) { 131eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return SelectionData(data_it->first, data_it->second); 132eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 133c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 134eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 135eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return SelectionData(); 136c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 137c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 138eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochstd::vector< ::Atom> SelectionFormatMap::GetTypes() const { 139eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch std::vector< ::Atom> atoms; 140eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch for (const_iterator it = data_.begin(); it != data_.end(); ++it) 141eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch atoms.push_back(it->first); 142eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 143eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return atoms; 144c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 145c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 146c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)/////////////////////////////////////////////////////////////////////////////// 147c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 148eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochSelectionData::SelectionData() 149c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : type_(None), 15068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) atom_cache_(gfx::GetXDisplay(), kSelectionDataAtoms) { 151eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 152eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 153eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochSelectionData::SelectionData( 154eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ::Atom type, 155eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const scoped_refptr<base::RefCountedMemory>& memory) 156eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch : type_(type), 157eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch memory_(memory), 15868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) atom_cache_(gfx::GetXDisplay(), kSelectionDataAtoms) { 159c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 160c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 161eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochSelectionData::SelectionData(const SelectionData& rhs) 162eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch : type_(rhs.type_), 163eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch memory_(rhs.memory_), 16468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) atom_cache_(gfx::GetXDisplay(), kSelectionDataAtoms) { 165c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 166c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 167eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochSelectionData::~SelectionData() {} 168c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 169eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochSelectionData& SelectionData::operator=(const SelectionData& rhs) { 170eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch type_ = rhs.type_; 171eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch memory_ = rhs.memory_; 172eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // TODO(erg): In some future where we have to support multiple X Displays, 173eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // the following will also need to deal with the display. 174eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return *this; 175eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 176eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 177eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochbool SelectionData::IsValid() const { 178eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return type_ != None; 179eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 180eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 181eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch::Atom SelectionData::GetType() const { 182eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return type_; 183eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 184eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 185eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochconst unsigned char* SelectionData::GetData() const { 1867dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return memory_.get() ? memory_->front() : NULL; 187eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 188eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 189eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochsize_t SelectionData::GetSize() const { 1907dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return memory_.get() ? memory_->size() : 0; 191c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 192c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 193c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)std::string SelectionData::GetText() const { 194c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (type_ == atom_cache_.GetAtom(kUtf8String) || 195c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) type_ == atom_cache_.GetAtom(kText)) { 196eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return RefCountedMemoryToString(memory_); 197c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } else if (type_ == atom_cache_.GetAtom(kString)) { 198c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::string result; 199eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch base::ConvertToUtf8AndNormalize(RefCountedMemoryToString(memory_), 200c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::kCodepageLatin1, 201c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) &result); 202c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return result; 203c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } else { 204c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // BTW, I looked at COMPOUND_TEXT, and there's no way we're going to 205c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // support that. Yuck. 206c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) NOTREACHED(); 207c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return std::string(); 208c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 209c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 210c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)base::string16 SelectionData::GetHtml() const { 2125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::string16 markup; 213c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 214c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (type_ == atom_cache_.GetAtom(Clipboard::kMimeTypeHTML)) { 215eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const unsigned char* data = GetData(); 216eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch size_t size = GetSize(); 217eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 218c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // If the data starts with 0xFEFF, i.e., Byte Order Mark, assume it is 219c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // UTF-16, otherwise assume UTF-8. 220eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (size >= 2 && 221eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch reinterpret_cast<const uint16_t*>(data)[0] == 0xFEFF) { 222eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch markup.assign(reinterpret_cast<const uint16_t*>(data) + 1, 223eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch (size / 2) - 1); 224c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } else { 2255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::UTF8ToUTF16(reinterpret_cast<const char*>(data), size, &markup); 226c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 227c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 228c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // If there is a terminating NULL, drop it. 229c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!markup.empty() && markup.at(markup.length() - 1) == '\0') 230c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) markup.resize(markup.length() - 1); 231c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 232c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return markup; 233c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } else { 234c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) NOTREACHED(); 235c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return markup; 236c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 237c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 238c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 239c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void SelectionData::AssignTo(std::string* result) const { 240eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch *result = RefCountedMemoryToString(memory_); 241c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 242c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void SelectionData::AssignTo(base::string16* result) const { 244eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch *result = RefCountedMemoryToString16(memory_); 245c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 246c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 247c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} // namespace ui 248