#ifndef UI_BASE_X_X11_OS_EXCHANGE_DATA_PROVIDER_H_
#define UI_BASE_X_X11_OS_EXCHANGE_DATA_PROVIDER_H_
#include <stdint.h>
#include <map>
#include <string_view>
#include "base/component_export.h"
#include "base/files/file_path.h"
#include "base/memory/raw_ptr.h"
#include "base/pickle.h"
#include "ui/base/dragdrop/os_exchange_data_provider.h"
#include "ui/base/x/selection_owner.h"
#include "ui/base/x/selection_requestor.h"
#include "ui/base/x/selection_utils.h"
#include "ui/gfx/geometry/vector2d.h"
#include "ui/gfx/image/image_skia.h"
#include "url/gurl.h"
namespace x11 {
class Connection;
}
namespace ui {
class OSExchangeDataProviderX11Test;
class COMPONENT_EXPORT(UI_BASE_X) XOSExchangeDataProvider
: public OSExchangeDataProvider {
public:
XOSExchangeDataProvider(x11::Window x_window,
x11::Window source_window,
const SelectionFormatMap& selection);
XOSExchangeDataProvider();
~XOSExchangeDataProvider() override;
XOSExchangeDataProvider(const XOSExchangeDataProvider&) = delete;
XOSExchangeDataProvider& operator=(const XOSExchangeDataProvider&) = delete;
void TakeOwnershipOfSelection() const;
void RetrieveTargets(std::vector<x11::Atom>* targets) const;
SelectionFormatMap GetFormatMap() const;
const base::FilePath& file_contents_name() const {
return file_contents_name_;
}
std::unique_ptr<OSExchangeDataProvider> Clone() const override;
void MarkRendererTaintedFromOrigin(const url::Origin& origin) override;
bool IsRendererTainted() const override;
std::optional<url::Origin> GetRendererTaintedOrigin() const override;
void MarkAsFromPrivileged() override;
bool IsFromPrivileged() const override;
void SetString(std::u16string_view data) override;
void SetURL(const GURL& url, std::u16string_view title) override;
void SetFilename(const base::FilePath& path) override;
void SetFilenames(const std::vector<FileInfo>& filenames) override;
void SetPickledData(const ClipboardFormatType& format,
const base::Pickle& pickle) override;
std::optional<std::u16string> GetString() const override;
std::optional<UrlInfo> GetURLAndTitle(
FilenameToURLPolicy policy) const override;
std::optional<std::vector<GURL>> GetURLs(
FilenameToURLPolicy policy) const override;
std::optional<std::vector<FileInfo>> GetFilenames() const override;
std::optional<base::Pickle> GetPickledData(
const ClipboardFormatType& format) const override;
bool HasString() const override;
bool HasURL(FilenameToURLPolicy policy) const override;
bool HasFile() const override;
bool HasCustomFormat(const ClipboardFormatType& format) const override;
void SetFileContents(const base::FilePath& filename,
const std::string& file_contents) override;
std::optional<FileContentsInfo> GetFileContents() const override;
bool HasFileContents() const override;
void SetHtml(const std::u16string& html, const GURL& base_url) override;
std::optional<HtmlInfo> GetHtml() const override;
bool HasHtml() const override;
void SetDragImage(const gfx::ImageSkia& image,
const gfx::Vector2d& cursor_offset) override;
gfx::ImageSkia GetDragImage() const override;
gfx::Vector2d GetDragImageOffset() const override;
void SetSource(std::unique_ptr<DataTransferEndpoint> data_source) override;
DataTransferEndpoint* GetSource() const override;
protected:
friend class OSExchangeDataProviderX11Test;
using PickleData = std::map<ClipboardFormatType, base::Pickle>;
bool own_window() const { return own_window_; }
x11::Window x_window() const { return x_window_; }
const SelectionFormatMap& format_map() const { return format_map_; }
void set_format_map(const SelectionFormatMap& format_map) {
format_map_ = format_map;
}
void set_file_contents_name(const base::FilePath& path) {
file_contents_name_ = path;
}
SelectionOwner& selection_owner() const { return selection_owner_; }
std::vector<x11::Atom> GetTargets() const;
void InsertData(x11::Atom format,
const scoped_refptr<base::RefCountedMemory>& data);
private:
gfx::ImageSkia drag_image_;
gfx::Vector2d drag_image_offset_;
raw_ref<x11::Connection> connection_;
x11::Window x_root_window_;
const bool own_window_;
x11::Window x_window_;
x11::Window source_window_;
SelectionFormatMap format_map_;
base::FilePath file_contents_name_;
mutable SelectionOwner selection_owner_;
bool is_from_privileged_ = false;
};
}
#endif