diff options
Diffstat (limited to 'chrome/utility')
4 files changed, 73 insertions, 1 deletions
diff --git a/chrome/utility/importer/external_process_importer_bridge.cc b/chrome/utility/importer/external_process_importer_bridge.cc index c399d52..56c82be 100644 --- a/chrome/utility/importer/external_process_importer_bridge.cc +++ b/chrome/utility/importer/external_process_importer_bridge.cc @@ -25,7 +25,7 @@ namespace { const int kNumBookmarksToSend = 100; const int kNumHistoryRowsToSend = 100; const int kNumFaviconsToSend = 100; - +const int kNumAutofillFormDataToSend = 100; } ExternalProcessImporterBridge::ExternalProcessImporterBridge( @@ -141,6 +141,33 @@ void ExternalProcessImporterBridge::SetPasswordForm( Send(new ProfileImportProcessHostMsg_NotifyPasswordFormReady(form)); } +void ExternalProcessImporterBridge::SetAutofillFormData( + const std::vector<ImporterAutofillFormDataEntry>& entries) { + Send(new ProfileImportProcessHostMsg_AutofillFormDataImportStart( + entries.size())); + + // |autofill_form_data_entries_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 autofill_form_data_entries_left = entries.end() - entries.begin(); + for (std::vector<ImporterAutofillFormDataEntry>::const_iterator it = + entries.begin(); + it < entries.end();) { + std::vector<ImporterAutofillFormDataEntry> autofill_form_data_entry_group; + std::vector<ImporterAutofillFormDataEntry>::const_iterator end_group = + it + + std::min(autofill_form_data_entries_left, kNumAutofillFormDataToSend); + autofill_form_data_entry_group.assign(it, end_group); + + Send(new ProfileImportProcessHostMsg_AutofillFormDataImportGroup( + autofill_form_data_entry_group)); + autofill_form_data_entries_left -= end_group - it; + it = end_group; + } + DCHECK_EQ(0, autofill_form_data_entries_left); +} + void ExternalProcessImporterBridge::NotifyStarted() { Send(new ProfileImportProcessHostMsg_Import_Started()); } diff --git a/chrome/utility/importer/external_process_importer_bridge.h b/chrome/utility/importer/external_process_importer_bridge.h index 57efe35..f1f1a46 100644 --- a/chrome/utility/importer/external_process_importer_bridge.h +++ b/chrome/utility/importer/external_process_importer_bridge.h @@ -73,6 +73,9 @@ class ExternalProcessImporterBridge : public ImporterBridge { virtual void SetPasswordForm( const autofill::PasswordForm& form) OVERRIDE; + virtual void SetAutofillFormData( + const std::vector<ImporterAutofillFormDataEntry>& entries) OVERRIDE; + virtual void NotifyStarted() OVERRIDE; virtual void NotifyItemStarted(importer::ImportItem item) OVERRIDE; virtual void NotifyItemEnded(importer::ImportItem item) OVERRIDE; diff --git a/chrome/utility/importer/firefox_importer.cc b/chrome/utility/importer/firefox_importer.cc index 6f37095..6444e29 100644 --- a/chrome/utility/importer/firefox_importer.cc +++ b/chrome/utility/importer/firefox_importer.cc @@ -18,6 +18,7 @@ #include "chrome/common/importer/firefox_importer_utils.h" #include "chrome/common/importer/imported_bookmark_entry.h" #include "chrome/common/importer/imported_favicon_usage.h" +#include "chrome/common/importer/importer_autofill_form_data_entry.h" #include "chrome/common/importer/importer_bridge.h" #include "chrome/common/importer/importer_url_row.h" #include "chrome/grit/generated_resources.h" @@ -140,6 +141,11 @@ void FirefoxImporter::StartImport( ImportPasswords(); bridge_->NotifyItemEnded(importer::PASSWORDS); } + if ((items & importer::AUTOFILL_FORM_DATA) && !cancelled()) { + bridge_->NotifyItemStarted(importer::AUTOFILL_FORM_DATA); + ImportAutofillFormData(); + bridge_->NotifyItemEnded(importer::AUTOFILL_FORM_DATA); + } bridge_->NotifyEnded(); } @@ -382,6 +388,41 @@ void FirefoxImporter::ImportHomepage() { } } +void FirefoxImporter::ImportAutofillFormData() { + base::FilePath file = source_path_.AppendASCII("formhistory.sqlite"); + if (!base::PathExists(file)) + return; + + sql::Connection db; + if (!db.Open(file)) + return; + + const char query[] = + "SELECT fieldname, value, timesUsed, firstUsed, lastUsed FROM " + "moz_formhistory"; + + sql::Statement s(db.GetUniqueStatement(query)); + + std::vector<ImporterAutofillFormDataEntry> form_entries; + while (s.Step() && !cancelled()) { + ImporterAutofillFormDataEntry form_entry; + form_entry.name = s.ColumnString16(0); + form_entry.value = s.ColumnString16(1); + form_entry.times_used = s.ColumnInt(2); + form_entry.first_used = base::Time::FromTimeT(s.ColumnInt64(3) / 1000000); + form_entry.last_used = base::Time::FromTimeT(s.ColumnInt64(4) / 1000000); + + // Don't import search bar history. + if (base::UTF16ToUTF8(form_entry.name) == "searchbar-history") + continue; + + form_entries.push_back(form_entry); + } + + if (!form_entries.empty() && !cancelled()) + bridge_->SetAutofillFormData(form_entries); +} + void FirefoxImporter::GetSearchEnginesXMLData( std::vector<std::string>* search_engine_data) { base::FilePath file = source_path_.AppendASCII("search.sqlite"); diff --git a/chrome/utility/importer/firefox_importer.h b/chrome/utility/importer/firefox_importer.h index 0ad10d6..9402024 100644 --- a/chrome/utility/importer/firefox_importer.h +++ b/chrome/utility/importer/firefox_importer.h @@ -46,6 +46,7 @@ class FirefoxImporter : public Importer { // Import the user's home page, unless it is set to default home page as // defined in browserconfig.properties. void ImportHomepage(); + void ImportAutofillFormData(); void GetSearchEnginesXMLData(std::vector<std::string>* search_engine_data); void GetSearchEnginesXMLDataFromJSON( std::vector<std::string>* search_engine_data); |