172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved.
2bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// Use of this source code is governed by a BSD-style license that can be
3bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// found in the LICENSE file.
4bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
5dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "chrome/browser/ui/webui/options/import_data_handler.h"
6bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include <string>
872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
9bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "base/basictypes.h"
10513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch#include "base/callback.h"
11ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/memory/scoped_ptr.h"
12bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "base/string16.h"
13bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "base/string_number_conversions.h"
14bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "base/string_util.h"
153f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen#include "base/threading/thread_restrictions.h"
16bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "base/utf_string_conversions.h"
17bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "base/values.h"
18ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/importer/external_process_importer_host.h"
19ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/importer/importer_host.h"
2021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "chrome/browser/profiles/profile.h"
21bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "grit/chromium_strings.h"
22bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "grit/generated_resources.h"
2372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "ui/base/l10n/l10n_util.h"
24bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
25bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian MonsenImportDataHandler::ImportDataHandler() : importer_host_(NULL) {
26bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
27bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
28bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian MonsenImportDataHandler::~ImportDataHandler() {
2972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  if (importer_list_)
3072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    importer_list_->SetObserver(NULL);
3172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
32bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  if (importer_host_)
33bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    importer_host_->SetObserver(NULL);
34bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
35bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
36bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid ImportDataHandler::GetLocalizedValues(
37bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    DictionaryValue* localized_strings) {
38bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  DCHECK(localized_strings);
39dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
40dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  static OptionsStringResource resources[] = {
41dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    { "importFromLabel", IDS_IMPORT_FROM_LABEL },
42dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    { "importLoading", IDS_IMPORT_LOADING_PROFILES },
43dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    { "importDescription", IDS_IMPORT_ITEMS_LABEL },
44dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    { "importHistory", IDS_IMPORT_HISTORY_CHKBOX },
45dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    { "importFavorites", IDS_IMPORT_FAVORITES_CHKBOX },
46dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    { "importSearch", IDS_IMPORT_SEARCH_ENGINES_CHKBOX },
47dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    { "importPasswords", IDS_IMPORT_PASSWORDS_CHKBOX },
48dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    { "importCommit", IDS_IMPORT_COMMIT },
49dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    { "noProfileFound", IDS_IMPORT_NO_PROFILE_FOUND },
50dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  };
51dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
52dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  RegisterStrings(localized_strings, resources, arraysize(resources));
5372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  RegisterTitle(localized_strings, "importDataOverlay",
5472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                IDS_IMPORT_SETTINGS_TITLE);
55bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
56bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
57bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid ImportDataHandler::Initialize() {
5821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  importer_list_ = new ImporterList;
5921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  importer_list_->DetectSourceProfiles(this);
60bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
61bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
62bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid ImportDataHandler::RegisterMessages() {
6372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  web_ui_->RegisterMessageCallback(
64bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      "importData", NewCallback(this, &ImportDataHandler::ImportData));
65bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
66bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
67bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid ImportDataHandler::ImportData(const ListValue* args) {
68bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  std::string string_value;
69bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
70bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  int browser_index;
71bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  if (!args->GetString(0, &string_value) ||
72bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      !base::StringToInt(string_value, &browser_index)) {
73bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    NOTREACHED();
74bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    return;
75bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
76bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
77bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  uint16 selected_items = importer::NONE;
78bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  if (args->GetString(1, &string_value) && string_value == "true") {
79bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    selected_items |= importer::HISTORY;
80bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
81bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  if (args->GetString(2, &string_value) && string_value == "true") {
82bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    selected_items |= importer::FAVORITES;
83bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
84bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  if (args->GetString(3, &string_value) && string_value == "true") {
85bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    selected_items |= importer::PASSWORDS;
86bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
87bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  if (args->GetString(4, &string_value) && string_value == "true") {
88bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    selected_items |= importer::SEARCH_ENGINES;
89bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
90bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
91ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  const importer::SourceProfile& source_profile =
92ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      importer_list_->GetSourceProfileAt(browser_index);
93bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  uint16 supported_items = source_profile.services_supported;
94bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
95bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  uint16 import_services = (selected_items & supported_items);
96bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  if (import_services) {
97bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    FundamentalValue state(true);
98ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    web_ui_->CallJavascriptFunction("ImportDataOverlay.setImportingState",
99ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                    state);
100bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
101513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    // TODO(csilv): Out-of-process import has only been qualified on MacOS X,
102513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    // so we will only use it on that platform since it is required. Remove this
103513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    // conditional logic once oop import is qualified for Linux/Windows.
104513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    // http://crbug.com/22142
105bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#if defined(OS_MACOSX)
10672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    importer_host_ = new ExternalProcessImporterHost;
107bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#else
10872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    importer_host_ = new ImporterHost;
109bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#endif
110bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    importer_host_->SetObserver(this);
11172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    Profile* profile = web_ui_->GetProfile();
112bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    importer_host_->StartImportSettings(source_profile, profile,
113bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                                        import_services,
114bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                                        new ProfileWriter(profile), false);
115bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  } else {
116bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    LOG(WARNING) << "There were no settings to import from '"
117ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        << source_profile.importer_name << "'.";
118bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
119bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
120bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
121ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid ImportDataHandler::OnSourceProfilesLoaded() {
12221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  ListValue browser_profiles;
123ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  for (size_t i = 0; i < importer_list_->count(); ++i) {
124ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    const importer::SourceProfile& source_profile =
125ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        importer_list_->GetSourceProfileAt(i);
12621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    uint16 browser_services = source_profile.services_supported;
12721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
12821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    DictionaryValue* browser_profile = new DictionaryValue();
129ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    browser_profile->SetString("name", source_profile.importer_name);
13021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    browser_profile->SetInteger("index", i);
13121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    browser_profile->SetBoolean("history",
13221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen        (browser_services & importer::HISTORY) != 0);
13321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    browser_profile->SetBoolean("favorites",
13421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen        (browser_services & importer::FAVORITES) != 0);
13521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    browser_profile->SetBoolean("passwords",
13621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen        (browser_services & importer::PASSWORDS) != 0);
13721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    browser_profile->SetBoolean("search",
13821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen        (browser_services & importer::SEARCH_ENGINES) != 0);
13921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
14021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    browser_profiles.Append(browser_profile);
14121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  }
14221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
14372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  web_ui_->CallJavascriptFunction(
144ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      "options.ImportDataOverlay.updateSupportedBrowsers", browser_profiles);
145ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
146ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
147ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid ImportDataHandler::ImportStarted() {
148ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
149ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
150ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid ImportDataHandler::ImportItemStarted(importer::ImportItem item) {
151ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // TODO(csilv): show progress detail in the web view.
152ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
153ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
154ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid ImportDataHandler::ImportItemEnded(importer::ImportItem item) {
155ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // TODO(csilv): show progress detail in the web view.
156ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
157ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
158ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid ImportDataHandler::ImportEnded() {
159ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  importer_host_->SetObserver(NULL);
160ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  importer_host_ = NULL;
161ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
162ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  web_ui_->CallJavascriptFunction("ImportDataOverlay.dismiss");
16321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen}
164