summaryrefslogtreecommitdiffstats
path: root/chrome/utility
diff options
context:
space:
mode:
authorn.bansal <n.bansal@samsung.com>2014-09-04 17:36:47 -0700
committerCommit bot <commit-bot@chromium.org>2014-09-05 00:38:45 +0000
commit884eafca142af3f8e8ed252048edeeb5c3d25319 (patch)
tree29337642f5bb6bf3a30702bb8a526dc869c7fe38 /chrome/utility
parent5c1e66643d7b5b14d457837ee733be99b553639e (diff)
downloadchromium_src-884eafca142af3f8e8ed252048edeeb5c3d25319.zip
chromium_src-884eafca142af3f8e8ed252048edeeb5c3d25319.tar.gz
chromium_src-884eafca142af3f8e8ed252048edeeb5c3d25319.tar.bz2
Implement "Autofill form data" import for Firefox
This patches adds support to import autofill form data from Firefox. Firefox stores form data in formhistory.sqlite file and currently Chrome's firefox importer doesn't import data from it. With this patch, "Autofill form data" option is available in import menu and allows user to import form data from Firefox. The imported form data is stored in autofill table and is then used in forms for autocomplete. BUG=59087 Review URL: https://codereview.chromium.org/480953002 Cr-Commit-Position: refs/heads/master@{#293381}
Diffstat (limited to 'chrome/utility')
-rw-r--r--chrome/utility/importer/external_process_importer_bridge.cc29
-rw-r--r--chrome/utility/importer/external_process_importer_bridge.h3
-rw-r--r--chrome/utility/importer/firefox_importer.cc41
-rw-r--r--chrome/utility/importer/firefox_importer.h1
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);