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