MacViews: Partially implement OSExchangeDataProviderMac.

Partially implement OSExchangeDataProviderMac, just enough to get
OSExchangeDataTest and TextFieldTest.DragAndDrop* to pass.
The implementation is backed by NSPasteboard, and relies on the category
NSPasteboard(ChimeraPasteboardURLUtils) defined in third_party/mozilla.

BUG=378134

Review URL: https://codereview.chromium.org/368973003

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@282277 0039d316-1c4b-4281-b951-d872f2087c98
parent cd0ea330
...@@ -91,6 +91,7 @@ class UI_BASE_EXPORT Clipboard : NON_EXPORTED_BASE(public base::ThreadChecker) { ...@@ -91,6 +91,7 @@ class UI_BASE_EXPORT Clipboard : NON_EXPORTED_BASE(public base::ThreadChecker) {
#elif defined(USE_AURA) #elif defined(USE_AURA)
const std::string& ToString() const { return data_; } const std::string& ToString() const { return data_; }
#elif defined(OS_MACOSX) #elif defined(OS_MACOSX)
NSString* ToNSString() const { return data_; }
// Custom copy and assignment constructor to handle NSString. // Custom copy and assignment constructor to handle NSString.
FormatType(const FormatType& other); FormatType(const FormatType& other);
FormatType& operator=(const FormatType& other); FormatType& operator=(const FormatType& other);
...@@ -120,7 +121,6 @@ class UI_BASE_EXPORT Clipboard : NON_EXPORTED_BASE(public base::ThreadChecker) { ...@@ -120,7 +121,6 @@ class UI_BASE_EXPORT Clipboard : NON_EXPORTED_BASE(public base::ThreadChecker) {
std::string data_; std::string data_;
#elif defined(OS_MACOSX) #elif defined(OS_MACOSX)
explicit FormatType(NSString* native_format); explicit FormatType(NSString* native_format);
NSString* ToNSString() const { return data_; }
NSString* data_; NSString* data_;
#elif defined(OS_ANDROID) #elif defined(OS_ANDROID)
explicit FormatType(const std::string& native_format); explicit FormatType(const std::string& native_format);
......
...@@ -5,8 +5,11 @@ ...@@ -5,8 +5,11 @@
#ifndef UI_BASE_DRAGDROP_OS_EXCHANGE_DATA_PROVIDER_MAC_H_ #ifndef UI_BASE_DRAGDROP_OS_EXCHANGE_DATA_PROVIDER_MAC_H_
#define UI_BASE_DRAGDROP_OS_EXCHANGE_DATA_PROVIDER_MAC_H_ #define UI_BASE_DRAGDROP_OS_EXCHANGE_DATA_PROVIDER_MAC_H_
#import "base/mac/scoped_nsobject.h"
#include "ui/base/dragdrop/os_exchange_data.h" #include "ui/base/dragdrop/os_exchange_data.h"
@class NSPasteboard;
namespace ui { namespace ui {
// OSExchangeData::Provider implementation for Mac. // OSExchangeData::Provider implementation for Mac.
...@@ -14,6 +17,7 @@ class UI_BASE_EXPORT OSExchangeDataProviderMac ...@@ -14,6 +17,7 @@ class UI_BASE_EXPORT OSExchangeDataProviderMac
: public OSExchangeData::Provider { : public OSExchangeData::Provider {
public: public:
OSExchangeDataProviderMac(); OSExchangeDataProviderMac();
explicit OSExchangeDataProviderMac(NSPasteboard* pasteboard);
virtual ~OSExchangeDataProviderMac(); virtual ~OSExchangeDataProviderMac();
// Overridden from OSExchangeData::Provider: // Overridden from OSExchangeData::Provider:
...@@ -42,6 +46,8 @@ class UI_BASE_EXPORT OSExchangeDataProviderMac ...@@ -42,6 +46,8 @@ class UI_BASE_EXPORT OSExchangeDataProviderMac
const OSExchangeData::CustomFormat& format) const OVERRIDE; const OSExchangeData::CustomFormat& format) const OVERRIDE;
private: private:
base::scoped_nsobject<NSPasteboard> pasteboard_;
DISALLOW_COPY_AND_ASSIGN(OSExchangeDataProviderMac); DISALLOW_COPY_AND_ASSIGN(OSExchangeDataProviderMac);
}; };
......
...@@ -4,19 +4,30 @@ ...@@ -4,19 +4,30 @@
#include "ui/base/dragdrop/os_exchange_data_provider_mac.h" #include "ui/base/dragdrop/os_exchange_data_provider_mac.h"
#import <Cocoa/Cocoa.h>
#include "base/logging.h" #include "base/logging.h"
#include "base/pickle.h"
#include "base/strings/sys_string_conversions.h"
#import "third_party/mozilla/NSPasteboard+Utils.h"
#import "ui/base/dragdrop/cocoa_dnd_util.h"
#include "url/gurl.h"
namespace ui { namespace ui {
OSExchangeDataProviderMac::OSExchangeDataProviderMac() { OSExchangeDataProviderMac::OSExchangeDataProviderMac()
: pasteboard_([[NSPasteboard pasteboardWithUniqueName] retain]) {
}
OSExchangeDataProviderMac::OSExchangeDataProviderMac(NSPasteboard* pasteboard)
: pasteboard_([pasteboard retain]) {
} }
OSExchangeDataProviderMac::~OSExchangeDataProviderMac() { OSExchangeDataProviderMac::~OSExchangeDataProviderMac() {
} }
OSExchangeData::Provider* OSExchangeDataProviderMac::Clone() const { OSExchangeData::Provider* OSExchangeDataProviderMac::Clone() const {
NOTIMPLEMENTED(); return new OSExchangeDataProviderMac(pasteboard_);
return new OSExchangeDataProviderMac();
} }
void OSExchangeDataProviderMac::MarkOriginatedFromRenderer() { void OSExchangeDataProviderMac::MarkOriginatedFromRenderer() {
...@@ -29,12 +40,13 @@ bool OSExchangeDataProviderMac::DidOriginateFromRenderer() const { ...@@ -29,12 +40,13 @@ bool OSExchangeDataProviderMac::DidOriginateFromRenderer() const {
} }
void OSExchangeDataProviderMac::SetString(const base::string16& string) { void OSExchangeDataProviderMac::SetString(const base::string16& string) {
NOTIMPLEMENTED(); [pasteboard_ writeObjects:@[ base::SysUTF16ToNSString(string) ]];
} }
void OSExchangeDataProviderMac::SetURL(const GURL& url, void OSExchangeDataProviderMac::SetURL(const GURL& url,
const base::string16& title) { const base::string16& title) {
NOTIMPLEMENTED(); [pasteboard_ setDataForURL:base::SysUTF8ToNSString(url.spec())
title:base::SysUTF16ToNSString(title)];
} }
void OSExchangeDataProviderMac::SetFilename(const base::FilePath& path) { void OSExchangeDataProviderMac::SetFilename(const base::FilePath& path) {
...@@ -49,20 +61,27 @@ void OSExchangeDataProviderMac::SetFilenames( ...@@ -49,20 +61,27 @@ void OSExchangeDataProviderMac::SetFilenames(
void OSExchangeDataProviderMac::SetPickledData( void OSExchangeDataProviderMac::SetPickledData(
const OSExchangeData::CustomFormat& format, const OSExchangeData::CustomFormat& format,
const Pickle& data) { const Pickle& data) {
NOTIMPLEMENTED(); NSData* ns_data = [NSData dataWithBytes:data.data() length:data.size()];
[pasteboard_ setData:ns_data forType:format.ToNSString()];
} }
bool OSExchangeDataProviderMac::GetString(base::string16* data) const { bool OSExchangeDataProviderMac::GetString(base::string16* data) const {
NOTIMPLEMENTED(); DCHECK(data);
return false; NSArray* items = [pasteboard_ readObjectsForClasses:@[ [NSString class] ]
options:@{ }];
if ([items count] == 0)
return false;
*data = base::SysNSStringToUTF16([items objectAtIndex:0]);
return true;
} }
bool OSExchangeDataProviderMac::GetURLAndTitle( bool OSExchangeDataProviderMac::GetURLAndTitle(
OSExchangeData::FilenameToURLPolicy policy, OSExchangeData::FilenameToURLPolicy policy,
GURL* url, GURL* url,
base::string16* title) const { base::string16* title) const {
NOTIMPLEMENTED(); return PopulateURLAndTitleFromPasteboard(
return false; url, title, pasteboard_, policy == OSExchangeData::CONVERT_FILENAMES);
} }
bool OSExchangeDataProviderMac::GetFilename(base::FilePath* path) const { bool OSExchangeDataProviderMac::GetFilename(base::FilePath* path) const {
...@@ -79,19 +98,25 @@ bool OSExchangeDataProviderMac::GetFilenames( ...@@ -79,19 +98,25 @@ bool OSExchangeDataProviderMac::GetFilenames(
bool OSExchangeDataProviderMac::GetPickledData( bool OSExchangeDataProviderMac::GetPickledData(
const OSExchangeData::CustomFormat& format, const OSExchangeData::CustomFormat& format,
Pickle* data) const { Pickle* data) const {
NOTIMPLEMENTED(); DCHECK(data);
return false; NSData* ns_data = [pasteboard_ dataForType:format.ToNSString()];
if (!ns_data)
return false;
*data = Pickle(static_cast<const char*>([ns_data bytes]), [ns_data length]);
return true;
} }
bool OSExchangeDataProviderMac::HasString() const { bool OSExchangeDataProviderMac::HasString() const {
NOTIMPLEMENTED(); NSArray* classes = @[ [NSString class] ];
return false; return [pasteboard_ canReadObjectForClasses:classes options:nil];
} }
bool OSExchangeDataProviderMac::HasURL( bool OSExchangeDataProviderMac::HasURL(
OSExchangeData::FilenameToURLPolicy policy) const { OSExchangeData::FilenameToURLPolicy policy) const {
NOTIMPLEMENTED(); GURL url;
return false; base::string16 title;
return GetURLAndTitle(policy, &url, &title);
} }
bool OSExchangeDataProviderMac::HasFile() const { bool OSExchangeDataProviderMac::HasFile() const {
...@@ -101,8 +126,7 @@ bool OSExchangeDataProviderMac::HasFile() const { ...@@ -101,8 +126,7 @@ bool OSExchangeDataProviderMac::HasFile() const {
bool OSExchangeDataProviderMac::HasCustomFormat( bool OSExchangeDataProviderMac::HasCustomFormat(
const OSExchangeData::CustomFormat& format) const { const OSExchangeData::CustomFormat& format) const {
NOTIMPLEMENTED(); return [[pasteboard_ types] containsObject:format.ToNSString()];
return false;
} }
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////
......
...@@ -26,10 +26,13 @@ class OSExchangeDataTest : public PlatformTest { ...@@ -26,10 +26,13 @@ class OSExchangeDataTest : public PlatformTest {
TEST_F(OSExchangeDataTest, StringDataGetAndSet) { TEST_F(OSExchangeDataTest, StringDataGetAndSet) {
OSExchangeData data; OSExchangeData data;
base::string16 input = base::ASCIIToUTF16("I can has cheezburger?"); base::string16 input = base::ASCIIToUTF16("I can has cheezburger?");
EXPECT_FALSE(data.HasString());
data.SetString(input); data.SetString(input);
EXPECT_TRUE(data.HasString());
OSExchangeData data2(data.provider().Clone()); OSExchangeData data2(data.provider().Clone());
base::string16 output; base::string16 output;
EXPECT_TRUE(data2.HasString());
EXPECT_TRUE(data2.GetString(&output)); EXPECT_TRUE(data2.GetString(&output));
EXPECT_EQ(input, output); EXPECT_EQ(input, output);
std::string url_spec = "http://www.goats.com/"; std::string url_spec = "http://www.goats.com/";
...@@ -46,16 +49,18 @@ TEST_F(OSExchangeDataTest, TestURLExchangeFormats) { ...@@ -46,16 +49,18 @@ TEST_F(OSExchangeDataTest, TestURLExchangeFormats) {
std::string url_spec = "http://www.google.com/"; std::string url_spec = "http://www.google.com/";
GURL url(url_spec); GURL url(url_spec);
base::string16 url_title = base::ASCIIToUTF16("www.google.com"); base::string16 url_title = base::ASCIIToUTF16("www.google.com");
EXPECT_FALSE(data.HasURL(OSExchangeData::DO_NOT_CONVERT_FILENAMES));
data.SetURL(url, url_title); data.SetURL(url, url_title);
base::string16 output; EXPECT_TRUE(data.HasURL(OSExchangeData::DO_NOT_CONVERT_FILENAMES));
OSExchangeData data2(data.provider().Clone()); OSExchangeData data2(data.provider().Clone());
// URL spec and title should match // URL spec and title should match
GURL output_url; GURL output_url;
base::string16 output_title; base::string16 output_title;
EXPECT_TRUE(data2.HasURL(OSExchangeData::DO_NOT_CONVERT_FILENAMES));
EXPECT_TRUE(data2.GetURLAndTitle( EXPECT_TRUE(data2.GetURLAndTitle(
OSExchangeData::CONVERT_FILENAMES, &output_url, &output_title)); OSExchangeData::DO_NOT_CONVERT_FILENAMES, &output_url, &output_title));
EXPECT_EQ(url_spec, output_url.spec()); EXPECT_EQ(url_spec, output_url.spec());
EXPECT_EQ(url_title, output_title); EXPECT_EQ(url_title, output_title);
base::string16 output_string; base::string16 output_string;
......
...@@ -171,10 +171,17 @@ ...@@ -171,10 +171,17 @@
}], }],
['OS=="mac"', { ['OS=="mac"', {
'dependencies': [ 'dependencies': [
'../third_party/mozilla/mozilla.gyp:mozilla',
'events/events.gyp:events_test_support', 'events/events.gyp:events_test_support',
'gfx/gfx.gyp:gfx_test_support', 'gfx/gfx.gyp:gfx_test_support',
'ui_unittests_bundle', 'ui_unittests_bundle',
], ],
'conditions': [
['component=="static_library"', {
# Needed for mozilla.gyp.
'xcode_settings': {'OTHER_LDFLAGS': ['-Wl,-ObjC']},
}],
],
}], }],
['use_aura==1 or toolkit_views==1', { ['use_aura==1 or toolkit_views==1', {
'sources': [ 'sources': [
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment