15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/importer/in_process_importer_bridge.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind.h"
81320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/debug/dump_without_crashing.h"
91320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/files/file_util.h"
106e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "base/strings/string_util.h"
11868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h"
12eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "chrome/browser/importer/external_process_importer_host.h"
13116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chrome/browser/search_engines/ui_thread_search_terms_data.h"
14eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "chrome/common/importer/imported_bookmark_entry.h"
15eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "chrome/common/importer/imported_favicon_usage.h"
161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "chrome/common/importer/importer_autofill_form_data_entry.h"
171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "components/autofill/core/browser/webdata/autofill_entry.h"
1858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "components/autofill/core/common/password_form.h"
19116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "components/search_engines/template_url.h"
20116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "components/search_engines/template_url_parser.h"
21116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "components/search_engines/template_url_prepopulate_data.h"
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/browser_thread.h"
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/l10n/l10n_util.h"
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN)
26a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "components/os_crypt/ie7_password_win.h"
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <iterator>
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
31eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochnamespace {
32eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
33eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochhistory::URLRows ConvertImporterURLRowsToHistoryURLRows(
34eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    const std::vector<ImporterURLRow>& rows) {
35eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  history::URLRows converted;
36eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  converted.reserve(rows.size());
37eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  for (std::vector<ImporterURLRow>::const_iterator it = rows.begin();
38eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch       it != rows.end(); ++it) {
39eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    history::URLRow row(it->url);
40eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    row.set_title(it->title);
41eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    row.set_visit_count(it->visit_count);
42eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    row.set_typed_count(it->typed_count);
43eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    row.set_last_visit(it->last_visit);
44eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    row.set_hidden(it->hidden);
45eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    converted.push_back(row);
46eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
47eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  return converted;
48eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
49eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
507dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochhistory::VisitSource ConvertImporterVisitSourceToHistoryVisitSource(
517dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    importer::VisitSource visit_source) {
527dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  switch (visit_source) {
537dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    case importer::VISIT_SOURCE_BROWSED:
547dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      return history::SOURCE_BROWSED;
557dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    case importer::VISIT_SOURCE_FIREFOX_IMPORTED:
567dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      return history::SOURCE_FIREFOX_IMPORTED;
577dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    case importer::VISIT_SOURCE_IE_IMPORTED:
587dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      return history::SOURCE_IE_IMPORTED;
597dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    case importer::VISIT_SOURCE_SAFARI_IMPORTED:
607dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      return history::SOURCE_SAFARI_IMPORTED;
617dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  }
627dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  NOTREACHED();
637dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  return history::SOURCE_SYNCED;
647dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
657dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// http://crbug.com/404012. Let's see where the empty fields come from.
671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid CheckForEmptyUsernameAndPassword(const autofill::PasswordForm& form) {
681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (form.username_value.empty() &&
691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      form.password_value.empty() &&
701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      !form.blacklisted_by_user) {
711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    base::debug::DumpWithoutCrashing();
721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
75eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}  // namespace
76eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::BrowserThread;
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
79eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochnamespace {
80eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
81eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// FirefoxURLParameterFilter is used to remove parameter mentioning Firefox from
82eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// the search URL when importing search engines.
83eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochclass FirefoxURLParameterFilter : public TemplateURLParser::ParameterFilter {
84eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch public:
85eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  FirefoxURLParameterFilter() {}
86eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  virtual ~FirefoxURLParameterFilter() {}
87eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
88eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // TemplateURLParser::ParameterFilter method.
89eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  virtual bool KeepParameter(const std::string& key,
90eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                             const std::string& value) OVERRIDE {
916e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    std::string low_value = base::StringToLowerASCII(value);
92eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    if (low_value.find("mozilla") != std::string::npos ||
93eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        low_value.find("firefox") != std::string::npos ||
94eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        low_value.find("moz:") != std::string::npos) {
95eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      return false;
96eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    }
97eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    return true;
98eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
99eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
100eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch private:
101eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  DISALLOW_COPY_AND_ASSIGN(FirefoxURLParameterFilter);
102eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch};
103eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
104eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Creates a TemplateURL with the |keyword| and |url|. |title| may be empty.
105eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// This function transfers ownership of the created TemplateURL to the caller.
106a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)TemplateURL* CreateTemplateURL(const base::string16& title,
107a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                               const base::string16& keyword,
108eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                               const GURL& url) {
109eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Skip if the url is invalid.
110eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  if (!url.is_valid())
111eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    return NULL;
112eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
113eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  TemplateURLData data;
114eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  if (keyword.empty())
1156d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    data.SetKeyword(TemplateURL::GenerateKeyword(url));
116eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  else
117eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    data.SetKeyword(keyword);
118eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // We set short name by using the title if it exists.
119eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Otherwise, we use the shortcut.
120eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  data.short_name = title.empty() ? keyword : title;
1215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  data.SetURL(
1225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      TemplateURLRef::DisplayURLToURLRef(base::UTF8ToUTF16(url.spec())));
123f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  return new TemplateURL(data);
124eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
125eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
126eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Parses the OpenSearch XML files in |xml_files| and populates |search_engines|
127eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// with the resulting TemplateURLs.
128eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid ParseSearchEnginesFromFirefoxXMLData(
129eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    const std::vector<std::string>& xml_data,
130eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    std::vector<TemplateURL*>* search_engines) {
131eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  DCHECK(search_engines);
132eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
133eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  typedef std::map<std::string, TemplateURL*> SearchEnginesMap;
134eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  SearchEnginesMap search_engine_for_url;
135eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  FirefoxURLParameterFilter param_filter;
136eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // The first XML file represents the default search engine in Firefox 3, so we
137eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // need to keep it on top of the list.
138eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  SearchEnginesMap::const_iterator default_turl = search_engine_for_url.end();
139eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  for (std::vector<std::string>::const_iterator xml_iter =
140eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch           xml_data.begin(); xml_iter != xml_data.end(); ++xml_iter) {
141116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    TemplateURL* template_url = TemplateURLParser::Parse(
142116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        UIThreadSearchTermsData(NULL), true,
143eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        xml_iter->data(), xml_iter->length(), &param_filter);
144eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    if (template_url) {
145eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      SearchEnginesMap::iterator iter =
146eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch          search_engine_for_url.find(template_url->url());
147eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      if (iter == search_engine_for_url.end()) {
148eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        iter = search_engine_for_url.insert(
149eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch            std::make_pair(template_url->url(), template_url)).first;
150eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      } else {
151eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        // We have already found a search engine with the same URL.  We give
152eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        // priority to the latest one found, as GetSearchEnginesXMLFiles()
153eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        // returns a vector with first Firefox default search engines and then
154eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        // the user's ones.  We want to give priority to the user ones.
155eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        delete iter->second;
156eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        iter->second = template_url;
157eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      }
158eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      if (default_turl == search_engine_for_url.end())
159eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        default_turl = iter;
160eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    }
161eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
162eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
163eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Put the results in the |search_engines| vector.
164eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  for (SearchEnginesMap::iterator t_iter = search_engine_for_url.begin();
165eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch       t_iter != search_engine_for_url.end(); ++t_iter) {
166eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    if (t_iter == default_turl)
167eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      search_engines->insert(search_engines->begin(), default_turl->second);
168eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    else
169eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      search_engines->push_back(t_iter->second);
170eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
171eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
172eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
173eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}  // namespace
174eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
175c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)InProcessImporterBridge::InProcessImporterBridge(
176c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ProfileWriter* writer,
177eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    base::WeakPtr<ExternalProcessImporterHost> host) : writer_(writer),
178eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                                       host_(host) {
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void InProcessImporterBridge::AddBookmarks(
182a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    const std::vector<ImportedBookmarkEntry>& bookmarks,
183a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    const base::string16& first_folder_name) {
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BrowserThread::PostTask(
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      BrowserThread::UI, FROM_HERE,
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&ProfileWriter::AddBookmarks, writer_, bookmarks,
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 first_folder_name));
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void InProcessImporterBridge::AddHomePage(const GURL& home_page) {
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BrowserThread::PostTask(
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      BrowserThread::UI, FROM_HERE,
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&ProfileWriter::AddHomepage, writer_, home_page));
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN)
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void InProcessImporterBridge::AddIE7PasswordInfo(
1987dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    const importer::ImporterIE7PasswordInfo& password_info) {
1997dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  IE7PasswordInfo ie7_password_info;
2007dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  ie7_password_info.url_hash = password_info.url_hash;
2017dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  ie7_password_info.encrypted_data = password_info.encrypted_data;
2027dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  ie7_password_info.date_created = password_info.date_created;
2037dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BrowserThread::PostTask(
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      BrowserThread::UI, FROM_HERE,
2067dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      base::Bind(&ProfileWriter::AddIE7PasswordInfo, writer_,
2077dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                 ie7_password_info));
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // OS_WIN
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void InProcessImporterBridge::SetFavicons(
212a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    const std::vector<ImportedFaviconUsage>& favicons) {
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BrowserThread::PostTask(
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      BrowserThread::UI, FROM_HERE,
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&ProfileWriter::AddFavicons, writer_, favicons));
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void InProcessImporterBridge::SetHistoryItems(
219eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    const std::vector<ImporterURLRow>& rows,
2207dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    importer::VisitSource visit_source) {
2217dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  history::URLRows converted_rows =
2227dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      ConvertImporterURLRowsToHistoryURLRows(rows);
2237dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  history::VisitSource converted_visit_source =
2247dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      ConvertImporterVisitSourceToHistoryVisitSource(visit_source);
2257dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  BrowserThread::PostTask(BrowserThread::UI,
2267dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                          FROM_HERE,
2277dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                          base::Bind(&ProfileWriter::AddHistoryPage,
2287dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                                     writer_,
2297dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                                     converted_rows,
2307dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                                     converted_visit_source));
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void InProcessImporterBridge::SetKeywords(
234eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    const std::vector<importer::URLKeywordInfo>& url_keywords,
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool unique_on_host_and_path) {
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ScopedVector<TemplateURL> owned_template_urls;
237eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  for (size_t i = 0; i < url_keywords.size(); ++i) {
238eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    owned_template_urls.push_back(
239eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        CreateTemplateURL(url_keywords[i].display_name,
240eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                          url_keywords[i].keyword,
241eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                          url_keywords[i].url));
242eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BrowserThread::PostTask(BrowserThread::UI, FROM_HERE,
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&ProfileWriter::AddKeywords, writer_,
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 base::Passed(&owned_template_urls), unique_on_host_and_path));
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
248eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid InProcessImporterBridge::SetFirefoxSearchEnginesXMLData(
249eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    const std::vector<std::string>& search_engine_data) {
250eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  std::vector<TemplateURL*> search_engines;
251eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ParseSearchEnginesFromFirefoxXMLData(search_engine_data, &search_engines);
252eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
253eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ScopedVector<TemplateURL> owned_template_urls;
254eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  std::copy(search_engines.begin(), search_engines.end(),
255eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch            std::back_inserter(owned_template_urls));
256eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
257eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  BrowserThread::PostTask(BrowserThread::UI, FROM_HERE,
258eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      base::Bind(&ProfileWriter::AddKeywords, writer_,
259eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                 base::Passed(&owned_template_urls), true));
260eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
261eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void InProcessImporterBridge::SetPasswordForm(
26358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    const autofill::PasswordForm& form) {
2641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  CheckForEmptyUsernameAndPassword(form);
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BrowserThread::PostTask(
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      BrowserThread::UI, FROM_HERE,
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&ProfileWriter::AddPasswordForm, writer_, form));
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid InProcessImporterBridge::SetAutofillFormData(
2711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const std::vector<ImporterAutofillFormDataEntry>& entries) {
2721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  std::vector<autofill::AutofillEntry> autofill_entries;
2731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  for (size_t i = 0; i < entries.size(); ++i) {
2741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    autofill_entries.push_back(autofill::AutofillEntry(
2751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        autofill::AutofillKey(entries[i].name, entries[i].value),
2761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        entries[i].first_used,
2771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        entries[i].last_used));
2781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
2791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  BrowserThread::PostTask(BrowserThread::UI,
2811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                          FROM_HERE,
2821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                          base::Bind(&ProfileWriter::AddAutofillFormDataEntries,
2831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                     writer_,
2841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                     autofill_entries));
2851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
2861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void InProcessImporterBridge::NotifyStarted() {
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BrowserThread::PostTask(
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      BrowserThread::UI, FROM_HERE,
290eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      base::Bind(&ExternalProcessImporterHost::NotifyImportStarted, host_));
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void InProcessImporterBridge::NotifyItemStarted(importer::ImportItem item) {
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BrowserThread::PostTask(
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      BrowserThread::UI, FROM_HERE,
296eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      base::Bind(&ExternalProcessImporterHost::NotifyImportItemStarted,
297eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                 host_, item));
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void InProcessImporterBridge::NotifyItemEnded(importer::ImportItem item) {
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BrowserThread::PostTask(
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      BrowserThread::UI, FROM_HERE,
303eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      base::Bind(&ExternalProcessImporterHost::NotifyImportItemEnded,
304eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                 host_, item));
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void InProcessImporterBridge::NotifyEnded() {
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BrowserThread::PostTask(
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      BrowserThread::UI, FROM_HERE,
310eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      base::Bind(&ExternalProcessImporterHost::NotifyImportEnded, host_));
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)base::string16 InProcessImporterBridge::GetLocalizedString(int message_id) {
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return l10n_util::GetStringUTF16(message_id);
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)InProcessImporterBridge::~InProcessImporterBridge() {}
318