15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/dragdrop/os_exchange_data_provider_aura.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h"
8868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/net_util.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/clipboard/clipboard.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/clipboard/scoped_clipboard_writer.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace ui {
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)OSExchangeDataProviderAura::OSExchangeDataProviderAura()
16c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    : formats_(0) {
17c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)OSExchangeDataProviderAura::~OSExchangeDataProviderAura() {}
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochOSExchangeData::Provider* OSExchangeDataProviderAura::Clone() const {
22eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  OSExchangeDataProviderAura* ret = new OSExchangeDataProviderAura();
23eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ret->formats_ = formats_;
24eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ret->string_ = string_;
25eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ret->url_ = url_;
26eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ret->title_ = title_;
27eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ret->filenames_ = filenames_;
28eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ret->pickle_data_ = pickle_data_;
29eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // We skip copying the drag images.
30eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ret->html_ = html_;
31eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ret->base_url_ = base_url_;
32eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
33eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  return ret;
34eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
35eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
36eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid OSExchangeDataProviderAura::SetString(const base::string16& data) {
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  string_ = data;
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  formats_ |= OSExchangeData::STRING;
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void OSExchangeDataProviderAura::SetURL(const GURL& url,
42eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                        const base::string16& title) {
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  url_ = url;
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  title_ = title;
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  formats_ |= OSExchangeData::URL;
46eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
47eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  SetString(UTF8ToUTF16(url.spec()));
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void OSExchangeDataProviderAura::SetFilename(const base::FilePath& path) {
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  filenames_.clear();
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  filenames_.push_back(OSExchangeData::FileInfo(path, base::FilePath()));
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  formats_ |= OSExchangeData::FILE_NAME;
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void OSExchangeDataProviderAura::SetFilenames(
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::vector<OSExchangeData::FileInfo>& filenames) {
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  filenames_ = filenames;
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  formats_ |= OSExchangeData::FILE_NAME;
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void OSExchangeDataProviderAura::SetPickledData(
6390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    const OSExchangeData::CustomFormat& format,
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const Pickle& data) {
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pickle_data_[format] = data;
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  formats_ |= OSExchangeData::PICKLED_DATA;
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
69eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochbool OSExchangeDataProviderAura::GetString(base::string16* data) const {
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if ((formats_ & OSExchangeData::STRING) == 0)
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  *data = string_;
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool OSExchangeDataProviderAura::GetURLAndTitle(GURL* url,
77eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                                base::string16* title) const {
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if ((formats_ & OSExchangeData::URL) == 0) {
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    title->clear();
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return GetPlainTextURL(url);
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!url_.is_valid())
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  *url = url_;
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  *title = title_;
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool OSExchangeDataProviderAura::GetFilename(base::FilePath* path) const {
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if ((formats_ & OSExchangeData::FILE_NAME) == 0)
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(!filenames_.empty());
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  *path = filenames_[0].path;
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool OSExchangeDataProviderAura::GetFilenames(
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::vector<OSExchangeData::FileInfo>* filenames) const {
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if ((formats_ & OSExchangeData::FILE_NAME) == 0)
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  *filenames = filenames_;
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool OSExchangeDataProviderAura::GetPickledData(
10890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    const OSExchangeData::CustomFormat& format,
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Pickle* data) const {
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PickleData::const_iterator i = pickle_data_.find(format);
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (i == pickle_data_.end())
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  *data = i->second;
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool OSExchangeDataProviderAura::HasString() const {
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return (formats_ & OSExchangeData::STRING) != 0;
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool OSExchangeDataProviderAura::HasURL() const {
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if ((formats_ & OSExchangeData::URL) != 0) {
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return true;
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // No URL, see if we have plain text that can be parsed as a URL.
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return GetPlainTextURL(NULL);
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool OSExchangeDataProviderAura::HasFile() const {
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return (formats_ & OSExchangeData::FILE_NAME) != 0;
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool OSExchangeDataProviderAura::HasCustomFormat(
13590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    const OSExchangeData::CustomFormat& format) const {
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return pickle_data_.find(format) != pickle_data_.end();
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
139eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid OSExchangeDataProviderAura::SetHtml(const base::string16& html,
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                         const GURL& base_url) {
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  formats_ |= OSExchangeData::HTML;
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  html_ = html;
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base_url_ = base_url;
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
146eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochbool OSExchangeDataProviderAura::GetHtml(base::string16* html,
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                         GURL* base_url) const {
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if ((formats_ & OSExchangeData::HTML) == 0)
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  *html = html_;
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  *base_url = base_url_;
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool OSExchangeDataProviderAura::HasHtml() const {
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return ((formats_ & OSExchangeData::HTML) != 0);
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void OSExchangeDataProviderAura::SetDragImage(
1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const gfx::ImageSkia& image,
1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const gfx::Vector2d& cursor_offset) {
1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  drag_image_ = image;
1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  drag_image_offset_ = cursor_offset;
1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const gfx::ImageSkia& OSExchangeDataProviderAura::GetDragImage() const {
1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return drag_image_;
1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
170c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)const gfx::Vector2d&
171c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)OSExchangeDataProviderAura::GetDragImageOffset() const {
1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return drag_image_offset_;
1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool OSExchangeDataProviderAura::GetPlainTextURL(GURL* url) const {
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if ((formats_ & OSExchangeData::STRING) == 0)
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL test_url(string_);
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!test_url.is_valid())
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (url)
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *url = test_url;
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)///////////////////////////////////////////////////////////////////////////////
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// OSExchangeData, public:
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)OSExchangeData::Provider* OSExchangeData::CreateProvider() {
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return new OSExchangeDataProviderAura();
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace ui
197