• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #ifndef UI_BASE_DRAGDROP_OS_EXCHANGE_DATA_H_
6 #define UI_BASE_DRAGDROP_OS_EXCHANGE_DATA_H_
7 
8 #include "build/build_config.h"
9 
10 #include <set>
11 #include <string>
12 
13 #if defined(OS_WIN)
14 #include <objidl.h>
15 #endif
16 
17 #include "base/basictypes.h"
18 #include "base/files/file_path.h"
19 #include "base/memory/scoped_ptr.h"
20 #include "ui/base/clipboard/clipboard.h"
21 #include "ui/base/dragdrop/download_file_interface.h"
22 #include "ui/base/ui_base_export.h"
23 
24 class GURL;
25 class Pickle;
26 
27 namespace gfx {
28 class ImageSkia;
29 class Vector2d;
30 }
31 
32 namespace ui {
33 
34 struct FileInfo;
35 
36 ///////////////////////////////////////////////////////////////////////////////
37 //
38 // OSExchangeData
39 //  An object that holds interchange data to be sent out to OS services like
40 //  clipboard, drag and drop, etc. This object exposes an API that clients can
41 //  use to specify raw data and its high level type. This object takes care of
42 //  translating that into something the OS can understand.
43 //
44 ///////////////////////////////////////////////////////////////////////////////
45 
46 // NOTE: Support for html and file contents is required by TabContentViewWin.
47 // TabContentsViewGtk uses a different class to handle drag support that does
48 // not use OSExchangeData. As such, file contents and html support is only
49 // compiled on windows.
50 class UI_BASE_EXPORT OSExchangeData {
51  public:
52   // CustomFormats are used for non-standard data types. For example, bookmark
53   // nodes are written using a CustomFormat.
54   // TODO(dcheng): Remove this completely and just use Clipboard::FormatType.
55   typedef Clipboard::FormatType CustomFormat;
56 
57   // Enumeration of the known formats.
58   enum Format {
59     STRING         = 1 << 0,
60     URL            = 1 << 1,
61     FILE_NAME      = 1 << 2,
62     PICKLED_DATA   = 1 << 3,
63 #if defined(OS_WIN)
64     FILE_CONTENTS  = 1 << 4,
65 #endif
66 #if defined(USE_AURA)
67     HTML           = 1 << 5,
68 #endif
69   };
70 
71   // Controls whether or not filenames should be converted to file: URLs when
72   // getting a URL.
73   enum FilenameToURLPolicy { CONVERT_FILENAMES, DO_NOT_CONVERT_FILENAMES, };
74 
75   // Encapsulates the info about a file to be downloaded.
76   struct UI_BASE_EXPORT DownloadFileInfo {
77     DownloadFileInfo(const base::FilePath& filename,
78                      DownloadFileProvider* downloader);
79     ~DownloadFileInfo();
80 
81     base::FilePath filename;
82     scoped_refptr<DownloadFileProvider> downloader;
83   };
84 
85   // Provider defines the platform specific part of OSExchangeData that
86   // interacts with the native system.
87   class UI_BASE_EXPORT Provider {
88    public:
Provider()89     Provider() {}
~Provider()90     virtual ~Provider() {}
91 
92     virtual Provider* Clone() const = 0;
93 
94     virtual void MarkOriginatedFromRenderer() = 0;
95     virtual bool DidOriginateFromRenderer() const = 0;
96 
97     virtual void SetString(const base::string16& data) = 0;
98     virtual void SetURL(const GURL& url, const base::string16& title) = 0;
99     virtual void SetFilename(const base::FilePath& path) = 0;
100     virtual void SetFilenames(
101         const std::vector<FileInfo>& file_names) = 0;
102     virtual void SetPickledData(const CustomFormat& format,
103                                 const Pickle& data) = 0;
104 
105     virtual bool GetString(base::string16* data) const = 0;
106     virtual bool GetURLAndTitle(FilenameToURLPolicy policy,
107                                 GURL* url,
108                                 base::string16* title) const = 0;
109     virtual bool GetFilename(base::FilePath* path) const = 0;
110     virtual bool GetFilenames(
111         std::vector<FileInfo>* file_names) const = 0;
112     virtual bool GetPickledData(const CustomFormat& format,
113                                 Pickle* data) const = 0;
114 
115     virtual bool HasString() const = 0;
116     virtual bool HasURL(FilenameToURLPolicy policy) const = 0;
117     virtual bool HasFile() const = 0;
118     virtual bool HasCustomFormat(const CustomFormat& format) const = 0;
119 
120 #if (!defined(OS_CHROMEOS) && defined(USE_X11)) || defined(OS_WIN)
121     virtual void SetFileContents(const base::FilePath& filename,
122                                  const std::string& file_contents) = 0;
123 #endif
124 #if defined(OS_WIN)
125     virtual bool GetFileContents(base::FilePath* filename,
126                                  std::string* file_contents) const = 0;
127     virtual bool HasFileContents() const = 0;
128     virtual void SetDownloadFileInfo(const DownloadFileInfo& download) = 0;
129 #endif
130 
131 #if defined(USE_AURA)
132     virtual void SetHtml(const base::string16& html, const GURL& base_url) = 0;
133     virtual bool GetHtml(base::string16* html, GURL* base_url) const = 0;
134     virtual bool HasHtml() const = 0;
135 #endif
136 
137 #if defined(USE_AURA)
138     virtual void SetDragImage(const gfx::ImageSkia& image,
139                               const gfx::Vector2d& cursor_offset) = 0;
140     virtual const gfx::ImageSkia& GetDragImage() const = 0;
141     virtual const gfx::Vector2d& GetDragImageOffset() const = 0;
142 #endif
143   };
144 
145   // Creates the platform specific Provider.
146   static Provider* CreateProvider();
147 
148   OSExchangeData();
149   // Creates an OSExchangeData with the specified provider. OSExchangeData
150   // takes ownership of the supplied provider.
151   explicit OSExchangeData(Provider* provider);
152 
153   ~OSExchangeData();
154 
155   // Returns the Provider, which actually stores and manages the data.
provider()156   const Provider& provider() const { return *provider_; }
provider()157   Provider& provider() { return *provider_; }
158 
159   // Marks drag data as tainted if it originates from the renderer. This is used
160   // to avoid granting privileges to a renderer when dragging in tainted data,
161   // since it could allow potential escalation of privileges.
162   void MarkOriginatedFromRenderer();
163   bool DidOriginateFromRenderer() const;
164 
165   // These functions add data to the OSExchangeData object of various Chrome
166   // types. The OSExchangeData object takes care of translating the data into
167   // a format suitable for exchange with the OS.
168   // NOTE WELL: Typically, a data object like this will contain only one of the
169   //            following types of data. In cases where more data is held, the
170   //            order in which these functions are called is _important_!
171   //       ---> The order types are added to an OSExchangeData object controls
172   //            the order of enumeration in our IEnumFORMATETC implementation!
173   //            This comes into play when selecting the best (most preferable)
174   //            data type for insertion into a DropTarget.
175   void SetString(const base::string16& data);
176   // A URL can have an optional title in some exchange formats.
177   void SetURL(const GURL& url, const base::string16& title);
178   // A full path to a file.
179   void SetFilename(const base::FilePath& path);
180   // Full path to one or more files. See also SetFilenames() in Provider.
181   void SetFilenames(
182       const std::vector<FileInfo>& file_names);
183   // Adds pickled data of the specified format.
184   void SetPickledData(const CustomFormat& format, const Pickle& data);
185 
186   // These functions retrieve data of the specified type. If data exists, the
187   // functions return and the result is in the out parameter. If the data does
188   // not exist, the out parameter is not touched. The out parameter cannot be
189   // NULL.
190   bool GetString(base::string16* data) const;
191   bool GetURLAndTitle(FilenameToURLPolicy policy,
192                       GURL* url,
193                       base::string16* title) const;
194   // Return the path of a file, if available.
195   bool GetFilename(base::FilePath* path) const;
196   bool GetFilenames(
197       std::vector<FileInfo>* file_names) const;
198   bool GetPickledData(const CustomFormat& format, Pickle* data) const;
199 
200   // Test whether or not data of certain types is present, without actually
201   // returning anything.
202   bool HasString() const;
203   bool HasURL(FilenameToURLPolicy policy) const;
204   bool HasFile() const;
205   bool HasCustomFormat(const CustomFormat& format) const;
206 
207   // Returns true if this OSExchangeData has data in any of the formats in
208   // |formats| or any custom format in |custom_formats|.
209   bool HasAnyFormat(int formats,
210                      const std::set<CustomFormat>& custom_formats) const;
211 
212 #if defined(OS_WIN)
213   // Adds the bytes of a file (CFSTR_FILECONTENTS and CFSTR_FILEDESCRIPTOR on
214   // Windows).
215   void SetFileContents(const base::FilePath& filename,
216                        const std::string& file_contents);
217   bool GetFileContents(base::FilePath* filename,
218                        std::string* file_contents) const;
219 
220   // Adds a download file with full path (CF_HDROP).
221   void SetDownloadFileInfo(const DownloadFileInfo& download);
222 #endif
223 
224 #if defined(USE_AURA)
225   // Adds a snippet of HTML.  |html| is just raw html but this sets both
226   // text/html and CF_HTML.
227   void SetHtml(const base::string16& html, const GURL& base_url);
228   bool GetHtml(base::string16* html, GURL* base_url) const;
229 #endif
230 
231  private:
232   // Provides the actual data.
233   scoped_ptr<Provider> provider_;
234 
235   DISALLOW_COPY_AND_ASSIGN(OSExchangeData);
236 };
237 
238 }  // namespace ui
239 
240 #endif  // UI_BASE_DRAGDROP_OS_EXCHANGE_DATA_H_
241