Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(251)

Side by Side Diff: chrome/browser/ui/webui/downloads_dom_handler_browsertest.cc

Issue 795353002: downloads: prevent "Clear all" from removing in progress downloads (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: gmock Created 6 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « chrome/browser/ui/webui/downloads_dom_handler.cc ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
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.
OLDNEW
« no previous file with comments | « chrome/browser/ui/webui/downloads_dom_handler.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698