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 "content/public/browser/browser_thread.h"
13 #include "grit/generated_resources.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 firefox
->locale
= locale
;
98 profiles
->push_back(firefox
);
101 std::vector
<importer::SourceProfile
*> DetectSourceProfilesWorker(
102 const std::string
& locale
,
103 bool include_interactive_profiles
) {
104 DCHECK_CURRENTLY_ON(BrowserThread::FILE);
106 std::vector
<importer::SourceProfile
*> profiles
;
108 // The first run import will automatically take settings from the first
109 // profile detected, which should be the user's current default.
111 if (ShellIntegration::IsFirefoxDefaultBrowser()) {
112 DetectFirefoxProfiles(locale
, &profiles
);
113 DetectIEProfiles(&profiles
);
115 DetectIEProfiles(&profiles
);
116 DetectFirefoxProfiles(locale
, &profiles
);
118 #elif defined(OS_MACOSX)
119 if (ShellIntegration::IsFirefoxDefaultBrowser()) {
120 DetectFirefoxProfiles(locale
, &profiles
);
121 DetectSafariProfiles(&profiles
);
123 DetectSafariProfiles(&profiles
);
124 DetectFirefoxProfiles(locale
, &profiles
);
127 DetectFirefoxProfiles(locale
, &profiles
);
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
);
143 ImporterList::ImporterList()
144 : weak_ptr_factory_(this) {
145 DCHECK_CURRENTLY_ON(BrowserThread::UI
);
148 ImporterList::~ImporterList() {
149 DCHECK_CURRENTLY_ON(BrowserThread::UI
);
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(
160 base::Bind(&DetectSourceProfilesWorker
,
162 include_interactive_profiles
),
163 base::Bind(&ImporterList::SourceProfilesLoaded
,
164 weak_ptr_factory_
.GetWeakPtr(),
165 profiles_loaded_callback
));
168 const importer::SourceProfile
& ImporterList::GetSourceProfileAt(
169 size_t index
) const {
170 DCHECK_LT(index
, count());
171 return *source_profiles_
[index
];
174 void ImporterList::SourceProfilesLoaded(
175 const base::Closure
& profiles_loaded_callback
,
176 const std::vector
<importer::SourceProfile
*>& profiles
) {
177 DCHECK_CURRENTLY_ON(BrowserThread::UI
);
179 source_profiles_
.assign(profiles
.begin(), profiles
.end());
180 profiles_loaded_callback
.Run();