blob: 6604bede4b8042e2b6686bb496d9fa7e10c2d5c1 [file] [log] [blame]
// Copyright 2021 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 "content/test/mock_commit_deferring_condition.h"
#include "content/browser/renderer_host/navigation_request.h"
namespace content {
MockCommitDeferringConditionWrapper::MockCommitDeferringConditionWrapper(
bool is_ready_to_commit) {
condition_ = std::make_unique<MockCommitDeferringCondition>(
is_ready_to_commit,
base::BindOnce(
&MockCommitDeferringConditionWrapper::WillCommitNavigationCalled,
weak_factory_.GetWeakPtr()));
weak_condition_ = condition_->AsWeakPtr();
}
MockCommitDeferringConditionWrapper::~MockCommitDeferringConditionWrapper() =
default;
std::unique_ptr<MockCommitDeferringCondition>
MockCommitDeferringConditionWrapper::PassToDelegate() {
DCHECK(condition_);
std::unique_ptr<MockCommitDeferringCondition> ret = std::move(condition_);
return ret;
}
void MockCommitDeferringConditionWrapper::CallResumeClosure() {
DCHECK(WasInvoked());
DCHECK(resume_closure_);
std::move(resume_closure_).Run();
}
bool MockCommitDeferringConditionWrapper::WasInvoked() const {
return did_call_will_commit_navigation_;
}
bool MockCommitDeferringConditionWrapper::IsDestroyed() const {
return !static_cast<bool>(weak_condition_);
}
void MockCommitDeferringConditionWrapper::WaitUntilInvoked() {
if (WasInvoked())
return;
base::RunLoop loop;
invoked_closure_ = loop.QuitClosure();
loop.Run();
}
void MockCommitDeferringConditionWrapper::WillCommitNavigationCalled(
base::OnceClosure resume_closure) {
did_call_will_commit_navigation_ = true;
resume_closure_ = std::move(resume_closure);
if (invoked_closure_) {
base::SequencedTaskRunnerHandle::Get()->PostTask(
FROM_HERE, std::move(invoked_closure_));
}
}
MockCommitDeferringCondition::MockCommitDeferringCondition(
bool is_ready_to_commit,
WillCommitCallback on_will_commit_navigation)
: is_ready_to_commit_(is_ready_to_commit),
on_will_commit_navigation_(std::move(on_will_commit_navigation)) {}
MockCommitDeferringCondition::~MockCommitDeferringCondition() = default;
CommitDeferringCondition::Result
MockCommitDeferringCondition::WillCommitNavigation(base::OnceClosure resume) {
if (on_will_commit_navigation_)
std::move(on_will_commit_navigation_).Run(std::move(resume));
return is_ready_to_commit_ ? Result::kProceed : Result::kDefer;
}
base::WeakPtr<MockCommitDeferringCondition>
MockCommitDeferringCondition::AsWeakPtr() {
return weak_factory_.GetWeakPtr();
}
MockCommitDeferringConditionInstaller::MockCommitDeferringConditionInstaller(
std::unique_ptr<MockCommitDeferringCondition> condition)
: generator_id_(
CommitDeferringConditionRunner::InstallConditionGeneratorForTesting(
base::BindRepeating(
&MockCommitDeferringConditionInstaller::Install,
base::Unretained(this)))),
condition_(std::move(condition)) {}
MockCommitDeferringConditionInstaller::
~MockCommitDeferringConditionInstaller() {
CommitDeferringConditionRunner::UninstallConditionGeneratorForTesting(
generator_id_);
}
std::unique_ptr<CommitDeferringCondition>
MockCommitDeferringConditionInstaller::Install() {
return std::move(condition_);
}
} // namespace content