1 // Copyright (c) 2013 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 // The order of these includes is important.
9 #include <propvarutil.h>
17 #include "base/bind.h"
18 #include "base/compiler_specific.h"
19 #include "base/files/file_util.h"
20 #include "base/files/scoped_temp_dir.h"
21 #include "base/message_loop/message_loop.h"
22 #include "base/stl_util.h"
23 #include "base/strings/string16.h"
24 #include "base/strings/string_util.h"
25 #include "base/strings/utf_string_conversions.h"
26 #include "base/win/registry.h"
27 #include "base/win/scoped_comptr.h"
28 #include "base/win/scoped_propvariant.h"
29 #include "base/win/windows_version.h"
30 #include "chrome/browser/importer/external_process_importer_host.h"
31 #include "chrome/browser/importer/importer_progress_observer.h"
32 #include "chrome/browser/importer/importer_unittest_utils.h"
33 #include "chrome/browser/ui/browser.h"
34 #include "chrome/common/chrome_paths.h"
35 #include "chrome/common/importer/ie_importer_test_registry_overrider_win.h"
36 #include "chrome/common/importer/ie_importer_utils_win.h"
37 #include "chrome/common/importer/imported_bookmark_entry.h"
38 #include "chrome/common/importer/importer_bridge.h"
39 #include "chrome/common/importer/importer_data_types.h"
40 #include "chrome/test/base/in_process_browser_test.h"
41 #include "chrome/test/base/testing_profile.h"
42 #include "components/autofill/core/common/password_form.h"
43 #include "components/favicon_base/favicon_usage_data.h"
44 #include "components/os_crypt/ie7_password_win.h"
45 #include "components/search_engines/template_url.h"
46 #include "testing/gtest/include/gtest/gtest.h"
50 const BookmarkInfo kIEBookmarks
[] = {
51 {true, 2, {"Links", "SubFolderOfLinks"},
53 "http://www.links-sublink.com/"},
56 "http://www.links-thelink.com/"},
59 "http://www.google.com/"},
62 "http://www.links-thelink.com/"},
63 {false, 1, {"SubFolder"},
65 "http://www.link.com/"},
68 "http://host:8080/cgi?q=query"},
71 "http://chinese-title-favorite/"},
74 "http://www.subfolder.com/"},
77 const BookmarkInfo kIESortedBookmarks
[] = {
78 {false, 0, {}, L
"a", "http://www.google.com/0"},
79 {false, 1, {"b"}, L
"a", "http://www.google.com/1"},
80 {false, 1, {"b"}, L
"b", "http://www.google.com/2"},
81 {false, 0, {}, L
"c", "http://www.google.com/3"},
84 const base::char16 kIEIdentifyUrl
[] =
85 L
"http://A79029D6-753E-4e27-B807-3D46AB1545DF.com:8080/path?key=value";
86 const base::char16 kIEIdentifyTitle
[] =
88 const base::char16 kIECacheItemUrl
[] =
89 L
"http://B2EF40C8-2569-4D7E-97EA-BAD9DF468D9C.com";
90 const base::char16 kIECacheItemTitle
[] =
91 L
"Unittest Cache Item GUID";
93 const base::char16 kFaviconStreamSuffix
[] = L
"url:favicon:$DATA";
94 const char kDummyFaviconImageData
[] =
95 "\x42\x4D" // Magic signature 'BM'
96 "\x1E\x00\x00\x00" // File size
97 "\x00\x00\x00\x00" // Reserved
98 "\x1A\x00\x00\x00" // Offset of the pixel data
99 "\x0C\x00\x00\x00" // Header Size
100 "\x01\x00\x01\x00" // Size: 1x1
101 "\x01\x00" // Reserved
102 "\x18\x00" // 24-bits
103 "\x00\xFF\x00\x00"; // The pixel
105 struct FaviconGroup
{
106 const base::char16
* favicon_url
;
107 const base::char16
* site_url
[2];
110 const FaviconGroup kIEFaviconGroup
[2] = {
111 {L
"http://www.google.com/favicon.ico",
112 {L
"http://www.google.com/",
113 L
"http://www.subfolder.com/"}},
114 {L
"http://example.com/favicon.ico",
115 {L
"http://host:8080/cgi?q=query",
116 L
"http://chinese-title-favorite/"}},
119 bool CreateOrderBlob(const base::FilePath
& favorites_folder
,
120 const base::string16
& path
,
121 const std::vector
<base::string16
>& entries
) {
122 if (entries
.size() > 255)
125 // Create a binary sequence for setting a specific order of favorites.
126 // The format depends on the version of Shell32.dll, so we cannot embed
127 // a binary constant here.
128 std::vector
<uint8
> blob(20, 0);
129 blob
[16] = static_cast<uint8
>(entries
.size());
131 for (size_t i
= 0; i
< entries
.size(); ++i
) {
132 PIDLIST_ABSOLUTE id_list_full
= ILCreateFromPath(
133 favorites_folder
.Append(path
).Append(entries
[i
]).value().c_str());
134 PUITEMID_CHILD id_list
= ILFindLastID(id_list_full
);
135 // Include the trailing zero-length item id. Don't include the single
137 size_t id_list_size
= id_list
->mkid
.cb
+ sizeof(id_list
->mkid
.cb
);
139 blob
.resize(blob
.size() + 8);
140 uint32 total_size
= id_list_size
+ 8;
141 memcpy(&blob
[blob
.size() - 8], &total_size
, 4);
142 uint32 sort_index
= i
;
143 memcpy(&blob
[blob
.size() - 4], &sort_index
, 4);
144 blob
.resize(blob
.size() + id_list_size
);
145 memcpy(&blob
[blob
.size() - id_list_size
], id_list
, id_list_size
);
146 ILFree(id_list_full
);
149 base::string16
key_path(importer::GetIEFavoritesOrderKey());
151 key_path
+= L
"\\" + path
;
152 base::win::RegKey key
;
153 if (key
.Create(HKEY_CURRENT_USER
, key_path
.c_str(), KEY_WRITE
) !=
157 if (key
.WriteValue(L
"Order", &blob
[0], blob
.size(), REG_BINARY
) !=
164 bool CreateUrlFileWithFavicon(const base::FilePath
& file
,
165 const base::string16
& url
,
166 const base::string16
& favicon_url
) {
167 base::win::ScopedComPtr
<IUniformResourceLocator
> locator
;
168 HRESULT result
= locator
.CreateInstance(CLSID_InternetShortcut
, NULL
,
169 CLSCTX_INPROC_SERVER
);
172 base::win::ScopedComPtr
<IPersistFile
> persist_file
;
173 result
= persist_file
.QueryFrom(locator
.get());
176 result
= locator
->SetURL(url
.c_str(), 0);
180 // Write favicon url if specified.
181 if (!favicon_url
.empty()) {
182 base::win::ScopedComPtr
<IPropertySetStorage
> property_set_storage
;
183 if (FAILED(property_set_storage
.QueryFrom(locator
.get())))
185 base::win::ScopedComPtr
<IPropertyStorage
> property_storage
;
186 if (FAILED(property_set_storage
->Open(FMTID_Intshcut
,
188 property_storage
.Receive()))) {
191 PROPSPEC properties
[] = {{PRSPEC_PROPID
, {PID_IS_ICONFILE
}}};
192 // WriteMultiple takes an array of PROPVARIANTs, but since this code only
193 // needs an array of size 1: a pointer to |pv_icon| is equivalent.
194 base::win::ScopedPropVariant pv_icon
;
195 if (FAILED(InitPropVariantFromString(favicon_url
.c_str(),
196 pv_icon
.Receive())) ||
198 property_storage
->WriteMultiple(1, properties
, pv_icon
.ptr(), 0))) {
203 // Save the .url file.
204 result
= persist_file
->Save(file
.value().c_str(), TRUE
);
208 // Write dummy favicon image data in NTFS alternate data stream.
209 return favicon_url
.empty() || (base::WriteFile(
210 file
.ReplaceExtension(kFaviconStreamSuffix
), kDummyFaviconImageData
,
211 sizeof kDummyFaviconImageData
) != -1);
214 bool CreateUrlFile(const base::FilePath
& file
, const base::string16
& url
) {
215 return CreateUrlFileWithFavicon(file
, url
, base::string16());
218 class TestObserver
: public ProfileWriter
,
219 public importer::ImporterProgressObserver
{
226 explicit TestObserver(uint16 importer_items
, TestIEVersion ie_version
)
227 : ProfileWriter(NULL
),
233 ie7_password_count_(0),
234 importer_items_(importer_items
),
235 ie_version_(ie_version
) {
238 // importer::ImporterProgressObserver:
239 void ImportStarted() override
{}
240 void ImportItemStarted(importer::ImportItem item
) override
{}
241 void ImportItemEnded(importer::ImportItem item
) override
{}
242 void ImportEnded() override
{
243 base::MessageLoop::current()->Quit();
244 if (importer_items_
& importer::FAVORITES
) {
245 EXPECT_EQ(arraysize(kIEBookmarks
), bookmark_count_
);
246 EXPECT_EQ(arraysize(kIEFaviconGroup
), favicon_count_
);
248 if (importer_items_
& importer::HISTORY
)
249 EXPECT_EQ(2, history_count_
);
250 if (importer_items_
& importer::HOME_PAGE
)
251 EXPECT_EQ(1, homepage_count_
);
252 if ((importer_items_
& importer::PASSWORDS
) && (ie_version_
== IE7
))
253 EXPECT_EQ(1, ie7_password_count_
);
254 // We need to test the IE6 password importer code.
255 // https://crbug.com/257100
256 // EXPECT_EQ(1, password_count_);
260 bool BookmarkModelIsLoaded() const override
{
261 // Profile is ready for writing.
265 bool TemplateURLServiceIsLoaded() const override
{
269 void AddPasswordForm(const autofill::PasswordForm
& form
) override
{
270 // Importer should obtain this password form only.
271 EXPECT_EQ(GURL("http://localhost:8080/security/index.htm"), form
.origin
);
272 EXPECT_EQ("http://localhost:8080/", form
.signon_realm
);
273 EXPECT_EQ(L
"user", form
.username_element
);
274 EXPECT_EQ(L
"1", form
.username_value
);
275 EXPECT_EQ(L
"", form
.password_element
);
276 EXPECT_EQ(L
"2", form
.password_value
);
277 EXPECT_EQ("", form
.action
.spec());
281 void AddHistoryPage(const history::URLRows
& page
,
282 history::VisitSource visit_source
) override
{
283 bool cache_item_found
= false;
284 bool history_item_found
= false;
285 // Importer should read the specified URL.
286 for (size_t i
= 0; i
< page
.size(); ++i
) {
287 if (page
[i
].title() == kIEIdentifyTitle
&&
288 page
[i
].url() == GURL(kIEIdentifyUrl
)) {
289 EXPECT_FALSE(page
[i
].hidden());
290 history_item_found
= true;
293 if (page
[i
].title() == kIECacheItemTitle
&&
294 page
[i
].url() == GURL(kIECacheItemUrl
)) {
295 EXPECT_TRUE(page
[i
].hidden());
296 cache_item_found
= true;
300 EXPECT_TRUE(history_item_found
);
301 EXPECT_TRUE(cache_item_found
);
302 EXPECT_EQ(history::SOURCE_IE_IMPORTED
, visit_source
);
305 void AddBookmarks(const std::vector
<ImportedBookmarkEntry
>& bookmarks
,
306 const base::string16
& top_level_folder_name
) override
{
307 ASSERT_LE(bookmark_count_
+ bookmarks
.size(), arraysize(kIEBookmarks
));
308 // Importer should import the IE Favorites folder the same as the list,
309 // in the same order.
310 for (size_t i
= 0; i
< bookmarks
.size(); ++i
) {
311 EXPECT_NO_FATAL_FAILURE(
312 TestEqualBookmarkEntry(bookmarks
[i
],
313 kIEBookmarks
[bookmark_count_
])) << i
;
318 virtual void AddKeyword(std::vector
<TemplateURL
*> template_url
,
319 int default_keyword_index
) {
320 // TODO(jcampan): bug 1169230: we should test keyword importing for IE.
321 // In order to do that we'll probably need to mock the Windows registry.
323 STLDeleteContainerPointers(template_url
.begin(), template_url
.end());
326 void AddFavicons(const favicon_base::FaviconUsageDataList
& usage
) override
{
327 // Importer should group the favicon information for each favicon URL.
328 for (size_t i
= 0; i
< arraysize(kIEFaviconGroup
); ++i
) {
329 GURL
favicon_url(kIEFaviconGroup
[i
].favicon_url
);
331 for (size_t j
= 0; j
< arraysize(kIEFaviconGroup
[i
].site_url
); ++j
)
332 urls
.insert(GURL(kIEFaviconGroup
[i
].site_url
[j
]));
334 SCOPED_TRACE(testing::Message() << "Expected Favicon: " << favicon_url
);
336 bool expected_favicon_url_found
= false;
337 for (size_t j
= 0; j
< usage
.size(); ++j
) {
338 if (usage
[j
].favicon_url
== favicon_url
) {
339 EXPECT_EQ(urls
, usage
[j
].urls
);
340 expected_favicon_url_found
= true;
344 EXPECT_TRUE(expected_favicon_url_found
);
347 favicon_count_
+= usage
.size();
350 void AddIE7PasswordInfo(const IE7PasswordInfo
& info
) override
{
351 // This function also gets called for the IEImporter test. Ignore.
352 if (ie_version_
== IE7
) {
353 EXPECT_EQ(L
"Test1", info
.url_hash
);
354 EXPECT_EQ(1, info
.encrypted_data
[0]);
355 EXPECT_EQ(4, info
.encrypted_data
.size());
356 ++ie7_password_count_
;
360 void AddHomepage(const GURL
& homepage
) override
{
361 EXPECT_EQ(homepage
.spec(), "http://www.test.com/");
366 ~TestObserver() override
{}
368 size_t bookmark_count_
;
369 size_t history_count_
;
370 size_t password_count_
;
371 size_t favicon_count_
;
372 size_t homepage_count_
;
373 size_t ie7_password_count_
;
374 uint16 importer_items_
;
375 TestIEVersion ie_version_
;
378 class MalformedFavoritesRegistryTestObserver
379 : public ProfileWriter
,
380 public importer::ImporterProgressObserver
{
382 MalformedFavoritesRegistryTestObserver() : ProfileWriter(NULL
) {
386 // importer::ImporterProgressObserver:
387 void ImportStarted() override
{}
388 void ImportItemStarted(importer::ImportItem item
) override
{}
389 void ImportItemEnded(importer::ImportItem item
) override
{}
390 void ImportEnded() override
{
391 base::MessageLoop::current()->Quit();
392 EXPECT_EQ(arraysize(kIESortedBookmarks
), bookmark_count_
);
396 bool BookmarkModelIsLoaded() const override
{ return true; }
397 bool TemplateURLServiceIsLoaded() const override
{ return true; }
399 void AddPasswordForm(const autofill::PasswordForm
& form
) override
{}
400 void AddHistoryPage(const history::URLRows
& page
,
401 history::VisitSource visit_source
) override
{}
402 void AddKeywords(ScopedVector
<TemplateURL
> template_urls
,
403 bool unique_on_host_and_path
) override
{}
404 void AddBookmarks(const std::vector
<ImportedBookmarkEntry
>& bookmarks
,
405 const base::string16
& top_level_folder_name
) override
{
406 ASSERT_LE(bookmark_count_
+ bookmarks
.size(),
407 arraysize(kIESortedBookmarks
));
408 for (size_t i
= 0; i
< bookmarks
.size(); ++i
) {
409 EXPECT_NO_FATAL_FAILURE(
410 TestEqualBookmarkEntry(bookmarks
[i
],
411 kIESortedBookmarks
[bookmark_count_
])) << i
;
417 ~MalformedFavoritesRegistryTestObserver() override
{}
419 size_t bookmark_count_
;
424 // These tests need to be browser tests in order to be able to run the OOP
425 // import (via ExternalProcessImporterHost) which launches a utility process.
426 class IEImporterBrowserTest
: public InProcessBrowserTest
{
428 void SetUp() override
{
429 ASSERT_TRUE(temp_dir_
.CreateUniqueTempDir());
431 // This will launch the browser test and thus needs to happen last.
432 InProcessBrowserTest::SetUp();
435 base::ScopedTempDir temp_dir_
;
437 // Overrides the default registry key for IE registry keys like favorites,
438 // settings, password store, etc.
439 IEImporterTestRegistryOverrider test_registry_overrider_
;
442 IN_PROC_BROWSER_TEST_F(IEImporterBrowserTest
, IEImporter
) {
443 // Sets up a favorites folder.
444 base::FilePath path
= temp_dir_
.path().AppendASCII("Favorites");
445 CreateDirectory(path
.value().c_str(), NULL
);
446 CreateDirectory(path
.AppendASCII("SubFolder").value().c_str(), NULL
);
447 base::FilePath links_path
= path
.AppendASCII("Links");
448 CreateDirectory(links_path
.value().c_str(), NULL
);
449 CreateDirectory(links_path
.AppendASCII("SubFolderOfLinks").value().c_str(),
451 CreateDirectory(path
.AppendASCII("\x0061").value().c_str(), NULL
);
452 ASSERT_TRUE(CreateUrlFileWithFavicon(path
.AppendASCII("Google Home Page.url"),
453 L
"http://www.google.com/",
454 L
"http://www.google.com/favicon.ico"));
455 ASSERT_TRUE(CreateUrlFile(path
.AppendASCII("SubFolder\\Title.url"),
456 L
"http://www.link.com/"));
457 ASSERT_TRUE(CreateUrlFileWithFavicon(path
.AppendASCII("SubFolder.url"),
458 L
"http://www.subfolder.com/",
459 L
"http://www.google.com/favicon.ico"));
460 ASSERT_TRUE(CreateUrlFile(path
.AppendASCII("TheLink.url"),
461 L
"http://www.links-thelink.com/"));
462 ASSERT_TRUE(CreateUrlFileWithFavicon(path
.AppendASCII("WithPortAndQuery.url"),
463 L
"http://host:8080/cgi?q=query",
464 L
"http://example.com/favicon.ico"));
465 ASSERT_TRUE(CreateUrlFileWithFavicon(
466 path
.AppendASCII("\x0061").Append(L
"\x4E2D\x6587.url"),
467 L
"http://chinese-title-favorite/",
468 L
"http://example.com/favicon.ico"));
469 ASSERT_TRUE(CreateUrlFile(links_path
.AppendASCII("TheLink.url"),
470 L
"http://www.links-thelink.com/"));
471 ASSERT_TRUE(CreateUrlFile(
472 links_path
.AppendASCII("SubFolderOfLinks").AppendASCII("SubLink.url"),
473 L
"http://www.links-sublink.com/"));
474 ASSERT_TRUE(CreateUrlFile(path
.AppendASCII("IEDefaultLink.url"),
475 L
"http://go.microsoft.com/fwlink/?linkid=140813"));
476 base::WriteFile(path
.AppendASCII("InvalidUrlFile.url"), "x", 1);
477 base::WriteFile(path
.AppendASCII("PlainTextFile.txt"), "x", 1);
479 const base::char16
* root_links
[] = {
481 L
"Google Home Page.url",
484 L
"WithPortAndQuery.url",
488 ASSERT_TRUE(CreateOrderBlob(
489 base::FilePath(path
), L
"",
490 std::vector
<base::string16
>(root_links
,
491 root_links
+ arraysize(root_links
))));
493 // Sets up a special history link.
494 base::win::ScopedComPtr
<IUrlHistoryStg2
> url_history_stg2
;
495 ASSERT_EQ(S_OK
, url_history_stg2
.CreateInstance(CLSID_CUrlHistory
, NULL
,
496 CLSCTX_INPROC_SERVER
));
497 // Usage of ADDURL_ADDTOHISTORYANDCACHE and ADDURL_ADDTOCACHE flags
498 // is explained in the article:
499 // http://msdn.microsoft.com/ru-ru/aa767730
500 ASSERT_EQ(S_OK
, url_history_stg2
->AddUrl(kIEIdentifyUrl
, kIEIdentifyTitle
,
501 ADDURL_ADDTOHISTORYANDCACHE
));
502 ASSERT_EQ(S_OK
, url_history_stg2
->AddUrl(kIECacheItemUrl
, kIECacheItemTitle
,
505 // Starts to import the above settings.
507 ExternalProcessImporterHost
* host
= new ExternalProcessImporterHost
;
508 TestObserver
* observer
= new TestObserver(
509 importer::HISTORY
| importer::PASSWORDS
| importer::FAVORITES
,
511 host
->set_observer(observer
);
513 importer::SourceProfile source_profile
;
514 source_profile
.importer_type
= importer::TYPE_IE
;
515 source_profile
.source_path
= temp_dir_
.path();
517 host
->StartImportSettings(
519 browser()->profile(),
520 importer::HISTORY
| importer::PASSWORDS
| importer::FAVORITES
,
522 base::MessageLoop::current()->Run();
525 url_history_stg2
->DeleteUrl(kIEIdentifyUrl
, 0);
526 url_history_stg2
->DeleteUrl(kIECacheItemUrl
, 0);
527 url_history_stg2
.Release();
530 IN_PROC_BROWSER_TEST_F(IEImporterBrowserTest
,
531 IEImporterMalformedFavoritesRegistry
) {
532 // Sets up a favorites folder.
533 base::FilePath path
= temp_dir_
.path().AppendASCII("Favorites");
534 CreateDirectory(path
.value().c_str(), NULL
);
535 CreateDirectory(path
.AppendASCII("b").value().c_str(), NULL
);
536 ASSERT_TRUE(CreateUrlFile(path
.AppendASCII("a.url"),
537 L
"http://www.google.com/0"));
538 ASSERT_TRUE(CreateUrlFile(path
.AppendASCII("b").AppendASCII("a.url"),
539 L
"http://www.google.com/1"));
540 ASSERT_TRUE(CreateUrlFile(path
.AppendASCII("b").AppendASCII("b.url"),
541 L
"http://www.google.com/2"));
542 ASSERT_TRUE(CreateUrlFile(path
.AppendASCII("c.url"),
543 L
"http://www.google.com/3"));
545 struct BadBinaryData
{
549 static const BadBinaryData kBadBinary
[] = {
550 // number_of_items field is truncated
551 {"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
552 "\x00\xff\xff\xff", 17},
553 // number_of_items = 0xffff, but the byte sequence is too short.
554 {"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
555 "\xff\xff\x00\x00", 20},
556 // number_of_items = 1, size_of_item is too big.
557 {"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
559 "\xff\xff\x00\x00\x00\x00\x00\x00"
560 "\x00\x00\x00\x00", 32},
561 // number_of_items = 1, size_of_item = 16, size_of_shid is too big.
562 {"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
564 "\x10\x00\x00\x00\x00\x00\x00\x00"
565 "\xff\x7f\x00\x00" "\x00\x00\x00\x00", 36},
566 // number_of_items = 1, size_of_item = 16, size_of_shid is too big.
567 {"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
569 "\x10\x00\x00\x00\x00\x00\x00\x00"
570 "\x06\x00\x00\x00" "\x00\x00\x00\x00", 36},
573 // Verify malformed registry data are safely ignored and alphabetical
574 // sort is performed.
575 for (size_t i
= 0; i
< arraysize(kBadBinary
); ++i
) {
576 base::string16
key_path(importer::GetIEFavoritesOrderKey());
577 base::win::RegKey key
;
578 ASSERT_EQ(ERROR_SUCCESS
,
579 key
.Create(HKEY_CURRENT_USER
, key_path
.c_str(), KEY_WRITE
));
580 ASSERT_EQ(ERROR_SUCCESS
,
581 key
.WriteValue(L
"Order", kBadBinary
[i
].data
, kBadBinary
[i
].length
,
584 // Starts to import the above settings.
586 ExternalProcessImporterHost
* host
= new ExternalProcessImporterHost
;
587 MalformedFavoritesRegistryTestObserver
* observer
=
588 new MalformedFavoritesRegistryTestObserver();
589 host
->set_observer(observer
);
591 importer::SourceProfile source_profile
;
592 source_profile
.importer_type
= importer::TYPE_IE
;
593 source_profile
.source_path
= temp_dir_
.path();
595 host
->StartImportSettings(
597 browser()->profile(),
600 base::MessageLoop::current()->Run();
604 IN_PROC_BROWSER_TEST_F(IEImporterBrowserTest
, IE7ImporterPasswordsTest
) {
605 // Starts to import the IE7 passwords.
607 ExternalProcessImporterHost
* host
= new ExternalProcessImporterHost
;
608 TestObserver
* observer
= new TestObserver(importer::PASSWORDS
,
610 host
->set_observer(observer
);
612 base::string16
key_path(importer::GetIE7PasswordsKey());
613 base::win::RegKey key
;
614 ASSERT_EQ(ERROR_SUCCESS
,
615 key
.Create(HKEY_CURRENT_USER
, key_path
.c_str(), KEY_WRITE
));
616 key
.WriteValue(L
"Test1", 1);
618 importer::SourceProfile source_profile
;
619 source_profile
.importer_type
= importer::TYPE_IE
;
620 source_profile
.source_path
= temp_dir_
.path();
622 host
->StartImportSettings(
624 browser()->profile(),
627 base::MessageLoop::current()->Run();
630 IN_PROC_BROWSER_TEST_F(IEImporterBrowserTest
, IEImporterHomePageTest
) {
631 // Starts to import the IE home page.
633 ExternalProcessImporterHost
* host
= new ExternalProcessImporterHost
;
634 TestObserver
* observer
= new TestObserver(importer::HOME_PAGE
,
636 host
->set_observer(observer
);
638 base::string16
key_path(importer::GetIESettingsKey());
639 base::win::RegKey key
;
640 ASSERT_EQ(ERROR_SUCCESS
,
641 key
.Create(HKEY_CURRENT_USER
, key_path
.c_str(), KEY_WRITE
));
642 key
.WriteValue(L
"Start Page", L
"http://www.test.com/");
644 importer::SourceProfile source_profile
;
645 source_profile
.importer_type
= importer::TYPE_IE
;
646 source_profile
.source_path
= temp_dir_
.path();
648 host
->StartImportSettings(
650 browser()->profile(),
653 base::MessageLoop::current()->Run();