Home | History | Annotate | Download | only in options
      1 // Copyright (c) 2011 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #include "chrome/browser/ui/webui/options/import_data_handler.h"
      6 
      7 #include <string>
      8 
      9 #include "base/basictypes.h"
     10 #include "base/callback.h"
     11 #include "base/memory/scoped_ptr.h"
     12 #include "base/string16.h"
     13 #include "base/string_number_conversions.h"
     14 #include "base/string_util.h"
     15 #include "base/threading/thread_restrictions.h"
     16 #include "base/utf_string_conversions.h"
     17 #include "base/values.h"
     18 #include "chrome/browser/importer/external_process_importer_host.h"
     19 #include "chrome/browser/importer/importer_host.h"
     20 #include "chrome/browser/profiles/profile.h"
     21 #include "grit/chromium_strings.h"
     22 #include "grit/generated_resources.h"
     23 #include "ui/base/l10n/l10n_util.h"
     24 
     25 ImportDataHandler::ImportDataHandler() : importer_host_(NULL) {
     26 }
     27 
     28 ImportDataHandler::~ImportDataHandler() {
     29   if (importer_list_)
     30     importer_list_->SetObserver(NULL);
     31 
     32   if (importer_host_)
     33     importer_host_->SetObserver(NULL);
     34 }
     35 
     36 void ImportDataHandler::GetLocalizedValues(
     37     DictionaryValue* localized_strings) {
     38   DCHECK(localized_strings);
     39 
     40   static OptionsStringResource resources[] = {
     41     { "importFromLabel", IDS_IMPORT_FROM_LABEL },
     42     { "importLoading", IDS_IMPORT_LOADING_PROFILES },
     43     { "importDescription", IDS_IMPORT_ITEMS_LABEL },
     44     { "importHistory", IDS_IMPORT_HISTORY_CHKBOX },
     45     { "importFavorites", IDS_IMPORT_FAVORITES_CHKBOX },
     46     { "importSearch", IDS_IMPORT_SEARCH_ENGINES_CHKBOX },
     47     { "importPasswords", IDS_IMPORT_PASSWORDS_CHKBOX },
     48     { "importCommit", IDS_IMPORT_COMMIT },
     49     { "noProfileFound", IDS_IMPORT_NO_PROFILE_FOUND },
     50   };
     51 
     52   RegisterStrings(localized_strings, resources, arraysize(resources));
     53   RegisterTitle(localized_strings, "importDataOverlay",
     54                 IDS_IMPORT_SETTINGS_TITLE);
     55 }
     56 
     57 void ImportDataHandler::Initialize() {
     58   importer_list_ = new ImporterList;
     59   importer_list_->DetectSourceProfiles(this);
     60 }
     61 
     62 void ImportDataHandler::RegisterMessages() {
     63   web_ui_->RegisterMessageCallback(
     64       "importData", NewCallback(this, &ImportDataHandler::ImportData));
     65 }
     66 
     67 void ImportDataHandler::ImportData(const ListValue* args) {
     68   std::string string_value;
     69 
     70   int browser_index;
     71   if (!args->GetString(0, &string_value) ||
     72       !base::StringToInt(string_value, &browser_index)) {
     73     NOTREACHED();
     74     return;
     75   }
     76 
     77   uint16 selected_items = importer::NONE;
     78   if (args->GetString(1, &string_value) && string_value == "true") {
     79     selected_items |= importer::HISTORY;
     80   }
     81   if (args->GetString(2, &string_value) && string_value == "true") {
     82     selected_items |= importer::FAVORITES;
     83   }
     84   if (args->GetString(3, &string_value) && string_value == "true") {
     85     selected_items |= importer::PASSWORDS;
     86   }
     87   if (args->GetString(4, &string_value) && string_value == "true") {
     88     selected_items |= importer::SEARCH_ENGINES;
     89   }
     90 
     91   const importer::SourceProfile& source_profile =
     92       importer_list_->GetSourceProfileAt(browser_index);
     93   uint16 supported_items = source_profile.services_supported;
     94 
     95   uint16 import_services = (selected_items & supported_items);
     96   if (import_services) {
     97     FundamentalValue state(true);
     98     web_ui_->CallJavascriptFunction("ImportDataOverlay.setImportingState",
     99                                     state);
    100 
    101     // TODO(csilv): Out-of-process import has only been qualified on MacOS X,
    102     // so we will only use it on that platform since it is required. Remove this
    103     // conditional logic once oop import is qualified for Linux/Windows.
    104     // http://crbug.com/22142
    105 #if defined(OS_MACOSX)
    106     importer_host_ = new ExternalProcessImporterHost;
    107 #else
    108     importer_host_ = new ImporterHost;
    109 #endif
    110     importer_host_->SetObserver(this);
    111     Profile* profile = web_ui_->GetProfile();
    112     importer_host_->StartImportSettings(source_profile, profile,
    113                                         import_services,
    114                                         new ProfileWriter(profile), false);
    115   } else {
    116     LOG(WARNING) << "There were no settings to import from '"
    117         << source_profile.importer_name << "'.";
    118   }
    119 }
    120 
    121 void ImportDataHandler::OnSourceProfilesLoaded() {
    122   ListValue browser_profiles;
    123   for (size_t i = 0; i < importer_list_->count(); ++i) {
    124     const importer::SourceProfile& source_profile =
    125         importer_list_->GetSourceProfileAt(i);
    126     uint16 browser_services = source_profile.services_supported;
    127 
    128     DictionaryValue* browser_profile = new DictionaryValue();
    129     browser_profile->SetString("name", source_profile.importer_name);
    130     browser_profile->SetInteger("index", i);
    131     browser_profile->SetBoolean("history",
    132         (browser_services & importer::HISTORY) != 0);
    133     browser_profile->SetBoolean("favorites",
    134         (browser_services & importer::FAVORITES) != 0);
    135     browser_profile->SetBoolean("passwords",
    136         (browser_services & importer::PASSWORDS) != 0);
    137     browser_profile->SetBoolean("search",
    138         (browser_services & importer::SEARCH_ENGINES) != 0);
    139 
    140     browser_profiles.Append(browser_profile);
    141   }
    142 
    143   web_ui_->CallJavascriptFunction(
    144       "options.ImportDataOverlay.updateSupportedBrowsers", browser_profiles);
    145 }
    146 
    147 void ImportDataHandler::ImportStarted() {
    148 }
    149 
    150 void ImportDataHandler::ImportItemStarted(importer::ImportItem item) {
    151   // TODO(csilv): show progress detail in the web view.
    152 }
    153 
    154 void ImportDataHandler::ImportItemEnded(importer::ImportItem item) {
    155   // TODO(csilv): show progress detail in the web view.
    156 }
    157 
    158 void ImportDataHandler::ImportEnded() {
    159   importer_host_->SetObserver(NULL);
    160   importer_host_ = NULL;
    161 
    162   web_ui_->CallJavascriptFunction("ImportDataOverlay.dismiss");
    163 }
    164