1// Copyright (c) 2012 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.
4
5#include "chrome/browser/download/download_test_file_activity_observer.h"
6
7#include "base/bind.h"
8#include "base/message_loop/message_loop.h"
9#include "chrome/browser/download/chrome_download_manager_delegate.h"
10#include "chrome/browser/download/download_service.h"
11#include "chrome/browser/download/download_service_factory.h"
12#include "chrome/browser/profiles/profile.h"
13
14namespace content {
15class DownloadItem;
16}
17
18// Test ChromeDownloadManagerDelegate that controls whether how file chooser
19// dialogs are handled, and how files are opend.
20// By default, file chooser dialogs are disabled.
21class DownloadTestFileActivityObserver::MockDownloadManagerDelegate
22    : public ChromeDownloadManagerDelegate {
23 public:
24  explicit MockDownloadManagerDelegate(Profile* profile)
25      : ChromeDownloadManagerDelegate(profile),
26        file_chooser_enabled_(false),
27        file_chooser_displayed_(false),
28        weak_ptr_factory_(this) {
29    if (!profile->IsOffTheRecord())
30      GetDownloadIdReceiverCallback().Run(
31          content::DownloadItem::kInvalidId + 1);
32  }
33
34  virtual ~MockDownloadManagerDelegate() {}
35
36  void EnableFileChooser(bool enable) {
37    file_chooser_enabled_ = enable;
38  }
39
40  bool TestAndResetDidShowFileChooser() {
41    bool did_show = file_chooser_displayed_;
42    file_chooser_displayed_ = false;
43    return did_show;
44  }
45
46  base::WeakPtr<MockDownloadManagerDelegate> GetWeakPtr() {
47    return weak_ptr_factory_.GetWeakPtr();
48  }
49
50 protected:
51
52  virtual void PromptUserForDownloadPath(content::DownloadItem* item,
53                                         const base::FilePath& suggested_path,
54                                         const FileSelectedCallback&
55                                             callback) OVERRIDE {
56    file_chooser_displayed_ = true;
57    base::MessageLoop::current()->PostTask(
58        FROM_HERE, base::Bind(callback, (file_chooser_enabled_ ? suggested_path
59                                         : base::FilePath())));
60  }
61
62  virtual void OpenDownload(content::DownloadItem* item) OVERRIDE {}
63
64 private:
65  bool file_chooser_enabled_;
66  bool file_chooser_displayed_;
67  base::WeakPtrFactory<MockDownloadManagerDelegate> weak_ptr_factory_;
68};
69
70DownloadTestFileActivityObserver::DownloadTestFileActivityObserver(
71    Profile* profile) {
72  scoped_ptr<MockDownloadManagerDelegate> mock_delegate(
73      new MockDownloadManagerDelegate(profile));
74  test_delegate_ = mock_delegate->GetWeakPtr();
75  DownloadServiceFactory::GetForBrowserContext(profile)->
76      SetDownloadManagerDelegateForTesting(
77          mock_delegate.PassAs<ChromeDownloadManagerDelegate>());
78}
79
80DownloadTestFileActivityObserver::~DownloadTestFileActivityObserver() {
81}
82
83void DownloadTestFileActivityObserver::EnableFileChooser(bool enable) {
84  if (test_delegate_.get())
85    test_delegate_->EnableFileChooser(enable);
86}
87
88bool DownloadTestFileActivityObserver::TestAndResetDidShowFileChooser() {
89  return test_delegate_.get() &&
90      test_delegate_->TestAndResetDidShowFileChooser();
91}
92