blob: 4009c34faf27d54f6ae19a4e7d8a40de37feef25 [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_SERVICE_H_
#define CHROME_BROWSER_DEVTOOLS_DEVTOOLS_NAVIGATION_GATING_SERVICE_H_
#include <memory>
#include "base/functional/callback_forward.h"
#include "base/memory/weak_ptr.h"
#include "base/types/pass_key.h"
#include "components/keyed_service/core/keyed_service.h"
#include "components/origin_gating/core/gateable_event.h"
#include "components/origin_gating/core/gating_decision.h"
#include "components/origin_gating/core/origin_gating_checker.h"
class DevToolsNavigationGatingRuleManager;
class DevToolsNavigationGatingServiceFactory;
class GURL;
namespace content {
class BrowserContext;
}
namespace origin_gating {
class OriginGatingRegistration;
class OriginGatingService;
} // namespace origin_gating
// Per-profile KeyedService that gates DevTools-controlled navigations. Each
// instance owns its own `OriginGatingChecker` registration with the profile's
// `OriginGatingService`, while the (profile-independent) rules are shared via
// the global `DevToolsNavigationGatingRuleManager`.
class DevToolsNavigationGatingService
: public KeyedService,
public origin_gating::OriginGatingChecker::Delegate {
public:
// Returns the instance for `context`, creating one if needed.
static DevToolsNavigationGatingService* GetForBrowserContext(
content::BrowserContext* context);
// `rule_manager` must outlive the returned service.
static std::unique_ptr<DevToolsNavigationGatingService> CreateForTesting(
origin_gating::OriginGatingService& origin_gating_service,
const DevToolsNavigationGatingRuleManager& rule_manager);
DevToolsNavigationGatingService(
base::PassKey<DevToolsNavigationGatingServiceFactory>,
origin_gating::OriginGatingService& origin_gating_service);
DevToolsNavigationGatingService(const DevToolsNavigationGatingService&) =
delete;
DevToolsNavigationGatingService& operator=(
const DevToolsNavigationGatingService&) = delete;
DevToolsNavigationGatingService(DevToolsNavigationGatingService&&) = delete;
DevToolsNavigationGatingService& operator=(
DevToolsNavigationGatingService&&) = delete;
~DevToolsNavigationGatingService() override;
// Checks asynchronously whether navigation to `url` is allowed.
void IsNavigationAllowed(const GURL& url,
base::OnceCallback<void(bool)> callback);
// origin_gating::OriginGatingChecker::Delegate:
void DoesOriginRequireUserConfirmation(
origin_gating::GatingDecisionContext* context,
const origin_gating::GateableEvent& event,
DoesOriginRequireUserConfirmationCallback callback) const override;
void EvaluateEnterprisePolicy(
const GURL& destination,
EvaluateEnterprisePolicyCallback callback) const override;
void OnNoVerdict(origin_gating::GatingDecisionContext* context,
const origin_gating::GateableEvent& event,
bool requires_user_confirmation,
base::OnceCallback<void(NoVerdictResult)> callback) override;
private:
DevToolsNavigationGatingService(
origin_gating::OriginGatingService& origin_gating_service,
const DevToolsNavigationGatingRuleManager& rule_manager);
std::unique_ptr<origin_gating::OriginGatingRegistration>
origin_gating_registration_;
base::WeakPtrFactory<DevToolsNavigationGatingService> weak_ptr_factory_{this};
};
#endif // CHROME_BROWSER_DEVTOOLS_DEVTOOLS_NAVIGATION_GATING_SERVICE_H_