summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorttr314 <ttr314@googlemail.com>2015-08-06 13:11:26 -0700
committerCommit bot <commit-bot@chromium.org>2015-08-06 20:11:56 +0000
commit81dc54b2ec32a33e6a7081f5537c53dc9863a153 (patch)
treef9e85ad20295de9d2b47ea353b6705cdcc274f49
parente8d881d426badb372032440cec72095b5df550cc (diff)
downloadchromium_src-81dc54b2ec32a33e6a7081f5537c53dc9863a153.zip
chromium_src-81dc54b2ec32a33e6a7081f5537c53dc9863a153.tar.gz
chromium_src-81dc54b2ec32a33e6a7081f5537c53dc9863a153.tar.bz2
Support restricting browsing data removal for downloads by origin.
This CL adds support for restricting removal of downloads by origin. We do so by extending DownloadManager's API and passing in the origin. BUG=113969 TEST=added unit tests Review URL: https://codereview.chromium.org/1251243003 Cr-Commit-Position: refs/heads/master@{#342187}
-rw-r--r--chrome/browser/browsing_data/browsing_data_remover.cc29
-rw-r--r--chrome/browser/browsing_data/browsing_data_remover.h11
-rw-r--r--chrome/browser/browsing_data/browsing_data_remover_unittest.cc77
-rw-r--r--content/browser/browser_context.cc17
-rw-r--r--content/browser/download/download_manager_impl.cc44
-rw-r--r--content/browser/download/download_manager_impl.h9
-rw-r--r--content/browser/download/download_manager_impl_unittest.cc29
-rw-r--r--content/public/browser/browser_context.h3
-rw-r--r--content/public/browser/download_manager.h10
-rw-r--r--content/public/test/mock_download_manager.h9
10 files changed, 208 insertions, 30 deletions
diff --git a/chrome/browser/browsing_data/browsing_data_remover.cc b/chrome/browser/browsing_data/browsing_data_remover.cc
index 04279c4..4b255ea 100644
--- a/chrome/browser/browsing_data/browsing_data_remover.cc
+++ b/chrome/browser/browsing_data/browsing_data_remover.cc
@@ -68,6 +68,7 @@
#include "net/url_request/url_request_context.h"
#include "net/url_request/url_request_context_getter.h"
#include "storage/browser/quota/special_storage_policy.h"
+#include "url/origin.h"
#if defined(OS_ANDROID)
#include "chrome/browser/precache/precache_manager_factory.h"
@@ -243,7 +244,6 @@ BrowsingDataRemover::BrowsingDataRemover(Profile* profile,
waiting_for_clear_webrtc_logs_(false),
#endif
remove_mask_(0),
- remove_origin_(GURL()),
origin_type_mask_(0),
storage_partition_for_testing_(NULL) {
DCHECK(profile);
@@ -270,13 +270,13 @@ void BrowsingDataRemover::Remove(int remove_mask, int origin_type_mask) {
}
void BrowsingDataRemover::RemoveImpl(int remove_mask,
- const GURL& origin,
+ const GURL& remove_url,
int origin_type_mask) {
DCHECK_CURRENTLY_ON(BrowserThread::UI);
set_removing(true);
remove_mask_ = remove_mask;
- remove_origin_ = origin;
origin_type_mask_ = origin_type_mask;
+ url::Origin remove_origin(remove_url);
PrefService* prefs = profile_->GetPrefs();
bool may_delete_history = prefs->GetBoolean(
@@ -313,8 +313,8 @@ void BrowsingDataRemover::RemoveImpl(int remove_mask,
profile_, ServiceAccessType::EXPLICIT_ACCESS);
if (history_service) {
std::set<GURL> restrict_urls;
- if (!remove_origin_.is_empty())
- restrict_urls.insert(remove_origin_);
+ if (!remove_url.is_empty())
+ restrict_urls.insert(remove_url);
content::RecordAction(UserMetricsAction("ClearBrowsingData_History"));
waiting_for_clear_history_ = true;
@@ -378,8 +378,8 @@ void BrowsingDataRemover::RemoveImpl(int remove_mask,
keywords_model->Load();
waiting_for_clear_keyword_data_ = true;
} else if (keywords_model) {
- keywords_model->RemoveAutoGeneratedForOriginBetween(remove_origin_,
- delete_begin_, delete_end_);
+ keywords_model->RemoveAutoGeneratedForOriginBetween(
+ remove_url, delete_begin_, delete_end_);
}
// The PrerenderManager keeps history of prerendered pages, so clear that.
@@ -396,7 +396,7 @@ void BrowsingDataRemover::RemoveImpl(int remove_mask,
// If the caller is removing history for all hosts, then clear ancillary
// historical information.
- if (remove_origin_.is_empty()) {
+ if (remove_url.is_empty()) {
// We also delete the list of recently closed tabs. Since these expire,
// they can't be more than a day old, so we can simply clear them all.
TabRestoreService* tab_service =
@@ -479,7 +479,11 @@ void BrowsingDataRemover::RemoveImpl(int remove_mask,
content::RecordAction(UserMetricsAction("ClearBrowsingData_Downloads"));
content::DownloadManager* download_manager =
BrowserContext::GetDownloadManager(profile_);
- download_manager->RemoveDownloadsBetween(delete_begin_, delete_end_);
+ if (remove_origin.unique())
+ download_manager->RemoveDownloadsBetween(delete_begin_, delete_end_);
+ else
+ download_manager->RemoveDownloadsByOriginAndTime(
+ remove_origin, delete_begin_, delete_end_);
DownloadPrefs* download_prefs = DownloadPrefs::FromDownloadManager(
download_manager);
download_prefs->SetSaveFilePath(download_prefs->DownloadPath());
@@ -719,11 +723,8 @@ void BrowsingDataRemover::RemoveImpl(int remove_mask,
}
storage_partition->ClearData(
- storage_partition_remove_mask,
- quota_storage_remove_mask,
- remove_origin_,
- base::Bind(&DoesOriginMatchMask, origin_type_mask_),
- delete_begin_,
+ storage_partition_remove_mask, quota_storage_remove_mask, remove_url,
+ base::Bind(&DoesOriginMatchMask, origin_type_mask_), delete_begin_,
delete_end_,
base::Bind(&BrowsingDataRemover::OnClearedStoragePartitionData,
base::Unretained(this)));
diff --git a/chrome/browser/browsing_data/browsing_data_remover.h b/chrome/browser/browsing_data/browsing_data_remover.h
index a5c5361..ca11a8a 100644
--- a/chrome/browser/browsing_data/browsing_data_remover.h
+++ b/chrome/browser/browsing_data/browsing_data_remover.h
@@ -22,6 +22,7 @@
#endif
#include "storage/common/quota/quota_types.h"
#include "url/gurl.h"
+#include "url/origin.h"
class IOThread;
class Profile;
@@ -271,11 +272,14 @@ class BrowsingDataRemover
#endif
// Removes the specified items related to browsing for a specific host. If the
- // provided |origin| is empty, data is removed for all origins. The
+ // provided |remove_url| is empty, data is removed for all origins. The
// |origin_type_mask| parameter defines the set of origins from which data
// should be removed (protected, unprotected, or both).
+ // TODO(mkwst): The current implementation relies on unique (empty) origins to
+ // signal removal of all origins. Reconsider this behavior if/when we build
+ // a "forget this site" feature.
void RemoveImpl(int remove_mask,
- const GURL& origin,
+ const GURL& remove_url,
int origin_type_mask);
// Notifies observers and deletes this object.
@@ -439,9 +443,6 @@ class BrowsingDataRemover
// The removal mask for the current removal operation.
int remove_mask_;
- // The origin for the current removal operation.
- GURL remove_origin_;
-
// From which types of origins should we remove data?
int origin_type_mask_;
diff --git a/chrome/browser/browsing_data/browsing_data_remover_unittest.cc b/chrome/browser/browsing_data/browsing_data_remover_unittest.cc
index f16f835..59e73b3 100644
--- a/chrome/browser/browsing_data/browsing_data_remover_unittest.cc
+++ b/chrome/browser/browsing_data/browsing_data_remover_unittest.cc
@@ -24,6 +24,7 @@
#include "chrome/browser/browsing_data/browsing_data_helper.h"
#include "chrome/browser/browsing_data/browsing_data_remover_test_util.h"
#include "chrome/browser/domain_reliability/service_factory.h"
+#include "chrome/browser/download/chrome_download_manager_delegate.h"
#include "chrome/browser/favicon/favicon_service_factory.h"
#include "chrome/browser/history/history_service_factory.h"
#include "chrome/browser/safe_browsing/safe_browsing_service.h"
@@ -43,10 +44,12 @@
#include "components/favicon/core/favicon_service.h"
#include "components/history/core/browser/history_service.h"
#include "components/omnibox/browser/omnibox_pref_names.h"
+#include "content/public/browser/browser_context.h"
#include "content/public/browser/cookie_store_factory.h"
#include "content/public/browser/dom_storage_context.h"
#include "content/public/browser/local_storage_usage_info.h"
#include "content/public/browser/storage_partition.h"
+#include "content/public/test/mock_download_manager.h"
#include "content/public/test/test_browser_thread.h"
#include "content/public/test/test_browser_thread_bundle.h"
#include "content/public/test/test_utils.h"
@@ -60,6 +63,7 @@
#include "testing/gtest/include/gtest/gtest.h"
#include "third_party/skia/include/core/SkBitmap.h"
#include "ui/gfx/favicon_size.h"
+#include "url/origin.h"
#if defined(OS_CHROMEOS)
#include "chrome/browser/chromeos/login/users/mock_user_manager.h"
@@ -85,7 +89,13 @@ using domain_reliability::DomainReliabilityMonitor;
using domain_reliability::DomainReliabilityService;
using domain_reliability::DomainReliabilityServiceFactory;
using testing::_;
+using testing::ByRef;
using testing::Invoke;
+using testing::Matcher;
+using testing::MakeMatcher;
+using testing::MatcherInterface;
+using testing::MatchResultListener;
+using testing::Return;
using testing::WithArgs;
namespace {
@@ -229,6 +239,36 @@ class TestStoragePartition : public StoragePartition {
DISALLOW_COPY_AND_ASSIGN(TestStoragePartition);
};
+// Custom matcher to verify is-same-origin relationship to given reference
+// origin.
+// (We cannot use equality-based matching because operator== is not defined for
+// Origin, and we in fact want to rely on IsSameOrigin for matching purposes.)
+class SameOriginMatcher : public MatcherInterface<const url::Origin&> {
+ public:
+ explicit SameOriginMatcher(const url::Origin& reference)
+ : reference_(reference) {}
+
+ virtual bool MatchAndExplain(const url::Origin& origin,
+ MatchResultListener* listener) const {
+ return reference_.IsSameOriginWith(origin);
+ }
+
+ virtual void DescribeTo(::std::ostream* os) const {
+ *os << "is same origin with " << reference_;
+ }
+
+ virtual void DescribeNegationTo(::std::ostream* os) const {
+ *os << "is not same origin with " << reference_;
+ }
+
+ private:
+ const url::Origin& reference_;
+};
+
+inline Matcher<const url::Origin&> SameOrigin(const url::Origin& reference) {
+ return MakeMatcher(new SameOriginMatcher(reference));
+}
+
} // namespace
// Testers -------------------------------------------------------------------
@@ -804,6 +844,32 @@ class ClearDomainReliabilityTester {
MockDomainReliabilityService* mock_service_;
};
+class RemoveDownloadsTester {
+ public:
+ explicit RemoveDownloadsTester(TestingProfile* testing_profile)
+ : download_manager_(new content::MockDownloadManager()),
+ chrome_download_manager_delegate_(testing_profile) {
+ content::BrowserContext::SetDownloadManagerForTesting(testing_profile,
+ download_manager_);
+ EXPECT_EQ(download_manager_,
+ content::BrowserContext::GetDownloadManager(testing_profile));
+
+ EXPECT_CALL(*download_manager_, GetDelegate())
+ .WillOnce(Return(&chrome_download_manager_delegate_));
+ EXPECT_CALL(*download_manager_, Shutdown());
+ }
+
+ ~RemoveDownloadsTester() { chrome_download_manager_delegate_.Shutdown(); }
+
+ content::MockDownloadManager* download_manager() { return download_manager_; }
+
+ private:
+ content::MockDownloadManager* download_manager_;
+ ChromeDownloadManagerDelegate chrome_download_manager_delegate_;
+
+ DISALLOW_COPY_AND_ASSIGN(RemoveDownloadsTester);
+};
+
// Test Class ----------------------------------------------------------------
class BrowsingDataRemoverTest : public testing::Test {
@@ -1990,3 +2056,14 @@ TEST_F(BrowsingDataRemoverTest, DISABLED_DomainReliability_NoMonitor) {
BrowsingDataRemover::REMOVE_HISTORY |
BrowsingDataRemover::REMOVE_COOKIES, false);
}
+
+TEST_F(BrowsingDataRemoverTest, RemoveSameOriginDownloads) {
+ RemoveDownloadsTester tester(GetProfile());
+ const url::Origin expectedOrigin(kOrigin1);
+
+ EXPECT_CALL(*tester.download_manager(),
+ RemoveDownloadsByOriginAndTime(SameOrigin(expectedOrigin), _, _));
+
+ BlockUntilOriginDataRemoved(BrowsingDataRemover::EVERYTHING,
+ BrowsingDataRemover::REMOVE_DOWNLOADS, kOrigin1);
+}
diff --git a/content/browser/browser_context.cc b/content/browser/browser_context.cc
index a739483..25ffaf2 100644
--- a/content/browser/browser_context.cc
+++ b/content/browser/browser_context.cc
@@ -91,6 +91,13 @@ void ShutdownServiceWorkerContext(StoragePartition* partition) {
wrapper->process_manager()->Shutdown();
}
+void SetDownloadManager(BrowserContext* context,
+ content::DownloadManager* download_manager) {
+ DCHECK_CURRENTLY_ON(BrowserThread::UI);
+ DCHECK(download_manager);
+ context->SetUserData(kDownloadManagerKeyName, download_manager);
+}
+
} // namespace
// static
@@ -121,9 +128,7 @@ DownloadManager* BrowserContext::GetDownloadManager(
new DownloadManagerImpl(
GetContentClient()->browser()->GetNetLog(), context);
- context->SetUserData(
- kDownloadManagerKeyName,
- download_manager);
+ SetDownloadManager(context, download_manager);
download_manager->SetDelegate(context->GetDownloadManagerDelegate());
}
@@ -307,6 +312,12 @@ void BrowserContext::SaveSessionState(BrowserContext* browser_context) {
}
}
+void BrowserContext::SetDownloadManagerForTesting(
+ BrowserContext* browser_context,
+ DownloadManager* download_manager) {
+ SetDownloadManager(browser_context, download_manager);
+}
+
#endif // !OS_IOS
BrowserContext::~BrowserContext() {
diff --git a/content/browser/download/download_manager_impl.cc b/content/browser/download/download_manager_impl.cc
index ce39612..3f9a384 100644
--- a/content/browser/download/download_manager_impl.cc
+++ b/content/browser/download/download_manager_impl.cc
@@ -44,6 +44,7 @@
#include "net/base/request_priority.h"
#include "net/base/upload_bytes_element_reader.h"
#include "net/url_request/url_request_context.h"
+#include "url/origin.h"
namespace content {
namespace {
@@ -565,8 +566,26 @@ void DownloadManagerImpl::DownloadRemoved(DownloadItemImpl* download) {
delete download;
}
-int DownloadManagerImpl::RemoveDownloadsBetween(base::Time remove_begin,
- base::Time remove_end) {
+namespace {
+
+bool RemoveDownloadBetween(base::Time remove_begin,
+ base::Time remove_end,
+ const DownloadItemImpl* download_item) {
+ return download_item->GetStartTime() >= remove_begin &&
+ (remove_end.is_null() || download_item->GetStartTime() < remove_end);
+}
+
+bool RemoveDownloadByOriginAndTime(const url::Origin& origin,
+ base::Time remove_begin,
+ base::Time remove_end,
+ const DownloadItemImpl* download_item) {
+ return origin.IsSameOriginWith(url::Origin(download_item->GetURL())) &&
+ RemoveDownloadBetween(remove_begin, remove_end, download_item);
+}
+
+} // namespace
+
+int DownloadManagerImpl::RemoveDownloads(const DownloadRemover& remover) {
int count = 0;
DownloadMap::const_iterator it = downloads_.begin();
while (it != downloads_.end()) {
@@ -575,10 +594,8 @@ int DownloadManagerImpl::RemoveDownloadsBetween(base::Time remove_begin,
// Increment done here to protect against invalidation below.
++it;
- if (download->GetStartTime() >= remove_begin &&
- (remove_end.is_null() || download->GetStartTime() < remove_end) &&
- (download->GetState() != DownloadItem::IN_PROGRESS)) {
- // Erases the download from downloads_.
+ if (download->GetState() != DownloadItem::IN_PROGRESS &&
+ remover.Run(download)) {
download->Remove();
count++;
}
@@ -586,6 +603,21 @@ int DownloadManagerImpl::RemoveDownloadsBetween(base::Time remove_begin,
return count;
}
+int DownloadManagerImpl::RemoveDownloadsByOriginAndTime(
+ const url::Origin& origin,
+ base::Time remove_begin,
+ base::Time remove_end) {
+ return RemoveDownloads(base::Bind(&RemoveDownloadByOriginAndTime,
+ base::ConstRef(origin), remove_begin,
+ remove_end));
+}
+
+int DownloadManagerImpl::RemoveDownloadsBetween(base::Time remove_begin,
+ base::Time remove_end) {
+ return RemoveDownloads(
+ base::Bind(&RemoveDownloadBetween, remove_begin, remove_end));
+}
+
int DownloadManagerImpl::RemoveDownloads(base::Time remove_begin) {
return RemoveDownloadsBetween(remove_begin, base::Time());
}
diff --git a/content/browser/download/download_manager_impl.h b/content/browser/download/download_manager_impl.h
index 9c9d12d..372fd58 100644
--- a/content/browser/download/download_manager_impl.h
+++ b/content/browser/download/download_manager_impl.h
@@ -9,6 +9,7 @@
#include <set>
#include <string>
+#include "base/callback_forward.h"
#include "base/containers/hash_tables.h"
#include "base/memory/ref_counted.h"
#include "base/memory/scoped_ptr.h"
@@ -66,6 +67,10 @@ class CONTENT_EXPORT DownloadManagerImpl : public DownloadManager,
scoped_ptr<DownloadCreateInfo> info,
scoped_ptr<ByteStreamReader> stream,
const DownloadUrlParameters::OnStartedCallback& on_started) override;
+
+ int RemoveDownloadsByOriginAndTime(const url::Origin& origin,
+ base::Time remove_begin,
+ base::Time remove_end) override;
int RemoveDownloadsBetween(base::Time remove_begin,
base::Time remove_end) override;
int RemoveDownloads(base::Time remove_begin) override;
@@ -108,6 +113,7 @@ class CONTENT_EXPORT DownloadManagerImpl : public DownloadManager,
typedef std::set<DownloadItem*> DownloadSet;
typedef base::hash_map<uint32, DownloadItemImpl*> DownloadMap;
typedef std::vector<DownloadItemImpl*> DownloadItemImplVector;
+ typedef base::Callback<bool(const DownloadItemImpl*)> DownloadRemover;
// For testing.
friend class DownloadManagerTest;
@@ -142,6 +148,9 @@ class CONTENT_EXPORT DownloadManagerImpl : public DownloadManager,
// observer.
void OnFileExistenceChecked(uint32 download_id, bool result);
+ // Remove all downloads for which |remover| returns true.
+ int RemoveDownloads(const DownloadRemover& remover);
+
// Overridden from DownloadItemImplDelegate
// (Note that |GetBrowserContext| are present in both interfaces.)
void DetermineDownloadTarget(DownloadItemImpl* item,
diff --git a/content/browser/download/download_manager_impl_unittest.cc b/content/browser/download/download_manager_impl_unittest.cc
index 52adff4..d4f9233 100644
--- a/content/browser/download/download_manager_impl_unittest.cc
+++ b/content/browser/download/download_manager_impl_unittest.cc
@@ -37,6 +37,7 @@
#include "testing/gmock/include/gmock/gmock.h"
#include "testing/gmock_mutant.h"
#include "testing/gtest/include/gtest/gtest.h"
+#include "url/origin.h"
using ::testing::AllOf;
using ::testing::DoAll;
@@ -483,6 +484,10 @@ class DownloadManagerTest : public testing::Test {
observer_.reset(new MockDownloadManagerObserver());
download_manager_->AddObserver(observer_.get());
download_manager_->SetDelegate(mock_download_manager_delegate_.get());
+ download_urls_.push_back(GURL("http://www.url1.com"));
+ download_urls_.push_back(GURL("http://www.url2.com"));
+ download_urls_.push_back(GURL("http://www.url3.com"));
+ download_urls_.push_back(GURL("http://www.url4.com"));
}
void TearDown() override {
@@ -502,6 +507,7 @@ class DownloadManagerTest : public testing::Test {
message_loop_.RunUntilIdle();
mock_download_manager_delegate_.reset();
mock_browser_context_.reset();
+ download_urls_.clear();
}
// Returns download id.
@@ -521,6 +527,8 @@ class DownloadManagerTest : public testing::Test {
// in the factory.
scoped_ptr<DownloadRequestHandleInterface> req_handle;
item.Start(scoped_ptr<DownloadFile>(), req_handle.Pass());
+ DCHECK(id < download_urls_.size());
+ EXPECT_CALL(item, GetURL()).WillRepeatedly(ReturnRef(download_urls_[id]));
return item;
}
@@ -576,6 +584,8 @@ class DownloadManagerTest : public testing::Test {
DownloadDangerType danger_type_;
base::FilePath intermediate_path_;
+ std::vector<GURL> download_urls_;
+
private:
base::MessageLoopForUI message_loop_;
TestBrowserThread ui_thread_;
@@ -694,4 +704,23 @@ TEST_F(DownloadManagerTest, RemoveAllDownloads) {
// result in them being removed from the DownloadManager list.
}
+// Confirm that only downloads with same origin are removed.
+TEST_F(DownloadManagerTest, RemoveSameOriginDownloads) {
+ base::Time now(base::Time::Now());
+ for (uint32 i = 0; i < 2; ++i) {
+ MockDownloadItemImpl& item(AddItemToManager());
+ EXPECT_CALL(item, GetStartTime()).WillRepeatedly(Return(now));
+ EXPECT_CALL(item, GetState())
+ .WillRepeatedly(Return(DownloadItem::COMPLETE));
+ }
+
+ EXPECT_CALL(GetMockDownloadItem(0), Remove());
+ EXPECT_CALL(GetMockDownloadItem(1), Remove()).Times(0);
+
+ url::Origin origin_to_clear(download_urls_[0]);
+ int remove_count = download_manager_->RemoveDownloadsByOriginAndTime(
+ origin_to_clear, base::Time(), base::Time::Max());
+ EXPECT_EQ(remove_count, 1);
+}
+
} // namespace content
diff --git a/content/public/browser/browser_context.h b/content/public/browser/browser_context.h
index c15afef..1c17429 100644
--- a/content/public/browser/browser_context.h
+++ b/content/public/browser/browser_context.h
@@ -120,6 +120,9 @@ class CONTENT_EXPORT BrowserContext : public base::SupportsUserData {
// across the next restart.
static void SaveSessionState(BrowserContext* browser_context);
+ static void SetDownloadManagerForTesting(BrowserContext* browser_context,
+ DownloadManager* download_manager);
+
~BrowserContext() override;
// Creates a delegate to initialize a HostZoomMap and persist its information.
diff --git a/content/public/browser/download_manager.h b/content/public/browser/download_manager.h
index 74cb77d..f970897 100644
--- a/content/public/browser/download_manager.h
+++ b/content/public/browser/download_manager.h
@@ -44,6 +44,10 @@
class GURL;
+namespace url {
+class Origin;
+}
+
namespace content {
class BrowserContext;
@@ -110,6 +114,12 @@ class CONTENT_EXPORT DownloadManager : public base::SupportsUserData::Data {
scoped_ptr<ByteStreamReader> stream,
const DownloadUrlParameters::OnStartedCallback& on_started) = 0;
+ // Remove downloads which are same-origin with the given origin and pertain to
+ // the given time constraints. (See |RemoveDownloadsBetween|.)
+ virtual int RemoveDownloadsByOriginAndTime(const url::Origin& origin,
+ base::Time remove_begin,
+ base::Time remove_end) = 0;
+
// Remove downloads after remove_begin (inclusive) and before remove_end
// (exclusive). You may pass in null Time values to do an unbounded delete
// in either direction.
diff --git a/content/public/test/mock_download_manager.h b/content/public/test/mock_download_manager.h
index a67c2e8..a55bcee 100644
--- a/content/public/test/mock_download_manager.h
+++ b/content/public/test/mock_download_manager.h
@@ -14,6 +14,7 @@
#include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "url/gurl.h"
+#include "url/origin.h"
class DownloadRequestHandle;
@@ -88,8 +89,12 @@ class MockDownloadManager : public DownloadManager {
MOCK_METHOD2(MockStartDownload,
void(DownloadCreateInfo*, ByteStreamReader*));
- MOCK_METHOD2(RemoveDownloadsBetween, int(base::Time remove_begin,
- base::Time remove_end));
+ MOCK_METHOD3(RemoveDownloadsByOriginAndTime,
+ int(const url::Origin& origin,
+ base::Time remove_begin,
+ base::Time remove_end));
+ MOCK_METHOD2(RemoveDownloadsBetween,
+ int(base::Time remove_begin, base::Time remove_end));
MOCK_METHOD1(RemoveDownloads, int(base::Time remove_begin));
MOCK_METHOD0(RemoveAllDownloads, int());
MOCK_METHOD1(DownloadUrlMock, void(DownloadUrlParameters*));