[MPArch] Access RFHM::BeforeUnloadCompleted via RFHO

This CL is a part of the effort to split RFH and FTN.
This CL notifies BeforeUnload is completed via
RFHO::GetRenderFrameHostManager without accessing FTN.

Bug: 1179502
Change-Id: I594802cac5600fbcc5a2b1841852da73c93fcd6f
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/4160015
Reviewed-by: Arthur Sonzogni <arthursonzogni@chromium.org>
Commit-Queue: Miyoung Shin <myid.shin@igalia.com>
Reviewed-by: Kevin McNee <mcnee@chromium.org>
Cr-Commit-Position: refs/heads/main@{#1093765}
diff --git a/content/browser/renderer_host/render_frame_host_impl.cc b/content/browser/renderer_host/render_frame_host_impl.cc
index 485750a7..ddd9d02 100644
--- a/content/browser/renderer_host/render_frame_host_impl.cc
+++ b/content/browser/renderer_host/render_frame_host_impl.cc
@@ -8642,12 +8642,11 @@
          type == BeforeUnloadType::INNER_DELEGATE_ATTACH ||
          IsOutermostMainFrame());
 
+  CHECK(owner_);  // Only active documents are subject to BeforeUnload.
+
   if (!for_navigation) {
     // Cancel any pending navigations, to avoid their navigation commit/fail
     // event from wiping out the is_waiting_for_beforeunload_completion_ state.
-    // TODO(https://crbug.com/1405759) Explain why `owner_` is non-null here. It
-    // isn't clear why.
-    CHECK(owner_);
     owner_->CancelNavigation();
   }
 
@@ -8663,16 +8662,11 @@
     DCHECK(!for_navigation);
 
     // Dispatch the ACK to prevent re-entrancy.
-    base::OnceClosure task = base::BindOnce(
-        [](base::WeakPtr<RenderFrameHostImpl> self) {
-          if (!self)
-            return;
-          self->frame_tree_node_->render_manager()->BeforeUnloadCompleted(
-              true, base::TimeTicks::Now());
-        },
-        weak_ptr_factory_.GetWeakPtr());
     base::SingleThreadTaskRunner::GetCurrentDefault()->PostTask(
-        FROM_HERE, std::move(task));
+        FROM_HERE,
+        base::BindOnce(&RenderFrameHostManager::BeforeUnloadCompleted,
+                       owner_->GetRenderFrameHostManager().GetWeakPtr(),
+                       /*proceed=*/true, base::TimeTicks::Now()));
     return;
   }
   TRACE_EVENT_NESTABLE_ASYNC_BEGIN1(
diff --git a/content/browser/renderer_host/render_frame_host_manager.cc b/content/browser/renderer_host/render_frame_host_manager.cc
index 0416c908..42e8342 100644
--- a/content/browser/renderer_host/render_frame_host_manager.cc
+++ b/content/browser/renderer_host/render_frame_host_manager.cc
@@ -4401,4 +4401,8 @@
   return frame_tree_node_->frame_tree().controller();
 }
 
+base::WeakPtr<RenderFrameHostManager> RenderFrameHostManager::GetWeakPtr() {
+  return weak_factory_.GetWeakPtr();
+}
+
 }  // namespace content
diff --git a/content/browser/renderer_host/render_frame_host_manager.h b/content/browser/renderer_host/render_frame_host_manager.h
index 01afb46..0b93130 100644
--- a/content/browser/renderer_host/render_frame_host_manager.h
+++ b/content/browser/renderer_host/render_frame_host_manager.h
@@ -619,6 +619,8 @@
         ->current_replication_state();
   }
 
+  base::WeakPtr<RenderFrameHostManager> GetWeakPtr();
+
  private:
   friend class NavigatorTest;
   friend class RenderFrameHostManagerTest;