-
Notifications
You must be signed in to change notification settings - Fork 6.6k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Implement a background CRX downloader for Mac using NSURLSession's background transfer capabilities. This is intended to work similarly to the BITS-backed downloader on Windows. Downloads started by this implementation can continue even if Chrome is suspended/terminated and can persist through network errors, reboots, etc. When the downloader is instantiated, MacOS may notify it of downloads which were completed in the background. Thus, a cache of unclaimed downloads is maintained. Low-Coverage-Reason: TRIVIAL_CHANGE changes to chrome_component_updater_configurator.cc and crx_downloader_factory.cc are trivial Bug: 1493709 Change-Id: Ief188e6769a846486e1b558469fdfcfe0b12f566 Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/4973235 Reviewed-by: Avi Drissman <avi@chromium.org> Commit-Queue: Noah Rose Ledesma <noahrose@google.com> Reviewed-by: Sorin Jianu <sorin@chromium.org> Cr-Commit-Position: refs/heads/main@{#1216377}
- Loading branch information
Noah Rose Ledesma
authored and
Chromium LUCI CQ
committed
Oct 27, 2023
1 parent
abf1339
commit 53fa3f9
Showing
14 changed files
with
1,227 additions
and
22 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,80 @@ | ||
// Copyright 2023 The Chromium Authors | ||
// Use of this source code is governed by a BSD-style license that can be | ||
// found in the LICENSE file. | ||
|
||
#ifndef COMPONENTS_UPDATE_CLIENT_BACKGROUND_DOWNLOADER_MAC_H_ | ||
#define COMPONENTS_UPDATE_CLIENT_BACKGROUND_DOWNLOADER_MAC_H_ | ||
|
||
#include "base/files/file_path.h" | ||
#include "base/functional/callback_forward.h" | ||
#include "base/gtest_prod_util.h" | ||
#include "base/memory/ref_counted.h" | ||
#include "base/memory/scoped_refptr.h" | ||
#include "base/memory/weak_ptr.h" | ||
#include "base/sequence_checker.h" | ||
#include "base/task/sequenced_task_runner.h" | ||
#include "components/update_client/crx_downloader.h" | ||
|
||
namespace update_client { | ||
namespace { | ||
// TODO(crbug.com/1493709): The session identifier might need to be more complex | ||
// to accommodate multiple Chrome processes. | ||
static constexpr char kDefaultBackgroundSessionId[] = "CrxDownloader"; | ||
} // namespace | ||
|
||
class BackgroundDownloaderSharedSession | ||
: public base::RefCountedThreadSafe<BackgroundDownloaderSharedSession> { | ||
public: | ||
using OnDownloadCompleteCallback = base::RepeatingCallback<void( | ||
bool, | ||
const update_client::CrxDownloader::Result&, | ||
const update_client::CrxDownloader::DownloadMetrics&)>; | ||
|
||
virtual void DoStartDownload( | ||
const GURL& url, | ||
OnDownloadCompleteCallback on_download_complete_callback) = 0; | ||
|
||
// Cancel all download tasks and invalidates this session. Future calls to | ||
// DoStartDownload will fail until the session is recreated. | ||
virtual void InvalidateAndCancel() = 0; | ||
|
||
protected: | ||
friend class base::RefCountedThreadSafe<BackgroundDownloaderSharedSession>; | ||
virtual ~BackgroundDownloaderSharedSession() = default; | ||
}; | ||
|
||
class BackgroundDownloader : public CrxDownloader { | ||
public: | ||
BackgroundDownloader( | ||
scoped_refptr<CrxDownloader> successor, | ||
scoped_refptr<BackgroundDownloaderSharedSession> shared_session, | ||
scoped_refptr<base::SequencedTaskRunner> background_sequence_); | ||
|
||
private: | ||
friend class BackgroundDownloaderTest; | ||
friend class BackgroundDownloaderCrashingClientTest; | ||
FRIEND_TEST_ALL_PREFIXES(BackgroundDownloaderTest, ConcurrentDownloaders); | ||
|
||
// Overrides for CrxDownloader. | ||
~BackgroundDownloader() override; | ||
base::OnceClosure DoStartDownload(const GURL& url) override; | ||
|
||
base::OnceClosure DoStartDownload( | ||
const GURL& url, | ||
BackgroundDownloaderSharedSession::OnDownloadCompleteCallback); | ||
|
||
SEQUENCE_CHECKER(sequence_checker_); | ||
scoped_refptr<BackgroundDownloaderSharedSession> shared_session_; | ||
scoped_refptr<base::SequencedTaskRunner> background_sequence_; | ||
base::WeakPtrFactory<BackgroundDownloader> weak_ptr_factory_{this}; | ||
}; | ||
|
||
scoped_refptr<BackgroundDownloaderSharedSession> | ||
MakeBackgroundDownloaderSharedSession( | ||
scoped_refptr<base::SequencedTaskRunner> background_sequence, | ||
const base::FilePath& download_cache, | ||
const std::string& session_identifier = kDefaultBackgroundSessionId); | ||
|
||
} // namespace update_client | ||
|
||
#endif // COMPONENTS_UPDATE_CLIENT_BACKGROUND_DOWNLOADER_MAC_H_ |
Oops, something went wrong.