summaryrefslogtreecommitdiffstats
path: root/chrome/browser
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/browser
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/browser')
-rw-r--r--chrome/browser/importer/external_process_importer_client.cc26
-rw-r--r--chrome/browser/importer/external_process_importer_client.h10
-rw-r--r--chrome/browser/importer/firefox_importer_browsertest.cc34
-rw-r--r--chrome/browser/importer/importer_list.cc3
-rw-r--r--chrome/browser/importer/in_process_importer_bridge.cc19
-rw-r--r--chrome/browser/importer/in_process_importer_bridge.h3
-rw-r--r--chrome/browser/importer/profile_writer.cc11
-rw-r--r--chrome/browser/importer/profile_writer.h5
-rw-r--r--chrome/browser/resources/options/import_data_overlay.html10
-rw-r--r--chrome/browser/resources/options/import_data_overlay.js15
-rw-r--r--chrome/browser/ui/browser_ui_prefs.cc8
-rw-r--r--chrome/browser/ui/webui/options/import_data_handler.cc32
12 files changed, 155 insertions, 21 deletions
diff --git a/chrome/browser/importer/external_process_importer_client.cc b/chrome/browser/importer/external_process_importer_client.cc
index 4394611..523d2f8 100644
--- a/chrome/browser/importer/external_process_importer_client.cc
+++ b/chrome/browser/importer/external_process_importer_client.cc
@@ -106,6 +106,10 @@ bool ExternalProcessImporterClient::OnMessageReceived(
OnKeywordsImportReady)
IPC_MESSAGE_HANDLER(ProfileImportProcessHostMsg_NotifyFirefoxSearchEngData,
OnFirefoxSearchEngineDataReceived)
+ IPC_MESSAGE_HANDLER(ProfileImportProcessHostMsg_AutofillFormDataImportStart,
+ OnAutofillFormDataImportStart)
+ IPC_MESSAGE_HANDLER(ProfileImportProcessHostMsg_AutofillFormDataImportGroup,
+ OnAutofillFormDataImportGroup)
#if defined(OS_WIN)
IPC_MESSAGE_HANDLER(ProfileImportProcessHostMsg_NotifyIE7PasswordInfo,
OnIE7PasswordReceived)
@@ -250,6 +254,28 @@ void ExternalProcessImporterClient::OnFirefoxSearchEngineDataReceived(
bridge_->SetFirefoxSearchEnginesXMLData(search_engine_data);
}
+void ExternalProcessImporterClient::OnAutofillFormDataImportStart(
+ size_t total_autofill_form_data_entry_count) {
+ if (cancelled_)
+ return;
+
+ total_autofill_form_data_entry_count_ = total_autofill_form_data_entry_count;
+ autofill_form_data_.reserve(total_autofill_form_data_entry_count);
+}
+
+void ExternalProcessImporterClient::OnAutofillFormDataImportGroup(
+ const std::vector<ImporterAutofillFormDataEntry>&
+ autofill_form_data_entry_group) {
+ if (cancelled_)
+ return;
+
+ autofill_form_data_.insert(autofill_form_data_.end(),
+ autofill_form_data_entry_group.begin(),
+ autofill_form_data_entry_group.end());
+ if (autofill_form_data_.size() == total_autofill_form_data_entry_count_)
+ bridge_->SetAutofillFormData(autofill_form_data_);
+}
+
#if defined(OS_WIN)
void ExternalProcessImporterClient::OnIE7PasswordReceived(
const importer::ImporterIE7PasswordInfo& importer_password_info) {
diff --git a/chrome/browser/importer/external_process_importer_client.h b/chrome/browser/importer/external_process_importer_client.h
index 5d54092..300f398 100644
--- a/chrome/browser/importer/external_process_importer_client.h
+++ b/chrome/browser/importer/external_process_importer_client.h
@@ -13,6 +13,7 @@
#include "base/memory/weak_ptr.h"
#include "base/strings/string16.h"
#include "chrome/browser/history/history_types.h"
+#include "chrome/common/importer/importer_autofill_form_data_entry.h"
#include "chrome/common/importer/importer_data_types.h"
#include "chrome/common/importer/importer_url_row.h"
#include "content/public/browser/browser_thread.h"
@@ -35,6 +36,7 @@ namespace importer {
#if defined(OS_WIN)
struct ImporterIE7PasswordInfo;
#endif
+struct ImporterAutofillFormDataEntry;
struct URLKeywordInfo;
}
@@ -82,6 +84,10 @@ class ExternalProcessImporterClient : public content::UtilityProcessHostClient {
bool unique_on_host_and_path);
void OnFirefoxSearchEngineDataReceived(
const std::vector<std::string> search_engine_data);
+ void OnAutofillFormDataImportStart(
+ size_t total_autofill_form_data_entry_count);
+ void OnAutofillFormDataImportGroup(const std::vector<
+ ImporterAutofillFormDataEntry>& autofill_form_data_entry_group);
#if defined(OS_WIN)
void OnIE7PasswordReceived(
const importer::ImporterIE7PasswordInfo& importer_password_info);
@@ -108,6 +114,7 @@ class ExternalProcessImporterClient : public content::UtilityProcessHostClient {
std::vector<ImporterURLRow> history_rows_;
std::vector<ImportedBookmarkEntry> bookmarks_;
std::vector<ImportedFaviconUsage> favicons_;
+ std::vector<ImporterAutofillFormDataEntry> autofill_form_data_;
// Usually some variation on IDS_BOOKMARK_GROUP_...; the name of the folder
// under which imported bookmarks will be placed.
@@ -122,6 +129,9 @@ class ExternalProcessImporterClient : public content::UtilityProcessHostClient {
// Total number of favicons to import.
size_t total_favicons_count_;
+ // Total number of autofill form data entries to import.
+ size_t total_autofill_form_data_entry_count_;
+
// Notifications received from the ProfileImportProcessHost are passed back
// to process_importer_host_, which calls the ProfileWriter to record the
// import data. When the import process is done, process_importer_host_
diff --git a/chrome/browser/importer/firefox_importer_browsertest.cc b/chrome/browser/importer/firefox_importer_browsertest.cc
index 8ae0237..3df0e4e 100644
--- a/chrome/browser/importer/firefox_importer_browsertest.cc
+++ b/chrome/browser/importer/firefox_importer_browsertest.cc
@@ -20,6 +20,7 @@
#include "chrome/common/importer/imported_favicon_usage.h"
#include "chrome/common/importer/importer_data_types.h"
#include "chrome/test/base/in_process_browser_test.h"
+#include "components/autofill/core/browser/webdata/autofill_entry.h"
#include "components/autofill/core/common/password_form.h"
#include "components/search_engines/template_url.h"
#include "testing/gtest/include/gtest/gtest.h"
@@ -51,6 +52,11 @@ struct KeywordInfo {
const char* url;
};
+struct AutofillFormDataInfo {
+ const char* name;
+ const char* value;
+};
+
const BookmarkInfo kFirefoxBookmarks[] = {
{true, 1, {"Bookmarks Toolbar"},
L"Toolbar",
@@ -94,6 +100,21 @@ const KeywordInfo kFirefoxKeywords[] = {
{L"\x4E2D\x6587", L"\x4E2D\x6587", "http://www.google.com/"},
};
+const AutofillFormDataInfo kFirefoxAutofillEntries[] = {
+ {"name", "John"},
+ {"address", "#123 Cherry Ave"},
+ {"city", "Mountain View"},
+ {"zip", "94043"},
+ {"n300", "+1 (408) 871-4567"},
+ {"name", "john"},
+ {"name", "aguantó"},
+ {"address", "télévision@example.com"},
+ {"city", "&$%$$$ TESTO *&*&^&^& MOKO"},
+ {"zip", "WOHOOOO$$$$$$$$****"},
+ {"n300", "\xe0\xa4\x9f\xe2\x97\x8c\xe0\xa4\xbe\xe0\xa4\xaf\xe0\xa4\xb0"},
+ {"n300", "\xe4\xbb\xa5\xe7\x8e\xa9\xe4\xb8\xba\xe4\xb8\xbb"}
+};
+
class FirefoxObserver : public ProfileWriter,
public importer::ImporterProgressObserver {
public:
@@ -167,6 +188,17 @@ class FirefoxObserver : public ProfileWriter,
}
}
+ virtual void AddAutofillFormDataEntries(
+ const std::vector<autofill::AutofillEntry>& autofill_entries) OVERRIDE {
+ EXPECT_EQ(arraysize(kFirefoxAutofillEntries), autofill_entries.size());
+ for (size_t i = 0; i < arraysize(kFirefoxAutofillEntries); ++i) {
+ EXPECT_EQ(kFirefoxAutofillEntries[i].name,
+ base::UTF16ToUTF8(autofill_entries[i].key().name()));
+ EXPECT_EQ(kFirefoxAutofillEntries[i].value,
+ base::UTF16ToUTF8(autofill_entries[i].key().value()));
+ }
+ }
+
virtual void AddKeywords(ScopedVector<TemplateURL> template_urls,
bool unique_on_host_and_path) OVERRIDE {
for (size_t i = 0; i < template_urls.size(); ++i) {
@@ -271,7 +303,7 @@ class FirefoxProfileImporterBrowserTest : public InProcessBrowserTest {
source_profile.locale = "en-US";
int items = importer::HISTORY | importer::PASSWORDS | importer::FAVORITES |
- importer::SEARCH_ENGINES;
+ importer::SEARCH_ENGINES | importer::AUTOFILL_FORM_DATA;
// Deletes itself.
ExternalProcessImporterHost* host = new ExternalProcessImporterHost;
diff --git a/chrome/browser/importer/importer_list.cc b/chrome/browser/importer/importer_list.cc
index d42ef4e..de8987d 100644
--- a/chrome/browser/importer/importer_list.cc
+++ b/chrome/browser/importer/importer_list.cc
@@ -93,7 +93,8 @@ void DetectFirefoxProfiles(const std::string locale,
if (firefox->app_path.empty())
firefox->app_path = app_path;
firefox->services_supported = importer::HISTORY | importer::FAVORITES |
- importer::PASSWORDS | importer::SEARCH_ENGINES;
+ importer::PASSWORDS | importer::SEARCH_ENGINES |
+ importer::AUTOFILL_FORM_DATA;
firefox->locale = locale;
profiles->push_back(firefox);
}
diff --git a/chrome/browser/importer/in_process_importer_bridge.cc b/chrome/browser/importer/in_process_importer_bridge.cc
index 61480ae..c5c5927 100644
--- a/chrome/browser/importer/in_process_importer_bridge.cc
+++ b/chrome/browser/importer/in_process_importer_bridge.cc
@@ -12,6 +12,8 @@
#include "chrome/browser/search_engines/ui_thread_search_terms_data.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 "components/autofill/core/browser/webdata/autofill_entry.h"
#include "components/autofill/core/common/password_form.h"
#include "components/search_engines/template_url.h"
#include "components/search_engines/template_url_parser.h"
@@ -254,6 +256,23 @@ void InProcessImporterBridge::SetPasswordForm(
base::Bind(&ProfileWriter::AddPasswordForm, writer_, form));
}
+void InProcessImporterBridge::SetAutofillFormData(
+ const std::vector<ImporterAutofillFormDataEntry>& entries) {
+ std::vector<autofill::AutofillEntry> autofill_entries;
+ for (size_t i = 0; i < entries.size(); ++i) {
+ autofill_entries.push_back(autofill::AutofillEntry(
+ autofill::AutofillKey(entries[i].name, entries[i].value),
+ entries[i].first_used,
+ entries[i].last_used));
+ }
+
+ BrowserThread::PostTask(BrowserThread::UI,
+ FROM_HERE,
+ base::Bind(&ProfileWriter::AddAutofillFormDataEntries,
+ writer_,
+ autofill_entries));
+}
+
void InProcessImporterBridge::NotifyStarted() {
BrowserThread::PostTask(
BrowserThread::UI, FROM_HERE,
diff --git a/chrome/browser/importer/in_process_importer_bridge.h b/chrome/browser/importer/in_process_importer_bridge.h
index e0de744..5f5def8 100644
--- a/chrome/browser/importer/in_process_importer_bridge.h
+++ b/chrome/browser/importer/in_process_importer_bridge.h
@@ -61,6 +61,9 @@ class InProcessImporterBridge : 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/browser/importer/profile_writer.cc b/chrome/browser/importer/profile_writer.cc
index 6bf93dc..e94344a 100644
--- a/chrome/browser/importer/profile_writer.cc
+++ b/chrome/browser/importer/profile_writer.cc
@@ -22,9 +22,11 @@
#include "chrome/browser/password_manager/password_store_factory.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/search_engines/template_url_service_factory.h"
+#include "chrome/browser/webdata/web_data_service_factory.h"
#include "chrome/common/importer/imported_bookmark_entry.h"
#include "chrome/common/importer/imported_favicon_usage.h"
#include "chrome/common/pref_names.h"
+#include "components/autofill/core/browser/webdata/autofill_webdata_service.h"
#include "components/bookmarks/browser/bookmark_model.h"
#include "components/password_manager/core/browser/password_store.h"
#include "components/search_engines/template_url.h"
@@ -329,4 +331,13 @@ void ProfileWriter::AddKeywords(ScopedVector<TemplateURL> template_urls,
}
}
+void ProfileWriter::AddAutofillFormDataEntries(
+ const std::vector<autofill::AutofillEntry>& autofill_entries) {
+ scoped_refptr<autofill::AutofillWebDataService> web_data_service =
+ WebDataServiceFactory::GetAutofillWebDataForProfile(
+ profile_, Profile::EXPLICIT_ACCESS);
+ if (web_data_service.get())
+ web_data_service->UpdateAutofillEntries(autofill_entries);
+}
+
ProfileWriter::~ProfileWriter() {}
diff --git a/chrome/browser/importer/profile_writer.h b/chrome/browser/importer/profile_writer.h
index 3c036b3..6adea3c 100644
--- a/chrome/browser/importer/profile_writer.h
+++ b/chrome/browser/importer/profile_writer.h
@@ -23,6 +23,7 @@ class TemplateURL;
namespace autofill {
struct PasswordForm;
+class AutofillEntry;
}
#if defined(OS_WIN)
@@ -89,6 +90,10 @@ class ProfileWriter : public base::RefCountedThreadSafe<ProfileWriter> {
virtual void AddKeywords(ScopedVector<TemplateURL> template_urls,
bool unique_on_host_and_path);
+ // Adds the imported autofill entries to the autofill database.
+ virtual void AddAutofillFormDataEntries(
+ const std::vector<autofill::AutofillEntry>& autofill_entries);
+
protected:
friend class base::RefCountedThreadSafe<ProfileWriter>;
diff --git a/chrome/browser/resources/options/import_data_overlay.html b/chrome/browser/resources/options/import_data_overlay.html
index ecaa91e..ce7bdb6 100644
--- a/chrome/browser/resources/options/import_data_overlay.html
+++ b/chrome/browser/resources/options/import_data_overlay.html
@@ -50,6 +50,16 @@
<span class="controlled-setting-indicator"
pref="import_search_engine"></span>
</div>
+ <div class="checkbox controlled-setting-with-label"
+ id="import-autofill-form-data-with-label">
+ <label>
+ <input id="import-autofill-form-data" type="checkbox"
+ pref="import_autofill_form_data">
+ <span i18n-content="importAutofillFormData"></span>
+ </label>
+ <span class="controlled-setting-indicator"
+ pref="import_autofill_form_data"></span>
+ </div>
</div>
</div>
<div class="import-data-success" hidden>
diff --git a/chrome/browser/resources/options/import_data_overlay.js b/chrome/browser/resources/options/import_data_overlay.js
index 3afca32..4f40707 100644
--- a/chrome/browser/resources/options/import_data_overlay.js
+++ b/chrome/browser/resources/options/import_data_overlay.js
@@ -49,7 +49,8 @@ cr.define('options', function() {
String($('import-history').checked),
String($('import-favorites').checked),
String($('import-passwords').checked),
- String($('import-search').checked)]);
+ String($('import-search').checked),
+ String($('import-autofill-form-data').checked)]);
};
$('import-data-cancel').onclick = function() {
@@ -75,7 +76,8 @@ cr.define('options', function() {
validateCommitButton_: function() {
var somethingToImport =
$('import-history').checked || $('import-favorites').checked ||
- $('import-passwords').checked || $('import-search').checked;
+ $('import-passwords').checked || $('import-search').checked ||
+ $('import-autofill-form-data').checked;
$('import-data-commit').disabled = !somethingToImport;
$('import-choose-file').disabled = !$('import-favorites').checked;
},
@@ -120,7 +122,11 @@ cr.define('options', function() {
var browserProfile;
if (this.browserProfiles.length > index)
browserProfile = this.browserProfiles[index];
- var importOptions = ['history', 'favorites', 'passwords', 'search'];
+ var importOptions = ['history',
+ 'favorites',
+ 'passwords',
+ 'search',
+ 'autofill-form-data'];
for (var i = 0; i < importOptions.length; i++) {
var checkbox = $('import-' + importOptions[i]);
var enable = browserProfile && browserProfile[importOptions[i]];
@@ -186,7 +192,8 @@ cr.define('options', function() {
var importPrefs = ['import_history',
'import_bookmarks',
'import_saved_passwords',
- 'import_search_engine'];
+ 'import_search_engine',
+ 'import_autofill_form_data'];
for (var i = 0; i < importPrefs.length; i++)
Preferences.clearPref(importPrefs[i], true);
},
diff --git a/chrome/browser/ui/browser_ui_prefs.cc b/chrome/browser/ui/browser_ui_prefs.cc
index 68215e4..958e05e 100644
--- a/chrome/browser/ui/browser_ui_prefs.cc
+++ b/chrome/browser/ui/browser_ui_prefs.cc
@@ -126,6 +126,10 @@ void RegisterBrowserUserPrefs(user_prefs::PrefRegistrySyncable* registry) {
prefs::kBrowserWindowPlacementPopup,
user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
registry->RegisterBooleanPref(
+ prefs::kImportAutofillFormData,
+ true,
+ user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
+ registry->RegisterBooleanPref(
prefs::kImportBookmarks,
true,
user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
@@ -138,11 +142,11 @@ void RegisterBrowserUserPrefs(user_prefs::PrefRegistrySyncable* registry) {
true,
user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
registry->RegisterBooleanPref(
- prefs::kImportSearchEngine,
+ prefs::kImportSavedPasswords,
true,
user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
registry->RegisterBooleanPref(
- prefs::kImportSavedPasswords,
+ prefs::kImportSearchEngine,
true,
user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
registry->RegisterBooleanPref(
diff --git a/chrome/browser/ui/webui/options/import_data_handler.cc b/chrome/browser/ui/webui/options/import_data_handler.cc
index 5481cf8..c868277 100644
--- a/chrome/browser/ui/webui/options/import_data_handler.cc
+++ b/chrome/browser/ui/webui/options/import_data_handler.cc
@@ -55,20 +55,21 @@ void ImportDataHandler::GetLocalizedValues(
DCHECK(localized_strings);
static OptionsStringResource resources[] = {
- { "importFromLabel", IDS_IMPORT_FROM_LABEL },
- { "importLoading", IDS_IMPORT_LOADING_PROFILES },
- { "importDescription", IDS_IMPORT_ITEMS_LABEL },
- { "importHistory", IDS_IMPORT_HISTORY_CHKBOX },
- { "importFavorites", IDS_IMPORT_FAVORITES_CHKBOX },
- { "importSearch", IDS_IMPORT_SEARCH_ENGINES_CHKBOX },
- { "importPasswords", IDS_IMPORT_PASSWORDS_CHKBOX },
- { "importChooseFile", IDS_IMPORT_CHOOSE_FILE },
- { "importCommit", IDS_IMPORT_COMMIT },
- { "noProfileFound", IDS_IMPORT_NO_PROFILE_FOUND },
- { "importSucceeded", IDS_IMPORT_SUCCEEDED },
- { "findYourImportedBookmarks", IDS_IMPORT_FIND_YOUR_BOOKMARKS },
+ {"importFromLabel", IDS_IMPORT_FROM_LABEL},
+ {"importLoading", IDS_IMPORT_LOADING_PROFILES},
+ {"importDescription", IDS_IMPORT_ITEMS_LABEL},
+ {"importHistory", IDS_IMPORT_HISTORY_CHKBOX},
+ {"importFavorites", IDS_IMPORT_FAVORITES_CHKBOX},
+ {"importSearch", IDS_IMPORT_SEARCH_ENGINES_CHKBOX},
+ {"importPasswords", IDS_IMPORT_PASSWORDS_CHKBOX},
+ {"importAutofillFormData", IDS_IMPORT_AUTOFILL_FORM_DATA_CHKBOX},
+ {"importChooseFile", IDS_IMPORT_CHOOSE_FILE},
+ {"importCommit", IDS_IMPORT_COMMIT},
+ {"noProfileFound", IDS_IMPORT_NO_PROFILE_FOUND},
+ {"importSucceeded", IDS_IMPORT_SUCCEEDED},
+ {"findYourImportedBookmarks", IDS_IMPORT_FIND_YOUR_BOOKMARKS},
#if defined(OS_MACOSX)
- { "macPasswordKeychain", IDS_IMPORT_PASSWORD_KEYCHAIN_WARNING },
+ {"macPasswordKeychain", IDS_IMPORT_PASSWORD_KEYCHAIN_WARNING},
#endif
};
@@ -152,6 +153,9 @@ void ImportDataHandler::ImportData(const base::ListValue* args) {
if (args->GetString(4, &string_value) && string_value == "true") {
selected_items |= importer::SEARCH_ENGINES;
}
+ if (args->GetString(5, &string_value) && string_value == "true") {
+ selected_items |= importer::AUTOFILL_FORM_DATA;
+ }
const importer::SourceProfile& source_profile =
importer_list_->GetSourceProfileAt(browser_index);
@@ -186,6 +190,8 @@ void ImportDataHandler::InitializePage() {
(browser_services & importer::PASSWORDS) != 0);
browser_profile->SetBoolean("search",
(browser_services & importer::SEARCH_ENGINES) != 0);
+ browser_profile->SetBoolean("autofill-form-data",
+ (browser_services & importer::AUTOFILL_FORM_DATA) != 0);
browser_profile->SetBoolean("show_bottom_bar",
#if defined(OS_MACOSX)