summaryrefslogtreecommitdiff
path: root/chromium/components/download
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/components/download')
-rw-r--r--chromium/components/download/DIR_METADATA3
-rw-r--r--chromium/components/download/OWNERS2
-rw-r--r--chromium/components/download/content/public/download_navigation_observer.cc12
-rw-r--r--chromium/components/download/content/public/download_navigation_observer.h3
-rw-r--r--chromium/components/download/internal/background_service/logger_impl.cc10
-rw-r--r--chromium/components/download/internal/background_service/scheduler/device_status_listener.cc8
-rw-r--r--chromium/components/download/internal/common/BUILD.gn5
-rw-r--r--chromium/components/download/internal/common/base_file.cc3
-rw-r--r--chromium/components/download/internal/common/download_item_impl.cc22
-rw-r--r--chromium/components/download/internal/common/download_item_impl_delegate.cc6
-rw-r--r--chromium/components/download/internal/common/download_item_impl_unittest.cc83
-rw-r--r--chromium/components/download/internal/common/download_item_rename_handler.cc27
-rw-r--r--chromium/components/download/internal/common/download_path_reservation_tracker.cc2
-rw-r--r--chromium/components/download/internal/common/download_path_reservation_tracker_unittest.cc3
-rw-r--r--chromium/components/download/internal/common/download_stats.cc4
-rw-r--r--chromium/components/download/internal/common/download_stats_unittest.cc2
-rw-r--r--chromium/components/download/internal/common/download_utils.cc35
-rw-r--r--chromium/components/download/internal/common/in_progress_download_manager.cc8
-rw-r--r--chromium/components/download/internal/common/parallel_download_job.cc3
-rw-r--r--chromium/components/download/internal/common/parallel_download_job_unittest.cc20
-rw-r--r--chromium/components/download/network/BUILD.gn2
-rw-r--r--chromium/components/download/public/common/BUILD.gn3
-rw-r--r--chromium/components/download/public/common/DEPS1
-rw-r--r--chromium/components/download/public/common/download_danger_type.h4
-rw-r--r--chromium/components/download/public/common/download_features.cc5
-rw-r--r--chromium/components/download/public/common/download_features.h4
-rw-r--r--chromium/components/download/public/common/download_item.h7
-rw-r--r--chromium/components/download/public/common/download_item_impl.h4
-rw-r--r--chromium/components/download/public/common/download_item_impl_delegate.h9
-rw-r--r--chromium/components/download/public/common/download_item_rename_handler.h52
-rw-r--r--chromium/components/download/public/common/download_url_parameters.h13
-rw-r--r--chromium/components/download/public/common/download_utils.h6
-rw-r--r--chromium/components/download/public/common/mock_download_item.h1
-rw-r--r--chromium/components/download/public/task/BUILD.gn2
-rw-r--r--chromium/components/download/quarantine/DIR_METADATA3
-rw-r--r--chromium/components/download/quarantine/OWNERS2
36 files changed, 322 insertions, 57 deletions
diff --git a/chromium/components/download/DIR_METADATA b/chromium/components/download/DIR_METADATA
new file mode 100644
index 00000000000..6bf7cbfb89f
--- /dev/null
+++ b/chromium/components/download/DIR_METADATA
@@ -0,0 +1,3 @@
+monorail {
+ component: "UI>Browser>Downloads"
+}
diff --git a/chromium/components/download/OWNERS b/chromium/components/download/OWNERS
index 67edbd16bec..a115bbf3125 100644
--- a/chromium/components/download/OWNERS
+++ b/chromium/components/download/OWNERS
@@ -2,5 +2,3 @@ dtrainor@chromium.org
qinmin@chromium.org
shaktisahu@chromium.org
xingliu@chromium.org
-
-# COMPONENT: UI>Browser>Downloads
diff --git a/chromium/components/download/content/public/download_navigation_observer.cc b/chromium/components/download/content/public/download_navigation_observer.cc
index 32f49a0068f..88cc6725bd0 100644
--- a/chromium/components/download/content/public/download_navigation_observer.cc
+++ b/chromium/components/download/content/public/download_navigation_observer.cc
@@ -8,18 +8,6 @@
namespace download {
-// static
-void DownloadNavigationObserver::CreateForWebContents(
- content::WebContents* web_contents,
- NavigationMonitor* navigation_monitor) {
- DCHECK(web_contents);
- if (!FromWebContents(web_contents)) {
- web_contents->SetUserData(UserDataKey(),
- std::make_unique<DownloadNavigationObserver>(
- web_contents, navigation_monitor));
- }
-}
-
DownloadNavigationObserver::DownloadNavigationObserver(
content::WebContents* web_contents,
NavigationMonitor* navigation_monitor)
diff --git a/chromium/components/download/content/public/download_navigation_observer.h b/chromium/components/download/content/public/download_navigation_observer.h
index 6fa8fd0c13c..93cf4b9e053 100644
--- a/chromium/components/download/content/public/download_navigation_observer.h
+++ b/chromium/components/download/content/public/download_navigation_observer.h
@@ -18,9 +18,6 @@ class DownloadNavigationObserver
: public content::WebContentsObserver,
public content::WebContentsUserData<DownloadNavigationObserver> {
public:
- static void CreateForWebContents(content::WebContents* web_contents,
- NavigationMonitor* navigation_monitor);
-
DownloadNavigationObserver(content::WebContents* web_contents,
NavigationMonitor* navigation_monitor);
~DownloadNavigationObserver() override;
diff --git a/chromium/components/download/internal/background_service/logger_impl.cc b/chromium/components/download/internal/background_service/logger_impl.cc
index 6120d0e9eac..0864d80aefb 100644
--- a/chromium/components/download/internal/background_service/logger_impl.cc
+++ b/chromium/components/download/internal/background_service/logger_impl.cc
@@ -243,7 +243,7 @@ base::Value LoggerImpl::GetServiceDownloads() {
}
void LoggerImpl::OnServiceStatusChanged() {
- if (!observers_.might_have_observers())
+ if (observers_.empty())
return;
base::Value service_status = GetServiceStatus();
@@ -253,7 +253,7 @@ void LoggerImpl::OnServiceStatusChanged() {
}
void LoggerImpl::OnServiceDownloadsAvailable() {
- if (!observers_.might_have_observers())
+ if (observers_.empty())
return;
base::Value service_downloads = GetServiceDownloads();
@@ -262,7 +262,7 @@ void LoggerImpl::OnServiceDownloadsAvailable() {
}
void LoggerImpl::OnServiceDownloadChanged(const std::string& guid) {
- if (!observers_.might_have_observers())
+ if (observers_.empty())
return;
auto entry_details = log_source_->GetServiceDownload(guid);
@@ -280,7 +280,7 @@ void LoggerImpl::OnServiceDownloadFailed(CompletionType completion_type,
const Entry& entry) {
DCHECK_NE(CompletionType::SUCCEED, completion_type);
- if (!observers_.might_have_observers())
+ if (observers_.empty())
return;
auto serialized_entry = EntryToValue(entry, base::nullopt, completion_type);
@@ -292,7 +292,7 @@ void LoggerImpl::OnServiceRequestMade(
DownloadClient client,
const std::string& guid,
DownloadParams::StartResult start_result) {
- if (!observers_.might_have_observers())
+ if (observers_.empty())
return;
base::DictionaryValue serialized_request;
diff --git a/chromium/components/download/internal/background_service/scheduler/device_status_listener.cc b/chromium/components/download/internal/background_service/scheduler/device_status_listener.cc
index becbb1fe920..0de7f8f99a2 100644
--- a/chromium/components/download/internal/background_service/scheduler/device_status_listener.cc
+++ b/chromium/components/download/internal/background_service/scheduler/device_status_listener.cc
@@ -4,6 +4,7 @@
#include "components/download/internal/background_service/scheduler/device_status_listener.h"
#include "base/bind.h"
+#include "build/build_config.h"
namespace download {
@@ -28,10 +29,15 @@ NetworkStatus ToNetworkStatus(network::mojom::ConnectionType type) {
// TODO(crbug.com/1127134): 5G networks may be unmetered. Find a way to
// detect this and make DeviceStatusListener aware of it.
return NetworkStatus::METERED;
- case network::mojom::ConnectionType::CONNECTION_UNKNOWN:
case network::mojom::ConnectionType::CONNECTION_NONE:
case network::mojom::ConnectionType::CONNECTION_BLUETOOTH:
return NetworkStatus::DISCONNECTED;
+ case network::mojom::ConnectionType::CONNECTION_UNKNOWN:
+#if defined(OS_ANDROID)
+ return NetworkStatus::DISCONNECTED;
+#else
+ return NetworkStatus::UNMETERED;
+#endif
}
NOTREACHED();
return NetworkStatus::DISCONNECTED;
diff --git a/chromium/components/download/internal/common/BUILD.gn b/chromium/components/download/internal/common/BUILD.gn
index 37672de3548..44d41af8674 100644
--- a/chromium/components/download/internal/common/BUILD.gn
+++ b/chromium/components/download/internal/common/BUILD.gn
@@ -31,6 +31,7 @@ source_set("internal") {
"download_interrupt_reasons_utils.cc",
"download_item_impl.cc",
"download_item_impl_delegate.cc",
+ "download_item_rename_handler.cc",
"download_job.cc",
"download_job_factory.cc",
"download_job_impl.cc",
@@ -120,8 +121,8 @@ if (is_android) {
deps = [
"//base:base_java",
"//base:jni_java",
- "//third_party/android_deps:androidx_annotation_annotation_java",
"//third_party/android_provider:android_provider_java",
+ "//third_party/androidx:androidx_annotation_annotation_java",
]
annotation_processor_deps = [ "//base/android/jni_generator:jni_processor" ]
}
@@ -170,6 +171,8 @@ source_set("unit_tests") {
deps = [
":for_tests",
"//base/test:test_support",
+ "//build:chromeos_buildflags",
+ "//build:chromeos_buildflags",
"//components/download/database",
"//components/download/public/common:test_support",
"//components/leveldb_proto",
diff --git a/chromium/components/download/internal/common/base_file.cc b/chromium/components/download/internal/common/base_file.cc
index 4f4ebe4b752..8124e170ee5 100644
--- a/chromium/components/download/internal/common/base_file.cc
+++ b/chromium/components/download/internal/common/base_file.cc
@@ -594,6 +594,9 @@ GURL GetEffectiveAuthorityURL(const GURL& source_url,
// ftp:// has an authority.
if (source_url.SchemeIs(url::kFtpScheme))
return source_url;
+
+ if (source_url.SchemeIs(url::kBlobScheme))
+ return url::Origin::Create(source_url).GetURL();
}
if (referrer_url.is_valid() && referrer_url.SchemeIsHTTPOrHTTPS())
diff --git a/chromium/components/download/internal/common/download_item_impl.cc b/chromium/components/download/internal/common/download_item_impl.cc
index dfe701efa10..f557ef87951 100644
--- a/chromium/components/download/internal/common/download_item_impl.cc
+++ b/chromium/components/download/internal/common/download_item_impl.cc
@@ -150,8 +150,8 @@ std::string GetDownloadDangerNames(DownloadDangerType type) {
return "DANGEROUS_HOST";
case DOWNLOAD_DANGER_TYPE_POTENTIALLY_UNWANTED:
return "POTENTIALLY_UNWANTED";
- case DOWNLOAD_DANGER_TYPE_WHITELISTED_BY_POLICY:
- return "WHITELISTED_BY_POLICY";
+ case DOWNLOAD_DANGER_TYPE_ALLOWLISTED_BY_POLICY:
+ return "ALLOWLISTED_BY_POLICY";
default:
NOTREACHED();
return "UNKNOWN_DANGER_TYPE";
@@ -984,6 +984,10 @@ DownloadFile* DownloadItemImpl::GetDownloadFile() {
return download_file_.get();
}
+DownloadItemRenameHandler* DownloadItemImpl::GetRenameHandler() {
+ return rename_handler_.get();
+}
+
bool DownloadItemImpl::IsDangerous() const {
return danger_type_ == DOWNLOAD_DANGER_TYPE_DANGEROUS_FILE ||
danger_type_ == DOWNLOAD_DANGER_TYPE_DANGEROUS_URL ||
@@ -1932,11 +1936,20 @@ void DownloadItemImpl::OnDownloadCompleting() {
DCHECK(!IsDangerous());
DCHECK(download_file_);
+
// Unilaterally rename; even if it already has the right name,
- // we need theannotation.
+ // we need the annotation.
DownloadFile::RenameCompletionCallback callback =
base::BindOnce(&DownloadItemImpl::OnDownloadRenamedToFinalName,
- weak_ptr_factory_.GetWeakPtr());
+ weak_ptr_factory_.GetWeakPtr());
+
+ // If an alternate rename handler is specified, use it instead.
+ rename_handler_ = delegate_->GetRenameHandlerForDownload(this);
+ if (rename_handler_) {
+ rename_handler_->Start(std::move(callback));
+ return;
+ }
+
#if defined(OS_ANDROID)
if (GetTargetFilePath().IsContentUri()) {
GetDownloadTaskRunner()->PostTask(
@@ -1953,6 +1966,7 @@ void DownloadItemImpl::OnDownloadCompleting() {
auto quarantine_callback = delegate_->GetQuarantineConnectionCallback();
if (quarantine_callback)
quarantine_callback.Run(quarantine.InitWithNewPipeAndPassReceiver());
+
GetDownloadTaskRunner()->PostTask(
FROM_HERE,
base::BindOnce(&DownloadFile::RenameAndAnnotate,
diff --git a/chromium/components/download/internal/common/download_item_impl_delegate.cc b/chromium/components/download/internal/common/download_item_impl_delegate.cc
index 0f5ca1f5834..b432a41ee88 100644
--- a/chromium/components/download/internal/common/download_item_impl_delegate.cc
+++ b/chromium/components/download/internal/common/download_item_impl_delegate.cc
@@ -111,4 +111,10 @@ DownloadItemImplDelegate::GetQuarantineConnectionCallback() {
return base::NullCallback();
}
+std::unique_ptr<DownloadItemRenameHandler>
+DownloadItemImplDelegate::GetRenameHandlerForDownload(
+ DownloadItemImpl* download_item) {
+ return nullptr;
+}
+
} // namespace download
diff --git a/chromium/components/download/internal/common/download_item_impl_unittest.cc b/chromium/components/download/internal/common/download_item_impl_unittest.cc
index 3f30ed1b4f5..2405ec42511 100644
--- a/chromium/components/download/internal/common/download_item_impl_unittest.cc
+++ b/chromium/components/download/internal/common/download_item_impl_unittest.cc
@@ -30,6 +30,7 @@
#include "components/download/public/common/download_file_factory.h"
#include "components/download/public/common/download_interrupt_reasons.h"
#include "components/download/public/common/download_item_impl_delegate.h"
+#include "components/download/public/common/download_item_rename_handler.h"
#include "components/download/public/common/download_url_parameters.h"
#include "components/download/public/common/mock_download_file.h"
#include "crypto/secure_hash.h"
@@ -37,6 +38,8 @@
#include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h"
+using ::testing::_;
+using ::testing::ByMove;
using ::testing::DoAll;
using ::testing::Invoke;
using ::testing::InvokeWithoutArgs;
@@ -47,7 +50,6 @@ using ::testing::ReturnRefOfCopy;
using ::testing::SaveArg;
using ::testing::StrictMock;
using ::testing::WithArg;
-using ::testing::_;
const int kDownloadChunkSize = 1000;
const int kDownloadSpeed = 1000;
@@ -65,6 +67,19 @@ base::HistogramBase::Sample ToHistogramSample(T t) {
return static_cast<base::HistogramBase::Sample>(t);
}
+class MockDownloadItemRenameHandler : public DownloadItemRenameHandler {
+ public:
+ explicit MockDownloadItemRenameHandler(DownloadItem* item)
+ : DownloadItemRenameHandler(item) {}
+ ~MockDownloadItemRenameHandler() override = default;
+
+ MOCK_METHOD1(Start, void(Callback));
+
+ void VerifyAndClearExpectations() {
+ ::testing::Mock::VerifyAndClearExpectations(this);
+ }
+};
+
class MockDelegate : public DownloadItemImplDelegate {
public:
MockDelegate() { SetDefaultExpectations(); }
@@ -103,6 +118,8 @@ class MockDelegate : public DownloadItemImplDelegate {
MOCK_METHOD1(DownloadRemoved, void(DownloadItemImpl*));
MOCK_CONST_METHOD0(IsOffTheRecord, bool());
MOCK_METHOD(bool, IsActiveNetworkMetered, (), (const override));
+ MOCK_METHOD1(GetRenameHandlerForDownload,
+ std::unique_ptr<DownloadItemRenameHandler>(DownloadItemImpl*));
void VerifyAndClearExpectations() {
::testing::Mock::VerifyAndClearExpectations(this);
@@ -462,6 +479,8 @@ TEST_F(DownloadItemTest, NotificationAfterComplete) {
TestDownloadItemObserver observer(item);
MockDownloadFile* download_file =
DoIntermediateRename(item, DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS);
+ EXPECT_CALL(*mock_delegate(), GetRenameHandlerForDownload(item))
+ .WillOnce(Return(ByMove(std::unique_ptr<DownloadItemRenameHandler>())));
ASSERT_TRUE(observer.CheckAndResetDownloadUpdated());
DoDestinationComplete(item, download_file);
ASSERT_TRUE(observer.CheckAndResetDownloadUpdated());
@@ -540,6 +559,8 @@ TEST_F(DownloadItemTest, NotificationAfterOnContentCheckCompleted) {
EXPECT_CALL(*mock_delegate(), ShouldCompleteDownload_(_, _))
.WillOnce(Return(true));
+ EXPECT_CALL(*mock_delegate(), GetRenameHandlerForDownload(_))
+ .WillOnce(Return(ByMove(std::unique_ptr<DownloadItemRenameHandler>())));
EXPECT_CALL(*download_file, RenameAndAnnotate(_, _, _, _, _, _));
unsafeurl_item->ValidateDangerousDownload();
EXPECT_TRUE(unsafeurl_observer.CheckAndResetDownloadUpdated());
@@ -558,6 +579,8 @@ TEST_F(DownloadItemTest, NotificationAfterOnContentCheckCompleted) {
EXPECT_CALL(*mock_delegate(), ShouldCompleteDownload_(_, _))
.WillOnce(Return(true));
+ EXPECT_CALL(*mock_delegate(), GetRenameHandlerForDownload(_))
+ .WillOnce(Return(ByMove(std::unique_ptr<DownloadItemRenameHandler>())));
EXPECT_CALL(*download_file, RenameAndAnnotate(_, _, _, _, _, _));
unsafefile_item->ValidateDangerousDownload();
EXPECT_TRUE(unsafefile_observer.CheckAndResetDownloadUpdated());
@@ -798,6 +821,8 @@ TEST_F(DownloadItemTest, UnresumableInterrupt) {
// Fail final rename with unresumable reason.
EXPECT_CALL(*mock_delegate(), ShouldCompleteDownload_(item, _))
.WillOnce(Return(true));
+ EXPECT_CALL(*mock_delegate(), GetRenameHandlerForDownload(item))
+ .WillOnce(Return(ByMove(std::unique_ptr<DownloadItemRenameHandler>())));
auto task_runner = base::ThreadTaskRunnerHandle::Get();
EXPECT_CALL(
*download_file,
@@ -1336,6 +1361,8 @@ TEST_F(DownloadItemTest, CallbackAfterRename) {
EXPECT_CALL(*mock_delegate(), ShouldCompleteDownload_(item, _))
.WillOnce(Return(true));
+ EXPECT_CALL(*mock_delegate(), GetRenameHandlerForDownload(item))
+ .WillOnce(Return(ByMove(std::unique_ptr<DownloadItemRenameHandler>())));
EXPECT_CALL(*download_file, RenameAndAnnotate(final_path, _, _, _, _, _))
.WillOnce(WithArg<5>([&task_runner, &final_path](
DownloadFile::RenameCompletionCallback cb) {
@@ -1807,6 +1834,8 @@ TEST_F(DownloadItemTest, EnabledActionsForNormalDownload) {
EXPECT_CALL(*mock_delegate(), ShouldCompleteDownload_(item, _))
.WillOnce(Return(true));
+ EXPECT_CALL(*mock_delegate(), GetRenameHandlerForDownload(item))
+ .WillOnce(Return(ByMove(std::unique_ptr<DownloadItemRenameHandler>())));
EXPECT_CALL(*download_file, FullPath())
.WillOnce(ReturnRefOfCopy(base::FilePath()));
EXPECT_CALL(*download_file, Detach());
@@ -1837,6 +1866,8 @@ TEST_F(DownloadItemTest, EnabledActionsForTemporaryDownload) {
// Complete Temporary
EXPECT_CALL(*mock_delegate(), ShouldCompleteDownload_(item, _))
.WillOnce(Return(true));
+ EXPECT_CALL(*mock_delegate(), GetRenameHandlerForDownload(item))
+ .WillOnce(Return(ByMove(std::unique_ptr<DownloadItemRenameHandler>())));
auto task_runner = base::ThreadTaskRunnerHandle::Get();
EXPECT_CALL(*download_file, RenameAndAnnotate(_, _, _, _, _, _))
.WillOnce(
@@ -1902,6 +1933,8 @@ TEST_F(DownloadItemTest, CompleteDelegate_ReturnTrue) {
// Drive the delegate interaction.
EXPECT_CALL(*mock_delegate(), ShouldCompleteDownload_(item, _))
.WillOnce(Return(true));
+ EXPECT_CALL(*mock_delegate(), GetRenameHandlerForDownload(item))
+ .WillOnce(Return(ByMove(std::unique_ptr<DownloadItemRenameHandler>())));
item->DestinationObserverAsWeakPtr()->DestinationCompleted(
0, std::unique_ptr<crypto::SecureHash>());
EXPECT_EQ(DownloadItem::IN_PROGRESS, item->GetState());
@@ -1941,6 +1974,8 @@ TEST_F(DownloadItemTest, CompleteDelegate_BlockOnce) {
EXPECT_CALL(*mock_delegate(), ShouldCompleteDownload_(item, _))
.WillOnce(DoAll(MoveArg<1>(&delegate_callback), Return(false)))
.WillOnce(Return(true));
+ EXPECT_CALL(*mock_delegate(), GetRenameHandlerForDownload(item))
+ .WillOnce(Return(ByMove(std::unique_ptr<DownloadItemRenameHandler>())));
item->DestinationObserverAsWeakPtr()->DestinationCompleted(
0, std::unique_ptr<crypto::SecureHash>());
ASSERT_TRUE(delegate_callback);
@@ -1984,6 +2019,8 @@ TEST_F(DownloadItemTest, CompleteDelegate_SetDanger) {
EXPECT_CALL(*mock_delegate(), ShouldCompleteDownload_(item, _))
.WillOnce(DoAll(MoveArg<1>(&delegate_callback), Return(false)))
.WillOnce(Return(true));
+ EXPECT_CALL(*mock_delegate(), GetRenameHandlerForDownload(item))
+ .WillOnce(Return(ByMove(std::unique_ptr<DownloadItemRenameHandler>())));
item->DestinationObserverAsWeakPtr()->DestinationCompleted(
0, std::unique_ptr<crypto::SecureHash>());
ASSERT_TRUE(delegate_callback);
@@ -2037,6 +2074,8 @@ TEST_F(DownloadItemTest, CompleteDelegate_BlockTwice) {
.WillOnce(DoAll(MoveArg<1>(&delegate_callback), Return(false)))
.WillOnce(DoAll(MoveArg<1>(&delegate_callback), Return(false)))
.WillOnce(Return(true));
+ EXPECT_CALL(*mock_delegate(), GetRenameHandlerForDownload(item))
+ .WillOnce(Return(ByMove(std::unique_ptr<DownloadItemRenameHandler>())));
item->DestinationObserverAsWeakPtr()->DestinationCompleted(
0, std::unique_ptr<crypto::SecureHash>());
ASSERT_TRUE(delegate_callback);
@@ -2179,6 +2218,8 @@ TEST_F(DownloadItemTest, AnnotationWithEmptyURLInIncognito) {
}));
EXPECT_CALL(*mock_delegate(), ShouldCompleteDownload_(item, _))
.WillOnce(Return(true));
+ EXPECT_CALL(*mock_delegate(), GetRenameHandlerForDownload(item))
+ .WillOnce(Return(ByMove(std::unique_ptr<DownloadItemRenameHandler>())));
EXPECT_CALL(*download_file, FullPath())
.WillOnce(ReturnRefOfCopy(base::FilePath()));
EXPECT_CALL(*download_file, Detach());
@@ -2206,6 +2247,8 @@ TEST_F(DownloadItemTest, AnnotationWithEmptyURLInIncognito) {
EXPECT_CALL(*download_file, FullPath())
.WillOnce(ReturnRefOfCopy(base::FilePath()));
EXPECT_CALL(*download_file, Detach());
+ EXPECT_CALL(*mock_delegate(), GetRenameHandlerForDownload(item))
+ .WillOnce(Return(ByMove(std::unique_ptr<DownloadItemRenameHandler>())));
item->DestinationObserverAsWeakPtr()->DestinationCompleted(
0, std::unique_ptr<crypto::SecureHash>());
task_environment_.RunUntilIdle();
@@ -2757,5 +2800,43 @@ TEST_F(DownloadItemTest, CancelWithDownloadSchedule) {
EXPECT_FALSE(item->GetDownloadSchedule().has_value());
}
+TEST_F(DownloadItemTest, ExternalRenameHandler) {
+ // Start a download.
+ DownloadItemImpl* item = CreateDownloadItem();
+ MockDownloadFile* download_file =
+ DoIntermediateRename(item, DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS);
+ EXPECT_CALL(*download_file, Detach());
+
+ // Create a rename handler and make sure the delegate returns it.
+ DownloadItemRenameHandler::Callback callback;
+ auto rename_handler = std::make_unique<MockDownloadItemRenameHandler>(item);
+ MockDownloadItemRenameHandler* rename_handler_ptr = rename_handler.get();
+
+ ASSERT_EQ(item, rename_handler->download_item());
+
+ EXPECT_CALL(*rename_handler, Start(_)).WillOnce(MoveArg<0>(&callback));
+ EXPECT_CALL(*mock_delegate(), ShouldCompleteDownload_(item, _))
+ .WillOnce(Return(true));
+ EXPECT_CALL(*mock_delegate(), GetRenameHandlerForDownload(item))
+ .WillOnce(Return(ByMove(std::move(rename_handler))));
+
+ // The standard rename should not be called.
+ EXPECT_CALL(*download_file, RenameAndAnnotate(_, _, _, _, _, _)).Times(0);
+
+ item->DestinationObserverAsWeakPtr()->DestinationCompleted(
+ 0, std::unique_ptr<crypto::SecureHash>());
+ EXPECT_EQ(DownloadItem::IN_PROGRESS, item->GetState());
+ ASSERT_FALSE(callback.is_null());
+
+ // Invoke the rename callback. This should complete the download.
+ std::move(callback).Run(DOWNLOAD_INTERRUPT_REASON_NONE,
+ base::FilePath(kDummyTargetPath));
+ task_environment_.RunUntilIdle();
+ EXPECT_EQ(DownloadItem::COMPLETE, item->GetState());
+
+ ASSERT_NE(nullptr, item->GetRenameHandler());
+ rename_handler_ptr->VerifyAndClearExpectations();
+}
+
} // namespace
} // namespace download
diff --git a/chromium/components/download/internal/common/download_item_rename_handler.cc b/chromium/components/download/internal/common/download_item_rename_handler.cc
new file mode 100644
index 00000000000..53b32772598
--- /dev/null
+++ b/chromium/components/download/internal/common/download_item_rename_handler.cc
@@ -0,0 +1,27 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "components/download/public/common/download_item_rename_handler.h"
+
+#include "components/download/public/common/download_interrupt_reasons.h"
+#include "components/download/public/common/download_item.h"
+
+namespace download {
+
+DownloadItemRenameHandler::DownloadItemRenameHandler(
+ DownloadItem* download_item)
+ : download_item_(download_item) {}
+
+DownloadItemRenameHandler::~DownloadItemRenameHandler() = default;
+
+void DownloadItemRenameHandler::Start(Callback callback) {
+ std::move(callback).Run(DOWNLOAD_INTERRUPT_REASON_FILE_FAILED,
+ base::FilePath());
+}
+
+void DownloadItemRenameHandler::OpenDownload() {}
+
+void DownloadItemRenameHandler::ShowDownloadInContext() {}
+
+} // namespace download
diff --git a/chromium/components/download/internal/common/download_path_reservation_tracker.cc b/chromium/components/download/internal/common/download_path_reservation_tracker.cc
index 814fdf6ba97..36eefe4c6a9 100644
--- a/chromium/components/download/internal/common/download_path_reservation_tracker.cc
+++ b/chromium/components/download/internal/common/download_path_reservation_tracker.cc
@@ -11,13 +11,13 @@
#include "base/bind.h"
#include "base/callback.h"
+#include "base/containers/contains.h"
#include "base/files/file_path.h"
#include "base/files/file_util.h"
#include "base/logging.h"
#include "base/macros.h"
#include "base/memory/ptr_util.h"
#include "base/sequenced_task_runner.h"
-#include "base/stl_util.h"
#include "base/strings/string_util.h"
#include "base/strings/stringprintf.h"
#include "base/task/lazy_thread_pool_task_runner.h"
diff --git a/chromium/components/download/internal/common/download_path_reservation_tracker_unittest.cc b/chromium/components/download/internal/common/download_path_reservation_tracker_unittest.cc
index b74c6df9e0c..e60b645f949 100644
--- a/chromium/components/download/internal/common/download_path_reservation_tracker_unittest.cc
+++ b/chromium/components/download/internal/common/download_path_reservation_tracker_unittest.cc
@@ -19,6 +19,7 @@
#include "base/test/test_file_util.h"
#include "base/time/time.h"
#include "build/build_config.h"
+#include "build/chromeos_buildflags.h"
#include "components/download/public/common/download_path_reservation_tracker.h"
#include "components/download/public/common/mock_download_item.h"
#include "net/base/filename_util.h"
@@ -667,7 +668,7 @@ TEST_F(DownloadPathReservationTrackerTest, UpdatesToTargetPath) {
// Tests for long name truncation. On other platforms automatic truncation
// is not performed (yet).
-#if defined(OS_WIN) || defined(OS_APPLE) || defined(OS_CHROMEOS)
+#if defined(OS_WIN) || defined(OS_APPLE) || BUILDFLAG(IS_CHROMEOS_ASH)
TEST_F(DownloadPathReservationTrackerTest, BasicTruncation) {
int real_max_length =
diff --git a/chromium/components/download/internal/common/download_stats.cc b/chromium/components/download/internal/common/download_stats.cc
index 3d9f4b61c5e..7095d8a1907 100644
--- a/chromium/components/download/internal/common/download_stats.cc
+++ b/chromium/components/download/internal/common/download_stats.cc
@@ -659,13 +659,9 @@ void RecordParallelizableDownloadAverageStats(
int64_t file_size_kb = bytes_downloaded / 1024;
RecordBandwidthMetric("Download.ParallelizableDownloadBandwidth",
average_bandwidth);
- UMA_HISTOGRAM_LONG_TIMES("Download.Parallelizable.DownloadTime", time_span);
UMA_HISTOGRAM_CUSTOM_COUNTS("Download.Parallelizable.FileSize", file_size_kb,
1, kMaxFileSizeKb, 50);
if (average_bandwidth > kHighBandwidthBytesPerSecond) {
- UMA_HISTOGRAM_LONG_TIMES(
- "Download.Parallelizable.DownloadTime.HighDownloadBandwidth",
- time_span);
UMA_HISTOGRAM_CUSTOM_COUNTS(
"Download.Parallelizable.FileSize.HighDownloadBandwidth", file_size_kb,
1, kMaxFileSizeKb, 50);
diff --git a/chromium/components/download/internal/common/download_stats_unittest.cc b/chromium/components/download/internal/common/download_stats_unittest.cc
index 796fb1ae1d6..b4b42b74938 100644
--- a/chromium/components/download/internal/common/download_stats_unittest.cc
+++ b/chromium/components/download/internal/common/download_stats_unittest.cc
@@ -21,8 +21,6 @@ void VerfiyParallelizableAverageStats(int64_t bytes_downloaded,
RecordParallelizableDownloadAverageStats(bytes_downloaded, time_span);
histogram_tester.ExpectBucketCount("Download.ParallelizableDownloadBandwidth",
expected_bandwidth, 1);
- histogram_tester.ExpectBucketCount("Download.Parallelizable.DownloadTime",
- time_span.InMilliseconds(), 1);
histogram_tester.ExpectBucketCount("Download.Parallelizable.FileSize",
bytes_downloaded / 1024, 1);
}
diff --git a/chromium/components/download/internal/common/download_utils.cc b/chromium/components/download/internal/common/download_utils.cc
index f75993e5d01..6ad1043959e 100644
--- a/chromium/components/download/internal/common/download_utils.cc
+++ b/chromium/components/download/internal/common/download_utils.cc
@@ -51,6 +51,9 @@ const int64_t kInvalidFileWriteOffset = -1;
// downloads will be deleted after expiration.
const int kDefaultDownloadExpiredTimeInDays = 90;
+// Default time for an overwritten download to be removed from the history.
+const int kDefaultOverwrittenDownloadExpiredTimeInDays = 90;
+
#if defined(OS_ANDROID)
// Default maximum length of a downloaded file name on Android.
const int kDefaultMaxFileNameLengthOnAndroid = 127;
@@ -267,20 +270,26 @@ std::unique_ptr<network::ResourceRequest> CreateResourceRequest(
request->request_initiator = params->initiator();
request->trusted_params = network::ResourceRequest::TrustedParams();
- // Treat downloads like top-level frame navigations to be consistent with
- // cookie behavior. Also, since web-initiated downloads bypass the disk cache,
- // sites can't use download timing information to tell if a cross-site URL has
- // been visited before.
- url::Origin origin = url::Origin::Create(params->url());
- request->trusted_params->isolation_info = net::IsolationInfo::Create(
- net::IsolationInfo::RequestType::kMainFrame, origin, origin,
- net::SiteForCookies::FromOrigin(origin));
+ if (params->isolation_info().has_value()) {
+ request->trusted_params->isolation_info = params->isolation_info().value();
+ request->site_for_cookies = params->isolation_info()->site_for_cookies();
+ } else {
+ // Treat downloads like top-level frame navigations to be consistent with
+ // cookie behavior. Also, since web-initiated downloads bypass the disk
+ // cache, sites can't use download timing information to tell if a
+ // cross-site URL has been visited before.
+ url::Origin origin = url::Origin::Create(params->url());
+ request->trusted_params->isolation_info = net::IsolationInfo::Create(
+ net::IsolationInfo::RequestType::kMainFrame, origin, origin,
+ net::SiteForCookies::FromOrigin(origin));
+ request->site_for_cookies = net::SiteForCookies::FromUrl(params->url());
+ }
request->do_not_prompt_for_login = params->do_not_prompt_for_login();
- request->site_for_cookies = net::SiteForCookies::FromUrl(params->url());
request->referrer = params->referrer();
request->referrer_policy = params->referrer_policy();
request->is_main_frame = true;
+ request->update_first_party_url_on_redirect = true;
// Downloads should be treated as navigations from Fetch spec perspective.
// See also:
@@ -638,4 +647,12 @@ base::TimeDelta GetExpiredDownloadDeleteTime() {
return base::TimeDelta::FromDays(expired_days);
}
+base::TimeDelta GetOverwrittenDownloadDeleteTime() {
+ int expired_days = base::GetFieldTrialParamByFeatureAsInt(
+ features::kDeleteOverwrittenDownloads,
+ kOverwrittenDownloadDeleteTimeFinchKey,
+ kDefaultOverwrittenDownloadExpiredTimeInDays);
+ return base::TimeDelta::FromDays(expired_days);
+}
+
} // namespace download
diff --git a/chromium/components/download/internal/common/in_progress_download_manager.cc b/chromium/components/download/internal/common/in_progress_download_manager.cc
index 1b802400fe2..c8a3830f214 100644
--- a/chromium/components/download/internal/common/in_progress_download_manager.cc
+++ b/chromium/components/download/internal/common/in_progress_download_manager.cc
@@ -476,7 +476,7 @@ void InProgressDownloadManager::StartDownload(
if (delegate_ && delegate_->InterceptDownload(*info)) {
if (cancel_request_callback)
std::move(cancel_request_callback).Run(false);
- GetDownloadTaskRunner()->DeleteSoon(FROM_HERE, stream.release());
+ GetIOTaskRunner()->DeleteSoon(FROM_HERE, std::move(stream));
return;
}
}
@@ -534,7 +534,7 @@ void InProgressDownloadManager::StartDownloadWithItem(
std::move(cancel_request_callback).Run(false);
// The ByteStreamReader lives and dies on the download sequence.
if (info->result == DOWNLOAD_INTERRUPT_REASON_NONE)
- GetDownloadTaskRunner()->DeleteSoon(FROM_HERE, stream.release());
+ GetIOTaskRunner()->DeleteSoon(FROM_HERE, std::move(stream));
return;
}
@@ -576,7 +576,8 @@ void InProgressDownloadManager::OnDBInitialized(
std::unique_ptr<std::vector<DownloadDBEntry>> entries) {
#if defined(OS_ANDROID)
// Retrieve display names for all downloads from media store if needed.
- if (base::android::BuildInfo::GetInstance()->is_at_least_q()) {
+ if (base::android::BuildInfo::GetInstance()->sdk_int() >=
+ base::android::SDK_VERSION_Q) {
DownloadCollectionBridge::GetDisplayNamesCallback callback =
base::BindOnce(&InProgressDownloadManager::OnDownloadNamesRetrieved,
weak_factory_.GetWeakPtr(), std::move(entries));
@@ -679,6 +680,7 @@ void InProgressDownloadManager::NotifyDownloadsInitialized() {
void InProgressDownloadManager::AddInProgressDownloadForTest(
std::unique_ptr<download::DownloadItemImpl> download) {
in_progress_downloads_.push_back(std::move(download));
+ NotifyDownloadsInitialized();
}
void InProgressDownloadManager::CancelUrlDownload(
diff --git a/chromium/components/download/internal/common/parallel_download_job.cc b/chromium/components/download/internal/common/parallel_download_job.cc
index c4c88473b28..6c53b1be9ba 100644
--- a/chromium/components/download/internal/common/parallel_download_job.cc
+++ b/chromium/components/download/internal/common/parallel_download_job.cc
@@ -196,6 +196,9 @@ void ParallelDownloadJob::BuildParallelRequests() {
if (!received_slices.empty() && received_slices.back().finished)
slices_to_download.pop_back();
+ if (slices_to_download.empty())
+ return;
+
ForkSubRequests(slices_to_download);
RecordParallelDownloadRequestCount(
static_cast<int>(slices_to_download.size()));
diff --git a/chromium/components/download/internal/common/parallel_download_job_unittest.cc b/chromium/components/download/internal/common/parallel_download_job_unittest.cc
index 1abeb45d725..51d7663d39b 100644
--- a/chromium/components/download/internal/common/parallel_download_job_unittest.cc
+++ b/chromium/components/download/internal/common/parallel_download_job_unittest.cc
@@ -459,4 +459,24 @@ TEST_F(ParallelDownloadJobTest, InterruptOnStartup) {
DestroyParallelJob();
}
+// Test that if all slices are completed before forking the parallel requests,
+// no parallel requests should be created.
+TEST_F(ParallelDownloadJobTest,
+ AllSlicesFinishedBeforeForkingParallelRequests) {
+ DownloadItem::ReceivedSlices slices = {
+ DownloadItem::ReceivedSlice(0, 20),
+ DownloadItem::ReceivedSlice(50, 50, true)};
+ CreateParallelJob(10, 90, slices, 2, 1, 10);
+ DownloadItem::ReceivedSlices new_slices = {
+ DownloadItem::ReceivedSlice(0, 50),
+ DownloadItem::ReceivedSlice(50, 50, true)};
+ EXPECT_CALL(*download_item_, GetReceivedSlices())
+ .WillRepeatedly(ReturnRef(new_slices));
+
+ BuildParallelRequests();
+ EXPECT_EQ(0u, job_->workers().size());
+
+ DestroyParallelJob();
+}
+
} // namespace download
diff --git a/chromium/components/download/network/BUILD.gn b/chromium/components/download/network/BUILD.gn
index 40fb04cd3fc..474413dccdd 100644
--- a/chromium/components/download/network/BUILD.gn
+++ b/chromium/components/download/network/BUILD.gn
@@ -46,7 +46,7 @@ if (is_android) {
"//base:base_java",
"//base:jni_java",
"//net/android:net_java",
- "//third_party/android_deps:androidx_annotation_annotation_java",
+ "//third_party/androidx:androidx_annotation_annotation_java",
]
annotation_processor_deps = [ "//base/android/jni_generator:jni_processor" ]
}
diff --git a/chromium/components/download/public/common/BUILD.gn b/chromium/components/download/public/common/BUILD.gn
index 4e1469be24f..3c8df71fb8b 100644
--- a/chromium/components/download/public/common/BUILD.gn
+++ b/chromium/components/download/public/common/BUILD.gn
@@ -37,6 +37,7 @@ component("public") {
"download_item_factory.h",
"download_item_impl.h",
"download_item_impl_delegate.h",
+ "download_item_rename_handler.h",
"download_job.h",
"download_job_factory.h",
"download_path_reservation_tracker.h",
@@ -109,7 +110,7 @@ if (is_android) {
deps = [
"//base:base_java",
"//components/download/internal/common:internal_java",
- "//third_party/android_deps:androidx_annotation_annotation_java",
+ "//third_party/androidx:androidx_annotation_annotation_java",
]
}
diff --git a/chromium/components/download/public/common/DEPS b/chromium/components/download/public/common/DEPS
index b6a658afc0c..e9121f4bb08 100644
--- a/chromium/components/download/public/common/DEPS
+++ b/chromium/components/download/public/common/DEPS
@@ -8,6 +8,7 @@ include_rules = [
"+net/base/net_errors.h",
"+net/base/network_change_notifier.h",
"+net/base/network_isolation_key.h",
+ "+net/base/isolation_info.h",
"+net/cert/cert_status_flags.h",
"+net/http/http_response_headers.h",
"+net/http/http_response_info.h",
diff --git a/chromium/components/download/public/common/download_danger_type.h b/chromium/components/download/public/common/download_danger_type.h
index 831e19ca9a1..237e87467f8 100644
--- a/chromium/components/download/public/common/download_danger_type.h
+++ b/chromium/components/download/public/common/download_danger_type.h
@@ -44,8 +44,8 @@ enum DownloadDangerType {
// Applications and extensions that modify browser and/or computer settings
DOWNLOAD_DANGER_TYPE_POTENTIALLY_UNWANTED = 8,
- // Download URL whitelisted by enterprise policy.
- DOWNLOAD_DANGER_TYPE_WHITELISTED_BY_POLICY = 9,
+ // Download URL allowed by enterprise policy.
+ DOWNLOAD_DANGER_TYPE_ALLOWLISTED_BY_POLICY = 9,
// Download is pending a more detailed verdict.
DOWNLOAD_DANGER_TYPE_ASYNC_SCANNING = 10,
diff --git a/chromium/components/download/public/common/download_features.cc b/chromium/components/download/public/common/download_features.cc
index 38ed21f0d74..5734eee5904 100644
--- a/chromium/components/download/public/common/download_features.cc
+++ b/chromium/components/download/public/common/download_features.cc
@@ -15,7 +15,7 @@ const base::Feature kUseDownloadOfflineContentProvider{
const base::Feature kDownloadAutoResumptionNative {
"DownloadsAutoResumptionNative",
#if defined(OS_ANDROID)
- base::FEATURE_DISABLED_BY_DEFAULT
+ base::FEATURE_ENABLED_BY_DEFAULT
#else
base::FEATURE_DISABLED_BY_DEFAULT
#endif
@@ -67,6 +67,9 @@ const base::Feature kUseParallelRequestsForQUIC{
const base::Feature kDeleteExpiredDownloads{"DeleteExpiredDownloads",
base::FEATURE_ENABLED_BY_DEFAULT};
+const base::Feature kDeleteOverwrittenDownloads{
+ "DeleteOverwrittenDownloads", base::FEATURE_DISABLED_BY_DEFAULT};
+
} // namespace features
namespace switches {
diff --git a/chromium/components/download/public/common/download_features.h b/chromium/components/download/public/common/download_features.h
index 1a29aabae05..8713b77be76 100644
--- a/chromium/components/download/public/common/download_features.h
+++ b/chromium/components/download/public/common/download_features.h
@@ -68,6 +68,10 @@ COMPONENTS_DOWNLOAD_EXPORT extern const base::Feature
// Whether to delete expired download.
COMPONENTS_DOWNLOAD_EXPORT extern const base::Feature kDeleteExpiredDownloads;
+// Whether to delete downloads that are overwritten by others.
+COMPONENTS_DOWNLOAD_EXPORT extern const base::Feature
+ kDeleteOverwrittenDownloads;
+
} // namespace features
namespace switches {
diff --git a/chromium/components/download/public/common/download_item.h b/chromium/components/download/public/common/download_item.h
index ac9805719a4..070ea7765a8 100644
--- a/chromium/components/download/public/common/download_item.h
+++ b/chromium/components/download/public/common/download_item.h
@@ -51,6 +51,7 @@ class HttpResponseHeaders;
namespace download {
class DownloadFile;
+class DownloadItemRenameHandler;
// One DownloadItem per download. This is the model class that stores all the
// state for a download.
@@ -432,6 +433,12 @@ class COMPONENTS_DOWNLOAD_EXPORT DownloadItem : public base::SupportsUserData {
// Gets the pointer to the DownloadFile owned by this object.
virtual DownloadFile* GetDownloadFile() = 0;
+ // Gets a handler to perform the rename for a download item. If no special
+ // rename handling is required, this function returns null and the default
+ // rename handling is performed. The caller does not own the returned
+ // pointer.
+ virtual DownloadItemRenameHandler* GetRenameHandler() = 0;
+
// Progress State accessors -----------------------------------------------
// Simple calculation of the amount of time remaining to completion. Fills
diff --git a/chromium/components/download/public/common/download_item_impl.h b/chromium/components/download/public/common/download_item_impl.h
index 6417c758e81..2868b25bd9c 100644
--- a/chromium/components/download/public/common/download_item_impl.h
+++ b/chromium/components/download/public/common/download_item_impl.h
@@ -274,6 +274,7 @@ class COMPONENTS_DOWNLOAD_EXPORT DownloadItemImpl
bool GetFileExternallyRemoved() const override;
void DeleteFile(base::OnceCallback<void(bool)> callback) override;
DownloadFile* GetDownloadFile() override;
+ DownloadItemRenameHandler* GetRenameHandler() override;
bool IsDangerous() const override;
bool IsMixedContent() const override;
DownloadDangerType GetDangerType() const override;
@@ -862,6 +863,9 @@ class COMPONENTS_DOWNLOAD_EXPORT DownloadItemImpl
// Defines when to start the download. Used by download later feature.
base::Optional<DownloadSchedule> download_schedule_;
+ // A handler for renaming and helping with display the item.
+ std::unique_ptr<DownloadItemRenameHandler> rename_handler_;
+
THREAD_CHECKER(thread_checker_);
base::WeakPtrFactory<DownloadItemImpl> weak_ptr_factory_{this};
diff --git a/chromium/components/download/public/common/download_item_impl_delegate.h b/chromium/components/download/public/common/download_item_impl_delegate.h
index e4608e95662..538dfac4b83 100644
--- a/chromium/components/download/public/common/download_item_impl_delegate.h
+++ b/chromium/components/download/public/common/download_item_impl_delegate.h
@@ -7,12 +7,15 @@
#include <stdint.h>
+#include <memory>
+
#include "base/callback.h"
#include "base/files/file_path.h"
#include "base/macros.h"
#include "base/optional.h"
#include "components/download/public/common/download_export.h"
#include "components/download/public/common/download_item.h"
+#include "components/download/public/common/download_item_rename_handler.h"
#include "components/download/public/common/download_schedule.h"
#include "components/download/public/common/download_url_parameters.h"
#include "components/download/public/common/quarantine_connection.h"
@@ -124,6 +127,12 @@ class COMPONENTS_DOWNLOAD_EXPORT DownloadItemImplDelegate {
// Gets a callback that can connect to the Quarantine Service if available.
virtual QuarantineConnectionCallback GetQuarantineConnectionCallback();
+ // Gets a handler to perform the rename for a download item. If no special
+ // rename handling is required, this function returns null and the default
+ // rename handling is performed.
+ virtual std::unique_ptr<DownloadItemRenameHandler>
+ GetRenameHandlerForDownload(DownloadItemImpl* download_item);
+
private:
// For "Outlives attached DownloadItemImpl" invariant assertion.
int count_;
diff --git a/chromium/components/download/public/common/download_item_rename_handler.h b/chromium/components/download/public/common/download_item_rename_handler.h
new file mode 100644
index 00000000000..63d1244ca74
--- /dev/null
+++ b/chromium/components/download/public/common/download_item_rename_handler.h
@@ -0,0 +1,52 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef COMPONENTS_DOWNLOAD_PUBLIC_COMMON_DOWNLOAD_ITEM_RENAME_HANDLER_H_
+#define COMPONENTS_DOWNLOAD_PUBLIC_COMMON_DOWNLOAD_ITEM_RENAME_HANDLER_H_
+
+#include "base/callback.h"
+#include "components/download/public/common/download_interrupt_reasons.h"
+
+namespace base {
+class FilePath;
+}
+
+namespace download {
+
+class DownloadItem;
+
+// Interface implemented by an object that overrides the default method
+// of renaming a file to its final name once the download completes.
+// DownloadItemImpl attempts to retrieve the object from its delegate, and
+// if valid will call the Start() method instead of using
+// DownloadFile::RenameAndAnnotate().
+//
+// Instances of DownloadItemRenameHandler are owned by DownloadItem.
+class COMPONENTS_DOWNLOAD_EXPORT DownloadItemRenameHandler {
+ public:
+ using Callback = base::OnceCallback<void(DownloadInterruptReason reason,
+ const base::FilePath& path)>;
+
+ explicit DownloadItemRenameHandler(DownloadItem* download_item);
+ virtual ~DownloadItemRenameHandler();
+
+ DownloadItem* download_item() { return download_item_; }
+
+ // Starts the process of renaming the file and invokes |callback| when
+ // done.
+ virtual void Start(Callback callback);
+
+ // Opens the file associated with this download.
+ virtual void OpenDownload();
+
+ // Shows the download in the context of its container.
+ virtual void ShowDownloadInContext();
+
+ private:
+ DownloadItem* download_item_;
+};
+
+} // namespace download
+
+#endif // COMPONENTS_DOWNLOAD_PUBLIC_COMMON_DOWNLOAD_ITEM_RENAME_HANDLER_H_
diff --git a/chromium/components/download/public/common/download_url_parameters.h b/chromium/components/download/public/common/download_url_parameters.h
index b91ed408140..d5ed92b8a8e 100644
--- a/chromium/components/download/public/common/download_url_parameters.h
+++ b/chromium/components/download/public/common/download_url_parameters.h
@@ -18,6 +18,7 @@
#include "components/download/public/common/download_interrupt_reasons.h"
#include "components/download/public/common/download_save_info.h"
#include "components/download/public/common/download_source.h"
+#include "net/base/isolation_info.h"
#include "net/traffic_annotation/network_traffic_annotation.h"
#include "net/url_request/referrer_policy.h"
#include "services/network/public/cpp/resource_request_body.h"
@@ -251,6 +252,14 @@ class COMPONENTS_DOWNLOAD_EXPORT DownloadUrlParameters {
require_safety_checks_ = require_safety_checks;
}
+ // Sets whether the download request will use the given isolation_info. If the
+ // isolation info is not set, the download will be treated as a
+ // top-frame navigation with respect to network-isolation-key and
+ // site-for-cookies.
+ void set_isolation_info(const net::IsolationInfo& isolation_info) {
+ isolation_info_ = isolation_info;
+ }
+
OnStartedCallback& callback() { return callback_; }
bool content_initiated() const { return content_initiated_; }
const std::string& last_modified() const { return last_modified_; }
@@ -296,6 +305,9 @@ class COMPONENTS_DOWNLOAD_EXPORT DownloadUrlParameters {
bool is_transient() const { return transient_; }
std::string guid() const { return guid_; }
bool require_safety_checks() const { return require_safety_checks_; }
+ const base::Optional<net::IsolationInfo>& isolation_info() const {
+ return isolation_info_;
+ }
// STATE CHANGING: All save_info_ sub-objects will be in an indeterminate
// state following this call.
@@ -341,6 +353,7 @@ class COMPONENTS_DOWNLOAD_EXPORT DownloadUrlParameters {
DownloadSource download_source_;
UploadProgressCallback upload_callback_;
bool require_safety_checks_;
+ base::Optional<net::IsolationInfo> isolation_info_;
DISALLOW_COPY_AND_ASSIGN(DownloadUrlParameters);
};
diff --git a/chromium/components/download/public/common/download_utils.h b/chromium/components/download/public/common/download_utils.h
index 737c193c819..97373c2454e 100644
--- a/chromium/components/download/public/common/download_utils.h
+++ b/chromium/components/download/public/common/download_utils.h
@@ -117,9 +117,15 @@ int64_t GetDownloadValidationLengthConfig();
constexpr char kExpiredDownloadDeleteTimeFinchKey[] =
"expired_download_delete_days";
+// Finch parameter key value for the time to delete expired downloads in days.
+constexpr char kOverwrittenDownloadDeleteTimeFinchKey[] =
+ "overwritten_download_delete_days";
+
// Returns the time to delete expired downloads.
COMPONENTS_DOWNLOAD_EXPORT base::TimeDelta GetExpiredDownloadDeleteTime();
+// Returns the time in days to delete download that is overwritten by others.
+COMPONENTS_DOWNLOAD_EXPORT base::TimeDelta GetOverwrittenDownloadDeleteTime();
} // namespace download
#endif // COMPONENTS_DOWNLOAD_PUBLIC_COMMON_DOWNLOAD_UTILS_H_
diff --git a/chromium/components/download/public/common/mock_download_item.h b/chromium/components/download/public/common/mock_download_item.h
index 0160d4d4d28..2ca3726cbeb 100644
--- a/chromium/components/download/public/common/mock_download_item.h
+++ b/chromium/components/download/public/common/mock_download_item.h
@@ -99,6 +99,7 @@ class MockDownloadItem : public DownloadItem {
}
MOCK_METHOD1(DeleteFile_, void(base::OnceCallback<void(bool)>& cb));
MOCK_METHOD0(GetDownloadFile, DownloadFile*());
+ MOCK_METHOD0(GetRenameHandler, DownloadItemRenameHandler*());
MOCK_CONST_METHOD0(IsDangerous, bool());
MOCK_CONST_METHOD0(IsMixedContent, bool());
MOCK_CONST_METHOD0(GetDangerType, DownloadDangerType());
diff --git a/chromium/components/download/public/task/BUILD.gn b/chromium/components/download/public/task/BUILD.gn
index 1044fec2466..95a8e7c2187 100644
--- a/chromium/components/download/public/task/BUILD.gn
+++ b/chromium/components/download/public/task/BUILD.gn
@@ -28,7 +28,7 @@ if (is_android) {
deps = [
"//base:base_java",
- "//third_party/android_deps:androidx_annotation_annotation_java",
+ "//third_party/androidx:androidx_annotation_annotation_java",
]
}
diff --git a/chromium/components/download/quarantine/DIR_METADATA b/chromium/components/download/quarantine/DIR_METADATA
new file mode 100644
index 00000000000..6bf7cbfb89f
--- /dev/null
+++ b/chromium/components/download/quarantine/DIR_METADATA
@@ -0,0 +1,3 @@
+monorail {
+ component: "UI>Browser>Downloads"
+}
diff --git a/chromium/components/download/quarantine/OWNERS b/chromium/components/download/quarantine/OWNERS
index d813b034f36..15eb1078310 100644
--- a/chromium/components/download/quarantine/OWNERS
+++ b/chromium/components/download/quarantine/OWNERS
@@ -1,4 +1,2 @@
asanka@chromium.org
wfh@chromium.org
-
-# COMPONENT: UI>Browser>Downloads