// Copyright (c) 2012 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include "chrome/browser/download/download_test_file_activity_observer.h" #include "base/bind.h" #include "base/message_loop/message_loop.h" #include "chrome/browser/download/chrome_download_manager_delegate.h" #include "chrome/browser/download/download_service.h" #include "chrome/browser/download/download_service_factory.h" #include "chrome/browser/profiles/profile.h" namespace content { class DownloadItem; } // Test ChromeDownloadManagerDelegate that controls whether how file chooser // dialogs are handled, and how files are opend. // By default, file chooser dialogs are disabled. class DownloadTestFileActivityObserver::MockDownloadManagerDelegate : public ChromeDownloadManagerDelegate { public: explicit MockDownloadManagerDelegate(Profile* profile) : ChromeDownloadManagerDelegate(profile), file_chooser_enabled_(false), file_chooser_displayed_(false), weak_ptr_factory_(this) { if (!profile->IsOffTheRecord()) GetDownloadIdReceiverCallback().Run( content::DownloadItem::kInvalidId + 1); } ~MockDownloadManagerDelegate() override {} void EnableFileChooser(bool enable) { file_chooser_enabled_ = enable; } bool TestAndResetDidShowFileChooser() { bool did_show = file_chooser_displayed_; file_chooser_displayed_ = false; return did_show; } base::WeakPtr GetWeakPtr() { return weak_ptr_factory_.GetWeakPtr(); } protected: void PromptUserForDownloadPath( content::DownloadItem* item, const base::FilePath& suggested_path, const FileSelectedCallback& callback) override { file_chooser_displayed_ = true; base::MessageLoop::current()->PostTask( FROM_HERE, base::Bind(callback, (file_chooser_enabled_ ? suggested_path : base::FilePath()))); } void OpenDownload(content::DownloadItem* item) override {} private: bool file_chooser_enabled_; bool file_chooser_displayed_; base::WeakPtrFactory weak_ptr_factory_; }; DownloadTestFileActivityObserver::DownloadTestFileActivityObserver( Profile* profile) { scoped_ptr mock_delegate( new MockDownloadManagerDelegate(profile)); test_delegate_ = mock_delegate->GetWeakPtr(); DownloadServiceFactory::GetForBrowserContext(profile) ->SetDownloadManagerDelegateForTesting(mock_delegate.Pass()); } DownloadTestFileActivityObserver::~DownloadTestFileActivityObserver() { } void DownloadTestFileActivityObserver::EnableFileChooser(bool enable) { if (test_delegate_.get()) test_delegate_->EnableFileChooser(enable); } bool DownloadTestFileActivityObserver::TestAndResetDidShowFileChooser() { return test_delegate_.get() && test_delegate_->TestAndResetDidShowFileChooser(); }