firefox_importer_browsertest.cc revision eb525c5499e34cc9c4b825d6d9e75bb07cc06ace
1c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Copyright (c) 2013 The Chromium Authors. All rights reserved. 2c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 3c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// found in the LICENSE file. 4c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 5c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/file_util.h" 6c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/files/file_path.h" 7c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/files/scoped_temp_dir.h" 8c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/message_loop.h" 9c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/path_service.h" 10c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/stl_util.h" 11868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string16.h" 12868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string_util.h" 13868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h" 14c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/importer/external_process_importer_host.h" 15c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/importer/firefox_importer_unittest_utils.h" 16c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/importer/importer_progress_observer.h" 17c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/importer/importer_unittest_utils.h" 18c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/search_engines/template_url.h" 19c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/ui/browser.h" 20c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/common/chrome_paths.h" 21eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "chrome/common/importer/imported_bookmark_entry.h" 22eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "chrome/common/importer/imported_favicon_usage.h" 23eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "chrome/common/importer/importer_data_types.h" 24c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/test/base/in_process_browser_test.h" 25c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "content/public/common/password_form.h" 26c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 27c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 28c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// TODO(estade): some of these are disabled on mac. http://crbug.com/48007 29c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// TODO(jschuh): Disabled on Win64 build. http://crbug.com/179688 30c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#if defined(OS_MACOSX) || (defined(OS_WIN) && defined(ARCH_CPU_X86_64)) 31c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#define MAYBE_IMPORTER(x) DISABLED_##x 32c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#else 33c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#define MAYBE_IMPORTER(x) x 34c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif 35c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 36c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace { 37c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 38c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)struct PasswordInfo { 39c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const char* origin; 40c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const char* action; 41c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const char* realm; 42c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const wchar_t* username_element; 43c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const wchar_t* username; 44c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const wchar_t* password_element; 45c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const wchar_t* password; 46c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool blacklisted; 47c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}; 48c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 49c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)struct KeywordInfo { 50c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const wchar_t* keyword; 51c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const char* url; 52c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}; 53c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 54c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)const BookmarkInfo kFirefox3Bookmarks[] = { 55c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) {true, 1, {L"Bookmarks Toolbar"}, 56c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) L"Toolbar", 57c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "http://site/"}, 58c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) {false, 0, {}, 59c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) L"Title", 60c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "http://www.google.com/"}, 61c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}; 62c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 63c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)const PasswordInfo kFirefox3Passwords[] = { 64c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) {"http://localhost:8080/", "http://localhost:8080/", "http://localhost:8080/", 65c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) L"loginuser", L"abc", L"loginpass", L"123", false}, 66c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) {"http://localhost:8080/", "", "http://localhost:8080/localhost", 67c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) L"", L"http", L"", L"Http1+1abcdefg", false}, 68c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}; 69c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 70c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)const KeywordInfo kFirefox3Keywords[] = { 71c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) { L"amazon.com", 72c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "http://www.amazon.com/exec/obidos/external-search/?field-keywords=" 73c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "{searchTerms}&mode=blended" }, 74c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) { L"answers.com", 75c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "http://www.answers.com/main/ntquery?s={searchTerms}&gwp=13" }, 76c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) { L"search.creativecommons.org", 77c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "http://search.creativecommons.org/?q={searchTerms}" }, 78c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) { L"search.ebay.com", 79c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "http://search.ebay.com/search/search.dll?query={searchTerms}&" 80c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "MfcISAPICommand=GetResult&ht=1&ebaytag1=ebayreg&srchdesc=n&" 81c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "maxRecordsReturned=300&maxRecordsPerPage=50&SortProperty=MetaEndSort" }, 82c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) { L"google.com", 83c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "http://www.google.com/search?q={searchTerms}&ie=utf-8&oe=utf-8&aq=t" }, 84c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) { L"en.wikipedia.org", 85c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "http://en.wikipedia.org/wiki/Special:Search?search={searchTerms}" }, 86c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) { L"search.yahoo.com", 87c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "http://search.yahoo.com/search?p={searchTerms}&ei=UTF-8" }, 88c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) { L"flickr.com", 89c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "http://www.flickr.com/photos/tags/?q={searchTerms}" }, 90c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) { L"imdb.com", 91c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "http://www.imdb.com/find?q={searchTerms}" }, 92c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) { L"webster.com", 93c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "http://www.webster.com/cgi-bin/dictionary?va={searchTerms}" }, 94c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Search keywords. 95c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) { L"\x4E2D\x6587", "http://www.google.com/" }, 96c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}; 97c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 98c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)const int kDefaultFirefox3KeywordIndex = 8; 99c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 100c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class Firefox3Observer : public ProfileWriter, 101c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public importer::ImporterProgressObserver { 102c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 103c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) Firefox3Observer() 104c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : ProfileWriter(NULL), bookmark_count_(0), history_count_(0), 105c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) password_count_(0), keyword_count_(0), import_search_engines_(true) { 106c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 107c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 108c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) explicit Firefox3Observer(bool import_search_engines) 109c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : ProfileWriter(NULL), bookmark_count_(0), history_count_(0), 110c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) password_count_(0), keyword_count_(0), 111c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) import_search_engines_(import_search_engines) { 112c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 113c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 114c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // importer::ImporterProgressObserver: 115c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void ImportStarted() OVERRIDE {} 116c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void ImportItemStarted(importer::ImportItem item) OVERRIDE {} 117c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void ImportItemEnded(importer::ImportItem item) OVERRIDE {} 118c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void ImportEnded() OVERRIDE { 11990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Quit(); 120c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(arraysize(kFirefox3Bookmarks), bookmark_count_); 121c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(1U, history_count_); 122c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(arraysize(kFirefox3Passwords), password_count_); 123c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (import_search_engines_) 124c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(arraysize(kFirefox3Keywords), keyword_count_); 125c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 126c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 127c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual bool BookmarkModelIsLoaded() const OVERRIDE { 128c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Profile is ready for writing. 129c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return true; 130c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 131c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 132c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual bool TemplateURLServiceIsLoaded() const OVERRIDE { 133c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return true; 134c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 135c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 136c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void AddPasswordForm(const content::PasswordForm& form) OVERRIDE { 137c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) PasswordInfo p = kFirefox3Passwords[password_count_]; 138c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(p.origin, form.origin.spec()); 139c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(p.realm, form.signon_realm); 140c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(p.action, form.action.spec()); 141c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(WideToUTF16(p.username_element), form.username_element); 142c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(WideToUTF16(p.username), form.username_value); 143c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(WideToUTF16(p.password_element), form.password_element); 144c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(WideToUTF16(p.password), form.password_value); 145c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(p.blacklisted, form.blacklisted_by_user); 146c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ++password_count_; 147c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 148c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 149c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void AddHistoryPage(const history::URLRows& page, 150c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) history::VisitSource visit_source) OVERRIDE { 151c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_EQ(3U, page.size()); 152c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ("http://www.google.com/", page[0].url().spec()); 153c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(ASCIIToUTF16("Google"), page[0].title()); 154c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ("http://www.google.com/", page[1].url().spec()); 155c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(ASCIIToUTF16("Google"), page[1].title()); 156c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ("http://www.cs.unc.edu/~jbs/resources/perl/perl-cgi/programs/" 157c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "form1-POST.html", page[2].url().spec()); 158c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(ASCIIToUTF16("example form (POST)"), page[2].title()); 159c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(history::SOURCE_FIREFOX_IMPORTED, visit_source); 160c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ++history_count_; 161c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 162c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 163a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) virtual void AddBookmarks(const std::vector<ImportedBookmarkEntry>& bookmarks, 164c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const string16& top_level_folder_name) OVERRIDE { 165c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_LE(bookmark_count_ + bookmarks.size(), 166c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) arraysize(kFirefox3Bookmarks)); 167c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Importer should import the FF favorites the same as the list, in the same 168c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // order. 169c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) for (size_t i = 0; i < bookmarks.size(); ++i) { 170c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_NO_FATAL_FAILURE( 171c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) TestEqualBookmarkEntry(bookmarks[i], 172c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) kFirefox3Bookmarks[bookmark_count_])) << i; 173c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ++bookmark_count_; 174c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 175c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 176c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 177c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void AddKeywords(ScopedVector<TemplateURL> template_urls, 178c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool unique_on_host_and_path) OVERRIDE { 179c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) for (size_t i = 0; i < template_urls.size(); ++i) { 180c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // The order might not be deterministic, look in the expected list for 181c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // that template URL. 182c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool found = false; 183c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) string16 keyword = template_urls[i]->keyword(); 184c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) for (size_t j = 0; j < arraysize(kFirefox3Keywords); ++j) { 185c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (template_urls[i]->keyword() == 186c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) WideToUTF16Hack(kFirefox3Keywords[j].keyword)) { 187c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(kFirefox3Keywords[j].url, template_urls[i]->url()); 188c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) found = true; 189c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 190c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 191c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 192c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(found); 193c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ++keyword_count_; 194c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 195c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 196c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 197c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void AddFavicons( 198a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) const std::vector<ImportedFaviconUsage>& favicons) OVERRIDE { 199c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 200c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 201c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private: 202c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual ~Firefox3Observer() {} 203c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 204c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) size_t bookmark_count_; 205c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) size_t history_count_; 206c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) size_t password_count_; 207c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) size_t keyword_count_; 208c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool import_search_engines_; 209c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}; 210c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 211c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} // namespace 212c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 213c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// These tests need to be browser tests in order to be able to run the OOP 214c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// import (via ExternalProcessImporterHost) which launches a utility process on 215c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// supported platforms. 216c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class FirefoxProfileImporterBrowserTest : public InProcessBrowserTest { 217c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) protected: 218c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void SetUp() OVERRIDE { 219c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Creates a new profile in a new subdirectory in the temp directory. 220c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(temp_dir_.CreateUniqueTempDir()); 221c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::FilePath test_path = temp_dir_.path().AppendASCII("ImporterTest"); 222eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch base::Delete(test_path, true); 223c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) file_util::CreateDirectory(test_path); 224c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) profile_path_ = test_path.AppendASCII("profile"); 225c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) app_path_ = test_path.AppendASCII("app"); 226c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) file_util::CreateDirectory(app_path_); 227c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 228c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // This will launch the browser test and thus needs to happen last. 229c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) InProcessBrowserTest::SetUp(); 230c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 231c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 232c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void Firefox3xImporterBrowserTest( 233c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::string profile_dir, 234c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) importer::ImporterProgressObserver* observer, 235c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ProfileWriter* writer, 236c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool import_search_plugins) { 237c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::FilePath data_path; 238c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(PathService::Get(chrome::DIR_TEST_DATA, &data_path)); 239c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) data_path = data_path.AppendASCII(profile_dir); 240c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(file_util::CopyDirectory(data_path, profile_path_, true)); 241c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(PathService::Get(chrome::DIR_TEST_DATA, &data_path)); 242c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) data_path = data_path.AppendASCII("firefox3_nss"); 243c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(file_util::CopyDirectory(data_path, profile_path_, false)); 244c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 245c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::FilePath search_engine_path = app_path_; 246c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) search_engine_path = search_engine_path.AppendASCII("searchplugins"); 247c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) file_util::CreateDirectory(search_engine_path); 248c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (import_search_plugins) { 249c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(PathService::Get(chrome::DIR_TEST_DATA, &data_path)); 250c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) data_path = data_path.AppendASCII("firefox3_searchplugins"); 251c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!file_util::PathExists(data_path)) { 252c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // TODO(maruel): Create search test data that we can open source! 253c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LOG(ERROR) << L"Missing internal test data"; 254c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return; 255c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 256c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(file_util::CopyDirectory(data_path, 257c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) search_engine_path, false)); 258c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 259c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 260c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) importer::SourceProfile source_profile; 261c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) source_profile.importer_type = importer::TYPE_FIREFOX3; 262c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) source_profile.app_path = app_path_; 263c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) source_profile.source_path = profile_path_; 264eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch source_profile.locale = "en-US"; 265c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 266c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int items = importer::HISTORY | importer::PASSWORDS | importer::FAVORITES; 267c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (import_search_plugins) 268c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) items = items | importer::SEARCH_ENGINES; 269c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 270c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Deletes itself. 271eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ExternalProcessImporterHost* host = new ExternalProcessImporterHost; 272eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch host->set_observer(observer); 2737d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) host->StartImportSettings(source_profile, 2747d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) browser()->profile(), 2757d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) items, 2767d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) make_scoped_refptr(writer).get()); 27790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 278c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 279c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 280c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::ScopedTempDir temp_dir_; 281c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::FilePath profile_path_; 282c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::FilePath app_path_; 283c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}; 284c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 285c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(FirefoxProfileImporterBrowserTest, 286c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) MAYBE_IMPORTER(Firefox30Importer)) { 287c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_refptr<Firefox3Observer> observer(new Firefox3Observer()); 288c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) Firefox3xImporterBrowserTest("firefox3_profile", observer.get(), 289c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) observer.get(), true); 290c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 291c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 292c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(FirefoxProfileImporterBrowserTest, 293c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) MAYBE_IMPORTER(Firefox35Importer)) { 294c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool import_search_engines = false; 295c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_refptr<Firefox3Observer> observer( 296c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) new Firefox3Observer(import_search_engines)); 297c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) Firefox3xImporterBrowserTest("firefox35_profile", observer.get(), 298c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) observer.get(), import_search_engines); 299c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 300