// Copyright (c) 2012 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef UI_BASE_DRAGDROP_OS_EXCHANGE_DATA_H_ #define UI_BASE_DRAGDROP_OS_EXCHANGE_DATA_H_ #include "build/build_config.h" #include <set> #include <string> #if defined(OS_WIN) #include <objidl.h> #endif #include "base/basictypes.h" #include "base/files/file_path.h" #include "base/memory/scoped_ptr.h" #include "ui/base/clipboard/clipboard.h" #include "ui/base/dragdrop/download_file_interface.h" #include "ui/base/ui_base_export.h" class GURL; class Pickle; namespace gfx { class ImageSkia; class Vector2d; } namespace ui { struct FileInfo; /////////////////////////////////////////////////////////////////////////////// // // OSExchangeData // An object that holds interchange data to be sent out to OS services like // clipboard, drag and drop, etc. This object exposes an API that clients can // use to specify raw data and its high level type. This object takes care of // translating that into something the OS can understand. // /////////////////////////////////////////////////////////////////////////////// // NOTE: Support for html and file contents is required by TabContentViewWin. // TabContentsViewGtk uses a different class to handle drag support that does // not use OSExchangeData. As such, file contents and html support is only // compiled on windows. class UI_BASE_EXPORT OSExchangeData { public: // CustomFormats are used for non-standard data types. For example, bookmark // nodes are written using a CustomFormat. // TODO(dcheng): Remove this completely and just use Clipboard::FormatType. typedef Clipboard::FormatType CustomFormat; // Enumeration of the known formats. enum Format { STRING = 1 << 0, URL = 1 << 1, FILE_NAME = 1 << 2, PICKLED_DATA = 1 << 3, #if defined(OS_WIN) FILE_CONTENTS = 1 << 4, #endif #if defined(USE_AURA) HTML = 1 << 5, #endif }; // Controls whether or not filenames should be converted to file: URLs when // getting a URL. enum FilenameToURLPolicy { CONVERT_FILENAMES, DO_NOT_CONVERT_FILENAMES, }; // Encapsulates the info about a file to be downloaded. struct UI_BASE_EXPORT DownloadFileInfo { DownloadFileInfo(const base::FilePath& filename, DownloadFileProvider* downloader); ~DownloadFileInfo(); base::FilePath filename; scoped_refptr<DownloadFileProvider> downloader; }; // Provider defines the platform specific part of OSExchangeData that // interacts with the native system. class UI_BASE_EXPORT Provider { public: Provider() {} virtual ~Provider() {} virtual Provider* Clone() const = 0; virtual void MarkOriginatedFromRenderer() = 0; virtual bool DidOriginateFromRenderer() const = 0; virtual void SetString(const base::string16& data) = 0; virtual void SetURL(const GURL& url, const base::string16& title) = 0; virtual void SetFilename(const base::FilePath& path) = 0; virtual void SetFilenames( const std::vector<FileInfo>& file_names) = 0; virtual void SetPickledData(const CustomFormat& format, const Pickle& data) = 0; virtual bool GetString(base::string16* data) const = 0; virtual bool GetURLAndTitle(FilenameToURLPolicy policy, GURL* url, base::string16* title) const = 0; virtual bool GetFilename(base::FilePath* path) const = 0; virtual bool GetFilenames( std::vector<FileInfo>* file_names) const = 0; virtual bool GetPickledData(const CustomFormat& format, Pickle* data) const = 0; virtual bool HasString() const = 0; virtual bool HasURL(FilenameToURLPolicy policy) const = 0; virtual bool HasFile() const = 0; virtual bool HasCustomFormat(const CustomFormat& format) const = 0; #if (!defined(OS_CHROMEOS) && defined(USE_X11)) || defined(OS_WIN) virtual void SetFileContents(const base::FilePath& filename, const std::string& file_contents) = 0; #endif #if defined(OS_WIN) virtual bool GetFileContents(base::FilePath* filename, std::string* file_contents) const = 0; virtual bool HasFileContents() const = 0; virtual void SetDownloadFileInfo(const DownloadFileInfo& download) = 0; #endif #if defined(USE_AURA) virtual void SetHtml(const base::string16& html, const GURL& base_url) = 0; virtual bool GetHtml(base::string16* html, GURL* base_url) const = 0; virtual bool HasHtml() const = 0; #endif #if defined(USE_AURA) virtual void SetDragImage(const gfx::ImageSkia& image, const gfx::Vector2d& cursor_offset) = 0; virtual const gfx::ImageSkia& GetDragImage() const = 0; virtual const gfx::Vector2d& GetDragImageOffset() const = 0; #endif }; // Creates the platform specific Provider. static Provider* CreateProvider(); OSExchangeData(); // Creates an OSExchangeData with the specified provider. OSExchangeData // takes ownership of the supplied provider. explicit OSExchangeData(Provider* provider); ~OSExchangeData(); // Returns the Provider, which actually stores and manages the data. const Provider& provider() const { return *provider_; } Provider& provider() { return *provider_; } // Marks drag data as tainted if it originates from the renderer. This is used // to avoid granting privileges to a renderer when dragging in tainted data, // since it could allow potential escalation of privileges. void MarkOriginatedFromRenderer(); bool DidOriginateFromRenderer() const; // These functions add data to the OSExchangeData object of various Chrome // types. The OSExchangeData object takes care of translating the data into // a format suitable for exchange with the OS. // NOTE WELL: Typically, a data object like this will contain only one of the // following types of data. In cases where more data is held, the // order in which these functions are called is _important_! // ---> The order types are added to an OSExchangeData object controls // the order of enumeration in our IEnumFORMATETC implementation! // This comes into play when selecting the best (most preferable) // data type for insertion into a DropTarget. void SetString(const base::string16& data); // A URL can have an optional title in some exchange formats. void SetURL(const GURL& url, const base::string16& title); // A full path to a file. void SetFilename(const base::FilePath& path); // Full path to one or more files. See also SetFilenames() in Provider. void SetFilenames( const std::vector<FileInfo>& file_names); // Adds pickled data of the specified format. void SetPickledData(const CustomFormat& format, const Pickle& data); // These functions retrieve data of the specified type. If data exists, the // functions return and the result is in the out parameter. If the data does // not exist, the out parameter is not touched. The out parameter cannot be // NULL. bool GetString(base::string16* data) const; bool GetURLAndTitle(FilenameToURLPolicy policy, GURL* url, base::string16* title) const; // Return the path of a file, if available. bool GetFilename(base::FilePath* path) const; bool GetFilenames( std::vector<FileInfo>* file_names) const; bool GetPickledData(const CustomFormat& format, Pickle* data) const; // Test whether or not data of certain types is present, without actually // returning anything. bool HasString() const; bool HasURL(FilenameToURLPolicy policy) const; bool HasFile() const; bool HasCustomFormat(const CustomFormat& format) const; // Returns true if this OSExchangeData has data in any of the formats in // |formats| or any custom format in |custom_formats|. bool HasAnyFormat(int formats, const std::set<CustomFormat>& custom_formats) const; #if defined(OS_WIN) // Adds the bytes of a file (CFSTR_FILECONTENTS and CFSTR_FILEDESCRIPTOR on // Windows). void SetFileContents(const base::FilePath& filename, const std::string& file_contents); bool GetFileContents(base::FilePath* filename, std::string* file_contents) const; // Adds a download file with full path (CF_HDROP). void SetDownloadFileInfo(const DownloadFileInfo& download); #endif #if defined(USE_AURA) // Adds a snippet of HTML. |html| is just raw html but this sets both // text/html and CF_HTML. void SetHtml(const base::string16& html, const GURL& base_url); bool GetHtml(base::string16* html, GURL* base_url) const; #endif private: // Provides the actual data. scoped_ptr<Provider> provider_; DISALLOW_COPY_AND_ASSIGN(OSExchangeData); }; } // namespace ui #endif // UI_BASE_DRAGDROP_OS_EXCHANGE_DATA_H_