firefox_importer_browsertest.cc revision c2e0dbddbe15c98d52c4786dac06cb8952a8ae6d
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" 11c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/string16.h" 12c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/string_util.h" 13c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/utf_string_conversions.h" 14c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/history/history_types.h" 15c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/importer/external_process_importer_host.h" 16c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/importer/firefox_importer_unittest_utils.h" 17c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/importer/importer_data_types.h" 18c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/importer/importer_host.h" 19c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/importer/importer_progress_observer.h" 20c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/importer/importer_unittest_utils.h" 21c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/search_engines/template_url.h" 22c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/ui/browser.h" 23c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/common/chrome_paths.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)const BookmarkInfo kFirefox2Bookmarks[] = { 39c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) {true, 2, {L"Bookmarks Toolbar Folder", L"Folder"}, 40c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) L"On Toolbar's Subfolder", 41c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "http://on.toolbar/bookmark/folder"}, 42c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) {true, 1, {L"Bookmarks Toolbar Folder"}, 43c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) L"On Bookmark Toolbar", 44c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "http://on.toolbar/bookmark"}, 45c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) {false, 1, {L"Folder"}, 46c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) L"New Bookmark", 47c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "http://domain/"}, 48c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) {false, 0, {}, 49c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) L"<Name>", 50c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "http://domain.com/q?a=%22er%22&b=%3C%20%20%3E"}, 51c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) {false, 0, {}, 52c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) L"Google Home Page", 53c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "http://www.google.com/"}, 54c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) {false, 0, {}, 55c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) L"\x4E2D\x6587", 56c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "http://chinese.site.cn/path?query=1#ref"}, 57c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) {false, 1, {L"< > & \" ' \\ /"}, 58c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) L"< > & \" ' \\ /", 59c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "http://g.cn/"}, 60c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) {false, 0, {}, 61c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) L"mail", 62c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "mailto:username@host"}, 63c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}; 64c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 65c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)struct PasswordInfo { 66c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const char* origin; 67c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const char* action; 68c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const char* realm; 69c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const wchar_t* username_element; 70c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const wchar_t* username; 71c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const wchar_t* password_element; 72c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const wchar_t* password; 73c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool blacklisted; 74c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}; 75c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 76c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)const PasswordInfo kFirefox2Passwords[] = { 77c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) {"https://www.google.com/", "", "https://www.google.com/", 78c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) L"", L"", L"", L"", true}, 79c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) {"http://localhost:8080/", "", "http://localhost:8080/corp.google.com", 80c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) L"", L"http", L"", L"Http1+1abcdefg", false}, 81c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) {"http://localhost:8080/", "http://localhost:8080/", "http://localhost:8080/", 82c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) L"loginuser", L"usr", L"loginpass", L"pwd", false}, 83c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) {"http://localhost:8080/", "http://localhost:8080/", "http://localhost:8080/", 84c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) L"loginuser", L"firefox", L"loginpass", L"firefox", false}, 85c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) {"http://localhost/", "", "http://localhost/", 86c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) L"loginuser", L"hello", L"", L"world", false}, 87c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}; 88c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 89c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)struct KeywordInfo { 90c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const wchar_t* keyword; 91c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const char* url; 92c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}; 93c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 94c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)const KeywordInfo kFirefox2Keywords[] = { 95c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Searh plugins 96c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) { L"amazon.com", 97c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "http://www.amazon.com/exec/obidos/external-search/?field-keywords=" 98c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "{searchTerms}&mode=blended" }, 99c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) { L"answers.com", 100c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "http://www.answers.com/main/ntquery?s={searchTerms}&gwp=13" }, 101c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) { L"search.creativecommons.org", 102c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "http://search.creativecommons.org/?q={searchTerms}" }, 103c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) { L"search.ebay.com", 104c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "http://search.ebay.com/search/search.dll?query={searchTerms}&" 105c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "MfcISAPICommand=GetResult&ht=1&ebaytag1=ebayreg&srchdesc=n&" 106c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "maxRecordsReturned=300&maxRecordsPerPage=50&SortProperty=MetaEndSort" }, 107c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) { L"google.com", 108c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "http://www.google.com/search?q={searchTerms}&ie=utf-8&oe=utf-8&aq=t" }, 109c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) { L"search.yahoo.com", 110c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "http://search.yahoo.com/search?p={searchTerms}&ei=UTF-8" }, 111c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) { L"flickr.com", 112c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "http://www.flickr.com/photos/tags/?q={searchTerms}" }, 113c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) { L"imdb.com", 114c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "http://www.imdb.com/find?q={searchTerms}" }, 115c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) { L"webster.com", 116c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "http://www.webster.com/cgi-bin/dictionary?va={searchTerms}" }, 117c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Search keywords. 118c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) { L"google", "http://www.google.com/" }, 119c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) { L"< > & \" ' \\ /", "http://g.cn/"}, 120c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}; 121c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 122c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)const int kDefaultFirefox2KeywordIndex = 8; 123c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 124c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class FirefoxObserver : public ProfileWriter, 125c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public importer::ImporterProgressObserver { 126c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 127c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) FirefoxObserver() : ProfileWriter(NULL) { 128c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bookmark_count_ = 0; 129c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) history_count_ = 0; 130c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) password_count_ = 0; 131c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) keyword_count_ = 0; 132c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 133c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 134c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // importer::ImporterProgressObserver: 135c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void ImportStarted() OVERRIDE {} 136c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void ImportItemStarted(importer::ImportItem item) OVERRIDE {} 137c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void ImportItemEnded(importer::ImportItem item) OVERRIDE {} 138c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void ImportEnded() OVERRIDE { 139c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) MessageLoop::current()->Quit(); 140c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(arraysize(kFirefox2Bookmarks), bookmark_count_); 141c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(1U, history_count_); 142c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(arraysize(kFirefox2Passwords), password_count_); 143c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(arraysize(kFirefox2Keywords), keyword_count_); 144c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 145c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 146c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual bool BookmarkModelIsLoaded() const OVERRIDE { 147c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Profile is ready for writing. 148c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return true; 149c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 150c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 151c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual bool TemplateURLServiceIsLoaded() const OVERRIDE { 152c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return true; 153c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 154c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 155c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void AddPasswordForm(const content::PasswordForm& form) OVERRIDE { 156c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) PasswordInfo p = kFirefox2Passwords[password_count_]; 157c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(p.origin, form.origin.spec()); 158c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(p.realm, form.signon_realm); 159c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(p.action, form.action.spec()); 160c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(WideToUTF16(p.username_element), form.username_element); 161c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(WideToUTF16(p.username), form.username_value); 162c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(WideToUTF16(p.password_element), form.password_element); 163c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(WideToUTF16(p.password), form.password_value); 164c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(p.blacklisted, form.blacklisted_by_user); 165c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ++password_count_; 166c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 167c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 168c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void AddHistoryPage(const history::URLRows& page, 169c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) history::VisitSource visit_source) OVERRIDE { 170c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_EQ(1U, page.size()); 171c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ("http://en-us.www.mozilla.com/", page[0].url().spec()); 172c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(ASCIIToUTF16("Firefox Updated"), page[0].title()); 173c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(history::SOURCE_FIREFOX_IMPORTED, visit_source); 174c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ++history_count_; 175c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 176c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 177c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void AddBookmarks(const std::vector<BookmarkEntry>& bookmarks, 178c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const string16& top_level_folder_name) OVERRIDE { 179c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_LE(bookmark_count_ + bookmarks.size(), 180c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) arraysize(kFirefox2Bookmarks)); 181c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Importer should import the FF favorites the same as the list, in the same 182c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // order. 183c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) for (size_t i = 0; i < bookmarks.size(); ++i) { 184c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_NO_FATAL_FAILURE( 185c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) TestEqualBookmarkEntry(bookmarks[i], 186c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) kFirefox2Bookmarks[bookmark_count_])) << i; 187c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ++bookmark_count_; 188c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 189c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 190c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 191c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void AddKeywords(ScopedVector<TemplateURL> template_urls, 192c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool unique_on_host_and_path) OVERRIDE { 193c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) for (size_t i = 0; i < template_urls.size(); ++i) { 194c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // The order might not be deterministic, look in the expected list for 195c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // that template URL. 196c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool found = false; 197c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) string16 keyword = template_urls[i]->keyword(); 198c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) for (size_t j = 0; j < arraysize(kFirefox2Keywords); ++j) { 199c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (template_urls[i]->keyword() == 200c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) WideToUTF16Hack(kFirefox2Keywords[j].keyword)) { 201c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(kFirefox2Keywords[j].url, template_urls[i]->url()); 202c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) found = true; 203c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 204c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 205c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 206c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(found); 207c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ++keyword_count_; 208c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 209c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 210c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 211c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void AddFavicons( 212c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const std::vector<history::ImportedFaviconUsage>& favicons) OVERRIDE { 213c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 214c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 215c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private: 216c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual ~FirefoxObserver() {} 217c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 218c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) size_t bookmark_count_; 219c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) size_t history_count_; 220c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) size_t password_count_; 221c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) size_t keyword_count_; 222c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}; 223c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 224c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)const BookmarkInfo kFirefox3Bookmarks[] = { 225c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) {true, 1, {L"Bookmarks Toolbar"}, 226c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) L"Toolbar", 227c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "http://site/"}, 228c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) {false, 0, {}, 229c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) L"Title", 230c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "http://www.google.com/"}, 231c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}; 232c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 233c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)const PasswordInfo kFirefox3Passwords[] = { 234c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) {"http://localhost:8080/", "http://localhost:8080/", "http://localhost:8080/", 235c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) L"loginuser", L"abc", L"loginpass", L"123", false}, 236c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) {"http://localhost:8080/", "", "http://localhost:8080/localhost", 237c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) L"", L"http", L"", L"Http1+1abcdefg", false}, 238c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}; 239c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 240c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)const KeywordInfo kFirefox3Keywords[] = { 241c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) { L"amazon.com", 242c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "http://www.amazon.com/exec/obidos/external-search/?field-keywords=" 243c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "{searchTerms}&mode=blended" }, 244c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) { L"answers.com", 245c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "http://www.answers.com/main/ntquery?s={searchTerms}&gwp=13" }, 246c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) { L"search.creativecommons.org", 247c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "http://search.creativecommons.org/?q={searchTerms}" }, 248c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) { L"search.ebay.com", 249c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "http://search.ebay.com/search/search.dll?query={searchTerms}&" 250c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "MfcISAPICommand=GetResult&ht=1&ebaytag1=ebayreg&srchdesc=n&" 251c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "maxRecordsReturned=300&maxRecordsPerPage=50&SortProperty=MetaEndSort" }, 252c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) { L"google.com", 253c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "http://www.google.com/search?q={searchTerms}&ie=utf-8&oe=utf-8&aq=t" }, 254c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) { L"en.wikipedia.org", 255c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "http://en.wikipedia.org/wiki/Special:Search?search={searchTerms}" }, 256c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) { L"search.yahoo.com", 257c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "http://search.yahoo.com/search?p={searchTerms}&ei=UTF-8" }, 258c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) { L"flickr.com", 259c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "http://www.flickr.com/photos/tags/?q={searchTerms}" }, 260c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) { L"imdb.com", 261c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "http://www.imdb.com/find?q={searchTerms}" }, 262c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) { L"webster.com", 263c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "http://www.webster.com/cgi-bin/dictionary?va={searchTerms}" }, 264c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Search keywords. 265c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) { L"\x4E2D\x6587", "http://www.google.com/" }, 266c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}; 267c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 268c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)const int kDefaultFirefox3KeywordIndex = 8; 269c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 270c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class Firefox3Observer : public ProfileWriter, 271c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public importer::ImporterProgressObserver { 272c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 273c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) Firefox3Observer() 274c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : ProfileWriter(NULL), bookmark_count_(0), history_count_(0), 275c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) password_count_(0), keyword_count_(0), import_search_engines_(true) { 276c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 277c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 278c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) explicit Firefox3Observer(bool import_search_engines) 279c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : ProfileWriter(NULL), bookmark_count_(0), history_count_(0), 280c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) password_count_(0), keyword_count_(0), 281c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) import_search_engines_(import_search_engines) { 282c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 283c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 284c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // importer::ImporterProgressObserver: 285c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void ImportStarted() OVERRIDE {} 286c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void ImportItemStarted(importer::ImportItem item) OVERRIDE {} 287c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void ImportItemEnded(importer::ImportItem item) OVERRIDE {} 288c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void ImportEnded() OVERRIDE { 289c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) MessageLoop::current()->Quit(); 290c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(arraysize(kFirefox3Bookmarks), bookmark_count_); 291c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(1U, history_count_); 292c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(arraysize(kFirefox3Passwords), password_count_); 293c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (import_search_engines_) 294c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(arraysize(kFirefox3Keywords), keyword_count_); 295c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 296c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 297c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual bool BookmarkModelIsLoaded() const OVERRIDE { 298c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Profile is ready for writing. 299c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return true; 300c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 301c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 302c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual bool TemplateURLServiceIsLoaded() const OVERRIDE { 303c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return true; 304c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 305c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 306c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void AddPasswordForm(const content::PasswordForm& form) OVERRIDE { 307c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) PasswordInfo p = kFirefox3Passwords[password_count_]; 308c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(p.origin, form.origin.spec()); 309c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(p.realm, form.signon_realm); 310c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(p.action, form.action.spec()); 311c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(WideToUTF16(p.username_element), form.username_element); 312c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(WideToUTF16(p.username), form.username_value); 313c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(WideToUTF16(p.password_element), form.password_element); 314c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(WideToUTF16(p.password), form.password_value); 315c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(p.blacklisted, form.blacklisted_by_user); 316c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ++password_count_; 317c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 318c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 319c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void AddHistoryPage(const history::URLRows& page, 320c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) history::VisitSource visit_source) OVERRIDE { 321c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_EQ(3U, page.size()); 322c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ("http://www.google.com/", page[0].url().spec()); 323c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(ASCIIToUTF16("Google"), page[0].title()); 324c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ("http://www.google.com/", page[1].url().spec()); 325c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(ASCIIToUTF16("Google"), page[1].title()); 326c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ("http://www.cs.unc.edu/~jbs/resources/perl/perl-cgi/programs/" 327c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "form1-POST.html", page[2].url().spec()); 328c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(ASCIIToUTF16("example form (POST)"), page[2].title()); 329c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(history::SOURCE_FIREFOX_IMPORTED, visit_source); 330c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ++history_count_; 331c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 332c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 333c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void AddBookmarks(const std::vector<BookmarkEntry>& bookmarks, 334c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const string16& top_level_folder_name) OVERRIDE { 335c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 336c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_LE(bookmark_count_ + bookmarks.size(), 337c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) arraysize(kFirefox3Bookmarks)); 338c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Importer should import the FF favorites the same as the list, in the same 339c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // order. 340c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) for (size_t i = 0; i < bookmarks.size(); ++i) { 341c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_NO_FATAL_FAILURE( 342c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) TestEqualBookmarkEntry(bookmarks[i], 343c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) kFirefox3Bookmarks[bookmark_count_])) << i; 344c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ++bookmark_count_; 345c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 346c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 347c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 348c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void AddKeywords(ScopedVector<TemplateURL> template_urls, 349c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool unique_on_host_and_path) OVERRIDE { 350c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) for (size_t i = 0; i < template_urls.size(); ++i) { 351c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // The order might not be deterministic, look in the expected list for 352c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // that template URL. 353c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool found = false; 354c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) string16 keyword = template_urls[i]->keyword(); 355c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) for (size_t j = 0; j < arraysize(kFirefox3Keywords); ++j) { 356c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (template_urls[i]->keyword() == 357c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) WideToUTF16Hack(kFirefox3Keywords[j].keyword)) { 358c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(kFirefox3Keywords[j].url, template_urls[i]->url()); 359c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) found = true; 360c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 361c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 362c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 363c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(found); 364c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ++keyword_count_; 365c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 366c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 367c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 368c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void AddFavicons( 369c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const std::vector<history::ImportedFaviconUsage>& favicons) OVERRIDE { 370c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 371c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 372c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private: 373c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual ~Firefox3Observer() {} 374c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 375c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) size_t bookmark_count_; 376c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) size_t history_count_; 377c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) size_t password_count_; 378c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) size_t keyword_count_; 379c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool import_search_engines_; 380c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}; 381c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 382c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} // namespace 383c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 384c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// These tests need to be browser tests in order to be able to run the OOP 385c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// import (via ExternalProcessImporterHost) which launches a utility process on 386c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// supported platforms. 387c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class FirefoxProfileImporterBrowserTest : public InProcessBrowserTest { 388c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) protected: 389c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void SetUp() OVERRIDE { 390c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Creates a new profile in a new subdirectory in the temp directory. 391c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(temp_dir_.CreateUniqueTempDir()); 392c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::FilePath test_path = temp_dir_.path().AppendASCII("ImporterTest"); 393c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) file_util::Delete(test_path, true); 394c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) file_util::CreateDirectory(test_path); 395c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) profile_path_ = test_path.AppendASCII("profile"); 396c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) app_path_ = test_path.AppendASCII("app"); 397c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) file_util::CreateDirectory(app_path_); 398c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 399c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // This will launch the browser test and thus needs to happen last. 400c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) InProcessBrowserTest::SetUp(); 401c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 402c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 403c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void Firefox3xImporterBrowserTest( 404c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::string profile_dir, 405c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) importer::ImporterProgressObserver* observer, 406c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ProfileWriter* writer, 407c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool import_search_plugins) { 408c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::FilePath data_path; 409c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(PathService::Get(chrome::DIR_TEST_DATA, &data_path)); 410c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) data_path = data_path.AppendASCII(profile_dir); 411c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(file_util::CopyDirectory(data_path, profile_path_, true)); 412c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(PathService::Get(chrome::DIR_TEST_DATA, &data_path)); 413c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) data_path = data_path.AppendASCII("firefox3_nss"); 414c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(file_util::CopyDirectory(data_path, profile_path_, false)); 415c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 416c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::FilePath search_engine_path = app_path_; 417c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) search_engine_path = search_engine_path.AppendASCII("searchplugins"); 418c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) file_util::CreateDirectory(search_engine_path); 419c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (import_search_plugins) { 420c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(PathService::Get(chrome::DIR_TEST_DATA, &data_path)); 421c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) data_path = data_path.AppendASCII("firefox3_searchplugins"); 422c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!file_util::PathExists(data_path)) { 423c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // TODO(maruel): Create search test data that we can open source! 424c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LOG(ERROR) << L"Missing internal test data"; 425c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return; 426c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 427c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(file_util::CopyDirectory(data_path, 428c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) search_engine_path, false)); 429c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 430c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 431c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) importer::SourceProfile source_profile; 432c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) source_profile.importer_type = importer::TYPE_FIREFOX3; 433c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) source_profile.app_path = app_path_; 434c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) source_profile.source_path = profile_path_; 435c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 436c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int items = importer::HISTORY | importer::PASSWORDS | importer::FAVORITES; 437c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (import_search_plugins) 438c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) items = items | importer::SEARCH_ENGINES; 439c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 440c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Deletes itself. 441c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // TODO(gab): Use ExternalProcessImporterHost on both Windows and Linux. 442c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ImporterHost* host; 443c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#if defined(OS_MACOSX) 444c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) host = new ExternalProcessImporterHost; 445c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#else 446c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) host = new ImporterHost; 447c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif 448c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) host->SetObserver(observer); 449c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) host->StartImportSettings(source_profile, browser()->profile(), 450c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) items, make_scoped_refptr(writer)); 451c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) MessageLoop::current()->Run(); 452c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 453c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 454c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::ScopedTempDir temp_dir_; 455c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::FilePath profile_path_; 456c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::FilePath app_path_; 457c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}; 458c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 459c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(FirefoxProfileImporterBrowserTest, 460c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) MAYBE_IMPORTER(Firefox2Importer)) { 461c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::FilePath data_path; 462c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(PathService::Get(chrome::DIR_TEST_DATA, &data_path)); 463c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) data_path = data_path.AppendASCII("firefox2_profile"); 464c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(file_util::CopyDirectory(data_path, profile_path_, true)); 465c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(PathService::Get(chrome::DIR_TEST_DATA, &data_path)); 466c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) data_path = data_path.AppendASCII("firefox2_nss"); 467c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(file_util::CopyDirectory(data_path, profile_path_, false)); 468c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 469c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::FilePath search_engine_path = app_path_; 470c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) search_engine_path = search_engine_path.AppendASCII("searchplugins"); 471c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) file_util::CreateDirectory(search_engine_path); 472c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(PathService::Get(chrome::DIR_TEST_DATA, &data_path)); 473c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) data_path = data_path.AppendASCII("firefox2_searchplugins"); 474c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!file_util::PathExists(data_path)) { 475c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // TODO(maruel): Create test data that we can open source! 476c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LOG(ERROR) << L"Missing internal test data"; 477c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return; 478c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 479c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(file_util::CopyDirectory(data_path, search_engine_path, false)); 480c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 481c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) importer::SourceProfile source_profile; 482c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) source_profile.importer_type = importer::TYPE_FIREFOX2; 483c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) source_profile.app_path = app_path_; 484c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) source_profile.source_path = profile_path_; 485c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 486c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Deletes itself. 487c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // TODO(gab): Use ExternalProcessImporterHost on both Windows and Linux. 488c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ImporterHost* host; 489c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#if defined(OS_MACOSX) 490c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) host = new ExternalProcessImporterHost; 491c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#else 492c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) host = new ImporterHost; 493c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif 494c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 495c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) FirefoxObserver* observer = new FirefoxObserver(); 496c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) host->SetObserver(observer); 497c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) host->StartImportSettings( 498c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) source_profile, 499c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) browser()->profile(), 500c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) importer::HISTORY | importer::PASSWORDS | 501c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) importer::FAVORITES | importer::SEARCH_ENGINES, 502c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) make_scoped_refptr(observer)); 503c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) MessageLoop::current()->Run(); 504c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 505c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 506c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(FirefoxProfileImporterBrowserTest, 507c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) MAYBE_IMPORTER(Firefox30Importer)) { 508c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_refptr<Firefox3Observer> observer(new Firefox3Observer()); 509c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) Firefox3xImporterBrowserTest("firefox3_profile", observer.get(), 510c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) observer.get(), true); 511c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 512c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 513c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(FirefoxProfileImporterBrowserTest, 514c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) MAYBE_IMPORTER(Firefox35Importer)) { 515c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool import_search_engines = false; 516c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_refptr<Firefox3Observer> observer( 517c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) new Firefox3Observer(import_search_engines)); 518c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) Firefox3xImporterBrowserTest("firefox35_profile", observer.get(), 519c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) observer.get(), import_search_engines); 520c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 521