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.
5 #include "chrome/browser/importer/importer_list.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 "chrome/grit/generated_resources.h"
13 #include "content/public/browser/browser_thread.h"
14 #include "ui/base/l10n/l10n_util.h"
16 #if defined(OS_MACOSX)
17 #include <CoreFoundation/CoreFoundation.h>
19 #include "base/mac/foundation_util.h"
20 #include "chrome/common/importer/safari_importer_utils.h"
23 using content::BrowserThread
;
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();
36 ie
->services_supported
= importer::HISTORY
| importer::FAVORITES
|
37 importer::COOKIES
| importer::PASSWORDS
| importer::SEARCH_ENGINES
;
38 profiles
->push_back(ie
);
40 #endif // defined(OS_WIN)
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
))
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
);
57 #endif // defined(OS_MACOSX)
59 // |locale|: The application locale used for lookups in Firefox's
60 // locale-specific search engines feature (see firefox_importer.cc for
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())
69 // Detects which version of Firefox is installed.
70 importer::ImporterType firefox_type
;
71 base::FilePath app_path
;
74 version
= GetCurrentFirefoxMajorVersionFromRegistry();
77 GetFirefoxVersionAndPathFromProfile(profile_path
, &version
, &app_path
);
80 firefox_type
= importer::TYPE_FIREFOX
;
82 // Ignores old versions of firefox.
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
;
91 firefox
->app_path
= GetFirefoxInstallPathFromRegistry();
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 importer::AUTOFILL_FORM_DATA
;
98 firefox
->locale
= locale
;
99 profiles
->push_back(firefox
);
102 std::vector
<importer::SourceProfile
*> DetectSourceProfilesWorker(
103 const std::string
& locale
,
104 bool include_interactive_profiles
) {
105 DCHECK_CURRENTLY_ON(BrowserThread::FILE);
107 std::vector
<importer::SourceProfile
*> profiles
;
109 // The first run import will automatically take settings from the first
110 // profile detected, which should be the user's current default.
112 if (ShellIntegration::IsFirefoxDefaultBrowser()) {
113 DetectFirefoxProfiles(locale
, &profiles
);
114 DetectIEProfiles(&profiles
);
116 DetectIEProfiles(&profiles
);
117 DetectFirefoxProfiles(locale
, &profiles
);
119 #elif defined(OS_MACOSX)
120 if (ShellIntegration::IsFirefoxDefaultBrowser()) {
121 DetectFirefoxProfiles(locale
, &profiles
);
122 DetectSafariProfiles(&profiles
);
124 DetectSafariProfiles(&profiles
);
125 DetectFirefoxProfiles(locale
, &profiles
);
128 DetectFirefoxProfiles(locale
, &profiles
);
130 if (include_interactive_profiles
) {
131 importer::SourceProfile
* bookmarks_profile
= new importer::SourceProfile
;
132 bookmarks_profile
->importer_name
=
133 l10n_util::GetStringUTF16(IDS_IMPORT_FROM_BOOKMARKS_HTML_FILE
);
134 bookmarks_profile
->importer_type
= importer::TYPE_BOOKMARKS_FILE
;
135 bookmarks_profile
->services_supported
= importer::FAVORITES
;
136 profiles
.push_back(bookmarks_profile
);
144 ImporterList::ImporterList()
145 : weak_ptr_factory_(this) {
146 DCHECK_CURRENTLY_ON(BrowserThread::UI
);
149 ImporterList::~ImporterList() {
150 DCHECK_CURRENTLY_ON(BrowserThread::UI
);
153 void ImporterList::DetectSourceProfiles(
154 const std::string
& locale
,
155 bool include_interactive_profiles
,
156 const base::Closure
& profiles_loaded_callback
) {
157 DCHECK_CURRENTLY_ON(BrowserThread::UI
);
158 BrowserThread::PostTaskAndReplyWithResult(
161 base::Bind(&DetectSourceProfilesWorker
,
163 include_interactive_profiles
),
164 base::Bind(&ImporterList::SourceProfilesLoaded
,
165 weak_ptr_factory_
.GetWeakPtr(),
166 profiles_loaded_callback
));
169 const importer::SourceProfile
& ImporterList::GetSourceProfileAt(
170 size_t index
) const {
171 DCHECK_LT(index
, count());
172 return *source_profiles_
[index
];
175 void ImporterList::SourceProfilesLoaded(
176 const base::Closure
& profiles_loaded_callback
,
177 const std::vector
<importer::SourceProfile
*>& profiles
) {
178 DCHECK_CURRENTLY_ON(BrowserThread::UI
);
180 source_profiles_
.assign(profiles
.begin(), profiles
.end());
181 profiles_loaded_callback
.Run();