diff options
Diffstat (limited to 'chromium/components/download')
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 |