blob: 4d2b6bdfe4835a992ed268f71368472e34a0d072 [file] [log] [blame]
// Copyright 2023 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/renderer/bound_session_credentials/bound_session_request_throttled_in_renderer_manager.h"
#include <vector>
#include "base/functional/bind.h"
#include "base/sequence_checker.h"
#include "base/task/sequenced_task_runner.h"
#include "base/task/single_thread_task_runner.h"
#include "base/task/task_runner.h"
#include "chrome/common/renderer_configuration.mojom.h"
#include "content/public/child/child_thread.h"
#include "mojo/public/cpp/bindings/callback_helpers.h"
namespace {
using UnblockAction = BoundSessionRequestThrottledHandler::UnblockAction;
using ResumeOrCancelThrottledRequestCallback =
BoundSessionRequestThrottledHandler::ResumeOrCancelThrottledRequestCallback;
using ResumeBlockedRequestsTrigger =
chrome::mojom::ResumeBlockedRequestsTrigger;
void OnHandleRequestBlockedOnCookie(
ResumeOrCancelThrottledRequestCallback callback,
ResumeBlockedRequestsTrigger trigger) {
UnblockAction action =
trigger == ResumeBlockedRequestsTrigger::kRendererDisconnected
? UnblockAction::kCancel
: UnblockAction::kResume;
std::move(callback).Run(action, trigger);
}
} // namespace
// static
scoped_refptr<BoundSessionRequestThrottledInRendererManager>
BoundSessionRequestThrottledInRendererManager::Create(
mojo::PendingRemote<chrome::mojom::BoundSessionRequestThrottledHandler>
pending_remote) {
CHECK(pending_remote.is_valid());
scoped_refptr<BoundSessionRequestThrottledInRendererManager> helper =
base::WrapRefCounted(new BoundSessionRequestThrottledInRendererManager());
content::ChildThread::Get()->GetIOTaskRunner()->PostTask(
FROM_HERE,
base::BindOnce(&BoundSessionRequestThrottledInRendererManager::Initialize,
helper, std::move(pending_remote)));
return helper;
}
BoundSessionRequestThrottledInRendererManager::
BoundSessionRequestThrottledInRendererManager() {
DETACH_FROM_SEQUENCE(my_sequence_checker_);
}
BoundSessionRequestThrottledInRendererManager::
~BoundSessionRequestThrottledInRendererManager() {
DETACH_FROM_SEQUENCE(my_sequence_checker_);
}
void BoundSessionRequestThrottledInRendererManager::Initialize(
mojo::PendingRemote<chrome::mojom::BoundSessionRequestThrottledHandler>
pending_remote) {
DCHECK_CALLED_ON_VALID_SEQUENCE(my_sequence_checker_);
remote_.Bind(std::move(pending_remote));
}
void BoundSessionRequestThrottledInRendererManager::
HandleRequestBlockedOnCookie(
const GURL& untrusted_request_url,
ResumeOrCancelThrottledRequestCallback callback) {
DCHECK_CALLED_ON_VALID_SEQUENCE(my_sequence_checker_);
CHECK(remote_.is_bound());
CHECK(!callback.is_null());
remote_->HandleRequestBlockedOnCookie(
untrusted_request_url,
mojo::WrapCallbackWithDefaultInvokeIfNotRun(
base::BindOnce(&OnHandleRequestBlockedOnCookie, std::move(callback)),
chrome::mojom::ResumeBlockedRequestsTrigger::kRendererDisconnected));
}