blob: 95463f5f3f566d8aedb872fd3f25661ba4f1423d [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_RESOURCE_COORDINATOR_INTERVENTION_POLICY_DATABASE_H_
#define CHROME_BROWSER_RESOURCE_COORDINATOR_INTERVENTION_POLICY_DATABASE_H_
#include "base/containers/flat_map.h"
#include "base/files/file_path.h"
#include "base/macros.h"
#include "base/memory/weak_ptr.h"
#include "base/version.h"
#include "chrome/browser/resource_coordinator/intervention_policy_database.pb.h"
#include "url/origin.h"
namespace base {
class DictionaryValue;
}
namespace resource_coordinator {
// Intervention policy database, this should receive data from the
// InterventionPolicyDatabaseComponentInstallerPolicy component once it's ready.
//
// It is meant to be used to assist intervention decisions made for the
// LifecycleUnits.
class InterventionPolicyDatabase {
public:
using InterventionPolicy = OriginInterventions::InterventionPolicy;
// The intervention policies to use for a given origin.
struct OriginInterventionPolicies {
OriginInterventionPolicies(InterventionPolicy discarding_policy,
InterventionPolicy freezing_policy);
InterventionPolicy discarding_policy;
InterventionPolicy freezing_policy;
};
InterventionPolicyDatabase();
~InterventionPolicyDatabase();
InterventionPolicy GetDiscardingPolicy(const url::Origin& origin) const;
InterventionPolicy GetFreezingPolicy(const url::Origin& origin) const;
// Initialize the database with the OriginInterventionsDatabase protobuf
// stored in |proto_location|.
void InitializeDatabaseWithProtoFile(
const base::FilePath& proto_location,
const base::Version& version,
std::unique_ptr<base::DictionaryValue> manifest);
void AddOriginPoliciesForTesting(const url::Origin& origin,
OriginInterventionPolicies policies);
protected:
// Map that associates the MD5 hash of an origin to its polices.
using InterventionsMap =
base::flat_map<std::string, OriginInterventionPolicies>;
friend class InterventionPolicyDatabaseTest;
const InterventionsMap& database_for_testing() { return database_; }
private:
// Asynchronously initialize an |InterventionsMap| object with the content of
// the OriginInterventionsDatabase proto stored at |proto_location|.
static InterventionsMap ReadDatabaseFromProtoFileOnSequence(
const base::FilePath& proto_location);
// Needs to be called to initialize |database_| with the data read in
// InitializeDatabaseWithProtoAsync.
void OnReadDatabaseProtoFromFile(InterventionsMap database);
// The map that stores all the per-origin intervention policies.
InterventionsMap database_;
base::WeakPtrFactory<InterventionPolicyDatabase> weak_factory_;
DISALLOW_COPY_AND_ASSIGN(InterventionPolicyDatabase);
};
} // namespace resource_coordinator
#endif // CHROME_BROWSER_RESOURCE_COORDINATOR_INTERVENTION_POLICY_DATABASE_H_