Index: chrome/browser/importer/external_process_importer_bridge.cc |
diff --git a/chrome/browser/importer/external_process_importer_bridge.cc b/chrome/browser/importer/external_process_importer_bridge.cc |
index 43c632246b7f49b28c37ca22f5cbd46fec4749ac..4ee62567ecbc0451309fa65eac2ecf8164ada53a 100644 |
--- a/chrome/browser/importer/external_process_importer_bridge.cc |
+++ b/chrome/browser/importer/external_process_importer_bridge.cc |
@@ -20,12 +20,14 @@ |
#endif |
namespace { |
+ |
// Rather than sending all import items over IPC at once we chunk them into |
// separate requests. This avoids the case of a large import causing |
// oversized IPC messages. |
const int kNumBookmarksToSend = 100; |
const int kNumHistoryRowsToSend = 100; |
const int kNumFaviconsToSend = 100; |
+ |
} |
ExternalProcessImporterBridge::ExternalProcessImporterBridge( |
@@ -45,18 +47,23 @@ void ExternalProcessImporterBridge::AddBookmarks( |
Send(new ProfileImportProcessHostMsg_NotifyBookmarksImportStart( |
first_folder_name, bookmarks.size())); |
- std::vector<ProfileWriter::BookmarkEntry>::const_iterator it; |
- for (it = bookmarks.begin(); it < bookmarks.end(); |
- it = it + kNumBookmarksToSend) { |
+ // |bookmarks_left| is required for the checks below as Windows has a |
+ // Debug bounds-check which prevents pushing an iterator beyond its end() |
+ // (i.e., |it + 2 < s.end()| crashes in debug mode if |i + 1 == s.end()|). |
+ int bookmarks_left = bookmarks.end() - bookmarks.begin(); |
+ for (std::vector<ProfileWriter::BookmarkEntry>::const_iterator it = |
+ bookmarks.begin(); it < bookmarks.end();) { |
std::vector<ProfileWriter::BookmarkEntry> bookmark_group; |
std::vector<ProfileWriter::BookmarkEntry>::const_iterator end_group = |
- it + kNumBookmarksToSend < bookmarks.end() ? |
- it + kNumBookmarksToSend : bookmarks.end(); |
+ it + std::min(bookmarks_left, kNumBookmarksToSend); |
bookmark_group.assign(it, end_group); |
Send(new ProfileImportProcessHostMsg_NotifyBookmarksImportGroup( |
bookmark_group)); |
+ bookmarks_left -= end_group - it; |
+ it = end_group; |
} |
+ DCHECK_EQ(0, bookmarks_left); |
} |
void ExternalProcessImporterBridge::AddHomePage(const GURL& home_page) { |
@@ -75,17 +82,23 @@ void ExternalProcessImporterBridge::SetFavicons( |
Send(new ProfileImportProcessHostMsg_NotifyFaviconsImportStart( |
favicons.size())); |
- std::vector<history::ImportedFaviconUsage>::const_iterator it; |
- for (it = favicons.begin(); it < favicons.end(); |
- it = it + kNumFaviconsToSend) { |
+ // |favicons_left| is required for the checks below as Windows has a |
+ // Debug bounds-check which prevents pushing an iterator beyond its end() |
+ // (i.e., |it + 2 < s.end()| crashes in debug mode if |i + 1 == s.end()|). |
+ int favicons_left = favicons.end() - favicons.begin(); |
+ for (std::vector<history::ImportedFaviconUsage>::const_iterator it = |
+ favicons.begin(); it < favicons.end();) { |
std::vector<history::ImportedFaviconUsage> favicons_group; |
std::vector<history::ImportedFaviconUsage>::const_iterator end_group = |
- std::min(it + kNumFaviconsToSend, favicons.end()); |
+ it + std::min(favicons_left, kNumFaviconsToSend); |
favicons_group.assign(it, end_group); |
- Send(new ProfileImportProcessHostMsg_NotifyFaviconsImportGroup( |
- favicons_group)); |
+ Send(new ProfileImportProcessHostMsg_NotifyFaviconsImportGroup( |
+ favicons_group)); |
+ favicons_left -= end_group - it; |
+ it = end_group; |
} |
+ DCHECK_EQ(0, favicons_left); |
} |
void ExternalProcessImporterBridge::SetHistoryItems( |
@@ -93,18 +106,22 @@ void ExternalProcessImporterBridge::SetHistoryItems( |
history::VisitSource visit_source) { |
Send(new ProfileImportProcessHostMsg_NotifyHistoryImportStart(rows.size())); |
- history::URLRows::const_iterator it; |
- for (it = rows.begin(); it < rows.end(); |
- it = it + kNumHistoryRowsToSend) { |
+ // |rows_left| is required for the checks below as Windows has a |
+ // Debug bounds-check which prevents pushing an iterator beyond its end() |
+ // (i.e., |it + 2 < s.end()| crashes in debug mode if |i + 1 == s.end()|). |
+ int rows_left = rows.end() - rows.begin(); |
+ for (history::URLRows::const_iterator it = rows.begin(); it < rows.end();) { |
history::URLRows row_group; |
history::URLRows::const_iterator end_group = |
- it + kNumHistoryRowsToSend < rows.end() ? |
- it + kNumHistoryRowsToSend : rows.end(); |
+ it + std::min(rows_left, kNumHistoryRowsToSend); |
row_group.assign(it, end_group); |
- Send(new ProfileImportProcessHostMsg_NotifyHistoryImportGroup(row_group, |
- visit_source)); |
+ Send(new ProfileImportProcessHostMsg_NotifyHistoryImportGroup( |
+ row_group, visit_source)); |
+ rows_left -= end_group - it; |
+ it = end_group; |
} |
+ DCHECK_EQ(0, rows_left); |
} |
void ExternalProcessImporterBridge::SetKeywords( |