1c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Copyright (c) 2012 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_DRAGDROP_OS_EXCHANGE_DATA_PROVIDER_AURAX11_H_
6c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#define UI_BASE_DRAGDROP_OS_EXCHANGE_DATA_PROVIDER_AURAX11_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/files/file_path.h"
16c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/pickle.h"
17c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "ui/base/dragdrop/os_exchange_data.h"
18c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "ui/base/x/selection_owner.h"
19c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "ui/base/x/selection_requestor.h"
20eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "ui/base/x/selection_utils.h"
21c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "ui/events/platform/platform_event_dispatcher.h"
22c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "ui/gfx/image/image_skia.h"
23c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "ui/gfx/vector2d.h"
2468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "ui/gfx/x/x11_atom_cache.h"
25eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "url/gurl.h"
26c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
27c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace ui {
28c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
29c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class Clipboard;
305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class OSExchangeDataProviderAuraX11Test;
31c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
32c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// OSExchangeData::Provider implementation for aura on linux.
335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class UI_BASE_EXPORT OSExchangeDataProviderAuraX11
34c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    : public OSExchangeData::Provider,
35c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      public ui::PlatformEventDispatcher {
36c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public:
37eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // |x_window| is the window the cursor is over, and |selection| is the set of
38eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // data being offered.
39eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  OSExchangeDataProviderAuraX11(::Window x_window,
40eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                const SelectionFormatMap& selection);
41c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
42c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Creates a Provider for sending drag information. This creates its own,
43c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // hidden X11 window to own send data.
44c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  OSExchangeDataProviderAuraX11();
45c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
46c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual ~OSExchangeDataProviderAuraX11();
47c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
48eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // After all the Set* methods have built up the data we're offering, call
49eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // this to take ownership of the XdndSelection clipboard.
50eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  void TakeOwnershipOfSelection() const;
51eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
52eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Retrieves a list of types we're offering. Noop if we haven't taken the
53eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // selection.
54eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  void RetrieveTargets(std::vector<Atom>* targets) const;
55eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
56eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Makes a copy of the format map currently being offered.
57eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  SelectionFormatMap GetFormatMap() const;
58c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
59effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  const base::FilePath& file_contents_name() const {
60effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    return file_contents_name_;
61effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  }
62effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
63c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Overridden from OSExchangeData::Provider:
64eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  virtual Provider* Clone() const OVERRIDE;
65effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  virtual void MarkOriginatedFromRenderer() OVERRIDE;
66effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  virtual bool DidOriginateFromRenderer() const OVERRIDE;
67eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  virtual void SetString(const base::string16& data) OVERRIDE;
68eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  virtual void SetURL(const GURL& url, const base::string16& title) OVERRIDE;
69c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void SetFilename(const base::FilePath& path) OVERRIDE;
70effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  virtual void SetFilenames(const std::vector<FileInfo>& filenames) OVERRIDE;
7190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  virtual void SetPickledData(const OSExchangeData::CustomFormat& format,
72eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                              const Pickle& pickle) OVERRIDE;
73eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  virtual bool GetString(base::string16* data) const OVERRIDE;
745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual bool GetURLAndTitle(OSExchangeData::FilenameToURLPolicy policy,
755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                              GURL* url,
765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                              base::string16* title) const OVERRIDE;
77c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual bool GetFilename(base::FilePath* path) const OVERRIDE;
78effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  virtual bool GetFilenames(std::vector<FileInfo>* filenames) const OVERRIDE;
7990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  virtual bool GetPickledData(const OSExchangeData::CustomFormat& format,
80eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                              Pickle* pickle) const OVERRIDE;
81c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual bool HasString() const OVERRIDE;
82a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  virtual bool HasURL(OSExchangeData::FilenameToURLPolicy policy) const
83a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      OVERRIDE;
84c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual bool HasFile() const OVERRIDE;
8590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  virtual bool HasCustomFormat(const OSExchangeData::CustomFormat& format) const
8690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      OVERRIDE;
87c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
88effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  virtual void SetFileContents(const base::FilePath& filename,
89effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                               const std::string& file_contents) OVERRIDE;
90effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
91eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  virtual void SetHtml(const base::string16& html,
92eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                       const GURL& base_url) OVERRIDE;
93eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  virtual bool GetHtml(base::string16* html, GURL* base_url) const OVERRIDE;
94c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual bool HasHtml() const OVERRIDE;
95c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void SetDragImage(const gfx::ImageSkia& image,
96c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                            const gfx::Vector2d& cursor_offset) OVERRIDE;
97c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual const gfx::ImageSkia& GetDragImage() const OVERRIDE;
98c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual const gfx::Vector2d& GetDragImageOffset() const OVERRIDE;
99c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
100c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // ui::PlatformEventDispatcher:
101c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  virtual bool CanDispatchEvent(const PlatformEvent& event) OVERRIDE;
102c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  virtual uint32_t DispatchEvent(const PlatformEvent& event) OVERRIDE;
103c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
104c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private:
1055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  friend class OSExchangeDataProviderAuraX11Test;
106c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  typedef std::map<OSExchangeData::CustomFormat, Pickle>  PickleData;
107c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
108c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Returns true if |formats_| contains a string format and the string can be
109c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // parsed as a URL.
110c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  bool GetPlainTextURL(GURL* url) const;
111c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
112eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Returns the targets in |format_map_|.
113eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  std::vector< ::Atom> GetTargets() const;
114eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
115c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Drag image and offset data.
116c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  gfx::ImageSkia drag_image_;
117c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  gfx::Vector2d drag_image_offset_;
118c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
119c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Our X11 state.
120c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  Display* x_display_;
121c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ::Window x_root_window_;
122c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
123c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // In X11, because the IPC parts of drag operations are implemented by
124c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // XSelection, we require an x11 window to receive drag messages on. The
125c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // OSExchangeDataProvider system is modeled on the Windows implementation,
126c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // which does not require a window. We only sometimes have a valid window
127c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // available (in the case of drag receiving). Other times, we need to create
128c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // our own xwindow just to receive events on it.
129c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  const bool own_window_;
130c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
131c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ::Window x_window_;
132c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
133c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  X11AtomCache atom_cache_;
134c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
135eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // A representation of data. This is either passed to us from the other
136eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // process, or built up through a sequence of Set*() calls. It can be passed
137eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // to |selection_owner_| when we take the selection.
138eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  SelectionFormatMap format_map_;
139c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
140effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // Auxilary data for the X Direct Save protocol.
141effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  base::FilePath file_contents_name_;
142effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
143eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Takes a snapshot of |format_map_| and offers it to other windows.
144eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  mutable SelectionOwner selection_owner_;
145c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
146c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(OSExchangeDataProviderAuraX11);
147c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)};
148c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
149c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}  // namespace ui
150c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
151c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif  // UI_BASE_DRAGDROP_OS_EXCHANGE_DATA_PROVIDER_AURAX11_H_
152