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 <set> | 5 #include <set> |
6 #include <string> | 6 #include <string> |
7 | 7 |
8 #include "base/bind.h" | 8 #include "base/bind.h" |
9 #include "base/file_util.h" | 9 #include "base/file_util.h" |
10 #include "base/files/scoped_temp_dir.h" | 10 #include "base/files/scoped_temp_dir.h" |
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
58 // has a |default_download_directory| that matches |download_directory|. | 58 // has a |default_download_directory| that matches |download_directory|. |
59 MATCHER_P2(DownloadCreateInfoWithDefaultPath, info, download_directory, "") { | 59 MATCHER_P2(DownloadCreateInfoWithDefaultPath, info, download_directory, "") { |
60 return arg == info && | 60 return arg == info && |
61 arg->default_download_directory == download_directory; | 61 arg->default_download_directory == download_directory; |
62 } | 62 } |
63 | 63 |
64 class MockDownloadItemImpl : public DownloadItemImpl { | 64 class MockDownloadItemImpl : public DownloadItemImpl { |
65 public: | 65 public: |
66 // Use history constructor for minimal base object. | 66 // Use history constructor for minimal base object. |
67 MockDownloadItemImpl(DownloadItemImplDelegate* delegate) | 67 MockDownloadItemImpl(DownloadItemImplDelegate* delegate) |
68 : DownloadItemImpl(delegate, DownloadId(), | 68 : DownloadItemImpl( |
69 DownloadPersistentStoreInfo(), | 69 delegate, |
70 net::BoundNetLog()) {} | 70 content::DownloadId(), |
| 71 FilePath(), |
| 72 GURL(), |
| 73 GURL(), |
| 74 base::Time(), |
| 75 base::Time(), |
| 76 0, |
| 77 0, |
| 78 DownloadItem::IN_PROGRESS, |
| 79 false, |
| 80 net::BoundNetLog()) {} |
71 virtual ~MockDownloadItemImpl() {} | 81 virtual ~MockDownloadItemImpl() {} |
72 | 82 |
73 MOCK_METHOD4(OnDownloadTargetDetermined, | 83 MOCK_METHOD4(OnDownloadTargetDetermined, |
74 void(const FilePath&, TargetDisposition, | 84 void(const FilePath&, TargetDisposition, |
75 DownloadDangerType, const FilePath&)); | 85 DownloadDangerType, const FilePath&)); |
76 MOCK_METHOD1(AddObserver, void(DownloadItem::Observer*)); | 86 MOCK_METHOD1(AddObserver, void(DownloadItem::Observer*)); |
77 MOCK_METHOD1(RemoveObserver, void(DownloadItem::Observer*)); | 87 MOCK_METHOD1(RemoveObserver, void(DownloadItem::Observer*)); |
78 MOCK_METHOD0(UpdateObservers, void()); | 88 MOCK_METHOD0(UpdateObservers, void()); |
79 MOCK_METHOD0(CanShowInFolder, bool()); | 89 MOCK_METHOD0(CanShowInFolder, bool()); |
80 MOCK_METHOD0(CanOpenDownload, bool()); | 90 MOCK_METHOD0(CanOpenDownload, bool()); |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
125 MOCK_CONST_METHOD0(GetReferrerCharset, std::string()); | 135 MOCK_CONST_METHOD0(GetReferrerCharset, std::string()); |
126 MOCK_CONST_METHOD0(GetRemoteAddress, std::string()); | 136 MOCK_CONST_METHOD0(GetRemoteAddress, std::string()); |
127 MOCK_CONST_METHOD0(GetTotalBytes, int64()); | 137 MOCK_CONST_METHOD0(GetTotalBytes, int64()); |
128 MOCK_CONST_METHOD0(GetReceivedBytes, int64()); | 138 MOCK_CONST_METHOD0(GetReceivedBytes, int64()); |
129 MOCK_CONST_METHOD0(GetHashState, const std::string&()); | 139 MOCK_CONST_METHOD0(GetHashState, const std::string&()); |
130 MOCK_CONST_METHOD0(GetHash, const std::string&()); | 140 MOCK_CONST_METHOD0(GetHash, const std::string&()); |
131 MOCK_CONST_METHOD0(GetId, int32()); | 141 MOCK_CONST_METHOD0(GetId, int32()); |
132 MOCK_CONST_METHOD0(GetGlobalId, DownloadId()); | 142 MOCK_CONST_METHOD0(GetGlobalId, DownloadId()); |
133 MOCK_CONST_METHOD0(GetStartTime, base::Time()); | 143 MOCK_CONST_METHOD0(GetStartTime, base::Time()); |
134 MOCK_CONST_METHOD0(GetEndTime, base::Time()); | 144 MOCK_CONST_METHOD0(GetEndTime, base::Time()); |
135 MOCK_METHOD0(SetIsPersisted, void()); | |
136 MOCK_CONST_METHOD0(IsPersisted, bool()); | |
137 MOCK_METHOD1(SetDbHandle, void(int64)); | |
138 MOCK_CONST_METHOD0(GetDbHandle, int64()); | |
139 MOCK_METHOD0(GetDownloadManager, DownloadManager*()); | 145 MOCK_METHOD0(GetDownloadManager, DownloadManager*()); |
140 MOCK_CONST_METHOD0(IsPaused, bool()); | 146 MOCK_CONST_METHOD0(IsPaused, bool()); |
141 MOCK_CONST_METHOD0(GetOpenWhenComplete, bool()); | 147 MOCK_CONST_METHOD0(GetOpenWhenComplete, bool()); |
142 MOCK_METHOD1(SetOpenWhenComplete, void(bool)); | 148 MOCK_METHOD1(SetOpenWhenComplete, void(bool)); |
143 MOCK_CONST_METHOD0(GetFileExternallyRemoved, bool()); | 149 MOCK_CONST_METHOD0(GetFileExternallyRemoved, bool()); |
144 MOCK_CONST_METHOD0(GetSafetyState, SafetyState()); | 150 MOCK_CONST_METHOD0(GetSafetyState, SafetyState()); |
145 MOCK_CONST_METHOD0(GetDangerType, DownloadDangerType()); | 151 MOCK_CONST_METHOD0(GetDangerType, DownloadDangerType()); |
146 MOCK_CONST_METHOD0(IsDangerous, bool()); | 152 MOCK_CONST_METHOD0(IsDangerous, bool()); |
147 MOCK_METHOD0(GetAutoOpened, bool()); | 153 MOCK_METHOD0(GetAutoOpened, bool()); |
148 MOCK_CONST_METHOD0(GetForcedFilePath, const FilePath&()); | 154 MOCK_CONST_METHOD0(GetForcedFilePath, const FilePath&()); |
149 MOCK_CONST_METHOD0(HasUserGesture, bool()); | 155 MOCK_CONST_METHOD0(HasUserGesture, bool()); |
150 MOCK_CONST_METHOD0(GetTransitionType, PageTransition()); | 156 MOCK_CONST_METHOD0(GetTransitionType, PageTransition()); |
151 MOCK_CONST_METHOD0(IsTemporary, bool()); | 157 MOCK_CONST_METHOD0(IsTemporary, bool()); |
152 MOCK_METHOD1(SetIsTemporary, void(bool)); | 158 MOCK_METHOD1(SetIsTemporary, void(bool)); |
153 MOCK_METHOD1(SetOpened, void(bool)); | 159 MOCK_METHOD1(SetOpened, void(bool)); |
154 MOCK_CONST_METHOD0(GetOpened, bool()); | 160 MOCK_CONST_METHOD0(GetOpened, bool()); |
155 MOCK_CONST_METHOD0(GetLastModifiedTime, const std::string&()); | 161 MOCK_CONST_METHOD0(GetLastModifiedTime, const std::string&()); |
156 MOCK_CONST_METHOD0(GetETag, const std::string&()); | 162 MOCK_CONST_METHOD0(GetETag, const std::string&()); |
157 MOCK_CONST_METHOD0(GetLastReason, DownloadInterruptReason()); | 163 MOCK_CONST_METHOD0(GetLastReason, DownloadInterruptReason()); |
158 MOCK_CONST_METHOD0(GetPersistentStoreInfo, DownloadPersistentStoreInfo()); | |
159 MOCK_CONST_METHOD0(GetBrowserContext, BrowserContext*()); | 164 MOCK_CONST_METHOD0(GetBrowserContext, BrowserContext*()); |
160 MOCK_CONST_METHOD0(GetWebContents, WebContents*()); | 165 MOCK_CONST_METHOD0(GetWebContents, WebContents*()); |
161 MOCK_CONST_METHOD0(GetFileNameToReportUser, FilePath()); | 166 MOCK_CONST_METHOD0(GetFileNameToReportUser, FilePath()); |
162 MOCK_METHOD1(SetDisplayName, void(const FilePath&)); | 167 MOCK_METHOD1(SetDisplayName, void(const FilePath&)); |
163 MOCK_CONST_METHOD0(GetUserVerifiedFilePath, FilePath()); | 168 MOCK_CONST_METHOD0(GetUserVerifiedFilePath, FilePath()); |
164 MOCK_METHOD0(MockDownloadOpenForTesting, void()); | 169 MOCK_METHOD0(MockDownloadOpenForTesting, void()); |
165 // May be called when vlog is on. | 170 // May be called when vlog is on. |
166 virtual std::string DebugString(bool verbose) const OVERRIDE { return ""; } | 171 virtual std::string DebugString(bool verbose) const OVERRIDE { return ""; } |
167 }; | 172 }; |
168 | 173 |
169 class MockDownloadManagerDelegate : public DownloadManagerDelegate { | 174 class MockDownloadManagerDelegate : public DownloadManagerDelegate { |
170 public: | 175 public: |
171 MockDownloadManagerDelegate(); | 176 MockDownloadManagerDelegate(); |
172 virtual ~MockDownloadManagerDelegate(); | 177 virtual ~MockDownloadManagerDelegate(); |
173 | 178 |
174 MOCK_METHOD0(Shutdown, void()); | 179 MOCK_METHOD0(Shutdown, void()); |
175 MOCK_METHOD0(GetNextId, DownloadId()); | 180 MOCK_METHOD0(GetNextId, DownloadId()); |
176 MOCK_METHOD2(DetermineDownloadTarget, | 181 MOCK_METHOD2(DetermineDownloadTarget, |
177 bool(DownloadItem* item, | 182 bool(DownloadItem* item, |
178 const DownloadTargetCallback&)); | 183 const DownloadTargetCallback&)); |
179 MOCK_METHOD0(GetAlternativeWebContentsToNotifyForDownload, WebContents*()); | 184 MOCK_METHOD0(GetAlternativeWebContentsToNotifyForDownload, WebContents*()); |
180 MOCK_METHOD1(ShouldOpenFileBasedOnExtension, bool(const FilePath&)); | 185 MOCK_METHOD1(ShouldOpenFileBasedOnExtension, bool(const FilePath&)); |
181 MOCK_METHOD2(ShouldCompleteDownload, | 186 MOCK_METHOD2(ShouldCompleteDownload, |
182 bool(DownloadItem*, const base::Closure&)); | 187 bool(DownloadItem*, const base::Closure&)); |
183 MOCK_METHOD2(ShouldOpenDownload, | 188 MOCK_METHOD2(ShouldOpenDownload, |
184 bool(DownloadItem*, const DownloadOpenDelayedCallback&)); | 189 bool(DownloadItem*, const DownloadOpenDelayedCallback&)); |
185 MOCK_METHOD0(GenerateFileHash, bool()); | 190 MOCK_METHOD0(GenerateFileHash, bool()); |
186 MOCK_METHOD1(AddItemToPersistentStore, void(DownloadItem*)); | |
187 MOCK_METHOD1(UpdateItemInPersistentStore, void(DownloadItem*)); | |
188 MOCK_METHOD2(UpdatePathForItemInPersistentStore, | |
189 void(DownloadItem*, const FilePath&)); | |
190 MOCK_METHOD1(RemoveItemFromPersistentStore, void(DownloadItem*)); | |
191 MOCK_METHOD2(RemoveItemsFromPersistentStoreBetween, void( | |
192 base::Time remove_begin, base::Time remove_end)); | |
193 MOCK_METHOD4(GetSaveDir, void(BrowserContext*, | 191 MOCK_METHOD4(GetSaveDir, void(BrowserContext*, |
194 FilePath*, FilePath*, bool*)); | 192 FilePath*, FilePath*, bool*)); |
195 MOCK_METHOD5(ChooseSavePath, void( | 193 MOCK_METHOD5(ChooseSavePath, void( |
196 WebContents*, const FilePath&, const FilePath::StringType&, | 194 WebContents*, const FilePath&, const FilePath::StringType&, |
197 bool, const SavePackagePathPickedCallback&)); | 195 bool, const SavePackagePathPickedCallback&)); |
198 }; | 196 }; |
199 | 197 |
200 MockDownloadManagerDelegate::MockDownloadManagerDelegate() {} | 198 MockDownloadManagerDelegate::MockDownloadManagerDelegate() {} |
201 | 199 |
202 MockDownloadManagerDelegate::~MockDownloadManagerDelegate() {} | 200 MockDownloadManagerDelegate::~MockDownloadManagerDelegate() {} |
(...skipping 17 matching lines...) Expand all Loading... |
220 MockDownloadItemImpl* PopItem(); | 218 MockDownloadItemImpl* PopItem(); |
221 | 219 |
222 // Should be called when the item of this id is removed so that | 220 // Should be called when the item of this id is removed so that |
223 // we don't keep dangling pointers. | 221 // we don't keep dangling pointers. |
224 void RemoveItem(int id); | 222 void RemoveItem(int id); |
225 | 223 |
226 // Overridden methods from DownloadItemFactory. | 224 // Overridden methods from DownloadItemFactory. |
227 virtual DownloadItemImpl* CreatePersistedItem( | 225 virtual DownloadItemImpl* CreatePersistedItem( |
228 DownloadItemImplDelegate* delegate, | 226 DownloadItemImplDelegate* delegate, |
229 DownloadId download_id, | 227 DownloadId download_id, |
230 const DownloadPersistentStoreInfo& info, | 228 const FilePath& path, |
| 229 const GURL& url, |
| 230 const GURL& referrer_url, |
| 231 const base::Time& start_time, |
| 232 const base::Time& end_time, |
| 233 int64 received_bytes, |
| 234 int64 total_bytes, |
| 235 DownloadItem::DownloadState state, |
| 236 bool opened, |
231 const net::BoundNetLog& bound_net_log) OVERRIDE; | 237 const net::BoundNetLog& bound_net_log) OVERRIDE; |
232 virtual DownloadItemImpl* CreateActiveItem( | 238 virtual DownloadItemImpl* CreateActiveItem( |
233 DownloadItemImplDelegate* delegate, | 239 DownloadItemImplDelegate* delegate, |
234 const DownloadCreateInfo& info, | 240 const DownloadCreateInfo& info, |
235 scoped_ptr<DownloadRequestHandleInterface> request_handle, | 241 scoped_ptr<DownloadRequestHandleInterface> request_handle, |
236 const net::BoundNetLog& bound_net_log) OVERRIDE; | 242 const net::BoundNetLog& bound_net_log) OVERRIDE; |
237 virtual DownloadItemImpl* CreateSavePageItem( | 243 virtual DownloadItemImpl* CreateSavePageItem( |
238 DownloadItemImplDelegate* delegate, | 244 DownloadItemImplDelegate* delegate, |
239 const FilePath& path, | 245 const FilePath& path, |
240 const GURL& url, | 246 const GURL& url, |
(...skipping 30 matching lines...) Expand all Loading... |
271 } | 277 } |
272 | 278 |
273 void MockDownloadItemFactory::RemoveItem(int id) { | 279 void MockDownloadItemFactory::RemoveItem(int id) { |
274 DCHECK(items_.find(id) != items_.end()); | 280 DCHECK(items_.find(id) != items_.end()); |
275 items_.erase(id); | 281 items_.erase(id); |
276 } | 282 } |
277 | 283 |
278 DownloadItemImpl* MockDownloadItemFactory::CreatePersistedItem( | 284 DownloadItemImpl* MockDownloadItemFactory::CreatePersistedItem( |
279 DownloadItemImplDelegate* delegate, | 285 DownloadItemImplDelegate* delegate, |
280 DownloadId download_id, | 286 DownloadId download_id, |
281 const DownloadPersistentStoreInfo& info, | 287 const FilePath& path, |
| 288 const GURL& url, |
| 289 const GURL& referrer_url, |
| 290 const base::Time& start_time, |
| 291 const base::Time& end_time, |
| 292 int64 received_bytes, |
| 293 int64 total_bytes, |
| 294 DownloadItem::DownloadState state, |
| 295 bool opened, |
282 const net::BoundNetLog& bound_net_log) { | 296 const net::BoundNetLog& bound_net_log) { |
283 int local_id = download_id.local(); | 297 int local_id = download_id.local(); |
284 DCHECK(items_.find(local_id) == items_.end()); | 298 DCHECK(items_.find(local_id) == items_.end()); |
285 | 299 |
286 MockDownloadItemImpl* result = | 300 MockDownloadItemImpl* result = |
287 new StrictMock<MockDownloadItemImpl>(&item_delegate_); | 301 new StrictMock<MockDownloadItemImpl>(&item_delegate_); |
288 EXPECT_CALL(*result, GetId()) | 302 EXPECT_CALL(*result, GetId()) |
289 .WillRepeatedly(Return(local_id)); | 303 .WillRepeatedly(Return(local_id)); |
290 items_[local_id] = result; | 304 items_[local_id] = result; |
291 | 305 |
(...skipping 244 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
536 download_manager_->DetermineDownloadTarget( | 550 download_manager_->DetermineDownloadTarget( |
537 item, base::Bind( | 551 item, base::Bind( |
538 &DownloadManagerTest::DownloadTargetDeterminedCallback, | 552 &DownloadManagerTest::DownloadTargetDeterminedCallback, |
539 base::Unretained(this))); | 553 base::Unretained(this))); |
540 } | 554 } |
541 | 555 |
542 void AddItemToHistory(MockDownloadItemImpl& item, int64 db_handle) { | 556 void AddItemToHistory(MockDownloadItemImpl& item, int64 db_handle) { |
543 // For DCHECK in AddDownloadItemToHistory. Don't want to use | 557 // For DCHECK in AddDownloadItemToHistory. Don't want to use |
544 // WillRepeatedly as it may have to return true after this. | 558 // WillRepeatedly as it may have to return true after this. |
545 if (DCHECK_IS_ON()) | 559 if (DCHECK_IS_ON()) |
546 EXPECT_CALL(item, IsPersisted()) | |
547 .WillRepeatedly(Return(false)); | |
548 | |
549 EXPECT_CALL(item, SetDbHandle(db_handle)); | |
550 EXPECT_CALL(item, SetIsPersisted()); | |
551 EXPECT_CALL(item, GetDbHandle()) | |
552 .WillRepeatedly(Return(db_handle)); | |
553 | |
554 // Null out ShowDownloadInBrowser | 560 // Null out ShowDownloadInBrowser |
555 EXPECT_CALL(item, GetWebContents()) | 561 EXPECT_CALL(item, GetWebContents()) |
556 .WillOnce(Return(static_cast<WebContents*>(NULL))); | 562 .WillOnce(Return(static_cast<WebContents*>(NULL))); |
557 EXPECT_CALL(GetMockDownloadManagerDelegate(), | 563 EXPECT_CALL(GetMockDownloadManagerDelegate(), |
558 GetAlternativeWebContentsToNotifyForDownload()) | 564 GetAlternativeWebContentsToNotifyForDownload()) |
559 .WillOnce(Return(static_cast<WebContents*>(NULL))); | 565 .WillOnce(Return(static_cast<WebContents*>(NULL))); |
560 | 566 |
561 EXPECT_CALL(item, IsInProgress()) | 567 EXPECT_CALL(item, IsInProgress()) |
562 .WillOnce(Return(true)); | 568 .WillOnce(Return(true)); |
563 | 569 |
564 // History addition should result in a call into MaybeCompleteDownload(). | 570 // History addition should result in a call into MaybeCompleteDownload(). |
565 EXPECT_CALL(item, MaybeCompleteDownload()) | 571 EXPECT_CALL(item, MaybeCompleteDownload()) |
566 .WillOnce(Return()); | 572 .WillOnce(Return()); |
567 | |
568 download_manager_->OnItemAddedToPersistentStore(item.GetId(), db_handle); | |
569 } | 573 } |
570 | 574 |
571 protected: | 575 protected: |
572 // Key test variable; we'll keep it available to sub-classes. | 576 // Key test variable; we'll keep it available to sub-classes. |
573 scoped_refptr<DownloadManagerImpl> download_manager_; | 577 scoped_refptr<DownloadManagerImpl> download_manager_; |
574 base::WeakPtr<MockDownloadFileFactory> mock_download_file_factory_; | 578 base::WeakPtr<MockDownloadFileFactory> mock_download_file_factory_; |
575 | 579 |
576 // Target detetermined callback. | 580 // Target detetermined callback. |
577 bool callback_called_; | 581 bool callback_called_; |
578 FilePath target_path_; | 582 FilePath target_path_; |
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
648 callback_called_ = false; | 652 callback_called_ = false; |
649 DetermineDownloadTarget(&item); | 653 DetermineDownloadTarget(&item); |
650 EXPECT_TRUE(callback_called_); | 654 EXPECT_TRUE(callback_called_); |
651 EXPECT_EQ(path, target_path_); | 655 EXPECT_EQ(path, target_path_); |
652 EXPECT_EQ(DownloadItem::TARGET_DISPOSITION_OVERWRITE, target_disposition_); | 656 EXPECT_EQ(DownloadItem::TARGET_DISPOSITION_OVERWRITE, target_disposition_); |
653 EXPECT_EQ(DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS, danger_type_); | 657 EXPECT_EQ(DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS, danger_type_); |
654 EXPECT_EQ(path, intermediate_path_); | 658 EXPECT_EQ(path, intermediate_path_); |
655 } | 659 } |
656 | 660 |
657 // Does DownloadStopped remove Download from appropriate queues? | 661 // Does DownloadStopped remove Download from appropriate queues? |
658 // This test tests non-persisted downloads. | 662 TEST_F(DownloadManagerTest, OnDownloadStopped) { |
659 TEST_F(DownloadManagerTest, OnDownloadStopped_NonPersisted) { | |
660 // Put a mock we have a handle to on the download manager. | 663 // Put a mock we have a handle to on the download manager. |
661 MockDownloadItemImpl& item(AddItemToManager()); | 664 MockDownloadItemImpl& item(AddItemToManager()); |
662 | 665 |
663 EXPECT_CALL(item, IsPersisted()) | |
664 .WillRepeatedly(Return(false)); | |
665 EXPECT_CALL(item, GetState()) | 666 EXPECT_CALL(item, GetState()) |
666 .WillRepeatedly(Return(DownloadItem::CANCELLED)); | 667 .WillRepeatedly(Return(DownloadItem::CANCELLED)); |
667 EXPECT_CALL(item, GetDbHandle()) | |
668 .WillRepeatedly(Return(DownloadItem::kUninitializedHandle)); | |
669 | 668 |
670 DownloadStopped(&item); | 669 DownloadStopped(&item); |
671 } | 670 } |
672 | |
673 // Does DownloadStopped remove Download from appropriate queues? | |
674 // This test tests persisted downloads. | |
675 TEST_F(DownloadManagerTest, OnDownloadStopped_Persisted) { | |
676 // Put a mock we have a handle to on the download manager. | |
677 MockDownloadItemImpl& item(AddItemToManager()); | |
678 int64 db_handle = 0x7; | |
679 AddItemToHistory(item, db_handle); | |
680 | |
681 EXPECT_CALL(item, IsPersisted()) | |
682 .WillRepeatedly(Return(true)); | |
683 EXPECT_CALL(GetMockDownloadManagerDelegate(), | |
684 UpdateItemInPersistentStore(&item)); | |
685 EXPECT_CALL(item, GetState()) | |
686 .WillRepeatedly(Return(DownloadItem::CANCELLED)); | |
687 EXPECT_CALL(item, GetDbHandle()) | |
688 .WillRepeatedly(Return(db_handle)); | |
689 | |
690 DownloadStopped(&item); | |
691 } | |
692 | 671 |
693 } // namespace content | 672 } // namespace content |
OLD | NEW |