blob: 9580032f3aae0a05d95eec4b9d74f4c55d484322 [file] [log] [blame]
// Copyright 2025 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chrome/browser/actor/safety_list.h"
#include <algorithm>
#include <string>
#include <utility>
#include <vector>
#include "base/json/json_reader.h"
#include "base/values.h"
#include "components/content_settings/core/common/content_settings_pattern.h"
#include "url/gurl.h"
namespace actor {
bool SafetyList::ContainsUrlPair(const GURL& source,
const GURL& destination) const {
return std::ranges::any_of(patterns_, [&](const SafetyListPatterns& pattern) {
return pattern.source.Matches(source) &&
pattern.destination.Matches(destination);
});
}
SafetyList::SafetyList(Patterns patterns) : patterns_(std::move(patterns)) {}
SafetyList::~SafetyList() = default;
SafetyList::SafetyList(const SafetyList&) = default;
SafetyList& SafetyList::operator=(const SafetyList&) = default;
// static
SafetyList SafetyList::ParsePatternListFromJson(
const base::Value::List& list_data) {
Patterns patterns;
for (const auto& navigation : list_data) {
const base::Value::Dict* navigation_dict = navigation.GetIfDict();
if (!navigation_dict) {
return SafetyList();
}
// Only parse pattern pair if both fields exist.
const std::string* to = navigation_dict->FindString("to");
if (!to) {
return SafetyList();
}
const std::string* from = navigation_dict->FindString("from");
if (!from) {
return SafetyList();
}
ContentSettingsPattern source = ContentSettingsPattern::FromString(*from);
ContentSettingsPattern destination =
ContentSettingsPattern::FromString(*to);
if (!source.IsValid() || !destination.IsValid()) {
return SafetyList();
}
patterns.push_back(
SafetyListPatterns{std::move(source), std::move(destination)});
}
return SafetyList(std::move(patterns));
}
} // namespace actor