OLD | NEW |
1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "chrome/browser/importer/firefox3_importer.h" | 5 #include "chrome/browser/importer/firefox3_importer.h" |
6 | 6 |
7 #include <set> | 7 #include <set> |
8 | 8 |
9 #include "base/file_util.h" | 9 #include "base/file_util.h" |
10 #include "base/message_loop.h" | 10 #include "base/message_loop.h" |
11 #include "base/scoped_ptr.h" | 11 #include "base/scoped_ptr.h" |
12 #include "base/stl_util-inl.h" | 12 #include "base/stl_util-inl.h" |
13 #include "base/string_util.h" | 13 #include "base/string_util.h" |
14 #include "base/values.h" | 14 #include "base/values.h" |
| 15 #include "chrome/browser/browser_process.h" |
15 #include "chrome/browser/history/history_types.h" | 16 #include "chrome/browser/history/history_types.h" |
16 #include "chrome/browser/importer/firefox2_importer.h" | 17 #include "chrome/browser/importer/firefox2_importer.h" |
17 #include "chrome/browser/importer/firefox_importer_utils.h" | 18 #include "chrome/browser/importer/firefox_importer_utils.h" |
18 #include "chrome/browser/importer/importer_bridge.h" | 19 #include "chrome/browser/importer/importer_bridge.h" |
19 #include "chrome/browser/importer/importer_data_types.h" | 20 #include "chrome/browser/importer/importer_data_types.h" |
20 #include "chrome/browser/importer/nss_decryptor.h" | 21 #include "chrome/browser/importer/nss_decryptor.h" |
21 #include "chrome/browser/search_engines/template_url.h" | 22 #include "chrome/browser/search_engines/template_url.h" |
22 #include "chrome/common/time_format.h" | 23 #include "chrome/common/time_format.h" |
23 #include "chrome/common/sqlite_utils.h" | 24 #include "chrome/common/sqlite_utils.h" |
24 #include "grit/generated_resources.h" | 25 #include "grit/generated_resources.h" |
25 #include "webkit/glue/password_form.h" | 26 #include "webkit/glue/password_form.h" |
26 | 27 |
27 using base::Time; | 28 using base::Time; |
28 using importer::BOOKMARKS_HTML; | 29 using importer::BOOKMARKS_HTML; |
29 using importer::FAVORITES; | 30 using importer::FAVORITES; |
30 using importer::HISTORY; | 31 using importer::HISTORY; |
31 using importer::HOME_PAGE; | 32 using importer::HOME_PAGE; |
32 using importer::PASSWORDS; | 33 using importer::PASSWORDS; |
33 using importer::ProfileInfo; | 34 using importer::ProfileInfo; |
34 using importer::SEARCH_ENGINES; | 35 using importer::SEARCH_ENGINES; |
35 using webkit_glue::PasswordForm; | 36 using webkit_glue::PasswordForm; |
36 | 37 |
| 38 Firefox3Importer::Firefox3Importer() { |
| 39 DCHECK(ChromeThread::CurrentlyOn(ChromeThread::UI)); |
| 40 |
| 41 locale_ = g_browser_process->GetApplicationLocale(); |
| 42 } |
| 43 |
| 44 Firefox3Importer::~Firefox3Importer() { |
| 45 } |
| 46 |
37 void Firefox3Importer::StartImport(importer::ProfileInfo profile_info, | 47 void Firefox3Importer::StartImport(importer::ProfileInfo profile_info, |
38 uint16 items, | 48 uint16 items, |
39 ImporterBridge* bridge) { | 49 ImporterBridge* bridge) { |
| 50 DCHECK(ChromeThread::CurrentlyOn(ChromeThread::FILE)); |
40 bridge_ = bridge; | 51 bridge_ = bridge; |
41 source_path_ = profile_info.source_path; | 52 source_path_ = profile_info.source_path; |
42 app_path_ = profile_info.app_path; | 53 app_path_ = profile_info.app_path; |
43 | 54 |
44 | |
45 // The order here is important! | 55 // The order here is important! |
46 bridge_->NotifyStarted(); | 56 bridge_->NotifyStarted(); |
47 if ((items & importer::HOME_PAGE) && !cancelled()) | 57 if ((items & importer::HOME_PAGE) && !cancelled()) |
48 ImportHomepage(); // Doesn't have a UI item. | 58 ImportHomepage(); // Doesn't have a UI item. |
49 | 59 |
50 // Note history should be imported before bookmarks because bookmark import | 60 // Note history should be imported before bookmarks because bookmark import |
51 // will also import favicons and we store favicon for a URL only if the URL | 61 // will also import favicons and we store favicon for a URL only if the URL |
52 // exist in history or bookmarks. | 62 // exist in history or bookmarks. |
53 if ((items & importer::HISTORY) && !cancelled()) { | 63 if ((items & importer::HISTORY) && !cancelled()) { |
54 bridge_->NotifyItemStarted(importer::HISTORY); | 64 bridge_->NotifyItemStarted(importer::HISTORY); |
(...skipping 288 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
343 "(SELECT engineid FROM engine_data " | 353 "(SELECT engineid FROM engine_data " |
344 "WHERE name='hidden') " | 354 "WHERE name='hidden') " |
345 "ORDER BY value ASC"; | 355 "ORDER BY value ASC"; |
346 | 356 |
347 if (s.prepare(db.get(), stmt) != SQLITE_OK) | 357 if (s.prepare(db.get(), stmt) != SQLITE_OK) |
348 return; | 358 return; |
349 | 359 |
350 FilePath app_path = app_path_.AppendASCII("searchplugins"); | 360 FilePath app_path = app_path_.AppendASCII("searchplugins"); |
351 FilePath profile_path = source_path_.AppendASCII("searchplugins"); | 361 FilePath profile_path = source_path_.AppendASCII("searchplugins"); |
352 | 362 |
353 // Firefox doesn't store a search engine in its sqlite database unless | 363 // Firefox doesn't store a search engine in its sqlite database unless the |
354 // the user has changed the default definition of engine. So we get search | 364 // user has added a engine. So we get search engines from sqlite db as well |
355 // engines from sqlite db as well as from file system. | 365 // as from the file system. |
356 if (s.step() == SQLITE_ROW) { | 366 if (s.step() == SQLITE_ROW) { |
357 const std::wstring kAppPrefix = L"[app]/"; | 367 const std::wstring kAppPrefix = L"[app]/"; |
358 const std::wstring kProfilePrefix = L"[profile]/"; | 368 const std::wstring kProfilePrefix = L"[profile]/"; |
359 do { | 369 do { |
360 FilePath file; | 370 FilePath file; |
361 std::wstring engine = UTF8ToWide(s.column_string(0)); | 371 std::wstring engine = UTF8ToWide(s.column_string(0)); |
362 | 372 |
363 // The string contains [app]/<name>.xml or [profile]/<name>.xml where | 373 // The string contains [app]/<name>.xml or [profile]/<name>.xml where |
364 // the [app] and [profile] need to be replaced with the actual app or | 374 // the [app] and [profile] need to be replaced with the actual app or |
365 // profile path. | 375 // profile path. |
366 size_t index = engine.find(kAppPrefix); | 376 size_t index = engine.find(kAppPrefix); |
367 if (index != std::wstring::npos) { | 377 if (index != std::wstring::npos) { |
368 // Remove '[app]/'. | 378 // Remove '[app]/'. |
369 file = app_path.Append(FilePath::FromWStringHack( | 379 file = app_path.Append(FilePath::FromWStringHack( |
370 engine.substr(index + kAppPrefix.length()))); | 380 engine.substr(index + kAppPrefix.length()))); |
371 } else if ((index = engine.find(kProfilePrefix)) != std::wstring::npos) { | 381 } else if ((index = engine.find(kProfilePrefix)) != std::wstring::npos) { |
372 // Remove '[profile]/'. | 382 // Remove '[profile]/'. |
373 file = profile_path.Append( | 383 file = profile_path.Append( |
374 FilePath::FromWStringHack( | 384 FilePath::FromWStringHack( |
375 engine.substr(index + kProfilePrefix.length()))); | 385 engine.substr(index + kProfilePrefix.length()))); |
376 } else { | 386 } else { |
377 // Looks like absolute path to the file. | 387 // Looks like absolute path to the file. |
378 file = FilePath::FromWStringHack(engine); | 388 file = FilePath::FromWStringHack(engine); |
379 } | 389 } |
380 files->push_back(file); | 390 files->push_back(file); |
381 } while (s.step() == SQLITE_ROW && !cancelled()); | 391 } while (s.step() == SQLITE_ROW && !cancelled()); |
382 } | 392 } |
383 | 393 |
| 394 #if defined(OS_LINUX) |
| 395 // Ubuntu-flavored Firefox3 supports locale-specific search engines via |
| 396 // locale-named subdirectories. They fall back to en-US. |
| 397 // See http://crbug.com/53899 |
| 398 // TODO(jshin): we need to make sure our locale code matches that of |
| 399 // Firefox. |
| 400 FilePath locale_app_path = app_path.AppendASCII(locale_); |
| 401 FilePath default_locale_app_path = app_path.AppendASCII("en-US"); |
| 402 if (file_util::DirectoryExists(locale_app_path)) |
| 403 app_path = locale_app_path; |
| 404 else if (file_util::DirectoryExists(default_locale_app_path)) |
| 405 app_path = default_locale_app_path; |
| 406 #endif |
| 407 |
384 // Get search engine definition from file system. | 408 // Get search engine definition from file system. |
385 file_util::FileEnumerator engines(app_path, false, | 409 file_util::FileEnumerator engines(app_path, false, |
386 file_util::FileEnumerator::FILES); | 410 file_util::FileEnumerator::FILES); |
387 for (FilePath engine_path = engines.Next(); !engine_path.value().empty(); | 411 for (FilePath engine_path = engines.Next(); !engine_path.value().empty(); |
388 engine_path = engines.Next()) { | 412 engine_path = engines.Next()) { |
389 files->push_back(engine_path); | 413 files->push_back(engine_path); |
390 } | 414 } |
391 } | 415 } |
392 | 416 |
393 void Firefox3Importer::LoadRootNodeID(sqlite3* db, | 417 void Firefox3Importer::LoadRootNodeID(sqlite3* db, |
(...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
524 | 548 |
525 if (!ReencodeFavicon(&data[0], data.size(), &usage.png_data)) | 549 if (!ReencodeFavicon(&data[0], data.size(), &usage.png_data)) |
526 continue; // Unable to decode. | 550 continue; // Unable to decode. |
527 | 551 |
528 usage.urls = i->second; | 552 usage.urls = i->second; |
529 favicons->push_back(usage); | 553 favicons->push_back(usage); |
530 } | 554 } |
531 s.reset(); | 555 s.reset(); |
532 } | 556 } |
533 } | 557 } |
OLD | NEW |