Commit ad9ff3b0 authored by Avi Drissman's avatar Avi Drissman Committed by Commit Bot

Improve the Mac clipboard util.

This now searches for new-style URL and title pairs as well as
the old pboardtype.

BUG=851326

Change-Id: I00afe5ce5a3ca7e54648194bbf686b0fd85dad62
Reviewed-on: https://chromium-review.googlesource.com/c/1354259Reviewed-by: default avatarSidney San Martín <sdy@chromium.org>
Commit-Queue: Avi Drissman <avi@chromium.org>
Cr-Commit-Position: refs/heads/master@{#612856}
parent 2e2b4baa
...@@ -136,7 +136,8 @@ void PromiseWriterHelper(const DropData& drop_data, ...@@ -136,7 +136,8 @@ void PromiseWriterHelper(const DropData& drop_data,
forType:type]; forType:type];
// URL. // URL.
} else if ([type isEqualToString:NSURLPboardType]) { } else if ([type isEqualToString:NSURLPboardType] ||
[type isEqualToString:base::mac::CFToNSCast(kUTTypeURL)]) {
DCHECK(dropData_->url.is_valid()); DCHECK(dropData_->url.is_valid());
NSURL* url = [NSURL URLWithString:SysUTF8ToNSString(dropData_->url.spec())]; NSURL* url = [NSURL URLWithString:SysUTF8ToNSString(dropData_->url.spec())];
// If NSURL creation failed, check for a badly-escaped JavaScript URL. // If NSURL creation failed, check for a badly-escaped JavaScript URL.
...@@ -345,7 +346,9 @@ void PromiseWriterHelper(const DropData& drop_data, ...@@ -345,7 +346,9 @@ void PromiseWriterHelper(const DropData& drop_data,
// URL (and title). // URL (and title).
if (dropData_->url.is_valid()) { if (dropData_->url.is_valid()) {
[pasteboard_ addTypes:@[ NSURLPboardType, ui::kUTTypeURLName ] [pasteboard_ addTypes:@[
NSURLPboardType, ui::kUTTypeURLName, base::mac::CFToNSCast(kUTTypeURL)
]
owner:contentsView_]; owner:contentsView_];
} }
......
...@@ -13,6 +13,7 @@ namespace ui { ...@@ -13,6 +13,7 @@ namespace ui {
NSString* const kUTTypeURLName = @"public.url-name"; NSString* const kUTTypeURLName = @"public.url-name";
namespace { namespace {
NSString* const kWebURLsWithTitlesPboardType = @"WebURLsWithTitlesPboardType"; NSString* const kWebURLsWithTitlesPboardType = @"WebURLsWithTitlesPboardType";
// It's much more convenient to return an NSString than a // It's much more convenient to return an NSString than a
...@@ -23,6 +24,72 @@ NSString* UTIFromPboardType(NSString* type) { ...@@ -23,6 +24,72 @@ NSString* UTIFromPboardType(NSString* type) {
kUTTagClassNSPboardType, base::mac::NSToCFCast(type), kUTTypeData)) kUTTagClassNSPboardType, base::mac::NSToCFCast(type), kUTTypeData))
autorelease]; autorelease];
} }
bool ReadWebURLsWithTitlesPboardType(NSPasteboard* pboard,
NSArray** urls,
NSArray** titles) {
NSArray* bookmarkPairs = base::mac::ObjCCast<NSArray>([pboard
propertyListForType:UTIFromPboardType(kWebURLsWithTitlesPboardType)]);
if (!bookmarkPairs)
return false;
if ([bookmarkPairs count] != 2)
return false;
NSArray* urlsArr = base::mac::ObjCCast<NSArray>(bookmarkPairs[0]);
NSArray* titlesArr = base::mac::ObjCCast<NSArray>(bookmarkPairs[1]);
if (!urlsArr || !titlesArr)
return false;
if ([urlsArr count] < 1)
return false;
if ([urlsArr count] != [titlesArr count])
return false;
for (id obj in urlsArr) {
if (![obj isKindOfClass:[NSString class]])
return false;
}
for (id obj in titlesArr) {
if (![obj isKindOfClass:[NSString class]])
return false;
}
*urls = urlsArr;
*titles = titlesArr;
return true;
}
bool ReadURLItemsWithTitles(NSPasteboard* pboard,
NSArray** urls,
NSArray** titles) {
NSMutableArray* urlsArr = [NSMutableArray array];
NSMutableArray* titlesArr = [NSMutableArray array];
NSArray* items = [pboard pasteboardItems];
for (NSPasteboardItem* item : items) {
NSString* url = [item stringForType:base::mac::CFToNSCast(kUTTypeURL)];
NSString* title = [item stringForType:kUTTypeURLName];
if (url) {
[urlsArr addObject:url];
if (title)
[titlesArr addObject:title];
else
[titlesArr addObject:@""];
}
}
if ([urlsArr count]) {
*urls = urlsArr;
*titles = titlesArr;
return true;
} else {
return false;
}
}
} // namespace } // namespace
UniquePasteboard::UniquePasteboard() UniquePasteboard::UniquePasteboard()
...@@ -142,37 +209,8 @@ void ClipboardUtil::AddDataToPasteboard(NSPasteboard* pboard, ...@@ -142,37 +209,8 @@ void ClipboardUtil::AddDataToPasteboard(NSPasteboard* pboard,
bool ClipboardUtil::URLsAndTitlesFromPasteboard(NSPasteboard* pboard, bool ClipboardUtil::URLsAndTitlesFromPasteboard(NSPasteboard* pboard,
NSArray** urls, NSArray** urls,
NSArray** titles) { NSArray** titles) {
NSArray* bookmarkPairs = base::mac::ObjCCast<NSArray>([pboard return ReadWebURLsWithTitlesPboardType(pboard, urls, titles) ||
propertyListForType:UTIFromPboardType(kWebURLsWithTitlesPboardType)]); ReadURLItemsWithTitles(pboard, urls, titles);
if (!bookmarkPairs)
return false;
if ([bookmarkPairs count] != 2)
return false;
NSArray* urlsArr = base::mac::ObjCCast<NSArray>(bookmarkPairs[0]);
NSArray* titlesArr = base::mac::ObjCCast<NSArray>(bookmarkPairs[1]);
if (!urlsArr || !titlesArr)
return false;
if ([urlsArr count] < 1)
return false;
if ([urlsArr count] != [titlesArr count])
return false;
for (id obj in urlsArr) {
if (![obj isKindOfClass:[NSString class]])
return false;
}
for (id obj in titlesArr) {
if (![obj isKindOfClass:[NSString class]])
return false;
}
*urls = urlsArr;
*titles = titlesArr;
return true;
} }
// static // static
......
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