PreloadingDevTools: Ensure DevToolsPrerenderAttempt is consumed exactly once
Bug: 1410709
Change-Id: I231f2e928cd8da9e72ca1b4853ec23863cc36c73
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/4546521
Reviewed-by: Hiroki Nakagawa <nhiroki@chromium.org>
Commit-Queue: Ken Okada <kenoss@chromium.org>
Cr-Commit-Position: refs/heads/main@{#1146418}
diff --git a/content/browser/preloading/prerender/prerender_host_registry.cc b/content/browser/preloading/prerender/prerender_host_registry.cc
index 98cdb996..9685ff7b 100644
--- a/content/browser/preloading/prerender/prerender_host_registry.cc
+++ b/content/browser/preloading/prerender/prerender_host_registry.cc
@@ -319,6 +319,7 @@
// Public only for exceptional case.
// TODO(https://crbug.com/1435376): Make this private again.
void Drop();
+ bool IsDropped();
private:
// Use raw pointer as PrerenderHostBuilder is alive only during
@@ -333,7 +334,7 @@
devtools_attempt_(std::make_unique<DevToolsPrerenderAttempt>()) {}
PrerenderHostBuilder::~PrerenderHostBuilder() {
- CHECK_EQ(attempt_, nullptr);
+ CHECK(IsDropped());
}
void PrerenderHostBuilder::Drop() {
@@ -341,6 +342,10 @@
devtools_attempt_.reset();
}
+bool PrerenderHostBuilder::IsDropped() {
+ return devtools_attempt_ == nullptr;
+}
+
void PrerenderHostBuilder::SetHoldbackAllowed() {
if (attempt_) {
attempt_->SetHoldbackStatus(PreloadingHoldbackStatus::kAllowed);
@@ -350,6 +355,8 @@
std::unique_ptr<PrerenderHost> PrerenderHostBuilder::Build(
const PrerenderAttributes& attributes,
WebContentsImpl& prerender_web_contents) {
+ CHECK(!IsDropped());
+
auto prerender_host = std::make_unique<PrerenderHost>(
attributes, prerender_web_contents,
attempt_ ? attempt_->GetWeakPtr() : nullptr,
@@ -363,6 +370,8 @@
void PrerenderHostBuilder::RejectAsNotEligible(
const PrerenderAttributes& attributes,
PrerenderFinalStatus status) {
+ CHECK(!IsDropped());
+
if (attempt_) {
attempt_->SetEligibility(ToEligibility(status));
}
@@ -376,6 +385,8 @@
}
void PrerenderHostBuilder::RejectAsDuplicate() {
+ CHECK(!IsDropped());
+
if (attempt_) {
attempt_->SetTriggeringOutcome(PreloadingTriggeringOutcome::kDuplicate);
}
@@ -386,6 +397,8 @@
}
void PrerenderHostBuilder::RejectDueToHoldback() {
+ CHECK(!IsDropped());
+
if (attempt_) {
attempt_->SetHoldbackStatus(PreloadingHoldbackStatus::kHoldback);
}
@@ -399,6 +412,8 @@
void PrerenderHostBuilder::RejectAsFailure(
const PrerenderAttributes& attributes,
PrerenderFinalStatus status) {
+ CHECK(!IsDropped());
+
if (attempt_) {
attempt_->SetFailureReason(ToPreloadingFailureReason(status));
}