blob: 72d647f140684e8f9a646be045c90fcb46c5edee [file] [log] [blame]
// Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "ui/base/dragdrop/os_exchange_data_provider_mac.h"
#import <Cocoa/Cocoa.h>
#include "base/logging.h"
#include "base/pickle.h"
#include "base/strings/sys_string_conversions.h"
#include "base/strings/utf_string_conversions.h"
#import "third_party/mozilla/NSPasteboard+Utils.h"
#include "url/gurl.h"
namespace ui {
OSExchangeDataProviderMac::OSExchangeDataProviderMac()
: pasteboard_([[NSPasteboard pasteboardWithUniqueName] retain]) {
}
OSExchangeDataProviderMac::OSExchangeDataProviderMac(NSPasteboard* pasteboard)
: pasteboard_([pasteboard retain]) {
}
OSExchangeDataProviderMac::~OSExchangeDataProviderMac() {
}
OSExchangeData::Provider* OSExchangeDataProviderMac::Clone() const {
return new OSExchangeDataProviderMac(pasteboard_);
}
void OSExchangeDataProviderMac::MarkOriginatedFromRenderer() {
NOTIMPLEMENTED();
}
bool OSExchangeDataProviderMac::DidOriginateFromRenderer() const {
NOTIMPLEMENTED();
return false;
}
void OSExchangeDataProviderMac::SetString(const base::string16& string) {
[pasteboard_ writeObjects:@[ base::SysUTF16ToNSString(string) ]];
}
void OSExchangeDataProviderMac::SetURL(const GURL& url,
const base::string16& title) {
NSURL* ns_url = [NSURL URLWithString:base::SysUTF8ToNSString(url.spec())];
[pasteboard_ writeObjects:@[ ns_url ]];
[pasteboard_ setString:base::SysUTF16ToNSString(title)
forType:kCorePasteboardFlavorType_urln];
}
void OSExchangeDataProviderMac::SetFilename(const base::FilePath& path) {
[pasteboard_ setPropertyList:@[ base::SysUTF8ToNSString(path.value()) ]
forType:NSFilenamesPboardType];
}
void OSExchangeDataProviderMac::SetFilenames(
const std::vector<FileInfo>& filenames) {
NOTIMPLEMENTED();
}
void OSExchangeDataProviderMac::SetPickledData(
const Clipboard::FormatType& format,
const base::Pickle& data) {
NSData* ns_data = [NSData dataWithBytes:data.data() length:data.size()];
[pasteboard_ setData:ns_data forType:format.ToNSString()];
}
bool OSExchangeDataProviderMac::GetString(base::string16* data) const {
DCHECK(data);
NSArray* items = [pasteboard_ readObjectsForClasses:@[ [NSString class] ]
options:@{ }];
// There was no NSString, check for an NSURL.
if ([items count] == 0) {
GURL url;
base::string16 title;
bool result =
GetURLAndTitle(OSExchangeData::DO_NOT_CONVERT_FILENAMES, &url, &title);
if (result)
*data = base::UTF8ToUTF16(url.spec());
return result;
}
*data = base::SysNSStringToUTF16([items objectAtIndex:0]);
return true;
}
bool OSExchangeDataProviderMac::GetURLAndTitle(
OSExchangeData::FilenameToURLPolicy policy,
GURL* url,
base::string16* title) const {
DCHECK(url);
DCHECK(title);
NSArray* items = [pasteboard_ readObjectsForClasses:@[ [NSURL class] ]
options:@{ }];
if ([items count] == 0)
return false;
NSURL* ns_url = [items objectAtIndex:0];
if (policy == OSExchangeData::DO_NOT_CONVERT_FILENAMES) {
// If the URL matches a filename, assume that it came from SetFilename().
// Don't return it if we are not supposed to convert filename to URL.
NSArray* paths = [pasteboard_ propertyListForType:NSFilenamesPboardType];
NSString* url_path = [[ns_url path] stringByStandardizingPath];
for (NSString* path in paths) {
if ([[path stringByStandardizingPath] isEqualToString:url_path])
return false;
}
}
*url = GURL([[ns_url absoluteString] UTF8String]);
*title = base::SysNSStringToUTF16(
[pasteboard_ stringForType:kCorePasteboardFlavorType_urln]);
return true;
}
bool OSExchangeDataProviderMac::GetFilename(base::FilePath* path) const {
NSArray* paths = [pasteboard_ propertyListForType:NSFilenamesPboardType];
if ([paths count] == 0)
return false;
*path = base::FilePath([[paths objectAtIndex:0] UTF8String]);
return true;
}
bool OSExchangeDataProviderMac::GetFilenames(
std::vector<FileInfo>* filenames) const {
NOTIMPLEMENTED();
return false;
}
bool OSExchangeDataProviderMac::GetPickledData(
const Clipboard::FormatType& format,
base::Pickle* data) const {
DCHECK(data);
NSData* ns_data = [pasteboard_ dataForType:format.ToNSString()];
if (!ns_data)
return false;
*data =
base::Pickle(static_cast<const char*>([ns_data bytes]), [ns_data length]);
return true;
}
bool OSExchangeDataProviderMac::HasString() const {
NSArray* classes = @[ [NSString class] ];
return [pasteboard_ canReadObjectForClasses:classes options:nil];
}
bool OSExchangeDataProviderMac::HasURL(
OSExchangeData::FilenameToURLPolicy policy) const {
GURL url;
base::string16 title;
return GetURLAndTitle(policy, &url, &title);
}
bool OSExchangeDataProviderMac::HasFile() const {
return [[pasteboard_ types] containsObject:NSFilenamesPboardType];
}
bool OSExchangeDataProviderMac::HasCustomFormat(
const Clipboard::FormatType& format) const {
return [[pasteboard_ types] containsObject:format.ToNSString()];
}
///////////////////////////////////////////////////////////////////////////////
// OSExchangeData, public:
// static
OSExchangeData::Provider* OSExchangeData::CreateProvider() {
return new OSExchangeDataProviderMac;
}
} // namespace ui