Home | History | Annotate | Download | only in dragdrop
      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 #include "ui/base/dragdrop/os_exchange_data_provider_aura.h"
      6 
      7 #include "base/logging.h"
      8 #include "base/strings/utf_string_conversions.h"
      9 #include "net/base/net_util.h"
     10 #include "ui/base/clipboard/clipboard.h"
     11 #include "ui/base/clipboard/scoped_clipboard_writer.h"
     12 
     13 namespace ui {
     14 
     15 OSExchangeDataProviderAura::OSExchangeDataProviderAura()
     16     : formats_(0) {
     17 }
     18 
     19 OSExchangeDataProviderAura::~OSExchangeDataProviderAura() {}
     20 
     21 OSExchangeData::Provider* OSExchangeDataProviderAura::Clone() const {
     22   OSExchangeDataProviderAura* ret = new OSExchangeDataProviderAura();
     23   ret->formats_ = formats_;
     24   ret->string_ = string_;
     25   ret->url_ = url_;
     26   ret->title_ = title_;
     27   ret->filenames_ = filenames_;
     28   ret->pickle_data_ = pickle_data_;
     29   // We skip copying the drag images.
     30   ret->html_ = html_;
     31   ret->base_url_ = base_url_;
     32 
     33   return ret;
     34 }
     35 
     36 void OSExchangeDataProviderAura::SetString(const base::string16& data) {
     37   string_ = data;
     38   formats_ |= OSExchangeData::STRING;
     39 }
     40 
     41 void OSExchangeDataProviderAura::SetURL(const GURL& url,
     42                                         const base::string16& title) {
     43   url_ = url;
     44   title_ = title;
     45   formats_ |= OSExchangeData::URL;
     46 
     47   SetString(UTF8ToUTF16(url.spec()));
     48 }
     49 
     50 void OSExchangeDataProviderAura::SetFilename(const base::FilePath& path) {
     51   filenames_.clear();
     52   filenames_.push_back(OSExchangeData::FileInfo(path, base::FilePath()));
     53   formats_ |= OSExchangeData::FILE_NAME;
     54 }
     55 
     56 void OSExchangeDataProviderAura::SetFilenames(
     57     const std::vector<OSExchangeData::FileInfo>& filenames) {
     58   filenames_ = filenames;
     59   formats_ |= OSExchangeData::FILE_NAME;
     60 }
     61 
     62 void OSExchangeDataProviderAura::SetPickledData(
     63     const OSExchangeData::CustomFormat& format,
     64     const Pickle& data) {
     65   pickle_data_[format] = data;
     66   formats_ |= OSExchangeData::PICKLED_DATA;
     67 }
     68 
     69 bool OSExchangeDataProviderAura::GetString(base::string16* data) const {
     70   if ((formats_ & OSExchangeData::STRING) == 0)
     71     return false;
     72   *data = string_;
     73   return true;
     74 }
     75 
     76 bool OSExchangeDataProviderAura::GetURLAndTitle(GURL* url,
     77                                                 base::string16* title) const {
     78   if ((formats_ & OSExchangeData::URL) == 0) {
     79     title->clear();
     80     return GetPlainTextURL(url);
     81   }
     82 
     83   if (!url_.is_valid())
     84     return false;
     85 
     86   *url = url_;
     87   *title = title_;
     88   return true;
     89 }
     90 
     91 bool OSExchangeDataProviderAura::GetFilename(base::FilePath* path) const {
     92   if ((formats_ & OSExchangeData::FILE_NAME) == 0)
     93     return false;
     94   DCHECK(!filenames_.empty());
     95   *path = filenames_[0].path;
     96   return true;
     97 }
     98 
     99 bool OSExchangeDataProviderAura::GetFilenames(
    100     std::vector<OSExchangeData::FileInfo>* filenames) const {
    101   if ((formats_ & OSExchangeData::FILE_NAME) == 0)
    102     return false;
    103   *filenames = filenames_;
    104   return true;
    105 }
    106 
    107 bool OSExchangeDataProviderAura::GetPickledData(
    108     const OSExchangeData::CustomFormat& format,
    109     Pickle* data) const {
    110   PickleData::const_iterator i = pickle_data_.find(format);
    111   if (i == pickle_data_.end())
    112     return false;
    113 
    114   *data = i->second;
    115   return true;
    116 }
    117 
    118 bool OSExchangeDataProviderAura::HasString() const {
    119   return (formats_ & OSExchangeData::STRING) != 0;
    120 }
    121 
    122 bool OSExchangeDataProviderAura::HasURL() const {
    123   if ((formats_ & OSExchangeData::URL) != 0) {
    124     return true;
    125   }
    126   // No URL, see if we have plain text that can be parsed as a URL.
    127   return GetPlainTextURL(NULL);
    128 }
    129 
    130 bool OSExchangeDataProviderAura::HasFile() const {
    131   return (formats_ & OSExchangeData::FILE_NAME) != 0;
    132 }
    133 
    134 bool OSExchangeDataProviderAura::HasCustomFormat(
    135     const OSExchangeData::CustomFormat& format) const {
    136   return pickle_data_.find(format) != pickle_data_.end();
    137 }
    138 
    139 void OSExchangeDataProviderAura::SetHtml(const base::string16& html,
    140                                          const GURL& base_url) {
    141   formats_ |= OSExchangeData::HTML;
    142   html_ = html;
    143   base_url_ = base_url;
    144 }
    145 
    146 bool OSExchangeDataProviderAura::GetHtml(base::string16* html,
    147                                          GURL* base_url) const {
    148   if ((formats_ & OSExchangeData::HTML) == 0)
    149     return false;
    150   *html = html_;
    151   *base_url = base_url_;
    152   return true;
    153 }
    154 
    155 bool OSExchangeDataProviderAura::HasHtml() const {
    156   return ((formats_ & OSExchangeData::HTML) != 0);
    157 }
    158 
    159 void OSExchangeDataProviderAura::SetDragImage(
    160     const gfx::ImageSkia& image,
    161     const gfx::Vector2d& cursor_offset) {
    162   drag_image_ = image;
    163   drag_image_offset_ = cursor_offset;
    164 }
    165 
    166 const gfx::ImageSkia& OSExchangeDataProviderAura::GetDragImage() const {
    167   return drag_image_;
    168 }
    169 
    170 const gfx::Vector2d&
    171 OSExchangeDataProviderAura::GetDragImageOffset() const {
    172   return drag_image_offset_;
    173 }
    174 
    175 bool OSExchangeDataProviderAura::GetPlainTextURL(GURL* url) const {
    176   if ((formats_ & OSExchangeData::STRING) == 0)
    177     return false;
    178 
    179   GURL test_url(string_);
    180   if (!test_url.is_valid())
    181     return false;
    182 
    183   if (url)
    184     *url = test_url;
    185   return true;
    186 }
    187 
    188 ///////////////////////////////////////////////////////////////////////////////
    189 // OSExchangeData, public:
    190 
    191 // static
    192 OSExchangeData::Provider* OSExchangeData::CreateProvider() {
    193   return new OSExchangeDataProviderAura();
    194 }
    195 
    196 }  // namespace ui
    197