#include "content/browser/renderer_host/concurrent_navigations_commit_deferring_condition.h"
#include "base/memory/ptr_util.h"
#include "content/browser/renderer_host/frame_tree_node.h"
#include "content/browser/renderer_host/navigation_request.h"
namespace content {
std::unique_ptr<CommitDeferringCondition>
ConcurrentNavigationsCommitDeferringCondition::MaybeCreate(
NavigationRequest& navigation_request,
NavigationType navigation_type) {
if (!navigation_request.IsServedFromBackForwardCache() &&
navigation_type != NavigationType::kPrerenderedPageActivation) {
return nullptr;
}
DCHECK(navigation_request.IsInPrimaryMainFrame());
return base::WrapUnique(
new ConcurrentNavigationsCommitDeferringCondition(navigation_request));
}
ConcurrentNavigationsCommitDeferringCondition::
ConcurrentNavigationsCommitDeferringCondition(
NavigationRequest& navigation_request)
: CommitDeferringCondition(navigation_request) {}
ConcurrentNavigationsCommitDeferringCondition::
~ConcurrentNavigationsCommitDeferringCondition() = default;
CommitDeferringCondition::Result
ConcurrentNavigationsCommitDeferringCondition::WillCommitNavigation(
base::OnceClosure resume) {
auto* request = NavigationRequest::From(&GetNavigationHandle());
if (request->ShouldQueueDueToExistingPendingCommitRFH()) {
DCHECK(!request->IsQueued());
request->set_resume_commit_closure(std::move(resume));
return Result::kDefer;
}
return Result::kProceed;
}
const char* ConcurrentNavigationsCommitDeferringCondition::TraceEventName()
const {
return "ConcurrentNavigationsCommitDeferringCondition";
}
}