| 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-inl.h" | 10 #include "base/stl_util-inl.h" |
| (...skipping 10 matching lines...) Expand all Loading... |
| 21 #include "chrome/browser/download/download_util.h" | 21 #include "chrome/browser/download/download_util.h" |
| 22 #include "chrome/browser/extensions/extension_install_ui.h" | 22 #include "chrome/browser/extensions/extension_install_ui.h" |
| 23 #include "chrome/browser/extensions/extension_service.h" | 23 #include "chrome/browser/extensions/extension_service.h" |
| 24 #include "chrome/browser/history/download_history_info.h" | 24 #include "chrome/browser/history/download_history_info.h" |
| 25 #include "chrome/browser/history/history.h" | 25 #include "chrome/browser/history/history.h" |
| 26 #include "chrome/browser/prefs/pref_service.h" | 26 #include "chrome/browser/prefs/pref_service.h" |
| 27 #include "chrome/browser/profiles/profile.h" | 27 #include "chrome/browser/profiles/profile.h" |
| 28 #include "chrome/browser/ui/browser.h" | 28 #include "chrome/browser/ui/browser.h" |
| 29 #include "chrome/browser/ui/browser_list.h" | 29 #include "chrome/browser/ui/browser_list.h" |
| 30 #include "chrome/browser/ui/browser_window.h" | 30 #include "chrome/browser/ui/browser_window.h" |
| 31 #include "chrome/browser/ui/shell_dialogs.h" |
| 31 #include "chrome/browser/ui/webui/active_downloads_ui.h" | 32 #include "chrome/browser/ui/webui/active_downloads_ui.h" |
| 32 #include "chrome/common/chrome_notification_types.h" | 33 #include "chrome/common/chrome_notification_types.h" |
| 33 #include "chrome/common/chrome_paths.h" | 34 #include "chrome/common/chrome_paths.h" |
| 34 #include "chrome/common/pref_names.h" | 35 #include "chrome/common/pref_names.h" |
| 35 #include "chrome/common/url_constants.h" | 36 #include "chrome/common/url_constants.h" |
| 36 #include "chrome/test/in_process_browser_test.h" | 37 #include "chrome/test/in_process_browser_test.h" |
| 37 #include "chrome/test/ui_test_utils.h" | 38 #include "chrome/test/ui_test_utils.h" |
| 38 #include "content/browser/cancelable_request.h" | 39 #include "content/browser/cancelable_request.h" |
| 39 #include "content/browser/net/url_request_mock_http_job.h" | 40 #include "content/browser/net/url_request_mock_http_job.h" |
| 40 #include "content/browser/renderer_host/resource_dispatcher_host.h" | 41 #include "content/browser/renderer_host/resource_dispatcher_host.h" |
| 41 #include "content/browser/tab_contents/tab_contents.h" | 42 #include "content/browser/tab_contents/tab_contents.h" |
| 42 #include "content/browser/net/url_request_slow_download_job.h" | 43 #include "content/browser/net/url_request_slow_download_job.h" |
| 43 #include "content/common/page_transition_types.h" | 44 #include "content/common/page_transition_types.h" |
| 44 #include "net/base/net_util.h" | 45 #include "net/base/net_util.h" |
| 45 #include "testing/gtest/include/gtest/gtest.h" | 46 #include "testing/gtest/include/gtest/gtest.h" |
| 46 | 47 |
| 47 namespace { | 48 namespace { |
| 48 | 49 |
| 49 // IDs and paths of CRX files used in tests. | 50 // IDs and paths of CRX files used in tests. |
| 50 const char kGoodCrxId[] = "ldnnhddmnhbkjipkidpdiheffobcpfmf"; | 51 const char kGoodCrxId[] = "ldnnhddmnhbkjipkidpdiheffobcpfmf"; |
| 51 const FilePath kGoodCrxPath(FILE_PATH_LITERAL("extensions/good.crx")); | 52 const FilePath kGoodCrxPath(FILE_PATH_LITERAL("extensions/good.crx")); |
| 52 | 53 |
| 53 const char kLargeThemeCrxId[] = "pjpgmfcmabopnnfonnhmdjglfpjjfkbf"; | 54 const char kLargeThemeCrxId[] = "pjpgmfcmabopnnfonnhmdjglfpjjfkbf"; |
| 54 const FilePath kLargeThemePath(FILE_PATH_LITERAL("extensions/theme2.crx")); | 55 const FilePath kLargeThemePath(FILE_PATH_LITERAL("extensions/theme2.crx")); |
| 55 | 56 |
| 56 // Action a test should take if a dangerous download is encountered. | 57 // Action a test should take if a dangerous download is encountered. |
| 57 enum DangerousDownloadAction { | 58 enum DangerousDownloadAction { |
| 58 ON_DANGEROUS_DOWNLOAD_ACCEPT, // Accept the download | 59 ON_DANGEROUS_DOWNLOAD_ACCEPT, // Accept the download |
| 59 ON_DANGEROUS_DOWNLOAD_DENY, // Deny the download | 60 ON_DANGEROUS_DOWNLOAD_DENY, // Deny the download |
| 61 ON_DANGEROUS_DOWNLOAD_IGNORE, // Don't do anything; calling code will handle. |
| 60 ON_DANGEROUS_DOWNLOAD_FAIL // Fail if a dangerous download is seen | 62 ON_DANGEROUS_DOWNLOAD_FAIL // Fail if a dangerous download is seen |
| 61 }; | 63 }; |
| 62 | 64 |
| 63 // Fake user click on "Accept". | 65 // Fake user click on "Accept". |
| 64 void AcceptDangerousDownload(scoped_refptr<DownloadManager> download_manager, | 66 void AcceptDangerousDownload(scoped_refptr<DownloadManager> download_manager, |
| 65 int32 download_id) { | 67 int32 download_id) { |
| 66 DownloadItem* download = download_manager->GetDownloadItem(download_id); | 68 DownloadItem* download = download_manager->GetDownloadItem(download_id); |
| 67 download->DangerousDownloadValidated(); | 69 download->DangerousDownloadValidated(); |
| 68 } | 70 } |
| 69 | 71 |
| 70 // Fake user click on "Deny". | 72 // Fake user click on "Deny". |
| 71 void DenyDangerousDownload(scoped_refptr<DownloadManager> download_manager, | 73 void DenyDangerousDownload(scoped_refptr<DownloadManager> download_manager, |
| 72 int32 download_id) { | 74 int32 download_id) { |
| 73 DownloadItem* download = download_manager->GetDownloadItem(download_id); | 75 DownloadItem* download = download_manager->GetDownloadItem(download_id); |
| 74 ASSERT_TRUE(download->IsPartialDownload()); | 76 ASSERT_TRUE(download->IsPartialDownload()); |
| 75 download->Cancel(true); | 77 download->Cancel(); |
| 76 download->Delete(DownloadItem::DELETE_DUE_TO_USER_DISCARD); | 78 download->Delete(DownloadItem::DELETE_DUE_TO_USER_DISCARD); |
| 77 } | 79 } |
| 78 | 80 |
| 79 // Construction of this class defines a system state, based on some number | 81 // Construction of this class defines a system state, based on some number |
| 80 // of downloads being seen in a particular state + other events that | 82 // of downloads being seen in a particular state + other events that |
| 81 // may occur in the download system. That state will be recorded if it | 83 // may occur in the download system. That state will be recorded if it |
| 82 // occurs at any point after construction. When that state occurs, the class | 84 // occurs at any point after construction. When that state occurs, the class |
| 83 // is considered finished. Callers may either probe for the finished state, or | 85 // is considered finished. Callers may either probe for the finished state, or |
| 84 // wait on it. | 86 // wait on it. |
| 85 // | 87 // |
| 86 // TODO(rdsmith): Detect manager going down, remove pointer to | 88 // TODO(rdsmith): Detect manager going down, remove pointer to |
| 87 // DownloadManager, transition to finished. (For right now we | 89 // DownloadManager, transition to finished. (For right now we |
| 88 // just use a scoped_refptr<> to keep it around, but that may cause | 90 // just use a scoped_refptr<> to keep it around, but that may cause |
| 89 // timeouts on waiting if a DownloadManager::Shutdown() occurs which | 91 // timeouts on waiting if a DownloadManager::Shutdown() occurs which |
| 90 // cancels our in-progress downloads.) | 92 // cancels our in-progress downloads.) |
| 91 class DownloadsObserver : public DownloadManager::Observer, | 93 class DownloadsObserver : public DownloadManager::Observer, |
| 92 public DownloadItem::Observer { | 94 public DownloadItem::Observer { |
| 93 public: | 95 public: |
| 96 typedef std::set<DownloadItem::DownloadState> StateSet; |
| 97 |
| 94 // Create an object that will be considered finished when |wait_count| | 98 // Create an object that will be considered finished when |wait_count| |
| 95 // download items have entered state |download_finished_state|. | 99 // download items have entered any states in |download_finished_states|. |
| 96 // If |finish_on_select_file| is true, the object will also be | 100 // If |finish_on_select_file| is true, the object will also be |
| 97 // considered finished if the DownloadManager raises a | 101 // considered finished if the DownloadManager raises a |
| 98 // SelectFileDialogDisplayed() notification. | 102 // SelectFileDialogDisplayed() notification. |
| 99 | 103 |
| 100 // TODO(rdsmith): Consider rewriting the interface to take a list of events | 104 // TODO(rdsmith): Consider rewriting the interface to take a list of events |
| 101 // to treat as completion events. | 105 // to treat as completion events. |
| 102 DownloadsObserver(DownloadManager* download_manager, | 106 DownloadsObserver(DownloadManager* download_manager, |
| 103 size_t wait_count, | 107 size_t wait_count, |
| 104 DownloadItem::DownloadState download_finished_state, | 108 StateSet download_finished_states, |
| 105 bool finish_on_select_file, | 109 bool finish_on_select_file, |
| 106 DangerousDownloadAction dangerous_download_action) | 110 DangerousDownloadAction dangerous_download_action) |
| 107 : download_manager_(download_manager), | 111 : download_manager_(download_manager), |
| 108 wait_count_(wait_count), | 112 wait_count_(wait_count), |
| 109 finished_downloads_at_construction_(0), | 113 finished_downloads_at_construction_(0), |
| 110 waiting_(false), | 114 waiting_(false), |
| 111 download_finished_state_(download_finished_state), | 115 download_finished_states_(download_finished_states), |
| 112 finish_on_select_file_(finish_on_select_file), | 116 finish_on_select_file_(finish_on_select_file), |
| 113 select_file_dialog_seen_(false), | 117 select_file_dialog_seen_(false), |
| 114 dangerous_download_action_(dangerous_download_action) { | 118 dangerous_download_action_(dangerous_download_action) { |
| 115 download_manager_->AddObserver(this); // Will call initial ModelChanged(). | 119 download_manager_->AddObserver(this); // Will call initial ModelChanged(). |
| 116 finished_downloads_at_construction_ = finished_downloads_.size(); | 120 finished_downloads_at_construction_ = finished_downloads_.size(); |
| 117 EXPECT_NE(DownloadItem::REMOVING, download_finished_state) | 121 EXPECT_TRUE(download_finished_states.find(DownloadItem::REMOVING) == |
| 122 download_finished_states.end()) |
| 118 << "Waiting for REMOVING is not supported. Try COMPLETE."; | 123 << "Waiting for REMOVING is not supported. Try COMPLETE."; |
| 119 } | 124 } |
| 120 | 125 |
| 121 ~DownloadsObserver() { | 126 ~DownloadsObserver() { |
| 122 std::set<DownloadItem*>::iterator it = downloads_observed_.begin(); | 127 std::set<DownloadItem*>::iterator it = downloads_observed_.begin(); |
| 123 for (; it != downloads_observed_.end(); ++it) | 128 for (; it != downloads_observed_.end(); ++it) |
| 124 (*it)->RemoveObserver(this); | 129 (*it)->RemoveObserver(this); |
| 125 | 130 |
| 126 download_manager_->RemoveObserver(this); | 131 download_manager_->RemoveObserver(this); |
| 127 } | 132 } |
| (...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 186 NewRunnableFunction( | 191 NewRunnableFunction( |
| 187 &DenyDangerousDownload, | 192 &DenyDangerousDownload, |
| 188 download_manager_, | 193 download_manager_, |
| 189 download->id())); | 194 download->id())); |
| 190 break; | 195 break; |
| 191 | 196 |
| 192 case ON_DANGEROUS_DOWNLOAD_FAIL: | 197 case ON_DANGEROUS_DOWNLOAD_FAIL: |
| 193 ADD_FAILURE() << "Unexpected dangerous download item."; | 198 ADD_FAILURE() << "Unexpected dangerous download item."; |
| 194 break; | 199 break; |
| 195 | 200 |
| 201 case ON_DANGEROUS_DOWNLOAD_IGNORE: |
| 202 break; |
| 203 |
| 196 default: | 204 default: |
| 197 NOTREACHED(); | 205 NOTREACHED(); |
| 198 } | 206 } |
| 199 } | 207 } |
| 200 | 208 |
| 201 if (download->state() == download_finished_state_) { | 209 if (download_finished_states_.find(download->state()) != |
| 210 download_finished_states_.end()) { |
| 202 DownloadInFinalState(download); | 211 DownloadInFinalState(download); |
| 203 } | 212 } |
| 204 } | 213 } |
| 205 | 214 |
| 206 virtual void OnDownloadOpened(DownloadItem* download) {} | 215 virtual void OnDownloadOpened(DownloadItem* download) {} |
| 207 | 216 |
| 208 // DownloadManager::Observer | 217 // DownloadManager::Observer |
| 209 virtual void ModelChanged() { | 218 virtual void ModelChanged() { |
| 210 // Regenerate DownloadItem observers. If there are any download items | 219 // Regenerate DownloadItem observers. If there are any download items |
| 211 // in our final state, note them in |finished_downloads_| | 220 // in our final state, note them in |finished_downloads_| |
| (...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 294 // construction and return from wait. But some downloads may be in our | 303 // construction and return from wait. But some downloads may be in our |
| 295 // final state (and thus be entered into |finished_downloads_|) when we | 304 // final state (and thus be entered into |finished_downloads_|) when we |
| 296 // construct this class. We don't want to count those in our transition | 305 // construct this class. We don't want to count those in our transition |
| 297 // to finished. | 306 // to finished. |
| 298 int finished_downloads_at_construction_; | 307 int finished_downloads_at_construction_; |
| 299 | 308 |
| 300 // Whether an internal message loop has been started and must be quit upon | 309 // Whether an internal message loop has been started and must be quit upon |
| 301 // all downloads completing. | 310 // all downloads completing. |
| 302 bool waiting_; | 311 bool waiting_; |
| 303 | 312 |
| 304 // The state on which to consider the DownloadItem finished. | 313 // The states on which to consider the DownloadItem finished. |
| 305 DownloadItem::DownloadState download_finished_state_; | 314 StateSet download_finished_states_; |
| 306 | 315 |
| 307 // True if we should transition the DownloadsObserver to finished if | 316 // True if we should transition the DownloadsObserver to finished if |
| 308 // the select file dialog comes up. | 317 // the select file dialog comes up. |
| 309 bool finish_on_select_file_; | 318 bool finish_on_select_file_; |
| 310 | 319 |
| 311 // True if we've seen the select file dialog. | 320 // True if we've seen the select file dialog. |
| 312 bool select_file_dialog_seen_; | 321 bool select_file_dialog_seen_; |
| 313 | 322 |
| 314 // Action to take if a dangerous download is encountered. | 323 // Action to take if a dangerous download is encountered. |
| 315 DangerousDownloadAction dangerous_download_action_; | 324 DangerousDownloadAction dangerous_download_action_; |
| (...skipping 167 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 483 } | 492 } |
| 484 | 493 |
| 485 ResourceDispatcherHost* resource_dispatcher_host_; | 494 ResourceDispatcherHost* resource_dispatcher_host_; |
| 486 DownloadFileManager* download_file_manager_; | 495 DownloadFileManager* download_file_manager_; |
| 487 int rdh_pending_requests_; | 496 int rdh_pending_requests_; |
| 488 int dfm_pending_downloads_; | 497 int dfm_pending_downloads_; |
| 489 | 498 |
| 490 DISALLOW_COPY_AND_ASSIGN(CancelTestDataCollector); | 499 DISALLOW_COPY_AND_ASSIGN(CancelTestDataCollector); |
| 491 }; | 500 }; |
| 492 | 501 |
| 502 static const DownloadItem::DownloadState kTerminalStates[] = { |
| 503 DownloadItem::CANCELLED, |
| 504 DownloadItem::INTERRUPTED, |
| 505 DownloadItem::COMPLETE, |
| 506 }; |
| 507 |
| 508 static const DownloadItem::DownloadState kInProgressStates[] = { |
| 509 DownloadItem::IN_PROGRESS, |
| 510 }; |
| 511 |
| 512 // Get History Information. |
| 513 class DownloadsHistoryDataCollector { |
| 514 public: |
| 515 explicit DownloadsHistoryDataCollector(int64 download_db_handle, |
| 516 DownloadManager* manager) |
| 517 : result_valid_(false), |
| 518 download_db_handle_(download_db_handle) { |
| 519 DCHECK(manager); |
| 520 HistoryService* hs = |
| 521 manager->profile()->GetHistoryService(Profile::EXPLICIT_ACCESS); |
| 522 DCHECK(hs); |
| 523 hs->QueryDownloads( |
| 524 &callback_consumer_, |
| 525 NewCallback(this, |
| 526 &DownloadsHistoryDataCollector::OnQueryDownloadsComplete)); |
| 527 |
| 528 // Cannot complete immediately because the history backend runs on a |
| 529 // separate thread, so we can assume that the RunMessageLoop below will |
| 530 // be exited by the Quit in OnQueryDownloadsComplete. |
| 531 ui_test_utils::RunMessageLoop(); |
| 532 } |
| 533 |
| 534 bool GetDownloadsHistoryEntry(DownloadHistoryInfo* result) { |
| 535 DCHECK(result); |
| 536 *result = result_; |
| 537 return result_valid_; |
| 538 } |
| 539 |
| 540 private: |
| 541 void OnQueryDownloadsComplete( |
| 542 std::vector<DownloadHistoryInfo>* entries) { |
| 543 result_valid_ = false; |
| 544 for (std::vector<DownloadHistoryInfo>::const_iterator it = entries->begin(); |
| 545 it != entries->end(); ++it) { |
| 546 if (it->db_handle == download_db_handle_) { |
| 547 result_ = *it; |
| 548 result_valid_ = true; |
| 549 break; |
| 550 } |
| 551 } |
| 552 MessageLoopForUI::current()->Quit(); |
| 553 } |
| 554 |
| 555 DownloadHistoryInfo result_; |
| 556 bool result_valid_; |
| 557 int64 download_db_handle_; |
| 558 CancelableRequestConsumer callback_consumer_; |
| 559 |
| 560 DISALLOW_COPY_AND_ASSIGN(DownloadsHistoryDataCollector); |
| 561 }; |
| 562 |
| 563 // Mock that simulates a permissions dialog where the user denies |
| 564 // permission to install. TODO(skerner): This could be shared with |
| 565 // extensions tests. Find a common place for this class. |
| 566 class MockAbortExtensionInstallUI : public ExtensionInstallUI { |
| 567 public: |
| 568 MockAbortExtensionInstallUI() : ExtensionInstallUI(NULL) {} |
| 569 |
| 570 // Simulate a user abort on an extension installation. |
| 571 virtual void ConfirmInstall(Delegate* delegate, const Extension* extension) { |
| 572 delegate->InstallUIAbort(true); |
| 573 MessageLoopForUI::current()->Quit(); |
| 574 } |
| 575 |
| 576 virtual void OnInstallSuccess(const Extension* extension, SkBitmap* icon) {} |
| 577 virtual void OnInstallFailure(const std::string& error) {} |
| 578 }; |
| 579 |
| 580 // Mock that simulates a permissions dialog where the user allows |
| 581 // installation. |
| 582 class MockAutoConfirmExtensionInstallUI : public ExtensionInstallUI { |
| 583 public: |
| 584 explicit MockAutoConfirmExtensionInstallUI(Profile* profile) : |
| 585 ExtensionInstallUI(profile) {} |
| 586 |
| 587 // Proceed without confirmation prompt. |
| 588 virtual void ConfirmInstall(Delegate* delegate, const Extension* extension) { |
| 589 delegate->InstallUIProceed(); |
| 590 } |
| 591 |
| 592 virtual void OnInstallSuccess(const Extension* extension, SkBitmap* icon) {} |
| 593 virtual void OnInstallFailure(const std::string& error) {} |
| 594 }; |
| 595 |
| 596 // While any objects of this class exists, all DownloadItems added to the |
| 597 // specified download manager will have opening mocked out. |
| 598 class MockDownloadOpeningObserver : public DownloadManager::Observer { |
| 599 public: |
| 600 explicit MockDownloadOpeningObserver(DownloadManager* manager) |
| 601 : download_manager_(manager) { |
| 602 download_manager_->AddObserver(this); |
| 603 } |
| 604 |
| 605 ~MockDownloadOpeningObserver() { |
| 606 download_manager_->RemoveObserver(this); |
| 607 } |
| 608 |
| 609 // DownloadManager::Observer |
| 610 virtual void ModelChanged() { |
| 611 std::vector<DownloadItem*> downloads; |
| 612 download_manager_->SearchDownloads(string16(), &downloads); |
| 613 |
| 614 for (std::vector<DownloadItem*>::iterator it = downloads.begin(); |
| 615 it != downloads.end(); ++it) { |
| 616 (*it)->TestMockDownloadOpen(); |
| 617 } |
| 618 } |
| 619 |
| 620 private: |
| 621 DownloadManager* download_manager_; |
| 622 |
| 623 DISALLOW_COPY_AND_ASSIGN(MockDownloadOpeningObserver); |
| 624 }; |
| 625 |
| 626 // No-ops select files from the download manager. |
| 627 // Returns a cancel callback on destruction. |
| 628 class MockSelectFileDialog : public SelectFileDialog { |
| 629 public: |
| 630 explicit MockSelectFileDialog(SelectFileDialog::Listener* listener) |
| 631 : SelectFileDialog(listener), |
| 632 listener_(listener), |
| 633 params_(NULL), |
| 634 active_(false) {} |
| 635 ~MockSelectFileDialog() { |
| 636 if (listener_) |
| 637 listener_->FileSelectionCanceled(params_); |
| 638 } |
| 639 |
| 640 static MockSelectFileDialog* Create(Listener* listener) { |
| 641 return new MockSelectFileDialog(listener); |
| 642 } |
| 643 |
| 644 virtual bool IsRunning(gfx::NativeWindow owning_window) const { |
| 645 return active_; |
| 646 } |
| 647 |
| 648 virtual void ListenerDestroyed() { |
| 649 listener_ = NULL; |
| 650 } |
| 651 |
| 652 virtual void SelectFileImpl(SelectFileDialog::Type type, |
| 653 const string16& title, |
| 654 const FilePath& default_path, |
| 655 const FileTypeInfo* file_types, |
| 656 int file_type_index, |
| 657 const FilePath::StringType& default_extension, |
| 658 gfx::NativeWindow owning_window, |
| 659 void *params) { |
| 660 active_ = true; |
| 661 params_ = params; |
| 662 } |
| 663 private: |
| 664 SelectFileDialog::Listener* listener_; |
| 665 void* params_; |
| 666 bool active_; |
| 667 }; |
| 668 |
| 669 } // namespace |
| 670 |
| 671 // Not in anonymous namespace so that friend class from DownloadManager |
| 672 // can target it. |
| 493 class DownloadTest : public InProcessBrowserTest { | 673 class DownloadTest : public InProcessBrowserTest { |
| 494 public: | 674 public: |
| 495 enum SelectExpectation { | 675 enum SelectExpectation { |
| 496 EXPECT_NO_SELECT_DIALOG = -1, | 676 EXPECT_NO_SELECT_DIALOG = -1, |
| 497 EXPECT_NOTHING, | 677 EXPECT_NOTHING, |
| 498 EXPECT_SELECT_DIALOG | 678 EXPECT_SELECT_DIALOG |
| 499 }; | 679 }; |
| 500 | 680 |
| 501 DownloadTest() { | 681 DownloadTest() { |
| 502 EnableDOMAutomation(); | 682 EnableDOMAutomation(); |
| (...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 559 if (!downloads_directory_.CreateUniqueTempDir()) | 739 if (!downloads_directory_.CreateUniqueTempDir()) |
| 560 return false; | 740 return false; |
| 561 | 741 |
| 562 browser->profile()->GetPrefs()->SetFilePath( | 742 browser->profile()->GetPrefs()->SetFilePath( |
| 563 prefs::kDownloadDefaultDirectory, | 743 prefs::kDownloadDefaultDirectory, |
| 564 downloads_directory_.path()); | 744 downloads_directory_.path()); |
| 565 | 745 |
| 566 return true; | 746 return true; |
| 567 } | 747 } |
| 568 | 748 |
| 749 // For tests that want to test system reaction to files |
| 750 // going away underneath them. |
| 751 void DeleteDownloadsDirectory() { |
| 752 EXPECT_TRUE(downloads_directory_.Delete()); |
| 753 } |
| 754 |
| 569 DownloadPrefs* GetDownloadPrefs(Browser* browser) { | 755 DownloadPrefs* GetDownloadPrefs(Browser* browser) { |
| 570 return browser->profile()->GetDownloadManager()->download_prefs(); | 756 return browser->profile()->GetDownloadManager()->download_prefs(); |
| 571 } | 757 } |
| 572 | 758 |
| 573 FilePath GetDownloadDirectory(Browser* browser) { | 759 FilePath GetDownloadDirectory(Browser* browser) { |
| 574 DownloadManager* download_mananger = | 760 DownloadManager* download_mananger = |
| 575 browser->profile()->GetDownloadManager(); | 761 browser->profile()->GetDownloadManager(); |
| 576 return download_mananger->download_prefs()->download_path(); | 762 return download_mananger->download_prefs()->download_path(); |
| 577 } | 763 } |
| 578 | 764 |
| 579 // Create a DownloadsObserver that will wait for the | 765 // Create a DownloadsObserver that will wait for the |
| 580 // specified number of downloads to finish. | 766 // specified number of downloads to finish. |
| 581 DownloadsObserver* CreateWaiter(Browser* browser, int num_downloads) { | 767 DownloadsObserver* CreateWaiter(Browser* browser, int num_downloads) { |
| 582 DownloadManager* download_manager = | 768 DownloadManager* download_manager = |
| 583 browser->profile()->GetDownloadManager(); | 769 browser->profile()->GetDownloadManager(); |
| 584 return new DownloadsObserver( | 770 return new DownloadsObserver( |
| 585 download_manager, num_downloads, | 771 download_manager, num_downloads, |
| 586 DownloadItem::COMPLETE, // Really done | 772 DownloadsObserver::StateSet( |
| 587 false, // Bail on select file | 773 kTerminalStates, kTerminalStates + arraysize(kTerminalStates)), |
| 774 true, // Bail on select file |
| 588 ON_DANGEROUS_DOWNLOAD_FAIL); | 775 ON_DANGEROUS_DOWNLOAD_FAIL); |
| 589 } | 776 } |
| 590 | 777 |
| 591 // Create a DownloadsObserver that will wait for the | 778 // Create a DownloadsObserver that will wait for the |
| 779 // specified number of downloads to finish, and is |
| 780 // ok with dangerous downloads. Note that use of this |
| 781 // waiter is conditional on accepting the dangerous download. |
| 782 DownloadsObserver* CreateDangerousWaiter( |
| 783 Browser* browser, int num_downloads) { |
| 784 DownloadManager* download_manager = |
| 785 browser->profile()->GetDownloadManager(); |
| 786 return new DownloadsObserver( |
| 787 download_manager, num_downloads, |
| 788 DownloadsObserver::StateSet( |
| 789 kTerminalStates, kTerminalStates + arraysize(kTerminalStates)), |
| 790 true, // Bail on select file |
| 791 ON_DANGEROUS_DOWNLOAD_IGNORE); |
| 792 } |
| 793 |
| 794 // Create a DownloadsObserver that will wait for the |
| 592 // specified number of downloads to start. | 795 // specified number of downloads to start. |
| 593 DownloadsObserver* CreateInProgressWaiter(Browser* browser, | 796 DownloadsObserver* CreateInProgressWaiter(Browser* browser, |
| 594 int num_downloads) { | 797 int num_downloads) { |
| 595 DownloadManager* download_manager = | 798 DownloadManager* download_manager = |
| 596 browser->profile()->GetDownloadManager(); | 799 browser->profile()->GetDownloadManager(); |
| 597 return new DownloadsObserver( | 800 return new DownloadsObserver( |
| 598 download_manager, num_downloads, | 801 download_manager, num_downloads, |
| 599 DownloadItem::IN_PROGRESS, // Has started | 802 DownloadsObserver::StateSet( |
| 803 kInProgressStates, |
| 804 kInProgressStates + arraysize(kInProgressStates)), |
| 600 true, // Bail on select file | 805 true, // Bail on select file |
| 601 ON_DANGEROUS_DOWNLOAD_FAIL); | 806 ON_DANGEROUS_DOWNLOAD_IGNORE); |
| 602 } | 807 } |
| 603 | 808 |
| 604 // Create a DownloadsObserver that will wait for the | 809 // Create a DownloadsObserver that will wait for the |
| 605 // specified number of downloads to finish, or for | 810 // specified number of downloads to finish, or for |
| 606 // a dangerous download warning to be shown. | 811 // a dangerous download warning to be shown. |
| 607 DownloadsObserver* DangerousInstallWaiter( | 812 DownloadsObserver* DangerousInstallWaiter( |
| 608 Browser* browser, | 813 Browser* browser, |
| 609 int num_downloads, | 814 int num_downloads, |
| 610 DownloadItem::DownloadState final_state, | 815 DownloadItem::DownloadState final_state, |
| 611 DangerousDownloadAction dangerous_download_action) { | 816 DangerousDownloadAction dangerous_download_action) { |
| 817 DownloadsObserver::StateSet states; |
| 818 states.insert(final_state); |
| 612 DownloadManager* download_manager = | 819 DownloadManager* download_manager = |
| 613 browser->profile()->GetDownloadManager(); | 820 browser->profile()->GetDownloadManager(); |
| 614 return new DownloadsObserver( | 821 return new DownloadsObserver( |
| 615 download_manager, num_downloads, | 822 download_manager, num_downloads, |
| 616 final_state, | 823 states, |
| 617 true, // Bail on select file | 824 true, // Bail on select file |
| 618 dangerous_download_action); | 825 dangerous_download_action); |
| 619 } | 826 } |
| 620 | 827 |
| 621 // Download |url|, then wait for the download to finish. | 828 // Download |url|, then wait for the download to finish. |
| 622 // |disposition| indicates where the navigation occurs (current tab, new | 829 // |disposition| indicates where the navigation occurs (current tab, new |
| 623 // foreground tab, etc). | 830 // foreground tab, etc). |
| 624 // |expectation| indicates whether or not a Select File dialog should be | 831 // |expectation| indicates whether or not a Select File dialog should be |
| 625 // open when the download is finished, or if we don't care. | 832 // open when the download is finished, or if we don't care. |
| 626 // If the dialog appears, the routine exits. The only effect |expectation| | 833 // If the dialog appears, the routine exits. The only effect |expectation| |
| (...skipping 28 matching lines...) Expand all Loading... |
| 655 const GURL& url, | 862 const GURL& url, |
| 656 SelectExpectation expectation) { | 863 SelectExpectation expectation) { |
| 657 DownloadAndWaitWithDisposition( | 864 DownloadAndWaitWithDisposition( |
| 658 browser, | 865 browser, |
| 659 url, | 866 url, |
| 660 CURRENT_TAB, | 867 CURRENT_TAB, |
| 661 expectation, | 868 expectation, |
| 662 ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION); | 869 ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION); |
| 663 } | 870 } |
| 664 | 871 |
| 872 // Mock or unmock the select file dialog for the download manager |
| 873 // associated with the specified browser. |
| 874 void NoopSelectFileDialog(Browser* browser, bool mock) { |
| 875 if (mock) { |
| 876 scoped_refptr<SelectFileDialog> dialog( |
| 877 MockSelectFileDialog::Create( |
| 878 browser->profile()->GetDownloadManager())); |
| 879 browser->profile()->GetDownloadManager()->SetSelectFileDialog(dialog); |
| 880 } else { |
| 881 browser->profile()->GetDownloadManager()->SetSelectFileDialog(NULL); |
| 882 } |
| 883 } |
| 884 |
| 665 // Should only be called when the download is known to have finished | 885 // Should only be called when the download is known to have finished |
| 666 // (in error or not). | 886 // (in error or not). |
| 667 // Returning false indicates a failure of the function, and should be asserted | 887 // Returning false indicates a failure of the function, and should be asserted |
| 668 // in the caller. | 888 // in the caller. |
| 669 bool CheckDownload(Browser* browser, | 889 bool CheckDownload(Browser* browser, |
| 670 const FilePath& downloaded_filename, | 890 const FilePath& downloaded_filename, |
| 671 const FilePath& origin_filename) { | 891 const FilePath& origin_filename) { |
| 672 // Find the path to which the data will be downloaded. | 892 // Find the path to which the data will be downloaded. |
| 673 FilePath downloaded_file(DestinationFile(browser, downloaded_filename)); | 893 FilePath downloaded_file(DestinationFile(browser, downloaded_filename)); |
| 674 | 894 |
| (...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 761 if (!downloaded_path_exists) | 981 if (!downloaded_path_exists) |
| 762 return false; | 982 return false; |
| 763 | 983 |
| 764 // Delete the file we just downloaded. | 984 // Delete the file we just downloaded. |
| 765 EXPECT_TRUE(file_util::DieFileDie(download_path, true)); | 985 EXPECT_TRUE(file_util::DieFileDie(download_path, true)); |
| 766 EXPECT_FALSE(file_util::PathExists(download_path)); | 986 EXPECT_FALSE(file_util::PathExists(download_path)); |
| 767 | 987 |
| 768 return true; | 988 return true; |
| 769 } | 989 } |
| 770 | 990 |
| 771 void GetDownloads(Browser* browser, std::vector<DownloadItem*>* downloads) { | 991 void GetPersistentDownloads(Browser* browser, |
| 992 std::vector<DownloadItem*>* downloads) { |
| 993 DCHECK(downloads); |
| 994 downloads->clear(); |
| 995 DownloadManager* manager = browser->profile()->GetDownloadManager(); |
| 996 manager->SearchDownloads(string16(), downloads); |
| 997 } |
| 998 |
| 999 void GetInProgressDownloads(Browser* browser, |
| 1000 std::vector<DownloadItem*>* downloads) { |
| 1001 downloads->clear(); |
| 772 DCHECK(downloads); | 1002 DCHECK(downloads); |
| 773 DownloadManager* manager = browser->profile()->GetDownloadManager(); | 1003 DownloadManager* manager = browser->profile()->GetDownloadManager(); |
| 774 manager->SearchDownloads(string16(), downloads); | 1004 manager->GetInProgressDownloads(downloads); |
| 775 } | 1005 } |
| 776 | 1006 |
| 777 // Check that the download UI (shelf on non-chromeos or panel on chromeos) | 1007 // Check that the download UI (shelf on non-chromeos or panel on chromeos) |
| 778 // is visible or not as expected. Additionally, check that the filename | 1008 // is visible or not as expected. Additionally, check that the filename |
| 779 // is present in the UI (currently only on chromeos). | 1009 // is present in the UI (currently only on chromeos). |
| 780 void CheckDownloadUI(Browser* browser, bool expected_non_cros, | 1010 void CheckDownloadUI(Browser* browser, bool expected_non_cros, |
| 781 bool expected_cros, const FilePath& filename) { | 1011 bool expected_cros, const FilePath& filename) { |
| 782 #if defined(OS_CHROMEOS) | 1012 #if defined(OS_CHROMEOS) |
| 783 Browser* popup = ActiveDownloadsUI::GetPopup(); | 1013 Browser* popup = ActiveDownloadsUI::GetPopup(); |
| 784 EXPECT_EQ(expected_cros, popup != NULL); | 1014 EXPECT_EQ(expected_cros, popup != NULL); |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 816 } | 1046 } |
| 817 | 1047 |
| 818 private: | 1048 private: |
| 819 // Location of the test data. | 1049 // Location of the test data. |
| 820 FilePath test_dir_; | 1050 FilePath test_dir_; |
| 821 | 1051 |
| 822 // Location of the downloads directory for these tests | 1052 // Location of the downloads directory for these tests |
| 823 ScopedTempDir downloads_directory_; | 1053 ScopedTempDir downloads_directory_; |
| 824 }; | 1054 }; |
| 825 | 1055 |
| 826 // Get History Information. | |
| 827 class DownloadsHistoryDataCollector { | |
| 828 public: | |
| 829 explicit DownloadsHistoryDataCollector(int64 download_db_handle, | |
| 830 DownloadManager* manager) | |
| 831 : result_valid_(false), | |
| 832 download_db_handle_(download_db_handle) { | |
| 833 HistoryService* hs = | |
| 834 manager->profile()->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(DownloadHistoryInfo* result) { | |
| 848 DCHECK(result); | |
| 849 *result = result_; | |
| 850 return result_valid_; | |
| 851 } | |
| 852 | |
| 853 private: | |
| 854 void OnQueryDownloadsComplete( | |
| 855 std::vector<DownloadHistoryInfo>* entries) { | |
| 856 result_valid_ = false; | |
| 857 for (std::vector<DownloadHistoryInfo>::const_iterator it = entries->begin(); | |
| 858 it != entries->end(); ++it) { | |
| 859 if (it->db_handle == download_db_handle_) { | |
| 860 result_ = *it; | |
| 861 result_valid_ = true; | |
| 862 } | |
| 863 } | |
| 864 MessageLoopForUI::current()->Quit(); | |
| 865 } | |
| 866 | |
| 867 DownloadHistoryInfo result_; | |
| 868 bool result_valid_; | |
| 869 int64 download_db_handle_; | |
| 870 CancelableRequestConsumer callback_consumer_; | |
| 871 | |
| 872 DISALLOW_COPY_AND_ASSIGN(DownloadsHistoryDataCollector); | |
| 873 }; | |
| 874 | |
| 875 // Mock that simulates a permissions dialog where the user denies | |
| 876 // permission to install. TODO(skerner): This could be shared with | |
| 877 // extensions tests. Find a common place for this class. | |
| 878 class MockAbortExtensionInstallUI : public ExtensionInstallUI { | |
| 879 public: | |
| 880 MockAbortExtensionInstallUI() : ExtensionInstallUI(NULL) {} | |
| 881 | |
| 882 // Simulate a user abort on an extension installation. | |
| 883 virtual void ConfirmInstall(Delegate* delegate, const Extension* extension) { | |
| 884 delegate->InstallUIAbort(true); | |
| 885 MessageLoopForUI::current()->Quit(); | |
| 886 } | |
| 887 | |
| 888 virtual void OnInstallSuccess(const Extension* extension, SkBitmap* icon) {} | |
| 889 virtual void OnInstallFailure(const std::string& error) {} | |
| 890 }; | |
| 891 | |
| 892 // Mock that simulates a permissions dialog where the user allows | |
| 893 // installation. | |
| 894 class MockAutoConfirmExtensionInstallUI : public ExtensionInstallUI { | |
| 895 public: | |
| 896 explicit MockAutoConfirmExtensionInstallUI(Profile* profile) : | |
| 897 ExtensionInstallUI(profile) {} | |
| 898 | |
| 899 // Proceed without confirmation prompt. | |
| 900 virtual void ConfirmInstall(Delegate* delegate, const Extension* extension) { | |
| 901 delegate->InstallUIProceed(); | |
| 902 } | |
| 903 | |
| 904 virtual void OnInstallSuccess(const Extension* extension, SkBitmap* icon) {} | |
| 905 virtual void OnInstallFailure(const std::string& error) {} | |
| 906 }; | |
| 907 | |
| 908 } // namespace | |
| 909 | |
| 910 // While an object of this class exists, it will mock out download | |
| 911 // opening for all downloads created on the specified download manager. | |
| 912 class MockDownloadOpeningObserver : public DownloadManager::Observer { | |
| 913 public: | |
| 914 explicit MockDownloadOpeningObserver(DownloadManager* manager) | |
| 915 : download_manager_(manager) { | |
| 916 download_manager_->AddObserver(this); | |
| 917 } | |
| 918 | |
| 919 ~MockDownloadOpeningObserver() { | |
| 920 download_manager_->RemoveObserver(this); | |
| 921 } | |
| 922 | |
| 923 // DownloadManager::Observer | |
| 924 virtual void ModelChanged() { | |
| 925 std::vector<DownloadItem*> downloads; | |
| 926 download_manager_->SearchDownloads(string16(), &downloads); | |
| 927 | |
| 928 for (std::vector<DownloadItem*>::iterator it = downloads.begin(); | |
| 929 it != downloads.end(); ++it) { | |
| 930 (*it)->TestMockDownloadOpen(); | |
| 931 } | |
| 932 } | |
| 933 | |
| 934 private: | |
| 935 DownloadManager* download_manager_; | |
| 936 | |
| 937 DISALLOW_COPY_AND_ASSIGN(MockDownloadOpeningObserver); | |
| 938 }; | |
| 939 | |
| 940 // NOTES: | 1056 // NOTES: |
| 941 // | 1057 // |
| 942 // Files for these tests are found in DIR_TEST_DATA (currently | 1058 // Files for these tests are found in DIR_TEST_DATA (currently |
| 943 // "chrome\test\data\", see chrome_paths.cc). | 1059 // "chrome\test\data\", see chrome_paths.cc). |
| 944 // Mock responses have extension .mock-http-headers appended to the file name. | 1060 // Mock responses have extension .mock-http-headers appended to the file name. |
| 945 | 1061 |
| 946 // Download a file due to the associated MIME type. | 1062 // Download a file due to the associated MIME type. |
| 947 IN_PROC_BROWSER_TEST_F(DownloadTest, DownloadMimeType) { | 1063 IN_PROC_BROWSER_TEST_F(DownloadTest, DownloadMimeType) { |
| 948 ASSERT_TRUE(InitialSetup(false)); | 1064 ASSERT_TRUE(InitialSetup(false)); |
| 949 FilePath file(FILE_PATH_LITERAL("download-test1.lib")); | 1065 FilePath file(FILE_PATH_LITERAL("download-test1.lib")); |
| (...skipping 23 matching lines...) Expand all Loading... |
| 973 // as CheckDownload will delete the output file. | 1089 // as CheckDownload will delete the output file. |
| 974 EXPECT_EQ(1, browser()->tab_count()); | 1090 EXPECT_EQ(1, browser()->tab_count()); |
| 975 FilePath downloaded_file(DestinationFile(browser(), file)); | 1091 FilePath downloaded_file(DestinationFile(browser(), file)); |
| 976 if (file_util::VolumeSupportsADS(downloaded_file)) | 1092 if (file_util::VolumeSupportsADS(downloaded_file)) |
| 977 EXPECT_TRUE(file_util::HasInternetZoneIdentifier(downloaded_file)); | 1093 EXPECT_TRUE(file_util::HasInternetZoneIdentifier(downloaded_file)); |
| 978 CheckDownload(browser(), file, file); | 1094 CheckDownload(browser(), file, file); |
| 979 CheckDownloadUI(browser(), true, true, file); | 1095 CheckDownloadUI(browser(), true, true, file); |
| 980 } | 1096 } |
| 981 #endif | 1097 #endif |
| 982 | 1098 |
| 983 // Put up a Select File dialog when the file is downloaded, due to its MIME | 1099 // Put up a Select File dialog when the file is downloaded, due to |
| 984 // type. | 1100 // prompt_for_download==true argument to InitialSetup(). |
| 985 // | 1101 // Confirm that we can cancel the download in that state. |
| 986 // This test runs correctly, but leaves behind turds in the test user's | 1102 IN_PROC_BROWSER_TEST_F(DownloadTest, CancelFromFileSelection) { |
| 987 // download directory because of http://crbug.com/62099. No big loss; it | |
| 988 // was primarily confirming DownloadsObserver wait on select file dialog | |
| 989 // functionality anyway. | |
| 990 IN_PROC_BROWSER_TEST_F(DownloadTest, DISABLED_DownloadMimeTypeSelect) { | |
| 991 ASSERT_TRUE(InitialSetup(true)); | 1103 ASSERT_TRUE(InitialSetup(true)); |
| 992 FilePath file(FILE_PATH_LITERAL("download-test1.lib")); | 1104 FilePath file(FILE_PATH_LITERAL("download-test1.lib")); |
| 993 GURL url(URLRequestMockHTTPJob::GetMockUrl(file)); | 1105 GURL url(URLRequestMockHTTPJob::GetMockUrl(file)); |
| 994 | 1106 |
| 995 // Download the file and wait. We expect the Select File dialog to appear | 1107 // Setup select file interposition. |
| 996 // due to the MIME type. | 1108 NoopSelectFileDialog(browser(), true); |
| 1109 |
| 1110 // Download the file and wait. We expect the Select File dialog to appear. |
| 997 DownloadAndWait(browser(), url, EXPECT_SELECT_DIALOG); | 1111 DownloadAndWait(browser(), url, EXPECT_SELECT_DIALOG); |
| 998 | 1112 |
| 1113 std::vector<DownloadItem*> active_downloads, history_downloads; |
| 1114 GetInProgressDownloads(browser(), &active_downloads); |
| 1115 ASSERT_EQ(1u, active_downloads.size()); |
| 1116 EXPECT_EQ(DownloadItem::IN_PROGRESS, active_downloads[0]->state()); |
| 1117 GetPersistentDownloads(browser(), &history_downloads); |
| 1118 EXPECT_EQ(0u, history_downloads.size()); |
| 1119 |
| 1120 // This should remove the download as it hasn't yet been entered into |
| 1121 // the history. |
| 1122 active_downloads[0]->Cancel(); |
| 1123 |
| 1124 GetInProgressDownloads(browser(), &active_downloads); |
| 1125 EXPECT_EQ(0u, active_downloads.size()); |
| 1126 GetPersistentDownloads(browser(), &history_downloads); |
| 1127 EXPECT_EQ(0u, history_downloads.size()); |
| 1128 |
| 999 // Check state. | 1129 // Check state. |
| 1000 EXPECT_EQ(1, browser()->tab_count()); | 1130 EXPECT_EQ(1, browser()->tab_count()); |
| 1001 // Since we exited while the Select File dialog was visible, there should not | 1131 // Since we exited while the Select File dialog was visible, there should not |
| 1132 // be anything in the download shelf and so it should not be visible. |
| 1133 CheckDownloadUI(browser(), false, false, FilePath()); |
| 1134 } |
| 1135 |
| 1136 // Put up a Select File dialog when the file is downloaded, due to |
| 1137 // prompt_for_download==true argument to InitialSetup(). |
| 1138 // Confirm that we can remove the download in that state. |
| 1139 IN_PROC_BROWSER_TEST_F(DownloadTest, RemoveFromFileSelection) { |
| 1140 ASSERT_TRUE(InitialSetup(true)); |
| 1141 FilePath file(FILE_PATH_LITERAL("download-test1.lib")); |
| 1142 GURL url(URLRequestMockHTTPJob::GetMockUrl(file)); |
| 1143 |
| 1144 // Setup select file interposition. |
| 1145 NoopSelectFileDialog(browser(), true); |
| 1146 |
| 1147 // Download the file and wait. We expect the Select File dialog to appear. |
| 1148 DownloadAndWait(browser(), url, EXPECT_SELECT_DIALOG); |
| 1149 |
| 1150 std::vector<DownloadItem*> active_downloads, history_downloads; |
| 1151 GetInProgressDownloads(browser(), &active_downloads); |
| 1152 ASSERT_EQ(1u, active_downloads.size()); |
| 1153 EXPECT_EQ(DownloadItem::IN_PROGRESS, active_downloads[0]->state()); |
| 1154 GetPersistentDownloads(browser(), &history_downloads); |
| 1155 EXPECT_EQ(0u, history_downloads.size()); |
| 1156 |
| 1157 // Confirm the file can be successfully removed from the select file |
| 1158 // dialog blocked state. |
| 1159 active_downloads[0]->Remove(); |
| 1160 |
| 1161 GetInProgressDownloads(browser(), &active_downloads); |
| 1162 EXPECT_EQ(0u, active_downloads.size()); |
| 1163 GetPersistentDownloads(browser(), &history_downloads); |
| 1164 EXPECT_EQ(0u, history_downloads.size()); |
| 1165 |
| 1166 EXPECT_EQ(1, browser()->tab_count()); |
| 1167 // Since we exited while the Select File dialog was visible, there should not |
| 1168 // be anything in the download shelf and so it should not be visible. |
| 1169 CheckDownloadUI(browser(), false, false, FilePath()); |
| 1170 } |
| 1171 |
| 1172 // Put up a Select File dialog when the file is downloaded, due to |
| 1173 // prompt_for_download==true argument to InitialSetup(). |
| 1174 // Confirm that an error coming in from the network works properly |
| 1175 // when in that state. |
| 1176 IN_PROC_BROWSER_TEST_F(DownloadTest, InterruptFromFileSelection) { |
| 1177 ASSERT_TRUE(InitialSetup(true)); |
| 1178 GURL url(URLRequestSlowDownloadJob::kKnownSizeUrl); |
| 1179 |
| 1180 // Download the file and wait. We expect the Select File dialog to appear. |
| 1181 DownloadAndWait(browser(), url, EXPECT_SELECT_DIALOG); |
| 1182 |
| 1183 std::vector<DownloadItem*> active_downloads, history_downloads; |
| 1184 GetInProgressDownloads(browser(), &active_downloads); |
| 1185 ASSERT_EQ(1u, active_downloads.size()); |
| 1186 EXPECT_EQ(DownloadItem::IN_PROGRESS, active_downloads[0]->state()); |
| 1187 GetPersistentDownloads(browser(), &history_downloads); |
| 1188 EXPECT_EQ(0u, history_downloads.size()); |
| 1189 |
| 1190 // Complete the download with error. |
| 1191 GURL error_url(URLRequestSlowDownloadJob::kErrorFinishDownloadUrl); |
| 1192 ui_test_utils::NavigateToURL(browser(), error_url); |
| 1193 MessageLoopForUI::current()->RunAllPending(); |
| 1194 |
| 1195 // Confirm that a download error before entry into history |
| 1196 // deletes the download. |
| 1197 GetInProgressDownloads(browser(), &active_downloads); |
| 1198 EXPECT_EQ(0u, active_downloads.size()); |
| 1199 GetPersistentDownloads(browser(), &history_downloads); |
| 1200 EXPECT_EQ(0u, history_downloads.size()); |
| 1201 |
| 1202 // Check state. |
| 1203 EXPECT_EQ(1, browser()->tab_count()); |
| 1204 // Since we exited while the Select File dialog was visible, there should not |
| 1002 // be anything in the download shelf and so it should not be visible. | 1205 // be anything in the download shelf and so it should not be visible. |
| 1003 CheckDownloadUI(browser(), false, false, FilePath()); | 1206 CheckDownloadUI(browser(), false, false, FilePath()); |
| 1004 } | 1207 } |
| 1005 | 1208 |
| 1006 // Access a file with a viewable mime-type, verify that a download | 1209 // Access a file with a viewable mime-type, verify that a download |
| 1007 // did not initiate. | 1210 // did not initiate. |
| 1008 IN_PROC_BROWSER_TEST_F(DownloadTest, NoDownload) { | 1211 IN_PROC_BROWSER_TEST_F(DownloadTest, NoDownload) { |
| 1009 ASSERT_TRUE(InitialSetup(false)); | 1212 ASSERT_TRUE(InitialSetup(false)); |
| 1010 FilePath file(FILE_PATH_LITERAL("download-test2.html")); | 1213 FilePath file(FILE_PATH_LITERAL("download-test2.html")); |
| 1011 GURL url(URLRequestMockHTTPJob::GetMockUrl(file)); | 1214 GURL url(URLRequestMockHTTPJob::GetMockUrl(file)); |
| (...skipping 412 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1424 | 1627 |
| 1425 // Create a download, wait until it's started, and confirm | 1628 // Create a download, wait until it's started, and confirm |
| 1426 // we're in the expected state. | 1629 // we're in the expected state. |
| 1427 scoped_ptr<DownloadsObserver> observer( | 1630 scoped_ptr<DownloadsObserver> observer( |
| 1428 CreateInProgressWaiter(browser(), 1)); | 1631 CreateInProgressWaiter(browser(), 1)); |
| 1429 ui_test_utils::NavigateToURL( | 1632 ui_test_utils::NavigateToURL( |
| 1430 browser(), GURL(URLRequestSlowDownloadJob::kUnknownSizeUrl)); | 1633 browser(), GURL(URLRequestSlowDownloadJob::kUnknownSizeUrl)); |
| 1431 observer->WaitForFinished(); | 1634 observer->WaitForFinished(); |
| 1432 | 1635 |
| 1433 std::vector<DownloadItem*> downloads; | 1636 std::vector<DownloadItem*> downloads; |
| 1434 browser()->profile()->GetDownloadManager()->SearchDownloads( | 1637 GetPersistentDownloads(browser(), &downloads); |
| 1435 string16(), &downloads); | |
| 1436 ASSERT_EQ(1u, downloads.size()); | 1638 ASSERT_EQ(1u, downloads.size()); |
| 1437 ASSERT_EQ(DownloadItem::IN_PROGRESS, downloads[0]->state()); | 1639 ASSERT_EQ(DownloadItem::IN_PROGRESS, downloads[0]->state()); |
| 1438 CheckDownloadUI(browser(), true, true, FilePath()); | 1640 CheckDownloadUI(browser(), true, true, FilePath()); |
| 1439 | 1641 |
| 1440 // Cancel the download and wait for download system quiesce. | 1642 // Cancel the download and wait for download system quiesce. |
| 1441 downloads[0]->Delete(DownloadItem::DELETE_DUE_TO_USER_DISCARD); | 1643 downloads[0]->Delete(DownloadItem::DELETE_DUE_TO_USER_DISCARD); |
| 1442 scoped_refptr<DownloadsFlushObserver> flush_observer( | 1644 scoped_refptr<DownloadsFlushObserver> flush_observer( |
| 1443 new DownloadsFlushObserver(browser()->profile()->GetDownloadManager())); | 1645 new DownloadsFlushObserver(browser()->profile()->GetDownloadManager())); |
| 1444 flush_observer->WaitForFlush(); | 1646 flush_observer->WaitForFlush(); |
| 1445 | 1647 |
| 1446 // Get the important info from other threads and check it. | 1648 // Get the important info from other threads and check it. |
| 1447 scoped_refptr<CancelTestDataCollector> info(new CancelTestDataCollector()); | 1649 scoped_refptr<CancelTestDataCollector> info(new CancelTestDataCollector()); |
| 1448 info->WaitForDataCollected(); | 1650 info->WaitForDataCollected(); |
| 1449 EXPECT_EQ(0, info->rdh_pending_requests()); | 1651 EXPECT_EQ(0, info->rdh_pending_requests()); |
| 1450 EXPECT_EQ(0, info->dfm_pending_downloads()); | 1652 EXPECT_EQ(0, info->dfm_pending_downloads()); |
| 1451 | 1653 |
| 1452 // Using "DownloadItem::Remove" follows the discard dangerous download path, | 1654 // Using "DownloadItem::Remove" follows the discard dangerous download path, |
| 1453 // which completely removes the browser from the shelf and closes the shelf | 1655 // which completely removes the browser from the shelf and closes the shelf |
| 1454 // if it was there. Download panel stays open on ChromeOS. | 1656 // if it was there. Download panel stays open on ChromeOS. |
| 1455 CheckDownloadUI(browser(), false, true, FilePath()); | 1657 CheckDownloadUI(browser(), false, true, FilePath()); |
| 1456 } | 1658 } |
| 1457 | 1659 |
| 1660 // Do a dangerous download and confirm that the download does |
| 1661 // not complete until user accept, and that all states are |
| 1662 // correct along the way. |
| 1663 IN_PROC_BROWSER_TEST_F(DownloadTest, DownloadDangerous) { |
| 1664 ASSERT_TRUE(InitialSetup(false)); |
| 1665 FilePath file(FILE_PATH_LITERAL("download-dangerous.jar")); |
| 1666 GURL url(URLRequestMockHTTPJob::GetMockUrl(file)); |
| 1667 |
| 1668 EXPECT_EQ(1, browser()->tab_count()); |
| 1669 |
| 1670 scoped_ptr<DownloadsObserver> observer( |
| 1671 CreateInProgressWaiter(browser(), 1)); |
| 1672 ui_test_utils::NavigateToURL(browser(), url); |
| 1673 observer->WaitForFinished(); |
| 1674 |
| 1675 // We should have one download, in history, and it should |
| 1676 // still be dangerous. |
| 1677 std::vector<DownloadItem*> downloads; |
| 1678 GetPersistentDownloads(browser(), &downloads); |
| 1679 ASSERT_EQ(1u, downloads.size()); |
| 1680 DownloadItem* download = downloads[0]; |
| 1681 EXPECT_EQ(DownloadItem::IN_PROGRESS, download->state()); |
| 1682 EXPECT_EQ(DownloadItem::DANGEROUS, download->safety_state()); |
| 1683 EXPECT_EQ(DownloadItem::DANGEROUS_FILE, download->GetDangerType()); |
| 1684 // In ChromeOS, popup will be up, but file name will be unrecognizable. |
| 1685 CheckDownloadUI(browser(), true, true, FilePath()); |
| 1686 |
| 1687 // See if accepting completes the download and changes the safety |
| 1688 // state. |
| 1689 scoped_ptr<DownloadsObserver> completion_observer( |
| 1690 CreateDangerousWaiter(browser(), 1)); |
| 1691 AcceptDangerousDownload(browser()->profile()->GetDownloadManager(), |
| 1692 download->id()); |
| 1693 completion_observer->WaitForFinished(); |
| 1694 |
| 1695 GetPersistentDownloads(browser(), &downloads); |
| 1696 ASSERT_EQ(1u, downloads.size()); |
| 1697 ASSERT_EQ(downloads[0], download); |
| 1698 EXPECT_EQ(DownloadItem::COMPLETE, download->state()); |
| 1699 EXPECT_EQ(DownloadItem::DANGEROUS_BUT_VALIDATED, download->safety_state()); |
| 1700 CheckDownloadUI(browser(), true, true, file); |
| 1701 } |
| 1702 |
| 1703 // Confirm that a dangerous download that gets a file error before |
| 1704 // completion ends in the right state (currently cancelled because file |
| 1705 // errors are non-resumable). Note that this is really testing |
| 1706 // to make sure errors from the final rename are propagated properly. |
| 1707 IN_PROC_BROWSER_TEST_F(DownloadTest, DownloadDangerousFileError) { |
| 1708 ASSERT_TRUE(InitialSetup(false)); |
| 1709 FilePath file(FILE_PATH_LITERAL("download-dangerous.jar")); |
| 1710 GURL url(URLRequestMockHTTPJob::GetMockUrl(file)); |
| 1711 |
| 1712 EXPECT_EQ(1, browser()->tab_count()); |
| 1713 |
| 1714 scoped_ptr<DownloadsObserver> observer( |
| 1715 CreateInProgressWaiter(browser(), 1)); |
| 1716 ui_test_utils::NavigateToURL(browser(), url); |
| 1717 observer->WaitForFinished(); |
| 1718 |
| 1719 // We should have one download, in history, and it should |
| 1720 // still be dangerous. |
| 1721 std::vector<DownloadItem*> downloads; |
| 1722 GetPersistentDownloads(browser(), &downloads); |
| 1723 ASSERT_EQ(1u, downloads.size()); |
| 1724 DownloadItem* download = downloads[0]; |
| 1725 EXPECT_EQ(DownloadItem::IN_PROGRESS, download->state()); |
| 1726 EXPECT_EQ(DownloadItem::DANGEROUS, download->safety_state()); |
| 1727 EXPECT_EQ(DownloadItem::DANGEROUS_FILE, download->GetDangerType()); |
| 1728 // In ChromeOS, popup will be up, but file name will be unrecognizable. |
| 1729 CheckDownloadUI(browser(), true, true, FilePath()); |
| 1730 |
| 1731 // Accept it after nuking the directory into which it's being downloaded; |
| 1732 // that should complete the download with an error. |
| 1733 DeleteDownloadsDirectory(); |
| 1734 scoped_ptr<DownloadsObserver> completion_observer( |
| 1735 CreateDangerousWaiter(browser(), 1)); |
| 1736 AcceptDangerousDownload(browser()->profile()->GetDownloadManager(), |
| 1737 download->id()); |
| 1738 completion_observer->WaitForFinished(); |
| 1739 |
| 1740 GetPersistentDownloads(browser(), &downloads); |
| 1741 ASSERT_EQ(1u, downloads.size()); |
| 1742 ASSERT_EQ(downloads[0], download); |
| 1743 // Persistent errors currently -> CANCELLED. |
| 1744 EXPECT_EQ(DownloadItem::CANCELLED, download->state()); |
| 1745 EXPECT_EQ(DownloadItem::DANGEROUS_BUT_VALIDATED, download->safety_state()); |
| 1746 // In ChromeOS, popup will still be up, but the file will have been |
| 1747 // deleted. |
| 1748 CheckDownloadUI(browser(), true, true, FilePath()); |
| 1749 } |
| 1750 |
| 1751 // Confirm that declining a dangerous download erases it from living memory. |
| 1752 IN_PROC_BROWSER_TEST_F(DownloadTest, DownloadDangerousDecline) { |
| 1753 ASSERT_TRUE(InitialSetup(false)); |
| 1754 FilePath file(FILE_PATH_LITERAL("download-dangerous.jar")); |
| 1755 GURL url(URLRequestMockHTTPJob::GetMockUrl(file)); |
| 1756 |
| 1757 EXPECT_EQ(1, browser()->tab_count()); |
| 1758 |
| 1759 scoped_ptr<DownloadsObserver> observer( |
| 1760 CreateInProgressWaiter(browser(), 1)); |
| 1761 ui_test_utils::NavigateToURL(browser(), url); |
| 1762 observer->WaitForFinished(); |
| 1763 |
| 1764 // We should have one download, in history, and it should |
| 1765 // still be dangerous. |
| 1766 std::vector<DownloadItem*> downloads; |
| 1767 GetPersistentDownloads(browser(), &downloads); |
| 1768 ASSERT_EQ(1u, downloads.size()); |
| 1769 DownloadItem* download = downloads[0]; |
| 1770 EXPECT_EQ(DownloadItem::IN_PROGRESS, download->state()); |
| 1771 EXPECT_EQ(DownloadItem::DANGEROUS, download->safety_state()); |
| 1772 EXPECT_EQ(DownloadItem::DANGEROUS_FILE, download->GetDangerType()); |
| 1773 CheckDownloadUI(browser(), true, true, FilePath()); |
| 1774 |
| 1775 DenyDangerousDownload(browser()->profile()->GetDownloadManager(), |
| 1776 download->id()); |
| 1777 |
| 1778 GetPersistentDownloads(browser(), &downloads); |
| 1779 ASSERT_EQ(0u, downloads.size()); |
| 1780 CheckDownloadUI(browser(), false, true, FilePath()); |
| 1781 } |
| 1782 |
| 1783 // Fail a download with a network error partway through, and make sure the |
| 1784 // state is INTERRUPTED and the error is propagated. |
| 1785 IN_PROC_BROWSER_TEST_F(DownloadTest, DownloadInterrupted) { |
| 1786 ASSERT_TRUE(InitialSetup(false)); |
| 1787 GURL url(URLRequestSlowDownloadJob::kKnownSizeUrl); |
| 1788 |
| 1789 scoped_ptr<DownloadsObserver> observer( |
| 1790 CreateInProgressWaiter(browser(), 1)); |
| 1791 ui_test_utils::NavigateToURL(browser(), url); |
| 1792 observer->WaitForFinished(); |
| 1793 |
| 1794 std::vector<DownloadItem*> downloads; |
| 1795 GetPersistentDownloads(browser(), &downloads); |
| 1796 ASSERT_EQ(1u, downloads.size()); |
| 1797 ASSERT_EQ(DownloadItem::IN_PROGRESS, downloads[0]->state()); |
| 1798 FilePath filename; |
| 1799 net::FileURLToFilePath(url, &filename); |
| 1800 CheckDownloadUI(browser(), true, true, |
| 1801 download_util::GetCrDownloadPath(filename.BaseName())); |
| 1802 |
| 1803 // Fail the download |
| 1804 GURL error_url(URLRequestSlowDownloadJob::kErrorFinishDownloadUrl); |
| 1805 ui_test_utils::NavigateToURL(browser(), error_url); |
| 1806 MessageLoopForUI::current()->RunAllPending(); |
| 1807 |
| 1808 // Should still be visible, with INTERRUPTED state. |
| 1809 GetPersistentDownloads(browser(), &downloads); |
| 1810 ASSERT_EQ(1u, downloads.size()); |
| 1811 DownloadItem* download = downloads[0]; |
| 1812 ASSERT_EQ(DownloadItem::INTERRUPTED, download->state()); |
| 1813 // TODO(rdsmith): Confirm error provided by URLRequest is shown |
| 1814 // in DownloadItem. |
| 1815 CheckDownloadUI(browser(), true, true, FilePath()); |
| 1816 |
| 1817 // Confirm cancel does nothing. |
| 1818 download->Cancel(); |
| 1819 MessageLoopForUI::current()->RunAllPending(); |
| 1820 |
| 1821 GetPersistentDownloads(browser(), &downloads); |
| 1822 ASSERT_EQ(1u, downloads.size()); |
| 1823 ASSERT_EQ(download, downloads[0]); |
| 1824 ASSERT_EQ(DownloadItem::INTERRUPTED, download->state()); |
| 1825 CheckDownloadUI(browser(), true, true, FilePath()); |
| 1826 |
| 1827 // Confirm remove gets rid of it. |
| 1828 download->Remove(); |
| 1829 download = NULL; |
| 1830 MessageLoopForUI::current()->RunAllPending(); |
| 1831 |
| 1832 GetPersistentDownloads(browser(), &downloads); |
| 1833 ASSERT_EQ(0u, downloads.size()); |
| 1834 CheckDownloadUI(browser(), false, true, FilePath()); |
| 1835 } |
| 1836 |
| 1458 // Confirm a download makes it into the history properly. | 1837 // Confirm a download makes it into the history properly. |
| 1459 IN_PROC_BROWSER_TEST_F(DownloadTest, DownloadHistoryCheck) { | 1838 IN_PROC_BROWSER_TEST_F(DownloadTest, DownloadHistoryCheck) { |
| 1460 ASSERT_TRUE(InitialSetup(false)); | 1839 ASSERT_TRUE(InitialSetup(false)); |
| 1461 FilePath file(FILE_PATH_LITERAL("download-test1.lib")); | 1840 FilePath file(FILE_PATH_LITERAL("download-test1.lib")); |
| 1462 GURL url(URLRequestMockHTTPJob::GetMockUrl(file)); | 1841 GURL url(URLRequestMockHTTPJob::GetMockUrl(file)); |
| 1463 FilePath origin_file(OriginFile(file)); | 1842 FilePath origin_file(OriginFile(file)); |
| 1464 int64 origin_size; | 1843 int64 origin_size; |
| 1465 file_util::GetFileSize(origin_file, &origin_size); | 1844 file_util::GetFileSize(origin_file, &origin_size); |
| 1466 | 1845 |
| 1467 // Download the file and wait. We do not expect the Select File dialog. | 1846 // Download the file and wait. We do not expect the Select File dialog. |
| 1468 DownloadAndWait(browser(), url, EXPECT_NO_SELECT_DIALOG); | 1847 DownloadAndWait(browser(), url, EXPECT_NO_SELECT_DIALOG); |
| 1469 | 1848 |
| 1470 // Get details of what downloads have just happened. | 1849 // Get details of what downloads have just happened. |
| 1471 std::vector<DownloadItem*> downloads; | 1850 std::vector<DownloadItem*> downloads; |
| 1472 GetDownloads(browser(), &downloads); | 1851 GetPersistentDownloads(browser(), &downloads); |
| 1473 ASSERT_EQ(1u, downloads.size()); | 1852 ASSERT_EQ(1u, downloads.size()); |
| 1474 int64 db_handle = downloads[0]->db_handle(); | 1853 int64 db_handle = downloads[0]->db_handle(); |
| 1475 | 1854 |
| 1476 // Check state. | 1855 // Check state. |
| 1477 EXPECT_EQ(1, browser()->tab_count()); | 1856 EXPECT_EQ(1, browser()->tab_count()); |
| 1478 CheckDownload(browser(), file, file); | 1857 CheckDownload(browser(), file, file); |
| 1479 CheckDownloadUI(browser(), true, true, file); | 1858 CheckDownloadUI(browser(), true, true, file); |
| 1480 | 1859 |
| 1481 // Check history results. | 1860 // Check history results. |
| 1482 DownloadsHistoryDataCollector history_collector( | 1861 DownloadsHistoryDataCollector history_collector( |
| (...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1558 GetDownloadPrefs(browser())->EnableAutoOpenBasedOnExtension(file)); | 1937 GetDownloadPrefs(browser())->EnableAutoOpenBasedOnExtension(file)); |
| 1559 | 1938 |
| 1560 // Mock out external opening on all downloads until end of test. | 1939 // Mock out external opening on all downloads until end of test. |
| 1561 MockDownloadOpeningObserver observer( | 1940 MockDownloadOpeningObserver observer( |
| 1562 browser()->profile()->GetDownloadManager()); | 1941 browser()->profile()->GetDownloadManager()); |
| 1563 | 1942 |
| 1564 DownloadAndWait(browser(), url, EXPECT_NO_SELECT_DIALOG); | 1943 DownloadAndWait(browser(), url, EXPECT_NO_SELECT_DIALOG); |
| 1565 | 1944 |
| 1566 // Find the download and confirm it was opened. | 1945 // Find the download and confirm it was opened. |
| 1567 std::vector<DownloadItem*> downloads; | 1946 std::vector<DownloadItem*> downloads; |
| 1568 browser()->profile()->GetDownloadManager()->SearchDownloads( | 1947 GetPersistentDownloads(browser(), &downloads); |
| 1569 string16(), &downloads); | |
| 1570 ASSERT_EQ(1u, downloads.size()); | 1948 ASSERT_EQ(1u, downloads.size()); |
| 1571 EXPECT_EQ(DownloadItem::COMPLETE, downloads[0]->state()); | 1949 EXPECT_EQ(DownloadItem::COMPLETE, downloads[0]->state()); |
| 1572 EXPECT_TRUE(downloads[0]->opened()); | 1950 EXPECT_TRUE(downloads[0]->opened()); |
| 1573 | 1951 |
| 1574 // As long as we're here, confirmed everything else is good. | 1952 // As long as we're here, confirmed everything else is good. |
| 1575 EXPECT_EQ(1, browser()->tab_count()); | 1953 EXPECT_EQ(1, browser()->tab_count()); |
| 1576 CheckDownload(browser(), file, file); | 1954 CheckDownload(browser(), file, file); |
| 1577 // Download shelf should close. Download panel stays open on ChromeOS. | 1955 // Download shelf should close. Download panel stays open on ChromeOS. |
| 1578 CheckDownloadUI(browser(), false, true, FilePath()); | 1956 CheckDownloadUI(browser(), false, true, FilePath()); |
| 1579 } | 1957 } |
| (...skipping 131 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1711 EXPECT_EQ(1u, observer->NumDangerousDownloadsSeen()); | 2089 EXPECT_EQ(1u, observer->NumDangerousDownloadsSeen()); |
| 1712 | 2090 |
| 1713 // Download shelf should close. Download panel stays open on ChromeOS. | 2091 // Download shelf should close. Download panel stays open on ChromeOS. |
| 1714 CheckDownloadUI(browser(), false, true, FilePath()); | 2092 CheckDownloadUI(browser(), false, true, FilePath()); |
| 1715 | 2093 |
| 1716 // Check that the extension was installed. | 2094 // Check that the extension was installed. |
| 1717 ExtensionService* extension_service = | 2095 ExtensionService* extension_service = |
| 1718 browser()->profile()->GetExtensionService(); | 2096 browser()->profile()->GetExtensionService(); |
| 1719 ASSERT_TRUE(extension_service->GetExtensionById(kLargeThemeCrxId, false)); | 2097 ASSERT_TRUE(extension_service->GetExtensionById(kLargeThemeCrxId, false)); |
| 1720 } | 2098 } |
| OLD | NEW |