| Index: chrome/browser/importer/safari_importer.mm
|
| diff --git a/chrome/browser/importer/safari_importer.mm b/chrome/browser/importer/safari_importer.mm
|
| index fd4e1263a8ff27a06a9d4ca677e0248711b4b7f1..bdd03093fb4a4879cd677ce7865cd9931060fe83 100644
|
| --- a/chrome/browser/importer/safari_importer.mm
|
| +++ b/chrome/browser/importer/safari_importer.mm
|
| @@ -97,17 +97,16 @@ void SafariImporter::StartImport(const importer::SourceProfile& source_profile,
|
| }
|
|
|
| void SafariImporter::ImportBookmarks() {
|
| + string16 toolbar_name =
|
| + bridge_->GetLocalizedString(IDS_BOOMARK_BAR_FOLDER_NAME);
|
| std::vector<ProfileWriter::BookmarkEntry> bookmarks;
|
| - ParseBookmarks(&bookmarks);
|
| + ParseBookmarks(toolbar_name, &bookmarks);
|
|
|
| // Write bookmarks into profile.
|
| if (!bookmarks.empty() && !cancelled()) {
|
| const string16& first_folder_name =
|
| bridge_->GetLocalizedString(IDS_BOOKMARK_GROUP_FROM_SAFARI);
|
| - int options = 0;
|
| - if (import_to_bookmark_bar())
|
| - options = ProfileWriter::IMPORT_TO_BOOKMARK_BAR;
|
| - bridge_->AddBookmarks(bookmarks, first_folder_name, options);
|
| + bridge_->AddBookmarks(bookmarks, first_folder_name);
|
| }
|
|
|
| // Import favicons.
|
| @@ -193,6 +192,7 @@ void SafariImporter::RecursiveReadBookmarksFolder(
|
| NSDictionary* bookmark_folder,
|
| const std::vector<string16>& parent_path_elements,
|
| bool is_in_toolbar,
|
| + const string16& toolbar_name,
|
| std::vector<ProfileWriter::BookmarkEntry>* out_bookmarks) {
|
| DCHECK(bookmark_folder);
|
|
|
| @@ -208,33 +208,44 @@ void SafariImporter::RecursiveReadBookmarksFolder(
|
| if (!is_top_level_bookmarks_container) {
|
| // Top level containers sometimes don't have title attributes.
|
| if (![type isEqualToString:@"WebBookmarkTypeList"] || !title) {
|
| - DCHECK(false) << "Type =("
|
| - << (type ? base::SysNSStringToUTF8(type) : "Null Type")
|
| - << ") Title=(" << (title ? base::SysNSStringToUTF8(title) : "Null title")
|
| - << ")";
|
| + NOTREACHED() << "Type=("
|
| + << (type ? base::SysNSStringToUTF8(type) : "Null type")
|
| + << ") Title=("
|
| + << (title ? base::SysNSStringToUTF8(title) : "Null title")
|
| + << ")";
|
| return;
|
| }
|
| }
|
|
|
| + NSArray* elements = [bookmark_folder objectForKey:@"Children"];
|
| + if (!elements && (!parent_path_elements.empty() || !is_in_toolbar)) {
|
| + // This is an empty folder, so add it explicitly; but don't add the toolbar
|
| + // folder if it is empty. Note that all non-empty folders are added
|
| + // implicitly when their children are added.
|
| + ProfileWriter::BookmarkEntry entry;
|
| + // Safari doesn't specify a creation time for the folder.
|
| + entry.creation_time = base::Time::Now();
|
| + entry.title = base::SysNSStringToUTF16(title);
|
| + entry.path = parent_path_elements;
|
| + entry.in_toolbar = is_in_toolbar;
|
| + entry.is_folder = true;
|
| +
|
| + out_bookmarks->push_back(entry);
|
| + return;
|
| + }
|
| +
|
| std::vector<string16> path_elements(parent_path_elements);
|
| - // Is this the toolbar folder?
|
| - if ([title isEqualToString:@"BookmarksBar"]) {
|
| - // Be defensive, the toolbar items shouldn't have a prepended path.
|
| - path_elements.clear();
|
| + // Create a folder for the toolbar, but not for the bookmarks menu.
|
| + if (path_elements.empty() && [title isEqualToString:@"BookmarksBar"]) {
|
| is_in_toolbar = true;
|
| - } else if ([title isEqualToString:@"BookmarksMenu"]) {
|
| - // top level container for normal bookmarks.
|
| - path_elements.clear();
|
| - } else if (!is_top_level_bookmarks_container) {
|
| + path_elements.push_back(toolbar_name);
|
| + } else if (!is_top_level_bookmarks_container &&
|
| + !(path_elements.empty() &&
|
| + [title isEqualToString:@"BookmarksMenu"])) {
|
| if (title)
|
| path_elements.push_back(base::SysNSStringToUTF16(title));
|
| }
|
|
|
| - NSArray* elements = [bookmark_folder objectForKey:@"Children"];
|
| - // TODO(jeremy) Does Chrome support importing empty folders?
|
| - if (!elements)
|
| - return;
|
| -
|
| // Iterate over individual bookmarks.
|
| for (NSDictionary* bookmark in elements) {
|
| NSString* type = [bookmark objectForKey:@"WebBookmarkType"];
|
| @@ -246,11 +257,12 @@ void SafariImporter::RecursiveReadBookmarksFolder(
|
| RecursiveReadBookmarksFolder(bookmark,
|
| path_elements,
|
| is_in_toolbar,
|
| + toolbar_name,
|
| out_bookmarks);
|
| }
|
|
|
| // If we didn't see a bookmark folder, then we're expecting a bookmark
|
| - // item, if that's not what we got then ignore it.
|
| + // item. If that's not what we got then ignore it.
|
| if (![type isEqualToString:@"WebBookmarkTypeLeaf"])
|
| continue;
|
|
|
| @@ -275,6 +287,7 @@ void SafariImporter::RecursiveReadBookmarksFolder(
|
| }
|
|
|
| void SafariImporter::ParseBookmarks(
|
| + const string16& toolbar_name,
|
| std::vector<ProfileWriter::BookmarkEntry>* bookmarks) {
|
| DCHECK(bookmarks);
|
|
|
| @@ -295,7 +308,7 @@ void SafariImporter::ParseBookmarks(
|
| // Recursively read in bookmarks.
|
| std::vector<string16> parent_path_elements;
|
| RecursiveReadBookmarksFolder(bookmarks_dict, parent_path_elements, false,
|
| - bookmarks);
|
| + toolbar_name, bookmarks);
|
| }
|
|
|
| void SafariImporter::ImportPasswords() {
|
|
|