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,
forType:type];
// URL.
} else if ([type isEqualToString:NSURLPboardType]) {
} else if ([type isEqualToString:NSURLPboardType] ||
[type isEqualToString:base::mac::CFToNSCast(kUTTypeURL)]) {
DCHECK(dropData_->url.is_valid());
NSURL* url = [NSURL URLWithString:SysUTF8ToNSString(dropData_->url.spec())];
// If NSURL creation failed, check for a badly-escaped JavaScript URL.
......@@ -345,7 +346,9 @@ void PromiseWriterHelper(const DropData& drop_data,
// URL (and title).
if (dropData_->url.is_valid()) {
[pasteboard_ addTypes:@[ NSURLPboardType, ui::kUTTypeURLName ]
[pasteboard_ addTypes:@[
NSURLPboardType, ui::kUTTypeURLName, base::mac::CFToNSCast(kUTTypeURL)
]
owner:contentsView_];
}
......
......@@ -13,6 +13,7 @@ namespace ui {
NSString* const kUTTypeURLName = @"public.url-name";
namespace {
NSString* const kWebURLsWithTitlesPboardType = @"WebURLsWithTitlesPboardType";
// It's much more convenient to return an NSString than a
......@@ -23,6 +24,72 @@ NSString* UTIFromPboardType(NSString* type) {
kUTTagClassNSPboardType, base::mac::NSToCFCast(type), kUTTypeData))
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
UniquePasteboard::UniquePasteboard()
......@@ -142,37 +209,8 @@ void ClipboardUtil::AddDataToPasteboard(NSPasteboard* pboard,
bool ClipboardUtil::URLsAndTitlesFromPasteboard(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;
return ReadWebURLsWithTitlesPboardType(pboard, urls, titles) ||
ReadURLItemsWithTitles(pboard, urls, titles);
}
// 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