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 a2ac59b3c4187f6a0e2549fe1fd4d7f3342c7232..6271210ce868ceab8d2d68dc7cebede029fba277 100644 |
--- a/chrome/browser/importer/external_process_importer_bridge.cc |
+++ b/chrome/browser/importer/external_process_importer_bridge.cc |
@@ -21,12 +21,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( |
@@ -46,18 +48,23 @@ void ExternalProcessImporterBridge::AddBookmarks( |
Send(new ProfileImportProcessHostMsg_NotifyBookmarksImportStart( |
first_folder_name, bookmarks.size())); |
- std::vector<ImportedBookmarkEntry>::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<ImportedBookmarkEntry>::const_iterator it = |
+ bookmarks.begin(); it < bookmarks.end();) { |
std::vector<ImportedBookmarkEntry> bookmark_group; |
std::vector<ImportedBookmarkEntry>::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) { |
@@ -76,17 +83,23 @@ void ExternalProcessImporterBridge::SetFavicons( |
Send(new ProfileImportProcessHostMsg_NotifyFaviconsImportStart( |
favicons.size())); |
- std::vector<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<ImportedFaviconUsage>::const_iterator it = |
+ favicons.begin(); it < favicons.end();) { |
std::vector<ImportedFaviconUsage> favicons_group; |
std::vector<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( |
@@ -94,18 +107,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( |