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() { |