OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 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 | 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/auto_reset.h" | 5 #include "base/auto_reset.h" |
6 #include "base/files/scoped_temp_dir.h" | 6 #include "base/files/scoped_temp_dir.h" |
7 #include "base/json/json_reader.h" | 7 #include "base/json/json_reader.h" |
8 #include "base/prefs/pref_service.h" | 8 #include "base/prefs/pref_service.h" |
9 #include "base/values.h" | 9 #include "base/values.h" |
10 #include "chrome/browser/history/download_row.h" | 10 #include "chrome/browser/history/download_row.h" |
11 #include "chrome/browser/profiles/profile.h" | 11 #include "chrome/browser/profiles/profile.h" |
12 #include "chrome/browser/ui/browser.h" | 12 #include "chrome/browser/ui/browser.h" |
13 #include "chrome/browser/ui/webui/downloads_dom_handler.h" | 13 #include "chrome/browser/ui/webui/downloads_dom_handler.h" |
14 #include "chrome/common/pref_names.h" | 14 #include "chrome/common/pref_names.h" |
15 #include "chrome/test/base/in_process_browser_test.h" | 15 #include "chrome/test/base/in_process_browser_test.h" |
16 #include "content/public/browser/web_contents.h" | 16 #include "content/public/browser/web_contents.h" |
| 17 #include "content/public/test/mock_download_item.h" |
| 18 #include "content/public/test/mock_download_manager.h" |
17 #include "content/public/test/test_utils.h" | 19 #include "content/public/test/test_utils.h" |
18 | 20 |
19 namespace { | 21 namespace { |
20 | 22 |
21 // Reads |right_json| into a ListValue |left_list|; returns true if all | 23 // Reads |right_json| into a ListValue |left_list|; returns true if all |
22 // key-value pairs in in all dictionaries in |right_list| are also in the | 24 // key-value pairs in in all dictionaries in |right_list| are also in the |
23 // corresponding dictionary in |left_list|. Ignores keys in dictionaries in | 25 // corresponding dictionary in |left_list|. Ignores keys in dictionaries in |
24 // |left_list| that are not in the corresponding dictionary in |right_list|. | 26 // |left_list| that are not in the corresponding dictionary in |right_list|. |
25 bool ListMatches(base::ListValue* left_list, const std::string& right_json) { | 27 bool ListMatches(base::ListValue* left_list, const std::string& right_json) { |
26 scoped_ptr<base::Value> right_value(base::JSONReader::Read(right_json)); | 28 scoped_ptr<base::Value> right_value(base::JSONReader::Read(right_json)); |
(...skipping 19 matching lines...) Expand all Loading... |
46 return true; | 48 return true; |
47 } | 49 } |
48 | 50 |
49 // A |DownloadsDOMHandler| that doesn't use a real WebUI object, but is real in | 51 // A |DownloadsDOMHandler| that doesn't use a real WebUI object, but is real in |
50 // all other respects. | 52 // all other respects. |
51 class MockDownloadsDOMHandler : public DownloadsDOMHandler { | 53 class MockDownloadsDOMHandler : public DownloadsDOMHandler { |
52 public: | 54 public: |
53 explicit MockDownloadsDOMHandler(content::DownloadManager* dlm) | 55 explicit MockDownloadsDOMHandler(content::DownloadManager* dlm) |
54 : DownloadsDOMHandler(dlm), | 56 : DownloadsDOMHandler(dlm), |
55 waiting_list_(false), | 57 waiting_list_(false), |
56 waiting_updated_(false) { | 58 waiting_updated_(false), |
| 59 manager_(nullptr) { |
57 } | 60 } |
58 ~MockDownloadsDOMHandler() override {} | 61 ~MockDownloadsDOMHandler() override {} |
59 | 62 |
60 base::ListValue* downloads_list() { return downloads_list_.get(); } | 63 base::ListValue* downloads_list() { return downloads_list_.get(); } |
61 base::ListValue* download_updated() { return download_updated_.get(); } | 64 base::ListValue* download_updated() { return download_updated_.get(); } |
62 | 65 |
63 void WaitForDownloadsList() { | 66 void WaitForDownloadsList() { |
64 if (downloads_list_.get()) | 67 if (downloads_list_.get()) |
65 return; | 68 return; |
66 base::AutoReset<bool> reset_waiting(&waiting_list_, true); | 69 base::AutoReset<bool> reset_waiting(&waiting_list_, true); |
67 content::RunMessageLoop(); | 70 content::RunMessageLoop(); |
68 } | 71 } |
69 | 72 |
70 void WaitForDownloadUpdated() { | 73 void WaitForDownloadUpdated() { |
71 if (download_updated_.get()) | 74 if (download_updated_.get()) |
72 return; | 75 return; |
73 base::AutoReset<bool> reset_waiting(&waiting_updated_, true); | 76 base::AutoReset<bool> reset_waiting(&waiting_updated_, true); |
74 content::RunMessageLoop(); | 77 content::RunMessageLoop(); |
75 } | 78 } |
76 | 79 |
77 void ForceSendCurrentDownloads() { | 80 void ForceSendCurrentDownloads() { |
78 ScheduleSendCurrentDownloads(); | 81 ScheduleSendCurrentDownloads(); |
79 } | 82 } |
80 | 83 |
81 void reset_downloads_list() { downloads_list_.reset(); } | 84 void reset_downloads_list() { downloads_list_.reset(); } |
82 void reset_download_updated() { download_updated_.reset(); } | 85 void reset_download_updated() { download_updated_.reset(); } |
83 | 86 |
| 87 void set_manager(content::DownloadManager* manager) { manager_ = manager; } |
| 88 |
84 protected: | 89 protected: |
85 content::WebContents* GetWebUIWebContents() override { return NULL; } | 90 content::WebContents* GetWebUIWebContents() override { return NULL; } |
86 | 91 |
87 void CallDownloadsList(const base::ListValue& downloads) override { | 92 void CallDownloadsList(const base::ListValue& downloads) override { |
88 downloads_list_.reset(downloads.DeepCopy()); | 93 downloads_list_.reset(downloads.DeepCopy()); |
89 if (waiting_list_) { | 94 if (waiting_list_) { |
90 content::BrowserThread::PostTask(content::BrowserThread::UI, | 95 content::BrowserThread::PostTask(content::BrowserThread::UI, |
91 FROM_HERE, | 96 FROM_HERE, |
92 base::MessageLoop::QuitClosure()); | 97 base::MessageLoop::QuitClosure()); |
93 } | 98 } |
94 } | 99 } |
95 | 100 |
96 void CallDownloadUpdated(const base::ListValue& download) override { | 101 void CallDownloadUpdated(const base::ListValue& download) override { |
97 download_updated_.reset(download.DeepCopy()); | 102 download_updated_.reset(download.DeepCopy()); |
98 if (waiting_updated_) { | 103 if (waiting_updated_) { |
99 content::BrowserThread::PostTask(content::BrowserThread::UI, | 104 content::BrowserThread::PostTask(content::BrowserThread::UI, |
100 FROM_HERE, | 105 FROM_HERE, |
101 base::MessageLoop::QuitClosure()); | 106 base::MessageLoop::QuitClosure()); |
102 } | 107 } |
103 } | 108 } |
104 | 109 |
| 110 content::DownloadManager* GetMainNotifierManager() override { |
| 111 return manager_ ? manager_ : DownloadsDOMHandler::GetMainNotifierManager(); |
| 112 } |
| 113 |
105 private: | 114 private: |
106 scoped_ptr<base::ListValue> downloads_list_; | 115 scoped_ptr<base::ListValue> downloads_list_; |
107 scoped_ptr<base::ListValue> download_updated_; | 116 scoped_ptr<base::ListValue> download_updated_; |
108 bool waiting_list_; | 117 bool waiting_list_; |
109 bool waiting_updated_; | 118 bool waiting_updated_; |
| 119 content::DownloadManager* manager_; // weak. |
110 | 120 |
111 DISALLOW_COPY_AND_ASSIGN(MockDownloadsDOMHandler); | 121 DISALLOW_COPY_AND_ASSIGN(MockDownloadsDOMHandler); |
112 }; | 122 }; |
113 | 123 |
114 } // namespace | 124 } // namespace |
115 | 125 |
116 class DownloadsDOMHandlerTest : public InProcessBrowserTest { | 126 class DownloadsDOMHandlerTest : public InProcessBrowserTest { |
117 public: | 127 public: |
118 DownloadsDOMHandlerTest() {} | 128 DownloadsDOMHandlerTest() {} |
119 | 129 |
(...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
216 ASSERT_EQ(1, static_cast<int>(mock_handler_->downloads_list()->GetSize())); | 226 ASSERT_EQ(1, static_cast<int>(mock_handler_->downloads_list()->GetSize())); |
217 | 227 |
218 mock_handler_->reset_downloads_list(); | 228 mock_handler_->reset_downloads_list(); |
219 browser()->profile()->GetPrefs()->SetBoolean( | 229 browser()->profile()->GetPrefs()->SetBoolean( |
220 prefs::kAllowDeletingBrowserHistory, true); | 230 prefs::kAllowDeletingBrowserHistory, true); |
221 mock_handler_->HandleRemove(&item); | 231 mock_handler_->HandleRemove(&item); |
222 mock_handler_->WaitForDownloadsList(); | 232 mock_handler_->WaitForDownloadsList(); |
223 EXPECT_EQ(0, static_cast<int>(mock_handler_->downloads_list()->GetSize())); | 233 EXPECT_EQ(0, static_cast<int>(mock_handler_->downloads_list()->GetSize())); |
224 } | 234 } |
225 | 235 |
| 236 IN_PROC_BROWSER_TEST_F(DownloadsDOMHandlerTest, ClearAllSkipsInProgress) { |
| 237 content::MockDownloadManager manager; |
| 238 mock_handler_->set_manager(&manager); |
| 239 |
| 240 content::MockDownloadItem item; |
| 241 EXPECT_CALL(item, GetState()).WillRepeatedly( |
| 242 testing::Return(content::DownloadItem::IN_PROGRESS)); |
| 243 EXPECT_CALL(item, UpdateObservers()).Times(0); |
| 244 |
| 245 std::vector<content::DownloadItem*> items; |
| 246 items.push_back(&item); |
| 247 EXPECT_CALL(manager, GetAllDownloads(testing::_)).WillOnce( |
| 248 testing::SetArgPointee<0>(items)); |
| 249 |
| 250 mock_handler_->HandleClearAll(NULL); |
| 251 } |
| 252 |
226 // Tests that DownloadsDOMHandler detects new downloads and relays them to the | 253 // Tests that DownloadsDOMHandler detects new downloads and relays them to the |
227 // renderer. | 254 // renderer. |
228 // crbug.com/159390: This test fails when daylight savings time ends. | 255 // crbug.com/159390: This test fails when daylight savings time ends. |
229 IN_PROC_BROWSER_TEST_F(DownloadsDOMHandlerTest, DownloadsRelayed) { | 256 IN_PROC_BROWSER_TEST_F(DownloadsDOMHandlerTest, DownloadsRelayed) { |
230 DownloadAnItem(); | 257 DownloadAnItem(); |
231 | 258 |
232 mock_handler_->WaitForDownloadUpdated(); | 259 mock_handler_->WaitForDownloadUpdated(); |
233 ASSERT_EQ(1, static_cast<int>(mock_handler_->download_updated()->GetSize())); | 260 ASSERT_EQ(1, static_cast<int>(mock_handler_->download_updated()->GetSize())); |
234 EXPECT_TRUE(ListMatches( | 261 EXPECT_TRUE(ListMatches( |
235 mock_handler_->download_updated(), | 262 mock_handler_->download_updated(), |
(...skipping 15 matching lines...) Expand all Loading... |
251 // TODO(benjhayden): Test incognito, both downloads_list() and that on-record | 278 // TODO(benjhayden): Test incognito, both downloads_list() and that on-record |
252 // calls can't access off-record items. | 279 // calls can't access off-record items. |
253 | 280 |
254 // TODO(benjhayden): Test that bad download ids incoming from the javascript are | 281 // TODO(benjhayden): Test that bad download ids incoming from the javascript are |
255 // dropped on the floor. | 282 // dropped on the floor. |
256 | 283 |
257 // TODO(benjhayden): Test that IsTemporary() downloads are not shown. | 284 // TODO(benjhayden): Test that IsTemporary() downloads are not shown. |
258 | 285 |
259 // TODO(benjhayden): Test that RemoveObserver is called on all download items, | 286 // TODO(benjhayden): Test that RemoveObserver is called on all download items, |
260 // including items that crossed IsTemporary() and back. | 287 // including items that crossed IsTemporary() and back. |
OLD | NEW |