Home | History | Annotate | Download | only in importer
      1 // Copyright (c) 2012 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/importer/importer_list.h"
      6 
      7 #include "base/bind.h"
      8 #include "chrome/browser/shell_integration.h"
      9 #include "chrome/common/importer/firefox_importer_utils.h"
     10 #include "chrome/common/importer/importer_bridge.h"
     11 #include "chrome/common/importer/importer_data_types.h"
     12 #include "content/public/browser/browser_thread.h"
     13 #include "grit/generated_resources.h"
     14 #include "ui/base/l10n/l10n_util.h"
     15 
     16 #if defined(OS_MACOSX)
     17 #include <CoreFoundation/CoreFoundation.h>
     18 
     19 #include "base/mac/foundation_util.h"
     20 #include "chrome/common/importer/safari_importer_utils.h"
     21 #endif
     22 
     23 using content::BrowserThread;
     24 
     25 namespace {
     26 
     27 #if defined(OS_WIN)
     28 void DetectIEProfiles(std::vector<importer::SourceProfile*>* profiles) {
     29   DCHECK_CURRENTLY_ON(BrowserThread::FILE);
     30   // IE always exists and doesn't have multiple profiles.
     31   importer::SourceProfile* ie = new importer::SourceProfile;
     32   ie->importer_name = l10n_util::GetStringUTF16(IDS_IMPORT_FROM_IE);
     33   ie->importer_type = importer::TYPE_IE;
     34   ie->source_path.clear();
     35   ie->app_path.clear();
     36   ie->services_supported = importer::HISTORY | importer::FAVORITES |
     37       importer::COOKIES | importer::PASSWORDS | importer::SEARCH_ENGINES;
     38   profiles->push_back(ie);
     39 }
     40 #endif  // defined(OS_WIN)
     41 
     42 #if defined(OS_MACOSX)
     43 void DetectSafariProfiles(std::vector<importer::SourceProfile*>* profiles) {
     44   DCHECK_CURRENTLY_ON(BrowserThread::FILE);
     45   uint16 items = importer::NONE;
     46   if (!SafariImporterCanImport(base::mac::GetUserLibraryPath(), &items))
     47     return;
     48 
     49   importer::SourceProfile* safari = new importer::SourceProfile;
     50   safari->importer_name = l10n_util::GetStringUTF16(IDS_IMPORT_FROM_SAFARI);
     51   safari->importer_type = importer::TYPE_SAFARI;
     52   safari->source_path.clear();
     53   safari->app_path.clear();
     54   safari->services_supported = items;
     55   profiles->push_back(safari);
     56 }
     57 #endif  // defined(OS_MACOSX)
     58 
     59 // |locale|: The application locale used for lookups in Firefox's
     60 // locale-specific search engines feature (see firefox_importer.cc for
     61 // details).
     62 void DetectFirefoxProfiles(const std::string locale,
     63                            std::vector<importer::SourceProfile*>* profiles) {
     64   DCHECK_CURRENTLY_ON(BrowserThread::FILE);
     65   base::FilePath profile_path = GetFirefoxProfilePath();
     66   if (profile_path.empty())
     67     return;
     68 
     69   // Detects which version of Firefox is installed.
     70   importer::ImporterType firefox_type;
     71   base::FilePath app_path;
     72   int version = 0;
     73 #if defined(OS_WIN)
     74   version = GetCurrentFirefoxMajorVersionFromRegistry();
     75 #endif
     76   if (version < 2)
     77     GetFirefoxVersionAndPathFromProfile(profile_path, &version, &app_path);
     78 
     79   if (version >= 3) {
     80     firefox_type = importer::TYPE_FIREFOX;
     81   } else {
     82     // Ignores old versions of firefox.
     83     return;
     84   }
     85 
     86   importer::SourceProfile* firefox = new importer::SourceProfile;
     87   firefox->importer_name = GetFirefoxImporterName(app_path);
     88   firefox->importer_type = firefox_type;
     89   firefox->source_path = profile_path;
     90 #if defined(OS_WIN)
     91   firefox->app_path = GetFirefoxInstallPathFromRegistry();
     92 #endif
     93   if (firefox->app_path.empty())
     94     firefox->app_path = app_path;
     95   firefox->services_supported = importer::HISTORY | importer::FAVORITES |
     96       importer::PASSWORDS | importer::SEARCH_ENGINES;
     97   firefox->locale = locale;
     98   profiles->push_back(firefox);
     99 }
    100 
    101 std::vector<importer::SourceProfile*> DetectSourceProfilesWorker(
    102     const std::string& locale,
    103     bool include_interactive_profiles) {
    104   DCHECK_CURRENTLY_ON(BrowserThread::FILE);
    105 
    106   std::vector<importer::SourceProfile*> profiles;
    107 
    108   // The first run import will automatically take settings from the first
    109   // profile detected, which should be the user's current default.
    110 #if defined(OS_WIN)
    111   if (ShellIntegration::IsFirefoxDefaultBrowser()) {
    112     DetectFirefoxProfiles(locale, &profiles);
    113     DetectIEProfiles(&profiles);
    114   } else {
    115     DetectIEProfiles(&profiles);
    116     DetectFirefoxProfiles(locale, &profiles);
    117   }
    118 #elif defined(OS_MACOSX)
    119   if (ShellIntegration::IsFirefoxDefaultBrowser()) {
    120     DetectFirefoxProfiles(locale, &profiles);
    121     DetectSafariProfiles(&profiles);
    122   } else {
    123     DetectSafariProfiles(&profiles);
    124     DetectFirefoxProfiles(locale, &profiles);
    125   }
    126 #else
    127   DetectFirefoxProfiles(locale, &profiles);
    128 #endif
    129   if (include_interactive_profiles) {
    130     importer::SourceProfile* bookmarks_profile = new importer::SourceProfile;
    131     bookmarks_profile->importer_name =
    132         l10n_util::GetStringUTF16(IDS_IMPORT_FROM_BOOKMARKS_HTML_FILE);
    133     bookmarks_profile->importer_type = importer::TYPE_BOOKMARKS_FILE;
    134     bookmarks_profile->services_supported = importer::FAVORITES;
    135     profiles.push_back(bookmarks_profile);
    136   }
    137 
    138   return profiles;
    139 }
    140 
    141 }  // namespace
    142 
    143 ImporterList::ImporterList()
    144     : weak_ptr_factory_(this) {
    145   DCHECK_CURRENTLY_ON(BrowserThread::UI);
    146 }
    147 
    148 ImporterList::~ImporterList() {
    149   DCHECK_CURRENTLY_ON(BrowserThread::UI);
    150 }
    151 
    152 void ImporterList::DetectSourceProfiles(
    153     const std::string& locale,
    154     bool include_interactive_profiles,
    155     const base::Closure& profiles_loaded_callback) {
    156   DCHECK_CURRENTLY_ON(BrowserThread::UI);
    157   BrowserThread::PostTaskAndReplyWithResult(
    158       BrowserThread::FILE,
    159       FROM_HERE,
    160       base::Bind(&DetectSourceProfilesWorker,
    161                  locale,
    162                  include_interactive_profiles),
    163       base::Bind(&ImporterList::SourceProfilesLoaded,
    164                  weak_ptr_factory_.GetWeakPtr(),
    165                  profiles_loaded_callback));
    166 }
    167 
    168 const importer::SourceProfile& ImporterList::GetSourceProfileAt(
    169     size_t index) const {
    170   DCHECK_LT(index, count());
    171   return *source_profiles_[index];
    172 }
    173 
    174 void ImporterList::SourceProfilesLoaded(
    175     const base::Closure& profiles_loaded_callback,
    176     const std::vector<importer::SourceProfile*>& profiles) {
    177   DCHECK_CURRENTLY_ON(BrowserThread::UI);
    178 
    179   source_profiles_.assign(profiles.begin(), profiles.end());
    180   profiles_loaded_callback.Run();
    181 }
    182