blob: 50c218293e2a989723c1f0c4f979b8c307c20db5 [file]
// Copyright 2026 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CHROME_BROWSER_DEVTOOLS_DEVTOOLS_NAVIGATION_GATING_RULE_MANAGER_H_
#define CHROME_BROWSER_DEVTOOLS_DEVTOOLS_NAVIGATION_GATING_RULE_MANAGER_H_
#include <memory>
#include <string_view>
#include "base/functional/callback_forward.h"
#include "base/no_destructor.h"
#include "components/content_settings/core/common/host_indexed_content_settings.h"
#include "components/origin_gating/core/origin_gating_checker.h"
#include "components/origin_gating/core/types.h"
class GURL;
// Manages configuration rules for DevTools navigation gating.
// The configuration is loaded globally from command-line switches as a
// singleton.
class DevToolsNavigationGatingRuleManager
: public origin_gating::OriginGatingChecker::Delegate {
public:
// Returns the global singleton instance.
static DevToolsNavigationGatingRuleManager& Get();
// Creates an instance for testing purposes with a custom JSON configuration.
static DevToolsNavigationGatingRuleManager CreateForTesting(
std::string_view rules_json);
DevToolsNavigationGatingRuleManager(
const DevToolsNavigationGatingRuleManager&) = delete;
DevToolsNavigationGatingRuleManager& operator=(
const DevToolsNavigationGatingRuleManager&) = delete;
DevToolsNavigationGatingRuleManager(DevToolsNavigationGatingRuleManager&&) =
delete;
DevToolsNavigationGatingRuleManager& operator=(
DevToolsNavigationGatingRuleManager&&) = delete;
~DevToolsNavigationGatingRuleManager() override;
// Checks asynchronously whether navigation to `url` is allowed.
void IsNavigationAllowed(const GURL& url,
base::OnceCallback<void(bool)> callback);
// Returns true if this manager has any policies that might block a
// navigation.
bool MayBlockNavigation() const;
// origin_gating::OriginGatingChecker::Delegate implementation:
void DoesOriginRequireUserConfirmation(
origin_gating::GatingDecisionContext* context,
origin_gating::GateableEvent event,
const GURL& source,
const GURL& destination,
DoesOriginRequireUserConfirmationCallback callback) const override;
void EvaluateEnterprisePolicy(
const GURL& destination,
EvaluateEnterprisePolicyCallback callback) const override;
void OnNoVerdict(origin_gating::GatingDecisionContext* context,
origin_gating::GateableEvent event,
const GURL& source,
const GURL& destination,
bool requires_user_confirmation,
base::OnceCallback<void(NoVerdictResult)> callback) override;
private:
friend class base::NoDestructor<DevToolsNavigationGatingRuleManager>;
explicit DevToolsNavigationGatingRuleManager(std::string_view rules_json);
origin_gating::Decision EvaluateRules(
origin_gating::GatingDecisionContext* context,
const GURL& source,
const GURL& destination) const;
content_settings::HostIndexedContentSettings rules_;
bool has_allowlist_ = false;
origin_gating::OriginGatingChecker origin_gating_checker_;
};
#endif // CHROME_BROWSER_DEVTOOLS_DEVTOOLS_NAVIGATION_GATING_RULE_MANAGER_H_