Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "base/file_path.h" | 5 #include "base/file_path.h" |
| 6 #include "base/file_util.h" | 6 #include "base/file_util.h" |
| 7 #include "base/memory/ref_counted.h" | 7 #include "base/memory/ref_counted.h" |
| 8 #include "base/path_service.h" | 8 #include "base/path_service.h" |
| 9 #include "base/scoped_temp_dir.h" | 9 #include "base/scoped_temp_dir.h" |
| 10 #include "base/stl_util.h" | 10 #include "base/stl_util.h" |
| 11 #include "base/test/test_file_util.h" | 11 #include "base/test/test_file_util.h" |
| 12 #include "base/utf_string_conversions.h" | 12 #include "base/utf_string_conversions.h" |
| 13 #include "chrome/browser/browser_process.h" | 13 #include "chrome/browser/browser_process.h" |
| 14 #include "chrome/browser/download/chrome_download_manager_delegate.h" | |
| 14 #include "chrome/browser/download/download_crx_util.h" | 15 #include "chrome/browser/download/download_crx_util.h" |
| 15 #include "chrome/browser/download/download_history.h" | 16 #include "chrome/browser/download/download_history.h" |
| 16 #include "chrome/browser/download/download_prefs.h" | 17 #include "chrome/browser/download/download_prefs.h" |
| 17 #include "chrome/browser/download/download_shelf.h" | 18 #include "chrome/browser/download/download_shelf.h" |
| 18 #include "chrome/browser/download/download_util.h" | 19 #include "chrome/browser/download/download_util.h" |
| 19 #include "chrome/browser/extensions/extension_install_ui.h" | 20 #include "chrome/browser/extensions/extension_install_ui.h" |
| 20 #include "chrome/browser/extensions/extension_service.h" | 21 #include "chrome/browser/extensions/extension_service.h" |
| 21 #include "chrome/browser/history/history.h" | 22 #include "chrome/browser/history/history.h" |
| 22 #include "chrome/browser/prefs/pref_service.h" | 23 #include "chrome/browser/prefs/pref_service.h" |
| 23 #include "chrome/browser/profiles/profile.h" | 24 #include "chrome/browser/profiles/profile.h" |
| (...skipping 459 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 483 } | 484 } |
| 484 | 485 |
| 485 ResourceDispatcherHost* resource_dispatcher_host_; | 486 ResourceDispatcherHost* resource_dispatcher_host_; |
| 486 DownloadFileManager* download_file_manager_; | 487 DownloadFileManager* download_file_manager_; |
| 487 int rdh_pending_requests_; | 488 int rdh_pending_requests_; |
| 488 int dfm_pending_downloads_; | 489 int dfm_pending_downloads_; |
| 489 | 490 |
| 490 DISALLOW_COPY_AND_ASSIGN(CancelTestDataCollector); | 491 DISALLOW_COPY_AND_ASSIGN(CancelTestDataCollector); |
| 491 }; | 492 }; |
| 492 | 493 |
| 494 class PickSuggestedFileDelegate : public ChromeDownloadManagerDelegate { | |
| 495 public: | |
| 496 explicit PickSuggestedFileDelegate(Profile* profile) | |
| 497 : ChromeDownloadManagerDelegate(profile) { | |
| 498 SetDownloadManager(profile->GetDownloadManager()); | |
| 499 } | |
| 500 | |
| 501 virtual void ChooseDownloadPath(TabContents* tab_contents, | |
| 502 const FilePath& suggested_path, | |
| 503 void* data) OVERRIDE { | |
|
ahendrickson
2011/09/08 21:24:40
Clang may not like the OVERRIDE here.
Randy Smith (Not in Mondays)
2011/09/08 21:27:12
I'll run the try bot; thanks for the suggestion.
| |
| 504 if (download_manager_) | |
| 505 download_manager_->FileSelected(suggested_path, data); | |
| 506 } | |
| 507 }; | |
| 508 | |
| 509 // Get History Information. | |
| 510 class DownloadsHistoryDataCollector { | |
| 511 public: | |
| 512 DownloadsHistoryDataCollector(int64 download_db_handle, | |
| 513 DownloadManager* manager) | |
| 514 : result_valid_(false), | |
| 515 download_db_handle_(download_db_handle) { | |
| 516 HistoryService* hs = | |
| 517 Profile::FromBrowserContext(manager->browser_context())-> | |
| 518 GetHistoryService(Profile::EXPLICIT_ACCESS); | |
| 519 DCHECK(hs); | |
| 520 hs->QueryDownloads( | |
| 521 &callback_consumer_, | |
| 522 NewCallback(this, | |
| 523 &DownloadsHistoryDataCollector::OnQueryDownloadsComplete)); | |
| 524 | |
| 525 // Cannot complete immediately because the history backend runs on a | |
| 526 // separate thread, so we can assume that the RunMessageLoop below will | |
| 527 // be exited by the Quit in OnQueryDownloadsComplete. | |
| 528 ui_test_utils::RunMessageLoop(); | |
|
ahendrickson
2011/09/08 21:24:40
I've never liked running a message loop inside a c
Randy Smith (Not in Mondays)
2011/09/08 21:27:12
This wasn't something I changed in this CL (moved
benjhayden
2011/09/12 16:32:25
Maybe just a TODO then?
Randy Smith (Not in Mondays)
2011/09/12 17:52:58
Sure (I don't find myself caring much, but it prob
| |
| 529 } | |
| 530 | |
| 531 bool GetDownloadsHistoryEntry(DownloadPersistentStoreInfo* result) { | |
| 532 DCHECK(result); | |
| 533 *result = result_; | |
| 534 return result_valid_; | |
| 535 } | |
| 536 | |
| 537 private: | |
| 538 void OnQueryDownloadsComplete( | |
| 539 std::vector<DownloadPersistentStoreInfo>* entries) { | |
| 540 result_valid_ = false; | |
| 541 for (std::vector<DownloadPersistentStoreInfo>::const_iterator it = | |
| 542 entries->begin(); | |
| 543 it != entries->end(); ++it) { | |
| 544 if (it->db_handle == download_db_handle_) { | |
| 545 result_ = *it; | |
| 546 result_valid_ = true; | |
| 547 } | |
| 548 } | |
| 549 MessageLoopForUI::current()->Quit(); | |
| 550 } | |
| 551 | |
| 552 DownloadPersistentStoreInfo result_; | |
| 553 bool result_valid_; | |
| 554 int64 download_db_handle_; | |
| 555 CancelableRequestConsumer callback_consumer_; | |
| 556 | |
| 557 DISALLOW_COPY_AND_ASSIGN(DownloadsHistoryDataCollector); | |
| 558 }; | |
| 559 | |
| 560 // Mock that simulates a permissions dialog where the user denies | |
| 561 // permission to install. TODO(skerner): This could be shared with | |
| 562 // extensions tests. Find a common place for this class. | |
| 563 class MockAbortExtensionInstallUI : public ExtensionInstallUI { | |
| 564 public: | |
| 565 MockAbortExtensionInstallUI() : ExtensionInstallUI(NULL) {} | |
| 566 | |
| 567 // Simulate a user abort on an extension installation. | |
| 568 virtual void ConfirmInstall(Delegate* delegate, const Extension* extension) { | |
| 569 delegate->InstallUIAbort(true); | |
| 570 MessageLoopForUI::current()->Quit(); | |
| 571 } | |
| 572 | |
| 573 virtual void OnInstallSuccess(const Extension* extension, SkBitmap* icon) {} | |
| 574 virtual void OnInstallFailure(const std::string& error) {} | |
| 575 }; | |
| 576 | |
| 577 // Mock that simulates a permissions dialog where the user allows | |
| 578 // installation. | |
| 579 class MockAutoConfirmExtensionInstallUI : public ExtensionInstallUI { | |
| 580 public: | |
| 581 explicit MockAutoConfirmExtensionInstallUI(Profile* profile) | |
| 582 : ExtensionInstallUI(profile) {} | |
| 583 | |
| 584 // Proceed without confirmation prompt. | |
| 585 virtual void ConfirmInstall(Delegate* delegate, const Extension* extension) { | |
| 586 delegate->InstallUIProceed(); | |
| 587 } | |
| 588 | |
| 589 virtual void OnInstallSuccess(const Extension* extension, SkBitmap* icon) {} | |
| 590 virtual void OnInstallFailure(const std::string& error) {} | |
| 591 }; | |
| 592 | |
| 593 } // namespace | |
| 594 | |
| 595 // While an object of this class exists, it will mock out download | |
| 596 // opening for all downloads created on the specified download manager. | |
| 597 class MockDownloadOpeningObserver : public DownloadManager::Observer { | |
| 598 public: | |
| 599 explicit MockDownloadOpeningObserver(DownloadManager* manager) | |
| 600 : download_manager_(manager) { | |
| 601 download_manager_->AddObserver(this); | |
| 602 } | |
| 603 | |
| 604 ~MockDownloadOpeningObserver() { | |
| 605 download_manager_->RemoveObserver(this); | |
| 606 } | |
| 607 | |
| 608 // DownloadManager::Observer | |
| 609 virtual void ModelChanged() { | |
| 610 std::vector<DownloadItem*> downloads; | |
| 611 download_manager_->SearchDownloads(string16(), &downloads); | |
| 612 | |
| 613 for (std::vector<DownloadItem*>::iterator it = downloads.begin(); | |
| 614 it != downloads.end(); ++it) { | |
| 615 (*it)->TestMockDownloadOpen(); | |
| 616 } | |
| 617 } | |
| 618 | |
| 619 private: | |
| 620 DownloadManager* download_manager_; | |
| 621 | |
| 622 DISALLOW_COPY_AND_ASSIGN(MockDownloadOpeningObserver); | |
| 623 }; | |
| 624 | |
| 493 class DownloadTest : public InProcessBrowserTest { | 625 class DownloadTest : public InProcessBrowserTest { |
| 494 public: | 626 public: |
| 495 enum SelectExpectation { | 627 enum SelectExpectation { |
| 496 EXPECT_NO_SELECT_DIALOG = -1, | 628 EXPECT_NO_SELECT_DIALOG = -1, |
| 497 EXPECT_NOTHING, | 629 EXPECT_NOTHING, |
| 498 EXPECT_SELECT_DIALOG | 630 EXPECT_SELECT_DIALOG |
| 499 }; | 631 }; |
| 500 | 632 |
| 501 DownloadTest() { | 633 DownloadTest() { |
| 502 EnableDOMAutomation(); | 634 EnableDOMAutomation(); |
| (...skipping 304 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 807 } | 939 } |
| 808 static void ExpectWindowCountAfterDownload(size_t expected) { | 940 static void ExpectWindowCountAfterDownload(size_t expected) { |
| 809 #if defined(OS_CHROMEOS) | 941 #if defined(OS_CHROMEOS) |
| 810 // On ChromeOS, a download panel is created to display | 942 // On ChromeOS, a download panel is created to display |
| 811 // download information, and this counts as a window. | 943 // download information, and this counts as a window. |
| 812 expected++; | 944 expected++; |
| 813 #endif | 945 #endif |
| 814 EXPECT_EQ(expected, BrowserList::size()); | 946 EXPECT_EQ(expected, BrowserList::size()); |
| 815 } | 947 } |
| 816 | 948 |
| 949 // Arrange for select file calls on the given browser from the | |
| 950 // download manager to always choose the suggested file. | |
| 951 void NullSelectFile(Browser* browser) { | |
| 952 PickSuggestedFileDelegate* new_delegate = | |
| 953 new PickSuggestedFileDelegate(browser->profile()); | |
| 954 | |
| 955 DownloadManager* manager = browser->profile()->GetDownloadManager(); | |
| 956 | |
| 957 new_delegate->SetDownloadManager(manager); | |
| 958 manager->set_delegate(new_delegate); | |
| 959 | |
| 960 // Gives ownership to Profile. | |
| 961 browser->profile()->SetDownloadManagerDelegate(new_delegate); | |
| 962 } | |
| 963 | |
| 817 private: | 964 private: |
| 818 // Location of the test data. | 965 // Location of the test data. |
| 819 FilePath test_dir_; | 966 FilePath test_dir_; |
| 820 | 967 |
| 821 // Location of the downloads directory for these tests | 968 // Location of the downloads directory for these tests |
| 822 ScopedTempDir downloads_directory_; | 969 ScopedTempDir downloads_directory_; |
| 823 }; | 970 }; |
| 824 | 971 |
| 825 // Get History Information. | |
| 826 class DownloadsHistoryDataCollector { | |
| 827 public: | |
| 828 DownloadsHistoryDataCollector(int64 download_db_handle, | |
| 829 DownloadManager* manager) | |
| 830 : result_valid_(false), | |
| 831 download_db_handle_(download_db_handle) { | |
| 832 HistoryService* hs = | |
| 833 Profile::FromBrowserContext(manager->browser_context())-> | |
| 834 GetHistoryService(Profile::EXPLICIT_ACCESS); | |
| 835 DCHECK(hs); | |
| 836 hs->QueryDownloads( | |
| 837 &callback_consumer_, | |
| 838 NewCallback(this, | |
| 839 &DownloadsHistoryDataCollector::OnQueryDownloadsComplete)); | |
| 840 | |
| 841 // Cannot complete immediately because the history backend runs on a | |
| 842 // separate thread, so we can assume that the RunMessageLoop below will | |
| 843 // be exited by the Quit in OnQueryDownloadsComplete. | |
| 844 ui_test_utils::RunMessageLoop(); | |
| 845 } | |
| 846 | |
| 847 bool GetDownloadsHistoryEntry(DownloadPersistentStoreInfo* result) { | |
| 848 DCHECK(result); | |
| 849 *result = result_; | |
| 850 return result_valid_; | |
| 851 } | |
| 852 | |
| 853 private: | |
| 854 void OnQueryDownloadsComplete( | |
| 855 std::vector<DownloadPersistentStoreInfo>* entries) { | |
| 856 result_valid_ = false; | |
| 857 for (std::vector<DownloadPersistentStoreInfo>::const_iterator it = | |
| 858 entries->begin(); | |
| 859 it != entries->end(); ++it) { | |
| 860 if (it->db_handle == download_db_handle_) { | |
| 861 result_ = *it; | |
| 862 result_valid_ = true; | |
| 863 } | |
| 864 } | |
| 865 MessageLoopForUI::current()->Quit(); | |
| 866 } | |
| 867 | |
| 868 DownloadPersistentStoreInfo result_; | |
| 869 bool result_valid_; | |
| 870 int64 download_db_handle_; | |
| 871 CancelableRequestConsumer callback_consumer_; | |
| 872 | |
| 873 DISALLOW_COPY_AND_ASSIGN(DownloadsHistoryDataCollector); | |
| 874 }; | |
| 875 | |
| 876 // Mock that simulates a permissions dialog where the user denies | |
| 877 // permission to install. TODO(skerner): This could be shared with | |
| 878 // extensions tests. Find a common place for this class. | |
| 879 class MockAbortExtensionInstallUI : public ExtensionInstallUI { | |
| 880 public: | |
| 881 MockAbortExtensionInstallUI() : ExtensionInstallUI(NULL) {} | |
| 882 | |
| 883 // Simulate a user abort on an extension installation. | |
| 884 virtual void ConfirmInstall(Delegate* delegate, const Extension* extension) { | |
| 885 delegate->InstallUIAbort(true); | |
| 886 MessageLoopForUI::current()->Quit(); | |
| 887 } | |
| 888 | |
| 889 virtual void OnInstallSuccess(const Extension* extension, SkBitmap* icon) {} | |
| 890 virtual void OnInstallFailure(const std::string& error) {} | |
| 891 }; | |
| 892 | |
| 893 // Mock that simulates a permissions dialog where the user allows | |
| 894 // installation. | |
| 895 class MockAutoConfirmExtensionInstallUI : public ExtensionInstallUI { | |
| 896 public: | |
| 897 explicit MockAutoConfirmExtensionInstallUI(Profile* profile) | |
| 898 : ExtensionInstallUI(profile) {} | |
| 899 | |
| 900 // Proceed without confirmation prompt. | |
| 901 virtual void ConfirmInstall(Delegate* delegate, const Extension* extension) { | |
| 902 delegate->InstallUIProceed(); | |
| 903 } | |
| 904 | |
| 905 virtual void OnInstallSuccess(const Extension* extension, SkBitmap* icon) {} | |
| 906 virtual void OnInstallFailure(const std::string& error) {} | |
| 907 }; | |
| 908 | |
| 909 } // namespace | |
| 910 | |
| 911 // While an object of this class exists, it will mock out download | |
| 912 // opening for all downloads created on the specified download manager. | |
| 913 class MockDownloadOpeningObserver : public DownloadManager::Observer { | |
| 914 public: | |
| 915 explicit MockDownloadOpeningObserver(DownloadManager* manager) | |
| 916 : download_manager_(manager) { | |
| 917 download_manager_->AddObserver(this); | |
| 918 } | |
| 919 | |
| 920 ~MockDownloadOpeningObserver() { | |
| 921 download_manager_->RemoveObserver(this); | |
| 922 } | |
| 923 | |
| 924 // DownloadManager::Observer | |
| 925 virtual void ModelChanged() { | |
| 926 std::vector<DownloadItem*> downloads; | |
| 927 download_manager_->SearchDownloads(string16(), &downloads); | |
| 928 | |
| 929 for (std::vector<DownloadItem*>::iterator it = downloads.begin(); | |
| 930 it != downloads.end(); ++it) { | |
| 931 (*it)->TestMockDownloadOpen(); | |
| 932 } | |
| 933 } | |
| 934 | |
| 935 private: | |
| 936 DownloadManager* download_manager_; | |
| 937 | |
| 938 DISALLOW_COPY_AND_ASSIGN(MockDownloadOpeningObserver); | |
| 939 }; | |
| 940 | |
| 941 // NOTES: | 972 // NOTES: |
| 942 // | 973 // |
| 943 // Files for these tests are found in DIR_TEST_DATA (currently | 974 // Files for these tests are found in DIR_TEST_DATA (currently |
| 944 // "chrome\test\data\", see chrome_paths.cc). | 975 // "chrome\test\data\", see chrome_paths.cc). |
| 945 // Mock responses have extension .mock-http-headers appended to the file name. | 976 // Mock responses have extension .mock-http-headers appended to the file name. |
| 946 | 977 |
| 947 // Download a file due to the associated MIME type. | 978 // Download a file due to the associated MIME type. |
| 948 IN_PROC_BROWSER_TEST_F(DownloadTest, DownloadMimeType) { | 979 IN_PROC_BROWSER_TEST_F(DownloadTest, DownloadMimeType) { |
| 949 ASSERT_TRUE(InitialSetup(false)); | 980 ASSERT_TRUE(InitialSetup(false)); |
| 950 FilePath file(FILE_PATH_LITERAL("download-test1.lib")); | 981 FilePath file(FILE_PATH_LITERAL("download-test1.lib")); |
| (...skipping 23 matching lines...) Expand all Loading... | |
| 974 // as CheckDownload will delete the output file. | 1005 // as CheckDownload will delete the output file. |
| 975 EXPECT_EQ(1, browser()->tab_count()); | 1006 EXPECT_EQ(1, browser()->tab_count()); |
| 976 FilePath downloaded_file(DestinationFile(browser(), file)); | 1007 FilePath downloaded_file(DestinationFile(browser(), file)); |
| 977 if (file_util::VolumeSupportsADS(downloaded_file)) | 1008 if (file_util::VolumeSupportsADS(downloaded_file)) |
| 978 EXPECT_TRUE(file_util::HasInternetZoneIdentifier(downloaded_file)); | 1009 EXPECT_TRUE(file_util::HasInternetZoneIdentifier(downloaded_file)); |
| 979 CheckDownload(browser(), file, file); | 1010 CheckDownload(browser(), file, file); |
| 980 CheckDownloadUI(browser(), true, true, file); | 1011 CheckDownloadUI(browser(), true, true, file); |
| 981 } | 1012 } |
| 982 #endif | 1013 #endif |
| 983 | 1014 |
| 984 // Put up a Select File dialog when the file is downloaded, due to its MIME | 1015 // Put up a Select File dialog when the file is downloaded, due to |
| 985 // type. | 1016 // downloads preferences settings. |
| 986 // | 1017 IN_PROC_BROWSER_TEST_F(DownloadTest, DownloadMimeTypeSelect) { |
| 987 // This test runs correctly, but leaves behind turds in the test user's | |
| 988 // download directory because of http://crbug.com/62099. No big loss; it | |
| 989 // was primarily confirming DownloadsObserver wait on select file dialog | |
| 990 // functionality anyway. | |
| 991 IN_PROC_BROWSER_TEST_F(DownloadTest, DISABLED_DownloadMimeTypeSelect) { | |
| 992 ASSERT_TRUE(InitialSetup(true)); | 1018 ASSERT_TRUE(InitialSetup(true)); |
| 993 FilePath file(FILE_PATH_LITERAL("download-test1.lib")); | 1019 FilePath file(FILE_PATH_LITERAL("download-test1.lib")); |
| 994 GURL url(URLRequestMockHTTPJob::GetMockUrl(file)); | 1020 GURL url(URLRequestMockHTTPJob::GetMockUrl(file)); |
| 995 | 1021 |
| 1022 NullSelectFile(browser()); | |
| 1023 | |
| 996 // Download the file and wait. We expect the Select File dialog to appear | 1024 // Download the file and wait. We expect the Select File dialog to appear |
| 997 // due to the MIME type. | 1025 // due to the MIME type, but we still wait until the download completes. |
| 998 DownloadAndWait(browser(), url, EXPECT_SELECT_DIALOG); | 1026 scoped_ptr<DownloadsObserver> observer( |
| 1027 new DownloadsObserver( | |
| 1028 browser()->profile()->GetDownloadManager(), | |
| 1029 1, | |
| 1030 DownloadItem::COMPLETE, // Really done | |
| 1031 false, // Continue on select file. | |
| 1032 ON_DANGEROUS_DOWNLOAD_FAIL)); | |
| 1033 ui_test_utils::NavigateToURLWithDisposition( | |
| 1034 browser(), url, CURRENT_TAB, | |
| 1035 ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION); | |
| 1036 observer->WaitForFinished(); | |
| 1037 EXPECT_TRUE(observer->select_file_dialog_seen()); | |
| 999 | 1038 |
| 1000 // Check state. | 1039 // Check state. |
| 1001 EXPECT_EQ(1, browser()->tab_count()); | 1040 EXPECT_EQ(1, browser()->tab_count()); |
| 1002 // Since we exited while the Select File dialog was visible, there should not | 1041 CheckDownload(browser(), file, file); |
| 1003 // be anything in the download shelf and so it should not be visible. | 1042 CheckDownloadUI(browser(), true, true, file); |
| 1004 CheckDownloadUI(browser(), false, false, FilePath()); | |
| 1005 } | 1043 } |
| 1006 | 1044 |
| 1007 // Access a file with a viewable mime-type, verify that a download | 1045 // Access a file with a viewable mime-type, verify that a download |
| 1008 // did not initiate. | 1046 // did not initiate. |
| 1009 IN_PROC_BROWSER_TEST_F(DownloadTest, NoDownload) { | 1047 IN_PROC_BROWSER_TEST_F(DownloadTest, NoDownload) { |
| 1010 ASSERT_TRUE(InitialSetup(false)); | 1048 ASSERT_TRUE(InitialSetup(false)); |
| 1011 FilePath file(FILE_PATH_LITERAL("download-test2.html")); | 1049 FilePath file(FILE_PATH_LITERAL("download-test2.html")); |
| 1012 GURL url(URLRequestMockHTTPJob::GetMockUrl(file)); | 1050 GURL url(URLRequestMockHTTPJob::GetMockUrl(file)); |
| 1013 FilePath file_path(DestinationFile(browser(), file)); | 1051 FilePath file_path(DestinationFile(browser(), file)); |
| 1014 | 1052 |
| (...skipping 715 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1730 EXPECT_EQ(1u, observer->NumDangerousDownloadsSeen()); | 1768 EXPECT_EQ(1u, observer->NumDangerousDownloadsSeen()); |
| 1731 | 1769 |
| 1732 // Download shelf should close. Download panel stays open on ChromeOS. | 1770 // Download shelf should close. Download panel stays open on ChromeOS. |
| 1733 CheckDownloadUI(browser(), false, true, FilePath()); | 1771 CheckDownloadUI(browser(), false, true, FilePath()); |
| 1734 | 1772 |
| 1735 // Check that the extension was installed. | 1773 // Check that the extension was installed. |
| 1736 ExtensionService* extension_service = | 1774 ExtensionService* extension_service = |
| 1737 browser()->profile()->GetExtensionService(); | 1775 browser()->profile()->GetExtensionService(); |
| 1738 ASSERT_TRUE(extension_service->GetExtensionById(kLargeThemeCrxId, false)); | 1776 ASSERT_TRUE(extension_service->GetExtensionById(kLargeThemeCrxId, false)); |
| 1739 } | 1777 } |
| OLD | NEW |