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));
   }