#include "extensions/browser/content_verifier/content_verifier.h"
#include <algorithm>
#include <utility>
#include <vector>
#include "base/containers/contains.h"
#include "base/files/file_path.h"
#include "base/functional/bind.h"
#include "base/functional/callback_helpers.h"
#include "base/memory/raw_ptr.h"
#include "base/memory/scoped_refptr.h"
#include "base/memory/weak_ptr.h"
#include "base/metrics/histogram_functions.h"
#include "base/metrics/histogram_macros.h"
#include "base/not_fatal_until.h"
#include "base/ranges/algorithm.h"
#include "base/strings/string_util.h"
#include "base/strings/stringprintf.h"
#include "base/threading/thread_restrictions.h"
#include "content/public/browser/browser_context.h"
#include "content/public/browser/browser_thread.h"
#include "content/public/browser/storage_partition.h"
#include "extensions/browser/content_hash_fetcher.h"
#include "extensions/browser/content_hash_reader.h"
#include "extensions/browser/content_verifier/content_verifier_delegate.h"
#include "extensions/browser/content_verifier/content_verifier_utils.h"
#include "extensions/browser/extension_file_task_runner.h"
#include "extensions/common/api/declarative_net_request/dnr_manifest_data.h"
#include "extensions/common/constants.h"
#include "extensions/common/extension_id.h"
#include "extensions/common/extension_l10n_util.h"
#include "extensions/common/file_util.h"
#include "extensions/common/manifest_handlers/background_info.h"
#include "extensions/common/manifest_handlers/content_scripts_handler.h"
#include "extensions/common/utils/base_string.h"
#include "mojo/public/cpp/bindings/pending_remote.h"
#include "services/network/public/mojom/network_context.mojom.h"
namespace extensions {
namespace {
ContentVerifier::TestObserver* g_content_verifier_test_observer = …;
CanonicalRelativePath;
base::FilePath NormalizeRelativePath(const base::FilePath& path) { … }
bool HasScriptFileExt(const base::FilePath& requested_path) { … }
bool HasPageFileExt(const base::FilePath& requested_path) { … }
std::unique_ptr<ContentVerifierIOData::ExtensionData> CreateIOData(
const Extension* extension,
ContentVerifierDelegate* delegate) { … }
}
struct ContentVerifier::CacheKey { … };
class ContentVerifier::HashHelper { … };
class ContentVerifier::VerifiedFileTypeHelper { … };
void ContentVerifier::SetObserverForTests(TestObserver* observer) { … }
ContentVerifier::ContentVerifier(
content::BrowserContext* context,
std::unique_ptr<ContentVerifierDelegate> delegate)
: … { … }
ContentVerifier::~ContentVerifier() { … }
void ContentVerifier::Start() { … }
void ContentVerifier::StartOnIO() { … }
void ContentVerifier::Shutdown() { … }
void ContentVerifier::ShutdownOnIO() { … }
scoped_refptr<ContentVerifyJob> ContentVerifier::CreateAndStartJobFor(
const ExtensionId& extension_id,
const base::FilePath& extension_root,
const base::FilePath& relative_path,
scoped_refptr<ContentVerifier> verifier) { … }
void ContentVerifier::OnJobCreated(scoped_refptr<ContentVerifyJob> job) { … }
void ContentVerifier::CreateContentHash(
const ExtensionId& extension_id,
const base::FilePath& extension_root,
const base::Version& extension_version,
bool force_missing_computed_hashes_creation,
ContentHashCallback callback) { … }
scoped_refptr<const ContentHash> ContentVerifier::GetCachedContentHash(
const ExtensionId& extension_id,
const base::Version& extension_version,
bool force_missing_computed_hashes_creation) { … }
bool ContentVerifier::ShouldComputeHashesOnInstall(const Extension& extension) { … }
void ContentVerifier::VerifyFailed(
const ExtensionId& extension_id,
const std::vector<VerifiedFileType>& failed_file_types,
int manifest_version,
ContentVerifyJob::FailureReason reason) { … }
void ContentVerifier::OnExtensionLoaded(
content::BrowserContext* browser_context,
const Extension* extension) { … }
void ContentVerifier::OnExtensionLoadedOnIO(
const ExtensionId& extension_id,
const base::FilePath& extension_root,
const base::Version& extension_version,
std::unique_ptr<ContentVerifierIOData::ExtensionData> data) { … }
void ContentVerifier::OnExtensionUnloaded(
content::BrowserContext* browser_context,
const Extension* extension,
UnloadedExtensionReason reason) { … }
ContentVerifierKey ContentVerifier::GetContentVerifierKey() { … }
GURL ContentVerifier::GetSignatureFetchUrlForTest(
const ExtensionId& extension_id,
const base::Version& extension_version) { … }
void ContentVerifier::VerifyFailedForTest(
const ExtensionId& extension_id,
ContentVerifyJob::FailureReason reason) { … }
void ContentVerifier::ClearCacheForTesting() { … }
void ContentVerifier::OnExtensionUnloadedOnIO(
const ExtensionId& extension_id,
const base::Version& extension_version) { … }
void ContentVerifier::OnExtensionDataReady(const ExtensionId& extension_id) { … }
bool ContentVerifier::StartJob(const scoped_refptr<ContentVerifyJob>& job) { … }
void ContentVerifier::OnFetchComplete(
const scoped_refptr<const ContentHash>& content_hash) { … }
ContentHash::FetchKey ContentVerifier::GetFetchKey(
const ExtensionId& extension_id,
const base::FilePath& extension_root,
const base::Version& extension_version) { … }
void ContentVerifier::DidGetContentHash(
const CacheKey& cache_key,
ContentHashCallback original_callback,
scoped_refptr<const ContentHash> content_hash) { … }
void ContentVerifier::BindURLLoaderFactoryReceiverOnUIThread(
mojo::PendingReceiver<network::mojom::URLLoaderFactory>
url_loader_factory_receiver) { … }
ContentVerifier::HashHelper* ContentVerifier::GetOrCreateHashHelper() { … }
void ContentVerifier::ResetIODataForTesting(const Extension* extension) { … }
base::FilePath ContentVerifier::NormalizeRelativePathForTesting(
const base::FilePath& path) { … }
bool ContentVerifier::ShouldVerifyAnyPathsForTesting(
const ExtensionId& extension_id,
const base::FilePath& extension_root,
const std::set<base::FilePath>& relative_unix_paths) { … }
void ContentVerifier::OverrideDelegateForTesting(
std::unique_ptr<ContentVerifierDelegate> delegate) { … }
}