blob: 2302b4366a8756a35e58169a95d47d4a443dd7a6 [file] [log] [blame]
// Copyright 2021 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "content/browser/preloading/prerender/prerender_handle_impl.h"
#include "content/browser/preloading/prerender/prerender_final_status.h"
#include "content/browser/preloading/prerender/prerender_host.h"
#include "content/browser/preloading/prerender/prerender_host_registry.h"
#include "content/public/browser/preloading_trigger_type.h"
#include "url/gurl.h"
namespace content {
PrerenderHandleImpl::PrerenderHandleImpl(
base::WeakPtr<PrerenderHostRegistry> prerender_host_registry,
FrameTreeNodeId frame_tree_node_id,
const GURL& prerendering_url)
: prerender_host_registry_(std::move(prerender_host_registry)),
frame_tree_node_id_(frame_tree_node_id),
prerendering_url_(prerendering_url) {
CHECK(!prerendering_url_.is_empty());
// PrerenderHandleImpl is now designed only for embedder triggers. If you use
// this handle for other triggers, please make sure to update the logging etc.
auto* prerender_host = GetPrerenderHost();
CHECK(prerender_host);
CHECK_EQ(prerender_host->trigger_type(), PreloadingTriggerType::kEmbedder);
prerender_host->AddObserver(this);
}
PrerenderHandleImpl::~PrerenderHandleImpl() {
PrerenderHost* prerender_host = GetPrerenderHost();
if (!prerender_host) {
return;
}
prerender_host->RemoveObserver(this);
prerender_host_registry_->CancelHost(frame_tree_node_id_,
PrerenderFinalStatus::kTriggerDestroyed);
}
const GURL& PrerenderHandleImpl::GetInitialPrerenderingUrl() const {
return prerendering_url_;
}
base::WeakPtr<PrerenderHandle> PrerenderHandleImpl::GetWeakPtr() {
return weak_factory_.GetWeakPtr();
}
void PrerenderHandleImpl::SetPreloadingAttemptFailureReason(
PreloadingFailureReason reason) {
auto* prerender_host = GetPrerenderHost();
if (!prerender_host || !prerender_host->preloading_attempt()) {
return;
}
prerender_host->preloading_attempt()->SetFailureReason(reason);
}
void PrerenderHandleImpl::SetActivationCallback(
base::OnceClosure activation_callback) {
CHECK(activation_callback);
CHECK(!activation_callback_);
if (was_activated_) {
std::move(activation_callback).Run();
return;
}
activation_callback_ = std::move(activation_callback);
}
void PrerenderHandleImpl::OnActivated() {
CHECK(!was_activated_);
was_activated_ = true;
if (activation_callback_) {
std::move(activation_callback_).Run();
}
}
PrerenderHost* PrerenderHandleImpl::GetPrerenderHost() {
auto* prerender_frame_tree_node =
FrameTreeNode::GloballyFindByID(frame_tree_node_id_);
if (!prerender_frame_tree_node) {
return nullptr;
}
PrerenderHost& prerender_host =
PrerenderHost::GetFromFrameTreeNode(*prerender_frame_tree_node);
return &prerender_host;
}
} // namespace content