[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;