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)#ifndef UI_BASE_X_SELECTION_UTILS_H_ 6c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#define UI_BASE_X_SELECTION_UTILS_H_ 7c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 8c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include <X11/Xlib.h> 9c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 10c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Get rid of a macro from Xlib.h that conflicts with Aura's RootWindow class. 11c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#undef RootWindow 12c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 13c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include <map> 14c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 15c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/basictypes.h" 16eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/memory/ref_counted_memory.h" 17c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "ui/base/clipboard/clipboard.h" 185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "ui/base/ui_base_export.h" 1968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "ui/gfx/x/x11_atom_cache.h" 20c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 21c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace ui { 22eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochclass SelectionData; 23c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class X11AtomCache; 24c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 25c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)extern const char kMimeTypeMozillaURL[]; 26c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)extern const char kString[]; 27c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)extern const char kText[]; 28c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)extern const char kUtf8String[]; 29c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 30c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Returns a list of all text atoms that we handle. 315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)UI_BASE_EXPORT std::vector< ::Atom> GetTextAtomsFrom( 325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const X11AtomCache* atom_cache); 33c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)UI_BASE_EXPORT std::vector< ::Atom> GetURLAtomsFrom( 355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const X11AtomCache* atom_cache); 365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)UI_BASE_EXPORT std::vector< ::Atom> GetURIListAtomsFrom( 385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const X11AtomCache* atom_cache); 39c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// Places the intersection of |desired| and |offered| into |output|. 415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)UI_BASE_EXPORT void GetAtomIntersection(const std::vector< ::Atom>& desired, 425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const std::vector< ::Atom>& offered, 435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) std::vector< ::Atom>* output); 445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Takes the raw bytes of the base::string16 and copies them into |bytes|. 465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)UI_BASE_EXPORT void AddString16ToVector(const base::string16& str, 475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) std::vector<unsigned char>* bytes); 48c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Tokenizes and parses the Selection Data as if it is a URI List. 505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)UI_BASE_EXPORT std::vector<std::string> ParseURIList(const SelectionData& data); 51eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)UI_BASE_EXPORT std::string RefCountedMemoryToString( 53eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const scoped_refptr<base::RefCountedMemory>& memory); 54eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)UI_BASE_EXPORT base::string16 RefCountedMemoryToString16( 56eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const scoped_refptr<base::RefCountedMemory>& memory); 57eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 58c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)/////////////////////////////////////////////////////////////////////////////// 59c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 60c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Represents the selection in different data formats. Binary data passed in is 61c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// assumed to be allocated with new char[], and is owned by SelectionFormatMap. 625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class UI_BASE_EXPORT SelectionFormatMap { 63c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 64c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Our internal data store, which we only expose through iterators. 65eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch typedef std::map< ::Atom, scoped_refptr<base::RefCountedMemory> > InternalMap; 66eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch typedef InternalMap::const_iterator const_iterator; 67c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 68c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SelectionFormatMap(); 69c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ~SelectionFormatMap(); 70eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Copy and assignment deliberately open. 71c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 72c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Adds the selection in the format |atom|. Ownership of |data| is passed to 73c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // us. 74eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch void Insert(::Atom atom, const scoped_refptr<base::RefCountedMemory>& item); 75eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 76eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Returns the first of the requested_types or NULL if missing. 77eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ui::SelectionData GetFirstOf( 78eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const std::vector< ::Atom>& requested_types) const; 79eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 80eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Returns all the selected types. 81eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch std::vector< ::Atom> GetTypes() const; 82c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 83c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Pass through to STL map. Only allow non-mutation access. 84c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const_iterator begin() const { return data_.begin(); } 85c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const_iterator end() const { return data_.end(); } 86c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const_iterator find(::Atom atom) const { return data_.find(atom); } 87c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) size_t size() const { return data_.size(); } 88c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 89c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private: 90c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) InternalMap data_; 91c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}; 92c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 93c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)/////////////////////////////////////////////////////////////////////////////// 94c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 95c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// A holder for data with optional X11 deletion semantics. 965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class UI_BASE_EXPORT SelectionData { 97c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 98c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // |atom_cache| is still owned by caller. 99eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch SelectionData(); 100eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch SelectionData(::Atom type, 101eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const scoped_refptr<base::RefCountedMemory>& memory); 102eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch SelectionData(const SelectionData& rhs); 103c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ~SelectionData(); 104eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch SelectionData& operator=(const SelectionData& rhs); 105c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 106eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch bool IsValid() const; 107eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ::Atom GetType() const; 108eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const unsigned char* GetData() const; 109eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch size_t GetSize() const; 110c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 111c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // If |type_| is a string type, convert the data to UTF8 and return it. 112c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::string GetText() const; 113c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 114c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // If |type_| is the HTML type, returns the data as a string16. This detects 115c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // guesses the character encoding of the source. 1165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::string16 GetHtml() const; 117c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 118c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Assigns the raw data to the string. 119c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void AssignTo(std::string* result) const; 1205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void AssignTo(base::string16* result) const; 121c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 122c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private: 123c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ::Atom type_; 124eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch scoped_refptr<base::RefCountedMemory> memory_; 125c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 126c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) X11AtomCache atom_cache_; 127c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}; 128c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 129c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} // namespace ui 130c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 131c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif // UI_BASE_X_SELECTION_UTILS_H_ 132