| OLD | NEW |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "components/bookmarks/browser/bookmark_pasteboard_helper_mac.h" | 5 #include "components/bookmarks/browser/bookmark_pasteboard_helper_mac.h" |
| 6 | 6 |
| 7 #import <Cocoa/Cocoa.h> | 7 #import <Cocoa/Cocoa.h> |
| 8 #include <stddef.h> | 8 #include <stddef.h> |
| 9 #include <stdint.h> | 9 #include <stdint.h> |
| 10 | 10 |
| (...skipping 162 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 173 idNum, kChromiumBookmarkId, | 173 idNum, kChromiumBookmarkId, |
| 174 metaInfoDictionary, kChromiumBookmarkMetaInfo, | 174 metaInfoDictionary, kChromiumBookmarkMetaInfo, |
| 175 nil]; | 175 nil]; |
| 176 [plist addObject:object]; | 176 [plist addObject:object]; |
| 177 } | 177 } |
| 178 } | 178 } |
| 179 return plist; | 179 return plist; |
| 180 } | 180 } |
| 181 | 181 |
| 182 void WriteBookmarkDictionaryListPboardType( | 182 void WriteBookmarkDictionaryListPboardType( |
| 183 NSPasteboard* pb, | 183 NSPasteboardItem* item, |
| 184 const std::vector<BookmarkNodeData::Element>& elements) { | 184 const std::vector<BookmarkNodeData::Element>& elements) { |
| 185 NSArray* plist = GetPlistForBookmarkList(elements); | 185 NSArray* plist = GetPlistForBookmarkList(elements); |
| 186 NSString* uti = ui::ClipboardUtil::UTIForPasteboardType( | 186 NSString* uti = ui::ClipboardUtil::UTIForPasteboardType( |
| 187 kBookmarkDictionaryListPboardType); | 187 kBookmarkDictionaryListPboardType); |
| 188 [pb addTypes:@[ uti ] owner:nil]; | 188 [item setPropertyList:plist forType:uti]; |
| 189 [pb setPropertyList:plist forType:uti]; | |
| 190 } | 189 } |
| 191 | 190 |
| 192 void FillFlattenedArraysForBookmarks( | 191 void FillFlattenedArraysForBookmarks( |
| 193 const std::vector<BookmarkNodeData::Element>& elements, | 192 const std::vector<BookmarkNodeData::Element>& elements, |
| 194 NSMutableArray* url_titles, | 193 NSMutableArray* url_titles, |
| 195 NSMutableArray* urls, | 194 NSMutableArray* urls, |
| 196 NSMutableArray* toplevel_string_data) { | 195 NSMutableArray* toplevel_string_data) { |
| 197 for (const BookmarkNodeData::Element& element : elements) { | 196 for (const BookmarkNodeData::Element& element : elements) { |
| 198 NSString* title = base::SysUTF16ToNSString(element.title); | 197 NSString* title = base::SysUTF16ToNSString(element.title); |
| 199 if (element.is_url) { | 198 if (element.is_url) { |
| 200 NSString* url = base::SysUTF8ToNSString(element.url.spec()); | 199 NSString* url = base::SysUTF8ToNSString(element.url.spec()); |
| 201 [url_titles addObject:title]; | 200 [url_titles addObject:title]; |
| 202 [urls addObject:url]; | 201 [urls addObject:url]; |
| 203 if (toplevel_string_data) | 202 if (toplevel_string_data) |
| 204 [toplevel_string_data addObject:url]; | 203 [toplevel_string_data addObject:url]; |
| 205 } else { | 204 } else { |
| 206 if (toplevel_string_data) | 205 if (toplevel_string_data) |
| 207 [toplevel_string_data addObject:title]; | 206 [toplevel_string_data addObject:title]; |
| 208 FillFlattenedArraysForBookmarks(element.children, url_titles, urls, nil); | 207 FillFlattenedArraysForBookmarks(element.children, url_titles, urls, nil); |
| 209 } | 208 } |
| 210 } | 209 } |
| 211 } | 210 } |
| 212 | 211 |
| 213 void WriteSimplifiedBookmarkTypes( | 212 base::scoped_nsobject<NSPasteboardItem> WriteSimplifiedBookmarkTypes( |
| 214 NSPasteboard* pb, | |
| 215 const std::vector<BookmarkNodeData::Element>& elements) { | 213 const std::vector<BookmarkNodeData::Element>& elements) { |
| 216 NSMutableArray* url_titles = [NSMutableArray array]; | 214 NSMutableArray* url_titles = [NSMutableArray array]; |
| 217 NSMutableArray* urls = [NSMutableArray array]; | 215 NSMutableArray* urls = [NSMutableArray array]; |
| 218 NSMutableArray* toplevel_string_data = [NSMutableArray array]; | 216 NSMutableArray* toplevel_string_data = [NSMutableArray array]; |
| 219 FillFlattenedArraysForBookmarks( | 217 FillFlattenedArraysForBookmarks( |
| 220 elements, url_titles, urls, toplevel_string_data); | 218 elements, url_titles, urls, toplevel_string_data); |
| 221 | 219 |
| 220 base::scoped_nsobject<NSPasteboardItem> item; |
| 222 if ([urls count] > 0) { | 221 if ([urls count] > 0) { |
| 223 base::scoped_nsobject<NSPasteboardItem> item; | |
| 224 if ([urls count] == 1) { | 222 if ([urls count] == 1) { |
| 225 item = ui::ClipboardUtil::PasteboardItemFromUrl([urls firstObject], | 223 item = ui::ClipboardUtil::PasteboardItemFromUrl([urls firstObject], |
| 226 [url_titles firstObject]); | 224 [url_titles firstObject]); |
| 227 } else { | 225 } else { |
| 228 item = ui::ClipboardUtil::PasteboardItemFromUrls(urls, url_titles); | 226 item = ui::ClipboardUtil::PasteboardItemFromUrls(urls, url_titles); |
| 229 } | 227 } |
| 230 | |
| 231 ui::ClipboardUtil::AddDataToPasteboard(pb, item); | |
| 232 } | 228 } |
| 233 | 229 |
| 234 // Write NSStringPboardType. | 230 if (!item) { |
| 235 [pb addTypes:@[ NSStringPboardType ] owner:nil]; | 231 item = [[NSPasteboardItem alloc] init]; |
| 236 [pb setString:[toplevel_string_data componentsJoinedByString:@"\n"] | 232 } |
| 237 forType:NSStringPboardType]; | 233 |
| 234 [item setString:[toplevel_string_data componentsJoinedByString:@"\n"] |
| 235 forType:NSPasteboardTypeString]; |
| 236 return item; |
| 238 } | 237 } |
| 239 | 238 |
| 240 NSPasteboard* PasteboardFromType(ui::ClipboardType type) { | 239 NSPasteboard* PasteboardFromType(ui::ClipboardType type) { |
| 241 NSString* type_string = nil; | 240 NSString* type_string = nil; |
| 242 switch (type) { | 241 switch (type) { |
| 243 case ui::CLIPBOARD_TYPE_COPY_PASTE: | 242 case ui::CLIPBOARD_TYPE_COPY_PASTE: |
| 244 type_string = NSGeneralPboard; | 243 type_string = NSGeneralPboard; |
| 245 break; | 244 break; |
| 246 case ui::CLIPBOARD_TYPE_DRAG: | 245 case ui::CLIPBOARD_TYPE_DRAG: |
| 247 type_string = NSDragPboard; | 246 type_string = NSDragPboard; |
| 248 break; | 247 break; |
| 249 case ui::CLIPBOARD_TYPE_SELECTION: | 248 case ui::CLIPBOARD_TYPE_SELECTION: |
| 250 NOTREACHED(); | 249 NOTREACHED(); |
| 251 break; | 250 break; |
| 252 } | 251 } |
| 253 | 252 |
| 254 return [NSPasteboard pasteboardWithName:type_string]; | 253 return [NSPasteboard pasteboardWithName:type_string]; |
| 255 } | 254 } |
| 256 | 255 |
| 257 } // namespace | 256 } // namespace |
| 258 | 257 |
| 258 NSPasteboardItem* PasteboardItemFromBookmarks( |
| 259 const std::vector<BookmarkNodeData::Element>& elements, |
| 260 const base::FilePath& profile_path) { |
| 261 base::scoped_nsobject<NSPasteboardItem> item = |
| 262 WriteSimplifiedBookmarkTypes(elements); |
| 263 |
| 264 WriteBookmarkDictionaryListPboardType(item, elements); |
| 265 |
| 266 NSString* uti = |
| 267 ui::ClipboardUtil::UTIForPasteboardType(kChromiumProfilePathPboardType); |
| 268 [item setString:base::SysUTF8ToNSString(profile_path.value()) forType:uti]; |
| 269 return [[item retain] autorelease]; |
| 270 } |
| 271 |
| 259 void WriteBookmarksToPasteboard( | 272 void WriteBookmarksToPasteboard( |
| 260 ui::ClipboardType type, | 273 ui::ClipboardType type, |
| 261 const std::vector<BookmarkNodeData::Element>& elements, | 274 const std::vector<BookmarkNodeData::Element>& elements, |
| 262 const base::FilePath& profile_path) { | 275 const base::FilePath& profile_path) { |
| 263 if (elements.empty()) | 276 if (elements.empty()) |
| 264 return; | 277 return; |
| 265 | 278 |
| 279 NSPasteboardItem* item = PasteboardItemFromBookmarks(elements, profile_path); |
| 266 NSPasteboard* pb = PasteboardFromType(type); | 280 NSPasteboard* pb = PasteboardFromType(type); |
| 267 | 281 [pb clearContents]; |
| 268 NSString* uti = | 282 [pb writeObjects:@[ item ]]; |
| 269 ui::ClipboardUtil::UTIForPasteboardType(kChromiumProfilePathPboardType); | |
| 270 [pb declareTypes:@[ uti ] owner:nil]; | |
| 271 [pb setString:base::SysUTF8ToNSString(profile_path.value()) forType:uti]; | |
| 272 WriteBookmarkDictionaryListPboardType(pb, elements); | |
| 273 WriteSimplifiedBookmarkTypes(pb, elements); | |
| 274 } | 283 } |
| 275 | 284 |
| 276 bool ReadBookmarksFromPasteboard( | 285 bool ReadBookmarksFromPasteboard( |
| 277 ui::ClipboardType type, | 286 ui::ClipboardType type, |
| 278 std::vector<BookmarkNodeData::Element>& elements, | 287 std::vector<BookmarkNodeData::Element>& elements, |
| 279 base::FilePath* profile_path) { | 288 base::FilePath* profile_path) { |
| 280 NSPasteboard* pb = PasteboardFromType(type); | 289 NSPasteboard* pb = PasteboardFromType(type); |
| 281 | 290 |
| 282 elements.clear(); | 291 elements.clear(); |
| 283 NSString* uti = | 292 NSString* uti = |
| 284 ui::ClipboardUtil::UTIForPasteboardType(kChromiumProfilePathPboardType); | 293 ui::ClipboardUtil::UTIForPasteboardType(kChromiumProfilePathPboardType); |
| 285 NSString* profile = [pb stringForType:uti]; | 294 NSString* profile = [pb stringForType:uti]; |
| 286 *profile_path = base::FilePath(base::SysNSStringToUTF8(profile)); | 295 *profile_path = base::FilePath(base::SysNSStringToUTF8(profile)); |
| 287 return ReadBookmarkDictionaryListPboardType(pb, elements) || | 296 return ReadBookmarkDictionaryListPboardType(pb, elements) || |
| 288 ReadWebURLsWithTitlesPboardType(pb, elements); | 297 ReadWebURLsWithTitlesPboardType(pb, elements); |
| 289 } | 298 } |
| 290 | 299 |
| 291 bool PasteboardContainsBookmarks(ui::ClipboardType type) { | 300 bool PasteboardContainsBookmarks(ui::ClipboardType type) { |
| 292 NSPasteboard* pb = PasteboardFromType(type); | 301 NSPasteboard* pb = PasteboardFromType(type); |
| 293 | 302 |
| 294 NSArray* availableTypes = @[ | 303 NSArray* availableTypes = @[ |
| 295 ui::ClipboardUtil::UTIForWebURLsAndTitles(), | 304 ui::ClipboardUtil::UTIForWebURLsAndTitles(), |
| 296 ui::ClipboardUtil::UTIForPasteboardType(kBookmarkDictionaryListPboardType) | 305 ui::ClipboardUtil::UTIForPasteboardType(kBookmarkDictionaryListPboardType) |
| 297 ]; | 306 ]; |
| 298 return [pb availableTypeFromArray:availableTypes] != nil; | 307 return [pb availableTypeFromArray:availableTypes] != nil; |
| 299 } | 308 } |
| 300 | 309 |
| 301 } // namespace bookmarks | 310 } // namespace bookmarks |
| OLD | NEW |