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