blob: e6f1c8ed7174b0ab84cf50001b12cd6f8797f542 [file] [log] [blame]
// Copyright 2018 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 CHROME_BROWSER_CONFLICTS_INCOMPATIBLE_APPLICATIONS_UPDATER_WIN_H_
#define CHROME_BROWSER_CONFLICTS_INCOMPATIBLE_APPLICATIONS_UPDATER_WIN_H_
#include <memory>
#include <vector>
#include "base/macros.h"
#include "chrome/browser/conflicts/installed_applications_win.h"
#include "chrome/browser/conflicts/module_database_observer_win.h"
#include "chrome/browser/conflicts/proto/module_list.pb.h"
struct CertificateInfo;
class ModuleListFilter;
class PrefRegistrySimple;
// Maintains a list of incompatible applications that are installed on the
// machine. These applications cause unwanted DLLs to be loaded into Chrome.
//
// Because the list is expensive to build, it is cached into the Local State
// file so that it is available at startup.
class IncompatibleApplicationsUpdater : public ModuleDatabaseObserver {
public:
struct IncompatibleApplication {
IncompatibleApplication(
InstalledApplications::ApplicationInfo info,
std::unique_ptr<chrome::conflicts::BlacklistAction> blacklist_action);
~IncompatibleApplication();
// Needed for std::remove_if().
IncompatibleApplication(IncompatibleApplication&& incompatible_application);
IncompatibleApplication& operator=(
IncompatibleApplication&& incompatible_application);
InstalledApplications::ApplicationInfo info;
std::unique_ptr<chrome::conflicts::BlacklistAction> blacklist_action;
};
// Creates an instance of the updater.
// The parameters must outlive the lifetime of this class.
IncompatibleApplicationsUpdater(
const CertificateInfo& exe_certificate_info,
const ModuleListFilter& module_list_filter,
const InstalledApplications& installed_applications);
~IncompatibleApplicationsUpdater() override;
static void RegisterLocalStatePrefs(PrefRegistrySimple* registry);
// Returns true if the tracking of incompatible applications is enabled. The
// return value will not change throughout the lifetime of the process.
static bool IsWarningEnabled();
// Returns true if the cache contains at least one incompatible application.
// Only call this if IsIncompatibleApplicationsWarningEnabled() returns true.
static bool HasCachedApplications();
// Returns all the cached incompatible applications.
// Only call this if IsIncompatibleApplicationsWarningEnabled() returns true.
static std::vector<IncompatibleApplication> GetCachedApplications();
// ModuleDatabaseObserver:
void OnNewModuleFound(const ModuleInfoKey& module_key,
const ModuleInfoData& module_data) override;
void OnModuleDatabaseIdle() override;
private:
const CertificateInfo& exe_certificate_info_;
const ModuleListFilter& module_list_filter_;
const InstalledApplications& installed_applications_;
// Temporarily holds incompatible applications that were recently found.
std::vector<IncompatibleApplication> incompatible_applications_;
// Becomes false on the first call to OnModuleDatabaseIdle.
bool before_first_idle_ = true;
DISALLOW_COPY_AND_ASSIGN(IncompatibleApplicationsUpdater);
};
#endif // CHROME_BROWSER_CONFLICTS_INCOMPATIBLE_APPLICATIONS_UPDATER_WIN_H_