blob: 8849aac9784034385c5af6d921436dd66696a4b4 [file] [log] [blame]
// Copyright 2019 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/offline_pages/core/offline_page_client_policy.h"
#include <map>
#include <string>
#include <utility>
#include <vector>
#include "base/logging.h"
#include "base/no_destructor.h"
#include "base/time/time.h"
#include "components/offline_pages/core/client_namespace_constants.h"
#include "components/offline_pages/core/offline_page_client_policy.h"
namespace offline_pages {
namespace {
struct PolicyData {
std::map<std::string, OfflinePageClientPolicy> policies;
std::vector<std::string> temporary_namespaces;
std::vector<std::string> persistent_namespaces;
std::vector<std::string> all_namespaces;
};
PolicyData BuildPolicies() {
std::vector<OfflinePageClientPolicy> all_policies;
{
auto policy = OfflinePageClientPolicy::CreateTemporary(
kBookmarkNamespace, base::TimeDelta::FromDays(7));
policy.pages_allowed_per_url = 1;
all_policies.push_back(policy);
}
{
auto policy = OfflinePageClientPolicy::CreateTemporary(
kLastNNamespace, base::TimeDelta::FromDays(30));
policy.is_restricted_to_tab_from_client_id = true;
all_policies.push_back(policy);
}
{
auto policy = OfflinePageClientPolicy::CreatePersistent(kAsyncNamespace);
policy.is_supported_by_download = true;
all_policies.push_back(policy);
}
{
auto policy = OfflinePageClientPolicy::CreateTemporary(
kCCTNamespace, base::TimeDelta::FromDays(2));
policy.pages_allowed_per_url = 1;
policy.requires_specific_user_settings = true;
all_policies.push_back(policy);
}
{
auto policy = OfflinePageClientPolicy::CreatePersistent(kDownloadNamespace);
policy.is_supported_by_download = true;
all_policies.push_back(policy);
}
{
auto policy =
OfflinePageClientPolicy::CreatePersistent(kNTPSuggestionsNamespace);
policy.is_supported_by_download = true;
all_policies.push_back(policy);
}
{
auto policy = OfflinePageClientPolicy::CreateTemporary(
kSuggestedArticlesNamespace, base::TimeDelta::FromDays(30));
policy.is_supported_by_download = 1;
policy.is_suggested = true;
all_policies.push_back(policy);
}
{
auto policy =
OfflinePageClientPolicy::CreatePersistent(kBrowserActionsNamespace);
policy.is_supported_by_download = true;
policy.allows_conversion_to_background_file_download = true;
all_policies.push_back(policy);
}
{
auto policy = OfflinePageClientPolicy::CreateTemporary(
kLivePageSharingNamespace, base::TimeDelta::FromHours(1));
policy.pages_allowed_per_url = 1;
policy.is_restricted_to_tab_from_client_id = true;
all_policies.push_back(policy);
}
{
auto policy = OfflinePageClientPolicy::CreateTemporary(
kAutoAsyncNamespace, base::TimeDelta::FromDays(30));
policy.pages_allowed_per_url = 1;
policy.defer_background_fetch_while_page_is_active = true;
all_policies.push_back(policy);
}
// Fallback policy.
{
OfflinePageClientPolicy policy = OfflinePageClientPolicy::CreateTemporary(
kDefaultNamespace, base::TimeDelta::FromDays(1));
policy.page_limit = 10;
policy.pages_allowed_per_url = 1;
all_policies.push_back(policy);
}
PolicyData policy_data;
for (const auto& policy : all_policies) {
policy_data.all_namespaces.push_back(policy.name_space);
switch (policy.lifetime_type) {
case LifetimeType::TEMPORARY:
policy_data.temporary_namespaces.push_back(policy.name_space);
break;
case LifetimeType::PERSISTENT:
policy_data.persistent_namespaces.push_back(policy.name_space);
break;
}
policy_data.policies.emplace(policy.name_space, policy);
}
return policy_data;
}
const PolicyData& GetPolicyData() {
static base::NoDestructor<PolicyData> instance(BuildPolicies());
return *instance;
}
} // namespace
OfflinePageClientPolicy::OfflinePageClientPolicy(std::string namespace_val,
LifetimeType lifetime_type_val)
: name_space(namespace_val), lifetime_type(lifetime_type_val) {}
// static
OfflinePageClientPolicy OfflinePageClientPolicy::CreateTemporary(
const std::string& name_space,
const base::TimeDelta& expiration_period) {
OfflinePageClientPolicy policy(name_space, LifetimeType::TEMPORARY);
policy.expiration_period = expiration_period;
return policy;
}
// static
OfflinePageClientPolicy OfflinePageClientPolicy::CreatePersistent(
const std::string& name_space) {
return {name_space, LifetimeType::PERSISTENT};
}
OfflinePageClientPolicy::OfflinePageClientPolicy(
const OfflinePageClientPolicy& other) = default;
OfflinePageClientPolicy::~OfflinePageClientPolicy() = default;
const OfflinePageClientPolicy& GetPolicy(const std::string& name) {
const std::map<std::string, OfflinePageClientPolicy>& policies =
GetPolicyData().policies;
const auto& iter = policies.find(name);
if (iter != policies.end())
return iter->second;
// Fallback when the namespace isn't defined.
return policies.at(kDefaultNamespace);
}
const std::vector<std::string>& GetAllPolicyNamespaces() {
return GetPolicyData().all_namespaces;
}
const std::vector<std::string>& GetTemporaryPolicyNamespaces() {
return GetPolicyData().temporary_namespaces;
}
const std::vector<std::string>& GetPersistentPolicyNamespaces() {
return GetPolicyData().persistent_namespaces;
}
} // namespace offline_pages